From: <ave...@us...> - 2008-10-08 20:30:36
|
Revision: 5414 http://gemrb.svn.sourceforge.net/gemrb/?rev=5414&view=rev Author: avenger_teambg Date: 2008-10-08 20:30:26 +0000 (Wed, 08 Oct 2008) Log Message: ----------- removed possible infinite loop problem with calling SelectionChanged fixed magic weapon equipping/creation added some comments Modified Paths: -------------- gemrb/trunk/gemrb/plugins/Core/Actions.cpp gemrb/trunk/gemrb/plugins/Core/Game.cpp gemrb/trunk/gemrb/plugins/Core/Interface.cpp gemrb/trunk/gemrb/plugins/Core/Interface.h gemrb/trunk/gemrb/plugins/Core/Inventory.cpp gemrb/trunk/gemrb/plugins/FXOpcodes/FXOpc.cpp Modified: gemrb/trunk/gemrb/plugins/Core/Actions.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/Core/Actions.cpp 2008-10-08 18:39:33 UTC (rev 5413) +++ gemrb/trunk/gemrb/plugins/Core/Actions.cpp 2008-10-08 20:30:26 UTC (rev 5414) @@ -2078,6 +2078,8 @@ actor->SetOrientation( GetOrient( *otherp, actor->Pos ), false); if (door->Flags&DOOR_LOCKED) { const char *Key = door->GetKey(); + //TODO: the original engine allowed opening of a door when the + //key was on any of the partymembers if (!Key || !actor->inventory.HasItem(Key,0) ) { //playsound unsuccessful opening of door core->PlaySound(DS_OPEN_FAIL); Modified: gemrb/trunk/gemrb/plugins/Core/Game.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/Core/Game.cpp 2008-10-08 18:39:33 UTC (rev 5413) +++ gemrb/trunk/gemrb/plugins/Core/Game.cpp 2008-10-08 20:30:26 UTC (rev 5414) @@ -445,8 +445,9 @@ } } - if (! (flags & SELECT_QUIET)) { - core->GetGUIScriptEngine()->RunFunction( "SelectionChanged" ); + if (! (flags & SELECT_QUIET)) { + core->SetEventFlag(EF_SELECTION); + //core->GetGUIScriptEngine()->RunFunction( "SelectionChanged" ); } return true; } @@ -480,7 +481,8 @@ } if (! (flags & SELECT_QUIET)) { - core->GetGUIScriptEngine()->RunFunction( "SelectionChanged" ); + core->SetEventFlag(EF_SELECTION); + //core->GetGUIScriptEngine()->RunFunction( "SelectionChanged" ); } return true; } Modified: gemrb/trunk/gemrb/plugins/Core/Interface.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/Core/Interface.cpp 2008-10-08 18:39:33 UTC (rev 5413) +++ gemrb/trunk/gemrb/plugins/Core/Interface.cpp 2008-10-08 20:30:26 UTC (rev 5414) @@ -516,6 +516,11 @@ gc=NULL; } + if (EventFlag&EF_SELECTION) { + EventFlag&=~EF_SELECTION; + guiscript->RunFunction( "SelectionChanged", false); + } + if (EventFlag&EF_UPDATEANIM) { EventFlag&=~EF_UPDATEANIM; guiscript->RunFunction( "UpdateAnimation", false); Modified: gemrb/trunk/gemrb/plugins/Core/Interface.h =================================================================== --- gemrb/trunk/gemrb/plugins/Core/Interface.h 2008-10-08 18:39:33 UTC (rev 5413) +++ gemrb/trunk/gemrb/plugins/Core/Interface.h 2008-10-08 20:30:26 UTC (rev 5414) @@ -161,6 +161,7 @@ #define EF_UPDATEANIM 8 //updates avatar animation #define EF_SEQUENCER 16 //starts sequencer/contingency creation #define EF_IDENTIFY 32 //starts identify screen +#define EF_SELECTION 64 //selection changed //autopause #define AP_UNUSABLE 0 Modified: gemrb/trunk/gemrb/plugins/Core/Inventory.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/Core/Inventory.cpp 2008-10-08 18:39:33 UTC (rev 5413) +++ gemrb/trunk/gemrb/plugins/Core/Inventory.cpp 2008-10-08 20:30:26 UTC (rev 5414) @@ -320,6 +320,7 @@ if (!itm) { return; } +printf("Equipped is: %d\n", Equipped); ItemExcl &= ~itm->ItemExcl; switch (effect) { @@ -331,8 +332,12 @@ // reset Equipped if it was the removed item if (Equipped+SLOT_MELEE == (int)index) Equipped = IW_NO_EQUIPPED; - if (Equipped < 0 && FindRangedWeapon() == SLOT_FIST) - Equipped = IW_NO_EQUIPPED; + // reset Equipped if it is a ranged weapon slot + // but not magic weapon slot! + if (Equipped != SLOT_MAGIC-SLOT_MELEE) { + if (Equipped < 0 && FindRangedWeapon() == SLOT_FIST) + Equipped = IW_NO_EQUIPPED; + } UpdateWeaponAnimation(); break; @@ -346,6 +351,7 @@ } break; } +printf("Equipped is: %d\n", Equipped); core->FreeItem(itm, item->ItemResRef, false); } /** if resref is "", then destroy ALL items @@ -464,9 +470,11 @@ InvalidSlot(slot); } + //check for equipping weapons if (WhyCantEquip(slot,twohanded)) { return ASI_FAILED; } + if (!Slots[slot]) { item->Flags |= IE_INV_ITEM_ACQUIRED; Slots[slot] = item; @@ -1040,26 +1048,30 @@ bool Inventory::SetEquippedSlot(int slotcode) { - if (Equipped != IW_NO_EQUIPPED) { - RemoveSlotEffects( SLOT_MELEE+Equipped); - } - - //doesn't work if magic slot is used - if (HasItemInSlot("",SLOT_MAGIC)) { + //doesn't work if magic slot is used, refresh the magic slot just in case + if (HasItemInSlot("",SLOT_MAGIC) && (slotcode!=SLOT_MAGIC-SLOT_MELEE)) { Equipped = SLOT_MAGIC-SLOT_MELEE; + UpdateWeaponAnimation(); return false; } - if (slotcode == IW_NO_EQUIPPED) { + //unequipping (fist slot will be used now) + if (slotcode == IW_NO_EQUIPPED || !HasItemInSlot("",slotcode+SLOT_MELEE)) { + if (Equipped != IW_NO_EQUIPPED) { + RemoveSlotEffects( SLOT_MELEE+Equipped); + } Equipped = IW_NO_EQUIPPED; + //fist slot equipping effects + AddSlotEffects(0); UpdateWeaponAnimation(); return true; } - if (!HasItemInSlot("",slotcode+SLOT_MELEE)) { - Equipped = IW_NO_EQUIPPED; - UpdateWeaponAnimation(); - return true; + + //equipping a weapon, but remove its effects first + if (Equipped != IW_NO_EQUIPPED) { + RemoveSlotEffects( SLOT_MELEE+Equipped); } + Equipped = slotcode; int effects = core->QuerySlotEffects( SLOT_MELEE+Equipped ); if (effects) { @@ -1220,6 +1232,11 @@ char AnimationType[2]={0,0}; ieWord MeleeAnimation[3]={100,0,0}; + //cannot change equipment when holding magic weapons + if (Equipped == SLOT_MELEE-SLOT_MAGIC) { + return; + } + if (flags&EQUIP_RANGED) { for(i=SLOT_RANGED;i<LAST_RANGED;i++) { const Item *itm = GetItemPointer(i, Slot); @@ -1421,6 +1438,8 @@ if (itm) core->FreeItem( itm, Slot->ItemResRef, false ); Owner->SetUsedWeapon(AnimationType, MeleeAnimation, WeaponType); + //update the weapon animation + core->SetEventFlag(EF_SELECTION); } //this function will also check disabled slots (if that feature will be imped) @@ -1451,6 +1470,17 @@ int Inventory::WhyCantEquip(int slot, int twohanded) const { + // check only for hand slots + if ((slot<SLOT_MELEE || slot>LAST_MELEE) && (slot != SLOT_LEFT) ) { + return 0; + } + + //magic items have the highest priority + if ( HasItemInSlot("", GetMagicSlot())) { + //magic weapon is in use + return STR_MAGICWEAPON; + } + //can't equip in shield slot if a weapon slot is twohanded for (int i=SLOT_MELEE; i<=LAST_MELEE;i++) { //see GetShieldSlot @@ -1482,9 +1512,5 @@ return STR_OFFHAND_USED; } } - if ( HasItemInSlot("", GetMagicSlot())) { - //magic weapon is in use - return STR_MAGICWEAPON; - } return 0; } Modified: gemrb/trunk/gemrb/plugins/FXOpcodes/FXOpc.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/FXOpcodes/FXOpc.cpp 2008-10-08 18:39:33 UTC (rev 5413) +++ gemrb/trunk/gemrb/plugins/FXOpcodes/FXOpc.cpp 2008-10-08 20:30:26 UTC (rev 5414) @@ -2736,6 +2736,8 @@ { //charge count is incorrect target->inventory.SetSlotItemRes(fx->Resource, target->inventory.GetMagicSlot(),fx->Parameter1,fx->Parameter3,fx->Parameter4); + //equip the weapon + target->inventory.SetEquippedSlot(target->inventory.GetMagicSlot()-target->inventory.GetWeaponSlot()); if (fx->TimingMode==FX_DURATION_INSTANT_LIMITED) { //if this effect has expiration, then it will remain as a remove_item //on the effect queue, inheriting all the parameters This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |