Update of /cvsroot/gemrb/gemrb/gemrb/plugins/Core In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv15927/Core Modified Files: ActorBlock.cpp Game.cpp Game.h GameControl.cpp GameControl.h GameScript.cpp Interface.cpp Map.cpp Log Message: Implemented PARTY_REQUIRED travel zones in both ways (pst and other) Index: Map.cpp =================================================================== RCS file: /cvsroot/gemrb/gemrb/gemrb/plugins/Core/Map.cpp,v retrieving revision 1.102 retrieving revision 1.103 diff -C2 -d -r1.102 -r1.103 *** Map.cpp 4 Aug 2004 20:57:16 -0000 1.102 --- Map.cpp 5 Aug 2004 17:40:58 -0000 1.103 *************** *** 89,93 **** InitPathFinder(); } - ChangeArea=false; } --- 89,92 ---- *************** *** 178,188 **** { char Tmp[256]; - if(!ChangeArea) - return; int EveryOne = ip->CheckTravel(actor); switch(EveryOne) { case 2: core->DisplayConstantString(STR_WHOLEPARTY,0xffffff); //white return; case 0: --- 177,189 ---- { char Tmp[256]; + Game *game=core->GetGame(); int EveryOne = ip->CheckTravel(actor); switch(EveryOne) { case 2: core->DisplayConstantString(STR_WHOLEPARTY,0xffffff); //white + if(game->EveryoneStopped()) { + ip->Flags&=~TRAP_RESET; //exit triggered + } return; case 0: *************** *** 192,199 **** } if (ip->Destination[0] != 0) { CreateMovement(Tmp, ip->Destination, ip->EntranceName); if(EveryOne&2) { - Game *game=core->GetGame(); int i=game->GetPartySize(false); while(i--) { --- 193,200 ---- } + ip->Flags&=~TRAP_RESET; //exit triggered if (ip->Destination[0] != 0) { CreateMovement(Tmp, ip->Destination, ip->EntranceName); if(EveryOne&2) { int i=game->GetPartySize(false); while(i--) { *************** *** 209,212 **** --- 210,214 ---- } else { if (ip->Scripts[0]) { + ip->LastEntered = actor; ip->LastTrigger = actor; ip->ExecuteScript( ip->Scripts[0] ); *************** *** 263,307 **** continue; } ! Region BBox = ip->outline->BBox; ! if (ip->Type == ST_PROXIMITY) { ! if (BBox.x <= 500) ! BBox.x = 0; ! else ! BBox.x -= 500; ! if (BBox.y <= 500) ! BBox.y = 0; ! else ! BBox.y -= 500; ! BBox.h += 1000; ! BBox.w += 1000; ! } ! i=0; ! while (true) { ! Actor* actor = core->GetGame()->GetPC( i++ ); if (!actor) break; ! if (!actor->InParty) ! break; ! if (BBox.PointInside( actor->XPos, actor->YPos )) { ! if (ip->Type == ST_PROXIMITY) { ! if (ip->outline->BBox.PointInside( actor->XPos, actor->YPos )) { ! if (ip->outline->PointIn( actor->XPos, actor->YPos )) { ! ip->LastEntered = actor; ! ip->LastTrigger = actor; ! } ! } ! ip->ExecuteScript( ip->Scripts[0] ); ! ip->OnCreation = false; ! } else { ! //ST_TRAVEL ! //don't move if doing something else ! if(actor->GetNextAction()) ! break; ! if (ip->outline->PointIn( actor->XPos, actor->YPos )) { ! UseExit(actor, ip); ! } } - break; } } } --- 265,290 ---- continue; } ! i=actors.size(); ! while (i--) { ! Actor* actor = actors[i]; if (!actor) break; ! if (ip->Type == ST_PROXIMITY) { ! if (ip->outline->PointIn( actor->XPos, actor->YPos )) { ! ip->LastEntered = actor; ! ip->LastTrigger = actor; ! } ! ip->ExecuteScript( ip->Scripts[0] ); ! ip->OnCreation = false; ! } else { ! //ST_TRAVEL ! //don't move if doing something else ! if(actor->GetNextAction()) ! break; ! if (ip->outline->PointIn( actor->XPos, actor->YPos )) { ! UseExit(actor, ip); } } + break; } } Index: GameControl.cpp =================================================================== RCS file: /cvsroot/gemrb/gemrb/gemrb/plugins/Core/GameControl.cpp,v retrieving revision 1.156 retrieving revision 1.157 diff -C2 -d -r1.156 -r1.157 *** GameControl.cpp 2 Aug 2004 22:22:05 -0000 1.156 --- GameControl.cpp 5 Aug 2004 17:40:57 -0000 1.157 *************** *** 388,395 **** void GameControl::SelectActor(int whom) { - ScreenFlags|=SF_CENTERONACTOR; - DeselectAll(); Game* game = core->GetGame(); if(whom==-1) { for(int i = 0; i < game->GetPartySize(0); i++) { Actor* actor = game->GetPC( i ); --- 388,394 ---- void GameControl::SelectActor(int whom) { Game* game = core->GetGame(); if(whom==-1) { + DeselectAll(); for(int i = 0; i < game->GetPartySize(0); i++) { Actor* actor = game->GetPC( i ); *************** *** 408,411 **** --- 407,413 ---- Actor* actor = game->GetPC( whom ); if (actor && actor->ValidTarget(GA_SELECT|GA_NO_DEAD) ) { + if((ScreenFlags&SF_ALWAYSCENTER) || actor->IsSelected()) + ScreenFlags|=SF_CENTERONACTOR; + DeselectAll(); selected.push_back( actor ); actor->Select( true ); *************** *** 755,758 **** --- 757,813 ---- } + void GameControl::HandleDoor(Door *door, Actor *actor) + { + char Tmp[256]; + + if (door->Flags&DOOR_CLOSED) { + actor->ClearPath(); + actor->ClearActions(); + sprintf( Tmp, "OpenDoor(\"%s\")", door->Name ); + actor->AddAction( GameScript::GenerateAction( Tmp, true ) ); + } else { + actor->ClearPath(); + actor->ClearActions(); + sprintf( Tmp, "CloseDoor(\"%s\")", door->Name ); + actor->AddAction( GameScript::GenerateAction( Tmp, true ) ); + } + } + + bool GameControl::HandleActiveRegion(InfoPoint *trap, Actor *actor) + { + switch(trap->Type) { + case ST_TRAVEL: + trap->Flags|=TRAP_RESET; + return false; + case ST_TRIGGER: + //the importer shouldn't load the script + //if it is unallowed anyway (though + //deactivated scripts could be reactivated) + //only the 'trapped' flag should be honoured + //there. Here we have to check on the + //reset trap and deactivated flags + if (trap->Scripts[0]) { + if(!(trap->Flags&TRAP_DEACTIVATED) ) { + trap->LastTrigger = selected[0]; + trap->Scripts[0]->Update(); + //if reset trap flag not set, deactivate it + if(!(trap->Flags&TRAP_RESET)) { + trap->Flags|=TRAP_DEACTIVATED; + } + } + } else { + if (trap->overHeadText) { + if (trap->textDisplaying != 1) { + trap->textDisplaying = 1; + GetTime( trap->timeStartDisplaying ); + DisplayString( trap ); + } + } + } + return true; + default:; + } + return false; + } /** Mouse Button Down */ void GameControl::OnMouseDown(unsigned short x, unsigned short y, *************** *** 817,863 **** if (!actor && ( selected.size() > 0 )) { ! Door* door = area->tm->GetDoor( GameX, GameY ); ! if (door) { ! //we are sure we got one element ! actor = selected[0]; ! if (door->Flags&DOOR_CLOSED) { ! actor->ClearPath(); ! actor->ClearActions(); ! sprintf( Tmp, "OpenDoor(\"%s\")", door->Name ); ! actor->AddAction( GameScript::GenerateAction( Tmp, true ) ); ! } else { ! actor->ClearPath(); ! actor->ClearActions(); ! sprintf( Tmp, "CloseDoor(\"%s\")", door->Name ); ! actor->AddAction( GameScript::GenerateAction( Tmp, true ) ); ! } return; } ! if(overInfoPoint && (overInfoPoint->Type==ST_TRIGGER) ) { ! //the importer shouldn't load the script ! //if it is unallowed anyway (though ! //deactivated scripts could be reactivated) ! //only the 'trapped' flag should be honoured ! //there. Here we have to check on the ! //reset trap and deactivated flags ! if (overInfoPoint->Scripts[0]) { ! if(!(overInfoPoint->Flags&TRAP_DEACTIVATED) ) { ! overInfoPoint->LastTrigger = selected[0]; ! overInfoPoint->Scripts[0]->Update(); ! //if reset trap flag not set, deactivate it ! if(!(overInfoPoint->Flags&TRAP_RESET)) { ! overInfoPoint->Flags|=TRAP_DEACTIVATED; ! } ! } ! } else { ! if (overInfoPoint->overHeadText) { ! if (overInfoPoint->textDisplaying != 1) { ! overInfoPoint->textDisplaying = 1; ! GetTime( overInfoPoint->timeStartDisplaying ); ! DisplayString( overInfoPoint ); ! } ! } } - return; } //just a single actor, no formation --- 872,883 ---- if (!actor && ( selected.size() > 0 )) { ! if (overDoor) { ! HandleDoor(overDoor, selected[0]); return; } ! if(overInfoPoint) { ! if(HandleActiveRegion(overInfoPoint, selected[0])) { ! return; } } //just a single actor, no formation *************** *** 1574,1580 **** core->GetVideoDriver()->SetViewport( pc->XPos - ( vp.w / 2 ), pc->YPos - ( vp.h / 2 ) ); ! if(!(ScreenFlags&SF_ALWAYSCENTER)) { ! ScreenFlags&=~SF_CENTERONACTOR; ! } } } --- 1594,1598 ---- core->GetVideoDriver()->SetViewport( pc->XPos - ( vp.w / 2 ), pc->YPos - ( vp.h / 2 ) ); ! ScreenFlags&=~SF_CENTERONACTOR; } } Index: GameScript.cpp =================================================================== RCS file: /cvsroot/gemrb/gemrb/gemrb/plugins/Core/GameScript.cpp,v retrieving revision 1.172 retrieving revision 1.173 diff -C2 -d -r1.172 -r1.173 *** GameScript.cpp 3 Aug 2004 17:32:23 -0000 1.172 --- GameScript.cpp 5 Aug 2004 17:40:58 -0000 1.173 *************** *** 33,39 **** #define SKIP_ARGUMENT() while(*str && ( *str != ',' ) && ( *str != ')' )) str++ - //later this could be separated from talking distance - #define MAX_OPERATING_DISTANCE 40 - static int initialized = 0; static SymbolMgr* triggersTable; --- 33,36 ---- *************** *** 54,58 **** static int ExtraParametersCount = 0; static int RandomNumValue; ! static int InDebug = 1; //Make this an ordered list, so we could use bsearch! --- 51,55 ---- static int ExtraParametersCount = 0; static int RandomNumValue; ! static int InDebug = 0; //Make this an ordered list, so we could use bsearch! Index: Interface.cpp =================================================================== RCS file: /cvsroot/gemrb/gemrb/gemrb/plugins/Core/Interface.cpp,v retrieving revision 1.186 retrieving revision 1.187 diff -C2 -d -r1.186 -r1.187 *** Interface.cpp 5 Aug 2004 06:42:43 -0000 1.186 --- Interface.cpp 5 Aug 2004 17:40:58 -0000 1.187 *************** *** 1070,1073 **** --- 1070,1074 ---- SetFeature( ini->GetKeyAsInt( "resources", "HasPartyIni", 0 ), GF_HAS_PARTY_INI ); SetFeature( ini->GetKeyAsInt( "resources", "HasBeastsIni", 0 ), GF_HAS_BEASTS_INI ); + SetFeature( ini->GetKeyAsInt( "resources", "TeamMovement", 0 ), GF_TEAM_MOVEMENT ); ForceStereo = ini->GetKeyAsInt( "resources", "ForceStereo", 0 ); *************** *** 2043,2050 **** if (sav_str) { ArchiveImporter * ai = (ArchiveImporter*)core->GetInterface(IE_BIF_CLASS_ID); ! ai->DecompressSaveGame(sav_str); ! ! FreeInterface( ai ); ! ai = NULL; sav_str = NULL; } --- 2044,2052 ---- if (sav_str) { ArchiveImporter * ai = (ArchiveImporter*)core->GetInterface(IE_BIF_CLASS_ID); ! if(ai) { ! ai->DecompressSaveGame(sav_str); ! FreeInterface( ai ); ! ai = NULL; ! } sav_str = NULL; } *************** *** 2224,2228 **** continue; if (!onlysave || SavedExtension(de->d_name) ) { - printf("*unlinking %s\n",dtmp); unlink( dtmp ); } --- 2226,2229 ---- Index: Game.h =================================================================== RCS file: /cvsroot/gemrb/gemrb/gemrb/plugins/Core/Game.h,v retrieving revision 1.34 retrieving revision 1.35 diff -C2 -d -r1.34 -r1.35 *** Game.h 2 Aug 2004 18:00:19 -0000 1.34 --- Game.h 5 Aug 2004 17:40:57 -0000 1.35 *************** *** 194,197 **** --- 194,198 ---- } void ShareXP(int XP); + bool EveryoneStopped(); bool EveryoneNearPoint(const char *area, int x, int y, bool canmove); bool PartyMemberDied(); Index: Game.cpp =================================================================== RCS file: /cvsroot/gemrb/gemrb/gemrb/plugins/Core/Game.cpp,v retrieving revision 1.49 retrieving revision 1.50 diff -C2 -d -r1.49 -r1.50 *** Game.cpp 2 Aug 2004 18:00:19 -0000 1.49 --- Game.cpp 5 Aug 2004 17:40:57 -0000 1.50 *************** *** 489,492 **** --- 489,500 ---- } + bool Game::EveryoneStopped() + { + for(unsigned int i=0; i<PCs.size(); i++) { + if(PCs[i]->path ) return false; + } + return true; + } + //canmove=true: if some PC can't move (or hostile), then this returns false bool Game::EveryoneNearPoint(const char *area, int x, int y, bool canmove) *************** *** 506,511 **** return false; } ! printf("Checking distance %d\n",i); ! if(Distance(x,y,PCs[i])>25) { return false; } --- 514,518 ---- return false; } ! if(Distance(x,y,PCs[i])>MAX_OPERATING_DISTANCE) { return false; } Index: ActorBlock.cpp =================================================================== RCS file: /cvsroot/gemrb/gemrb/gemrb/plugins/Core/ActorBlock.cpp,v retrieving revision 1.55 retrieving revision 1.56 diff -C2 -d -r1.55 -r1.56 *** ActorBlock.cpp 4 Aug 2004 21:47:12 -0000 1.55 --- ActorBlock.cpp 5 Aug 2004 17:40:57 -0000 1.56 *************** *** 1,2 **** --- 1,21 ---- + /* GemRB - Infinity Engine Emulator + * Copyright (C) 2003 The GemRB Project + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + * $Header$ + */ #include "../../includes/win32def.h" #include "ActorBlock.h" *************** *** 328,335 **** return false; } ! if (outline->BBox.PointInside( XPos, YPos )) { ! return outline->PointIn( XPos, YPos ); ! } ! return false; } --- 347,351 ---- return false; } ! return outline->PointIn(XPos, YPos); } *************** *** 432,453 **** this->XDes = XDes; this->YDes = YDes; - /* - if (path) { - PathNode* nextNode = path->Next; - PathNode* thisNode = path; - while (true) { - delete( thisNode ); - thisNode = nextNode; - if (!thisNode) - break; - nextNode = thisNode->Next; - } - } - */ ClearPath(); Game* game = core->GetGame(); Map* map = game->GetMap(Area); path = map->FindPath( XPos, YPos, XDes, YDes ); - // step = NULL; } --- 448,455 ---- *************** *** 541,546 **** void Door::ToggleTiles(int State, bool playsound) ! { ! int i; int state; --- 543,548 ---- void Door::ToggleTiles(int State, bool playsound) ! { ! int i; int state; *************** *** 673,684 **** int InfoPoint::CheckTravel(Actor *actor) { if(Flags&TRAP_DEACTIVATED) return 0; if(!actor->InParty && (Flags&TRAVEL_NONPC) ) return 0; - printf("%lx\n",Flags); if(Flags&TRAVEL_PARTY) { ! if(!core->GetGame()->EveryoneNearPoint(actor->Area, actor->XPos, actor->YPos, true) ) { ! return 2; } ! return 3; } return 1; --- 675,686 ---- int InfoPoint::CheckTravel(Actor *actor) { + if(!(Flags&TRAP_RESET)) return 0; //experimental hack if(Flags&TRAP_DEACTIVATED) return 0; if(!actor->InParty && (Flags&TRAVEL_NONPC) ) return 0; if(Flags&TRAVEL_PARTY) { ! if(core->HasFeature(GF_TEAM_MOVEMENT) || core->GetGame()->EveryoneNearPoint(actor->Area, actor->XPos, actor->YPos, true) ) { ! return 3; } ! return 2; } return 1; Index: GameControl.h =================================================================== RCS file: /cvsroot/gemrb/gemrb/gemrb/plugins/Core/GameControl.h,v retrieving revision 1.48 retrieving revision 1.49 diff -C2 -d -r1.48 -r1.49 *** GameControl.h 2 Aug 2004 22:22:05 -0000 1.48 --- GameControl.h 5 Aug 2004 17:40:58 -0000 1.49 *************** *** 36,39 **** --- 36,42 ---- #define SF_GUIENABLED 8 + //later this could be separated from talking distance + #define MAX_OPERATING_DISTANCE 40 + class GEM_EXPORT GameControl : public Control { public: *************** *** 111,114 **** --- 114,119 ---- void TryToAttack(Actor *source, Actor *target); void TryToTalk(Actor *source, Actor *target); + void HandleDoor(Door *door, Actor *actor); + bool HandleActiveRegion(InfoPoint *trap, Actor *actor); void MoveToPointFormation(Actor *actor, int GameX, int GameY); void InitDialog(Actor* speaker, Actor* target, const char* dlgref); |