dialog pick-race-abil: print pc's name + add left/right arrows

This commit is contained in:
ALONSO Laurent
2021-10-02 16:25:16 +02:00
committed by Celtic Minstrel
parent d8ab170111
commit 3dd3d3c1da
11 changed files with 103 additions and 43 deletions

View File

@@ -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);

View File

@@ -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;
}

View File

@@ -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);

View File

@@ -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)

View File

@@ -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);

View File

@@ -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] = {

View File

@@ -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();

View File

@@ -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);

View File

@@ -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}};

View File

@@ -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;