From: <ave...@us...> - 2009-05-24 22:15:30
|
Revision: 6095 http://gemrb.svn.sourceforge.net/gemrb/?rev=6095&view=rev Author: avenger_teambg Date: 2009-05-24 22:15:21 +0000 (Sun, 24 May 2009) Log Message: ----------- a little? cleanup - always use the right weapon slot also - ranged misses will still create an 'empty' projectile 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/Core.cpp gemrb/trunk/gemrb/plugins/Core/GSUtils.cpp gemrb/trunk/gemrb/plugins/Core/Inventory.cpp gemrb/trunk/gemrb/plugins/Core/Inventory.h gemrb/trunk/gemrb/plugins/Core/Item.cpp gemrb/trunk/gemrb/plugins/Core/Item.h gemrb/trunk/gemrb/plugins/Core/Projectile.cpp gemrb/trunk/gemrb/plugins/Core/Triggers.cpp gemrb/trunk/gemrb/plugins/GUIScript/GUIScript.cpp Modified: gemrb/trunk/gemrb/plugins/Core/Actions.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/Core/Actions.cpp 2009-05-24 17:57:41 UTC (rev 6094) +++ gemrb/trunk/gemrb/plugins/Core/Actions.cpp 2009-05-24 22:15:21 UTC (rev 6095) @@ -5584,16 +5584,19 @@ } Actor *act = (Actor *) Sender; ieDword Slot, header; + ieDword flags; ieResRef itemres; if (parameters->string0Parameter[0]) { Slot = act->inventory.FindItem(parameters->string0Parameter, 0); //this IS in the original game code (ability) header = parameters->int0Parameter; + flags = parameters->int1Parameter; } else { Slot = parameters->int0Parameter; //this is actually not in the original game code header = parameters->int1Parameter; + flags = parameters->int2Parameter; } if (!ResolveItemName( itemres, act, Slot) ) { @@ -5609,7 +5612,7 @@ return; } - act->UseItem(Slot, header, tar, false); + act->UseItem(Slot, header, tar, flags); } void GameScript::UseItemPoint(Scriptable* Sender, Action* parameters) @@ -5622,15 +5625,18 @@ Actor *act = (Actor *) Sender; ieDword Slot, header; ieResRef itemres; + ieDword flags; if (parameters->string0Parameter[0]) { Slot = act->inventory.FindItem(parameters->string0Parameter, 0); //this IS in the original game code (ability) header = parameters->int0Parameter; + flags = parameters->int1Parameter; } else { Slot = parameters->int0Parameter; //this is actually not in the original game code header = parameters->int1Parameter; + flags = parameters->int2Parameter; } if (!ResolveItemName( itemres, act, Slot) ) { @@ -5646,7 +5652,7 @@ return; } - act->UseItemPoint(Slot, header, parameters->pointParameter, false); + act->UseItemPoint(Slot, header, parameters->pointParameter, flags); } //addfeat will be able to remove feats too Modified: gemrb/trunk/gemrb/plugins/Core/Actor.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/Core/Actor.cpp 2009-05-24 17:57:41 UTC (rev 6094) +++ gemrb/trunk/gemrb/plugins/Core/Actor.cpp 2009-05-24 22:15:21 UTC (rev 6095) @@ -2466,32 +2466,33 @@ //slot is the projectile slot //This will return the projectile item. -int Actor::GetRangedWeapon(ITMExtHeader *&which, WeaponInfo *wi) const +ITMExtHeader *Actor::GetRangedWeapon(WeaponInfo &wi) const { //EquippedSlot is the projectile. To get the weapon, use inventory.GetUsedWeapon() - unsigned int slot = inventory.GetEquippedSlot(); - const CREItem *wield = inventory.GetSlotItem(slot); + wi.slot = inventory.GetEquippedSlot(); + const CREItem *wield = inventory.GetSlotItem(wi.slot); if (!wield) { - return 0; + return NULL; } Item *item = gamedata->GetItem(wield->ItemResRef); if (!item) { - return 0; + return NULL; } - if (wi) { - wi->enchantment = item->Enchantment; - wi->itemflags = wield->Flags; - } - which = item->GetWeaponHeader(true); + //The magic of the bow and the arrow add up? + wi.enchantment += item->Enchantment; + wi.itemflags = wield->Flags; + //wi.range is not set, the projectile has no effect on range? + + ITMExtHeader *which = item->GetWeaponHeader(true); gamedata->FreeItem(item, wield->ItemResRef, false); - return 1; + return which; } //returns weapon header currently used (bow in case of bow+arrow) //if range is nonzero, then the returned header is valid -unsigned int Actor::GetWeapon(ITMExtHeader *&which, WeaponInfo *wi, bool leftorright) +ITMExtHeader *Actor::GetWeapon(WeaponInfo &wi, bool leftorright) { - const CREItem *wield = inventory.GetUsedWeapon(leftorright); + const CREItem *wield = inventory.GetUsedWeapon(leftorright, wi.slot); if (!wield) { return 0; } @@ -2500,12 +2501,11 @@ return 0; } - if (wi) { - wi->enchantment = item->Enchantment; - wi->itemflags = wield->Flags; - } + wi.enchantment = item->Enchantment; + wi.itemflags = wield->Flags; + //select first weapon header - which = item->GetWeaponHeader(GetAttackStyle() == WEAPON_RANGED); + ITMExtHeader *which = item->GetWeaponHeader(GetAttackStyle() == WEAPON_RANGED); //make sure we use 'false' in this freeitem //so 'which' won't point into invalid memory gamedata->FreeItem(item, wield->ItemResRef, false); @@ -2515,7 +2515,9 @@ if (which->Location!=ITEM_LOC_WEAPON) { return 0; } - return which->Range+1; + wi.range = which->Range+1; + return which; + //return which->Range+1; } void Actor::GetNextStance() @@ -2627,9 +2629,9 @@ //even spells got this attack style int Actor::GetAttackStyle() { - int effect = core->QuerySlotEffects(inventory.GetEquippedSlot()) ; - if (effect == SLOT_EFFECT_MISSILE) return WEAPON_RANGED ; - return WEAPON_MELEE ; + int effect = core->QuerySlotEffects(inventory.GetEquippedSlot()); + if (effect == SLOT_EFFECT_MISSILE) return WEAPON_RANGED; + return WEAPON_MELEE; } void Actor::SetTarget( Scriptable *target) @@ -2695,7 +2697,7 @@ return; } - SetStance(AttackStance) ; + SetStance(AttackStance); //last chance to disable attacking // @@ -2799,18 +2801,23 @@ bool leftorright = (bool) (attackcount&1); WeaponInfo wi; - ITMExtHeader *header; + ITMExtHeader *header = GetWeapon(wi,leftorright); + if (!header) { + return; + } + //can't reach target, zero range shouldn't be allowed //Don't forget to take size of the opponents into account - if ((GetWeapon(header, &wi, leftorright)*10+(size + target->size)*5)<PersonalDistance(this, target)) { + //Actually, this version of PersonalDistance already calculates with the size!!! + if (wi.range*10<PersonalDistance(this, target)) { return; } ieDword Flags; + ITMExtHeader *hittingheader = header; ITMExtHeader *rangedheader = NULL; - ITMExtHeader *hittingheader = header; - int THACOBonus = header->THAC0Bonus ; - int DamageBonus = header->DamageBonus ; - switch(header->AttackType) { + int THACOBonus = hittingheader->THAC0Bonus; + int DamageBonus = hittingheader->DamageBonus; + switch(hittingheader->AttackType) { case ITEM_AT_MELEE: Flags = WEAPON_MELEE; break; @@ -2818,17 +2825,18 @@ Flags = WEAPON_RANGED; break; case ITEM_AT_BOW: - if (!GetRangedWeapon(rangedheader, NULL)) { + rangedheader = GetRangedWeapon(wi); + if (!rangedheader) { //out of ammo event //try to refill SetStance(IE_ANI_READY); return; } - Flags = WEAPON_RANGED ; + Flags = WEAPON_RANGED; //The bow can give some bonuses, but the core attack is made by the arrow. - hittingheader = rangedheader ; - THACOBonus += rangedheader->THAC0Bonus ; - DamageBonus+= rangedheader->DamageBonus ; + hittingheader = rangedheader; + THACOBonus += rangedheader->THAC0Bonus; + DamageBonus+= rangedheader->DamageBonus; break; default: //item is unsuitable for fight @@ -2844,8 +2852,16 @@ int roll = core->Roll(1,ATTACKROLL,0); if (roll==1) { + //critical failure DisplayStringCore(this, VB_CRITMISS, DS_CONSOLE|DS_CONST ); - //critical failure + if (Flags&WEAPON_RANGED) { + UseItem(wi.slot, -2, target, UI_MISS); + } else { + //break sword + if (header->RechargeFlags&IE_ITEM_BREAKABLE) { + inventory.BreakItemSlot(wi.slot); + } + } return; } //damage type is? @@ -2863,7 +2879,7 @@ //critical success DisplayStringCore(this, VB_CRITHIT, DS_CONSOLE|DS_CONST ); DealDamage (target, damage, damagetype, &wi, true); - UseItem(inventory.GetEquippedSlot(), Flags&WEAPON_RANGED?-2:-1, target, false) ; + UseItem(wi.slot, Flags&WEAPON_RANGED?-2:-1, target, 0); return; } tohit += roll; @@ -2877,10 +2893,13 @@ if (tohit<defense) { //hit failed + if (Flags&WEAPON_RANGED) { + UseItem(wi.slot, -2, target, UI_MISS); + } return; } DealDamage (target, damage, damagetype, &wi, false); - UseItem(inventory.GetEquippedSlot(), Flags&WEAPON_RANGED?-2:-1, target, false) ; + UseItem(wi.slot, Flags&WEAPON_RANGED?-2:-1, target, 0); } static const int weapon_damagetype[] = {DAMAGE_CRUSHING, DAMAGE_PIERCING, @@ -3845,7 +3864,7 @@ //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(ieDword slot, ieDword header, Point &target, bool silent) +bool Actor::UseItemPoint(ieDword slot, ieDword header, Point &target, ieDword flags) { CREItem *item = inventory.GetSlotItem(slot); if (!item) @@ -3857,8 +3876,8 @@ return false; } - Projectile *pro = itm->GetProjectile(slot, header); - ChargeItem(slot, header, item, itm, silent); + Projectile *pro = itm->GetProjectile(slot, header, flags&UI_MISS); + ChargeItem(slot, header, item, itm, flags&UI_SILENT); gamedata->FreeItem(itm,item->ItemResRef, false); if (pro) { pro->SetCaster(globalID); @@ -3868,10 +3887,10 @@ return false; } -bool Actor::UseItem(ieDword slot, ieDword header, Scriptable* target, bool silent) +bool Actor::UseItem(ieDword slot, ieDword header, Scriptable* target, ieDword flags) { if (target->Type!=ST_ACTOR) { - return UseItemPoint(slot, header, target->Pos, silent); + return UseItemPoint(slot, header, target->Pos, flags); } Actor *tar = (Actor *) target; @@ -3881,12 +3900,12 @@ Item *itm = gamedata->GetItem(item->ItemResRef); if (!itm) return false; //quick item slot contains invalid item resref //item is depleted for today - if(itm->UseCharge(item->Usages, header, false)==CHG_DAY) { + if (itm->UseCharge(item->Usages, header, false)==CHG_DAY) { return false; } - Projectile *pro = itm->GetProjectile(slot, header); - ChargeItem(slot, header, item, itm, silent); + Projectile *pro = itm->GetProjectile(slot, header, flags&UI_MISS); + ChargeItem(slot, header, item, itm, flags&UI_SILENT); gamedata->FreeItem(itm,item->ItemResRef, false); if (pro) { pro->SetCaster(globalID); @@ -3995,14 +4014,14 @@ //update the paperdoll weapon animation core->SetEventFlag(EF_UPDATEANIM); } - ITMExtHeader *header ; - GetWeapon(header, NULL) ; + WeaponInfo wi; + ITMExtHeader *header = GetWeapon(wi); + if(header && header->AttackType == ITEM_AT_BOW) { - AttackStance = IE_ANI_SHOOT ; - ITMExtHeader* projHeader ; - GetRangedWeapon(projHeader, NULL) ; - anims->RangedType = projHeader->ProjectileType - 1 ; - return ; + AttackStance = IE_ANI_SHOOT; + ITMExtHeader* projHeader = GetRangedWeapon(wi); + anims->RangedType = projHeader->ProjectileType - 1; + return; } AttackStance = IE_ANI_ATTACK; } Modified: gemrb/trunk/gemrb/plugins/Core/Actor.h =================================================================== --- gemrb/trunk/gemrb/plugins/Core/Actor.h 2009-05-24 17:57:41 UTC (rev 6094) +++ gemrb/trunk/gemrb/plugins/Core/Actor.h 2009-05-24 22:15:21 UTC (rev 6095) @@ -132,13 +132,19 @@ // 3 for blur, 8 for mirror images #define EXTRA_ACTORCOVERS 11 +//flags for UseItem +#define UI_SILENT 1 //no sound when used up +#define UI_MISS 2 //ranged miss (projectile has no effects) + typedef ieByte ActionButtonRow[GUIBT_COUNT]; typedef std::vector< ScriptedAnimation*> vvcVector; typedef std::list<ieResRef*> resourceList; struct WeaponInfo { + int slot; int enchantment; + unsigned int range; ieDword itemflags; }; @@ -401,10 +407,10 @@ /* learns the given spell, possibly receive XP */ int LearnSpell(const ieResRef resref, ieDword flags); /* returns the ranged weapon header associated with the currently equipped projectile */ - int GetRangedWeapon(ITMExtHeader *&which, WeaponInfo *wi) const; + ITMExtHeader *GetRangedWeapon(WeaponInfo &wi) const; /* Returns current weapon range and extended header if range is nonzero, then which is valid */ - unsigned int GetWeapon(ITMExtHeader *&which, WeaponInfo *wi, bool leftorright=false); + ITMExtHeader* GetWeapon(WeaponInfo &wi, bool leftorright=false); /* Creates player statistics */ void CreateStats(); /* Heals actor by days */ @@ -484,8 +490,8 @@ /* Sets equipped Quick slot */ int SetEquippedQuickSlot(int slot); /* Uses an item on the target or point */ - bool UseItemPoint(ieDword slot, ieDword header, Point &point, bool silent); - bool UseItem(ieDword slot, ieDword header, Scriptable *target, bool silent); + bool UseItemPoint(ieDword slot, ieDword header, Point &point, ieDword flags); + bool UseItem(ieDword slot, ieDword header, Scriptable *target, ieDword flags); /* Deducts a charge from an item */ void ChargeItem(ieDword slot, ieDword header, CREItem *item, Item *itm, bool silent); /* If it returns true, then default AC=10 and the lesser the better */ Modified: gemrb/trunk/gemrb/plugins/Core/Core.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/Core/Core.cpp 2009-05-24 17:57:41 UTC (rev 6094) +++ gemrb/trunk/gemrb/plugins/Core/Core.cpp 2009-05-24 22:15:21 UTC (rev 6095) @@ -142,7 +142,7 @@ long y = ( p.y - b->Pos.y ); int ret = (int) sqrt( ( double ) ( x* x + y* y ) ); if (b->Type==ST_ACTOR) { - ret-=((Actor *)b)->size*5; + ret-=((Actor *)b)->size*10; } if (ret<0) return (unsigned int) 0; return (unsigned int) ret; @@ -163,11 +163,10 @@ long y = ( a->Pos.y - b->Pos.y ); int ret = (int) sqrt( ( double ) ( x* x + y* y ) ); if (a->Type==ST_ACTOR) { - // *10 / 2 - ret-=((Actor *)a)->size*5; + ret-=((Actor *)a)->size*10; } if (b->Type==ST_ACTOR) { - ret-=((Actor *)b)->size*5; + ret-=((Actor *)b)->size*10; } if (ret<0) return (unsigned int) 0; return (unsigned int) ret; Modified: gemrb/trunk/gemrb/plugins/Core/GSUtils.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/Core/GSUtils.cpp 2009-05-24 17:57:41 UTC (rev 6094) +++ gemrb/trunk/gemrb/plugins/Core/GSUtils.cpp 2009-05-24 22:15:21 UTC (rev 6095) @@ -1175,14 +1175,15 @@ } //if distance is too much, insert a move action and requeue the action - ITMExtHeader *header; + WeaponInfo wi; + ITMExtHeader *header = actor->GetWeapon(wi, false); - unsigned int wrange = actor->GetWeapon(header, NULL) * 10; + if (header) wi.range *= 10; + else wi.range = 0; + if ( target->Type == ST_DOOR || target->Type == ST_CONTAINER) { - wrange = 10; + wi.range += 10; } - wrange += actor->size * 5 ; - Actor *tar = NULL; ieDword targetID = 0; if (target->Type==ST_ACTOR) { @@ -1204,16 +1205,15 @@ //action performed if(target->Type == ST_ACTOR) { actor->SetTarget( target ); - wrange += ((Actor*)target)->size * 5 ; } - if ( PersonalDistance(Sender, target) > wrange) { + if ( PersonalDistance(Sender, target) > wi.range) { //we couldn't perform the action right now //so we add it back to the queue with an additional movement //increases refcount of Sender->CurrentAction, by pumping it back //in the action queue //Forcing a lock does not launch the trap... - GoNearAndRetry(Sender, target, target->Type == ST_ACTOR, wrange); + GoNearAndRetry(Sender, target, target->Type == ST_ACTOR, wi.range); Sender->ReleaseCurrentAction(); return; } else if (target->Type == ST_DOOR) { Modified: gemrb/trunk/gemrb/plugins/Core/Inventory.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/Core/Inventory.cpp 2009-05-24 17:57:41 UTC (rev 6094) +++ gemrb/trunk/gemrb/plugins/Core/Inventory.cpp 2009-05-24 22:15:21 UTC (rev 6095) @@ -1105,13 +1105,13 @@ //returns the fist weapon if there is nothing else //This will return the actual weapon, I mean the bow in the case of bow+arrow combination -CREItem *Inventory::GetUsedWeapon(bool leftorright) const +CREItem *Inventory::GetUsedWeapon(bool leftorright, int &slot) const { CREItem *ret; - int slot; if (SLOT_MAGIC!=-1) { - ret = GetSlotItem(SLOT_MAGIC); + slot = SLOT_MAGIC; + ret = GetSlotItem(slot); if (ret && ret->ItemResRef[0]) { return ret; } @@ -1127,13 +1127,14 @@ } } slot = GetEquippedSlot(); - if(core->QuerySlotEffects(slot)) - ret = GetSlotItem(FindRangedWeapon()); - else - ret = GetSlotItem(slot) ; + if(core->QuerySlotEffects(slot)) { + slot = FindRangedWeapon(); + } + ret = GetSlotItem(slot); if (!ret) { //return fist weapon - ret = GetSlotItem(SLOT_FIST); + slot = SLOT_FIST; + ret = GetSlotItem(slot); } return ret; } Modified: gemrb/trunk/gemrb/plugins/Core/Inventory.h =================================================================== --- gemrb/trunk/gemrb/plugins/Core/Inventory.h 2009-05-24 17:57:41 UTC (rev 6094) +++ gemrb/trunk/gemrb/plugins/Core/Inventory.h 2009-05-24 22:15:21 UTC (rev 6095) @@ -288,8 +288,8 @@ /** Equips the item, don't use it directly for weapons */ bool EquipItem(ieDword slot); bool UnEquipItem(ieDword slot, bool removecurse); - /** Returns equipped weapon */ - CREItem *GetUsedWeapon(bool leftorright) const; + /** Returns equipped weapon, also its slot */ + CREItem *GetUsedWeapon(bool leftorright, int &slot) const; /** returns slot of launcher weapon currently equipped */ int FindRangedWeapon() const; /** returns slot of launcher weapon for specified projectile type */ Modified: gemrb/trunk/gemrb/plugins/Core/Item.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/Core/Item.cpp 2009-05-24 17:57:41 UTC (rev 6094) +++ gemrb/trunk/gemrb/plugins/Core/Item.cpp 2009-05-24 22:15:21 UTC (rev 6095) @@ -128,7 +128,7 @@ if ((header>=CHARGE_COUNTERS) || (header<0/*weapon header*/)) { header = 0; } - ccount=Charges[header] ; + ccount=Charges[header]; //if the item started from 0 charges, then it isn't depleting if (ieh->Charges==0) { @@ -138,7 +138,6 @@ Charges[header] = --ccount; } - printf("ccount is %d", ccount) ; if (ccount>0) { return CHG_NONE; } @@ -149,16 +148,18 @@ } //returns a projectile loaded with the effect queue -Projectile *Item::GetProjectile(ieDwordSigned invslot, int header) const +Projectile *Item::GetProjectile(ieDwordSigned invslot, int header, int miss) const { ITMExtHeader *eh = GetExtHeader(header); if (!eh) { return NULL; } ieDword idx = eh->ProjectileAnimation; - EffectQueue *fx = GetEffectBlock(header, invslot, idx); Projectile *pro = core->GetProjectileServer()->GetProjectileByIndex(idx); - pro->SetEffects(fx); + if (!miss) { + EffectQueue *fx = GetEffectBlock(header, invslot, idx); + pro->SetEffects(fx); + } return pro; } Modified: gemrb/trunk/gemrb/plugins/Core/Item.h =================================================================== --- gemrb/trunk/gemrb/plugins/Core/Item.h 2009-05-24 17:57:41 UTC (rev 6094) +++ gemrb/trunk/gemrb/plugins/Core/Item.h 2009-05-24 22:15:21 UTC (rev 6095) @@ -249,7 +249,8 @@ //-1 will return the equipping feature block EffectQueue *GetEffectBlock(int header, ieDwordSigned invslot, ieDword pro) const; //returns a projectile created from an extended header - Projectile *GetProjectile(ieDwordSigned invslot, int header) const; + //if miss is non-zero, then no effects will be loaded + Projectile *GetProjectile(ieDwordSigned invslot, int header, int miss) const; //Builds an equipping glow effect from gradient colour //this stuff is not item specific, could be moved elsewhere Effect *BuildGlowEffect(int gradient) const; Modified: gemrb/trunk/gemrb/plugins/Core/Projectile.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/Core/Projectile.cpp 2009-05-24 17:57:41 UTC (rev 6094) +++ gemrb/trunk/gemrb/plugins/Core/Projectile.cpp 2009-05-24 22:15:21 UTC (rev 6095) @@ -295,7 +295,7 @@ //reached target if (!Extension) { phase = P_EXPIRED; - //there could be no-effect projectiles + //there are no-effect projectiles, like missed arrows if (!effects) return; Actor *target; Modified: gemrb/trunk/gemrb/plugins/Core/Triggers.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/Core/Triggers.cpp 2009-05-24 17:57:41 UTC (rev 6094) +++ gemrb/trunk/gemrb/plugins/Core/Triggers.cpp 2009-05-24 22:15:21 UTC (rev 6095) @@ -3464,13 +3464,17 @@ return 0; } Actor *actor = (Actor *) Sender; - ITMExtHeader *header; - unsigned int wrange = actor->GetWeapon(header, NULL, false) * 10; - unsigned int wrange2 = actor->GetWeapon(header, NULL, true) * 10; - if (wrange2>wrange) { - wrange=wrange2; + WeaponInfo wi; + unsigned int wrange = 0; + ITMExtHeader *header = actor->GetWeapon(wi, false); + if (header) { + wrange = wi.range; } - if ( PersonalDistance( Sender, tar ) <= wrange ) { + header = actor->GetWeapon(wi, true); + if (header && (wi.range>wrange)) { + wrange = wi.range; + } + if ( PersonalDistance( Sender, tar ) <= wrange * 10 ) { return 1; } return 0; @@ -3491,14 +3495,9 @@ return 0; } Actor *actor = (Actor *) scr; - ITMExtHeader *header; - unsigned int weapon = actor->GetWeapon(header, NULL); - //no weapon wielded? - if (weapon==0) { - return 0; - } - //if not bow is wielded, then we either have projectile - //or wielding something else (which has no ammo) + WeaponInfo wi; + ITMExtHeader *header = actor->GetWeapon(wi, false); + //no bow wielded? if (!header || header->AttackType!=ITEM_AT_BOW) { return 0; } @@ -3520,12 +3519,9 @@ return 0; } Actor *actor = (Actor *) Sender; - ITMExtHeader *header; - unsigned int weapon = actor->GetWeapon(header, NULL); - //no weapon range - if (weapon==0) { - return 0; - } + WeaponInfo wi; + ITMExtHeader *header = actor->GetWeapon(wi, false); + //bows are not usable (because if they are loaded, the equipped //weapon is the projectile) if (!header || header->AttackType==ITEM_AT_BOW) { Modified: gemrb/trunk/gemrb/plugins/GUIScript/GUIScript.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/GUIScript/GUIScript.cpp 2009-05-24 17:57:41 UTC (rev 6094) +++ gemrb/trunk/gemrb/plugins/GUIScript/GUIScript.cpp 2009-05-24 22:15:21 UTC (rev 6095) @@ -8632,7 +8632,7 @@ return RuntimeError( "Actor not found" ); } ItemExtHeader itemdata; - bool silent = false; + int flags = 0; switch (slot) { case -1: @@ -8651,7 +8651,7 @@ default: //any normal slot actor->GetItemSlotInfo(&itemdata, core->QuerySlot(slot), header); - silent = true; + flags = UI_SILENT; break; } @@ -8676,10 +8676,10 @@ // switch (forcetarget) { case TARGET_SELF: - actor->UseItem(itemdata.slot, itemdata.headerindex, actor, silent); + actor->UseItem(itemdata.slot, itemdata.headerindex, actor, flags); break; case TARGET_NONE: - actor->UseItem(itemdata.slot, itemdata.headerindex, NULL, silent); + actor->UseItem(itemdata.slot, itemdata.headerindex, NULL, flags); break; case TARGET_AREA: core->GetGameControl()->SetupItemUse(itemdata.slot, itemdata.headerindex, actor, GA_POINT, itemdata.TargetNumber); @@ -8834,7 +8834,7 @@ if (useup) { //use the found item's first usage - useup = actor->UseItem((ieDword) slot, 0, actor, true); + useup = actor->UseItem((ieDword) slot, 0, actor, UI_SILENT); } else { CREItem *si = actor->inventory.GetSlotItem( slot ); if (si->Usages[0]) useup = 1; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |