From: <ave...@us...> - 2007-02-27 20:30:23
|
Revision: 4505 http://gemrb.svn.sourceforge.net/gemrb/?rev=4505&view=rev Author: avenger_teambg Date: 2007-02-27 12:30:21 -0800 (Tue, 27 Feb 2007) Log Message: ----------- implemented SpellHitEffectSprite added opcode number feedback for missing actions/triggers/objects Modified Paths: -------------- gemrb/trunk/gemrb/plugins/Core/Actions.cpp 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 2007-02-27 16:48:06 UTC (rev 4504) +++ gemrb/trunk/gemrb/plugins/Core/Actions.cpp 2007-02-27 20:30:21 UTC (rev 4505) @@ -5400,3 +5400,33 @@ ieDword value = CheckVariable( Sender, variable, "GLOBAL" ) + 1; SetVariable( Sender, variable, "GLOBAL", value ); } + +//this action plays a vvc animation over target +//we simply apply the appropriate opcode on the target (see iwdopcodes) +//the list of vvcs is in iwdshtab.2da +EffectRef fx_iwd_visual_spell_hit_ref={"IWDVisualSpellHit",NULL,-1}; + +void GameScript::SpellHitEffectSprite(Scriptable* Sender, Action* parameters) +{ + Scriptable* src = GetActorFromObject( Sender, parameters->objects[1] ); + if (!src || src->Type!=ST_ACTOR) { + return; + } + Scriptable* tar = GetActorFromObject( Sender, parameters->objects[1] ); + if (!tar || tar->Type!=ST_ACTOR) { + return; + } + int opcode = EffectQueue::ResolveEffect(fx_iwd_visual_spell_hit_ref); + Effect *fx = core->GetEffect(opcode); + if (!fx) { + //invalid effect name didn't resolve to opcode + return; + } + + //vvc type + fx->Parameter2 = parameters->int0Parameter; + //height (not sure if this is in the opcode, but seems acceptable) + fx->Parameter1 = parameters->int1Parameter; + core->ApplyEffect(fx, (Actor *) src, (Actor *) tar); +} + Modified: gemrb/trunk/gemrb/plugins/Core/GameScript.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/Core/GameScript.cpp 2007-02-27 16:48:06 UTC (rev 4504) +++ gemrb/trunk/gemrb/plugins/Core/GameScript.cpp 2007-02-27 20:30:21 UTC (rev 4505) @@ -774,6 +774,7 @@ {"spawnptactivate", GameScript::SpawnPtActivate, 0}, {"spawnptdeactivate", GameScript::SpawnPtDeactivate, 0}, {"spawnptspawn", GameScript::SpawnPtSpawn, 0}, + {"spellhiteffectsprite", GameScript::SpellHitEffectSprite, 0}, {"startcutscene", GameScript::StartCutScene, 0}, {"startcutsceneex", GameScript::StartCutScene, 0}, //pst (unknown) {"startcutscenemode", GameScript::StartCutSceneMode, 0}, @@ -968,7 +969,7 @@ { NULL,NULL} }; -static TriggerLink* FindTrigger(const char* triggername) +static TriggerLink* FindTrigger(const char* triggername, int index) { if (!triggername) { return NULL; @@ -981,11 +982,11 @@ } } } - printf( "Warning: Couldn't assign trigger: %.*s\n", len, triggername ); + printf( "Warning: Couldn't assign trigger: 0x%x %.*s\n", index, len, triggername ); return NULL; } -static ActionLink* FindAction(const char* actionname) +static ActionLink* FindAction(const char* actionname, int index) { if (!actionname) { return NULL; @@ -998,11 +999,11 @@ } } } - printf( "Warning: Couldn't assign action: %.*s\n", len, actionname ); + printf( "Warning: Couldn't assign action: %d %.*s\n", index, len, actionname ); return NULL; } -static ObjectLink* FindObject(const char* objectname) +static ObjectLink* FindObject(const char* objectname, int index) { if (!objectname) { return NULL; @@ -1015,7 +1016,7 @@ } } } - printf( "Warning: Couldn't assign object: %.*s\n", len, objectname ); + printf( "Warning: Couldn't assign object: %d %.*s\n", index, len, objectname ); return NULL; } @@ -1238,9 +1239,9 @@ while (j--) { i = triggersTable->GetValueIndex( j ); //maybe we should watch for this bit? + TriggerLink* poi = FindTrigger(triggersTable->GetStringIndex( j ), i ); //bool triggerflag = i & 0x4000; i &= 0x3fff; - TriggerLink* poi = FindTrigger(triggersTable->GetStringIndex( j ) ); if (triggers[i]) { if (poi && triggers[i]!=poi->Function) { printMessage("GameScript"," ", YELLOW); @@ -1264,7 +1265,7 @@ j = actionsTable->GetSize(); while (j--) { i = actionsTable->GetValueIndex( j ); - ActionLink* poi = FindAction( actionsTable->GetStringIndex( j ) ); + ActionLink* poi = FindAction( actionsTable->GetStringIndex( j ), i ); if (actions[i]) { if (poi && actions[i]!=poi->Function) { printMessage("GameScript"," ", YELLOW); @@ -1287,7 +1288,7 @@ j = objectsTable->GetSize(); while (j--) { i = objectsTable->GetValueIndex( j ); - ObjectLink* poi = FindObject( objectsTable->GetStringIndex( j ) ); + ObjectLink* poi = FindObject( objectsTable->GetStringIndex( j ), i ); if (objects[i]) { if (poi && objects[i]!=poi->Function) { printMessage("GameScript"," ", YELLOW); Modified: gemrb/trunk/gemrb/plugins/Core/GameScript.h =================================================================== --- gemrb/trunk/gemrb/plugins/Core/GameScript.h 2007-02-27 16:48:06 UTC (rev 4504) +++ gemrb/trunk/gemrb/plugins/Core/GameScript.h 2007-02-27 20:30:21 UTC (rev 4505) @@ -1302,6 +1302,7 @@ static void SpawnPtActivate(Scriptable* Sender, Action* parameters); static void SpawnPtDeactivate(Scriptable* Sender, Action* parameters); static void SpawnPtSpawn(Scriptable* Sender, Action* parameters); + static void SpellHitEffectSprite(Scriptable* Sender, Action* parameters); static void StartCutScene(Scriptable* Sender, Action* parameters); static void StartCutSceneMode(Scriptable* Sender, Action* parameters); static void StartDialogue(Scriptable* Sender, Action* parameters); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ave...@us...> - 2007-02-27 23:03:38
|
Revision: 4508 http://gemrb.svn.sourceforge.net/gemrb/?rev=4508&view=rev Author: avenger_teambg Date: 2007-02-27 15:03:36 -0800 (Tue, 27 Feb 2007) Log Message: ----------- some more object filters: GroupOf, ProtectorOf Modified Paths: -------------- gemrb/trunk/gemrb/plugins/Core/Actions.cpp 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 2007-02-27 22:02:40 UTC (rev 4507) +++ gemrb/trunk/gemrb/plugins/Core/Actions.cpp 2007-02-27 23:03:36 UTC (rev 4508) @@ -5418,15 +5418,17 @@ } int opcode = EffectQueue::ResolveEffect(fx_iwd_visual_spell_hit_ref); Effect *fx = core->GetEffect(opcode); - if (!fx) { - //invalid effect name didn't resolve to opcode - return; - } + if (!fx) { + //invalid effect name didn't resolve to opcode + return; + } //vvc type fx->Parameter2 = parameters->int0Parameter; //height (not sure if this is in the opcode, but seems acceptable) fx->Parameter1 = parameters->int1Parameter; + fx->Probability1=100; + fx->TimingMode=FX_DURATION_INSTANT_PERMANENT_AFTER_BONUSES; core->ApplyEffect(fx, (Actor *) src, (Actor *) tar); } Modified: gemrb/trunk/gemrb/plugins/Core/GameScript.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/Core/GameScript.cpp 2007-02-27 22:02:40 UTC (rev 4507) +++ gemrb/trunk/gemrb/plugins/Core/GameScript.cpp 2007-02-27 23:03:36 UTC (rev 4508) @@ -872,6 +872,8 @@ {"fourthnearestenemyof", GameScript::FourthNearestEnemyOf}, {"fourthnearestenemyoftype", GameScript::FourthNearestEnemyOfType}, {"fourthnearestmygroupoftype", GameScript::FourthNearestEnemyOfType}, + {"gabber", GameScript::Gabber}, + {"groupof", GameScript::GroupOf}, {"lastattackerof", GameScript::LastAttackerOf}, {"lastcommandedby", GameScript::LastCommandedBy}, {"lastheardby", GameScript::LastHeardBy}, @@ -917,6 +919,7 @@ {"player8", GameScript::Player8}, {"player8fill", GameScript::Player8Fill}, {"protectedby", GameScript::ProtectedBy}, + {"protectorof", GameScript::ProtectorOf}, {"protagonist", GameScript::Protagonist}, {"secondnearest", GameScript::SecondNearest}, {"secondnearestdoor", GameScript::SecondNearestDoor}, @@ -1917,7 +1920,32 @@ return parameters; } -/*this one is tough*/ +//i was told that Group means the same specifics, so this is just an +//object selector for everyone with the same specifics as the current object +Targets *GameScript::GroupOf(Scriptable *Sender, Targets *parameters) +{ + Actor *actor = (Actor *) parameters->GetTarget(0, ST_ACTOR); + if (!actor) { + if (Sender->Type==ST_ACTOR) { + actor = (Actor *) Sender; + } + } + parameters->Clear(); + if (actor) { + ieDword tmp = actor->GetStat(IE_SPECIFIC); + Map *cm = Sender->GetCurrentArea(); + int i = cm->GetActorCount(true); + while (i--) { + Actor *target=cm->GetActor(i,true); + if (target && (target->GetStat(IE_SPECIFIC)==tmp) ) { + parameters->AddTarget(target, 0, 0); + } + } + } + return parameters; +} + +/*this one is tough, but done */ Targets *GameScript::ProtectorOf(Scriptable *Sender, Targets *parameters) { Actor *actor = (Actor *) parameters->GetTarget(0, ST_ACTOR); @@ -1928,9 +1956,14 @@ } parameters->Clear(); if (actor) { - Actor *target = actor->GetCurrentArea()->GetActorByGlobalID(actor->LastProtected); - if (target) { - parameters->AddTarget(target, 0, 0); + ieWord tmp = actor->LastProtected; + Map *cm = Sender->GetCurrentArea(); + int i = cm->GetActorCount(true); + while (i--) { + Actor *target=cm->GetActor(i,true); + if (target && (target->LastProtected ==tmp) ) { + parameters->AddTarget(target, 0, 0); + } } } return parameters; @@ -1985,24 +2018,6 @@ return GetMyTarget(Sender, actor, parameters); } -/* -Targets *GetMyTarget(Actor *actor, Targets *parameters) -{ - if (!actor) { - if (Sender->Type==ST_ACTOR) { - actor = (Actor *) Sender; - } - } - parameters->Clear(); - if (actor) { - Actor *target = actor->GetCurrentArea()->GetActorByGlobalID(actor->LastTarget); - if (target) { - parameters->AddTarget(target, 0); - } - } - return parameters; -} -*/ Targets *GameScript::LastAttackerOf(Scriptable *Sender, Targets *parameters) { Actor *actor = (Actor *) parameters->GetTarget(0, ST_ACTOR); Modified: gemrb/trunk/gemrb/plugins/Core/GameScript.h =================================================================== --- gemrb/trunk/gemrb/plugins/Core/GameScript.h 2007-02-27 22:02:40 UTC (rev 4507) +++ gemrb/trunk/gemrb/plugins/Core/GameScript.h 2007-02-27 23:03:36 UTC (rev 4508) @@ -1380,6 +1380,7 @@ static Targets *FourthNearestEnemyOfType(Scriptable *Sender, Targets *parameters); static Targets *FourthNearestMyGroupOfType(Scriptable *Sender, Targets *parameters); static Targets *Gabber(Scriptable *Sender, Targets *parameters); + static Targets *GroupOf(Scriptable *Sender, Targets *parameters); static Targets *LastAttackerOf(Scriptable *Sender, Targets *parameters); static Targets *LastCommandedBy(Scriptable *Sender, Targets *parameters); static Targets *LastHeardBy(Scriptable *Sender, Targets *parameters); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ave...@us...> - 2007-02-28 19:03:01
|
Revision: 4510 http://gemrb.svn.sourceforge.net/gemrb/?rev=4510&view=rev Author: avenger_teambg Date: 2007-02-28 11:02:52 -0800 (Wed, 28 Feb 2007) Log Message: ----------- implemented [double]click[l|r]button[point|object] actions implemented LeaderOf Modified Paths: -------------- gemrb/trunk/gemrb/plugins/Core/Actions.cpp gemrb/trunk/gemrb/plugins/Core/Button.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 2007-02-28 19:01:36 UTC (rev 4509) +++ gemrb/trunk/gemrb/plugins/Core/Actions.cpp 2007-02-28 19:02:52 UTC (rev 4510) @@ -5432,3 +5432,60 @@ core->ApplyEffect(fx, (Actor *) src, (Actor *) tar); } +void GameScript::ClickLButtonObject(Scriptable* Sender, Action* parameters) +{ + Scriptable *tar = GetActorFromObject(Sender, parameters->objects[1] ); + if (!tar) { + return; + } + ClickCore(tar->Pos, GEM_MB_ACTION, parameters->int0Parameter); +} + +void GameScript::ClickLButtonPoint(Scriptable* /*Sender*/, Action* parameters) +{ + ClickCore(parameters->pointParameter, GEM_MB_ACTION, parameters->int0Parameter); +} + +void GameScript::ClickRButtonObject(Scriptable* Sender, Action* parameters) +{ + Scriptable *tar = GetActorFromObject(Sender, parameters->objects[1] ); + if (!tar) { + return; + } + ClickCore(tar->Pos, GEM_MB_MENU, parameters->int0Parameter); +} + +void GameScript::ClickRButtonPoint(Scriptable* /*Sender*/, Action* parameters) +{ + ClickCore(parameters->pointParameter, GEM_MB_MENU, parameters->int0Parameter); +} + +void GameScript::DoubleClickLButtonObject(Scriptable* Sender, Action* parameters) +{ + Scriptable *tar = GetActorFromObject(Sender, parameters->objects[1] ); + if (!tar) { + return; + } + ClickCore(tar->Pos, GEM_MB_ACTION|GEM_MB_DOUBLECLICK, parameters->int0Parameter); +} + +void GameScript::DoubleClickLButtonPoint(Scriptable* /*Sender*/, Action* parameters) +{ + ClickCore(parameters->pointParameter, GEM_MB_ACTION|GEM_MB_DOUBLECLICK, parameters->int0Parameter); +} + +void GameScript::DoubleClickRButtonObject(Scriptable* Sender, Action* parameters) +{ + Scriptable *tar = GetActorFromObject(Sender, parameters->objects[1] ); + if (!tar) { + return; + } + ClickCore(tar->Pos, GEM_MB_MENU|GEM_MB_DOUBLECLICK, parameters->int0Parameter); +} + +void GameScript::DoubleClickRButtonPoint(Scriptable* /*Sender*/, Action* parameters) +{ + ClickCore(parameters->pointParameter, GEM_MB_MENU|GEM_MB_DOUBLECLICK, parameters->int0Parameter); +} + + Modified: gemrb/trunk/gemrb/plugins/Core/Button.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/Core/Button.cpp 2007-02-28 19:01:36 UTC (rev 4509) +++ gemrb/trunk/gemrb/plugins/Core/Button.cpp 2007-02-28 19:02:52 UTC (rev 4510) @@ -314,7 +314,7 @@ return; //Button == 1 means Left Mouse Button - if (Button == 1) { + if (Button == GEM_MB_ACTION) { // We use absolute screen position here, so drag_start // remains valid even after window/control is moved drag_start.x = Owner->XPos + XPos + x; Modified: gemrb/trunk/gemrb/plugins/Core/GSUtils.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/Core/GSUtils.cpp 2007-02-28 19:01:36 UTC (rev 4509) +++ gemrb/trunk/gemrb/plugins/Core/GSUtils.cpp 2007-02-28 19:02:52 UTC (rev 4510) @@ -233,6 +233,15 @@ return ret; } +void ClickCore(Point &point, int type, int /*speed*/) +{ + core->MoveViewportTo( point.x, point.y, true ); + Video *video = core->GetVideoDriver(); + video->ConvertToScreen(point.x, point.y); + video->MoveMouse(point.x, point.y); + video->ClickMouse(type); +} + void TransformItemCore(Actor *actor, Action *parameters, bool onlyone) { int i = actor->inventory.GetSlotCount(); Modified: gemrb/trunk/gemrb/plugins/Core/GSUtils.h =================================================================== --- gemrb/trunk/gemrb/plugins/Core/GSUtils.h 2007-02-28 19:01:36 UTC (rev 4509) +++ gemrb/trunk/gemrb/plugins/Core/GSUtils.h 2007-02-28 19:02:52 UTC (rev 4510) @@ -44,6 +44,7 @@ int GetHPPercent(Scriptable *Sender); bool StoreHasItemCore(ieResRef storename, ieResRef itemname); bool HasItemCore(Inventory *inventory, ieResRef itemname, ieDword flags); +void ClickCore(Point &point, int type, int speed); void TransformItemCore(Actor *actor, Action *parameters, bool onlyone); void CreateVisualEffectCore(Scriptable *Sender, Point &position, const char *effect); void GetPositionFromScriptable(Scriptable* scr, Point &position, bool trap); Modified: gemrb/trunk/gemrb/plugins/Core/GameScript.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/Core/GameScript.cpp 2007-02-28 19:01:36 UTC (rev 4509) +++ gemrb/trunk/gemrb/plugins/Core/GameScript.cpp 2007-02-28 19:02:52 UTC (rev 4510) @@ -430,6 +430,10 @@ {"clearallactions", GameScript::ClearAllActions, 0}, {"clearpartyeffects", GameScript::ClearPartyEffects, 0}, {"clearspriteeffects", GameScript::ClearSpriteEffects, 0}, + {"clicklbuttonobject", GameScript::ClickLButtonObject, AF_BLOCKING}, + {"clicklbuttonpoint", GameScript::ClickLButtonPoint, AF_BLOCKING}, + {"clickrbuttonobject", GameScript::ClickLButtonObject, AF_BLOCKING}, + {"clickrbuttonpoint", GameScript::ClickLButtonPoint, AF_BLOCKING}, {"closedoor", GameScript::CloseDoor,AF_BLOCKING}, {"containerenable", GameScript::ContainerEnable, 0}, {"continue", GameScript::Continue,AF_INSTANT | AF_CONTINUE}, @@ -486,6 +490,10 @@ {"displaystringnoname", GameScript::DisplayStringNoName, 0}, {"displaystringnonamehead", GameScript::DisplayStringNoNameHead, 0}, {"displaystringwait", GameScript::DisplayStringWait,AF_BLOCKING}, + {"doubleclicklbuttonobject", GameScript::DoubleClickLButtonObject, AF_BLOCKING}, + {"doubleclicklbuttonpoint", GameScript::DoubleClickLButtonPoint, AF_BLOCKING}, + {"doubleclickrbuttonobject", GameScript::DoubleClickLButtonObject, AF_BLOCKING}, + {"doubleclickrbuttonpoint", GameScript::DoubleClickLButtonPoint, AF_BLOCKING}, {"dropinventory", GameScript::DropInventory, 0}, {"dropinventoryex", GameScript::DropInventoryEX, 0}, {"dropinventoryexexclude", GameScript::DropInventoryEX, 0}, //same @@ -627,8 +635,8 @@ {"movetosavedlocation", GameScript::MoveToSavedLocation,AF_MERGESTRINGS|AF_BLOCKING}, //take care of the typo in the original bg2 action.ids {"movetosavedlocationn", GameScript::MoveToSavedLocation,AF_BLOCKING}, - {"moveviewobject", GameScript::MoveViewObject, 0}, - {"moveviewpoint", GameScript::MoveViewPoint, 0}, + {"moveviewobject", GameScript::MoveViewObject, AF_BLOCKING}, + {"moveviewpoint", GameScript::MoveViewPoint, AF_BLOCKING}, {"moveviewpointuntildone", GameScript::MoveViewPoint, 0}, {"nidspecial1", GameScript::NIDSpecial1,AF_BLOCKING},//we use this for dialogs, hack {"nidspecial2", GameScript::NIDSpecial2,AF_BLOCKING},//we use this for worldmap, another hack @@ -885,6 +893,7 @@ {"lasttalkedtoby", GameScript::LastTalkedToBy}, {"lasttargetedby", GameScript::LastTargetedBy}, {"lasttrigger", GameScript::LastTrigger}, + {"leaderof", GameScript::LeaderOf}, {"leastdamagedof", GameScript::LeastDamagedOf}, {"mostdamagedof", GameScript::MostDamagedOf}, {"myself", GameScript::Myself}, @@ -2054,6 +2063,24 @@ return parameters; } +Targets *GameScript::LeaderOf(Scriptable *Sender, Targets *parameters) +{ + Actor *actor = (Actor *) parameters->GetTarget(0, ST_ACTOR); + if (!actor) { + if (Sender->Type==ST_ACTOR) { + actor = (Actor *) Sender; + } + } + parameters->Clear(); + if (actor) { + Actor *target = actor->GetCurrentArea()->GetActorByGlobalID(actor->LastFollowed); + if (target) { + parameters->AddTarget(target, 0, 0); + } + } + return parameters; +} + Targets *GameScript::LastTalkedToBy(Scriptable *Sender, Targets *parameters) { Actor *actor = (Actor *) parameters->GetTarget(0, ST_ACTOR); Modified: gemrb/trunk/gemrb/plugins/Core/GameScript.h =================================================================== --- gemrb/trunk/gemrb/plugins/Core/GameScript.h 2007-02-28 19:01:36 UTC (rev 4509) +++ gemrb/trunk/gemrb/plugins/Core/GameScript.h 2007-02-28 19:02:52 UTC (rev 4510) @@ -998,6 +998,10 @@ static void ClearAllActions(Scriptable* Sender, Action* parameters); static void ClearPartyEffects(Scriptable* Sender, Action* parameters); static void ClearSpriteEffects(Scriptable* Sender, Action* parameters); + static void ClickLButtonObject(Scriptable* Sender, Action* parameters); + static void ClickLButtonPoint(Scriptable* Sender, Action* parameters); + static void ClickRButtonObject(Scriptable* Sender, Action* parameters); + static void ClickRButtonPoint(Scriptable* Sender, Action* parameters); static void CloseDoor(Scriptable* Sender, Action* parameters); static void ContainerEnable(Scriptable* Sender, Action* parameters); static void Continue(Scriptable* Sender, Action* parameters); @@ -1047,6 +1051,11 @@ static void DisplayStringNoName(Scriptable* Sender, Action* parameters); static void DisplayStringNoNameHead(Scriptable* Sender, Action* parameters); static void DisplayStringWait(Scriptable* Sender, Action* parameters); + static void DoubleClickLButtonObject(Scriptable* Sender, Action* parameters); + static void DoubleClickLButtonPoint(Scriptable* Sender, Action* parameters); + static void DoubleClickRButtonObject(Scriptable* Sender, Action* parameters); + static void DoubleClickRButtonPoint(Scriptable* Sender, Action* parameters); + static void DropInventory(Scriptable* Sender, Action* parameters); static void DropInventoryEX(Scriptable* Sender, Action* parameters); static void DropItem(Scriptable* Sender, Action* parameters); @@ -1392,6 +1401,7 @@ static Targets *LastTalkedToBy(Scriptable *Sender, Targets *parameters); static Targets *LastTargetedBy(Scriptable *Sender, Targets *parameters); static Targets *LastTrigger(Scriptable *Sender, Targets *parameters); + static Targets *LeaderOf(Scriptable *Sender, Targets *parameters); static Targets *LeastDamagedOf(Scriptable *Sender, Targets *parameters); static Targets *MostDamagedOf(Scriptable *Sender, Targets *parameters); static Targets *Myself(Scriptable *Sender, Targets *parameters); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ave...@us...> - 2007-02-28 20:07:23
|
Revision: 4511 http://gemrb.svn.sourceforge.net/gemrb/?rev=4511&view=rev Author: avenger_teambg Date: 2007-02-28 12:07:21 -0800 (Wed, 28 Feb 2007) Log Message: ----------- Added SetLastMarkedObject trigger and MoveToObjectUntilSee action 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/Triggers.cpp Modified: gemrb/trunk/gemrb/plugins/Core/Actions.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/Core/Actions.cpp 2007-02-28 19:02:52 UTC (rev 4510) +++ gemrb/trunk/gemrb/plugins/Core/Actions.cpp 2007-02-28 20:07:21 UTC (rev 4511) @@ -1071,19 +1071,24 @@ void GameScript::MoveToObjectNoInterrupt(Scriptable* Sender, Action* parameters) { - MoveToObjectCore(Sender, parameters, IF_NOINT); + MoveToObjectCore(Sender, parameters, IF_NOINT, false); } void GameScript::RunToObject(Scriptable* Sender, Action* parameters) { - MoveToObjectCore(Sender, parameters, IF_RUNNING); + MoveToObjectCore(Sender, parameters, IF_RUNNING, false); } void GameScript::MoveToObject(Scriptable* Sender, Action* parameters) { - MoveToObjectCore(Sender, parameters, 0); + MoveToObjectCore(Sender, parameters, 0, false); } +void GameScript::MoveToObjectUntilSee(Scriptable* Sender, Action* parameters) +{ + MoveToObjectCore(Sender, parameters, 0, true); +} + void GameScript::MoveToObjectFollow(Scriptable* Sender, Action* parameters) { if (Sender->Type != ST_ACTOR) { Modified: gemrb/trunk/gemrb/plugins/Core/GSUtils.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/Core/GSUtils.cpp 2007-02-28 19:02:52 UTC (rev 4510) +++ gemrb/trunk/gemrb/plugins/Core/GSUtils.cpp 2007-02-28 20:07:21 UTC (rev 4511) @@ -1014,7 +1014,8 @@ gc->SetScreenFlags(SF_CENTERONACTOR,BM_OR); } -void MoveToObjectCore(Scriptable *Sender, Action *parameters, ieDword flags) +//repeat movement, if goal isn't reached +void MoveToObjectCore(Scriptable *Sender, Action *parameters, ieDword flags, bool untilsee) { if (Sender->Type != ST_ACTOR) { Sender->ReleaseCurrentAction(); @@ -1026,6 +1027,15 @@ return; } Actor* actor = ( Actor* ) Sender; + if (untilsee && CanSee(actor, target, true, 0) ) { + Sender->ReleaseCurrentAction(); + return; + } else { + if (PersonalDistance(actor, target)<MAX_OPERATING_DISTANCE) { + Sender->ReleaseCurrentAction(); + return; + } + } actor->WalkTo( target->Pos, flags, 0 ); } Modified: gemrb/trunk/gemrb/plugins/Core/GSUtils.h =================================================================== --- gemrb/trunk/gemrb/plugins/Core/GSUtils.h 2007-02-28 19:02:52 UTC (rev 4510) +++ gemrb/trunk/gemrb/plugins/Core/GSUtils.h 2007-02-28 20:07:21 UTC (rev 4511) @@ -57,7 +57,7 @@ Scriptable* GetActorFromObject(Scriptable* Sender, Object* oC, int ga_flags = 0); int SeeCore(Scriptable* Sender, Trigger* parameters, int justlos); int MoveItemCore(Scriptable *Sender, Scriptable *target, const char *resref, int flags); -void MoveToObjectCore(Scriptable *Sender, Action *parameters, ieDword flags); +void MoveToObjectCore(Scriptable *Sender, Action *parameters, ieDword flags, bool untilsee); void CreateItemCore(CREItem *item, const char *resref, int a, int b, int c); void AttackCore(Scriptable *Sender, Scriptable *target, Action *parameters, int flags); void InitScriptTables(); Modified: gemrb/trunk/gemrb/plugins/Core/GameScript.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/Core/GameScript.cpp 2007-02-28 19:02:52 UTC (rev 4510) +++ gemrb/trunk/gemrb/plugins/Core/GameScript.cpp 2007-02-28 20:07:21 UTC (rev 4511) @@ -319,6 +319,7 @@ {"school", GameScript::School, 0}, //similar to kit {"see", GameScript::See, 0}, {"sequence", GameScript::Sequence, 0}, + {"setlastmarkedobject", GameScript::SetLastMarkedObject, 0}, {"specifics", GameScript::Specifics, 0}, {"statecheck", GameScript::StateCheck, 0}, {"stealfailed", GameScript::StealFailed, 0}, @@ -628,6 +629,7 @@ {"movetoobject", GameScript::MoveToObject,AF_BLOCKING}, {"movetoobjectfollow", GameScript::MoveToObjectFollow,AF_BLOCKING}, {"movetoobjectnointerrupt", GameScript::MoveToObjectNoInterrupt,AF_BLOCKING}, + {"movetoobjectuntilsee", GameScript::MoveToObjectUntilSee,AF_BLOCKING}, {"movetooffset", GameScript::MoveToOffset,AF_BLOCKING}, {"movetopoint", GameScript::MoveToPoint,AF_BLOCKING}, {"movetopointnointerrupt", GameScript::MoveToPointNoInterrupt,AF_BLOCKING}, Modified: gemrb/trunk/gemrb/plugins/Core/GameScript.h =================================================================== --- gemrb/trunk/gemrb/plugins/Core/GameScript.h 2007-02-28 19:02:52 UTC (rev 4510) +++ gemrb/trunk/gemrb/plugins/Core/GameScript.h 2007-02-28 20:07:21 UTC (rev 4511) @@ -902,6 +902,7 @@ static int School(Scriptable* Sender, Trigger* parameters); static int See(Scriptable* Sender, Trigger* parameters); static int Sequence(Scriptable* Sender, Trigger* parameters); + static int SetLastMarkedObject(Scriptable* Sender, Trigger* parameters); static int Specifics(Scriptable* Sender, Trigger* parameters); static int StateCheck(Scriptable* Sender, Trigger* parameters); static int StealFailed(Scriptable* Sender, Trigger* parameters); @@ -1174,6 +1175,7 @@ static void MoveToObject(Scriptable* Sender, Action* parameters); static void MoveToObjectFollow(Scriptable* Sender, Action* parameters); static void MoveToObjectNoInterrupt(Scriptable* Sender, Action* parameters); + static void MoveToObjectUntilSee(Scriptable* Sender, Action* parameters); static void MoveToOffset(Scriptable* Sender, Action* parameters); static void MoveToPoint(Scriptable* Sender, Action* parameters); static void MoveToPointNoInterrupt(Scriptable* Sender, Action* parameters); Modified: gemrb/trunk/gemrb/plugins/Core/Triggers.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/Core/Triggers.cpp 2007-02-28 19:02:52 UTC (rev 4510) +++ gemrb/trunk/gemrb/plugins/Core/Triggers.cpp 2007-02-28 20:07:21 UTC (rev 4511) @@ -2020,6 +2020,24 @@ return 0; } +/* i believe this trigger is the same as 'MarkObject' action + except that if it cannot set the marked object, it returns false */ +int GameScript::SetLastMarkedObject(Scriptable* Sender, Trigger* parameters) +{ + if (Sender->Type != ST_ACTOR) { + return 0; + } + Actor *scr = (Actor *) Sender; + + Scriptable* tar = GetActorFromObject( Sender, parameters->objectParameter ); + if (!tar || tar->Type != ST_ACTOR) { + return 0; + } + Actor* actor = ( Actor* ) tar; + scr->LastMarked = actor->GetID(); + return 1; +} + int GameScript::See(Scriptable* Sender, Trigger* parameters) { int see = SeeCore(Sender, parameters, 0); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <wjp...@us...> - 2007-03-02 21:57:41
|
Revision: 4520 http://gemrb.svn.sourceforge.net/gemrb/?rev=4520&view=rev Author: wjpalenstijn Date: 2007-03-02 13:57:36 -0800 (Fri, 02 Mar 2007) Log Message: ----------- randomly choose attack animation Modified Paths: -------------- gemrb/trunk/gemrb/plugins/Core/Actor.cpp gemrb/trunk/gemrb/plugins/Core/Actor.h gemrb/trunk/gemrb/plugins/Core/ActorBlock.cpp gemrb/trunk/gemrb/plugins/Core/ActorBlock.h gemrb/trunk/gemrb/plugins/Core/CharAnimations.cpp gemrb/trunk/gemrb/plugins/Core/CharAnimations.h Modified: gemrb/trunk/gemrb/plugins/Core/Actor.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/Core/Actor.cpp 2007-03-02 21:54:21 UTC (rev 4519) +++ gemrb/trunk/gemrb/plugins/Core/Actor.cpp 2007-03-02 21:57:36 UTC (rev 4520) @@ -189,9 +189,6 @@ ShieldRef[0]=0; HelmetRef[0]=0; WeaponRef[0]=0; - AttackMovements[0]=100; - AttackMovements[1]=0; - AttackMovements[2]=0; for (i = 0; i < EXTRA_ACTORCOVERS; ++i) extraCovers[i] = NULL; @@ -337,7 +334,6 @@ anims->SetOffhandRef(ShieldRef); anims->SetHelmetRef(HelmetRef); anims->SetWeaponRef(WeaponRef); - anims->SetAttackMoveChances(AttackMovements); //if we have a recovery palette, then set it back assert(anims->palette[PAL_MAIN] == 0); @@ -2709,12 +2705,12 @@ CharAnimations* ca = GetAnims(); int StanceID = GetStance(); - int x = rand()%1000; if (ca->autoSwitchOnEnd) { SetStance( ca->nextStanceID ); ca->autoSwitchOnEnd = false; return true; } + int x = rand()%1000; if ((StanceID==IE_ANI_AWAKE) && !x ) { SetStance( IE_ANI_HEAD_TURN ); return true; @@ -2723,6 +2719,12 @@ SetStance( IE_ANI_AWAKE ); return true; } + if (StanceID == IE_ANI_ATTACK || StanceID == IE_ANI_ATTACK_JAB || + StanceID == IE_ANI_ATTACK_SLASH || StanceID == IE_ANI_ATTACK_BACKSLASH) + { + SetStance( IE_ANI_ATTACK ); + return true; + } return false; } @@ -3043,13 +3045,12 @@ void Actor::SetUsedWeapon(char* AnimationType, ieWord* MeleeAnimation, int wt) { memcpy(WeaponRef, AnimationType, sizeof(WeaponRef) ); - memcpy(AttackMovements, MeleeAnimation, sizeof(AttackMovements) ); if (wt != -1) WeaponType = wt; if (!anims) return; anims->SetWeaponRef(AnimationType); anims->SetWeaponType(WeaponType); - anims->SetAttackMoveChances(MeleeAnimation); + SetAttackMoveChances(MeleeAnimation); } void Actor::SetUsedShield(char* AnimationType, int wt) Modified: gemrb/trunk/gemrb/plugins/Core/Actor.h =================================================================== --- gemrb/trunk/gemrb/plugins/Core/Actor.h 2007-03-02 21:54:21 UTC (rev 4519) +++ gemrb/trunk/gemrb/plugins/Core/Actor.h 2007-03-02 21:57:36 UTC (rev 4520) @@ -156,7 +156,6 @@ ieDword LastMarked; // no idea if non-actors could mark objects ieDword LastHeard; ieDword HotKey; - ieWord AttackMovements[3]; char ShieldRef[2]; char HelmetRef[2]; char WeaponRef[2]; Modified: gemrb/trunk/gemrb/plugins/Core/ActorBlock.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/Core/ActorBlock.cpp 2007-03-02 21:54:21 UTC (rev 4519) +++ gemrb/trunk/gemrb/plugins/Core/ActorBlock.cpp 2007-03-02 21:57:36 UTC (rev 4520) @@ -666,6 +666,9 @@ timeStartStep = 0; lastFrame = NULL; Area[0] = 0; + AttackMovements[0] = 100; + AttackMovements[1] = 0; + AttackMovements[2] = 0; } Movable::~Movable(void) @@ -718,12 +721,35 @@ { if (arg<MAX_ANIMS) { StanceID=(unsigned char) arg; + + if (StanceID == IE_ANI_ATTACK) { + // Set stance to a random attack animation + + int random = rand()%100; + if (random < AttackMovements[0]) { + StanceID = IE_ANI_ATTACK_BACKSLASH; + } else if (random < AttackMovements[0] + AttackMovements[1]) { + StanceID = IE_ANI_ATTACK_SLASH; + } else { + StanceID = IE_ANI_ATTACK_JAB; + } + } + } else { StanceID=IE_ANI_AWAKE; // printf("Tried to set invalid stance id (%u)\n", arg); } } +void Movable::SetAttackMoveChances(ieWord *amc) +{ + AttackMovements[0]=amc[0]; + AttackMovements[1]=amc[1]; + AttackMovements[2]=amc[2]; +} + + + //this could be used for WingBuffet as well void Movable::MoveLine(int steps, int Pass, ieDword orient) { Modified: gemrb/trunk/gemrb/plugins/Core/ActorBlock.h =================================================================== --- gemrb/trunk/gemrb/plugins/Core/ActorBlock.h 2007-03-02 21:54:21 UTC (rev 4519) +++ gemrb/trunk/gemrb/plugins/Core/ActorBlock.h 2007-03-02 21:57:36 UTC (rev 4520) @@ -303,6 +303,8 @@ private: //these seem to be sensitive, so get protection unsigned char StanceID; unsigned char Orientation, NewOrientation; + ieWord AttackMovements[3]; + PathNode* path; //whole path PathNode* step; //actual step public: @@ -353,6 +355,7 @@ } void SetStance(unsigned int arg); + void SetAttackMoveChances(ieWord *amc); void DoStep(unsigned int walk_speed); void AddWayPoint(Point &Des); void RunAwayFrom(Point &Des, int PathLength, int flags); Modified: gemrb/trunk/gemrb/plugins/Core/CharAnimations.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/Core/CharAnimations.cpp 2007-03-02 21:54:21 UTC (rev 4519) +++ gemrb/trunk/gemrb/plugins/Core/CharAnimations.cpp 2007-03-02 21:57:36 UTC (rev 4520) @@ -177,13 +177,6 @@ } } -void CharAnimations::SetAttackMoveChances(ieWord *amc) -{ - AttackMoves[0]=amc[0]; - AttackMoves[1]=amc[1]; - AttackMoves[2]=amc[2]; -} - void CharAnimations::SetHelmetRef(const char* ref) { HelmetRef[0] = ref[0]; @@ -1013,6 +1006,9 @@ switch (StanceID) { case IE_ANI_ATTACK: + case IE_ANI_ATTACK_SLASH: + case IE_ANI_ATTACK_JAB: + case IE_ANI_ATTACK_BACKSLASH: Cycle=SixteenToFive[Orient]; Prefix="at1"; break; case IE_ANI_DAMAGE: @@ -1234,8 +1230,6 @@ EquipData = new EquipResRefData; EquipData->Suffix[0] = 0; switch (StanceID) { - //Attack is a special case... it takes cycles randomly - //based on the weapon type (TODO) case IE_ANI_ATTACK: case IE_ANI_ATTACK_SLASH: strcat( ResRef, SlashPrefix[WeaponType] ); @@ -1429,9 +1423,6 @@ Orient /= 2; switch (StanceID) { - //Attack is a special case... it cycles randomly - //through SLASH, BACKSLASH and JAB so we will choose - //which animation return randomly case IE_ANI_READY: case IE_ANI_CAST: case IE_ANI_CONJURE: @@ -1485,9 +1476,6 @@ EquipData->Suffix[0] = 0; switch (StanceID) { - //Attack is a special case... it cycles randomly - //through SLASH, BACKSLASH and JAB so we will choose - //which animation return randomly case IE_ANI_ATTACK: case IE_ANI_ATTACK_SLASH: strcat (ResRef, SlashPrefix[WeaponType]); @@ -1806,9 +1794,6 @@ unsigned char& Cycle, unsigned char Orient) { switch (StanceID) { - //Attack is a special case... it cycles randomly - //through SLASH, BACKSLASH and JAB so we will choose - //which animation return randomly case IE_ANI_ATTACK: case IE_ANI_ATTACK_SLASH: case IE_ANI_ATTACK_BACKSLASH: Modified: gemrb/trunk/gemrb/plugins/Core/CharAnimations.h =================================================================== --- gemrb/trunk/gemrb/plugins/Core/CharAnimations.h 2007-03-02 21:54:21 UTC (rev 4519) +++ gemrb/trunk/gemrb/plugins/Core/CharAnimations.h 2007-03-02 21:57:36 UTC (rev 4520) @@ -136,7 +136,6 @@ Palette* modifiedPalette[4]; unsigned int AvatarsRowNum; unsigned char ArmorType, WeaponType, RangedType; - ieDword AttackMoves[3]; //percentages for the 3 attack move types ieResRef ResRef; ieResRef PaletteResRef; unsigned char nextStanceID; @@ -148,7 +147,6 @@ static void ReleaseMemory(); void SetArmourLevel(int ArmourLevel); void SetWeaponType(int WeaponType); - void SetAttackMoveChances(ieWord *amc); void SetHelmetRef(const char* ref); void SetWeaponRef(const char* ref); void SetOffhandRef(const char* ref); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ave...@us...> - 2007-03-03 19:12:45
|
Revision: 4529 http://gemrb.svn.sourceforge.net/gemrb/?rev=4529&view=rev Author: avenger_teambg Date: 2007-03-03 11:12:41 -0800 (Sat, 03 Mar 2007) Log Message: ----------- used items go away (todo: check charges, removal sound, etc) Modified Paths: -------------- gemrb/trunk/gemrb/plugins/Core/Actor.cpp gemrb/trunk/gemrb/plugins/Core/Inventory.cpp Modified: gemrb/trunk/gemrb/plugins/Core/Actor.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/Core/Actor.cpp 2007-03-03 19:09:19 UTC (rev 4528) +++ gemrb/trunk/gemrb/plugins/Core/Actor.cpp 2007-03-03 19:12:41 UTC (rev 4529) @@ -3010,6 +3010,7 @@ } // core->FreeItem(itm,item->ItemResRef, false); + inventory.BreakItemSlot(slot); return true; } @@ -3031,6 +3032,7 @@ } // core->FreeItem(itm,item->ItemResRef, false); + inventory.BreakItemSlot(slot); return true; } Modified: gemrb/trunk/gemrb/plugins/Core/Inventory.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/Core/Inventory.cpp 2007-03-03 19:09:19 UTC (rev 4528) +++ gemrb/trunk/gemrb/plugins/Core/Inventory.cpp 2007-03-03 19:12:41 UTC (rev 4529) @@ -1155,6 +1155,8 @@ if (core->ResolveRandomItem(TmpItem) &&core->Exists(TmpItem->ItemResRef, IE_ITM_CLASS_ID)) { SetSlotItem( TmpItem, SlotID ); } else { + //if the item isn't creatable, we still destroy the old item + KillSlot( SlotID ); delete TmpItem; } CalculateWeight(); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ave...@us...> - 2007-03-11 12:47:29
|
Revision: 4540 http://gemrb.svn.sourceforge.net/gemrb/?rev=4540&view=rev Author: avenger_teambg Date: 2007-03-11 05:47:24 -0700 (Sun, 11 Mar 2007) Log Message: ----------- fixed bugs with timing method and resistance type removed unused SavingThrow method from Core Modified Paths: -------------- gemrb/trunk/gemrb/plugins/Core/Effect.h gemrb/trunk/gemrb/plugins/Core/EffectQueue.cpp gemrb/trunk/gemrb/plugins/Core/Interface.cpp gemrb/trunk/gemrb/plugins/Core/Interface.h Modified: gemrb/trunk/gemrb/plugins/Core/Effect.h =================================================================== --- gemrb/trunk/gemrb/plugins/Core/Effect.h 2007-03-11 12:44:46 UTC (rev 4539) +++ gemrb/trunk/gemrb/plugins/Core/Effect.h 2007-03-11 12:47:24 UTC (rev 4540) @@ -60,10 +60,11 @@ // Effect resistance types #define FX_NO_RESIST_NO_DISPEL 0 -#define FX_CAN_RESIST_CAN_DISPEL 1 +#define FX_NO_RESIST_CAN_DISPEL 1 #define FX_CAN_RESIST_NO_DISPEL 2 -#define FX_NO_RESIST_CAN_DISPEL 3 +#define FX_CAN_RESIST_CAN_DISPEL 3 #define FX_CAN_DISPEL 1 +#define FX_CAN_RESIST 2 /** * @class Effect Modified: gemrb/trunk/gemrb/plugins/Core/EffectQueue.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/Core/EffectQueue.cpp 2007-03-11 12:44:46 UTC (rev 4539) +++ gemrb/trunk/gemrb/plugins/Core/EffectQueue.cpp 2007-03-11 12:47:24 UTC (rev 4540) @@ -593,9 +593,15 @@ } //effect triggered fx->TimingMode=TriggeredEffect((ieByte) fx->TimingMode); + //delayed duration (3) + if (NeedPrepare((ieByte) fx->TimingMode) ) { + //prepare for delayed duration effects + fx->Duration=fx->SecondaryDelay; + PrepareDuration(fx); + } break; case DURATION: - if (fx->Duration>GameTime) { + if (fx->Duration<=GameTime) { fx->TimingMode=FX_DURATION_JUST_EXPIRED; //add a return here, if 0 duration effects shouldn't work } @@ -646,12 +652,6 @@ //effect not found, it is going to be discarded fx->TimingMode=FX_DURATION_JUST_EXPIRED; } - //delayed duration (3) - if (NeedPrepare((ieByte) fx->TimingMode) ) { - //prepare for delayed duration effects - fx->Duration=fx->SecondaryDelay; - PrepareDuration(fx); - } return flg; } Modified: gemrb/trunk/gemrb/plugins/Core/Interface.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/Core/Interface.cpp 2007-03-11 12:44:46 UTC (rev 4539) +++ gemrb/trunk/gemrb/plugins/Core/Interface.cpp 2007-03-11 12:47:24 UTC (rev 4540) @@ -3407,13 +3407,6 @@ return add; } -bool Interface::SavingThrow(int Save, int Bonus) -{ - int roll = Roll(1, 20, 0); - // FIXME: this is 2e saving throw, it's probably different in iwd2 - return (roll > 1) && (roll + Bonus >= Save); -} - static char bmp_suffix[6]="M.BMP"; static char png_suffix[6]="M.PNG"; Modified: gemrb/trunk/gemrb/plugins/Core/Interface.h =================================================================== --- gemrb/trunk/gemrb/plugins/Core/Interface.h 2007-03-11 12:44:46 UTC (rev 4539) +++ gemrb/trunk/gemrb/plugins/Core/Interface.h 2007-03-11 12:47:24 UTC (rev 4540) @@ -447,8 +447,6 @@ int PlayMovie(const char * ResRef); /** Generates traditional random number xdy+z */ int Roll(int dice, int size, int add); - /** Returns true on successful saving throw */ - bool SavingThrow(int Save, int Bonus); /** Loads a Game Compiled Script */ int LoadScript(const char * ResRef); /** Enables/Disables the CutScene Mode */ This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ave...@us...> - 2007-03-11 23:23:04
|
Revision: 4547 http://gemrb.svn.sourceforge.net/gemrb/?rev=4547&view=rev Author: avenger_teambg Date: 2007-03-11 16:23:05 -0700 (Sun, 11 Mar 2007) Log Message: ----------- added handling of defend action (gamescript action still should handle the target) Modified Paths: -------------- gemrb/trunk/gemrb/plugins/Core/GameControl.cpp gemrb/trunk/gemrb/plugins/Core/GameControl.h Modified: gemrb/trunk/gemrb/plugins/Core/GameControl.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/Core/GameControl.cpp 2007-03-11 23:20:14 UTC (rev 4546) +++ gemrb/trunk/gemrb/plugins/Core/GameControl.cpp 2007-03-11 23:23:05 UTC (rev 4547) @@ -876,6 +876,8 @@ nextCursor = IE_CURSOR_ATTACK; } else if (target_mode & TARGET_MODE_CAST) { nextCursor = IE_CURSOR_CAST; + } else if (target_mode & TARGET_MODE_DEFEND) { + nextCursor = IE_CURSOR_DEFEND; } @@ -930,6 +932,23 @@ targetID = tmp; } +void GameControl::TryToDefend(Actor *source, Actor *tgt) +{ + char Tmp[40]; + ieWord tmp; + + //this won't work atm, target must be honoured by Attack + source->ClearPath(); + source->ClearActions(); + strncpy(Tmp,"ProtectObject()",sizeof(Tmp) ); + tmp = targetID; + targetID=tgt->globalID; //this is a hack, not deadly, but a hack + source->AddAction( GenerateAction( Tmp) ); + //we restore the old target ID, because this variable is primarily + //to keep track of the target of a dialog, and attacking isn't talking + targetID = tmp; +} + void GameControl::TryToTalk(Actor *source, Actor *tgt) { char Tmp[40]; @@ -1156,6 +1175,8 @@ type = 1; } else if (target_mode&TARGET_MODE_CAST) { type = 3; + } else if (target_mode&TARGET_MODE_DEFEND) { + type = 4; } target_mode = TARGET_MODE_NONE; @@ -1188,6 +1209,11 @@ break; case 3: //cast on target break; + case 4: + for(i=0;i<game->selected.size();i++) { + TryToDefend(game->selected[i], actor); + } + } } /** Special Key Press */ Modified: gemrb/trunk/gemrb/plugins/Core/GameControl.h =================================================================== --- gemrb/trunk/gemrb/plugins/Core/GameControl.h 2007-03-11 23:20:14 UTC (rev 4546) +++ gemrb/trunk/gemrb/plugins/Core/GameControl.h 2007-03-11 23:23:05 UTC (rev 4547) @@ -72,6 +72,7 @@ #define TARGET_MODE_TALK 0x01 #define TARGET_MODE_ATTACK 0x02 #define TARGET_MODE_CAST 0x04 +#define TARGET_MODE_DEFEND 0x08 #define TARGET_MODE_ALLY 0x10 #define TARGET_MODE_ENEMY 0x20 @@ -170,6 +171,7 @@ int HideGUI(); int UnhideGUI(); void TryToAttack(Actor *source, Actor *target); + void TryToDefend(Actor *source, Actor *target); void TryToTalk(Actor *source, Actor *target); void HandleContainer(Container *container, Actor *actor); void HandleDoor(Door *door, Actor *actor); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ave...@us...> - 2007-03-11 23:41:43
|
Revision: 4548 http://gemrb.svn.sourceforge.net/gemrb/?rev=4548&view=rev Author: avenger_teambg Date: 2007-03-11 16:41:43 -0700 (Sun, 11 Mar 2007) Log Message: ----------- defend translates to ProtectObject,which still need some work Modified Paths: -------------- gemrb/trunk/gemrb/plugins/Core/Actions.cpp gemrb/trunk/gemrb/plugins/Core/GameControl.cpp gemrb/trunk/gemrb/plugins/Core/GameScript.cpp Modified: gemrb/trunk/gemrb/plugins/Core/Actions.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/Core/Actions.cpp 2007-03-11 23:23:05 UTC (rev 4547) +++ gemrb/trunk/gemrb/plugins/Core/Actions.cpp 2007-03-11 23:41:43 UTC (rev 4548) @@ -5304,6 +5304,7 @@ //not exactly range scr->FollowOffset.x = parameters->int0Parameter; scr->FollowOffset.y = parameters->int0Parameter; + scr->WalkTo( tar->Pos, 0, MAX_OPERATING_DISTANCE ); } //keeps following the object in formation Modified: gemrb/trunk/gemrb/plugins/Core/GameControl.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/Core/GameControl.cpp 2007-03-11 23:23:05 UTC (rev 4547) +++ gemrb/trunk/gemrb/plugins/Core/GameControl.cpp 2007-03-11 23:41:43 UTC (rev 4548) @@ -920,7 +920,6 @@ char Tmp[40]; ieWord tmp; - //this won't work atm, target must be honoured by Attack source->ClearPath(); source->ClearActions(); strncpy(Tmp,"NIDSpecial3()",sizeof(Tmp) ); @@ -937,10 +936,9 @@ char Tmp[40]; ieWord tmp; - //this won't work atm, target must be honoured by Attack source->ClearPath(); source->ClearActions(); - strncpy(Tmp,"ProtectObject()",sizeof(Tmp) ); + strncpy(Tmp,"NIDSpecial4()",sizeof(Tmp) ); tmp = targetID; targetID=tgt->globalID; //this is a hack, not deadly, but a hack source->AddAction( GenerateAction( Tmp) ); Modified: gemrb/trunk/gemrb/plugins/Core/GameScript.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/Core/GameScript.cpp 2007-03-11 23:23:05 UTC (rev 4547) +++ gemrb/trunk/gemrb/plugins/Core/GameScript.cpp 2007-03-11 23:41:43 UTC (rev 4548) @@ -646,6 +646,7 @@ {"nidspecial1", GameScript::NIDSpecial1,AF_BLOCKING},//we use this for dialogs, hack {"nidspecial2", GameScript::NIDSpecial2,AF_BLOCKING},//we use this for worldmap, another hack {"nidspecial3", GameScript::Attack,AF_BLOCKING|AF_DIRECT},//this hack is for attacking preset target + {"nidspecial4", GameScript::ProtectObject,AF_BLOCKING|AF_DIRECT}, {"noaction", GameScript::NoAction, 0}, {"opendoor", GameScript::OpenDoor,AF_BLOCKING}, {"panic", GameScript::Panic, 0}, This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ave...@us...> - 2007-03-12 16:34:17
|
Revision: 4550 http://gemrb.svn.sourceforge.net/gemrb/?rev=4550&view=rev Author: avenger_teambg Date: 2007-03-12 09:34:13 -0700 (Mon, 12 Mar 2007) Log Message: ----------- Items are now creating projectiles instead of applying the effects instantly Map: rendering projectiles Modified Paths: -------------- gemrb/trunk/gemrb/plugins/Core/Actions.cpp gemrb/trunk/gemrb/plugins/Core/Actor.cpp gemrb/trunk/gemrb/plugins/Core/Actor.h gemrb/trunk/gemrb/plugins/Core/Item.cpp gemrb/trunk/gemrb/plugins/Core/Item.h gemrb/trunk/gemrb/plugins/Core/Map.cpp gemrb/trunk/gemrb/plugins/Core/Map.h gemrb/trunk/gemrb/plugins/Core/Projectile.cpp gemrb/trunk/gemrb/plugins/Core/Projectile.h gemrb/trunk/gemrb/plugins/Core/ProjectileServer.cpp gemrb/trunk/gemrb/plugins/Core/ProjectileServer.h Modified: gemrb/trunk/gemrb/plugins/Core/Actions.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/Core/Actions.cpp 2007-03-12 15:46:45 UTC (rev 4549) +++ gemrb/trunk/gemrb/plugins/Core/Actions.cpp 2007-03-12 16:34:13 UTC (rev 4550) @@ -5102,7 +5102,7 @@ //this is actually not in the original game code header = parameters->int1Parameter; } - scr->UseItemPoint(Slot, header, parameters->pointParameter); + scr->UseItemPoint(Slot, header, parameters->pointParameter, false); } //addfeat will be able to remove feats too Modified: gemrb/trunk/gemrb/plugins/Core/Actor.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/Core/Actor.cpp 2007-03-12 15:46:45 UTC (rev 4549) +++ gemrb/trunk/gemrb/plugins/Core/Actor.cpp 2007-03-12 16:34:13 UTC (rev 4550) @@ -28,6 +28,7 @@ #include "../../includes/strrefs.h" #include "Item.h" #include "Spell.h" +#include "Projectile.h" #include "Game.h" #include "GameScript.h" #include "ScriptEngine.h" @@ -2993,7 +2994,10 @@ return STR_MAGICWEAPON; } -bool Actor::UseItemPoint(int slot, ieDword header, Point &target) +//if target is a non living scriptable, then we simply shoot for its position +//the fx should get a NULL target, and handle itself by using the position +//(shouldn't crash when target is NULL) +bool Actor::UseItemPoint(int slot, ieDword header, Point &target, bool silent) { CREItem *item = inventory.GetSlotItem(slot); if (!item) @@ -3004,8 +3008,11 @@ return false; } + Projectile *pro = itm->GetProjectile(header); + GetCurrentArea()->AddProjectile(pro, Pos, target); //in fact this should build a projectile and hurl it at the target //this is just a temporary solution + /* EffectQueue *fx = itm->GetEffectBlock(header); if (!fx) return false; @@ -3014,14 +3021,20 @@ fx->SetOwner(this); fx->AddAllEffects(tar); } + */ // - ChargeItem(slot, header, item, itm, false); + ChargeItem(slot, header, item, itm, silent); core->FreeItem(itm,item->ItemResRef, false); return true; } bool Actor::UseItem(int slot, ieDword header, Scriptable* target, bool silent) { + if (target->Type!=ST_ACTOR) { + return UseItemPoint(slot, header, target->Pos, silent); + } + + Actor *tar = (Actor *) target; CREItem *item = inventory.GetSlotItem(slot); if (!item) return false; @@ -3030,17 +3043,19 @@ if ((header<CHARGE_COUNTERS) && !item->Usages[header]) { return false; } + Projectile *pro = itm->GetProjectile(header); + if (pro) { + GetCurrentArea()->AddProjectile(pro, Pos, tar->globalID); + } //in fact this should build a projectile and hurl it at the target //this is just a temporary solution + /* EffectQueue *fx = itm->GetEffectBlock(header); if (!fx) return false; fx->SetOwner(this); - if (target->Type==ST_ACTOR) { - fx->AddAllEffects((Actor *) target); - } else { - //ABSOLUTELY NO IDEA YET, only a few effects work on non actors - } + fx->AddAllEffects(tar); + */ // ChargeItem(slot, header, item, itm, silent); core->FreeItem(itm,item->ItemResRef, false); Modified: gemrb/trunk/gemrb/plugins/Core/Actor.h =================================================================== --- gemrb/trunk/gemrb/plugins/Core/Actor.h 2007-03-12 15:46:45 UTC (rev 4549) +++ gemrb/trunk/gemrb/plugins/Core/Actor.h 2007-03-12 16:34:13 UTC (rev 4550) @@ -425,7 +425,7 @@ /* Sets equipped Quick slot */ int SetEquippedQuickSlot(int slot); /* Uses an item on the target or point */ - bool UseItemPoint(int slot, ieDword header, Point &point); + bool UseItemPoint(int slot, ieDword header, Point &point, bool silent); bool UseItem(int slot, ieDword header, Scriptable *target, bool silent); /* Deducts a charge from an item */ void ChargeItem(int slot, ieDword header, CREItem *item, Item *itm, bool silent); Modified: gemrb/trunk/gemrb/plugins/Core/Item.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/Core/Item.cpp 2007-03-12 15:46:45 UTC (rev 4549) +++ gemrb/trunk/gemrb/plugins/Core/Item.cpp 2007-03-12 16:34:13 UTC (rev 4550) @@ -21,6 +21,8 @@ #include "../../includes/win32def.h" #include "Item.h" +#include "Projectile.h" +#include "ProjectileServer.h" #include "Interface.h" ITMExtHeader::ITMExtHeader(void) @@ -121,3 +123,16 @@ return type; } +//returns a projectile loaded with the effect queue +Projectile *Item::GetProjectile(int header) const +{ + ITMExtHeader *eh = GetExtHeader(header); + if (!eh) { + return NULL; + } + EffectQueue *fx = GetEffectBlock(header); + Projectile *pro = core->GetProjectileServer()->GetProjectileByIndex(eh->ProjectileAnimation); + pro->SetEffects(fx); + return pro; +} + Modified: gemrb/trunk/gemrb/plugins/Core/Item.h =================================================================== --- gemrb/trunk/gemrb/plugins/Core/Item.h 2007-03-12 15:46:45 UTC (rev 4549) +++ gemrb/trunk/gemrb/plugins/Core/Item.h 2007-03-12 16:34:13 UTC (rev 4550) @@ -34,6 +34,8 @@ #include "AnimationMgr.h" #include "EffectQueue.h" +class Projectile; + #ifdef WIN32 #ifdef GEM_BUILD_DLL @@ -224,6 +226,8 @@ } //-1 will return the equipping feature block EffectQueue *GetEffectBlock(int usage) const; + //returns a projectile created from an extended header + Projectile *GetProjectile(int header) const; //returns the average damage of the weapon (doesn't check for special effects) int GetDamagePotential(bool ranged, ITMExtHeader *&header) const; //returns the weapon header Modified: gemrb/trunk/gemrb/plugins/Core/Map.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/Core/Map.cpp 2007-03-12 15:46:45 UTC (rev 4549) +++ gemrb/trunk/gemrb/plugins/Core/Map.cpp 2007-03-12 16:34:13 UTC (rev 4550) @@ -29,6 +29,7 @@ #include "SpriteCover.h" #include "TileMap.h" #include "ScriptedAnimation.h" +#include "Projectile.h" #include "ImageMgr.h" #include "Video.h" #include "ResourceMgr.h" @@ -96,7 +97,7 @@ PathFinderInited = false; } -inline static AnimationObjectType SelectObject(Actor *actor, AreaAnimation *a, ScriptedAnimation *sca, Particles *spark) +inline static AnimationObjectType SelectObject(Actor *actor, AreaAnimation *a, ScriptedAnimation *sca, Particles *spark, Projectile *pro) { int actorh; if (actor) { @@ -127,6 +128,15 @@ spah = 0x7fffffff; } + int proh; + if (pro) { + proh = pro->GetHeight(); + } else { + proh = 0x7fffffff; + } + + if (proh<actorh && proh<scah && proh<aah && proh<spah) return AOT_PROJECTILE; + if (spah<actorh && spah<scah && spah<aah) return AOT_SPARK; if (aah<actorh && aah<scah) return AOT_AREA; @@ -431,6 +441,12 @@ } } + proIterator pri; + + for (pri = projectiles.begin(); pri != projectiles.end(); pri++) { + delete (*pri); + } + scaIterator sci; for (sci = vvcCells.begin(); sci != vvcCells.end(); sci++) { @@ -809,6 +825,15 @@ } //doesn't increase iterator, because we might need to erase it from the list +Projectile *Map::GetNextProjectile(proIterator &iter) +{ + if (iter==projectiles.end()) { + return NULL; + } + return *iter; +} + +//doesn't increase iterator, because we might need to erase it from the list ScriptedAnimation *Map::GetNextScriptedAnimation(scaIterator &iter) { if (iter==vvcCells.end()) { @@ -860,14 +885,16 @@ Actor* actor = GetNextActor(q, index); aniIterator aniidx = animations.begin(); scaIterator scaidx = vvcCells.begin(); + proIterator proidx = projectiles.begin(); spaIterator spaidx = particles.begin(); AreaAnimation *a = GetNextAreaAnimation(aniidx, gametime); ScriptedAnimation *sca = GetNextScriptedAnimation(scaidx); + Projectile *pro = GetNextProjectile(proidx); Particles *spark = GetNextSpark(spaidx); - while (actor || a || sca || spark) { - switch(SelectObject(actor,a,sca,spark)) { + while (actor || a || sca || spark || pro) { + switch(SelectObject(actor,a,sca,spark,pro)) { case AOT_ACTOR: actor->Draw( screen ); actor = GetNextActor(q, index); @@ -909,6 +936,24 @@ } sca = GetNextScriptedAnimation(scaidx); break; + case AOT_PROJECTILE: + { + int drawn; + if (gametime>oldgametime) { + drawn = pro->Update(); + } else { + drawn = 1; + } + if (drawn) { + pro->Draw( screen ); + proidx++; + } else { + delete( pro ); + proidx = projectiles.erase(proidx); + } + } + pro = GetNextProjectile(proidx); + break; case AOT_SPARK: { int drawn; @@ -1450,8 +1495,10 @@ if (IsVisible(actor->Pos, false) && actor->Schedule(gametime) ) { priority = PR_SCRIPT; //run scripts and display, activated now actor->Unhide(); - if (actor->Modified[IE_EA]>=EA_EVILCUTOFF) { - core->Autopause(AP_ENEMY); + if (!(actor->GetInternalFlag()&IF_STOPATTACK)) { + if (actor->Modified[IE_EA]>=EA_EVILCUTOFF) { + core->Autopause(AP_ENEMY); + } } } else { priority = PR_IGNORE; @@ -1506,6 +1553,29 @@ } } +void Map::AddProjectile(Projectile* pro, Point &source, ieWord actorID) +{ + proIterator iter; + + pro->MoveTo(this,source); + pro->SetTarget(actorID); + int height = pro->GetHeight(); + for(iter=projectiles.begin();iter!=projectiles.end() && (*iter)->GetHeight()>height; iter++); + projectiles.insert(iter, pro); +} + +//adding projectile in order, based on its height parameter +void Map::AddProjectile(Projectile* pro, Point &source, Point &dest) +{ + proIterator iter; + + pro->MoveTo(this,source); + pro->SetTarget(dest); + int height = pro->GetHeight(); + for(iter=projectiles.begin();iter!=projectiles.end() && (*iter)->GetHeight()>height; iter++); + projectiles.insert(iter, pro); +} + //adding videocell in order, based on its height parameter void Map::AddVVCell(ScriptedAnimation* vvc) { Modified: gemrb/trunk/gemrb/plugins/Core/Map.h =================================================================== --- gemrb/trunk/gemrb/plugins/Core/Map.h 2007-03-12 15:46:45 UTC (rev 4549) +++ gemrb/trunk/gemrb/plugins/Core/Map.h 2007-03-12 16:34:13 UTC (rev 4550) @@ -39,6 +39,7 @@ class Animation; class Wall_Polygon; class Particles; +class Projectile; #ifdef WIN32 @@ -189,7 +190,7 @@ bool Schedule(ieDword gametime); }; -enum AnimationObjectType {AOT_AREA, AOT_SCRIPTED, AOT_ACTOR, AOT_SPARK}; +enum AnimationObjectType {AOT_AREA, AOT_SCRIPTED, AOT_ACTOR, AOT_SPARK, AOT_PROJECTILE}; //i believe we need only the active actors/visible inactive actors queues #define QUEUE_COUNT 2 @@ -201,6 +202,7 @@ typedef std::list<AreaAnimation*>::iterator aniIterator; typedef std::list<ScriptedAnimation*>::iterator scaIterator; +typedef std::list<Projectile*>::iterator proIterator; typedef std::list<Particles*>::iterator spaIterator; class GEM_EXPORT Map : public Scriptable { @@ -229,6 +231,7 @@ Wall_Polygon **Walls; unsigned int WallCount; std::list< ScriptedAnimation*> vvcCells; + std::list< Projectile*> projectiles; std::list< Particles*> particles; std::vector< Entrance*> entrances; std::vector< Ambient*> ambients; @@ -303,6 +306,8 @@ SongHeaderType SongHeader; RestHeaderType RestHeader; + void AddProjectile(Projectile* pro, Point &source, Point &dest); + void AddProjectile(Projectile* pro, Point &source, ieWord actorID); void AddVVCell(ScriptedAnimation* vvc); bool CanFree(); int GetCursor( Point &p); @@ -398,6 +403,7 @@ private: AreaAnimation *GetNextAreaAnimation(aniIterator &iter, ieDword gametime); Particles *GetNextSpark(spaIterator &iter); + Projectile *GetNextProjectile(proIterator &iter); ScriptedAnimation *GetNextScriptedAnimation(scaIterator &iter); Actor *GetNextActor(int &q, int &index); void DrawSearchMap(Region &screen); Modified: gemrb/trunk/gemrb/plugins/Core/Projectile.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/Core/Projectile.cpp 2007-03-12 15:46:45 UTC (rev 4549) +++ gemrb/trunk/gemrb/plugins/Core/Projectile.cpp 2007-03-12 16:34:13 UTC (rev 4550) @@ -26,6 +26,8 @@ #include "Interface.h" #include "Video.h" #include "Game.h" +#include "ResourceMgr.h" +#include "SoundMgr.h" extern Interface* core; #ifdef WIN32 @@ -34,8 +36,9 @@ Projectile::Projectile() { + autofree = false; Extension = NULL; - area = 0; + area = NULL; Pos.x = 0; Pos.y = 0; Destination = Pos; @@ -45,17 +48,23 @@ step = NULL; timeStartStep = 0; phase = P_UNINITED; + effects = NULL; } Projectile::~Projectile() { - if (Extension) { + if (Extension && autofree) { free(Extension); } + if (effects) { + delete effects; + } + ClearPath(); } void Projectile::InitExtension() { + autofree = false; if (!Extension) { Extension = (ProjectileExtension *) calloc( 1, sizeof(ProjectileExtension)); } @@ -73,20 +82,48 @@ return node; } -//this could be used for WingBuffet as well +//Pass means passing/rebounding/extinguishing on walls void Projectile::MoveLine(int steps, int Pass, ieDword orient) { //remove previous path ClearPath(); - if (!steps) + if (!steps) { + Pos = Destination; return; + } path = area->GetLine( Pos, steps, orient, Pass ); } +void Projectile::CreateAnimations(Animation **anims, ieResRef bamres) +{ + AnimationFactory* af = ( AnimationFactory* ) + core->GetResourceMgr()->GetFactoryResource( bamres, + IE_BAM_CLASS_ID, IE_NORMAL ); + // + if (!af) { + return; + } + for (int Cycle = 0; Cycle<MAX_ORIENT; Cycle++) { + Animation* a = af->GetCycle( Cycle ); + anims[Cycle] = a; + } +} + // load animations, start sound void Projectile::Setup() { phase = P_TRAVEL; + core->GetSoundMgr()->Play(SoundRes1, Pos.x, Pos.y, GEM_SND_RELATIVE); + memset(travel,0,sizeof(travel)); + memset(shadow,0,sizeof(shadow)); + light = NULL; + CreateAnimations(travel, BAMRes1); + if (TFlags&PTF_SHADOW) { + CreateAnimations(shadow, BAMRes2); + } + if (TFlags&PTF_LIGHT) { + //light = CreateLight(LightX, LightY, LightZ); + } } //control the phase change when the projectile reached its target @@ -102,21 +139,37 @@ phase = P_EXPIRED; return; } - Destination = target->Pos; - //next position should be current position+speed towards - //target - return; + int steps = Distance(Pos, target); + + if (steps) { + SetTarget(target->Pos); + return; + } } + //reached target if (!Extension) { phase = P_EXPIRED; - //deliver payload to target + if (Target) { + Actor *target = area->GetActorByGlobalID(Target); + if (!target) { + return; + } + //deliver payload to target + effects->AddAllEffects(target); + effects = NULL; + return; + } + //get target + return; } + phase = P_TRIGGER; } void Projectile::DoStep(unsigned int walk_speed) { - if (!path) { + if (!path || !walk_speed) { + ChangePhase(); return; } ieDword time = core->GetGame()->Ticks; @@ -140,9 +193,6 @@ ChangePhase(); return; } - if (!walk_speed) { - return; - } if (step->Next->x > step->x) Pos.x += ( unsigned short ) ( ( ( ( ( step->Next->x * 16 ) + 8 ) - Pos.x ) * ( time - timeStartStep ) ) / walk_speed ); @@ -157,41 +207,27 @@ ( ( ( Pos.y - ( ( step->Next->y * 12 ) + 6 ) ) * ( time - timeStartStep ) ) / walk_speed ); } -void Projectile::AddWayPoint(Point &Des) +void Projectile::SetTarget(Point &p) { - if (!path) { - WalkTo(Des); - return; - } - Destination = Des; - PathNode *endNode=path; - while(endNode->Next) { - endNode=endNode->Next; - } - Point p(endNode->x, endNode->y); - PathNode *path2 = area->FindPath( p, Des ); - endNode->Next=path2; + Destination = p; + ClearPath(); + MoveLine( Speed, true, GetOrient(p, Pos) ); } -void Projectile::WalkTo(Point &Des, int distance) +void Projectile::SetTarget(ieDword tar) { - ClearPath(); - path = area->FindPath( Pos, Des, distance ); - //ClearPath sets destination, so Destination must be set after it - //also we should set Destination only if there is a walkable path - if (path) { - Destination = Des; + Target = tar; + Actor *target = area->GetActorByGlobalID(tar); + if (!target) { + phase = P_EXPIRED; + return; } + SetTarget(target->Pos); } -void Projectile::RunAwayFrom(Point &Des, int PathLength, int flags) +void Projectile::MoveTo(Map *map, Point &Des) { - ClearPath(); - path = area->RunAway( Pos, Des, PathLength, flags ); -} - -void Projectile::MoveTo(Point &Des) -{ + area = map; Pos = Des; Destination = Des; } @@ -228,6 +264,22 @@ } } +int Projectile::Update() +{ + //if reached target explode + //if target doesn't exist expire + if (phase == P_EXPIRED) { + return 0; + } + if (phase ==P_UNINITED) { + Setup(); + } + if (phase == P_TRAVEL) { + DoStep(Speed); + } + return 1; +} + void Projectile::Draw(Region &screen) { switch (phase) { @@ -244,8 +296,7 @@ case P_EXPLODING: DrawExplosion(screen); return; - case P_EXPLODED: - case P_EXPIRED: + default: DrawExploded(screen); return; } @@ -276,6 +327,32 @@ */ } +int Projectile::GetTravelPos(int face) +{ + if (travel[face]) { + return travel[face]->GetCurrentFrame(); + } + return 0; +} + +int Projectile::GetShadowPos(int face) +{ + if (shadow[face]) { + return shadow[face]->GetCurrentFrame(); + } + return 0; +} + +void Projectile::SetPos(int face, int frame1, int frame2) +{ + if (travel[face]) { + travel[face]->SetPos(frame1); + } + if (shadow[face]) { + shadow[face]->SetPos(frame2); + } +} + void Projectile::DrawTravel(Region &screen) { Video *video = core->GetVideoDriver(); @@ -283,14 +360,20 @@ Color tint = {128,128,128,255}; unsigned int face = GetNextFace(); if (face!=Orientation) { - travel[face]->SetPos(travel[Orientation]->GetCurrentFrame()); - shadow[face]->SetPos(shadow[Orientation]->GetCurrentFrame()); + SetPos(face, GetTravelPos(face), GetShadowPos(face)); } - Sprite2D *frame = travel[face]->NextFrame(); - video->BlitGameSprite( frame, Pos.x + screen.x, Pos.y + screen.y, flag, tint, NULL, NULL, &screen); + if (travel[face]) { + Sprite2D *frame = travel[face]->NextFrame(); + video->BlitGameSprite( frame, Pos.x + screen.x, Pos.y + screen.y, flag, tint, NULL, NULL, &screen); + } - frame = shadow[face]->NextFrame(); - video->BlitGameSprite( frame, Pos.x + screen.x, Pos.y + screen.y, flag, tint, NULL, NULL, &screen); + if (shadow[face]) { + Sprite2D *frame = shadow[face]->NextFrame(); + video->BlitGameSprite( frame, Pos.x + screen.x, Pos.y + screen.y, flag, tint, NULL, NULL, &screen); + } - video->BlitGameSprite( light, Pos.x + screen.x, Pos.y + screen.y, flag, tint, NULL, NULL, &screen); + if (light) { + video->BlitGameSprite( light, Pos.x + screen.x, Pos.y + screen.y, flag, tint, NULL, NULL, &screen); + } } + Modified: gemrb/trunk/gemrb/plugins/Core/Projectile.h =================================================================== --- gemrb/trunk/gemrb/plugins/Core/Projectile.h 2007-03-12 15:46:45 UTC (rev 4549) +++ gemrb/trunk/gemrb/plugins/Core/Projectile.h 2007-03-12 16:34:13 UTC (rev 4550) @@ -60,6 +60,14 @@ #define PSF_LOOPING 4 //looping sound #define PSF_IGNORE_CENTER 16 +//projectile travel flags +#define PTF_COLOUR 1 //fake colours +#define PTF_SMOKE 2 //has smoke +#define PTF_TINT 8 //tint projectile +#define PTF_SHADOW 32 //has shadow bam +#define PTF_LIGHT 64 //has light shadow +#define PTF_BLEND 128 //blend colours + typedef struct ProjectileExtension { ieDword AFlags; @@ -84,6 +92,7 @@ Projectile(); ~Projectile(); void InitExtension(); + void CreateAnimations(Animation **anims, ieResRef bam); ieWord Type; ieWord Speed; @@ -110,6 +119,7 @@ ieWord TrailSpeed[3]; // ProjectileExtension *Extension; + bool autofree; //internals protected: //attributes from moveable object @@ -129,9 +139,13 @@ Animation* shadow[MAX_ORIENT]; Sprite2D* light;//this is just a round/halftrans sprite, has no animation Animation** fragments; + EffectQueue* effects; public: PathNode *GetNextStep(int x); int GetPathLength(); + void SetTarget(ieDword t); + void SetTarget(Point &p); + //inliners to protect data consistency inline PathNode * GetNextStep() { if (!step) { @@ -143,7 +157,17 @@ inline unsigned char GetOrientation() const { return Orientation; } + //no idea if projectiles got height, using y + inline int GetHeight() const { + return Pos.y; + } + //don't forget to set effects to NULL when the projectile discharges + //unexploded projectiles are responsible to destruct their payload + inline void SetEffects(EffectQueue *fx) { + effects = fx; + } + inline unsigned char GetNextFace() { //slow turning if (Orientation != NewOrientation) { @@ -169,18 +193,21 @@ void Setup(); void ChangePhase(); void DoStep(unsigned int walk_speed); - void AddWayPoint(Point &Des); - void RunAwayFrom(Point &Des, int PathLength, int flags); void MoveLine(int steps, int Pass, ieDword Orient); - void WalkTo(Point &Des, int MinDistance = 0); - void MoveTo(Point &Des); + void MoveTo(Map *map, Point &Des); void ClearPath(); + //handle phases, return 0 when expired + int Update(); + //draw object void Draw(Region &screen); private: void CheckTrigger(unsigned int radius); void DrawTravel(Region &screen); void DrawExplosion(Region &screen); void DrawExploded(Region &screen); + int GetTravelPos(int face); + int GetShadowPos(int face); + void SetPos(int face, int frame1, int frame2); }; #endif // PROJECTILE_H Modified: gemrb/trunk/gemrb/plugins/Core/ProjectileServer.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/Core/ProjectileServer.cpp 2007-03-12 15:46:45 UTC (rev 4549) +++ gemrb/trunk/gemrb/plugins/Core/ProjectileServer.cpp 2007-03-12 16:34:13 UTC (rev 4550) @@ -44,6 +44,15 @@ } } +Projectile *ProjectileServer::CreateDefaultProjectile(unsigned int idx) +{ + Projectile *pro = new Projectile(); + int strlength = (ieByte *) (&pro->Extension)-(ieByte *) (&pro->Type); + memset(&pro->Type, 0, strlength ); + projectiles[idx].projectile = pro; + return ReturnCopy(idx); +} + //this function can return only projectiles listed in projectl.ids Projectile *ProjectileServer::GetProjectileByName(const ieResRef resname) { @@ -65,33 +74,47 @@ return NULL; } if (idx>=GetHighestProjectileNumber()) { - return NULL; + return GetProjectile(0); } return GetProjectile(idx); } +Projectile *ProjectileServer::ReturnCopy(unsigned int idx) +{ + Projectile *pro = new Projectile(); + int strlength = (ieByte *) (&pro->Extension)-(ieByte *) (&pro->Type); + Projectile *old = projectiles[idx].projectile; + memcpy(&pro->Type, &old->Type, strlength ); + if(old->Extension) { + pro->Extension = old->Extension; + } + return pro; +} + Projectile *ProjectileServer::GetProjectile(unsigned int idx) { if (projectiles[idx].projectile) { - return projectiles[idx].projectile; + return ReturnCopy(idx); } DataStream* str = core->GetResourceMgr()->GetResource( projectiles[idx].resname, IE_PRO_CLASS_ID ); ProjectileMgr* sm = ( ProjectileMgr* ) core->GetInterface( IE_PRO_CLASS_ID ); if (sm == NULL) { delete ( str ); - return NULL; + return CreateDefaultProjectile(idx); } if (!sm->Open( str, true )) { core->FreeInterface( sm ); - return NULL; + return CreateDefaultProjectile(idx); } - - projectiles[idx].projectile = new Projectile(); - sm->GetProjectile( projectiles[idx].projectile ); + Projectile *pro = new Projectile(); + projectiles[idx].projectile = pro; + + sm->GetProjectile( pro ); core->FreeInterface( sm ); - return projectiles[idx].projectile; + pro->autofree = true; + return ReturnCopy(idx); } unsigned int ProjectileServer::GetHighestProjectileNumber() @@ -99,18 +122,18 @@ if (projectilecount>=0) { return (unsigned int) projectilecount; } - projectilecount = 0; unsigned int resource = core->LoadSymbol("projectl"); SymbolMgr *projlist = core->GetSymbol(resource); if (projlist) { + projectilecount = 0; unsigned int rows = (unsigned int) projlist->GetSize(); while(rows--) { unsigned int value = projlist->GetValueIndex(rows); if (value>MAX_PROJ_IDX) { value = MAX_PROJ_IDX; - printMessage("ProjectileServer","To high projectilenumber\n", YELLOW); + printMessage("ProjectileServer","Too high projectilenumber\n", YELLOW); } if (value>(unsigned int) projectilecount) { projectilecount = (unsigned int) value+1; @@ -120,11 +143,12 @@ rows = (unsigned int) projlist->GetSize(); while(rows--) { - strnuprcpy(projectiles[ projlist->GetValueIndex(rows)].resname, projlist->GetStringIndex(rows), 8); + strnuprcpy(projectiles[ projlist->GetValueIndex(rows)].resname, projlist->GetStringIndex(rows), 8); } core->DelSymbol(resource); + } else { + projectilecount=1; + projectiles = new ProjectileEntry[projectilecount]; } return (unsigned int) projectilecount; } - - Modified: gemrb/trunk/gemrb/plugins/Core/ProjectileServer.h =================================================================== --- gemrb/trunk/gemrb/plugins/Core/ProjectileServer.h 2007-03-12 15:46:45 UTC (rev 4549) +++ gemrb/trunk/gemrb/plugins/Core/ProjectileServer.h 2007-03-12 16:34:13 UTC (rev 4550) @@ -61,6 +61,9 @@ unsigned int GetHighestProjectileNumber(); //this method is used internally Projectile *GetProjectile(unsigned int idx); + Projectile *CreateDefaultProjectile(unsigned int idx); + //creates a clone from the cached projectiles + Projectile *ReturnCopy(unsigned int idx); }; #endif // PROJSERVER_H This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ave...@us...> - 2007-04-01 12:15:10
|
Revision: 4567 http://gemrb.svn.sourceforge.net/gemrb/?rev=4567&view=rev Author: avenger_teambg Date: 2007-04-01 05:15:11 -0700 (Sun, 01 Apr 2007) Log Message: ----------- cleaned up a few hacks (direct targeting) Actor::add_animation is now able to force blending of animation Modified Paths: -------------- gemrb/trunk/gemrb/plugins/Core/Actions.cpp gemrb/trunk/gemrb/plugins/Core/Actor.cpp gemrb/trunk/gemrb/plugins/Core/Actor.h gemrb/trunk/gemrb/plugins/Core/GSUtils.cpp gemrb/trunk/gemrb/plugins/Core/GameControl.cpp 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 2007-04-01 12:14:08 UTC (rev 4566) +++ gemrb/trunk/gemrb/plugins/Core/Actions.cpp 2007-04-01 12:15:11 UTC (rev 4567) @@ -1725,7 +1725,7 @@ //we hijack this action for the player initiated dialogue void GameScript::NIDSpecial1(Scriptable* Sender, Action* parameters) { - BeginDialog( Sender, parameters, BD_INTERRUPT | BD_TARGET | BD_NUMERIC | BD_TALKCOUNT | BD_CHECKDIST ); + BeginDialog( Sender, parameters, BD_INTERRUPT | BD_TARGET /*| BD_NUMERIC*/ | BD_TALKCOUNT | BD_CHECKDIST ); } void GameScript::NIDSpecial2(Scriptable* Sender, Action* /*parameters*/) @@ -4085,16 +4085,18 @@ return; } //this is a hack, we use a gui variable for our own hideous reasons? - GameControl *gc = core->GetGameControl(); - if (gc) { - //saving the target object ID from the gui variable - ieWord tmp = gc->targetID; - gc->targetID = ((Actor *) tar)->globalID; - char Tmp[256]; - strncpy(Tmp,"NIDSpecial3()",sizeof(Tmp) ); - scr->AddAction( GenerateAction(Tmp) ); - //restore the gui variable - gc->targetID=tmp; + if (tar->Type==ST_ACTOR) { + GameControl *gc = core->GetGameControl(); + if (gc) { + //saving the target object ID from the gui variable + char Tmp[40]; + strncpy(Tmp,"NIDSpecial3()",sizeof(Tmp) ); + scr->AddAction( GenerateActionDirect(Tmp, (Actor *) tar) ); + } + } else { + char Tmp[80]; + snprintf(Tmp, sizeof(Tmp), "BashDoor(%s)", tar->GetScriptName()); + scr->AddAction ( GenerateAction(Tmp) ); } } Modified: gemrb/trunk/gemrb/plugins/Core/Actor.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/Core/Actor.cpp 2007-04-01 12:14:08 UTC (rev 4566) +++ gemrb/trunk/gemrb/plugins/Core/Actor.cpp 2007-04-01 12:15:11 UTC (rev 4567) @@ -620,7 +620,7 @@ if (Value) { if (actor->HasVVCCell(overlay[OV_GREASE])) return; - actor->add_animation(overlay[OV_GREASE], -1, -1, false); + actor->add_animation(overlay[OV_GREASE], -1, -1, 0); } else { actor->RemoveVVCell(overlay[OV_GREASE], true); } @@ -633,7 +633,7 @@ if (Value) { if (actor->HasVVCCell(overlay[OV_WEB])) return; - actor->add_animation(overlay[OV_WEB], -1, 0, false); + actor->add_animation(overlay[OV_WEB], -1, 0, 0); } else { actor->RemoveVVCell(overlay[OV_WEB], true); } @@ -643,7 +643,7 @@ void pcf_bounce(Actor *actor, ieDword Value) { if (Value) { - actor->add_animation(overlay[OV_BOUNCE], -1, -1, false); + actor->add_animation(overlay[OV_BOUNCE], -1, -1, 0); } else { //it seems we have to remove it abruptly actor->RemoveVVCell(overlay[OV_BOUNCE], false); @@ -901,15 +901,19 @@ } } -void Actor::add_animation(const ieResRef resource, int gradient, int height, bool playonce) +void Actor::add_animation(const ieResRef resource, int gradient, int height, int flags) { ScriptedAnimation *sca = core->GetScriptedAnimation(resource); if (!sca) return; sca->ZPos=height; - if (playonce) { + if (flags&AA_PLAYONCE) { sca->PlayOnce(); } + if (flags&&AA_BLEND) { + //pst anims need this? + sca->SetBlend(); + } if (gradient!=-1) { sca->SetPalette(gradient, 4); } @@ -924,28 +928,28 @@ case 0: case 1: case 2: case 3: //blood i = (int) GetStat(IE_ANIMATION_ID)>>16; if (!i) i = d_gradient[type]; - add_animation(d_main[type], i, 0, true); + add_animation(d_main[type], i, 0, AA_PLAYONCE); break; case 4: case 5: case 7: //fire - add_animation(d_main[type], d_gradient[type], 0, true); + add_animation(d_main[type], d_gradient[type], 0, AA_PLAYONCE); for(i=DL_FIRE;i<=type;i++) { - add_animation(d_splash[i], d_gradient[i], 0, true); + add_animation(d_splash[i], d_gradient[i], 0, AA_PLAYONCE); } break; case 8: case 9: case 10: //electricity - add_animation(d_main[type], d_gradient[type], 0, true); + add_animation(d_main[type], d_gradient[type], 0, AA_PLAYONCE); for(i=DL_ELECTRICITY;i<=type;i++) { - add_animation(d_splash[i], d_gradient[i], 0, true); + add_animation(d_splash[i], d_gradient[i], 0, AA_PLAYONCE); } break; case 11: case 12: case 13://cold - add_animation(d_main[type], d_gradient[type], 0, true); + add_animation(d_main[type], d_gradient[type], 0, AA_PLAYONCE); break; case 14: case 15: case 16://acid - add_animation(d_main[type], d_gradient[type], 0, true); + add_animation(d_main[type], d_gradient[type], 0, AA_PLAYONCE); break; case 17: case 18: case 19://disintegrate - add_animation(d_main[type], d_gradient[type], 0, true); + add_animation(d_main[type], d_gradient[type], 0, AA_PLAYONCE); break; } } Modified: gemrb/trunk/gemrb/plugins/Core/Actor.h =================================================================== --- gemrb/trunk/gemrb/plugins/Core/Actor.h 2007-04-01 12:14:08 UTC (rev 4566) +++ gemrb/trunk/gemrb/plugins/Core/Actor.h 2007-04-01 12:15:11 UTC (rev 4567) @@ -77,6 +77,10 @@ #define DNJ_JUMP 4 #define DNJ_BIRD (DNJ_FIT|DNJ_UNHINDERED) +//add_animation flags (override vvc) +#define AA_PLAYONCE 1 +#define AA_BLEND 2 + /** flags for GetActor */ //default action #define GA_DEFAULT 0 @@ -409,8 +413,8 @@ bool HasVVCCell(const ieResRef resource); /* draw videocells */ void DrawVideocells(Region &screen, vvcVector &vvcCells, Color &tint); - - void add_animation(const ieResRef resource, int gradient, int height, bool playonce); + + void add_animation(const ieResRef resource, int gradient, int height, int flags); void PlayDamageAnimation(int x); /* restores a spell of maximum maxlevel level, type is a mask of disabled spells */ int RestoreSpellLevel(ieDword maxlevel, ieDword typemask); Modified: gemrb/trunk/gemrb/plugins/Core/GSUtils.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/Core/GSUtils.cpp 2007-04-01 12:14:08 UTC (rev 4566) +++ gemrb/trunk/gemrb/plugins/Core/GSUtils.cpp 2007-04-01 12:15:11 UTC (rev 4567) @@ -788,13 +788,7 @@ if (Flags & BD_OWN) { scr = tar = GetActorFromObject( Sender, parameters->objects[1], GA_NO_DEAD ); } else { - if (Flags & BD_NUMERIC) { - //the target was already set, this is a crude hack - tar = core->GetGameControl()->GetTarget(); - } - else { - tar = GetActorFromObject( Sender, parameters->objects[1], GA_NO_DEAD ); - } + tar = GetActorFromObject( Sender, parameters->objects[1], GA_NO_DEAD ); scr = Sender; } if (!scr) { @@ -1316,7 +1310,7 @@ if (actionflags[newAction->actionID]&AF_DIRECT) { Object *tmp = new Object(); tmp->objectFields[0] = -1; - tmp->objectFields[1] = core->GetGameControl()->targetID; + //tmp->objectFields[1] = core->GetGameControl()->targetID; newAction->objects[objectCount++] = tmp; } //Here is the Action; Now we need to evaluate the parameters, if any Modified: gemrb/trunk/gemrb/plugins/Core/GameControl.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/Core/GameControl.cpp 2007-04-01 12:14:08 UTC (rev 4566) +++ gemrb/trunk/gemrb/plugins/Core/GameControl.cpp 2007-04-01 12:15:11 UTC (rev 4567) @@ -921,33 +921,21 @@ void GameControl::TryToAttack(Actor *source, Actor *tgt) { char Tmp[40]; - ieWord tmp; source->ClearPath(); source->ClearActions(); strncpy(Tmp,"NIDSpecial3()",sizeof(Tmp) ); - tmp = targetID; - targetID=tgt->globalID; //this is a hack, not deadly, but a hack - source->AddAction( GenerateAction( Tmp) ); - //we restore the old target ID, because this variable is primarily - //to keep track of the target of a dialog, and attacking isn't talking - targetID = tmp; + source->AddAction( GenerateActionDirect( Tmp, tgt) ); } void GameControl::TryToDefend(Actor *source, Actor *tgt) { char Tmp[40]; - ieWord tmp; source->ClearPath(); source->ClearActions(); strncpy(Tmp,"NIDSpecial4()",sizeof(Tmp) ); - tmp = targetID; - targetID=tgt->globalID; //this is a hack, not deadly, but a hack - source->AddAction( GenerateAction( Tmp) ); - //we restore the old target ID, because this variable is primarily - //to keep track of the target of a dialog, and attacking isn't talking - targetID = tmp; + source->AddAction( GenerateActionDirect( Tmp, tgt) ); } void GameControl::TryToCast(Actor *source, Point &tgt) @@ -977,7 +965,6 @@ void GameControl::TryToCast(Actor *source, Actor *tgt) { char Tmp[40]; - ieWord tmp; if (!spellCount) spellOrItem = 0; if (!spellOrItem) return; //not casting or using an own item @@ -988,9 +975,7 @@ //using item on target sprintf(Tmp, "NIDSpecial5()"); } - tmp = targetID; - targetID=tgt->globalID; //this is a hack, not deadly, but a hack - Action* action = GenerateAction( Tmp); + Action* action = GenerateActionDirect( Tmp, tgt); source->AddAction( action ); if (spellOrItem>0) { @@ -1004,9 +989,6 @@ action->int0Parameter=spellSlot; action->int1Parameter=spellIndex; } - //we restore the old target ID, because this variable is primarily - //to keep track of the target of a dialog, and attacking isn't talking - targetID = tmp; if (!spellCount) { spellOrItem = 0; target_mode = TARGET_MODE_NONE; @@ -1024,8 +1006,8 @@ source->ClearPath(); source->ClearActions(); strncpy(Tmp,"NIDSpecial1()",sizeof(Tmp) ); - targetID=tgt->globalID; //this is a hack, but not so deadly - source->AddAction( GenerateAction( Tmp) ); + targetID = tgt->globalID; //this is a hack, but not so deadly + source->AddAction( GenerateActionDirect( Tmp, tgt) ); } void GameControl::HandleContainer(Container *container, Actor *actor) Modified: gemrb/trunk/gemrb/plugins/Core/GameScript.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/Core/GameScript.cpp 2007-04-01 12:14:08 UTC (rev 4566) +++ gemrb/trunk/gemrb/plugins/Core/GameScript.cpp 2007-04-01 12:15:11 UTC (rev 4567) @@ -139,7 +139,7 @@ {"happiness", GameScript::Happiness, 0}, {"happinessgt", GameScript::HappinessGT, 0}, {"happinesslt", GameScript::HappinessLT, 0}, - {"harmlessclosed", GameScript::Closed, 0}, //pst, not sure + {"harmlessclosed", GameScript::Closed, 0}, //pst, not sure {"harmlessentered", GameScript::HarmlessEntered, 0}, //??? {"harmlessopened", GameScript::Opened, 0}, //pst, not sure {"hasinnateability", GameScript::HaveSpell, 0}, //these must be the same @@ -505,7 +505,7 @@ {"enablespritedither", GameScript::EnableSpriteDither, 0}, {"endcredits", GameScript::EndCredits, 0},//movie {"endcutscenemode", GameScript::EndCutSceneMode, 0}, - {"endgame", GameScript::QuitGame, 0}, //ending in iwd2 + {"endgame", GameScript::QuitGame, 0}, //ending in iwd2 {"enemy", GameScript::Enemy, 0}, {"equipitem", GameScript::EquipItem, AF_BLOCKING}, //why blocking??? {"equipmostdamagingmelee",GameScript::EquipMostDamagingMelee,0}, @@ -643,7 +643,7 @@ {"moveviewobject", GameScript::MoveViewObject, AF_BLOCKING}, {"moveviewpoint", GameScript::MoveViewPoint, AF_BLOCKING}, {"moveviewpointuntildone", GameScript::MoveViewPoint, 0}, - {"nidspecial1", GameScript::NIDSpecial1,AF_BLOCKING},//we use this for dialogs, hack + {"nidspecial1", GameScript::NIDSpecial1,AF_BLOCKING|AF_DIRECT},//we use this for dialogs, hack {"nidspecial2", GameScript::NIDSpecial2,AF_BLOCKING},//we use this for worldmap, another hack {"nidspecial3", GameScript::Attack,AF_BLOCKING|AF_DIRECT},//this hack is for attacking preset target {"nidspecial4", GameScript::ProtectObject,AF_BLOCKING|AF_DIRECT}, @@ -3076,6 +3076,16 @@ return GenerateActionCore( src, str, i); } +Action* GenerateActionDirect(char *String, Actor *object) +{ + Action* action = GenerateAction(String); + Object *tmp = action->objects[1]; + if (tmp && tmp->objectFields[0]==-1) { + tmp->objectFields[1] = object->globalID; + } + return action; +} + /** Self-destructing object if it is empty */ bool Object::ReadyToDie() { Modified: gemrb/trunk/gemrb/plugins/Core/GameScript.h =================================================================== --- gemrb/trunk/gemrb/plugins/Core/GameScript.h 2007-04-01 12:14:08 UTC (rev 4566) +++ gemrb/trunk/gemrb/plugins/Core/GameScript.h 2007-04-01 12:15:11 UTC (rev 4567) @@ -1486,6 +1486,7 @@ }; Action* GenerateAction(char* String); +Action* GenerateActionDirect(char* String, Actor *object); Trigger* GenerateTrigger(char* String); #endif This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ave...@us...> - 2007-04-06 23:45:55
|
Revision: 4570 http://gemrb.svn.sourceforge.net/gemrb/?rev=4570&view=rev Author: avenger_teambg Date: 2007-04-06 16:45:54 -0700 (Fri, 06 Apr 2007) Log Message: ----------- setting original caster ID in projectile Modified Paths: -------------- gemrb/trunk/gemrb/plugins/Core/Actor.cpp gemrb/trunk/gemrb/plugins/Core/Projectile.cpp gemrb/trunk/gemrb/plugins/Core/Projectile.h Modified: gemrb/trunk/gemrb/plugins/Core/Actor.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/Core/Actor.cpp 2007-04-06 23:30:14 UTC (rev 4569) +++ gemrb/trunk/gemrb/plugins/Core/Actor.cpp 2007-04-06 23:45:54 UTC (rev 4570) @@ -564,7 +564,7 @@ if (Value) { if (actor->HasVVCCell(overlay[OV_ENTANGLE])) return; - ScriptedAnimation *sca = core->GetScriptedAnimation(overlay[OV_ENTANGLE]); + ScriptedAnimation *sca = core->GetScriptedAnimation(overlay[OV_ENTANGLE], false); actor->AddVVCell(sca); } else { actor->RemoveVVCell(overlay[OV_ENTANGLE], true); @@ -578,7 +578,7 @@ { if (Value) { if (!actor->HasVVCCell(overlay[OV_SANCTUARY])) { - ScriptedAnimation *sca = core->GetScriptedAnimation(overlay[OV_SANCTUARY]); + ScriptedAnimation *sca = core->GetScriptedAnimation(overlay[OV_SANCTUARY], false); actor->AddVVCell(sca); } SetLockedPalette(actor, fullwhite); @@ -594,7 +594,7 @@ if (Value) { if (actor->HasVVCCell(overlay[OV_SHIELDGLOBE])) return; - ScriptedAnimation *sca = core->GetScriptedAnimation(overlay[OV_SHIELDGLOBE]); + ScriptedAnimation *sca = core->GetScriptedAnimation(overlay[OV_SHIELDGLOBE], false); actor->AddVVCell(sca); } else { actor->RemoveVVCell(overlay[OV_SHIELDGLOBE], true); @@ -607,7 +607,7 @@ if (Value) { if (actor->HasVVCCell(overlay[OV_MINORGLOBE])) return; - ScriptedAnimation *sca = core->GetScriptedAnimation(overlay[OV_MINORGLOBE]); + ScriptedAnimation *sca = core->GetScriptedAnimation(overlay[OV_MINORGLOBE], false); actor->AddVVCell(sca); } else { actor->RemoveVVCell(overlay[OV_MINORGLOBE], true); @@ -903,7 +903,7 @@ void Actor::add_animation(const ieResRef resource, int gradient, int height, int flags) { - ScriptedAnimation *sca = core->GetScriptedAnimation(resource); + ScriptedAnimation *sca = core->GetScriptedAnimation(resource, false); if (!sca) return; sca->ZPos=height; @@ -2403,7 +2403,7 @@ */ // actually this is better be drawn by the vvc - bool endReached = vvc->Draw(screen, Pos, tint, area, WantDither()); + bool endReached = vvc->Draw(screen, Pos, tint, area, WantDither(), GetOrientation()); if (endReached) { delete vvc; vvcCells.erase(vvcCells.begin()+i); @@ -3013,6 +3013,7 @@ } Projectile *pro = itm->GetProjectile(header); + pro->SetCaster(globalID); GetCurrentArea()->AddProjectile(pro, Pos, target); //in fact this should build a projectile and hurl it at the target //this is just a temporary solution @@ -3049,6 +3050,7 @@ } Projectile *pro = itm->GetProjectile(header); if (pro) { + pro->SetCaster(globalID); GetCurrentArea()->AddProjectile(pro, Pos, tar->globalID); } //in fact this should build a projectile and hurl it at the target Modified: gemrb/trunk/gemrb/plugins/Core/Projectile.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/Core/Projectile.cpp 2007-04-06 23:30:14 UTC (rev 4569) +++ gemrb/trunk/gemrb/plugins/Core/Projectile.cpp 2007-04-06 23:45:54 UTC (rev 4570) @@ -158,6 +158,8 @@ return; } //deliver payload to target + Actor *original = area->GetActorByGlobalID(Caster); + effects->SetOwner(original?original:target); effects->AddAllEffects(target); effects = NULL; return; @@ -211,6 +213,11 @@ ( ( ( Pos.y - ( ( step->Next->y * 12 ) + 6 ) ) * ( time - timeStartStep ) ) / walk_speed ); } +void Projectile::SetCaster(ieDword caster) +{ + Caster=caster; +} + void Projectile::SetTarget(Point &p) { ClearPath(); Modified: gemrb/trunk/gemrb/plugins/Core/Projectile.h =================================================================== --- gemrb/trunk/gemrb/plugins/Core/Projectile.h 2007-04-06 23:30:14 UTC (rev 4569) +++ gemrb/trunk/gemrb/plugins/Core/Projectile.h 2007-04-06 23:45:54 UTC (rev 4570) @@ -56,7 +56,7 @@ //projectile spark flags #define PSF_SPARKS 1 -#define PSF_FLYING 2 +#define PSF_FLYING 2 #define PSF_LOOPING 4 //looping sound #define PSF_IGNORE_CENTER 16 @@ -86,7 +86,7 @@ //there could be some more unused bytes we don't load } ProjectileExtension; -class GEM_EXPORT Projectile +class GEM_EXPORT Projectile { public: Projectile(); @@ -130,6 +130,7 @@ Map *area; Point Pos; Point Destination; + ieDword Caster; //the globalID of the caster actor ieDword Target; //the globalID of target actor ieDword timeStartStep; int phase; @@ -143,6 +144,7 @@ public: PathNode *GetNextStep(int x); int GetPathLength(); + void SetCaster(ieDword t); void SetTarget(ieDword t); void SetTarget(Point &p); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ave...@us...> - 2007-04-07 17:07:16
|
Revision: 4575 http://gemrb.svn.sourceforge.net/gemrb/?rev=4575&view=rev Author: avenger_teambg Date: 2007-04-07 10:07:15 -0700 (Sat, 07 Apr 2007) Log Message: ----------- SystemVariable trigger (gemrb specific) maximum AC different for bg2 and iwd2 Modified Paths: -------------- gemrb/trunk/gemrb/plugins/Core/Actions.cpp gemrb/trunk/gemrb/plugins/Core/Actor.cpp gemrb/trunk/gemrb/plugins/Core/GameScript.cpp gemrb/trunk/gemrb/plugins/Core/GameScript.h gemrb/trunk/gemrb/plugins/Core/Triggers.cpp Modified: gemrb/trunk/gemrb/plugins/Core/Actions.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/Core/Actions.cpp 2007-04-07 09:23:41 UTC (rev 4574) +++ gemrb/trunk/gemrb/plugins/Core/Actions.cpp 2007-04-07 17:07:15 UTC (rev 4575) @@ -4380,7 +4380,7 @@ ieDword distance = PersonalDistance(Sender, container); ieDword needed = MAX_OPERATING_DISTANCE; if (container->Type==IE_CONTAINER_PILE) { - needed = 15; // less than a search square (width) + needed = 0; // less than a search square (width) } if (distance<=needed) { Modified: gemrb/trunk/gemrb/plugins/Core/Actor.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/Core/Actor.cpp 2007-04-07 09:23:41 UTC (rev 4574) +++ gemrb/trunk/gemrb/plugins/Core/Actor.cpp 2007-04-07 17:07:15 UTC (rev 4575) @@ -817,6 +817,13 @@ maximum_values[IE_CON]=i; maximum_values[IE_CHR]=i; maximum_values[IE_WIS]=i; + if (REVERSE_TOHIT) { + //all games except iwd2 + maximum_values[IE_ARMORCLASS]=20; + } else { + //iwd2 + maximum_values[IE_ARMORCLASS]=199; + } //initializing the vvc resource references table = core->LoadTable( "damage" ); Modified: gemrb/trunk/gemrb/plugins/Core/GameScript.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/Core/GameScript.cpp 2007-04-07 09:23:41 UTC (rev 4574) +++ gemrb/trunk/gemrb/plugins/Core/GameScript.cpp 2007-04-07 17:07:15 UTC (rev 4575) @@ -327,6 +327,7 @@ {"storehasitem", GameScript::StoreHasItem, 0}, {"stuffglobalrandom", GameScript::StuffGlobalRandom, 0},//hm, this is a trigger {"subrace", GameScript::SubRace, 0}, + {"systemvariable", GameScript::SystemVariable_Trigger, 0}, //gemrb {"targetunreachable", GameScript::TargetUnreachable, 0}, {"team", GameScript::Team, 0}, {"time", GameScript::Time, 0}, Modified: gemrb/trunk/gemrb/plugins/Core/GameScript.h =================================================================== --- gemrb/trunk/gemrb/plugins/Core/GameScript.h 2007-04-07 09:23:41 UTC (rev 4574) +++ gemrb/trunk/gemrb/plugins/Core/GameScript.h 2007-04-07 17:07:15 UTC (rev 4575) @@ -909,6 +909,7 @@ static int StoreHasItem(Scriptable* Sender, Trigger* parameters); static int StuffGlobalRandom(Scriptable* Sender, Trigger* parameters); static int SubRace(Scriptable* Sender, Trigger* parameters); + static int SystemVariable_Trigger(Scriptable* Sender, Trigger* parameters); static int TargetUnreachable(Scriptable* Sender, Trigger* parameters); static int Team(Scriptable* Sender, Trigger* parameters); static int Time(Scriptable* Sender, Trigger* parameters); Modified: gemrb/trunk/gemrb/plugins/Core/Triggers.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/Core/Triggers.cpp 2007-04-07 09:23:41 UTC (rev 4574) +++ gemrb/trunk/gemrb/plugins/Core/Triggers.cpp 2007-04-07 17:07:15 UTC (rev 4575) @@ -3743,3 +3743,37 @@ return ret; } +// this is a GemRB specific trigger, to transfer some system variables +// to a global (game variable), it will always return true, and the +// variable could be checked in a subsequent trigger (like triggersetglobal) + +#define SYSV_SCREENFLAGS 0 +#define SYSV_CONTROLSTATUS 1 +#define SYSV_REPUTATION 2 +#define SYSV_PARTYGOLD 3 + +int GameScript::SystemVariable_Trigger(Scriptable* Sender, Trigger* parameters) +{ + ieDword value; + + switch (parameters->int0Parameter) { + case SYSV_SCREENFLAGS: + value = core->GetGameControl()->GetScreenFlags(); + break; + case SYSV_CONTROLSTATUS: + value = core->GetGame()->ControlStatus; + break; + case SYSV_REPUTATION: + value = core->GetGame()->Reputation; + break; + case SYSV_PARTYGOLD: + value = core->GetGame()->PartyGold; + break; + default: + value = 0; + } + + SetVariable(Sender, parameters->string0Parameter, value); + return 1; +} + This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ave...@us...> - 2007-04-09 06:22:04
|
Revision: 4582 http://gemrb.svn.sourceforge.net/gemrb/?rev=4582&view=rev Author: avenger_teambg Date: 2007-04-08 23:22:03 -0700 (Sun, 08 Apr 2007) Log Message: ----------- random treasure tables of type 2dx are now correctly used (example: 2d10 instead of 1d19) Modified Paths: -------------- gemrb/trunk/gemrb/plugins/Core/Interface.cpp gemrb/trunk/gemrb/plugins/Core/Interface.h Modified: gemrb/trunk/gemrb/plugins/Core/Interface.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/Core/Interface.cpp 2007-04-09 05:52:41 UTC (rev 4581) +++ gemrb/trunk/gemrb/plugins/Core/Interface.cpp 2007-04-09 06:22:03 UTC (rev 4582) @@ -4308,11 +4308,8 @@ //well, not anymore, we can use ReleaseFunction int l=tab->GetColumnCount(j); if (l<1) continue; - //we just allocate one more ieResRef for the item count - //itemlist = (ieResRef *) malloc( sizeof(ieResRef) * (l+1) ); - ItemList *itemlist = new ItemList(l); - //ieResRef (9 bytes) is bigger than int (on any platform) - //*(int *) itemlist=l; + int cl = atoi(tab->GetColumnName(0)); + ItemList *itemlist = new ItemList(l, cl); for(int k=0;k<l;k++) { strncpy(itemlist->ResRefs[k],tab->QueryField(j,k),sizeof(ieResRef) ); } @@ -4411,8 +4408,12 @@ return true; } ItemList *itemlist = (ItemList*)lookup; - - i=Roll(1,itemlist->Count,-1); + if (itemlist->WeightOdds) { + //instead of 1d19 we calculate with 2d10 (which also has 19 possible values) + i=Roll(2,(itemlist->Count+1)/2,-2); + } else { + i=Roll(1,itemlist->Count,-1); + } strncpy( NewItem, itemlist->ResRefs[i], sizeof(ieResRef) ); char *p=(char *) strchr(NewItem,'*'); if (p) { Modified: gemrb/trunk/gemrb/plugins/Core/Interface.h =================================================================== --- gemrb/trunk/gemrb/plugins/Core/Interface.h 2007-04-09 05:52:41 UTC (rev 4581) +++ gemrb/trunk/gemrb/plugins/Core/Interface.h 2007-04-09 06:22:03 UTC (rev 4582) @@ -99,10 +99,17 @@ public: ieResRef *ResRefs; unsigned int Count; + //if count is odd and the column titles start with 2, the random roll should be 2d((c+1)/2)-1 + bool WeightOdds; - ItemList(unsigned int size) { + ItemList(unsigned int size, int label) { ResRefs = (ieResRef *) calloc(size, sizeof(ieResRef) ); Count = size; + if ((size&1) && (label==2)) { + WeightOdds=true; + } else { + WeightOdds=false; + } } ~ItemList() { if (ResRefs) { This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ave...@us...> - 2007-04-09 08:44:12
|
Revision: 4583 http://gemrb.svn.sourceforge.net/gemrb/?rev=4583&view=rev Author: avenger_teambg Date: 2007-04-09 01:44:11 -0700 (Mon, 09 Apr 2007) Log Message: ----------- fixed a few leaks Modified Paths: -------------- gemrb/trunk/gemrb/plugins/Core/Actor.cpp gemrb/trunk/gemrb/plugins/Core/Actor.h gemrb/trunk/gemrb/plugins/Core/Interface.cpp gemrb/trunk/gemrb/plugins/Core/Item.cpp Modified: gemrb/trunk/gemrb/plugins/Core/Actor.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/Core/Actor.cpp 2007-04-09 06:22:03 UTC (rev 4582) +++ gemrb/trunk/gemrb/plugins/Core/Actor.cpp 2007-04-09 08:44:11 UTC (rev 4583) @@ -264,6 +264,8 @@ vvcShields[i] = NULL; } } + for (i = 0; i < EXTRA_ACTORCOVERS; i++) + delete extraCovers[i]; } void Actor::SetFistStat(ieDword stat) @@ -2420,8 +2422,8 @@ } void Actor::DrawActorSprite(Region &screen, int cx, int cy, Region& bbox, - SpriteCover*& sc, Animation** anims, - unsigned char Face, Color& tint) + SpriteCover*& newsc, Animation** anims, + unsigned char Face, Color& tint) { CharAnimations* ca = GetAnims(); int PartCount = ca->GetTotalPartCount(); @@ -2438,18 +2440,22 @@ if (anim) nextFrame = anim->GetFrame(anim->GetCurrentFrame()); if (nextFrame && bbox.InsideRegion( vp ) ) { - if (!sc || !sc->Covers(cx, cy, nextFrame->XPos, nextFrame->YPos, nextFrame->Width, nextFrame->Height)) { + if (!newsc || !newsc->Covers(cx, cy, nextFrame->XPos, nextFrame->YPos, nextFrame->Width, nextFrame->Height)) { // the first anim contains the animarea for // the entire multi-part animation - sc = area->BuildSpriteCover(cx, cy, -anims[0]->animArea.x, -anims[0]->animArea.y, anims[0]->animArea.w, anims[0]->animArea.h, WantDither() ); + newsc = area->BuildSpriteCover(cx, + cy, -anims[0]->animArea.x, + -anims[0]->animArea.y, + anims[0]->animArea.w, + anims[0]->animArea.h, WantDither() ); } - assert(sc->Covers(cx, cy, nextFrame->XPos, nextFrame->YPos, nextFrame->Width, nextFrame->Height)); + assert(newsc->Covers(cx, cy, nextFrame->XPos, nextFrame->YPos, nextFrame->Width, nextFrame->Height)); unsigned int flags = TranslucentShadows ? BLIT_TRANSSHADOW : 0; if (!ca->lockPalette) flags|=BLIT_TINTED; video->BlitGameSprite( nextFrame, cx + screen.x, cy + screen.y, - flags, tint, sc, ca->GetPartPalette(partnum), &screen); + flags, tint, newsc, ca->GetPartPalette(partnum), &screen); } } } @@ -2617,7 +2623,7 @@ sbbox.y += 3*OrientdY[dir]; newsc = sc = extraCovers[3+m]; DrawActorSprite(screen, icx, icy, sbbox, newsc, - anims, Face, mirrortint); + anims, Face, mirrortint); if (newsc != sc) { delete sc; extraCovers[3+m] = newsc; @@ -2640,7 +2646,7 @@ blurx += blurdx; blury += blurdy; newsc = sc = extraCovers[i]; DrawActorSprite(screen, blurx, blury, sbbox, newsc, - anims, Face, tint); + anims, Face, tint); if (newsc != sc) { delete sc; extraCovers[i] = newsc; @@ -2663,7 +2669,7 @@ blurx -= blurdx; blury -= blurdy; newsc = sc = extraCovers[i]; DrawActorSprite(screen, blurx, blury, sbbox, newsc, - anims, Face, tint); + anims, Face, tint); if (newsc != sc) { delete sc; extraCovers[i] = newsc; @@ -2686,7 +2692,7 @@ sbbox.y += 3*OrientdY[dir]; newsc = sc = extraCovers[3+m]; DrawActorSprite(screen, icx, icy, sbbox, newsc, - anims, Face, mirrortint); + anims, Face, mirrortint); if (newsc != sc) { delete sc; extraCovers[3+m] = newsc; Modified: gemrb/trunk/gemrb/plugins/Core/Actor.h =================================================================== --- gemrb/trunk/gemrb/plugins/Core/Actor.h 2007-04-09 06:22:03 UTC (rev 4582) +++ gemrb/trunk/gemrb/plugins/Core/Actor.h 2007-04-09 08:44:11 UTC (rev 4583) @@ -189,8 +189,8 @@ /** paint the actor itself. Called internally by Draw() */ void DrawActorSprite(Region &screen, int cx, int cy, Region& bbox, - SpriteCover*& sc, Animation** anims, - unsigned char Face, Color& tint); + SpriteCover*& sc, Animation** anims, + unsigned char Face, Color& tint); /** fixes the palette */ void SetupColors(); Modified: gemrb/trunk/gemrb/plugins/Core/Interface.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/Core/Interface.cpp 2007-04-09 06:22:03 UTC (rev 4582) +++ gemrb/trunk/gemrb/plugins/Core/Interface.cpp 2007-04-09 08:44:11 UTC (rev 4583) @@ -411,7 +411,11 @@ for(i=0;i<4;i++) { video->FreeSprite(WindowFrames[i]); } - + for (int size = 0; size < MAX_CIRCLE_SIZE; size++) { + for(i=0;i<6;i++) { + video->FreeSprite(GroundCircles[size][i]); + } + } if (TooltipBack) { for(i=0;i<3;i++) { //freesprite checks for null pointer Modified: gemrb/trunk/gemrb/plugins/Core/Item.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/Core/Item.cpp 2007-04-09 06:22:03 UTC (rev 4582) +++ gemrb/trunk/gemrb/plugins/Core/Item.cpp 2007-04-09 08:44:11 UTC (rev 4583) @@ -69,7 +69,11 @@ //adding a pulse effect for weapons (PST) if (WieldColor!=0xffff) { if (Flags&IE_ITEM_PULSATING) { - fxqueue->AddEffect( BuildGlowEffect(WieldColor) ); + Effect *tmp = BuildGlowEffect(WieldColor); + if (tmp) { + fxqueue->AddEffect( tmp ); + delete tmp; + } } } return fxqueue; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ave...@us...> - 2007-04-14 16:16:11
|
Revision: 4593 http://gemrb.svn.sourceforge.net/gemrb/?rev=4593&view=rev Author: avenger_teambg Date: 2007-04-14 09:16:12 -0700 (Sat, 14 Apr 2007) Log Message: ----------- added new flag to disable pushing new actions to the action queue this fixes the bg1 cutscene with the sarevok encounter Modified Paths: -------------- gemrb/trunk/gemrb/plugins/Core/Actions.cpp gemrb/trunk/gemrb/plugins/Core/ActorBlock.cpp gemrb/trunk/gemrb/plugins/Core/GameControl.cpp gemrb/trunk/gemrb/plugins/Core/GameControl.h Modified: gemrb/trunk/gemrb/plugins/Core/Actions.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/Core/Actions.cpp 2007-04-14 11:49:04 UTC (rev 4592) +++ gemrb/trunk/gemrb/plugins/Core/Actions.cpp 2007-04-14 16:16:12 UTC (rev 4593) @@ -2849,22 +2849,27 @@ SetVariable( Sender, parameters->string0Parameter, value1 ); } -void GameScript::ClearAllActions(Scriptable* /*Sender*/, Action* /*parameters*/) +void GameScript::ClearAllActions(Scriptable* Sender, Action* /*parameters*/) { - Game* game = core->GetGame(); - - for (int i = 0; i < game->GetPartySize(false); i++) { - Actor* act = game->GetPC( i,false ); - if (act) { - //FIXME: i wonder what clearallactions do - //but in bg1 ch01cut1 doesn't work with this - //clearallactions isn't supposed to clear cutscene actions - //on the other hand, it is supposed to clear all actions - //not only player actions - //act->ClearActions(); + Actor *except = NULL; + if (Sender->Type==ST_ACTOR) { + except = (Actor *) Sender; + } + Map *map = Sender->GetCurrentArea(); + ieDword gametime = core->GetGame()->GameTime; + int i = map->GetActorCount(true); + while(i--) { + Actor* act = map->GetActor(i,true); + if (act && act!=except) { + if (!act->ValidTarget(GA_NO_DEAD) ) { + continue; + } + if (!act->Schedule(gametime) ) { + continue; + } + act->ClearActions(); act->ClearPath(); - //not sure about this - //act->SetModal(MS_NONE); + act->SetModal(MS_NONE); } } } Modified: gemrb/trunk/gemrb/plugins/Core/ActorBlock.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/Core/ActorBlock.cpp 2007-04-14 11:49:04 UTC (rev 4592) +++ gemrb/trunk/gemrb/plugins/Core/ActorBlock.cpp 2007-04-14 16:16:12 UTC (rev 4593) @@ -27,6 +27,7 @@ #include "Item.h" #include "Map.h" #include "Game.h" +#include "GameControl.h" #include <cassert> @@ -226,11 +227,11 @@ void Scriptable::ExecuteScript(GameScript* Script) { -// if (actionQueue.size()) { -// return; -// } + if (core->GetGameControl()->GetScreenFlags()&SF_CUTSCENE) { + return; + } if (WaitCounter) { - return; + return; } if (Script) { Script->Update(); Modified: gemrb/trunk/gemrb/plugins/Core/GameControl.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/Core/GameControl.cpp 2007-04-14 11:49:04 UTC (rev 4592) +++ gemrb/trunk/gemrb/plugins/Core/GameControl.cpp 2007-04-14 16:16:12 UTC (rev 4593) @@ -1400,9 +1400,9 @@ void GameControl::SetCutSceneMode(bool active) { if (active) { - ScreenFlags |= (SF_DISABLEMOUSE | SF_LOCKSCROLL); + ScreenFlags |= (SF_DISABLEMOUSE | SF_LOCKSCROLL | SF_CUTSCENE); } else { - ScreenFlags &= ~(SF_DISABLEMOUSE | SF_LOCKSCROLL); + ScreenFlags &= ~(SF_DISABLEMOUSE | SF_LOCKSCROLL | SF_CUTSCENE); } } Modified: gemrb/trunk/gemrb/plugins/Core/GameControl.h =================================================================== --- gemrb/trunk/gemrb/plugins/Core/GameControl.h 2007-04-14 11:49:04 UTC (rev 4592) +++ gemrb/trunk/gemrb/plugins/Core/GameControl.h 2007-04-14 16:16:12 UTC (rev 4593) @@ -60,11 +60,12 @@ //screen flags // !!! Keep these synchronized with GUIDefines.py !!! -#define SF_DISABLEMOUSE 1 -#define SF_CENTERONACTOR 2 +#define SF_DISABLEMOUSE 1 //no mouse cursor +#define SF_CENTERONACTOR 2 // #define SF_ALWAYSCENTER 4 -#define SF_GUIENABLED 8 -#define SF_LOCKSCROLL 16 +#define SF_GUIENABLED 8 // +#define SF_LOCKSCROLL 16 //don't scroll +#define SF_CUTSCENE 32 //don't push new actions onto the action queue // target modes // !!! Keep these synchronized with GUIDefines.py !!! This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <wjp...@us...> - 2007-04-15 14:17:53
|
Revision: 4598 http://gemrb.svn.sourceforge.net/gemrb/?rev=4598&view=rev Author: wjpalenstijn Date: 2007-04-15 07:17:54 -0700 (Sun, 15 Apr 2007) Log Message: ----------- merge SetupCompleteRGBModification into SetupGlobalRGBModification; cleanup Modified Paths: -------------- gemrb/trunk/gemrb/plugins/Core/CharAnimations.cpp gemrb/trunk/gemrb/plugins/Core/Palette.cpp gemrb/trunk/gemrb/plugins/Core/Palette.h gemrb/trunk/gemrb/plugins/Core/ScriptedAnimation.cpp Modified: gemrb/trunk/gemrb/plugins/Core/CharAnimations.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/Core/CharAnimations.cpp 2007-04-15 12:00:05 UTC (rev 4597) +++ gemrb/trunk/gemrb/plugins/Core/CharAnimations.cpp 2007-04-15 14:17:54 UTC (rev 4598) @@ -238,38 +238,40 @@ } if (GetAnimType() >= IE_ANI_PST_ANIMATION_1) { - if (type!=PAL_MAIN) { + // Only do main palette + if (type != PAL_MAIN) { return; } // TODO: handle equipment colour glows - //Colors[6] is the COLORCOUNT stat in PST - //it tells how many customisable color slots we have - //the color slots start from the end of the palette and go - //backwards There are 5 available slots with a size of 32 each + // Colors[6] is the COLORCOUNT stat in PST. + // It tells how many customisable color slots we have. + // The color slots start from the end of the palette and go + // backwards. There are 6 available slots with a size of 32 each. + int colorcount = Colors[6]; int size = 32; - int dest = 256-Colors[6]*size; + int dest = 256-colorcount*size; bool needmod = false; if (GlobalColorMod.type != RGBModifier::NONE) { needmod = true; } - if ((Colors[6] == 0) && (needmod==false) ) { + if ((colorcount == 0) && (needmod==false) ) { core->FreePalette(palette[PAL_MAIN], PaletteResRef); PaletteResRef[0]=0; + // FIXME: apply GlobalColorMod? return; } - - for (unsigned int i = 0; i < Colors[6]; i++) { - core->GetPalette( Colors[i]&255, size, - &palette[PAL_MAIN]->col[dest] ); - dest +=size; + for (int i = 0; i < colorcount; i++) { + core->GetPalette( Colors[i]&255, size, + &palette[PAL_MAIN]->col[dest] ); + dest +=size; } if (GlobalColorMod.type != RGBModifier::NONE) { if (!modifiedPalette[PAL_MAIN]) modifiedPalette[PAL_MAIN] = new Palette(); //pst needs all color slots changed, luckily i already made this function - modifiedPalette[PAL_MAIN]->SetupCompleteRGBModification(palette[PAL_MAIN], GlobalColorMod); + modifiedPalette[PAL_MAIN]->SetupGlobalRGBModification(palette[PAL_MAIN], GlobalColorMod); } return; } @@ -298,7 +300,7 @@ if (needmod) { if (!modifiedPalette[PAL_MAIN]) modifiedPalette[PAL_MAIN] = new Palette(); - modifiedPalette[PAL_MAIN]->SetupCompleteRGBModification(palette[PAL_MAIN], GlobalColorMod); + modifiedPalette[PAL_MAIN]->SetupGlobalRGBModification(palette[PAL_MAIN], GlobalColorMod); } return; } Modified: gemrb/trunk/gemrb/plugins/Core/Palette.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/Core/Palette.cpp 2007-04-15 12:00:05 UTC (rev 4597) +++ gemrb/trunk/gemrb/plugins/Core/Palette.cpp 2007-04-15 14:17:54 UTC (rev 4598) @@ -234,30 +234,10 @@ const RGBModifier& mod) { int i; - for (i = 0; i < 4; ++i) - col[i] = src->col[i]; - - for (i = 0; i < 164; ++i) - applyMod(src->col[0x04+i],col[0x04+i],mod); - - for (i = 0; i < 8; ++i) - col[0xA8+i] = src->col[0xA8+i]; - - for (i = 0; i < 80; ++i) - applyMod(src->col[0xB0+i],col[0xB0+i],mod); - - -} - -//only the shadow and transparent slot isn't tinted -void Palette::SetupCompleteRGBModification(const Palette* src, - const RGBModifier& mod) -{ - int i; - + // don't modify the transparency and shadow colour for (i = 0; i < 2; ++i) col[i] = src->col[i]; - for (i = 0; i < 254; ++i) - applyMod(src->col[0x02+i],col[0x02+i],mod); + for (i = 2; i < 256; ++i) + applyMod(src->col[i],col[i],mod); } Modified: gemrb/trunk/gemrb/plugins/Core/Palette.h =================================================================== --- gemrb/trunk/gemrb/plugins/Core/Palette.h 2007-04-15 12:00:05 UTC (rev 4597) +++ gemrb/trunk/gemrb/plugins/Core/Palette.h 2007-04-15 14:17:54 UTC (rev 4598) @@ -101,8 +101,6 @@ unsigned int type); void SetupGlobalRGBModification(const Palette* src, const RGBModifier& mod); - void SetupCompleteRGBModification(const Palette* src, - const RGBModifier& mod); Palette* Copy(); Modified: gemrb/trunk/gemrb/plugins/Core/ScriptedAnimation.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/Core/ScriptedAnimation.cpp 2007-04-15 12:00:05 UTC (rev 4597) +++ gemrb/trunk/gemrb/plugins/Core/ScriptedAnimation.cpp 2007-04-15 14:17:54 UTC (rev 4598) @@ -616,7 +616,7 @@ GetPaletteCopy(); if (!palette) return; - palette->SetupCompleteRGBModification(palette,mod); + palette->SetupGlobalRGBModification(palette,mod); if (twin) { twin->AlterPalette(mod); } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ave...@us...> - 2007-04-28 13:20:56
|
Revision: 4613 http://gemrb.svn.sourceforge.net/gemrb/?rev=4613&view=rev Author: avenger_teambg Date: 2007-04-28 06:20:57 -0700 (Sat, 28 Apr 2007) Log Message: ----------- added RemoveSpell(spellid) Modified Paths: -------------- gemrb/trunk/gemrb/plugins/Core/Spellbook.cpp gemrb/trunk/gemrb/plugins/Core/Spellbook.h Modified: gemrb/trunk/gemrb/plugins/Core/Spellbook.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/Core/Spellbook.cpp 2007-04-28 07:32:50 UTC (rev 4612) +++ gemrb/trunk/gemrb/plugins/Core/Spellbook.cpp 2007-04-28 13:20:57 UTC (rev 4613) @@ -172,7 +172,7 @@ if (ms->Flags) { if (atoi(ms->SpellResRef+4)==spellid) { if (flags&HS_DEPLETE) { - ms->Flags=0; + DepleteSpell(ms); } return true; } @@ -195,7 +195,7 @@ continue; } if (flags&HS_DEPLETE) { - ms->Flags=0; + DepleteSpell(ms); } return true; } @@ -260,6 +260,38 @@ return (unsigned int) spells[type][level]->known_spells.size(); } +void Spellbook::RemoveSpell(int spellid) +{ + int type = spellid/1000; + if (type>4) { + return; + } + type = sections[type]; + spellid = spellid % 1000; + std::vector< CRESpellMemorization* >::iterator sm; + for (sm = spells[type].begin(); sm != spells[type].end(); sm++) { + std::vector< CREKnownSpell* >::iterator ks; + + for (ks = (*sm)->known_spells.begin(); ks != (*sm)->known_spells.end(); ks++) { + if (atoi((*ks)->SpellResRef+4)==spellid) { + delete *ks; + (*sm)->known_spells.erase(ks); + ks--; + } + } + + std::vector< CREMemorizedSpell* >::iterator ms; + + for (ms = (*sm)->memorized_spells.begin(); ms != (*sm)->memorized_spells.end(); ms++) { + if (atoi((*ms)->SpellResRef+4)==spellid) { + delete *ms; + (*sm)->memorized_spells.erase(ms); + ms--; + } + } + } +} + //removes spell from both memorized/book void Spellbook::RemoveSpell(ieResRef ResRef) { @@ -437,7 +469,7 @@ if (*s == spell) { delete *s; (*sm)->memorized_spells.erase( s ); - ClearSpellInfo(); + ClearSpellInfo(); return true; } } @@ -688,8 +720,8 @@ ieDword level = 0; SpellExtHeader *seh = FindSpellInfo(sm->Level, sm->Type, slot->SpellResRef); if (seh) { - seh->count++; - continue; + seh->count++; + continue; } seh = new SpellExtHeader; spellinfo.push_back( seh ); @@ -698,9 +730,9 @@ int ehc; for(ehc=0;ehc<spl->ExtHeaderCount-1;ehc++) { - if (level<spl->ext_headers[ehc+1].RequiredLevel) { - break; - } + if (level<spl->ext_headers[ehc+1].RequiredLevel) { + break; + } } SPLExtHeader *ext_header = spl->ext_headers+ehc; seh->headerindex = ehc; Modified: gemrb/trunk/gemrb/plugins/Core/Spellbook.h =================================================================== --- gemrb/trunk/gemrb/plugins/Core/Spellbook.h 2007-04-28 07:32:50 UTC (rev 4612) +++ gemrb/trunk/gemrb/plugins/Core/Spellbook.h 2007-04-28 13:20:57 UTC (rev 4613) @@ -170,6 +170,8 @@ unsigned int GetKnownSpellsCount(int type, unsigned int level) const; /** removes a spell from memory/book */ void RemoveSpell(ieResRef ResRef); + void RemoveSpell(int spellid); + /** adds a spell to the book */ bool AddKnownSpell(int type, unsigned int level, CREKnownSpell *spl); CREKnownSpell* GetKnownSpell(int type, unsigned int level, unsigned int index) const; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ave...@us...> - 2007-04-29 23:27:17
|
Revision: 4622 http://gemrb.svn.sourceforge.net/gemrb/?rev=4622&view=rev Author: avenger_teambg Date: 2007-04-29 16:27:18 -0700 (Sun, 29 Apr 2007) Log Message: ----------- fixed trigger behaviour when a variable is not yet existing (will always return false) Modified Paths: -------------- gemrb/trunk/gemrb/plugins/Core/Actor.cpp gemrb/trunk/gemrb/plugins/Core/GSUtils.cpp gemrb/trunk/gemrb/plugins/Core/GSUtils.h gemrb/trunk/gemrb/plugins/Core/Triggers.cpp Modified: gemrb/trunk/gemrb/plugins/Core/Actor.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/Core/Actor.cpp 2007-04-29 13:00:48 UTC (rev 4621) +++ gemrb/trunk/gemrb/plugins/Core/Actor.cpp 2007-04-29 23:27:18 UTC (rev 4622) @@ -1105,9 +1105,9 @@ if (first) { InternalFlags|=IF_INITIALIZED; } else { - memcpy( previous, Modified, MAX_STATS * sizeof( *Modified ) ); + memcpy( previous, Modified, MAX_STATS * sizeof( ieDword ) ); } - memcpy( Modified, BaseStats, MAX_STATS * sizeof( *Modified ) ); + memcpy( Modified, BaseStats, MAX_STATS * sizeof( ieDword ) ); CharAnimations* anims = GetAnims(); if (anims) { Modified: gemrb/trunk/gemrb/plugins/Core/GSUtils.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/Core/GSUtils.cpp 2007-04-29 13:00:48 UTC (rev 4621) +++ gemrb/trunk/gemrb/plugins/Core/GSUtils.cpp 2007-04-29 23:27:18 UTC (rev 4622) @@ -1840,7 +1840,7 @@ } } -ieDword CheckVariable(Scriptable* Sender, const char* VarName) +ieDword CheckVariable(Scriptable* Sender, const char* VarName, bool *valid) { char newVarName[8]; ieDword value = 0; @@ -1873,13 +1873,16 @@ Map *map=game->GetMap(game->FindMap(newVarName)); if (map) { map->locals->Lookup( &VarName[6], value); + } else { + if (*valid) { + *valid=false; + } + if (InDebug&ID_VARIABLES) { + printMessage("GameScript"," ",YELLOW); + printf("Invalid variable %s in checkvariable\n",VarName); + } } - else if (InDebug&ID_VARIABLES) { - printMessage("GameScript"," ",YELLOW); - printf("Invalid variable %s in checkvariable\n",VarName); - } - } - else { + } else { game->locals->Lookup( &VarName[6], value ); } if (InDebug&ID_VARIABLES) { @@ -1888,7 +1891,7 @@ return value; } -ieDword CheckVariable(Scriptable* Sender, const char* VarName, const char* Context) +ieDword CheckVariable(Scriptable* Sender, const char* VarName, const char* Context, bool *valid) { char newVarName[8]; ieDword value = 0; @@ -1921,11 +1924,15 @@ Map *map=game->GetMap(game->FindMap(newVarName)); if (map) { map->locals->Lookup( VarName, value); + } else { + if (*valid) { + *valid=false; + } + if (InDebug&ID_VARIABLES) { + printMessage("GameScript"," ",YELLOW); + printf("Invalid variable %s %s in checkvariable\n",Context, VarName); + } } - else if (InDebug&ID_VARIABLES) { - printMessage("GameScript"," ",YELLOW); - printf("Invalid variable %s %s in checkvariable\n",Context, VarName); - } } else { game->locals->Lookup( VarName, value ); } Modified: gemrb/trunk/gemrb/plugins/Core/GSUtils.h =================================================================== --- gemrb/trunk/gemrb/plugins/Core/GSUtils.h 2007-04-29 13:00:48 UTC (rev 4621) +++ gemrb/trunk/gemrb/plugins/Core/GSUtils.h 2007-04-29 23:27:18 UTC (rev 4622) @@ -106,8 +106,8 @@ GEM_EXPORT void DisplayStringCore(Scriptable* Sender, int Strref, int flags); GEM_EXPORT void SetVariable(Scriptable* Sender, const char* VarName, const char* Context, ieDword value); GEM_EXPORT void MoveBetweenAreasCore(Actor* actor, const char *area, Point &position, int face, bool adjust); -GEM_EXPORT ieDword CheckVariable(Scriptable* Sender, const char* VarName); -GEM_EXPORT ieDword CheckVariable(Scriptable* Sender, const char* VarName, const char* Context); +GEM_EXPORT ieDword CheckVariable(Scriptable* Sender, const char* VarName, bool *valid = NULL); +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); Modified: gemrb/trunk/gemrb/plugins/Core/Triggers.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/Core/Triggers.cpp 2007-04-29 13:00:48 UTC (rev 4621) +++ gemrb/trunk/gemrb/plugins/Core/Triggers.cpp 2007-04-29 23:27:18 UTC (rev 4622) @@ -397,56 +397,109 @@ int GameScript::BitCheck(Scriptable* Sender, Trigger* parameters) { - ieDword value = CheckVariable(Sender, parameters->string0Parameter ); - return ( value& parameters->int0Parameter ) !=0; + bool valid; + + ieDword value = CheckVariable(Sender, parameters->string0Parameter, &valid ); + if (valid) { + if ( value & parameters->int0Parameter ) return 1; + } + return 0; } int GameScript::BitCheckExact(Scriptable* Sender, Trigger* parameters) { - ieDword value = CheckVariable(Sender, parameters->string0Parameter ); - return (value & parameters->int0Parameter ) == (ieDword) parameters->int0Parameter; + bool valid; + + ieDword value = CheckVariable(Sender, parameters->string0Parameter, &valid ); + if (valid) { + ieDword tmp = (ieDword) parameters->int0Parameter ; + if ((value & tmp) == tmp) return 1; + } + return 0; } //BM_OR would make sense only if this trigger changes the value of the variable //should I do that??? int GameScript::BitGlobal_Trigger(Scriptable* Sender, Trigger* parameters) { - ieDword value = CheckVariable(Sender, parameters->string0Parameter ); - HandleBitMod(value, parameters->int0Parameter, parameters->int1Parameter); - //set the variable here if BitGlobal_Trigger really does that - //SetVariable(Sender, parameters->string0Parameter, value); - return value!=0; + bool valid; + + ieDword value = CheckVariable(Sender, parameters->string0Parameter, &valid ); + if (valid) { + HandleBitMod(value, parameters->int0Parameter, parameters->int1Parameter); + if (value!=0) return 1; + } + return 0; } int GameScript::GlobalOrGlobal_Trigger(Scriptable* Sender, Trigger* parameters) { - ieDword value1 = CheckVariable(Sender, parameters->string0Parameter ); - if ( value1 ) return 1; - ieDword value2 = CheckVariable(Sender, parameters->string1Parameter ); - if ( value2 ) return 1; + bool valid; + + ieDword value1 = CheckVariable(Sender, parameters->string0Parameter, &valid ); + if (valid) { + if ( value1 ) return 1; + ieDword value2 = CheckVariable(Sender, parameters->string1Parameter, &valid ); + if (valid) { + if ( value2 ) return 1; + } + } return 0; } +int GameScript::GlobalAndGlobal_Trigger(Scriptable* Sender, Trigger* parameters) +{ + bool valid; + + ieDword value1 = CheckVariable( Sender, parameters->string0Parameter, &valid ); + if (valid && value1) { + ieDword value2 = CheckVariable( Sender, parameters->string1Parameter, &valid ); + if (valid && value2) return 1; + } + return 0; +} + int GameScript::GlobalBAndGlobal_Trigger(Scriptable* Sender, Trigger* parameters) { - ieDword value1 = CheckVariable(Sender, parameters->string0Parameter ); - ieDword value2 = CheckVariable(Sender, parameters->string1Parameter ); - return ( value1& value2 ) != 0; + bool valid; + + ieDword value1 = CheckVariable(Sender, parameters->string0Parameter, &valid ); + if (valid) { + ieDword value2 = CheckVariable(Sender, parameters->string1Parameter, &valid ); + if (valid) { + if ((value1& value2 ) != 0) return 1; + } + } + return 0; } int GameScript::GlobalBAndGlobalExact(Scriptable* Sender, Trigger* parameters) { - ieDword value1 = CheckVariable(Sender, parameters->string0Parameter ); - ieDword value2 = CheckVariable(Sender, parameters->string1Parameter ); - return ( value1& value2 ) == value2; + bool valid; + + ieDword value1 = CheckVariable(Sender, parameters->string0Parameter, &valid ); + if (valid) { + ieDword value2 = CheckVariable(Sender, parameters->string1Parameter, &valid ); + if (valid) { + if (( value1& value2 ) == value2) return 1; + } + } + return 0; } int GameScript::GlobalBitGlobal_Trigger(Scriptable* Sender, Trigger* parameters) { - ieDword value1 = CheckVariable(Sender, parameters->string0Parameter ); - ieDword value2 = CheckVariable(Sender, parameters->string1Parameter ); - HandleBitMod( value1, value2, parameters->int1Parameter); - return value1!=0; + bool valid; + + ieDword value1 = CheckVariable(Sender, parameters->string0Parameter, &valid ); + if (valid) { + ieDword value2 = CheckVariable(Sender, parameters->string1Parameter, &valid ); + if (valid) { + HandleBitMod( value1, value2, parameters->int1Parameter); + if (value1!=0) return 1; + } + } + return 0; } //no what exactly this trigger would do, defined in iwd2, but never used @@ -460,8 +513,13 @@ //would this function also alter the variable? int GameScript::Xor(Scriptable* Sender, Trigger* parameters) { - ieDword value = CheckVariable(Sender, parameters->string0Parameter ); - return ( value ^ parameters->int0Parameter ) != 0; + bool valid; + + ieDword value = CheckVariable(Sender, parameters->string0Parameter, &valid ); + if (valid) { + if (( value ^ parameters->int0Parameter ) != 0) return 1; + } + return 0; } int GameScript::NumDead(Scriptable* Sender, Trigger* parameters) @@ -515,8 +573,13 @@ int GameScript::Global(Scriptable* Sender, Trigger* parameters) { - long value = CheckVariable(Sender, parameters->string0Parameter ); - return ( value == parameters->int0Parameter ); + bool valid; + + long value = CheckVariable(Sender, parameters->string0Parameter, &valid ); + if (valid) { + if ( value == parameters->int0Parameter ) return 1; + } + return 0; } int GameScript::GLT_Trigger(Scriptable* Sender, Trigger* parameters) @@ -527,8 +590,13 @@ int GameScript::GlobalLT(Scriptable* Sender, Trigger* parameters) { - long value = CheckVariable(Sender, parameters->string0Parameter ); - return ( value < parameters->int0Parameter ); + bool valid; + + long value = CheckVariable(Sender, parameters->string0Parameter, &valid ); + if (valid) { + if ( value < parameters->int0Parameter ) return 1; + } + return 0; } int GameScript::GGT_Trigger(Scriptable* Sender, Trigger* parameters) @@ -539,22 +607,41 @@ int GameScript::GlobalGT(Scriptable* Sender, Trigger* parameters) { - long value = CheckVariable(Sender, parameters->string0Parameter ); - return ( value > parameters->int0Parameter ); + bool valid; + + long value = CheckVariable(Sender, parameters->string0Parameter, &valid ); + if (valid) { + if ( value > parameters->int0Parameter ) return 1; + } + return 0; } int GameScript::GlobalLTGlobal(Scriptable* Sender, Trigger* parameters) { - long value1 = CheckVariable(Sender, parameters->string0Parameter ); - long value2 = CheckVariable(Sender, parameters->string1Parameter ); - return ( value1 < value2 ); + bool valid; + + long value1 = CheckVariable(Sender, parameters->string0Parameter, &valid ); + if (valid) { + long value2 = CheckVariable(Sender, parameters->string1Parameter, &valid ); + if (valid) { + if ( value1 < value2 ) return 1; + } + } + return 0; } int GameScript::GlobalGTGlobal(Scriptable* Sender, Trigger* parameters) { - long value1 = CheckVariable(Sender, parameters->string0Parameter ); - long value2 = CheckVariable(Sender, parameters->string1Parameter ); - return ( value1 > value2 ); + bool valid; + + long value1 = CheckVariable(Sender, parameters->string0Parameter, &valid ); + if (valid) { + long value2 = CheckVariable(Sender, parameters->string1Parameter, &valid ); + if (valid) { + if ( value1 > value2 ) return 1; + } + } + return 0; } int GameScript::GlobalsEqual(Scriptable* Sender, Trigger* parameters) @@ -601,57 +688,83 @@ int GameScript::RealGlobalTimerExact(Scriptable* Sender, Trigger* parameters) { - ieDword value1 = CheckVariable(Sender, parameters->string0Parameter, parameters->string1Parameter ); - if (!value1) return 0; - ieDword value2 = core->GetGame()->RealTime; - return ( value1 == value2 ); + bool valid; + + ieDword value1 = CheckVariable(Sender, parameters->string0Parameter, parameters->string1Parameter, &valid ); + if (valid && value1) { + ieDword value2 = core->GetGame()->RealTime; + if ( value1 == value2 ) return 1; + } + return 0; } int GameScript::RealGlobalTimerExpired(Scriptable* Sender, Trigger* parameters) { - ieDword value1 = CheckVariable(Sender, parameters->string0Parameter, parameters->string1Parameter ); - if (!value1) return 0; - ieDword value2 = core->GetGame()->RealTime; - return ( value1 < value2 ); + bool valid; + + ieDword value1 = CheckVariable(Sender, parameters->string0Parameter, parameters->string1Parameter, &valid ); + if (valid && value1) { + if ( value1 < core->GetGame()->RealTime ) return 1; + } + return 0; } int GameScript::RealGlobalTimerNotExpired(Scriptable* Sender, Trigger* parameters) { - ieDword value1 = CheckVariable(Sender, parameters->string0Parameter, parameters->string1Parameter ); - if (!value1) return 0; - ieDword value2 = core->GetGame()->RealTime; - return ( value1 > value2 ); + bool valid; + + ieDword value1 = CheckVariable(Sender, parameters->string0Parameter, parameters->string1Parameter, &valid ); + if (valid && value1) { + if ( value1 > core->GetGame()->RealTime ) return 1; + } + return 0; } int GameScript::GlobalTimerExact(Scriptable* Sender, Trigger* parameters) { - ieDword value1 = CheckVariable(Sender, parameters->string0Parameter, parameters->string1Parameter ); - if (!value1) return 0; - return ( value1 == core->GetGame()->GameTime ); + bool valid; + + ieDword value1 = CheckVariable(Sender, parameters->string0Parameter, parameters->string1Parameter, &valid ); + if (valid) { + if ( value1 == core->GetGame()->GameTime ) return 1; + } + return 0; } int GameScript::GlobalTimerExpired(Scriptable* Sender, Trigger* parameters) { - ieDword value1 = CheckVariable(Sender, parameters->string0Parameter, parameters->string1Parameter ); - if (!value1) return 0; - return ( value1 < core->GetGame()->GameTime ); + bool valid; + + ieDword value1 = CheckVariable(Sender, parameters->string0Parameter, parameters->string1Parameter, &valid ); + if (valid && value1) { + if ( value1 < core->GetGame()->GameTime ) return 1; + } + return 0; } //globaltimernotexpired returns false if the timer doesn't exist int GameScript::GlobalTimerNotExpired(Scriptable* Sender, Trigger* parameters) { - ieDword value1 = CheckVariable(Sender, parameters->string0Parameter, parameters->string1Parameter ); - if (!value1) return 0; - return ( value1 > core->GetGame()->GameTime ); + bool valid; + + ieDword value1 = CheckVariable(Sender, parameters->string0Parameter, parameters->string1Parameter, &valid ); + if (valid && value1) { + if ( value1 > core->GetGame()->GameTime ) return 1; + } + return 0; } //globaltimerstarted returns false if the timer doesn't exist //is it the same as globaltimernotexpired? int GameScript::GlobalTimerStarted(Scriptable* Sender, Trigger* parameters) { - ieDword value1 = CheckVariable(Sender, parameters->string0Parameter, parameters->string1Parameter ); - if (!value1) return 0; - return ( value1 > core->GetGame()->GameTime ); + bool valid; + + ieDword value1 = CheckVariable(Sender, parameters->string0Parameter, parameters->string1Parameter, &valid ); + if (valid && value1) { + if ( value1 > core->GetGame()->GameTime ) return 1; + } + return 0; } int GameScript::WasInDialog(Scriptable* Sender, Trigger* /*parameters*/) @@ -2021,7 +2134,7 @@ } /* i believe this trigger is the same as 'MarkObject' action - except that if it cannot set the marked object, it returns false */ + except that if it cannot set the marked object, it returns false */ int GameScript::SetLastMarkedObject(Scriptable* Sender, Trigger* parameters) { if (Sender->Type != ST_ACTOR) { @@ -2651,13 +2764,6 @@ return tar->textDisplaying; } -int GameScript::GlobalAndGlobal_Trigger(Scriptable* Sender, Trigger* parameters) -{ - ieDword value1 = CheckVariable( Sender, parameters->string0Parameter ); - ieDword value2 = CheckVariable( Sender, parameters->string1Parameter ); - return (value1 && value2)!=0; //should be 1 or 0! -} - int GameScript::InCutSceneMode(Scriptable* /*Sender*/, Trigger* /*parameters*/) { return core->InCutSceneMode(); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ave...@us...> - 2007-05-03 17:49:40
|
Revision: 4633 http://gemrb.svn.sourceforge.net/gemrb/?rev=4633&view=rev Author: avenger_teambg Date: 2007-05-03 10:49:39 -0700 (Thu, 03 May 2007) Log Message: ----------- implemented spell bonus correctly (with wisdom bonus for clerics) Modified Paths: -------------- gemrb/trunk/gemrb/plugins/Core/Actor.cpp gemrb/trunk/gemrb/plugins/Core/Button.cpp gemrb/trunk/gemrb/plugins/Core/Spellbook.cpp gemrb/trunk/gemrb/plugins/Core/Spellbook.h Modified: gemrb/trunk/gemrb/plugins/Core/Actor.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/Core/Actor.cpp 2007-05-01 19:37:42 UTC (rev 4632) +++ gemrb/trunk/gemrb/plugins/Core/Actor.cpp 2007-05-03 17:49:39 UTC (rev 4633) @@ -149,6 +149,8 @@ #define OV_BOUNCE2 7 //bouncing activated static ieResRef overlay[OVERLAY_COUNT]={"SPENTACI","SANCTRY","MINORGLB","SPSHIELD", "GREASED","WEBENTD","SPTURNI2","SPTURNI"}; +static int *mxsplwis = NULL; +static int spllevels; //for every game except IWD2 we need to reverse TOHIT static bool REVERSE_TOHIT=true; @@ -164,6 +166,12 @@ void ReleaseMemoryActor() { + if (mxsplwis) { + //calloc'd x*y integer matrix + free (mxsplwis); + mxsplwis = NULL; + } + if (fistres) { delete [] fistres; fistres = NULL; @@ -908,6 +916,22 @@ } core->DelTable( table ); } + + table = core->LoadTable( "mxsplwis" ); + tm = core->GetTable( table ); + if (tm) { + spllevels = tm->GetColumnCount(0); + int max = core->GetMaximumAbility(); + mxsplwis = (int *) calloc(max*spllevels, sizeof(int)); + for (i = 0 ; i < spllevels; i++) { + for(int j = 0; j < max; j++) { + int k = atoi(tm->GetRowName(j))-1; + if (k>=0 && k<max) { + mxsplwis[k*spllevels+i]=atoi(tm->QueryField(j,i)); + } + } + } + } } void Actor::add_animation(const ieResRef resource, int gradient, int height, int flags) @@ -1017,7 +1041,7 @@ //maximize the base stat if ( maximum_values[StatIndex]>0) { if ( (signed) Value>maximum_values[StatIndex]) { - Value = (ieDword) maximum_values[StatIndex]; + Value = (ieDword) maximum_values[StatIndex]; } } @@ -1105,18 +1129,10 @@ { ieDword previous[MAX_STATS]; - bool first = !(InternalFlags&IF_INITIALIZED); - + //put all special cleanup calls here if (PCStats) { memset( PCStats->PortraitIcons, -1, sizeof(PCStats->PortraitIcons) ); } - if (first) { - InternalFlags|=IF_INITIALIZED; - } else { - memcpy( previous, Modified, MAX_STATS * sizeof( ieDword ) ); - } - memcpy( Modified, BaseStats, MAX_STATS * sizeof( ieDword ) ); - CharAnimations* anims = GetAnims(); if (anims) { unsigned int location; @@ -1125,7 +1141,18 @@ anims->ColorMods[location].speed = 0; } } + spellbook.ClearBonus(); + //initialize base stats + bool first = !(InternalFlags&IF_INITIALIZED); + + if (first) { + InternalFlags|=IF_INITIALIZED; + } else { + memcpy( previous, Modified, MAX_STATS * sizeof( ieDword ) ); + } + memcpy( Modified, BaseStats, MAX_STATS * sizeof( ieDword ) ); + fxqueue.ApplyAllEffects( this ); //calculate hp bonus @@ -1161,6 +1188,13 @@ } } } + //add wisdom bonus spells + if (!spellbook.IsIWDSpellBook() && mxsplwis) { + int level = Modified[IE_WIS]; + if (level--) { + spellbook.BonusSpells(IE_SPELL_TYPE_PRIEST, spllevels, mxsplwis+spllevels*level); + } + } } void Actor::RollSaves() Modified: gemrb/trunk/gemrb/plugins/Core/Button.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/Core/Button.cpp 2007-05-01 19:37:42 UTC (rev 4632) +++ gemrb/trunk/gemrb/plugins/Core/Button.cpp 2007-05-03 17:49:39 UTC (rev 4633) @@ -377,9 +377,11 @@ return; } +/* spellbooks need the LOCKED state processing these events if (State == IE_GUI_BUTTON_LOCKED) { return; } +*/ if (Button == GEM_MB_ACTION) { if ((Mod & GEM_MOD_SHIFT) && ButtonOnShiftPress[0]) Modified: gemrb/trunk/gemrb/plugins/Core/Spellbook.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/Core/Spellbook.cpp 2007-05-01 19:37:42 UTC (rev 4632) +++ gemrb/trunk/gemrb/plugins/Core/Spellbook.cpp 2007-05-03 17:49:39 UTC (rev 4633) @@ -34,6 +34,7 @@ static bool SBInitialized = false; static int NUM_SPELL_TYPES = 3; static bool IWD2Style = false; + /* temporarily out static ieResRef *ResolveSpellName(ieDword index) { @@ -286,14 +287,14 @@ std::vector< CREKnownSpell* >::iterator ks; for (ks = (*sm)->known_spells.begin(); ks != (*sm)->known_spells.end(); ks++) { if (*ks == spell) { - ieResRef ResRef; - - memcpy(ResRef, (*ks)->SpellResRef, sizeof(ieResRef) ); - delete *ks; - (*sm)->known_spells.erase(ks); - RemoveMemorization(*sm, ResRef); - ClearSpellInfo(); - return true; + ieResRef ResRef; + + memcpy(ResRef, (*ks)->SpellResRef, sizeof(ieResRef) ); + delete *ks; + (*sm)->known_spells.erase(ks); + RemoveMemorization(*sm, ResRef); + ClearSpellInfo(); + return true; } } } @@ -426,6 +427,32 @@ return true; } +//apply the wisdom bonus on all spell levels for type +//count is optimally the count of spell levels +void Spellbook::BonusSpells(int type, int count, int *bonuses) +{ + int level = GetSpellLevelCount(type); + if (level>count) level=count; + while(level--) { + CRESpellMemorization* sm = spells[type][level]; + sm->Number2+=bonuses[level]; + } +} + +//call this in every ai cycle when recalculating spell bonus +//TODO:add in wisdom bonus here +void Spellbook::ClearBonus() +{ + int type; + + for(type=0;type<NUM_SPELL_TYPES;type++) { + for(int level = GetSpellLevelCount(type); level--;) { + CRESpellMemorization* sm = spells[type][level]; + sm->Number2=sm->Number; + } + } +} + //if bonus is not set, then sets the base value (adjusts bonus too) //if bonus is set, then sets only the bonus // if the bonus value is 0, then the bonus is double base value Modified: gemrb/trunk/gemrb/plugins/Core/Spellbook.h =================================================================== --- gemrb/trunk/gemrb/plugins/Core/Spellbook.h 2007-05-01 19:37:42 UTC (rev 4632) +++ gemrb/trunk/gemrb/plugins/Core/Spellbook.h 2007-05-03 17:49:39 UTC (rev 4633) @@ -170,6 +170,10 @@ unsigned int GetTotalKnownSpellsCount() const; unsigned int GetTotalMemorizedSpellsCount() const; unsigned int GetKnownSpellsCount(int type, unsigned int level) const; + /** adds the priest slot bonuses from mxsplwis */ + void BonusSpells(int type, int count, int *bonuses); + /** clears up the spell bonuses before recalculation */ + void ClearBonus(); /** removes a spell from memory/book */ bool RemoveSpell(CREKnownSpell* spell); /** this removes ALL spells of name ResRef */ This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ave...@us...> - 2007-05-11 17:07:18
|
Revision: 4650 http://gemrb.svn.sourceforge.net/gemrb/?rev=4650&view=rev Author: avenger_teambg Date: 2007-05-11 10:07:17 -0700 (Fri, 11 May 2007) Log Message: ----------- implemented flying projectile flag cleaned up preparing blend in vvc/projectile fixed palette handling in projectile Modified Paths: -------------- gemrb/trunk/gemrb/plugins/Core/Projectile.cpp gemrb/trunk/gemrb/plugins/Core/Projectile.h gemrb/trunk/gemrb/plugins/Core/ScriptedAnimation.cpp gemrb/trunk/gemrb/plugins/Core/ScriptedAnimation.h Modified: gemrb/trunk/gemrb/plugins/Core/Projectile.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/Core/Projectile.cpp 2007-05-09 21:42:29 UTC (rev 4649) +++ gemrb/trunk/gemrb/plugins/Core/Projectile.cpp 2007-05-11 17:07:17 UTC (rev 4650) @@ -44,6 +44,7 @@ Extension = NULL; area = NULL; palette = NULL; + PaletteRes[0]=0; //shadpal = NULL; Pos.empty(); Destination = Pos; @@ -64,7 +65,7 @@ if (effects) { delete effects; } - core->FreePalette(palette); + core->FreePalette(palette, PaletteRes); //core->FreePalette(shadpal); ClearPath(); } @@ -134,15 +135,36 @@ for (int i=0;i<7;i++) { Colors[i]=gradients[i]; } - Sprite2D* spr = anim[0]->GetFrame(0); - if (spr) { - pal = core->GetVideoDriver()->GetPalette(spr)->Copy(); - } + GetPaletteCopy(anim, pal); if (pal) { pal->SetupPaperdollColours(Colors, 0); } } +void Projectile::GetPaletteCopy(Animation *anim[], Palette *&pal) +{ + if (pal) + return; + for (unsigned int i=0;i<MAX_ORIENT;i++) { + if (anim[i]) { + Sprite2D* spr = anim[i]->GetFrame(0); + if (spr) { + pal = core->GetVideoDriver()->GetPalette(spr)->Copy(); + } + } + } +} + +void Projectile::SetBlend() +{ + GetPaletteCopy(travel, palette); + if (!palette) + return; + if (!palette->alpha) { + palette->CreateShadedAlphaChannel(); + } +} + // load animations, start sound void Projectile::Setup() { @@ -151,10 +173,16 @@ memset(travel,0,sizeof(travel)); memset(shadow,0,sizeof(shadow)); light = NULL; + CreateAnimations(travel, BAMRes1, Seq1); + if (TFlags&PTF_COLOUR) { SetupPalette(travel, palette, Gradients); + } else { + core->FreePalette(palette, PaletteRes); + palette=core->GetPalette(PaletteRes); } + if (TFlags&PTF_SHADOW) { CreateAnimations(shadow, BAMRes2, Seq2); //if (TFlags&PTF_SHADOWCOLOR) { @@ -164,9 +192,9 @@ if (TFlags&PTF_LIGHT) { //light = CreateLight(LightX, LightY, LightZ); } - //just for sure - core->FreePalette(palette); - palette=core->GetPalette(PaletteRes); + if (TFlags&PTF_BLEND) { + SetBlend(); + } } //control the phase change when the projectile reached its target @@ -369,7 +397,7 @@ return; case P_TRIGGER: if (Extension->AFlags&PAF_VISIBLE) { - DrawTravel(screen); + DrawTravel(screen); } CheckTrigger(Extension->TriggerRadius); case P_TRAVEL: @@ -419,9 +447,6 @@ area->AddProjectile(pro, Pos, Pos); } } -/* - Video *video = core->GetVideoDriver(); -*/ } int Projectile::GetTravelPos(int face) @@ -454,23 +479,32 @@ { Video *video = core->GetVideoDriver(); ieDword flag = 0; + Color tint = {128,128,128,255}; unsigned int face = GetNextFace(); if (face!=Orientation) { SetPos(face, GetTravelPos(face), GetShadowPos(face)); } - if (travel[face]) { - Sprite2D *frame = travel[face]->NextFrame(); - video->BlitGameSprite( frame, Pos.x + screen.x, Pos.y + screen.y, flag, tint, NULL, palette, &screen); - } + Point pos = Pos; + pos.x+=screen.x; + pos.y+=screen.y; if (shadow[face]) { Sprite2D *frame = shadow[face]->NextFrame(); - video->BlitGameSprite( frame, Pos.x + screen.x, Pos.y + screen.y, flag, tint, NULL, NULL, &screen); + video->BlitGameSprite( frame, pos.x, pos.y, flag, tint, NULL, NULL, &screen); } - if (light) { - video->BlitGameSprite( light, Pos.x + screen.x, Pos.y + screen.y, flag, tint, NULL, NULL, &screen); + video->BlitGameSprite( light, pos.x, pos.y, flag, tint, NULL, NULL, &screen); } + + if (SFlags&PSF_FLYING) { + pos.y-=FLY_HEIGHT; + } + + if (travel[face]) { + Sprite2D *frame = travel[face]->NextFrame(); + video->BlitGameSprite( frame, pos.x, pos.y, flag, tint, NULL, palette, &screen); + } + } Modified: gemrb/trunk/gemrb/plugins/Core/Projectile.h =================================================================== --- gemrb/trunk/gemrb/plugins/Core/Projectile.h 2007-05-09 21:42:29 UTC (rev 4649) +++ gemrb/trunk/gemrb/plugins/Core/Projectile.h 2007-05-11 17:07:17 UTC (rev 4650) @@ -8,12 +8,12 @@ * * 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 + * 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. + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * $Id$ * @@ -32,7 +32,7 @@ #include "../../includes/ie_types.h" #include "Palette.h" #include "PathFinder.h" -#include "CharAnimations.h" //contains MAX_ORIENT +#include "CharAnimations.h" //contains MAX_ORIENT #include "Map.h" #ifdef WIN32 @@ -47,6 +47,9 @@ #define GEM_EXPORT #endif +//this is the height of the projectile when Spark Flag Fly = 1 +#define FLY_HEIGHT 50 + //projectile phases #define P_UNINITED -1 #define P_TRAVEL 0 //projectile moves to target @@ -174,6 +177,9 @@ } //no idea if projectiles got height, using y inline int GetHeight() const { + if (SFlags&PSF_FLYING) { + return Pos.y+FLY_HEIGHT; + } return Pos.y; } @@ -215,6 +221,8 @@ //draw object void Draw(Region &screen); private: + void GetPaletteCopy(Animation *anim[], Palette *&pal); + void SetBlend(); void CheckTrigger(unsigned int radius); void DrawTravel(Region &screen); void DrawExplosion(Region &screen); Modified: gemrb/trunk/gemrb/plugins/Core/ScriptedAnimation.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/Core/ScriptedAnimation.cpp 2007-05-09 21:42:29 UTC (rev 4649) +++ gemrb/trunk/gemrb/plugins/Core/ScriptedAnimation.cpp 2007-05-11 17:07:17 UTC (rev 4650) @@ -111,16 +111,6 @@ if (Transparency&IE_VVC_MIRRORY) { anim->MirrorAnimationVert(); } - - //make this the last if possible, because of the return - if (Transparency&IE_VVC_BLENDED) { - GetPaletteCopy(); - if (!palette) - return; - if (!palette->alpha) { - palette->CreateShadedAlphaChannel(); - } - } } /* Creating animation from BAM */ @@ -338,6 +328,7 @@ anims[p_release]->Flags |= S_ANI_PLAYONCE; } } + PreparePalette(); } //copying resource name to the object, so it could be referenced by it @@ -600,19 +591,24 @@ return false; } -void ScriptedAnimation::SetBlend() +void ScriptedAnimation::PreparePalette() { - Transparency |= IE_VVC_BLENDED; - - for(unsigned int i=0;i<3*MAX_ORIENT;i++) { - if (anims[i]) { - //don't call mirror again - PrepareAnimation(anims[i], IE_VVC_BLENDED); + if (Transparency&IE_VVC_BLENDED) { + GetPaletteCopy(); + if (!palette) + return; + if (!palette->alpha) { + palette->CreateShadedAlphaChannel(); } } - if (twin) { +} + +void ScriptedAnimation::SetBlend() +{ + Transparency |= IE_VVC_BLENDED; + PreparePalette(); + if (twin) twin->SetBlend(); - } } void ScriptedAnimation::SetFade(ieByte initial, int speed) Modified: gemrb/trunk/gemrb/plugins/Core/ScriptedAnimation.h =================================================================== --- gemrb/trunk/gemrb/plugins/Core/ScriptedAnimation.h 2007-05-09 21:42:29 UTC (rev 4649) +++ gemrb/trunk/gemrb/plugins/Core/ScriptedAnimation.h 2007-05-11 17:07:17 UTC (rev 4650) @@ -111,6 +111,7 @@ ScriptedAnimation *DetachTwin(); private: void PrepareAnimation(Animation *anim, ieDword Transparency); + void PreparePalette(); bool HandlePhase(Sprite2D *&frame); void GetPaletteCopy(); }; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ave...@us...> - 2007-05-12 18:32:34
|
Revision: 4657 http://gemrb.svn.sourceforge.net/gemrb/?rev=4657&view=rev Author: avenger_teambg Date: 2007-05-12 11:32:35 -0700 (Sat, 12 May 2007) Log Message: ----------- added casting glow (timing is not correct yet) Modified Paths: -------------- gemrb/trunk/gemrb/plugins/Core/ActorBlock.cpp gemrb/trunk/gemrb/plugins/Core/EffectQueue.cpp gemrb/trunk/gemrb/plugins/Core/Spell.cpp gemrb/trunk/gemrb/plugins/Core/Spell.h Modified: gemrb/trunk/gemrb/plugins/Core/ActorBlock.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/Core/ActorBlock.cpp 2007-05-12 18:11:35 UTC (rev 4656) +++ gemrb/trunk/gemrb/plugins/Core/ActorBlock.cpp 2007-05-12 18:32:35 UTC (rev 4657) @@ -609,17 +609,18 @@ } //cfb - int level = 0; if (Type==ST_ACTOR) { + int level = ((Actor *) this)->GetXPLevel(true); + SpellHeader = spl->GetHeaderIndexFromLevel(level); Actor *actor = (Actor *) this; - EffectQueue *fxqueue=spl->GetEffectBlock(-1); + EffectQueue *fxqueue=spl->GetEffectBlock(-1, SpellHeader); fxqueue->SetOwner(actor); - fxqueue->ApplyAllEffects(actor); + fxqueue->AddAllEffects(actor, actor->Pos); delete fxqueue; - level = ((Actor *) this)->GetXPLevel(true); + } else { + SpellHeader = 0; } - SpellHeader = spl->GetHeaderIndexFromLevel(level); SPLExtHeader *header = spl->GetExtHeader(SpellHeader); SetWait(header->CastingTime*AI_UPDATE_TIME); core->FreeSpell(spl, SpellResRef, false); Modified: gemrb/trunk/gemrb/plugins/Core/EffectQueue.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/Core/EffectQueue.cpp 2007-05-12 18:11:35 UTC (rev 4656) +++ gemrb/trunk/gemrb/plugins/Core/EffectQueue.cpp 2007-05-12 18:32:35 UTC (rev 4657) @@ -33,22 +33,7 @@ static EffectRef effect_refs[MAX_EFFECTS]; static int opcodes_count = 0; -/* -#define FX_DURATION_INSTANT_LIMITED 0 -#define FX_DURATION_INSTANT_PERMANENT 1 -#define FX_DURATION_INSTANT_WHILE_EQUIPPED 2 -#define FX_DURATION_DELAY_LIMITED 3 //this contains a relative onset time (delay) also used as duration, transforms to 6 when applied -#define FX_DURATION_DELAY_PERMANENT 4 //this transforms to 7 (i guess) -#define FX_DURATION_DELAY_UNSAVED 5 //this transforms to 8 -#define FX_DURATION_DELAY_LIMITED_PENDING 6 //this contains an absolute onset time and a duration -#define FX_DURATION_AFTER_EXPIRES 7 //this is a delayed non permanent effect (resolves to JUST_EXPIRED) -#define FX_DURATION_PERMANENT_UNSAVED 8 -#define FX_DURATION_INSTANT_PERMANENT_AFTER_BONUSES 9//this is a special permanent -#define FX_DURATION_JUST_EXPIRED 10 -#define MAX_TIMING_MODE 11 -*/ - bool EffectQueue::match_ids(Actor *target, int table, ieDword value) { if (value == 0) { @@ -333,6 +318,8 @@ fx->Parameter1=param1; fx->Parameter2=param2; fx->TimingMode=timing; + fx->PosX=0xffffffff; + fx->PosY=0xffffffff; return fx; } @@ -719,9 +706,9 @@ ieDword GameTime = core->GetGame()->GameTime; if (first_apply) { - if ((fx->PosX==0xffff) && (fx->PosY==0xffff)) { - fx->PosX = (ieWord) target->Pos.x; - fx->PosY = (ieWord) target->Pos.y; + if ((fx->PosX==0xffffffff) && (fx->PosY==0xffffffff)) { + fx->PosX = target->Pos.x; + fx->PosY = target->Pos.y; } //the effect didn't pass the probability check if (!check_probability(fx) ) { Modified: gemrb/trunk/gemrb/plugins/Core/Spell.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/Core/Spell.cpp 2007-05-12 18:11:35 UTC (rev 4656) +++ gemrb/trunk/gemrb/plugins/Core/Spell.cpp 2007-05-12 18:32:35 UTC (rev 4657) @@ -62,7 +62,9 @@ //-1 will return cfb //0 will always return first spell block //otherwise set to caster level -EffectQueue *Spell::GetEffectBlock(int block_index) const +static EffectRef fx_casting_glow_ref={"CastingGlow",NULL,-1}; + +EffectQueue *Spell::GetEffectBlock(int block_index, int ext_index) const { Effect *features; int count; @@ -81,7 +83,14 @@ count = CastingFeatureCount; } EffectQueue *fxqueue = new EffectQueue(); - + + //add casting glow + if (block_index==-1) { + assert(ext_index>=0); + Effect *fx = EffectQueue::CreateEffect(fx_casting_glow_ref, 0, CastingGraphics, FX_DURATION_INSTANT_LIMITED); + fx->Duration=ext_headers[ext_index].CastingTime; + fxqueue->AddEffect(fx); + } for (int i=0;i<count;i++) { if (Flags & SF_SIMPLIFIED_DURATION) { //hack the effect according to Level Modified: gemrb/trunk/gemrb/plugins/Core/Spell.h =================================================================== --- gemrb/trunk/gemrb/plugins/Core/Spell.h 2007-05-12 18:11:35 UTC (rev 4656) +++ gemrb/trunk/gemrb/plugins/Core/Spell.h 2007-05-12 18:32:35 UTC (rev 4657) @@ -8,12 +8,12 @@ * * 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 + * 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. + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * $Id$ * @@ -50,14 +50,14 @@ //values for Spell usability Flags -#define SF_HOSTILE 0x400 -#define SF_NO_LOS 0x800 -#define SF_NOT_INDOORS 0x2000 -#define SF_HLA 0x4000 // probably this means a nonmagical ability -#define SF_TRIGGER 0x8000 +#define SF_HOSTILE 0x400 +#define SF_NO_LOS 0x800 +#define SF_NOT_INDOORS 0x2000 +#define SF_HLA 0x4000 // probably this means a nonmagical ability +#define SF_TRIGGER 0x8000 #define SF_NOT_IN_COMBAT 0x10000 //this is a relocated bit (used in iwd2 as 0x4000) -#define SF_SIMPLIFIED_DURATION 0x40 +#define SF_SIMPLIFIED_DURATION 0x40 //spelltypes in spells #define IE_SPL_ITEM 0 @@ -167,7 +167,7 @@ //converts a wanted level to block index count int GetHeaderIndexFromLevel(int level) const; //-1 will return the cfb - EffectQueue *GetEffectBlock(int block_index) const; + EffectQueue *GetEffectBlock(int block_index, int ext_index=-1) const; //returns a projectile created from an extended header Projectile *GetProjectile(int headerindex) const; }; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ave...@us...> - 2007-05-26 21:41:00
|
Revision: 4667 http://gemrb.svn.sourceforge.net/gemrb/?rev=4667&view=rev Author: avenger_teambg Date: 2007-05-26 14:41:00 -0700 (Sat, 26 May 2007) Log Message: ----------- setting stolen flag in pickpocket action and unstealable flag in takeitem* action Modified Paths: -------------- gemrb/trunk/gemrb/plugins/Core/Actions.cpp gemrb/trunk/gemrb/plugins/Core/GSUtils.cpp gemrb/trunk/gemrb/plugins/Core/GSUtils.h Modified: gemrb/trunk/gemrb/plugins/Core/Actions.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/Core/Actions.cpp 2007-05-26 17:54:32 UTC (rev 4666) +++ gemrb/trunk/gemrb/plugins/Core/Actions.cpp 2007-05-26 21:41:00 UTC (rev 4667) @@ -3397,7 +3397,7 @@ void GameScript::GetItem(Scriptable* Sender, Action* parameters) { Scriptable* tar = GetActorFromObject( Sender, parameters->objects[1] ); - MoveItemCore(tar, Sender, parameters->string0Parameter,0); + MoveItemCore(tar, Sender, parameters->string0Parameter,0,0); } //getting one single item @@ -3406,7 +3406,7 @@ Game *game=core->GetGame(); int i=game->GetPartySize(false); while (i--) { - int res=MoveItemCore(game->GetPC(i,false), Sender, parameters->string0Parameter,0); + int res=MoveItemCore(game->GetPC(i,false), Sender, parameters->string0Parameter,0,IE_INV_ITEM_UNSTEALABLE); if (res!=MIC_NOITEM) return; } } @@ -3418,7 +3418,7 @@ Game *game=core->GetGame(); int i=game->GetPartySize(false); while (i--) { - int res=MoveItemCore(game->GetPC(i,false), Sender, parameters->string0Parameter,0); + int res=MoveItemCore(game->GetPC(i,false), Sender, parameters->string0Parameter,0, IE_INV_ITEM_UNSTEALABLE); if (res == MIC_GOTITEM) { i++; count--; @@ -3434,7 +3434,7 @@ while (i--) { Actor *ac = game->GetPC(i,false); if (Distance(Sender, ac)<MAX_OPERATING_DISTANCE) { - while (MoveItemCore(ac, Sender, parameters->string0Parameter,0)==MIC_GOTITEM); + while (MoveItemCore(ac, Sender, parameters->string0Parameter,0,IE_INV_ITEM_UNSTEALABLE)==MIC_GOTITEM); } } } @@ -3444,7 +3444,7 @@ Game *game=core->GetGame(); int i=game->GetPartySize(false); while (i--) { - while (MoveItemCore(game->GetPC(i,false), Sender, parameters->string0Parameter,0)==MIC_GOTITEM); + while (MoveItemCore(game->GetPC(i,false), Sender, parameters->string0Parameter,0, IE_INV_ITEM_UNSTEALABLE)==MIC_GOTITEM); } } @@ -3452,7 +3452,7 @@ void GameScript::GiveItem(Scriptable *Sender, Action* parameters) { Scriptable* tar = GetActorFromObject( Sender, parameters->objects[1] ); - MoveItemCore(Sender, tar, parameters->string0Parameter,0); + MoveItemCore(Sender, tar, parameters->string0Parameter,0,0); } //this action creates an item in a container or a creature @@ -3661,7 +3661,7 @@ int i = game->GetPartySize(false); while (i--) { Actor *tar = game->GetPC(i,false); - while(MoveItemCore(Sender, tar, "",0)!=MIC_NOITEM); + while(MoveItemCore(Sender, tar, "",0,0)!=MIC_NOITEM); } } @@ -3689,7 +3689,7 @@ } //move all movable item from the target to the Sender //the rest will be dropped at the feet of Sender - while(MoveItemCore(tar, Sender, "",0)!=MIC_NOITEM); + while(MoveItemCore(tar, Sender, "",0,0)!=MIC_NOITEM); } void GameScript::MoveInventory(Scriptable *Sender, Action* parameters) @@ -3704,7 +3704,7 @@ } //move all movable item from the target to the Sender //the rest will be dropped at the feet of Sender - while(MoveItemCore(src, tar, "",0)!=MIC_NOITEM); + while(MoveItemCore(src, tar, "",0,0)!=MIC_NOITEM); } void GameScript::PickPockets(Scriptable *Sender, Action* parameters) @@ -3752,7 +3752,7 @@ return; } // now this is a kind of giveitem - MoveItemCore(tar, Sender, "", slot); + MoveItemCore(tar, Sender, "", IE_INV_ITEM_UNSTEALABLE|IE_INV_ITEM_EQUIPPED, IE_INV_ITEM_STOLEN); Sender->ReleaseCurrentAction(); } @@ -3770,7 +3770,7 @@ if (tab) { int rows = tab->GetRowCount(); for (int i=0;i<rows;i++) { - MoveItemCore(tar, Sender, tab->QueryField(i,0), 0); + MoveItemCore(tar, Sender, tab->QueryField(i,0), 0, IE_INV_ITEM_UNSTEALABLE); } } core->DelTable(table); @@ -3790,7 +3790,7 @@ int j = game->GetPartySize(false); while (j--) { Actor *tar = game->GetPC(j, false); - MoveItemCore(tar, Sender, tab->QueryField(i,0), 0); + MoveItemCore(tar, Sender, tab->QueryField(i,0), 0, IE_INV_ITEM_UNSTEALABLE); } } } Modified: gemrb/trunk/gemrb/plugins/Core/GSUtils.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/Core/GSUtils.cpp 2007-05-26 17:54:32 UTC (rev 4666) +++ gemrb/trunk/gemrb/plugins/Core/GSUtils.cpp 2007-05-26 21:41:00 UTC (rev 4667) @@ -409,7 +409,7 @@ //transfering item from Sender to target //if target has no inventory, the item will be destructed //if target can't get it, it will be dropped at its feet -int MoveItemCore(Scriptable *Sender, Scriptable *target, const char *resref, int flags) +int MoveItemCore(Scriptable *Sender, Scriptable *target, const char *resref, int flags, int setflag) { Inventory *myinv; Map *map; @@ -433,6 +433,9 @@ if (!item) { return MIC_NOITEM; } + + item->Flags|=setflag; + switch(target->Type) { case ST_ACTOR: myinv=&((Actor *) target)->inventory; Modified: gemrb/trunk/gemrb/plugins/Core/GSUtils.h =================================================================== --- gemrb/trunk/gemrb/plugins/Core/GSUtils.h 2007-05-26 17:54:32 UTC (rev 4666) +++ gemrb/trunk/gemrb/plugins/Core/GSUtils.h 2007-05-26 21:41:00 UTC (rev 4667) @@ -57,7 +57,7 @@ Targets* GetAllObjects(Scriptable* Sender, Object* oC, int ga_flags); Scriptable* GetActorFromObject(Scriptable* Sender, Object* oC, int ga_flags = 0); int SeeCore(Scriptable* Sender, Trigger* parameters, int justlos); -int MoveItemCore(Scriptable *Sender, Scriptable *target, const char *resref, int flags); +int MoveItemCore(Scriptable *Sender, Scriptable *target, const char *resref, int flags, int setflag); void MoveToObjectCore(Scriptable *Sender, Action *parameters, ieDword flags, bool untilsee); void CreateItemCore(CREItem *item, const char *resref, int a, int b, int c); void AttackCore(Scriptable *Sender, Scriptable *target, Action *parameters, int flags); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ave...@us...> - 2007-05-29 19:07:17
|
Revision: 4676 http://gemrb.svn.sourceforge.net/gemrb/?rev=4676&view=rev Author: avenger_teambg Date: 2007-05-29 12:07:10 -0700 (Tue, 29 May 2007) Log Message: ----------- fixed some more gui event problems Modified Paths: -------------- gemrb/trunk/gemrb/plugins/Core/EventMgr.cpp gemrb/trunk/gemrb/plugins/Core/Window.cpp Modified: gemrb/trunk/gemrb/plugins/Core/EventMgr.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/Core/EventMgr.cpp 2007-05-29 18:37:57 UTC (rev 4675) +++ gemrb/trunk/gemrb/plugins/Core/EventMgr.cpp 2007-05-29 19:07:10 UTC (rev 4676) @@ -159,13 +159,15 @@ //Let's check if we have a Control under the Mouse Pointer Control* ctrl = win->GetControl( x, y, true ); //look for the low priority flagged controls (mostly static labels) - if (ctrl != NULL) { + if (ctrl == NULL) { ctrl = win->GetControl( x, y, false ); } if (ctrl != win->GetOver()) { // Remove tooltip if mouse moved to different control core->DisplayTooltip( 0, 0, NULL ); - last_win_focused->OnMouseLeave( x, y ); + if (last_win_over) { + last_win_over->OnMouseLeave( x, y ); + } last_win_over = win; win->OnMouseEnter( x, y, ctrl ); } @@ -207,7 +209,6 @@ if (!ctrl) { ctrl = ( *m )->GetControl( x, y, false); } - //printf( "dn: ctrl: %p\n", ctrl ); last_win_focused = *m; if (ctrl != NULL) { last_win_focused->SetFocused( ctrl ); @@ -228,7 +229,6 @@ unsigned char Button, unsigned short Mod) { MButtons &= ~Button; - //printf( "up lastF: %p\n", lastF ); if (last_win_focused == NULL) return; Control *last_ctrl_focused = last_win_focused->GetFocus(); if (last_ctrl_focused == NULL) return; Modified: gemrb/trunk/gemrb/plugins/Core/Window.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/Core/Window.cpp 2007-05-29 18:37:57 UTC (rev 4675) +++ gemrb/trunk/gemrb/plugins/Core/Window.cpp 2007-05-29 19:07:10 UTC (rev 4676) @@ -354,9 +354,12 @@ void Window::OnMouseLeave(unsigned short x, unsigned short y) { +printf("window::OnMOUSELEAVE\n"); if (!lastOver) { +printf("lastover was null\n"); return; } +printf("Calling lastover onmouseleave\n"); lastOver->OnMouseLeave( x - XPos - lastOver->XPos, y - YPos - lastOver->YPos ); lastOver = NULL; } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ave...@us...> - 2007-06-07 17:03:03
|
Revision: 4686 http://gemrb.svn.sourceforge.net/gemrb/?rev=4686&view=rev Author: avenger_teambg Date: 2007-06-07 10:03:03 -0700 (Thu, 07 Jun 2007) Log Message: ----------- fixed a compilation problem for gcc 4.2.0 Modified Paths: -------------- gemrb/trunk/gemrb/plugins/Core/ActorBlock.cpp gemrb/trunk/gemrb/plugins/Core/ActorBlock.h gemrb/trunk/gemrb/plugins/Core/GameScript.cpp gemrb/trunk/gemrb/plugins/Core/GameScript.h Modified: gemrb/trunk/gemrb/plugins/Core/ActorBlock.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/Core/ActorBlock.cpp 2007-06-07 16:36:12 UTC (rev 4685) +++ gemrb/trunk/gemrb/plugins/Core/ActorBlock.cpp 2007-06-07 17:03:03 UTC (rev 4686) @@ -134,7 +134,7 @@ area = map; } -void Scriptable::SetScript(ieResRef aScript, int idx) +void Scriptable::SetScript(const ieResRef aScript, int idx) { if (idx >= MAX_SCRIPTS) { printMessage("Scriptable","Invalid script index!",LIGHT_RED); Modified: gemrb/trunk/gemrb/plugins/Core/ActorBlock.h =================================================================== --- gemrb/trunk/gemrb/plugins/Core/ActorBlock.h 2007-06-07 16:36:12 UTC (rev 4685) +++ gemrb/trunk/gemrb/plugins/Core/ActorBlock.h 2007-06-07 17:03:03 UTC (rev 4686) @@ -206,7 +206,7 @@ void SetDialog(const char *resref) { strnuprcpy(Dialog, resref, 8); } - void SetScript(ieResRef aScript, int idx); + void SetScript(const ieResRef aScript, int idx); void SetWait(unsigned long time); unsigned long GetWait(); void LeaveDialog(); Modified: gemrb/trunk/gemrb/plugins/Core/GameScript.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/Core/GameScript.cpp 2007-06-07 16:36:12 UTC (rev 4685) +++ gemrb/trunk/gemrb/plugins/Core/GameScript.cpp 2007-06-07 17:03:03 UTC (rev 4686) @@ -1182,7 +1182,7 @@ } /********************** GameScript *******************************/ -GameScript::GameScript(ieResRef ResRef, ScriptableType ScriptType, +GameScript::GameScript(const ieResRef ResRef, ScriptableType ScriptType, Variables* local, int ScriptLevel) { if (local) { Modified: gemrb/trunk/gemrb/plugins/Core/GameScript.h =================================================================== --- gemrb/trunk/gemrb/plugins/Core/GameScript.h 2007-06-07 16:36:12 UTC (rev 4685) +++ gemrb/trunk/gemrb/plugins/Core/GameScript.h 2007-06-07 17:03:03 UTC (rev 4686) @@ -627,7 +627,7 @@ // bool continueExecution; bool freeLocals; public: - GameScript(ieResRef ResRef, ScriptableType ScriptType, + GameScript(const ieResRef ResRef, ScriptableType ScriptType, Variables* local = NULL, int ScriptLevel = 0); ~GameScript(); static void ReleaseMemory(); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |