From: <ave...@us...> - 2008-08-01 16:15:17
|
Revision: 5240 http://gemrb.svn.sourceforge.net/gemrb/?rev=5240&view=rev Author: avenger_teambg Date: 2008-08-01 16:15:25 +0000 (Fri, 01 Aug 2008) Log Message: ----------- added feature: move near to target (object) when casting spells Modified Paths: -------------- gemrb/trunk/gemrb/plugins/Core/Actions.cpp gemrb/trunk/gemrb/plugins/Core/GSUtils.cpp gemrb/trunk/gemrb/plugins/Core/GSUtils.h gemrb/trunk/gemrb/plugins/Core/GameScript.cpp gemrb/trunk/gemrb/plugins/Core/GameScript.h gemrb/trunk/gemrb/plugins/Core/Spell.cpp gemrb/trunk/gemrb/plugins/Core/Spell.h Modified: gemrb/trunk/gemrb/plugins/Core/Actions.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/Core/Actions.cpp 2008-08-01 15:55:31 UTC (rev 5239) +++ gemrb/trunk/gemrb/plugins/Core/Actions.cpp 2008-08-01 16:15:25 UTC (rev 5240) @@ -546,6 +546,19 @@ } } +//this is unfinished, maybe the original moves actors too? +//creates savegame? +void GameScript::MoveToExpansion(Scriptable* /*Sender*/, Action* /*parameters*/) +{ + Game *game = core->GetGame(); + + game->SetExpansion(1); + SaveGameIterator *sg = core->GetSaveGameIterator(); + if (sg) { + sg->Invalidate(); + } +} + //add some animation effects too? void GameScript::ExitPocketPlane(Scriptable* /*Sender*/, Action* /*parameters*/) { @@ -2188,6 +2201,18 @@ return; } + if(Sender->Type==ST_ACTOR) { + Actor *act = (Actor *) Sender; + + unsigned int dist = GetSpellDistance(spellres, act); + + if (PersonalDistance(tar, Sender) > dist) { + GoNearAndRetry(Sender, tar, true, dist); + Sender->ReleaseCurrentAction(); + return; + } + } + //set target Actor *actor = (Actor *) Sender; if (tar != Sender) { @@ -5961,3 +5986,5 @@ if (!map) return; map->SetTrackString(parameters->int0Parameter, parameters->int1Parameter, parameters->int2Parameter); } + + Modified: gemrb/trunk/gemrb/plugins/Core/GSUtils.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/Core/GSUtils.cpp 2008-08-01 15:55:31 UTC (rev 5239) +++ gemrb/trunk/gemrb/plugins/Core/GSUtils.cpp 2008-08-01 16:15:25 UTC (rev 5240) @@ -26,6 +26,7 @@ #include "ResourceMgr.h" #include "Video.h" #include "Audio.h" +#include "Spell.h" #include "Item.h" #include "Map.h" #include "Game.h" @@ -2322,3 +2323,19 @@ p.y=(short) y; return p; } + +/* returns a spell's casting distance, it depends on the caster */ +unsigned int GetSpellDistance(ieResRef spellres, Actor *actor) +{ + unsigned int dist; + + Spell* spl = core->GetSpell( spellres ); + if (!spl) { + printMessage("GameScript"," ",LIGHT_RED); + printf("Spell couldn't be found:%.8s.\n", spellres); + return 0; + } + dist=spl->GetCastingDistance(actor); + core->FreeSpell(spl, spellres, false); + return dist*15; +} Modified: gemrb/trunk/gemrb/plugins/Core/GSUtils.h =================================================================== --- gemrb/trunk/gemrb/plugins/Core/GSUtils.h 2008-08-01 15:55:31 UTC (rev 5239) +++ gemrb/trunk/gemrb/plugins/Core/GSUtils.h 2008-08-01 16:15:25 UTC (rev 5240) @@ -112,6 +112,7 @@ GEM_EXPORT ieDword CheckVariable(Scriptable* Sender, const char* VarName, const char* Context, bool *valid = NULL); Action* GenerateActionCore(const char *src, const char *str, int acIndex); Trigger *GenerateTriggerCore(const char *src, const char *str, int trIndex, int negate); +unsigned int GetSpellDistance(ieResRef spellres, Actor *actor); inline int Bones(ieDword value) { Modified: gemrb/trunk/gemrb/plugins/Core/GameScript.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/Core/GameScript.cpp 2008-08-01 15:55:31 UTC (rev 5239) +++ gemrb/trunk/gemrb/plugins/Core/GameScript.cpp 2008-08-01 16:15:25 UTC (rev 5240) @@ -641,6 +641,7 @@ {"moveglobalsto", GameScript::MoveGlobalsTo, 0}, {"transferinventory", GameScript::MoveInventory, 0}, {"movetocenterofscreen", GameScript::MoveToCenterOfScreen,AF_BLOCKING}, + {"movetoexpansion", GameScript::MoveToExpansion,AF_BLOCKING}, {"movetoobject", GameScript::MoveToObject,AF_BLOCKING|AF_ALIVE}, {"movetoobjectfollow", GameScript::MoveToObjectFollow,AF_BLOCKING|AF_ALIVE}, {"movetoobjectnointerrupt", GameScript::MoveToObjectNoInterrupt,AF_BLOCKING|AF_ALIVE}, Modified: gemrb/trunk/gemrb/plugins/Core/GameScript.h =================================================================== --- gemrb/trunk/gemrb/plugins/Core/GameScript.h 2008-08-01 15:55:31 UTC (rev 5239) +++ gemrb/trunk/gemrb/plugins/Core/GameScript.h 2008-08-01 16:15:25 UTC (rev 5240) @@ -1199,6 +1199,7 @@ static void MoveGlobalsTo(Scriptable* Sender, Action* parameters); static void MoveInventory(Scriptable *Sender, Action* parameters); static void MoveToCenterOfScreen(Scriptable* Sender, Action* parameters); + static void MoveToExpansion(Scriptable* Sender, Action* parameters); static void MoveToObject(Scriptable* Sender, Action* parameters); static void MoveToObjectFollow(Scriptable* Sender, Action* parameters); static void MoveToObjectNoInterrupt(Scriptable* Sender, Action* parameters); Modified: gemrb/trunk/gemrb/plugins/Core/Spell.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/Core/Spell.cpp 2008-08-01 15:55:31 UTC (rev 5239) +++ gemrb/trunk/gemrb/plugins/Core/Spell.cpp 2008-08-01 16:15:25 UTC (rev 5240) @@ -20,6 +20,7 @@ */ #include "../../includes/win32def.h" +#include "Actor.h" #include "Spell.h" #include "Projectile.h" #include "ProjectileServer.h" @@ -120,3 +121,31 @@ } return NULL; } + +//get the casting distance of the spell +//it depends on the casting level of the actor +//if actor isn't given, then the first header is used +//TODO: fix casting level for all class combos +unsigned int Spell::GetCastingDistance(Actor *actor) const +{ + int level = 1; + if(!actor) { + level = actor->GetStat(IE_LEVEL); + if(SpellType==IE_SPL_WIZARD) { + level+=actor->GetStat(IE_CASTINGLEVELBONUSMAGE); + } + else if(SpellType==IE_SPL_PRIEST) { + level+=actor->GetStat(IE_CASTINGLEVELBONUSCLERIC); + } + } + + if(level<1) level=1; + int idx = GetHeaderIndexFromLevel(level); + SPLExtHeader *seh = GetExtHeader(idx); + if (!seh) { + printMessage("Spell", "Cannot retrieve spell header!!! ",RED); + printf("required header: %d, maximum: %d\n", idx, (int) ExtHeaderCount); + return 0; + } + return (unsigned int) seh->Range; +} Modified: gemrb/trunk/gemrb/plugins/Core/Spell.h =================================================================== --- gemrb/trunk/gemrb/plugins/Core/Spell.h 2008-08-01 15:55:31 UTC (rev 5239) +++ gemrb/trunk/gemrb/plugins/Core/Spell.h 2008-08-01 16:15:25 UTC (rev 5240) @@ -169,6 +169,7 @@ EffectQueue *GetEffectBlock(int block_index, int ext_index=-1) const; //returns a projectile created from an extended header Projectile *GetProjectile(int headerindex) const; + unsigned int GetCastingDistance(Actor *actor) const; }; #endif // ! SPELL_H This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |