From: Jaka K. <lyn...@us...> - 2012-12-27 15:01:59
|
gemrb: Infinity Engine emulator The branch master has been updated via aa89b31fab6e5de009f2a04132686f72f0878a6c (commit) via b1430f45998dfcccd922e1370e8078036bf5ac84 (commit) via 4012c6f34999fed0aa4e587ce04b12a9f70fa903 (commit) via c354b309fe41033e6c8cab5541e933dab05f047a (commit) Summary of changes: gemrb/core/Inventory.cpp | 50 +++++++++++++++++++++++----------------- gemrb/core/Inventory.h | 3 +- gemrb/core/Map.cpp | 23 ++++++++++++++++++ gemrb/core/Scriptable/Actor.h | 1 - 4 files changed, 54 insertions(+), 23 deletions(-) from 6c3993dffe34773c2d9b5b3a5d38c8ecb06c64d1 (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email; so we list those revisions in full, below. - Log ----------------------------------------------------------------- http://gemrb.git.sourceforge.net/git/gitweb.cgi?p=gemrb/gemrb;a=commitdiff;h=aa89b31fab6e5de009f2a04132686f72f0878a6c commit aa89b31fab6e5de009f2a04132686f72f0878a6c Author: Jaka Kranjc <lyn...@us...> Date: Thu Dec 27 15:54:42 2012 +0100 MoveVisibleGroundPiles: also sort the items by resref, so loot is grouped diff --git a/gemrb/core/Map.cpp b/gemrb/core/Map.cpp index 5723cbd..ae58cf0 100644 --- a/gemrb/core/Map.cpp +++ b/gemrb/core/Map.cpp @@ -3351,6 +3351,29 @@ void Map::MoveVisibleGroundPiles(const Point &Pos) } } } + + // reshuffle the items so they are sorted + unsigned int i = othercontainer->inventory.GetSlotCount(); + if (i < 3) { + // nothing to do + return; + } + + // sort by removing all items that have copies and readding them at the end + i = othercontainer->inventory.GetSlotCount(); + while (i--) { + CREItem *item = othercontainer->inventory.GetSlotItem(i); + int count = othercontainer->inventory.CountItems(item->ItemResRef, 0); + if (count == 1) continue; + + while (count) { + int slot = othercontainer->inventory.FindItem(item->ItemResRef, 0, --count); + assert (slot != -1); + // containers don't really care about position, so every new item is placed at the last spot + CREItem *item = othercontainer->RemoveItem(slot, 0); + othercontainer->AddItem(item); + } + } } Container *Map::GetPile(Point position) http://gemrb.git.sourceforge.net/git/gitweb.cgi?p=gemrb/gemrb;a=commitdiff;h=b1430f45998dfcccd922e1370e8078036bf5ac84 commit b1430f45998dfcccd922e1370e8078036bf5ac84 Author: Jaka Kranjc <lyn...@us...> Date: Thu Dec 27 15:53:29 2012 +0100 Inventory::FindItem: added optional param to skip a number of found items diff --git a/gemrb/core/Inventory.cpp b/gemrb/core/Inventory.cpp index 3685a16..2fa373c 100644 --- a/gemrb/core/Inventory.cpp +++ b/gemrb/core/Inventory.cpp @@ -797,7 +797,7 @@ int Inventory::DepleteItem(ieDword flags) // if flags is 0, skips undroppable items // if flags is IE_INV_ITEM_UNDROPPABLE, doesn't skip undroppable items // TODO: once all callers have been checked, this can be reversed to make more sense -int Inventory::FindItem(const char *resref, unsigned int flags) const +int Inventory::FindItem(const char *resref, unsigned int flags, unsigned int skip) const { unsigned int mask = (flags^IE_INV_ITEM_UNDROPPABLE); if (core->HasFeature(GF_NO_DROP_CAN_MOVE) ) { @@ -814,7 +814,11 @@ int Inventory::FindItem(const char *resref, unsigned int flags) const if (resref[0] && strnicmp(item->ItemResRef, resref, 8) ) { continue; } - return (int) i; + if (skip) { + skip--; + } else { + return (int) i; + } } return -1; } diff --git a/gemrb/core/Inventory.h b/gemrb/core/Inventory.h index 6baa517..ceecc40 100644 --- a/gemrb/core/Inventory.h +++ b/gemrb/core/Inventory.h @@ -271,7 +271,7 @@ public: //charges recharging items void ChargeAllItems(int hours); /** Finds the first slot of named item, if resref is empty, finds the first filled! slot */ - int FindItem(const char *resref, unsigned int flags) const; + int FindItem(const char *resref, unsigned int flags, unsigned int skip=0) const; bool DropItemAtLocation(unsigned int slot, unsigned int flags, Map *map, const Point &loc); bool DropItemAtLocation(const char *resref, unsigned int flags, Map *map, const Point &loc); bool SetEquippedSlot(ieWordSigned slotcode, ieWord header); http://gemrb.git.sourceforge.net/git/gitweb.cgi?p=gemrb/gemrb;a=commitdiff;h=4012c6f34999fed0aa4e587ce04b12a9f70fa903 commit 4012c6f34999fed0aa4e587ce04b12a9f70fa903 Author: Jaka Kranjc <lyn...@us...> Date: Thu Dec 27 14:54:20 2012 +0100 Actor: removed unused typedef diff --git a/gemrb/core/Scriptable/Actor.h b/gemrb/core/Scriptable/Actor.h index 9d65c61..735245d 100644 --- a/gemrb/core/Scriptable/Actor.h +++ b/gemrb/core/Scriptable/Actor.h @@ -235,7 +235,6 @@ struct ActionButtonRow2 { }; typedef std::vector< ScriptedAnimation*> vvcVector; -typedef std::list<ieResRef*> resourceList; struct WeaponInfo { int slot; http://gemrb.git.sourceforge.net/git/gitweb.cgi?p=gemrb/gemrb;a=commitdiff;h=c354b309fe41033e6c8cab5541e933dab05f047a commit c354b309fe41033e6c8cab5541e933dab05f047a Author: Jens Granseuer <je...@gm...> Date: Thu Dec 27 10:23:36 2012 +0100 make sure the stacked flag is correct right from the start If it isn't you cannot pick up stackable items from a container and pass them to another character immediately if they need to be stacked to fit in the inventory. diff --git a/gemrb/core/Inventory.cpp b/gemrb/core/Inventory.cpp index 81209da..3685a16 100644 --- a/gemrb/core/Inventory.cpp +++ b/gemrb/core/Inventory.cpp @@ -157,12 +157,16 @@ CREItem *Inventory::GetItem(unsigned int slot) return item; } -//This hack sets the charge counters for non-rechargeable items, -//if their charge is zero -static inline void HackCharges(CREItem *item) +//Make sure the item attributes are valid +//we don't update all flags here because some need to be set later (like +//unmovable items in containers (e.g. the bg2 protal key) so that they +//can actually be picked up) +void Inventory::SanitizeItem(CREItem *item) { Item *itm = gamedata->GetItem(item->ItemResRef, true); if (itm) { + //This hack sets the charge counters for non-rechargeable items, + //if their charge is zero for (int i=0;i<3;i++) { if (item->Usages[i]) { continue; @@ -177,6 +181,19 @@ static inline void HackCharges(CREItem *item) } } } + + //auto identify basic items + if (!itm->LoreToID) { + item->Flags |= IE_INV_ITEM_IDENTIFIED; + } + + //if item is stacked mark it as so + if (itm->MaxStackAmount) { + item->Flags |= IE_INV_ITEM_STACKED; + } + + item->MaxStackAmount = itm->MaxStackAmount; + gamedata->FreeItem( itm, item->ItemResRef, false ); } } @@ -185,10 +202,7 @@ void Inventory::AddItem(CREItem *item) { if (!item) return; //invalid items get no slot Slots.push_back(item); - HackCharges(item); - //this will update the flags (needed for unmovable items in containers) - //but those *can* be picked up (like the bg2 portal key), so we skip it - //Changed=true; + SanitizeItem(item); } void Inventory::CalculateWeight() const @@ -227,18 +241,8 @@ void Inventory::CalculateWeight() const slot->Flags |= IE_INV_ITEM_STOLEN; } - //auto identify basic items - if (!itm->LoreToID) { - slot->Flags |= IE_INV_ITEM_IDENTIFIED; - } - - //if item is stacked mark it as so - if (itm->MaxStackAmount) { - slot->Flags |= IE_INV_ITEM_STACKED; - } - slot->Weight = itm->Weight; - slot->MaxStackAmount = itm->MaxStackAmount; + gamedata->FreeItem( itm, slot->ItemResRef, false ); } else { @@ -613,7 +617,7 @@ void Inventory::SetSlotItem(CREItem* item, unsigned int slot) delete Slots[slot]; } - HackCharges(item); + SanitizeItem(item); Slots[slot] = item; diff --git a/gemrb/core/Inventory.h b/gemrb/core/Inventory.h index f84f13e..6baa517 100644 --- a/gemrb/core/Inventory.h +++ b/gemrb/core/Inventory.h @@ -363,6 +363,7 @@ private: inline Item *GetItemPointer(ieDword slot, CREItem *&Slot) const; void UpdateWeaponAnimation(); void UpdateShieldAnimation(Item *it); + void SanitizeItem(CREItem *item); }; } ----------------------------------------------------------------------- This is an automated email from the git hooks/post-receive script. -- gemrb: Infinity Engine emulator |