From: <fu...@us...> - 2009-01-29 19:05:21
|
Revision: 5568 http://gemrb.svn.sourceforge.net/gemrb/?rev=5568&view=rev Author: fuzzie Date: 2009-01-29 19:05:16 +0000 (Thu, 29 Jan 2009) Log Message: ----------- combine shared trap variables/code into Highlightable, and match original trap behaviour a bit better Modified Paths: -------------- gemrb/trunk/gemrb/plugins/Core/ActorBlock.cpp gemrb/trunk/gemrb/plugins/Core/ActorBlock.h Modified: gemrb/trunk/gemrb/plugins/Core/ActorBlock.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/Core/ActorBlock.cpp 2009-01-29 19:00:45 UTC (rev 5567) +++ gemrb/trunk/gemrb/plugins/Core/ActorBlock.cpp 2009-01-29 19:05:16 UTC (rev 5568) @@ -1430,7 +1430,7 @@ } } -void Door::TryDisarm(Actor *actor) +void Highlightable::TryDisarm(Actor *actor) { //first lets do this automatically succeeding //TODO: skill check, set off @@ -1439,7 +1439,7 @@ LastDisarmed = actor->GetID(); TrapDetected = 1; //trap fired - if (!(Flags & DOOR_RESET) ) { + if (!TrapResets()) { //trap removed Trapped = 0; actor->AddExperience(XP_DISARM, actor->GetXPLevel(1)); @@ -1531,39 +1531,41 @@ return CT_ACTIVE; } -void InfoPoint::TryDisarm(Actor *actor) -{ -//first lets do this automatically succeeding -//TODO: skill check, set off - Trapped = 0; - TrapDetected = 0; - //actor->AddExperience(XP_DISARM, actor->GetXPLevel(1)); - LastDisarmed = actor->GetID(); - ImmediateEvent(); -} - //detect this trap, using a skill, skill could be set to 256 for 'sure' //skill is the all around modified trap detection skill //a trapdetectiondifficulty of 100 means impossible detection short of a spell -void InfoPoint::DetectTrap(int skill) +void Highlightable::DetectTrap(int skill) { - if (Type!=ST_TRIGGER) return; + if (!CanDetectTrap()) return; if (!Scripts[0]) return; - if (Flags&(TRAP_DEACTIVATED|TRAP_INVISIBLE) ) return; if ((skill>=100) && (skill!=256) ) skill=100; if (skill/2+core->Roll(1,skill/2,0)>TrapDetectionDiff) { TrapDetected=1; //probably could be set to the player #? } } +bool Highlightable::PossibleToSeeTrap() { + return CanDetectTrap(); +} + +bool InfoPoint::PossibleToSeeTrap() { + // Only detectable trap-type infopoints. + return (CanDetectTrap() && Type == ST_PROXIMITY); +} + +bool InfoPoint::CanDetectTrap() { + // Traps can be detected on all types of infopoint, as long + // as the trap is detectable and isn't deactivated. + return (!(Flags&(TRAP_DETECTABLE|TRAP_DEACTIVATED))); +} + //trap that is visible on screen (marked by red) //if TrapDetected is a bitflag, we could show traps selectively for //players, really nice for multiplayer -bool InfoPoint::VisibleTrap(bool see_all) +bool Highlightable::VisibleTrap(bool see_all) { - if (Type!=ST_TRIGGER) return false; + if (!PossibleToSeeTrap()) return false; if (!Scripts[0]) return false; - if (Flags&(TRAP_DEACTIVATED|TRAP_INVISIBLE) ) return false; if (see_all) return true; if (TrapDetected ) return true; return false; @@ -1592,7 +1594,7 @@ } LastTrigger = LastEntered = ID; ImmediateEvent(); - if (Flags&TRAP_RESET) { + if (TrapResets()) { return true; } if (Trapped) { @@ -1837,25 +1839,6 @@ return true; } -void Container::TryDisarm(Actor *actor) -{ -//first lets do this automatically succeeding -//TODO: skill check, set off - if (Trapped) { - LastTrigger = actor->GetID(); - LastDisarmed = actor->GetID(); - TrapDetected = 1; - //trap fired - if (!(Flags & CONT_RESET) ) { - //trap removed - Trapped = 0; - actor->AddExperience(XP_DISARM, actor->GetXPLevel(1)); - } - ImmediateEvent(); - return; - } -} - void Container::TryPickLock(Actor *actor) { if (actor->GetStat(IE_LOCKPICKING)<LockDifficulty) { Modified: gemrb/trunk/gemrb/plugins/Core/ActorBlock.h =================================================================== --- gemrb/trunk/gemrb/plugins/Core/ActorBlock.h 2009-01-29 19:00:45 UTC (rev 5567) +++ gemrb/trunk/gemrb/plugins/Core/ActorBlock.h 2009-01-29 19:05:16 UTC (rev 5568) @@ -302,12 +302,19 @@ public: Highlightable(ScriptableType type); virtual ~Highlightable(void); + virtual bool TrapResets() = 0; + virtual bool CanDetectTrap() { return true; } + virtual bool PossibleToSeeTrap(); public: Gem_Polygon* outline; Color outlineColor; ieDword Cursor; bool Highlight; Point TrapLaunch; + ieWord TrapDetectionDiff; + ieWord TrapRemovalDiff; + ieWord Trapped; + ieWord TrapDetected; ieResRef KeyResRef; public: bool IsOver(Point &Pos); @@ -318,6 +325,12 @@ if (KeyResRef[0]) return KeyResRef; return NULL; } + void TryDisarm(Actor *actor); + //detect trap, set skill to 256 if you want sure fire + void DetectTrap(int skill); + //returns true if trap is visible, only_detected must be true + //if you want to see discovered traps, false is for cheats + bool VisibleTrap(bool only_detected); }; class GEM_EXPORT Movable : public Selectable { @@ -443,10 +456,6 @@ ieResRef LockSound; ieResRef UnLockSound; ieDword LockDifficulty; //this is a dword? - ieWord TrapDetectionDiff; - ieWord TrapRemovalDiff; - ieWord Trapped; - ieWord TrapDetected; ieStrRef OpenStrRef; ieStrRef NameStrRef; ieResRef Dialog; @@ -463,9 +472,9 @@ void SetDoorOpen(bool Open, bool playsound, ieDword ID); void SetPolygon(bool Open, Gem_Polygon* poly); bool IsOpen() const; - void TryDisarm(Actor *actor); void TryPickLock(Actor *actor); void DebugDump(); + bool TrapResets() { return Flags & DOOR_RESET; } }; class GEM_EXPORT Container : public Highlightable { @@ -484,9 +493,9 @@ //returns dithering option int WantDither(); bool IsOpen() const; - void TryDisarm(Actor *actor); void TryPickLock(Actor *actor); void DebugDump(); + bool TrapResets() { return Flags & CONT_RESET; } private: //updates the ground icons for a pile void RefreshGroundIcons(); @@ -497,10 +506,6 @@ ieWord Type; ieDword Flags; ieWord LockDifficulty; - ieWord TrapDetectionDiff; - ieWord TrapRemovalDiff; - ieWord Trapped; - ieWord TrapDetected; Inventory inventory; ieStrRef OpenFail; //these are not saved @@ -513,12 +518,6 @@ public: InfoPoint(void); ~InfoPoint(void); - void TryDisarm(Actor *actor); - //detect trap, set skill to 256 if you want sure fire - void DetectTrap(int skill); - //returns true if trap is visible, only_detected must be true - //if you want to see discovered traps, false is for cheats - bool VisibleTrap(bool only_detected); //returns true if trap has been triggered, tumble skill??? bool TriggerTrap(int skill, ieDword ID); //call this to check if an actor entered the trigger zone @@ -526,15 +525,14 @@ //checks if the actor may use this travel trigger int CheckTravel(Actor *actor); void DebugDump(); + bool TrapResets() { return Flags & TRAP_RESET; } + bool CanDetectTrap(); + bool PossibleToSeeTrap(); public: ieResRef Destination; ieVariable EntranceName; ieDword Flags; - ieWord TrapDetectionDiff; - ieWord TrapRemovalDiff; - ieWord Trapped; - ieWord TrapDetected; //overheadtext contains the string, but we have to save this ieStrRef StrRef; Point UsePoint; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |