dialog pick-race-abil: print pc's name + add left/right arrows
This commit is contained in:
@@ -1350,7 +1350,7 @@ static bool edit_party_event_filter(cDialog& me, std::string item_hit, eKeyMod)
|
||||
else pick_pc_name(which_pc,&me);
|
||||
put_party_stats(me);
|
||||
} else if(item_hit == "trait") {
|
||||
pick_race_abil(&univ.party[which_pc],0,&me);
|
||||
pick_race_abil(which_pc,0,&me);
|
||||
put_party_stats(me);
|
||||
} else if(item_hit == "train") {
|
||||
spend_xp(which_pc,0,&me);
|
||||
|
@@ -434,7 +434,7 @@ static bool give_pc_info_event_filter(cDialog& me, std::string item_hit, short&
|
||||
static bool give_pc_extra_info(cDialog& me, std::string item_hit, const short pc) {
|
||||
if(item_hit == "seemage") display_pc(pc,0,&me);
|
||||
else if(item_hit == "seepriest") display_pc(pc,1,&me);
|
||||
else if(item_hit == "trait") pick_race_abil(&univ.party[pc],1,&me);
|
||||
else if(item_hit == "trait") pick_race_abil(pc,1,&me);
|
||||
else if(item_hit == "seealch") display_alchemy(false,&me);
|
||||
return true;
|
||||
}
|
||||
|
@@ -26,7 +26,7 @@ void put_spec_item_info (short which_i);
|
||||
void put_quest_info(short which_i);
|
||||
|
||||
// These are defined in pc.editors.cpp since they are also used by the character editor
|
||||
void pick_race_abil(cPlayer *pc,short mode,cDialog* parent = nullptr);
|
||||
void pick_race_abil(short pc_num,short mode,cDialog* parent = nullptr);
|
||||
void display_pc(short pc_num,short mode,cDialog* parent_num);
|
||||
void display_alchemy(bool allowEdit,cDialog* parent);
|
||||
|
||||
|
@@ -219,7 +219,7 @@ bool create_pc(short spot,cDialog* parent) {
|
||||
if(spot == 6) return false;
|
||||
univ.party.new_pc(spot);
|
||||
|
||||
pick_race_abil(&univ.party[spot],0,parent);
|
||||
pick_race_abil(spot,0,parent);
|
||||
|
||||
still_ok = spend_xp(spot,0,parent);
|
||||
if(!still_ok)
|
||||
|
@@ -54,7 +54,7 @@ bool handle_action(const sf::Event & event) {
|
||||
display_pc(current_active_pc,11,nullptr);
|
||||
break;
|
||||
case 2:
|
||||
pick_race_abil(&univ.party[current_active_pc],0);
|
||||
pick_race_abil(current_active_pc,0);
|
||||
break;
|
||||
case 3:
|
||||
spend_xp(current_active_pc,2,nullptr);
|
||||
|
@@ -46,7 +46,6 @@ extern bool current_file_has_maps;
|
||||
bool choice_active[6];
|
||||
|
||||
extern short which_pc_displayed;
|
||||
cPlayer *store_pc;
|
||||
sf::Texture button_num_gworld;
|
||||
|
||||
extern std::map<eSkill,short> skill_cost;
|
||||
@@ -130,33 +129,62 @@ void display_pc(short pc_num,short mode, cDialog* parent) {
|
||||
}
|
||||
}
|
||||
|
||||
static void display_traits_graphics(cDialog& me) {
|
||||
short store;
|
||||
|
||||
if(store_pc->race <= eRace::VAHNATAI) {
|
||||
std::string race = "race" + std::to_string(int(store_pc->race) + 1);
|
||||
// Start pick race dialog here
|
||||
struct sTraitsState {
|
||||
sTraitsState(cUniverse const &univ) : pc_num(-1)
|
||||
{
|
||||
for (int i=0; i<6; ++i) {
|
||||
auto const &pc=univ.party[i];
|
||||
races[i]=pc.race;
|
||||
for (int t=0; t<17; ++t) {
|
||||
eTrait trait = eTrait(t);
|
||||
if (pc.traits.find(trait)!=pc.traits.end())
|
||||
traits[i][t]=pc.traits[trait];
|
||||
else
|
||||
traits[i][t]=false;
|
||||
}
|
||||
}
|
||||
}
|
||||
void save(cUniverse &univ) const {
|
||||
for (int i=0; i<6; ++i) {
|
||||
auto &pc=univ.party[i];
|
||||
pc.race=races[i];
|
||||
for (int t=0; t<17; ++t) {
|
||||
eTrait trait = eTrait(t);
|
||||
pc.traits[trait]=traits[i][t];
|
||||
}
|
||||
}
|
||||
}
|
||||
short pc_num;
|
||||
eRace races[6];
|
||||
bool traits[6][17];
|
||||
};
|
||||
|
||||
|
||||
static void display_traits_graphics(cDialog& me, sTraitsState const &state) {
|
||||
int const pc_num=state.pc_num;
|
||||
auto const &pc=univ.party[pc_num];
|
||||
me["name"].setText(pc.name);
|
||||
if(pc.race <= eRace::VAHNATAI) {
|
||||
std::string race = "race" + std::to_string(int(state.races[pc_num]) + 1);
|
||||
dynamic_cast<cLedGroup&>(me["race"]).setSelected(race);
|
||||
}
|
||||
for(short i = 0; i < 10; i++) {
|
||||
std::string id = "good" + std::to_string(i + 1);
|
||||
eTrait trait = eTrait(i);
|
||||
dynamic_cast<cLed&>(me[id]).setState(store_pc->traits[trait] ? led_red : led_off);
|
||||
dynamic_cast<cLed&>(me[id]).setState(state.traits[pc_num][i] ? led_red : led_off);
|
||||
}
|
||||
for(short i = 0; i < 7; i++) {
|
||||
std::string id = "bad" + std::to_string(i + 1);
|
||||
eTrait trait = eTrait(i + 10);
|
||||
dynamic_cast<cLed&>(me[id]).setState(store_pc->traits[trait] ? led_red : led_off);
|
||||
dynamic_cast<cLed&>(me[id]).setState(state.traits[pc_num][i+10] ? led_red : led_off);
|
||||
}
|
||||
|
||||
store = store_pc->get_tnl();
|
||||
me["xp"].setTextToNum(store);
|
||||
me["xp"].setTextToNum(pc.get_tnl());
|
||||
}
|
||||
|
||||
static bool pick_race_select_led(cDialog& me, std::string item_hit, bool, const short store_trait_mode) {
|
||||
static bool pick_race_select_led(cDialog& me, sTraitsState &state, std::string item_hit, bool, const short store_trait_mode) {
|
||||
int abil_str = 0;
|
||||
cPlayer *pc;
|
||||
|
||||
pc = store_pc;
|
||||
|
||||
int const pc_num=state.pc_num;
|
||||
if(item_hit == "race") {
|
||||
item_hit = dynamic_cast<cLedGroup&>(me["race"]).getSelected();
|
||||
eRace race;
|
||||
@@ -167,22 +195,20 @@ static bool pick_race_select_led(cDialog& me, std::string item_hit, bool, const
|
||||
case 3: race = eRace::VAHNATAI; break;
|
||||
}
|
||||
if(store_trait_mode == 0)
|
||||
pc->race = race;
|
||||
display_traits_graphics(me);
|
||||
state.races[pc_num] = race;
|
||||
display_traits_graphics(me,state);
|
||||
abil_str = 36 + int(race) * 2;
|
||||
} else if(item_hit.substr(0,3) == "bad") {
|
||||
int hit = item_hit[3] - '1';
|
||||
eTrait trait = eTrait(hit + 10);
|
||||
if(store_trait_mode != 1)
|
||||
pc->traits[trait] = !pc->traits[trait];
|
||||
display_traits_graphics(me);
|
||||
state.traits[pc_num][hit+10] = !state.traits[pc_num][hit+10];
|
||||
display_traits_graphics(me,state);
|
||||
abil_str = 22 + hit * 2;
|
||||
} else if(item_hit.substr(0,4) == "good") {
|
||||
int hit = boost::lexical_cast<int>(item_hit.substr(4)) - 1;
|
||||
eTrait trait = eTrait(hit);
|
||||
if(store_trait_mode != 1)
|
||||
pc->traits[trait] = !pc->traits[trait];
|
||||
display_traits_graphics(me);
|
||||
state.traits[pc_num][hit] = !state.traits[pc_num][hit];
|
||||
display_traits_graphics(me,state);
|
||||
abil_str = 2 + hit * 2;
|
||||
}
|
||||
if(abil_str > 0)
|
||||
@@ -190,28 +216,58 @@ static bool pick_race_select_led(cDialog& me, std::string item_hit, bool, const
|
||||
return store_trait_mode == 0;
|
||||
}
|
||||
|
||||
// OSNOLA2
|
||||
static bool give_pick_race_event_filter(cDialog& me, std::string item_hit, sTraitsState &state) {
|
||||
short &pc_num=state.pc_num;
|
||||
if (item_hit == "cancel") {
|
||||
me.toast(false);
|
||||
me.setResult(false);
|
||||
}
|
||||
else if(item_hit == "done") {
|
||||
me.setResult(true);
|
||||
me.toast(true);
|
||||
}
|
||||
else if(item_hit == "left") {
|
||||
do {
|
||||
pc_num = (pc_num + 5) % 6;
|
||||
} while(univ.party[pc_num].main_status != eMainStatus::ALIVE);
|
||||
display_traits_graphics(me, state);
|
||||
} else if(item_hit == "right") {
|
||||
do {
|
||||
pc_num = (pc_num + 1) % 6;
|
||||
} while(univ.party[pc_num].main_status != eMainStatus::ALIVE);
|
||||
display_traits_graphics(me, state);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
//mode; // 0 - edit 1 - just display 2 - can't change race
|
||||
void pick_race_abil(cPlayer *pc,short mode,cDialog* parent) {
|
||||
void pick_race_abil(short pc_num,short mode,cDialog* parent) {
|
||||
using namespace std::placeholders;
|
||||
static const char*const start_str1 = "Click on button by name for description.";
|
||||
static const char*const start_str2 = "Click on advantage button to add/remove.";
|
||||
|
||||
store_pc = pc;
|
||||
sTraitsState state(univ);
|
||||
state.pc_num = pc_num;
|
||||
set_cursor(sword_curs);
|
||||
|
||||
cDialog pickAbil("pick-race-abil",parent);
|
||||
pickAbil["done"].attachClickHandler(std::bind(&cDialog::toast, &pickAbil, true));
|
||||
auto led_selector = std::bind(pick_race_select_led, _1, _2, _3, mode);
|
||||
pickAbil.attachClickHandlers(std::bind(give_pick_race_event_filter, _1, _2, std::ref(state)), {"done", "cancel", "left", "right"});
|
||||
auto led_selector = std::bind(pick_race_select_led, _1, std::ref(state), _2, _3, mode);
|
||||
pickAbil.attachFocusHandlers(led_selector, {"race", "bad1", "bad2", "bad3", "bad4", "bad5", "bad6", "bad7"});
|
||||
pickAbil.attachFocusHandlers(led_selector, {"good1", "good2", "good3", "good4", "good5"});
|
||||
pickAbil.attachFocusHandlers(led_selector, {"good6", "good7", "good8", "good9", "good10"});
|
||||
|
||||
display_traits_graphics(pickAbil);
|
||||
if(mode == 1)
|
||||
display_traits_graphics(pickAbil, state);
|
||||
if(mode == 1) {
|
||||
pickAbil["cancel"].hide();
|
||||
pickAbil["info"].setText(start_str1);
|
||||
else pickAbil["info"].setText(start_str2);
|
||||
|
||||
}
|
||||
else
|
||||
pickAbil["info"].setText(start_str2);
|
||||
pickAbil.run();
|
||||
|
||||
if (pickAbil.getResult<bool>() && mode!=1)
|
||||
state.save(univ);;
|
||||
}
|
||||
|
||||
extern const short alch_difficulty[20] = {
|
||||
|
@@ -4,6 +4,6 @@ class cDialog;
|
||||
void give_gold(short amount,bool print_result);
|
||||
bool take_gold(short amount,bool print_result);
|
||||
void give_spec_items();
|
||||
void pick_race_abil(cPlayer *pc,short mode,cDialog* parent = nullptr);
|
||||
void pick_race_abil(short pc_num,short mode,cDialog* parent = nullptr);
|
||||
void reset_boats();
|
||||
void edit_stuff_done();
|
||||
|
@@ -404,7 +404,7 @@ void handle_menu_choice(eMenu item_hit) {
|
||||
}
|
||||
break;
|
||||
case eMenu::EDIT_TRAITS:
|
||||
pick_race_abil(&univ.party[current_active_pc],0);
|
||||
pick_race_abil(current_active_pc,0);
|
||||
break;
|
||||
case eMenu::EDIT_SKILLS:
|
||||
spend_xp(current_active_pc,2,0);
|
||||
|
@@ -59,7 +59,7 @@ void cPlayer::import_legacy(legacy::pc_record_type old){
|
||||
direction = eDirection(old.direction);
|
||||
}
|
||||
|
||||
short cPlayer::get_tnl(){
|
||||
short cPlayer::get_tnl() const {
|
||||
short tnl = 100,store_per = 100;
|
||||
// Omitting a race from this list gives it a value of 0, thanks to the defaulting implementation of operator[]
|
||||
static std::map<const eRace, const int> rp = {{eRace::NEPHIL,12},{eRace::SLITH,20},{eRace::VAHNATAI,18}};
|
||||
|
@@ -171,7 +171,7 @@ public:
|
||||
void import_legacy(legacy::pc_record_type old);
|
||||
cPlayer(cParty& party);
|
||||
cPlayer(cParty& party,ePartyPreset key,short slot);
|
||||
short get_tnl();
|
||||
short get_tnl() const;
|
||||
void writeTo(std::ostream& file) const;
|
||||
void readFrom(std::istream& file);
|
||||
virtual ~cPlayer() = default;
|
||||
|
Reference in New Issue
Block a user