Update of /cvsroot/gemrb/gemrb/gemrb/plugins/Core In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv19980/plugins/Core Modified Files: Button.h Interface.cpp Inventory.cpp Inventory.h Item.h Map.cpp Map.h Store.cpp Store.h Log Message: Continued Store implementation (bugfixes, enhancements) Added SetPurchasedCount guiscript function AREImp now stores the version of the area resource in Map Index: Store.h =================================================================== RCS file: /cvsroot/gemrb/gemrb/gemrb/plugins/Core/Store.h,v retrieving revision 1.15 retrieving revision 1.16 diff -C2 -d -r1.15 -r1.16 *** Store.h 7 Jun 2005 21:33:46 -0000 1.15 --- Store.h 8 Jun 2005 20:37:12 -0000 1.16 *************** *** 63,67 **** typedef struct STOItem { ieResRef ItemResRef; ! ieWord unknown; ieWord Usages[3]; ieDword Flags; --- 63,67 ---- typedef struct STOItem { ieResRef ItemResRef; ! ieWord PurchasedAmount; ieWord Usages[3]; ieDword Flags; *************** *** 72,76 **** ieDword InfiniteSupply; // V1.1 ! ieDword TriggerRef; char unknown2[56]; } STOItem; --- 72,76 ---- ieDword InfiniteSupply; // V1.1 ! //ieDword TriggerRef; use infinitesupply char unknown2[56]; } STOItem; *************** *** 135,146 **** public: //queries ! int AcceptableItemType(ieDword type, ieDword invflags) const; STOCure *GetCure(unsigned int idx) const; STODrink *GetDrink(unsigned int idx) const; STOItem *GetItem(unsigned int idx); int GetRealStockSize(); //add a new item to the store (selling) void AddItem(CREItem* item); private: bool IsItemAvailable(unsigned int slot); }; --- 135,150 ---- public: //queries ! int AcceptableItemType(ieDword type, ieDword invflags, bool pc) const; STOCure *GetCure(unsigned int idx) const; STODrink *GetDrink(unsigned int idx) const; STOItem *GetItem(unsigned int idx); + //evaluates item availability triggers int GetRealStockSize(); //add a new item to the store (selling) void AddItem(CREItem* item); + void RemoveItem(unsigned int idx); private: + //finds a mergeable item in the stock, if exact is set, it checks for usage counts too + STOItem *FindItem(CREItem *item, bool exact); bool IsItemAvailable(unsigned int slot); }; Index: Map.cpp =================================================================== RCS file: /cvsroot/gemrb/gemrb/gemrb/plugins/Core/Map.cpp,v retrieving revision 1.166 retrieving revision 1.167 diff -C2 -d -r1.166 -r1.167 *** Map.cpp 5 Jun 2005 12:12:10 -0000 1.166 --- Map.cpp 8 Jun 2005 20:37:12 -0000 1.167 *************** *** 226,229 **** --- 226,230 ---- ExploredBitmap = NULL; VisibleBitmap = NULL; + version = 0; } Index: Map.h =================================================================== RCS file: /cvsroot/gemrb/gemrb/gemrb/plugins/Core/Map.h,v retrieving revision 1.73 retrieving revision 1.74 diff -C2 -d -r1.73 -r1.74 *** Map.h 26 May 2005 17:48:05 -0000 1.73 --- Map.h 8 Jun 2005 20:37:12 -0000 1.74 *************** *** 119,122 **** --- 119,123 ---- ieByte* ExploredBitmap; ieByte* VisibleBitmap; + int version; private: unsigned short* MapSet; Index: Store.cpp =================================================================== RCS file: /cvsroot/gemrb/gemrb/gemrb/plugins/Core/Store.cpp,v retrieving revision 1.11 retrieving revision 1.12 diff -C2 -d -r1.11 -r1.12 *** Store.cpp 7 Jun 2005 21:33:46 -0000 1.11 --- Store.cpp 8 Jun 2005 20:37:12 -0000 1.12 *************** *** 51,55 **** { Game * game = core->GetGame(); ! int trigger =items[slot]->TriggerRef; if (trigger>0) { char *TriggerCode = core->GetString( trigger ); --- 51,59 ---- { Game * game = core->GetGame(); ! //0 - not infinite, not conditional ! //-1 - infinite ! //other - pst trigger ref ! ! int trigger = (int) items[slot]->InfiniteSupply; if (trigger>0) { char *TriggerCode = core->GetString( trigger ); *************** *** 73,77 **** } ! int Store::AcceptableItemType(ieDword type, ieDword invflags) const { int ret; --- 77,81 ---- } ! int Store::AcceptableItemType(ieDword type, ieDword invflags, bool pc) const { int ret; *************** *** 88,103 **** ret |= IE_STORE_ID; } ! if (Type<STT_BG2CONT) { ! //can't sell undroppable or critical items if (!(invflags&IE_INV_ITEM_DESTRUCTIBLE)) { ! ret&=~IE_STORE_SELL; } //check if store buys stolen items if ((invflags&IE_INV_ITEM_STOLEN) && !(Type&IE_STORE_FENCE) ) { ! ret&=~IE_STORE_SELL; } } for (ieDword i=0;i<PurchasedCategoriesCount;i++) { if (type==purchased_categories[i]) { return ret; --- 92,112 ---- ret |= IE_STORE_ID; } ! if (pc && (Type<STT_BG2CONT) ) { ! //can't sell critical items if (!(invflags&IE_INV_ITEM_DESTRUCTIBLE)) { ! ret &= ~IE_STORE_SELL; } //check if store buys stolen items if ((invflags&IE_INV_ITEM_STOLEN) && !(Type&IE_STORE_FENCE) ) { ! ret &= ~IE_STORE_SELL; } } + if (!pc) { + return ret; + } + for (ieDword i=0;i<PurchasedCategoriesCount;i++) { + printf ("%d == %d\n", type, purchased_categories[i]); if (type==purchased_categories[i]) { return ret; *************** *** 144,154 **** } void Store::AddItem(CREItem *item) { ! STOItem *temp = new STOItem(); //wonder if this is needed //memset( temp, 0, sizeof (STOItem ) ); memcpy( temp, item, sizeof( CREItem ) ); items.push_back (temp ); } --- 153,210 ---- } + STOItem *Store::FindItem(CREItem *item, bool exact) + { + for (unsigned int i=0;i<ItemsCount;i++) { + if (!IsItemAvailable(i) ) { + continue; + } + STOItem *temp = items[i]; + + if (strnicmp(item->ItemResRef, temp->ItemResRef, 8) ) { + continue; + } + if(exact) { + if (temp->InfiniteSupply==(ieDword) -1) { + return temp; + } + //check if we could simply merge the item into the stock or need a new entry + if ((temp->StackAmount>=99) || memcmp(temp->Usages, item->Usages, sizeof(item->Usages))) { + continue; + } + } + return temp; + } + return NULL; + } + void Store::AddItem(CREItem *item) { ! STOItem *temp = FindItem(item, true); ! ! if (temp) { ! if (temp->InfiniteSupply!=(ieDword) -1) { ! temp->StackAmount++; ! } ! return; ! } ! ! temp = new STOItem(); //wonder if this is needed //memset( temp, 0, sizeof (STOItem ) ); memcpy( temp, item, sizeof( CREItem ) ); items.push_back (temp ); + ItemsCount++; } + void Store::RemoveItem( unsigned int idx ) + { + if (items.size()!=ItemsCount) { + printMessage("Store","Inconsistent store", LIGHT_RED); + abort(); + } + if (ItemsCount<=idx) { + return; + } + items.erase(items.begin()+idx); + ItemsCount--; + } Index: Inventory.cpp =================================================================== RCS file: /cvsroot/gemrb/gemrb/gemrb/plugins/Core/Inventory.cpp,v retrieving revision 1.50 retrieving revision 1.51 diff -C2 -d -r1.50 -r1.51 *** Inventory.cpp 5 Jun 2005 12:12:10 -0000 1.50 --- Inventory.cpp 8 Jun 2005 20:37:12 -0000 1.51 *************** *** 73,80 **** continue; } - slot->Flags &= ~IE_INV_ITEM_ACQUIRED; //printf ("%2d: %8s : %d x %d\n", (int) i, slot->ItemResRef, slot->Weight, slot->Usages[0]); if (slot->Weight == 0) { Item *itm = core->GetItem( slot->ItemResRef ); slot->Weight = -1; if (itm) { --- 73,94 ---- continue; } //printf ("%2d: %8s : %d x %d\n", (int) i, slot->ItemResRef, slot->Weight, slot->Usages[0]); if (slot->Weight == 0) { Item *itm = core->GetItem( slot->ItemResRef ); + slot->Flags &= ~IE_INV_ITEM_ACQUIRED; + if (!(itm->Flags & IE_ITEM_CRITICAL)) { + slot->Flags |= IE_INV_ITEM_DESTRUCTIBLE; + } + if (!(itm->Flags & IE_ITEM_MOVABLE)) { + slot->Flags |= IE_INV_ITEM_UNDROPPABLE; + } + if (itm->Flags & IE_ITEM_CURSED) { + slot->Flags |= IE_INV_ITEM_UNDROPPABLE; + } + + if (itm->Flags & IE_ITEM_STOLEN) { + slot->Flags |= IE_INV_ITEM_STOLEN; + } + slot->Weight = -1; if (itm) { *************** *** 126,130 **** /** counts the items in the inventory, if stacks == 1 then stacks are ! accounted for their heap size */ int Inventory::CountItems(const char *resref, bool stacks) { --- 140,144 ---- /** counts the items in the inventory, if stacks == 1 then stacks are ! accounted for their heap size */ int Inventory::CountItems(const char *resref, bool stacks) { *************** *** 151,156 **** /** this function can look for stolen, equipped, identified, destructible ! etc, items. You just have to specify the flags in the bitmask ! specifying 1 in a bit signifies a requirement */ bool Inventory::HasItem(const char *resref, ieDword flags) { --- 165,170 ---- /** this function can look for stolen, equipped, identified, destructible ! etc, items. You just have to specify the flags in the bitmask ! specifying 1 in a bit signifies a requirement */ bool Inventory::HasItem(const char *resref, ieDword flags) { *************** *** 173,179 **** /** if resref is "", then destroy ALL items ! this function can look for stolen, equipped, identified, destructible ! etc, items. You just have to specify the flags in the bitmask ! specifying 1 in a bit signifies a requirement */ unsigned int Inventory::DestroyItem(const char *resref, ieDword flags, ieDword count) { --- 187,193 ---- /** if resref is "", then destroy ALL items ! this function can look for stolen, equipped, identified, destructible ! etc, items. You just have to specify the flags in the bitmask ! specifying 1 in a bit signifies a requirement */ unsigned int Inventory::DestroyItem(const char *resref, ieDword flags, ieDword count) { *************** *** 329,333 **** } ! int Inventory::AddSlotItem(STOItem* item, int action, int count) { CREItem *temp; --- 343,347 ---- } ! int Inventory::AddSlotItem(STOItem* item, int action) { CREItem *temp; *************** *** 337,342 **** // Because: count is the number of items bought (you can still add // grouped objects in a single step, just set up STOItem) ! for (int i = 0; i < count; i++) { ! if (!item->InfiniteSupply) { if (!item->AmountInStock) { break; --- 351,356 ---- // Because: count is the number of items bought (you can still add // grouped objects in a single step, just set up STOItem) ! for (int i = 0; i < item->PurchasedAmount; i++) { ! if (item->InfiniteSupply==(ieDword) -1) { if (!item->AmountInStock) { break; *************** *** 358,361 **** --- 372,376 ---- } } + item->PurchasedAmount = 0; return ret; } *************** *** 498,502 **** } ! printf ( "%2u: %8.8s %d (%d %d %d) %x Wt: %d x %dLb\n", i, itm->ItemResRef, itm->Unknown08, itm->Usages[0], itm->Usages[1], itm->Usages[2], itm->Flags, itm->StackAmount, itm->Weight ); } --- 513,517 ---- } ! printf ( "%2u: %8.8s (%d %d %d) %x Wt: %d x %dLb\n", i, itm->ItemResRef, itm->Usages[0], itm->Usages[1], itm->Usages[2], itm->Flags, itm->StackAmount, itm->Weight ); } Index: Interface.cpp =================================================================== RCS file: /cvsroot/gemrb/gemrb/gemrb/plugins/Core/Interface.cpp,v retrieving revision 1.318 retrieving revision 1.319 diff -C2 -d -r1.318 -r1.319 *** Interface.cpp 5 Jun 2005 12:12:10 -0000 1.318 --- Interface.cpp 8 Jun 2005 20:37:12 -0000 1.319 *************** *** 2954,2958 **** str->ReadResRef( itm->ItemResRef ); ! str->ReadWord( &itm->Unknown08 ); str->ReadWord( &itm->Usages[0] ); str->ReadWord( &itm->Usages[1] ); --- 2954,2958 ---- str->ReadResRef( itm->ItemResRef ); ! str->ReadWord( &itm->PurchasedAmount ); str->ReadWord( &itm->Usages[0] ); str->ReadWord( &itm->Usages[1] ); Index: Item.h =================================================================== RCS file: /cvsroot/gemrb/gemrb/gemrb/plugins/Core/Item.h,v retrieving revision 1.16 retrieving revision 1.17 diff -C2 -d -r1.16 -r1.17 *** Item.h 19 May 2005 14:56:17 -0000 1.16 --- Item.h 8 Jun 2005 20:37:12 -0000 1.17 *************** *** 181,188 **** ITMExtHeader *GetExtHeader(int which) { ! if(ExtHeaderCount>=which) { ! return NULL; ! } ! return ext_headers+which; } }; --- 181,188 ---- ITMExtHeader *GetExtHeader(int which) { ! if(ExtHeaderCount>=which) { ! return NULL; ! } ! return ext_headers+which; } }; Index: Button.h =================================================================== RCS file: /cvsroot/gemrb/gemrb/gemrb/plugins/Core/Button.h,v retrieving revision 1.46 retrieving revision 1.47 diff -C2 -d -r1.46 -r1.47 *** Button.h 14 May 2005 15:01:29 -0000 1.46 --- Button.h 8 Jun 2005 20:36:57 -0000 1.47 *************** *** 155,159 **** /** Refreshes the button from a radio group */ void RedrawButton(char* VariableName, unsigned int Sum); ! /** Set palette used for drawing button label in normal state. */ void SetTextColor(Color fore, Color back); /** Sets percent (0-1.0) of width for clipping picture */ --- 155,159 ---- /** Refreshes the button from a radio group */ void RedrawButton(char* VariableName, unsigned int Sum); ! /** Set palette used for drawing button label in normal state. */ void SetTextColor(Color fore, Color back); /** Sets percent (0-1.0) of width for clipping picture */ Index: Inventory.h =================================================================== RCS file: /cvsroot/gemrb/gemrb/gemrb/plugins/Core/Inventory.h,v retrieving revision 1.31 retrieving revision 1.32 diff -C2 -d -r1.31 -r1.32 *** Inventory.h 6 Jun 2005 22:21:22 -0000 1.31 --- Inventory.h 8 Jun 2005 20:37:12 -0000 1.32 *************** *** 91,100 **** public: ieResRef ItemResRef; ! ieWord Unknown08; ! ieWord Usages[3]; ! ieDword Flags; ! // 2 cached values from associated item. LEAVE IT SIGNED! ! int Weight; ! int StackAmount; CREItem() --- 91,100 ---- public: ieResRef ItemResRef; ! ieWord PurchasedAmount; //actually, this field is useless in creatures ! ieWord Usages[3]; ! ieDword Flags; ! // 2 cached values from associated item. LEAVE IT SIGNED! ! int Weight; ! int StackAmount; CREItem() *************** *** 151,160 **** ** more slots. Returns 2 if completely successful, 1 if partially, 0 else.*/ int AddSlotItem(CREItem* item, int slot); ! /** Adds STOItem to the inventory, it never wielded, action might be STA_STEAL or STA_BUY */ ! ! int AddSlotItem(STOItem* item, int action, int count); /** flags: see ieCREItemFlagBits */ ! /** count == ~0 means to destroy all */ /** returns the number of destroyed items */ unsigned int DestroyItem(const char *resref, ieDword flags, ieDword count); --- 151,160 ---- ** more slots. Returns 2 if completely successful, 1 if partially, 0 else.*/ int AddSlotItem(CREItem* item, int slot); ! /** Adds STOItem to the inventory, it is never wielded, action might be STA_STEAL or STA_BUY */ ! /** The amount of items is stored in PurchasedAmount */ ! int AddSlotItem(STOItem* item, int action); /** flags: see ieCREItemFlagBits */ ! /** count == ~0 means to destroy all */ /** returns the number of destroyed items */ unsigned int DestroyItem(const char *resref, ieDword flags, ieDword count); |