From: Jaka K. <lyn...@us...> - 2010-12-28 19:29:19
|
gemrb: Infinity Engine emulator The branch master has been updated via 95dc354d0fae75e09956359627cbb14ca8226837 (commit) Summary of changes: gemrb/core/Scriptable/Actor.cpp | 27 +++++++++++++++++++++++++++ gemrb/core/Scriptable/Actor.h | 2 ++ gemrb/core/Scriptable/ActorBlock.cpp | 3 +-- gemrb/core/Spell.cpp | 17 ++--------------- gemrb/plugins/FXOpcodes/FXOpcodes.cpp | 6 ++---- 5 files changed, 34 insertions(+), 21 deletions(-) from b408b7081f6605c436c8b3617b482c09df6a4a67 (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email; so we list those revisions in full, below. - Log ----------------------------------------------------------------- http://gemrb.git.sourceforge.net/git/gitweb.cgi?p=gemrb/gemrb;a=commitdiff;h=95dc354d0fae75e09956359627cbb14ca8226837 commit 95dc354d0fae75e09956359627cbb14ca8226837 Author: Jaka Kranjc <lyn...@us...> Date: Tue Dec 28 20:28:12 2010 +0100 added Actor::GetBaseCasterLevel to determine the level a bit more properly also always use the full bonus if it is available diff --git a/gemrb/core/Scriptable/Actor.cpp b/gemrb/core/Scriptable/Actor.cpp index 0c72ae9..42940b4 100644 --- a/gemrb/core/Scriptable/Actor.cpp +++ b/gemrb/core/Scriptable/Actor.cpp @@ -3087,6 +3087,33 @@ ieDword Actor::GetXPLevel(int modified) const return ieDword(average); } +// returns the guessed caster level by passed spell type +// FIXME: add iwd2 support (should be more precise, as there are more class types) +// FIXME: add more logic for cross-type kits (like avengers)? +ieDword Actor::GetBaseCasterLevel(int spelltype) const +{ + int level = 0; + + switch(spelltype) + { + case IE_SPL_PRIEST: + level = GetClericLevel(); + if (!level) level = GetDruidLevel(); + if (!level) level = GetPaladinLevel(); + if (!level) level = GetRangerLevel(); + break; + case IE_SPL_WIZARD: + level = GetMageLevel(); + if (!level) level = GetSorcererLevel(); + if (!level) level = GetBardLevel(); + break; + } + // if nothing was found, use the average level + if (!level) level = GetXPLevel(true); + + return level; +} + int Actor::GetWildMod(int level) const { if(GetStat(IE_KIT)&0x8000) { diff --git a/gemrb/core/Scriptable/Actor.h b/gemrb/core/Scriptable/Actor.h index 173a252..c3e05b5 100644 --- a/gemrb/core/Scriptable/Actor.h +++ b/gemrb/core/Scriptable/Actor.h @@ -428,6 +428,8 @@ public: const char* GetScript(int ScriptIndex) const; /** Gets the Character's level for XP calculations */ ieDword GetXPLevel(int modified) const; + /** Guesses the base casting level */ + ieDword GetBaseCasterLevel(int spelltype) const; /** Returns the wild mage casting level modifier */ int GetWildMod(int level) const; /** Returns any casting level modifier */ diff --git a/gemrb/core/Scriptable/ActorBlock.cpp b/gemrb/core/Scriptable/ActorBlock.cpp index 654006f..393151e 100644 --- a/gemrb/core/Scriptable/ActorBlock.cpp +++ b/gemrb/core/Scriptable/ActorBlock.cpp @@ -837,8 +837,7 @@ int Scriptable::SpellCast(const ieResRef SpellResRef, bool instant) } //The ext. index is here to calculate the casting time - //FIXME: use the caster level, not the average - int level = actor->GetXPLevel(true); + int level = actor->GetBaseCasterLevel(spl->SpellType); //Add casting level bonus/penalty - from stats and LVLMODWM.2da level += actor->CastingLevelBonus(level, spl->SpellType); SpellHeader = spl->GetHeaderIndexFromLevel(level); diff --git a/gemrb/core/Spell.cpp b/gemrb/core/Spell.cpp index e35820e..6f7e36a 100644 --- a/gemrb/core/Spell.cpp +++ b/gemrb/core/Spell.cpp @@ -206,21 +206,8 @@ unsigned int Spell::GetCastingDistance(Scriptable *Sender) const } if (actor) { - if (SpellType==IE_SPL_WIZARD) { - level = actor->GetMageLevel(); - if (!level) level = actor->GetSorcererLevel(); - if (!level) level = actor->GetBardLevel(); - if (!level) level = actor->GetStat(IE_LEVEL); - level+=actor->GetStat(IE_CASTINGLEVELBONUSMAGE); - } - else if (SpellType==IE_SPL_PRIEST) { - level = actor->GetClericLevel(); - if (!level) level = actor->GetDruidLevel(); - if (!level) level = actor->GetPaladinLevel(); - if (!level) level = actor->GetRangerLevel(); - if (!level) level = actor->GetStat(IE_LEVEL); - level += actor->GetStat(IE_CASTINGLEVELBONUSCLERIC); - } + level = actor->GetBaseCasterLevel(SpellType); + level += actor->CastingLevelBonus(level, SpellType); } if (level<1) { diff --git a/gemrb/plugins/FXOpcodes/FXOpcodes.cpp b/gemrb/plugins/FXOpcodes/FXOpcodes.cpp index 1a50508..7418566 100644 --- a/gemrb/plugins/FXOpcodes/FXOpcodes.cpp +++ b/gemrb/plugins/FXOpcodes/FXOpcodes.cpp @@ -3136,10 +3136,8 @@ int fx_mirror_image (Scriptable* Owner, Actor* target, Effect* fx) else { // the original uses only IE_LEVEL, but that can be awefully bad in // the case of dual- and multiclasses - unsigned int level = target->GetMageLevel(); - if (!level) level = target->GetSorcererLevel(); - if (!level) level = target->GetBardLevel(); - if (!level) level = target->GetStat(IE_LEVEL); + unsigned int level = target->GetBaseCasterLevel(IE_SPL_WIZARD); + level += target->CastingLevelBonus(level, IE_SPL_WIZARD); // 2-8 mirror images images = level/3 + 2; if (images > 8) images = 8; ----------------------------------------------------------------------- This is an automated email from the git hooks/post-receive script. -- gemrb: Infinity Engine emulator |