From: <ave...@us...> - 2009-10-04 10:45:32
|
Revision: 7355 http://gemrb.svn.sourceforge.net/gemrb/?rev=7355&view=rev Author: avenger_teambg Date: 2009-10-04 10:45:21 +0000 (Sun, 04 Oct 2009) Log Message: ----------- removed all (almost all) traces of GoNearAndRetry (kept in comments for documentary reasons only) 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 Modified: gemrb/trunk/gemrb/plugins/Core/Actions.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/Core/Actions.cpp 2009-10-04 10:42:56 UTC (rev 7354) +++ gemrb/trunk/gemrb/plugins/Core/Actions.cpp 2009-10-04 10:45:21 UTC (rev 7355) @@ -2291,7 +2291,8 @@ //core->DisplayString(STR_NOT_TRAPPED); } } else { - GoNearAndRetry(Sender, *p, MAX_OPERATING_DISTANCE); + MoveNearerTo(Sender, *p, MAX_OPERATING_DISTANCE,0); + return; } Sender->SetWait(1); Sender->ReleaseCurrentAction(); @@ -2354,7 +2355,8 @@ //core->DisplayString(STR_NOT_LOCKED); } } else { - GoNearAndRetry(Sender, *p, MAX_OPERATING_DISTANCE); + MoveNearerTo(Sender, *p, MAX_OPERATING_DISTANCE,0); + return; } Sender->SetWait(1); Sender->ReleaseCurrentAction(); @@ -2448,7 +2450,8 @@ door->TriggerTrap(0, actor->GetID()); door->SetDoorOpen( !door->IsOpen(), true, actor->GetID() ); } else { - GoNearAndRetry(Sender, *p, MAX_OPERATING_DISTANCE); + MoveNearerTo(Sender, *p, MAX_OPERATING_DISTANCE,0); + return; } Sender->SetWait(1); Sender->ReleaseCurrentAction(); @@ -2567,7 +2570,7 @@ //move near to target if (PersonalDistance(parameters->pointParameter, Sender) > dist) { - MoveNearerTo(Sender,parameters->pointParameter,dist); + MoveNearerTo(Sender,parameters->pointParameter,dist, 0); return; } @@ -4210,8 +4213,7 @@ return; } if (Distance(parameters->pointParameter, Sender) > 10) { - GoNearAndRetry(Sender, parameters->pointParameter, 10); - Sender->ReleaseCurrentAction(); + MoveNearerTo(Sender, parameters->pointParameter, 10,0); return; } Actor *scr = (Actor *) Sender; @@ -4287,6 +4289,7 @@ } } +//This is unsure, Plunder could be just handling ground piles and not dead actors void GameScript::Plunder(Scriptable *Sender, Action* parameters) { if (Sender->Type!=ST_ACTOR) { @@ -4294,7 +4297,7 @@ return; } Scriptable* tar = GetStoredActorFromObject( Sender, parameters->objects[1] ); - if (!tar || tar->Type!=ST_ACTOR) { + if (!tar) { Sender->ReleaseCurrentAction(); return; } @@ -4305,15 +4308,16 @@ return; } - Actor *scr = (Actor *) tar; - //can plunder only dead actors - if (! (scr->BaseStats[IE_STATE_ID]&STATE_DEAD) ) { - Sender->ReleaseCurrentAction(); - return; + if (tar->Type == ST_ACTOR) { + Actor *scr = (Actor *) tar; + //can plunder only dead actors + if (! (scr->BaseStats[IE_STATE_ID]&STATE_DEAD) ) { + Sender->ReleaseCurrentAction(); + return; + } } if (PersonalDistance(Sender, tar)>MAX_OPERATING_DISTANCE ) { - GoNearAndRetry(Sender, tar, false, MAX_OPERATING_DISTANCE); - Sender->ReleaseCurrentAction(); + MoveNearerTo(Sender, tar->Pos, MAX_OPERATING_DISTANCE,0); return; } //move all movable item from the target to the Sender @@ -4356,8 +4360,7 @@ //for PP one must go REALLY close if (PersonalDistance(Sender, tar)>10 ) { - GoNearAndRetry(Sender, tar, true, 10+snd->size+scr->size); - Sender->ReleaseCurrentAction(); + MoveNearerTo(Sender, tar, 10); return; } @@ -5222,8 +5225,7 @@ Sender->ReleaseCurrentAction(); return; } - GoNearAndRetry(Sender, container, false, needed); - Sender->ReleaseCurrentAction(); + MoveNearerTo(Sender, container, needed); } //call the usecontainer action in target (not used) @@ -5510,66 +5512,108 @@ /*EscapeAreaMove(S:Area*,I:X*,I:Y*,I:Face*)*/ void GameScript::EscapeArea(Scriptable* Sender, Action* parameters) { +printf("EscapeArea/EscapeAreaMove\n"); if (Sender->Type!=ST_ACTOR) { + Sender->ReleaseCurrentAction(); return; } Map *map = Sender->GetCurrentArea(); if (!map) { + Sender->ReleaseCurrentAction(); return; } Point p = Sender->Pos; map->TMap->AdjustNearestTravel(p); - Sender->SetWait(5); - if (parameters->string0Parameter[0]) { Point q((short) parameters->int0Parameter, (short) parameters->int1Parameter); - EscapeAreaCore((Actor *) Sender, parameters->string0Parameter, q, p, 0 ); + EscapeAreaCore( Sender, p, parameters->string0Parameter, q, 0, parameters->int2Parameter ); } else { - EscapeAreaCore((Actor *) Sender, parameters->string0Parameter, p, p, EA_DESTROY ); + EscapeAreaCore( Sender, p, parameters->string0Parameter, p, EA_DESTROY, parameters->int0Parameter ); } - Sender->ReleaseCurrentAction(); + //EscapeAreaCore will do its ReleaseCurrentAction + //Sender->ReleaseCurrentAction(); } void GameScript::EscapeAreaDestroy(Scriptable* Sender, Action* parameters) { +printf("EscapeAreaDestroy\n"); if (Sender->Type!=ST_ACTOR) { + Sender->ReleaseCurrentAction(); return; } + Map *map = Sender->GetCurrentArea(); + if (!map) { + Sender->ReleaseCurrentAction(); + return; + } + //find nearest exit - Point p(0,0); - Sender->SetWait(parameters->int0Parameter); - EscapeAreaCore((Actor *) Sender, parameters->string0Parameter, p, p, EA_DESTROY ); + Point p = Sender->Pos; + map->TMap->AdjustNearestTravel(p); + //EscapeAreaCore will do its ReleaseCurrentAction + EscapeAreaCore( Sender, p, parameters->string0Parameter, p, EA_DESTROY, parameters->int0Parameter ); } /*EscapeAreaObjectMove(S:Area*,I:X*,I:Y*,I:Face*)*/ void GameScript::EscapeAreaObject(Scriptable* Sender, Action* parameters) { - // this is completely wrong, we're meant to escape USING the provided object! +printf("EscapeAreaObject\n"); + if (Sender->Type!=ST_ACTOR) { + Sender->ReleaseCurrentAction(); + return; + } + Map *map = Sender->GetCurrentArea(); + if (!map) { + Sender->ReleaseCurrentAction(); + return; + } + Scriptable* tar = GetActorFromObject( Sender, parameters->objects[1] ); - if (tar && tar->Type == ST_ACTOR) { - //find nearest exit - Point p(0,0); - if (parameters->string0Parameter[0]) { - Point q((short) parameters->int0Parameter, (short) parameters->int1Parameter); - EscapeAreaCore((Actor *) tar, parameters->string0Parameter, q, p, 0 ); - } else { - EscapeAreaCore((Actor *) tar, 0, p, p, EA_DESTROY ); - } + if (!tar) { + Sender->ReleaseCurrentAction(); + return; } + Point p = tar->Pos; + if (parameters->string0Parameter[0]) { + Point q((short) parameters->int0Parameter, (short) parameters->int1Parameter); + EscapeAreaCore( Sender, p, parameters->string0Parameter, q, 0, parameters->int2Parameter ); + } else { + EscapeAreaCore( Sender, p, 0, p, EA_DESTROY, parameters->int0Parameter ); + } + //EscapeAreaCore will do its ReleaseCurrentAction } +//This one doesn't require the object to be seen? +//We don't have that feature yet, so this is the same as EscapeAreaObject void GameScript::EscapeAreaObjectNoSee(Scriptable* Sender, Action* parameters) { - // this is completely wrong, we're meant to escape USING the provided object! +printf("EscapeAreaObjectNoSee\n"); + if (Sender->Type!=ST_ACTOR) { + Sender->ReleaseCurrentAction(); + return; + } + Map *map = Sender->GetCurrentArea(); + if (!map) { + Sender->ReleaseCurrentAction(); + return; + } + Scriptable* tar = GetActorFromObject( Sender, parameters->objects[1] ); - if (tar && tar->Type == ST_ACTOR) { - //find nearest exit - Point p(0,0); + if (!tar) { + Sender->ReleaseCurrentAction(); + return; + } + Point p = tar->Pos; + Sender->SetWait(parameters->int0Parameter); + if (parameters->string0Parameter[0]) { Point q((short) parameters->int0Parameter, (short) parameters->int1Parameter); - EscapeAreaCore((Actor *) tar, parameters->string0Parameter, q, p, EA_DESTROY ); + EscapeAreaCore( Sender, p, parameters->string0Parameter, q, 0, parameters->int2Parameter ); + } else { + EscapeAreaCore( Sender, p, 0, p, EA_DESTROY|EA_NOSEE, parameters->int0Parameter ); } + //EscapeAreaCore will do its ReleaseCurrentAction } //takes first fitting item from container at feet, doesn't seem to be working in the original engines @@ -6052,8 +6096,7 @@ unsigned int dist = GetItemDistance(itemres, header); if (PersonalDistance(tar->Pos, Sender) > dist) { - GoNearAndRetry(Sender, tar, true, dist); - Sender->ReleaseCurrentAction(); + MoveNearerTo(Sender, tar, dist); return; } @@ -6099,8 +6142,7 @@ unsigned int dist = GetItemDistance(itemres, header); if (PersonalDistance(parameters->pointParameter, Sender) > dist) { - GoNearAndRetry(Sender, parameters->pointParameter, dist); - Sender->ReleaseCurrentAction(); + MoveNearerTo(Sender, parameters->pointParameter, dist, 0); return; } Modified: gemrb/trunk/gemrb/plugins/Core/GSUtils.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/Core/GSUtils.cpp 2009-10-04 10:42:56 UTC (rev 7354) +++ gemrb/trunk/gemrb/plugins/Core/GSUtils.cpp 2009-10-04 10:45:21 UTC (rev 7355) @@ -947,22 +947,39 @@ } } -void EscapeAreaCore(Actor* src, const char* resref, Point &enter, Point &exit, int flags) +void EscapeAreaCore(Scriptable* Sender, Point &p, const char* area, Point &enter, int flags, int wait) { char Tmp[256]; + printf("EscapeAreaCore for %s, at point [%d.%d], flags:%d\n", Sender->GetScriptName(), p.x, p.y, flags); + if ( !p.isempty() && PersonalDistance(p, Sender)>MAX_OPERATING_DISTANCE) { + //MoveNearerTo will return 0, if the actor is in move + //it will return 1 (the fourth parameter) if the target is unreachable + if (!MoveNearerTo(Sender, p, MAX_OPERATING_DISTANCE,1) ) { + printf("MoveNearerTo works now.\n"); + if (!Sender->InMove()) printf("At least it said so...\n"); + return; + } + } + if (flags &EA_DESTROY) { //this must be put into a non-const variable sprintf( Tmp, "DestroySelf()" ); } else { // last parameter is 'face', which should be passed from relevant action parameter.. - sprintf( Tmp, "MoveBetweenAreas(\"%s\",[%hd.%hd],%d)", resref, enter.x, enter.y, 0 ); + sprintf( Tmp, "MoveBetweenAreas(\"%s\",[%hd.%hd],%d)", area, enter.x, enter.y, 0 ); } - src->AddActionInFront( GenerateAction( Tmp) ); - // all of the callers are completely broken, so i disabled this for now - (void)exit; - /*sprintf( Tmp, "MoveToPoint([%hd.%hd])", exit.x, exit.y ); - src->AddActionInFront( GenerateAction( Tmp) );*/ + printf("Executing %s\n", Tmp); + //drop this action, but add another (destroyself or movebetweenareas) + //between the arrival and the final escape, there should be a wait time + //that wait time could be handled here + if (wait) { + printf("But wait a bit... (%d)\n", wait); + Sender->SetWait(wait); + } + Sender->ReleaseCurrentAction(); + Action * action = GenerateAction( Tmp); + Sender->AddActionInFront( action ); } void GetTalkPositionFromScriptable(Scriptable* scr, Point &position) @@ -1834,15 +1851,18 @@ distance += ((Actor *)target)->size*10; } - MoveNearerTo(Sender, p, distance); + MoveNearerTo(Sender, p, distance, 0); } -void MoveNearerTo(Scriptable *Sender, Point &p, int distance) +//It is not always good to release the current action if target is unreachable +//we should also raise the trigger TargetUnreachable (if this is an Attack, at least) +//i hacked only this low level function, didn't need the higher ones so far +int MoveNearerTo(Scriptable *Sender, Point &p, int distance, int dont_release) { if (Sender->Type != ST_ACTOR) { printMessage("GameScript","MoveNearerTo only works with actors\n",LIGHT_RED); Sender->ReleaseCurrentAction(); - return; + return 0; } Actor *actor = (Actor *)Sender; @@ -1852,11 +1872,16 @@ } if (!actor->InMove()) { + //didn't release + if (dont_release) { + return dont_release; + } // we can't walk any nearer to destination, give up Sender->ReleaseCurrentAction(); } + return 0; } - +/* void GoNearAndRetry(Scriptable *Sender, Scriptable *target, bool flag, int distance) { Point p; @@ -1882,7 +1907,7 @@ action->int0Parameter = distance+1; Sender->AddActionInFront( action ); } - +*/ void FreeSrc(SrcVector *poi, const ieResRef key) { int res = SrcCache.DecRef((void *) poi, key, true); Modified: gemrb/trunk/gemrb/plugins/Core/GSUtils.h =================================================================== --- gemrb/trunk/gemrb/plugins/Core/GSUtils.h 2009-10-04 10:42:56 UTC (rev 7354) +++ gemrb/trunk/gemrb/plugins/Core/GSUtils.h 2009-10-04 10:45:21 UTC (rev 7355) @@ -88,10 +88,10 @@ GEM_EXPORT void ResolveSpellName(ieResRef spellres, ieDword number); ieDword ResolveSpellNumber(const ieResRef spellres); bool ResolveItemName(ieResRef itemres, Actor *act, ieDword Slot); -void EscapeAreaCore(Actor *src, const char *resref, Point &enter, Point &exit, int flags); +void EscapeAreaCore(Scriptable *Sender, Point &p, const char *area, Point &enter, int flags, int wait); void GoNear(Scriptable *Sender, Point &p); void MoveNearerTo(Scriptable *Sender, Scriptable *target, int distance); -void MoveNearerTo(Scriptable *Sender, Point &p, int distance); +int MoveNearerTo(Scriptable *Sender, Point &p, int distance, int no_release); void GoNearAndRetry(Scriptable *Sender, Scriptable *target, bool destination, int distance); void GoNearAndRetry(Scriptable *Sender, Point &p, int distance); Modified: gemrb/trunk/gemrb/plugins/Core/GameScript.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/Core/GameScript.cpp 2009-10-04 10:42:56 UTC (rev 7354) +++ gemrb/trunk/gemrb/plugins/Core/GameScript.cpp 2009-10-04 10:45:21 UTC (rev 7355) @@ -529,10 +529,10 @@ {"equipranged", GameScript::EquipRanged,0}, {"equipweapon", GameScript::EquipWeapon,0}, {"erasejournalentry", GameScript::RemoveJournalEntry, 0}, - {"escapearea", GameScript::EscapeArea, 0}, - {"escapeareadestroy", GameScript::EscapeAreaDestroy, 0}, - {"escapeareaobject", GameScript::EscapeAreaObject, 0}, - {"escapeareaobjectnosee", GameScript::EscapeAreaObjectNoSee, 0}, + {"escapearea", GameScript::EscapeArea, AF_BLOCKING}, + {"escapeareadestroy", GameScript::EscapeAreaDestroy, AF_BLOCKING}, + {"escapeareaobject", GameScript::EscapeAreaObject, AF_BLOCKING}, + {"escapeareaobjectnosee", GameScript::EscapeAreaObjectNoSee, AF_BLOCKING}, {"exitpocketplane", GameScript::ExitPocketPlane, 0}, {"expansionendcredits", GameScript::QuitGame, 0},//ends game too {"explore", GameScript::Explore, 0}, Modified: gemrb/trunk/gemrb/plugins/Core/GameScript.h =================================================================== --- gemrb/trunk/gemrb/plugins/Core/GameScript.h 2009-10-04 10:42:56 UTC (rev 7354) +++ gemrb/trunk/gemrb/plugins/Core/GameScript.h 2009-10-04 10:45:21 UTC (rev 7355) @@ -32,7 +32,8 @@ #include "Actor.h" //escapearea flags -#define EA_DESTROY 1 +#define EA_DESTROY 1 //destroy actor at the exit (otherwise move to new place) +#define EA_NOSEE 2 //no need to see the exit //displaystring flags #define DS_WAIT 1 This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |