#include <inventory.h> #include <entities.h> #include <ui.h> #define ITEM_COUNT 2 // Total number of items that actually exist extern Player *player; const char *itemName[]={ "\0", "Dank Maymay", "Sword" }; const char *ITEM_SPRITE[]={ "\0", // Null "assets/items/ITEM_TEST.png", // Dank maymay "assets/items/ITEM_SWORD.png" }; GLuint *ITEM_TEX; void itemDraw(Player *p,ITEM_ID id); unsigned int initInventorySprites(void){ unsigned int i,loadCount=0; ITEM_TEX=(GLuint *)calloc(ITEM_COUNT,sizeof(GLuint)); for(i=0;i<ITEM_COUNT;i++){ if((ITEM_TEX[i]=Texture::loadTexture(ITEM_SPRITE[i+1])))loadCount++; } #ifdef DEBUG DEBUG_printf("Loaded %u/%u item texture(s).\n",loadCount,ITEM_COUNT); #endif // DEBUG return loadCount; } Inventory::Inventory(unsigned int s){ sel=0; size=s; item=(struct item_t *)calloc(size,sizeof(struct item_t)); tossd=false; } Inventory::~Inventory(void){ free(item); } void Inventory::setSelection(unsigned int s){ sel=s; } int Inventory::addItem(ITEM_ID id,unsigned char count){ unsigned int i; for(i=0;i<size;i++){ if(item[i].id==id){ item[i].count+=count; #ifdef DEBUG DEBUG_printf("Gave player %u more %s(s).\n",count,itemName[item[i].id]); #endif // DEBUG return 0; }else if(!item[i].count){ item[i].id=id; item[i].count=count; #ifdef DEBUG DEBUG_printf("Gave player %u %s(s).\n",count,itemName[item[i].id]); #endif // DEBUG return 0; } } #ifdef DEBUG DEBUG_printf("Failed to add non-existant item with id %u.\n",id); #endif // DEBUG return -1; } int Inventory::takeItem(ITEM_ID id,unsigned char count){ unsigned int i; for(i=0;i<size;i++){ if(item[i].id==id){ #ifdef DEBUG DEBUG_printf("Took %u of player's %s(s).\n",count,itemName[item[i].id]); #endif // DEBUG item[i].count-=count; if(item[i].count<0) return item[i].count*-1; return 0; } } return -1; } void Inventory::draw(void){ unsigned int i=0; float y=offset.y,xoff; ui::putText(offset.x-SCREEN_WIDTH/2,y,"Inventory:"); while(item[i].count){ y-=HLINE*12; xoff=ui::putText(offset.x-SCREEN_WIDTH/2,y,"%d x ",item[i].count); glEnable(GL_TEXTURE_2D); glBindTexture(GL_TEXTURE_2D,ITEM_TEX[item[i].id-1]); if(sel==i)glColor3ub(255,0,255); else glColor3ub(255,255,255); glBegin(GL_QUADS); glTexCoord2i(0,1);glVertex2i(xoff ,y); glTexCoord2i(1,1);glVertex2i(xoff+HLINE*10,y); glTexCoord2i(1,0);glVertex2i(xoff+HLINE*10,y+HLINE*10); glTexCoord2i(0,0);glVertex2i(xoff ,y+HLINE*10); glEnd(); y-=ui::fontSize*1.15; ui::putText(offset.x-SCREEN_WIDTH/2,y,"%s",itemName[(unsigned)item[i].id]); glDisable(GL_TEXTURE_2D); i++; } if(item[sel].count)itemDraw(player,item[sel].id); } static vec2 item_coord = {0,0}; static vec2 item_velcd = {0,0}; static bool item_tossd = false; static bool yes=false; void itemDraw(Player *p,ITEM_ID id){ static vec2 p1,p2; if(!id)return; glEnable(GL_TEXTURE_2D); glBindTexture(GL_TEXTURE_2D,ITEM_TEX[id-1]); if(!yes){ p1 = {p->loc.x+p->width/2, p->loc.y+p->width/2+HLINE*3}; p2 = {(float)(p1.x+p->width*(p->left?-.5:.5)), p->loc.y+HLINE*3}; } if(p->inv->tossd) yes=true; glBegin(GL_QUADS); glTexCoord2i(0,1);glVertex2f(item_coord.x+p1.x,item_coord.y+p2.y); glTexCoord2i(1,1);glVertex2f(item_coord.x+p2.x,item_coord.y+p2.y); glTexCoord2i(1,0);glVertex2f(item_coord.x+p2.x,item_coord.y+p1.y); glTexCoord2i(0,0);glVertex2f(item_coord.x+p1.x,item_coord.y+p1.y); glEnd(); glDisable(GL_TEXTURE_2D); } int Inventory::useItem(void){ ITEM_ID id = item[sel].id; switch(id){ default: ui::dialogBox(itemName[id],NULL,"You cannot use this item."); break; } return 0; } int Inventory::itemToss(void){ if(!item_tossd && item[sel].count && item[sel].id){ item_tossd = true; item_coord.x = HLINE; item_velcd.x = 0; item_velcd.y = 3; tossd = true; return 1; }else if(item_tossd){ if(item_coord.y<0){ memset(&item_coord,0,sizeof(vec2)); memset(&item_velcd,0,sizeof(vec2)); item_tossd = false; takeItem(item[sel].id,1); tossd = yes = false; return 0; }else{ item_coord.x += item_velcd.x; item_coord.y += item_velcd.y; //item_velcd.x -= .005; item_velcd.y -= .1; return 1; } } }