From: <ma...@us...> - 2009-06-06 21:02:16
|
Revision: 6335 http://gemrb.svn.sourceforge.net/gemrb/?rev=6335&view=rev Author: mattinm Date: 2009-06-06 21:01:08 +0000 (Sat, 06 Jun 2009) Log Message: ----------- consolidated PerformAttack and GetToHitBonus with reference passing GetToHit no returns false on any errors Modified Paths: -------------- gemrb/trunk/gemrb/plugins/Core/Actor.cpp gemrb/trunk/gemrb/plugins/Core/Actor.h gemrb/trunk/gemrb/plugins/GUIScript/GUIScript.cpp Modified: gemrb/trunk/gemrb/plugins/Core/Actor.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/Core/Actor.cpp 2009-06-06 20:29:03 UTC (rev 6334) +++ gemrb/trunk/gemrb/plugins/Core/Actor.cpp 2009-06-06 21:01:08 UTC (rev 6335) @@ -2957,18 +2957,14 @@ initiative = (ieDword) (gameTime+tmp*ROUND_SIZE); } -//TODO: this is just a copy of the attack code -// this should probably be consolidated where possible -int Actor::GetToHitBonus(bool leftorright) +bool Actor::GetToHitBonus(int &tohit, bool leftorright, WeaponInfo& wi, ITMExtHeader *&header, ITMExtHeader *&hittingheader, ieDword &Flags) { - int tohit = GetStat(IE_TOHIT); - WeaponInfo wi; - ITMExtHeader *header = GetWeapon(wi,leftorright); + tohit = GetStat(IE_TOHIT); + header = GetWeapon(wi,leftorright); if (!header) { - return tohit; + return false; } - ieDword Flags; - ITMExtHeader *hittingheader = header; + hittingheader = header; ITMExtHeader *rangedheader = NULL; int THACOBonus = hittingheader->THAC0Bonus; int DamageBonus = hittingheader->DamageBonus ; @@ -2985,7 +2981,7 @@ //out of ammo event //try to refill SetStance(IE_ANI_READY); - return tohit; + return false; } Flags = WEAPON_RANGED; //The bow can give some bonuses, but the core attack is made by the arrow. @@ -2996,7 +2992,7 @@ default: //item is unsuitable for fight SetStance(IE_ANI_READY); - return tohit; + return false; }//melee or ranged if (leftorright) Flags|=WEAPON_LEFTHAND; //this flag is set by the bow in case of projectile launcher. @@ -3004,7 +3000,7 @@ //second parameter is left or right hand flag tohit = GetToHit(THACOBonus, Flags); - return tohit; + return true; } int Actor::GetToHit(int bonus, ieDword Flags) @@ -3129,54 +3125,16 @@ bool leftorright = (bool) (attackcount&1); WeaponInfo wi; - ITMExtHeader *header = GetWeapon(wi,leftorright); - if (!header) { - return; - } - //can't reach target, zero range shouldn't be allowed - //Don't forget to take size of the opponents into account - //Actually, this version of PersonalDistance already calculates with the size!!! - if (wi.range*10<PersonalDistance(this, target)) { - return; - } + ITMExtHeader *header = NULL; + ITMExtHeader *hittingheader = NULL; + int tohit; ieDword Flags; - ITMExtHeader *hittingheader = header; - ITMExtHeader *rangedheader = NULL; - int THACOBonus = hittingheader->THAC0Bonus; - int DamageBonus = hittingheader->DamageBonus ; - switch(hittingheader->AttackType) { - case ITEM_AT_MELEE: - Flags = WEAPON_MELEE; - break; - case ITEM_AT_PROJECTILE: //throwing weapon - Flags = WEAPON_RANGED; - break; - case ITEM_AT_BOW: - rangedheader = GetRangedWeapon(wi); - if (!rangedheader) { - //out of ammo event - //try to refill - SetStance(IE_ANI_READY); - return; - } - Flags = WEAPON_RANGED; - //The bow can give some bonuses, but the core attack is made by the arrow. - hittingheader = rangedheader; - THACOBonus += rangedheader->THAC0Bonus; - DamageBonus+= rangedheader->DamageBonus ; - break; - default: - //item is unsuitable for fight - SetStance(IE_ANI_READY); + + //will return false on any errors + if (!GetToHitBonus(tohit, leftorright, wi, header, hittingheader, Flags)) { return; - }//melee or ranged - if (leftorright) Flags|=WEAPON_LEFTHAND; - //this flag is set by the bow in case of projectile launcher. - if (header->RechargeFlags&IE_ITEM_USESTRENGTH) Flags|=WEAPON_USESTRENGTH; + } - //second parameter is left or right hand flag - int tohit = GetToHit(THACOBonus, Flags); - int roll = core->Roll(1,ATTACKROLL,0); if (roll==1) { //critical failure @@ -3195,8 +3153,8 @@ //modify defense with damage type ieDword damagetype = hittingheader->DamageType; printMessage("Attack"," ",GREEN); - int damage = core->Roll(hittingheader->DiceThrown, hittingheader->DiceSides, DamageBonus); - printf("Damage %dd%d%+d = %d\n",hittingheader->DiceThrown, hittingheader->DiceSides, DamageBonus, damage); + int damage = core->Roll(hittingheader->DiceThrown, hittingheader->DiceSides, hittingheader->DamageBonus); + printf("Damage %dd%d%+d = %d\n",hittingheader->DiceThrown, hittingheader->DiceSides, hittingheader->DamageBonus, damage); int damageluck = (int) GetStat(IE_DAMAGELUCK); if (damage<damageluck) { damage = damageluck; Modified: gemrb/trunk/gemrb/plugins/Core/Actor.h =================================================================== --- gemrb/trunk/gemrb/plugins/Core/Actor.h 2009-06-06 20:29:03 UTC (rev 6334) +++ gemrb/trunk/gemrb/plugins/Core/Actor.h 2009-06-06 21:01:08 UTC (rev 6335) @@ -454,7 +454,7 @@ /* gets the defense against an attack */ int GetDefense(int DamageType) ; /* get the current hit bonus */ - int GetToHitBonus(bool leftorright); + bool GetToHitBonus(int &tohit, bool leftorright, WeaponInfo &wi, ITMExtHeader *&header, ITMExtHeader *&hittingheader, ieDword &Flags); /* performs attack against target */ void PerformAttack(ieDword initiative); /* deal damage to target */ Modified: gemrb/trunk/gemrb/plugins/GUIScript/GUIScript.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/GUIScript/GUIScript.cpp 2009-06-06 20:29:03 UTC (rev 6334) +++ gemrb/trunk/gemrb/plugins/GUIScript/GUIScript.cpp 2009-06-06 21:01:08 UTC (rev 6335) @@ -9124,9 +9124,18 @@ if (!actor) { return RuntimeError( "Actor not found" ); } + leftorright = leftorright&1; - int ret = actor->GetToHitBonus(leftorright); - return PyInt_FromLong( ret ); + WeaponInfo wi; + ITMExtHeader *header = NULL; + ITMExtHeader *hittingheader = NULL; + int tohit; + ieDword Flags; + + if (!actor->GetToHitBonus(tohit, leftorright, wi, header, hittingheader, Flags)) { + //TODO: handle error, thout tohit will still be set correctly + } + return PyInt_FromLong( tohit ); } static PyMethodDef GemRBMethods[] = { This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |