Implement editing dialogs for individual monster abilities

Changes to game:
- Permanent martyr's shield is now customizable - extra1 is per-mille chance to activate each time damage is taken, and extra2 is percent of damage taken to apply to attacker
- Absort spells is now customizable - extra1 is per-mille chance to activate each time damage is taken or a magic effect is applied, and extra2 is how much hp to gain from non-damaging magic effects
- Splits ability is now customizable - extra1 is per-mille chance of splitting each time damage is taken
- Special node ability is now called before the monster tries its normal attack, and multiple monsters can use them per round (though each can only use theirs once)
- Fix issue with breath weapons and icy touch abilities conflicting (legacy import issue)
- Add two variations of the summoning ability - summon according to summoning level (like the spells), or summon a random creature of a particular species
- Fix touch abilities using the range as chance to use

Changes to dialog engine:
- Fix tab order handling to exclude fields that are currently hidden
- Add method to retrieve the parameter passed to toast(), as a quick way to distinguish between the user clicking OK or Cancel after run() has exited
- Fix hidden fields being drawn anyway
- Fix setting stack page sometimes crashing if the current page was invalid due to earlier reducing the page count to 0
This commit is contained in:
2015-01-19 12:01:28 -05:00
parent d614286fec
commit 5450ae1caf
23 changed files with 936 additions and 245 deletions

View File

@@ -1016,8 +1016,13 @@ void cDialog::run(){
dialogNotToast = true;
// Focus the first text field, if there is one
if(!tabOrder.empty()) {
tabOrder[0].second->triggerFocusHandler(*this, tabOrder[0].first, false);
currentFocus = tabOrder[0].first;
auto iter = std::find_if(tabOrder.begin(), tabOrder.end(), [](std::pair<std::string,cTextField*> ctrl){
return ctrl.second->isVisible();
});
if(iter != tabOrder.end()) {
iter->second->triggerFocusHandler(*this, tabOrder[0].first, false);
currentFocus = iter->first;
}
}
// Sometimes it seems like the Cocoa menu handling clobbers the active rendering context.
// For whatever reason, delaying 100 milliseconds appears to fix this.
@@ -1197,7 +1202,7 @@ template<typename Iter> void cDialog::handleTabOrder(string& itemHit, Iter begin
while(iter != cur){
// If tab order is explicitly specified for all fields, gaps are possible
if(iter->second == nullptr) continue;
if(iter->second->getType() == CTRL_FIELD){
if(iter->second->getType() == CTRL_FIELD && iter->second->isVisible()){
if(iter->second->triggerFocusHandler(*this,iter->first,false)){
currentFocus = iter->first;
}
@@ -1235,6 +1240,7 @@ bool cDialog::toast(bool triggerFocus){
if(!this->getControl(currentFocus).triggerFocusHandler(*this, currentFocus, true)) return false;
}
dialogNotToast = false;
didAccept = triggerFocus;
return true;
}
@@ -1242,6 +1248,10 @@ void cDialog::untoast() {
dialogNotToast = true;
}
bool cDialog::accepted() {
return didAccept;
}
bool cDialog::setFocus(cTextField* newFocus, bool force) {
// TODO: Should check that there IS a currently focused field (which might not be the case if there are no fields at all).
if(!force) {