#include #include #include #define ITEM_COUNT 5 // Total number of items that actually exist extern Player *player; extern GLuint invUI; static const Item item[ITEM_COUNT]= { #include "../config/items.h" }; static GLuint itemtex[ITEM_COUNT]; void itemDraw(Player *p,ITEM_ID id); void initInventorySprites(void){ for(int i = 0;idfp(numSlot); static std::vectoriray(numSlot); static std::vectorcurCoord(numSlot); static int range = 200; static int itemWide = 45; float angleB = (float)180/(float)numSlot; float angle = float(angleB/2.0f); unsigned int a = 0; unsigned int end = 0; static vec2 mouseStart = {0,0}; for(auto &r : iray){ r.start.x = player->loc.x + (player->width/2); r.start.y = player->loc.y + (player->height/2); curCoord[a] = r.start; //dfp[a] = 0; a++; }a=0; if(invOpening){ end = 0; for(auto &d : dfp){ if(a != 0){ if(dfp[a-1]>50)d+=1.65*deltaTime; }else{ d += 1.65*deltaTime; } if(d >= range) d = range; a++; }a=0; if(end < numSlot)invOpen=true; }else if(!invOpening){ for(auto &d : dfp){ if(d > 0){ d-=1.65*deltaTime; }else end++; } if(end >= numSlot)invOpen=false; } if(invOpen){ for(auto &r : iray){ angle=180-(angleB*a) - angleB/2.0f; curCoord[a].x += float((dfp[a]) * cos(angle*PI/180)); curCoord[a].y += float((dfp[a]) * sin(angle*PI/180)); r.end = curCoord[a]; glColor4f(0.0f, 0.0f, 0.0f, ((float)dfp[a]/(float)range)*0.4f); glBegin(GL_QUADS); glVertex2i(r.end.x-(itemWide/2), r.end.y-(itemWide/2)); glVertex2i(r.end.x-(itemWide/2)+itemWide, r.end.y-(itemWide/2)); glVertex2i(r.end.x-(itemWide/2)+itemWide, r.end.y-(itemWide/2)+itemWide); glVertex2i(r.end.x-(itemWide/2), r.end.y-(itemWide/2)+itemWide); glEnd(); if(inv[a].count > 0){ glEnable(GL_TEXTURE_2D); glBindTexture(GL_TEXTURE_2D, itemtex[inv[a].id]); glColor4f(1.0f, 1.0f, 1.0f, ((float)dfp[a]/(float)range)*0.8f); glBegin(GL_QUADS); glTexCoord2i(0,1);glVertex2i(r.end.x-(itemWide/2), r.end.y-(itemWide/2)); glTexCoord2i(1,1);glVertex2i(r.end.x-(itemWide/2)+itemWide, r.end.y-(itemWide/2)); glTexCoord2i(1,0);glVertex2i(r.end.x-(itemWide/2)+itemWide, r.end.y-(itemWide/2)+itemWide); glTexCoord2i(0,0);glVertex2i(r.end.x-(itemWide/2), r.end.y-(itemWide/2)+itemWide); glEnd(); glDisable(GL_TEXTURE_2D); ui::putText(r.end.x-(itemWide/2)+(itemWide*.85),r.end.y-(itemWide/1.75),"%d",inv[a].count); } a++; } }else if(invHover){ static int highlight = 0; std::cout << ui::mouse.x << "," << mouseStart.x << "," << mouseSel << std::endl; if(!mouseSel){ mouseStart.x = ui::mouse.x; highlight = sel; mouseSel=true; }else{ if(ui::mouse.x >= mouseStart.x){ highlight = (ui::mouse.x - mouseStart.x)/45; if(highlight>numSlot)highlight=numSlot; if(SDL_GetMouseState(NULL, NULL) & SDL_BUTTON(SDL_BUTTON_RIGHT)){ sel = highlight; mouseSel=false; invHover=false; selected = true; } } if(ui::mouse.x < mouseStart.x){ highlight = (mouseStart.x - ui::mouse.x)/45; if(highlight<0)highlight=0; if(SDL_GetMouseState(NULL, NULL) & SDL_BUTTON(SDL_BUTTON_RIGHT)){ sel = highlight; mouseSel=false; invHover=false; selected = true; } } } for(auto &r : iray){ angle=180-(angleB*a) - angleB/2.0f; curCoord[a].x += float(range) * cos(angle*PI/180); curCoord[a].y += float(range) * sin(angle*PI/180); r.end = curCoord[a]; glColor4f(0.0f, 0.0f, 0.0f, 0.1f); glBegin(GL_QUADS); glVertex2i(r.end.x-(itemWide/2), r.end.y-(itemWide/2)); glVertex2i(r.end.x-(itemWide/2)+itemWide, r.end.y-(itemWide/2)); glVertex2i(r.end.x-(itemWide/2)+itemWide, r.end.y-(itemWide/2)+itemWide); glVertex2i(r.end.x-(itemWide/2), r.end.y-(itemWide/2)+itemWide); glEnd(); if(inv[a].count > 0){ glEnable(GL_TEXTURE_2D); glBindTexture(GL_TEXTURE_2D, itemtex[inv[a].id]); glColor4f(1.0f, 1.0f, 1.0f, a == highlight ? 0.4f : 0.2f); glBegin(GL_QUADS); glTexCoord2i(0,1);glVertex2i(r.end.x-(itemWide/2), r.end.y-(itemWide/2)); glTexCoord2i(1,1);glVertex2i(r.end.x-(itemWide/2)+itemWide, r.end.y-(itemWide/2)); glTexCoord2i(1,0);glVertex2i(r.end.x-(itemWide/2)+itemWide, r.end.y-(itemWide/2)+itemWide); glTexCoord2i(0,0);glVertex2i(r.end.x-(itemWide/2), r.end.y-(itemWide/2)+itemWide); glEnd(); glDisable(GL_TEXTURE_2D); ui::putText(r.end.x-(itemWide/2)+(itemWide*.85),r.end.y-(itemWide/1.75),"%d",inv[a].count); } a++; } } if(inv[sel].count)itemDraw(player,inv[sel].id); lop++; } void itemDraw(Player *p,ITEM_ID id){ if(!id)return; glEnable(GL_TEXTURE_2D); glBindTexture(GL_TEXTURE_2D,itemtex[id]); glColor4ub(255,255,255,255); glBegin(GL_QUADS); glTexCoord2i(0,1);glVertex2f(p->loc.x, p->loc.y); glTexCoord2i(1,1);glVertex2f(p->loc.x+item[id].width,p->loc.y); glTexCoord2i(1,0);glVertex2f(p->loc.x+item[id].width,p->loc.y+item[id].height); glTexCoord2i(0,0);glVertex2f(p->loc.x, p->loc.y+item[id].height); glEnd(); glDisable(GL_TEXTURE_2D); } int Inventory::useItem(void){ ITEM_ID id = item[inv[sel].id].id; switch(id){ case FLASHLIGHT: player->light ^= true; break; default: //ui::dialogBox(item[id].name,NULL,"You cannot use this item."); break; } return 0; }