From: Laszlo T. <ave...@us...> - 2010-07-26 17:07:32
|
gemrb: Infinity Engine emulator The branch master has been updated via a8088483655d17e2ef145b2510a3b1e438c8acaf (commit) via d1089aba54d3d9ed6e45b51f84c84ae38a9c9ca0 (commit) Summary of changes: gemrb/core/Map.cpp | 28 ++++++++++++++++++++-------- gemrb/core/Scriptable/Actor.cpp | 15 +++++++++++++-- gemrb/core/Scriptable/ActorBlock.cpp | 5 +++-- 3 files changed, 36 insertions(+), 12 deletions(-) from ec900583fecd64c25d1568020aed4f978992df3b (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=a8088483655d17e2ef145b2510a3b1e438c8acaf commit a8088483655d17e2ef145b2510a3b1e438c8acaf Merge: d1089ab ec90058 Author: Avenger <ave...@so...> Date: Mon Jul 26 19:06:56 2010 +0200 Merge branch 'master' of ssh://ave...@ge.../gitroot/gemrb/gemrb http://gemrb.git.sourceforge.net/git/gitweb.cgi?p=gemrb/gemrb;a=commitdiff;h=d1089aba54d3d9ed6e45b51f84c84ae38a9c9ca0 commit d1089aba54d3d9ed6e45b51f84c84ae38a9c9ca0 Author: Avenger <ave...@so...> Date: Mon Jul 26 19:05:48 2010 +0200 fixed the familiars (global actors) finally, without breaking something else!!! diff --git a/gemrb/core/Map.cpp b/gemrb/core/Map.cpp index 3ed45fb..b06c4c5 100644 --- a/gemrb/core/Map.cpp +++ b/gemrb/core/Map.cpp @@ -1303,18 +1303,30 @@ bool Map::AnyPCSeesEnemy() return false; } +//Make an actor gone for (almost) good +//If the actor was in the party, it will be moved to the npc storage +//If the actor is in the NPC storage, its area and some other fields +//that are needed for proper reentry will be zeroed out +//If the actor isn't in the NPC storage, it is destructed void Map::DeleteActor(int i) { Actor *actor = actors[i]; - - Game *game = core->GetGame(); - game->LeaveParty( actor ); - game->DelNPC( game->InStore(actor) ); - - ClearSearchMapFor(actor); - + if (actor) { + Game *game = core->GetGame(); + //this makes sure that a PC will be demoted to NPC + game->LeaveParty( actor ); + //this frees up the spot under the feet circle + ClearSearchMapFor( actor ); + //remove the area reference from the actor + actor->SetMap(NULL,0,0); + //don't destroy the object in case it is a persistent object + //otherwise there is a dead reference causing a crash on save + if (!game->InStore(actor) ) { + delete actor; + } + } + //remove the actor from the area's actor list actors.erase( actors.begin()+i ); - delete actor; } Actor* Map::GetActorByGlobalID(ieDword objectID) diff --git a/gemrb/core/Scriptable/Actor.cpp b/gemrb/core/Scriptable/Actor.cpp index 5d3bfe6..4d91fe8 100644 --- a/gemrb/core/Scriptable/Actor.cpp +++ b/gemrb/core/Scriptable/Actor.cpp @@ -236,7 +236,7 @@ static int ReverseToHit=true; static int CheckAbilities=false; //internal flags for calculating to hit -#define WEAPON_FIST 0 +#define WEAPON_FIST 0 #define WEAPON_MELEE 1 #define WEAPON_RANGED 2 #define WEAPON_STYLEMASK 15 @@ -2714,7 +2714,17 @@ void Actor::SetMap(Map *map, ieWord LID, ieWord GID) { //Did we have an area? bool effinit=!GetCurrentArea(); - Scriptable::SetMap(map); //now we have an area + //now we have an area + Scriptable::SetMap(map); + //unless we just lost it, in that case clear up some fields and leave + if (!map) { + //the local ID is surely illegal after the map is nulled + localID = 0; + //more bits may or may not be needed + InternalFlags &=~IF_CLEANUP; + return; + } + localID = LID; globalID = GID; @@ -2894,6 +2904,7 @@ void Actor::Turn(Scriptable *cleric, ieDword turnlevel) } } +//TODO: needs a way to respawn at a point void Actor::Resurrect() { if (!(Modified[IE_STATE_ID ] & STATE_DEAD)) { diff --git a/gemrb/core/Scriptable/ActorBlock.cpp b/gemrb/core/Scriptable/ActorBlock.cpp index 2ede08b..0adc331 100644 --- a/gemrb/core/Scriptable/ActorBlock.cpp +++ b/gemrb/core/Scriptable/ActorBlock.cpp @@ -144,8 +144,9 @@ Map* Scriptable::GetCurrentArea() const void Scriptable::SetMap(Map *map) { - if (!map) { - printMessage("Scriptable","Null map set!\n",LIGHT_RED); + if (map && (map->GetCurrentArea()!=map)) { + //a map always points to itself (if it is a real map) + printMessage("Scriptable","Invalid map set!\n",LIGHT_RED); abort(); } area = map; ----------------------------------------------------------------------- This is an automated email from the git hooks/post-receive script. -- gemrb: Infinity Engine emulator |