Implement the close and revert menu choices, as well as PC editor help

- Fix storing directions in save file as control characters
This commit is contained in:
2015-02-14 13:19:52 -05:00
parent 4fbc6cfa77
commit 0aaa299642
13 changed files with 96 additions and 31 deletions

View File

@@ -0,0 +1,10 @@
<?xml version='1.0' encoding='UTF-8' standalone='no'?>
<?xml-stylesheet href="dialog.xsl" type="text/xsl"?>
<dialog defbtn='cancel'>
<button name='cancel' type='regular' def-key='esc' top='43' left='240'>Cancel</button>
<button name='revert' type='regular' top='43' left='175'>Revert</button>
<pict type='dlog' num='16' top='6' left='6'/>
<text top='6' left='49' width='256' height='32'>
Are you sure you want to discard all changes to your scenario?
</text>
</dialog>

View File

@@ -0,0 +1,9 @@
<?xml version='1.0' encoding='UTF-8' standalone='no'?>
<?xml-stylesheet href="dialog.xsl" type="text/xsl"?>
<dialog defbtn='save'>
<button name='save' type='large' top='31' left='230'>Save First</button>
<button name='quit' type='large' top='31' left='122'>Just Close</button>
<button name='cancel' type='regular' def-key='esc' top='31' left='54'>Cancel</button>
<pict top='9' left='9' type='dlog' num='23'/>
<text size='large' top='5' left='52' width='254' height='18'>Do you want to save before closing?</text>
</dialog>

View File

@@ -0,0 +1,8 @@
<?xml version='1.0' encoding='UTF-8' standalone='no'?>
<?xml-stylesheet href="dialog.xsl" type="text/xsl"?>
<dialog defbtn='okay'>
<button name='okay' type='regular' top='41' left='272'>Revert</button>
<button name='cancel' type='regular' def-key='esc' top='41' left='203'>Cancel</button>
<pict top='9' left='9' type='dlog' num='23'/>
<text size='large' top='5' left='52' width='262' height='33'>Are you sure you want to discard any unsaved changes?</text>
</dialog>

View File

@@ -122,7 +122,8 @@ BEGIN
END END
POPUP "&Help" POPUP "&Help"
BEGIN BEGIN
MENUITEM "About Blades of Exile Editor", IDM_HELP MENUITEM "About Blades of Exile Editor", IDM_ABOUT
MENUITEM "Blades of Exile Editor Help", IDM_HELP
END END
END END

View File

@@ -32,6 +32,7 @@
#define IDM_SCEN_LEAVE 126 #define IDM_SCEN_LEAVE 126
#define IDM_SCEN_SDF 127 #define IDM_SCEN_SDF 127
#define IDM_HELP 128 #define IDM_HELP 128
#define IDM_ABOUT 129
// Next default values for new objects // Next default values for new objects
// //
@@ -40,6 +41,6 @@
#define _APS_NEXT_RESOURCE_VALUE 105 #define _APS_NEXT_RESOURCE_VALUE 105
#define _APS_NEXT_COMMAND_VALUE 40010 #define _APS_NEXT_COMMAND_VALUE 40010
#define _APS_NEXT_CONTROL_VALUE 1001 #define _APS_NEXT_CONTROL_VALUE 1001
#define _APS_NEXT_SYMED_VALUE 129 #define _APS_NEXT_SYMED_VALUE 130
#endif #endif
#endif #endif

View File

@@ -588,16 +588,36 @@ std::istream& operator >> (std::istream& in, eMonstTime& e){
return in; return in;
} }
std::ostream& operator << (std::ostream& out, eDirection e) { std::ostream& operator<<(std::ostream& out, eDirection dir) {
return out << (int)e; switch(dir) {
case DIR_N: out << "n"; break;
case DIR_NE: out << "ne"; break;
case DIR_E: out << "e"; break;
case DIR_SE: out << "se"; break;
case DIR_S: out << "s"; break;
case DIR_SW: out << "sw"; break;
case DIR_W: out << "w"; break;
case DIR_NW: out << "nw"; break;
case DIR_HERE: out << "?"; break;
}
return out;
} }
std::istream& operator >> (std::istream& in, eDirection& e) { std::istream& operator>>(std::istream& in, eDirection& dir) {
int i; std::string str;
in >> i; in >> str;
if(i >= 0 && i < 8) if(str == "n") dir = DIR_N;
e = (eDirection)i; else if(str == "ne") dir = DIR_NE;
else e = DIR_HERE; else if(str == "e") dir = DIR_E;
else if(str == "se") dir = DIR_SE;
else if(str == "s") dir = DIR_S;
else if(str == "sw") dir = DIR_SW;
else if(str == "w") dir = DIR_W;
else if(str == "nw") dir = DIR_NW;
else if(str == "?") dir = DIR_HERE;
else if(str.length() == 1 && str[0] >= 0 && str[0] < 8)
dir = eDirection(str[0]);
else in.setstate(std::ios::failbit);
return in; return in;
} }

View File

@@ -7,8 +7,9 @@
// //
#include <Cocoa/Cocoa.h> #include <Cocoa/Cocoa.h>
#include <string>
extern bool verify_restore_quit(bool mode); extern bool verify_restore_quit(std::string dlog);
extern bool All_Done; extern bool All_Done;
typedef NSAppleEventDescriptor AEDescr; typedef NSAppleEventDescriptor AEDescr;
@@ -37,7 +38,7 @@ void set_up_apple_events() {
-(void)handleQuit:(AEDescr*)theAppleEvent withReply: (AEDescr*)reply { -(void)handleQuit:(AEDescr*)theAppleEvent withReply: (AEDescr*)reply {
(void) theAppleEvent; // Suppress "unused parameter" warning (void) theAppleEvent; // Suppress "unused parameter" warning
(void) reply; (void) reply;
All_Done = verify_restore_quit(0); All_Done = verify_restore_quit("save-quit");
} }
@end @end

View File

@@ -53,7 +53,7 @@ void Handle_One_Event();
void Handle_Activate(); void Handle_Activate();
void Handle_Update(); void Handle_Update();
void Mouse_Pressed(); void Mouse_Pressed();
bool verify_restore_quit(bool mode); bool verify_restore_quit(std::string dlog);
void set_up_apple_events(); void set_up_apple_events();
extern bool cur_scen_is_mac; extern bool cur_scen_is_mac;
extern fs::path progDir; extern fs::path progDir;
@@ -132,7 +132,7 @@ void Handle_One_Event() {
break; break;
case sf::Event::Closed: case sf::Event::Closed:
All_Done = verify_restore_quit(false); All_Done = verify_restore_quit("save-quit");
break; break;
default: default:
@@ -145,7 +145,7 @@ void Mouse_Pressed() {
try_to_end = handle_action(event); try_to_end = handle_action(event);
if(try_to_end) if(try_to_end)
All_Done = verify_restore_quit(false); All_Done = verify_restore_quit("save-quit");
} }
static void display_strings(short nstr, pic_num_t pic) { static void display_strings(short nstr, pic_num_t pic) {
@@ -170,8 +170,12 @@ void handle_menu_choice(eMenu item_hit) {
if(!file.empty()) save_party(file, univ); if(!file.empty()) save_party(file, univ);
break; break;
case eMenu::FILE_OPEN: case eMenu::FILE_OPEN:
if(verify_restore_quit(true)){ i = verify_restore_quit("save-open");
file = nav_get_party(); if(false)
case eMenu::FILE_REVERT:
i = cChoiceDlog("save-revert", {"okay", "cancel"}).show() == "okay";
if(i) {
file = item_hit == eMenu::FILE_OPEN ? nav_get_party() : file_in_mem;
if(!file.empty()) { if(!file.empty()) {
if(load_party(file, univ)) { if(load_party(file, univ)) {
file_in_mem = file; file_in_mem = file;
@@ -184,8 +188,12 @@ void handle_menu_choice(eMenu item_hit) {
menu_activate(); menu_activate();
} }
break; break;
case eMenu::FILE_CLOSE:
if(verify_restore_quit("save-close"))
file_in_mem = "";
break;
case eMenu::QUIT: case eMenu::QUIT:
All_Done = verify_restore_quit(false); All_Done = verify_restore_quit("save-quit");
break; break;
case eMenu::EDIT_GOLD: case eMenu::EDIT_GOLD:
edit_gold_or_food(0); edit_gold_or_food(0);
@@ -310,6 +318,9 @@ void handle_menu_choice(eMenu item_hit) {
case eMenu::SET_SDF: case eMenu::SET_SDF:
edit_stuff_done(); edit_stuff_done();
break; break;
case eMenu::HELP_TOC:
launchURL("https://calref.net/~sylae/boe-doc/game/Editor.html");
break;
} }
} }
@@ -321,13 +332,12 @@ void handle_item_menu(int item_hit) {
univ.party[current_active_pc].give_item(store_i,false); univ.party[current_active_pc].give_item(store_i,false);
} }
//short mode; // 0 - quit 1- restore bool verify_restore_quit(std::string dlog) {
bool verify_restore_quit(bool mode) {
std::string choice; std::string choice;
if(file_in_mem.empty()) if(file_in_mem.empty())
return true; return true;
cChoiceDlog verify(mode ? "save-open" : "save-quit", {"save", "quit", "cancel"}); cChoiceDlog verify(dlog, {"save", "quit", "cancel"});
choice = verify.show(); choice = verify.show();
if(choice == "cancel") if(choice == "cancel")
return false; return false;

View File

@@ -568,14 +568,6 @@
</array> </array>
<object class="IBObjectContainer" key="IBDocument.Objects"> <object class="IBObjectContainer" key="IBDocument.Objects">
<array class="NSMutableArray" key="connectionRecords"> <array class="NSMutableArray" key="connectionRecords">
<object class="IBConnectionRecord">
<object class="IBActionConnection" key="connection">
<string key="label">showHelp:</string>
<reference key="source" ref="1014"/>
<reference key="destination" ref="238773614"/>
</object>
<int key="connectionID">360</int>
</object>
<object class="IBConnectionRecord"> <object class="IBConnectionRecord">
<object class="IBActionConnection" key="connection"> <object class="IBActionConnection" key="connection">
<string key="label">hide:</string> <string key="label">hide:</string>

View File

@@ -75,6 +75,7 @@ void init_menubar() {
MenuHandler* handler = [[[MenuHandler alloc] init] retain]; MenuHandler* handler = [[[MenuHandler alloc] init] retain];
setMenuCallback([apple_menu itemWithTitle: @"About BoE Character Editor"], handler, @selector(menuChoice:), int(eMenu::ABOUT)); setMenuCallback([apple_menu itemWithTitle: @"About BoE Character Editor"], handler, @selector(menuChoice:), int(eMenu::ABOUT));
setMenuCallback([apple_menu itemWithTitle: @"Quit BoE Character Editor"], handler, @selector(menuChoice:), int(eMenu::QUIT)); setMenuCallback([apple_menu itemWithTitle: @"Quit BoE Character Editor"], handler, @selector(menuChoice:), int(eMenu::QUIT));
setMenuCallback([[[menu_bar_handle itemWithTitle: @"Help"] submenu] itemAtIndex: 0], handler, @selector(menuChoice:), int(eMenu::HELP_TOC));
int i = 0; int i = 0;
for(eMenu opt : file_choices) for(eMenu opt : file_choices)

View File

@@ -73,7 +73,7 @@ void init_menubar() {
eMenu::NONE, eMenu::LEAVE_SCENARIO, eMenu::SET_SDF, eMenu::NONE, eMenu::LEAVE_SCENARIO, eMenu::SET_SDF,
}; };
static const eMenu help_choices[] = { static const eMenu help_choices[] = {
eMenu::ABOUT, eMenu::ABOUT, eMenu::HELP_TOC
}; };
HMENU file_menu = GetSubMenu(menuHandle, FILE_MENU_POS); HMENU file_menu = GetSubMenu(menuHandle, FILE_MENU_POS);

View File

@@ -2058,6 +2058,8 @@ void town_entry(location spot_hit) {
// is slot >= 0, force that slot // is slot >= 0, force that slot
// if -1, use 1st free slot // if -1, use 1st free slot
void set_up_start_screen() { void set_up_start_screen() {
reset_lb();
reset_rb();
set_lb(0,LB_TITLE,LB_NO_ACTION,"Blades of Exile"); set_lb(0,LB_TITLE,LB_NO_ACTION,"Blades of Exile");
set_lb(1,LB_TITLE,LB_NO_ACTION,"Scenario Editor"); set_lb(1,LB_TITLE,LB_NO_ACTION,"Scenario Editor");
set_lb(3,LB_TEXT,LB_NEW_SCEN,"Make New Scenario"); set_lb(3,LB_TEXT,LB_NEW_SCEN,"Make New Scenario");

View File

@@ -193,7 +193,11 @@ void handle_menu_choice(eMenu item_hit) {
case eMenu::FILE_OPEN: case eMenu::FILE_OPEN:
if(change_made && !save_check("save-before-load")) if(change_made && !save_check("save-before-load"))
break; break;
file_to_load = nav_get_scenario(); if(false)
case eMenu::FILE_REVERT:
if(change_made && cChoiceDlog("save-before-revert", {"revert", "cancel"}).show() == "cancel")
break;
file_to_load = item_hit == eMenu::FILE_OPEN ? nav_get_scenario() : scenario.scen_file;
if(!file_to_load.empty() && load_scenario(file_to_load, scenario)) { if(!file_to_load.empty() && load_scenario(file_to_load, scenario)) {
cur_town = scenario.last_town_edited; cur_town = scenario.last_town_edited;
town = scenario.towns[cur_town]; town = scenario.towns[cur_town];
@@ -214,6 +218,12 @@ void handle_menu_choice(eMenu item_hit) {
set_up_main_screen(); set_up_main_screen();
} }
break; break;
case eMenu::FILE_CLOSE:
if(!save_check("save-before-close"))
break;
overall_mode = MODE_INTRO_SCREEN;
set_up_start_screen();
break;
case eMenu::QUIT: // quit case eMenu::QUIT: // quit
if(!save_check("save-before-quit")) if(!save_check("save-before-quit"))
break; break;