Initial commit
This commit is contained in:
442
Torque/SDK/engine/game/Inventory.cc
Normal file
442
Torque/SDK/engine/game/Inventory.cc
Normal file
@@ -0,0 +1,442 @@
|
||||
/////////////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// Inventory.cc
|
||||
//
|
||||
// Used to hold Inventory Items
|
||||
//
|
||||
// NOTE: Built in Link List due to the fact that STL has problems with Torque
|
||||
//
|
||||
/////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
#include "game/Inventory.h"
|
||||
|
||||
|
||||
//To make sure that it works on all platforms and compilers
|
||||
///////////////////////////////////////////////////////////////
|
||||
static const char* inItoa(S32 i)
|
||||
{
|
||||
static char buf[32];
|
||||
dSprintf(buf, sizeof(buf), "%d", i);
|
||||
return buf;
|
||||
}
|
||||
|
||||
///////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
///////////////////////////////////////////////////////////////
|
||||
Inventory::Inventory() {
|
||||
|
||||
FirstItemInList = NULL;
|
||||
CurrentItemInList = NULL;
|
||||
}
|
||||
|
||||
///////////////////////////////////////////////////////////////
|
||||
Inventory::~Inventory() {
|
||||
|
||||
|
||||
//cleanup all of the link list
|
||||
CurrentItemInList = NULL;
|
||||
|
||||
if (FirstItemInList != NULL) {
|
||||
while ( FirstItemInList->nextLink != NULL) {
|
||||
|
||||
FirstItemInList = FirstItemInList->nextLink;
|
||||
delete FirstItemInList->lastLink;
|
||||
}
|
||||
|
||||
delete FirstItemInList;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
///////////////////////////////////////////////////////////////
|
||||
// Inventory functions
|
||||
///////////////////////////////////////////////////////////////
|
||||
|
||||
///////////////////////////////////////////////////////////////
|
||||
// Public function to add an item to the inventory
|
||||
///////////////////////////////////////////////////////////////
|
||||
void Inventory::AddItem(char* name, char* amount, char* type, char* description, char* max) {
|
||||
AddLink(name, amount, type, description, max);
|
||||
}
|
||||
|
||||
///////////////////////////////////////////////////////////////
|
||||
// Public function to remove an item from the inventory
|
||||
///////////////////////////////////////////////////////////////
|
||||
void Inventory::RemoveItem(char* name) {
|
||||
DeleteLink(name);
|
||||
}
|
||||
|
||||
///////////////////////////////////////////////////////////////
|
||||
// Returns the rettype (name, amount, description, all) from
|
||||
// the type (first current, name)
|
||||
///////////////////////////////////////////////////////////////
|
||||
void Inventory::GetItem(char* type, char* rettype, char* retvalue) {
|
||||
|
||||
if (dStricmp(type, "first") == 0) { //first Item in list
|
||||
|
||||
if (dStricmp(rettype, "name") == 0) {
|
||||
|
||||
dStrcpy(retvalue, FirstItemInList->ItemData.Name);
|
||||
return;
|
||||
|
||||
} else if (dStricmp(rettype, "amount") == 0) {
|
||||
|
||||
dStrcpy(retvalue, inItoa(FirstItemInList->ItemData.Amount));
|
||||
return;
|
||||
|
||||
} else if (dStricmp(rettype, "type") == 0) {
|
||||
|
||||
dStrcpy(retvalue, FirstItemInList->ItemData.Type);
|
||||
return;
|
||||
|
||||
|
||||
} else if (dStricmp(rettype, "description") == 0) {
|
||||
|
||||
dStrcpy(retvalue, FirstItemInList->ItemData.Description);
|
||||
return;
|
||||
|
||||
} else if (dStricmp(rettype, "max") == 0) {
|
||||
|
||||
|
||||
dStrcpy(retvalue, inItoa(FirstItemInList->ItemData.Max));
|
||||
return;
|
||||
|
||||
} else { //return all separated by \t
|
||||
|
||||
dStrcpy(retvalue, FirstItemInList->ItemData.Name);
|
||||
dStrcatl(retvalue, sizeof(retvalue), "\t", inItoa(FirstItemInList->ItemData.Amount), "\t", FirstItemInList->ItemData.Type, "\t", FirstItemInList->ItemData.Description, NULL);
|
||||
return;
|
||||
}
|
||||
|
||||
} else if (dStricmp(type, "current") == 0) { //current item in list
|
||||
|
||||
if (dStricmp(rettype, "name") == 0) {
|
||||
|
||||
dStrcpy(retvalue, CurrentItemInList->ItemData.Name);
|
||||
return;
|
||||
|
||||
} else if (dStricmp(rettype, "amount") == 0) {
|
||||
|
||||
dStrcpy(retvalue, inItoa(CurrentItemInList->ItemData.Amount));
|
||||
return;
|
||||
|
||||
} else if (dStricmp(rettype, "type") == 0) {
|
||||
|
||||
dStrcpy(retvalue, CurrentItemInList->ItemData.Type);
|
||||
return;
|
||||
|
||||
} else if (dStricmp(rettype, "description") == 0) {
|
||||
|
||||
dStrcpy(retvalue, CurrentItemInList->ItemData.Description);
|
||||
return;
|
||||
|
||||
} else if (dStricmp(rettype, "max") == 0) {
|
||||
|
||||
dStrcpy(retvalue, inItoa(CurrentItemInList->ItemData.Max));
|
||||
return;
|
||||
|
||||
|
||||
} else { //return all separated by \t
|
||||
|
||||
dStrcpy(retvalue, CurrentItemInList->ItemData.Name);
|
||||
dStrcatl(retvalue, sizeof(retvalue), "\t", inItoa(CurrentItemInList->ItemData.Amount), "\t", CurrentItemInList->ItemData.Type, "\t", CurrentItemInList->ItemData.Description, NULL);
|
||||
return;
|
||||
|
||||
}
|
||||
|
||||
} else {
|
||||
|
||||
InvLink* tempLink = GetLink(type);
|
||||
|
||||
if (tempLink != NULL) {
|
||||
if (dStricmp(rettype, "name") == 0) {
|
||||
|
||||
dStrcpy(retvalue, tempLink->ItemData.Name);
|
||||
return;
|
||||
|
||||
} else if (dStricmp(rettype, "amount") == 0) {
|
||||
|
||||
dStrcpy(retvalue, inItoa(tempLink->ItemData.Amount));
|
||||
return;
|
||||
|
||||
} else if (dStricmp(rettype, "type") == 0) {
|
||||
|
||||
dStrcpy(retvalue, tempLink->ItemData.Type);
|
||||
return;
|
||||
|
||||
} else if (dStricmp(rettype, "description") == 0) {
|
||||
|
||||
dStrcpy(retvalue, tempLink->ItemData.Description);
|
||||
return;
|
||||
|
||||
} else if (dStricmp(rettype, "max") == 0) {
|
||||
|
||||
dStrcpy(retvalue, inItoa(tempLink->ItemData.Max));
|
||||
return;
|
||||
|
||||
|
||||
} else { //return all separated by \t
|
||||
|
||||
dStrcpy(retvalue, tempLink->ItemData.Name);
|
||||
dStrcatl(retvalue, sizeof(retvalue), "\t", inItoa(tempLink->ItemData.Amount), "\t", tempLink->ItemData.Type, "\t", tempLink->ItemData.Description, NULL);
|
||||
return;
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
///////////////////////////////////////////////////////////////
|
||||
// move the currentpos pointer next, last, or first
|
||||
///////////////////////////////////////////////////////////////
|
||||
bool Inventory::MoveCurrent(char* move) {
|
||||
|
||||
if (dStricmp(move, "next") == 0) {
|
||||
|
||||
return NextLink();
|
||||
|
||||
} else if (dStricmp(move, "last") == 0) {
|
||||
|
||||
return LastLink();
|
||||
|
||||
} else if (dStricmp(move, "first") == 0) {
|
||||
|
||||
CurrentItemInList = FirstItemInList;
|
||||
if (CurrentItemInList != NULL)
|
||||
return true;
|
||||
else
|
||||
return false;
|
||||
|
||||
}
|
||||
|
||||
return false;
|
||||
|
||||
}
|
||||
|
||||
///////////////////////////////////////////////////////////////
|
||||
// Increment Amount
|
||||
///////////////////////////////////////////////////////////////
|
||||
bool Inventory::IncAmount(char* name, char* samount) {
|
||||
|
||||
InvLink* tempLink = GetLink(name);
|
||||
S32 amount = dAtoi(samount);
|
||||
|
||||
if (tempLink != NULL) {
|
||||
if ((tempLink->ItemData.Amount + amount) <= tempLink->ItemData.Max) {
|
||||
|
||||
tempLink->ItemData.Amount += amount;
|
||||
return true;
|
||||
} else {
|
||||
if (tempLink->ItemData.Amount < tempLink->ItemData.Max) {
|
||||
tempLink->ItemData.Amount = tempLink->ItemData.Max;
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
|
||||
}
|
||||
|
||||
///////////////////////////////////////////////////////////////
|
||||
// Decrement Amount
|
||||
///////////////////////////////////////////////////////////////
|
||||
bool Inventory::DecAmount(char* name, char* samount) {
|
||||
|
||||
InvLink* tempLink = GetLink(name);
|
||||
S32 amount = dAtoi(samount);
|
||||
|
||||
if (tempLink != NULL) {
|
||||
if ((tempLink->ItemData.Amount - amount) >= 0) {
|
||||
|
||||
tempLink->ItemData.Amount -= amount;
|
||||
return true;
|
||||
}
|
||||
else {
|
||||
if (tempLink->ItemData.Amount > 0) {
|
||||
tempLink->ItemData.Amount = 0;
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
|
||||
}
|
||||
|
||||
///////////////////////////////////////////////////////////////
|
||||
// Set Amount
|
||||
///////////////////////////////////////////////////////////////
|
||||
bool Inventory::SetAmount(char* name, char* samount) {
|
||||
|
||||
InvLink* tempLink = GetLink(name);
|
||||
S32 amount = dAtoi(samount);
|
||||
|
||||
if (tempLink != NULL) {
|
||||
tempLink->ItemData.Amount = amount;
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
|
||||
}
|
||||
|
||||
///////////////////////////////////////////////////////////////
|
||||
// Clears the Amount
|
||||
///////////////////////////////////////////////////////////////
|
||||
void Inventory::ClearInventory() {
|
||||
|
||||
InvLink* getLink = FirstItemInList;
|
||||
|
||||
if (getLink != NULL) {
|
||||
while ( getLink->nextLink != NULL) {
|
||||
|
||||
getLink->ItemData.Amount = 0;
|
||||
|
||||
getLink = getLink->nextLink;
|
||||
}
|
||||
}
|
||||
|
||||
if (getLink != NULL) {
|
||||
getLink->ItemData.Amount = 0;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
///////////////////////////////////////////////////////////////
|
||||
// Link List helper functions
|
||||
///////////////////////////////////////////////////////////////
|
||||
|
||||
///////////////////////////////////////////////////////////////
|
||||
// Add a link to the link list
|
||||
///////////////////////////////////////////////////////////////
|
||||
void Inventory::AddLink(char* name, char* amount, char* type, char* description, char* max) {
|
||||
|
||||
if (FirstItemInList == NULL) { //the list is empty
|
||||
|
||||
FirstItemInList = new InvLink;
|
||||
dStrcpy(FirstItemInList->ItemData.Name, name);
|
||||
FirstItemInList->ItemData.Amount = dAtoi(amount);
|
||||
dStrcpy(FirstItemInList->ItemData.Type, type);
|
||||
dStrcpy(FirstItemInList->ItemData.Description, description);
|
||||
FirstItemInList->ItemData.Max = dAtoi(max);
|
||||
FirstItemInList->nextLink = NULL;
|
||||
FirstItemInList->lastLink = NULL;
|
||||
CurrentItemInList = FirstItemInList;
|
||||
|
||||
} else {
|
||||
|
||||
InvLink* sortLink = FirstItemInList;
|
||||
|
||||
while ( sortLink->nextLink != NULL)
|
||||
sortLink = sortLink->nextLink;
|
||||
|
||||
InvLink* tempLink = new InvLink;
|
||||
|
||||
dStrcpy(tempLink->ItemData.Name, name);
|
||||
tempLink->ItemData.Amount = dAtoi(amount);
|
||||
dStrcpy(tempLink->ItemData.Type, type);
|
||||
dStrcpy(tempLink->ItemData.Description, description);
|
||||
tempLink->ItemData.Max = dAtoi(max);
|
||||
tempLink->nextLink = NULL;
|
||||
|
||||
sortLink->nextLink = tempLink;
|
||||
tempLink->lastLink = sortLink;
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
///////////////////////////////////////////////////////////////
|
||||
// Delete a link from the link list
|
||||
///////////////////////////////////////////////////////////////
|
||||
void Inventory::DeleteLink(char* name) {
|
||||
|
||||
InvLink* deleteLink = GetLink(name);
|
||||
|
||||
if (deleteLink != NULL) {
|
||||
if (deleteLink->lastLink == NULL) { //This is the first link...treat it special
|
||||
|
||||
FirstItemInList = deleteLink->nextLink;
|
||||
deleteLink->nextLink = NULL;
|
||||
FirstItemInList->lastLink = NULL;
|
||||
|
||||
} else {
|
||||
|
||||
if (deleteLink->nextLink != NULL) {
|
||||
deleteLink->nextLink->lastLink = deleteLink->lastLink;
|
||||
deleteLink->lastLink = NULL;
|
||||
deleteLink->nextLink->lastLink->nextLink = deleteLink->nextLink;
|
||||
deleteLink->nextLink = NULL;
|
||||
} else {
|
||||
deleteLink->lastLink->nextLink = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
delete deleteLink;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
///////////////////////////////////////////////////////////////
|
||||
// Go to the next link in the chain
|
||||
///////////////////////////////////////////////////////////////
|
||||
bool Inventory::NextLink() {
|
||||
|
||||
if (CurrentItemInList->nextLink != NULL) {
|
||||
|
||||
CurrentItemInList = CurrentItemInList->nextLink;
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
///////////////////////////////////////////////////////////////
|
||||
// Go to the last link visited in the chain
|
||||
///////////////////////////////////////////////////////////////
|
||||
bool Inventory::LastLink() {
|
||||
|
||||
if (CurrentItemInList->lastLink != NULL) {
|
||||
|
||||
CurrentItemInList = CurrentItemInList->lastLink;
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
///////////////////////////////////////////////////////////////
|
||||
// Get link equal to the name
|
||||
///////////////////////////////////////////////////////////////
|
||||
Inventory::InvLink* Inventory::GetLink(char* name) {
|
||||
|
||||
InvLink* getLink = FirstItemInList;
|
||||
|
||||
if (getLink != NULL) {
|
||||
while ( getLink->nextLink != NULL) {
|
||||
|
||||
if (dStricmp(getLink->ItemData.Name,name) == 0) {
|
||||
|
||||
return getLink;
|
||||
}
|
||||
getLink = getLink->nextLink;
|
||||
}
|
||||
}
|
||||
|
||||
if (getLink != NULL) {
|
||||
if (dStricmp(getLink->ItemData.Name,name) == 0) {
|
||||
|
||||
return getLink;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user