From: <ze...@us...> - 2009-05-24 16:02:30
|
Revision: 6091 http://gemrb.svn.sourceforge.net/gemrb/?rev=6091&view=rev Author: zefklop Date: 2009-05-24 16:02:20 +0000 (Sun, 24 May 2009) Log Message: ----------- Do launch projectiles with arrows. Breaking a stacked item will unstack it, and it will break if there is nothing left :) Untested with crossbows and slings, anyway this is still a big WIP. Modified Paths: -------------- gemrb/trunk/gemrb/plugins/Core/Actor.cpp gemrb/trunk/gemrb/plugins/Core/Inventory.cpp gemrb/trunk/gemrb/plugins/Core/Item.cpp gemrb/trunk/gemrb/plugins/Core/Item.h Modified: gemrb/trunk/gemrb/plugins/Core/Actor.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/Core/Actor.cpp 2009-05-24 12:19:31 UTC (rev 6090) +++ gemrb/trunk/gemrb/plugins/Core/Actor.cpp 2009-05-24 16:02:20 UTC (rev 6091) @@ -2863,6 +2863,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) ; return; } tohit += roll; @@ -2879,6 +2880,7 @@ return; } DealDamage (target, damage, damagetype, &wi, false); + UseItem(inventory.GetEquippedSlot(), Flags&WEAPON_RANGED?-2:-1, target, false) ; } static const int weapon_damagetype[] = {DAMAGE_CRUSHING, DAMAGE_PIERCING, Modified: gemrb/trunk/gemrb/plugins/Core/Inventory.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/Core/Inventory.cpp 2009-05-24 12:19:31 UTC (rev 6090) +++ gemrb/trunk/gemrb/plugins/Core/Inventory.cpp 2009-05-24 16:02:20 UTC (rev 6091) @@ -431,7 +431,7 @@ } CREItem *returned = new CREItem(*item); - item->Usages[0]=(ieWord) (item->Usages[0]-count); + item->Usages[0]-=count; returned->Usages[0]=(ieWord) count; return returned; } @@ -1219,9 +1219,14 @@ const Item *itm = GetItemPointer(slot, Slot); if (!itm) return; memcpy(newItem, itm->ReplacementItem,sizeof(newItem) ); - gamedata->FreeItem( itm, Slot->ItemResRef, true ); - //this depends on setslotitemres using setslotitem - SetSlotItemRes(newItem, slot, 0,0,0); + //remove one item + RemoveItem(slot, 1) ; + //and if there are no more of them, break it! + if(!Slots[slot]) { + gamedata->FreeItem( itm, Slot->ItemResRef, true ); + //this depends on setslotitemres using setslotitem + SetSlotItemRes(newItem, slot, 0,0,0); + } } void Inventory::dump() Modified: gemrb/trunk/gemrb/plugins/Core/Item.cpp =================================================================== --- gemrb/trunk/gemrb/plugins/Core/Item.cpp 2009-05-24 12:19:31 UTC (rev 6090) +++ gemrb/trunk/gemrb/plugins/Core/Item.cpp 2009-05-24 16:02:20 UTC (rev 6091) @@ -123,10 +123,12 @@ ITMExtHeader *ieh = GetExtHeader(header); if (!ieh) return 0; int type = ieh->ChargeDepletion; - int ccount = Charges[header]; - if (header>=CHARGE_COUNTERS) { + + int ccount = 0; + if ((header>=CHARGE_COUNTERS) || (header<0/*weapon header*/)) { header = 0; } + ccount=Charges[header] ; //if the item started from 0 charges, then it isn't depleting if (ieh->Charges==0) { @@ -136,6 +138,7 @@ Charges[header] = --ccount; } + printf("ccount is %d", ccount) ; if (ccount>0) { return CHG_NONE; } Modified: gemrb/trunk/gemrb/plugins/Core/Item.h =================================================================== --- gemrb/trunk/gemrb/plugins/Core/Item.h 2009-05-24 12:19:31 UTC (rev 6090) +++ gemrb/trunk/gemrb/plugins/Core/Item.h 2009-05-24 16:02:20 UTC (rev 6091) @@ -231,8 +231,11 @@ int UseCharge(ieWord *Charges, int header, bool expend) const; //returns the requested extended header - ITMExtHeader *GetExtHeader(unsigned int which) const + //-1 will return melee weapon header, -2 the ranged one + ITMExtHeader *GetExtHeader(int which) const { + if(which < 0) + return GetWeaponHeader(which == -2) ; if(ExtHeaderCount<=which) { return NULL; } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |