From 4b7e0db3e042625286aab966b037a179069d0b07 Mon Sep 17 00:00:00 2001 From: kts Date: Sat, 16 Nov 2013 02:15:03 -0800 Subject: [PATCH] Added rudimentary Inventory display, however we must have some way to keep track of the selected item in inventory offset. Perhaps through a global variable or, if it must be done, through a new Inventory struct that contains pertinent information. It should likely be the latter, so the same system can be expanded to chests and the like. Also added the ITEM type in general. --- game.c | 5 +++++ interface/sdl.c | 11 +++++++++++ interface/sdl.h | 1 + pack_tiles.c | 1 + tile.c | 9 +++++++++ tile.h | 9 +++++++++ tiles/items.png | Bin 0 -> 466 bytes tiles/tiles.c | 5 +++++ tiles/tiles.h | 3 +++ 9 files changed, 44 insertions(+) create mode 100644 tiles/items.png diff --git a/game.c b/game.c index 749e1e3..d5d4910 100644 --- a/game.c +++ b/game.c @@ -20,10 +20,15 @@ int gameInit() { player = newTile(PLAYER, 0, 2, 2); player->tid = 1; player->id = 12; + ((struct PlayerTile*)player->data)->inventory = newTile(ITEM, 1, 0, 0); + + //gameMoveTile(newTile(ITEM, 0, 4, 4), 4, 4); + current_context = &walkContext; allocateMap(¤t_map, 64, 64); floodMap(¤t_map, TILE_REPLACE, FLOOR, STONE); gameMoveTile(player, 2, 2); + appendTile(&(current_map->matrix[4][4]), ITEM, 0); drawPath(¤t_map, TILE_APPEND, WALL, STONE, 6, 1, 8, 12); drawPath(¤t_map, TILE_APPEND, WALL, STONE, 12, 4, 7, 13); diff --git a/interface/sdl.c b/interface/sdl.c index f96e708..d758c16 100644 --- a/interface/sdl.c +++ b/interface/sdl.c @@ -202,6 +202,7 @@ void interfaceSetScale(float scale_x, float scale_y) { void scaleTiles(float scale_x, float scale_y) { setSpritesheetScale(&player_sprites, scale_x, scale_y); + setSpritesheetScale(&item_sprites, scale_x, scale_y); setSpritesheetScale(&shadow_sprites, scale_x, scale_y); setSpritesheetScale(&door_sprites, scale_x, scale_y); setSpritesheetScale(&npc_sprites, scale_x, scale_y); @@ -249,6 +250,7 @@ int interfaceInit() { ui_spritesheet = IMG_Load_RW(SDL_RWFromMem(&ui_images, ui_images_length), 1); loadSpritesheetFromMemory(&player_sprites, player_images, player_images_length, 16, 32, TOTAL_CLASSES); + loadSpritesheetFromMemory(&item_sprites, item_images, item_images_length, 16, 32, 16); loadSpritesheetFromMemory(&shadow_sprites, shadow_images, shadow_images_length, 16, 32, TOTAL_CLASSES); loadSpritesheetFromMemory(&door_sprites, door_images, door_images_length, 16, 32, 16); loadSpritesheetFromMemory(&npc_sprites, npc_images, npc_images_length, 16, 32, 16); @@ -371,6 +373,9 @@ void cameraDraw() { drawScaledSprite(&shadow_sprites, 0, camera_surface, (step_x*shadow_sprites.s_width)-camera_offset_x, (step_y*shadow_sprites.s_height/2)-camera_offset_y); drawScaledSprite(&player_sprites, current_tile->id, camera_surface, (step_x*player_sprites.s_width)-camera_offset_x, (step_y*player_sprites.s_height/2)-camera_offset_y); break; + case ITEM: + drawScaledSprite(&item_sprites, current_tile->id, camera_surface, (step_x*item_sprites.s_width)-camera_offset_x, (step_y*item_sprites.s_height/2)-camera_offset_y); + break; } current_tile = current_tile->next; } @@ -499,6 +504,12 @@ void interfaceDrawInventory() { SDL_Surface *new_surface = SDL_CreateRGBSurface(screen->flags, (screen->w/6), screen->h/2, screen->format->BitsPerPixel, screen->format->Rmask, screen->format->Gmask, screen->format->Bmask, screen->format->Amask); SDL_Rect render_area = { screen->w-(screen->w/6), screen->h/8, screen->w/6, screen->h/2 }; SDL_FillRect(new_surface, NULL, SDL_MapRGB(new_surface->format, 196, 164, 64)); + struct Tile *current_item = ((struct PlayerTile*)player->data)->inventory; + while (current_item) { + drawScaledSprite(&item_sprites, current_item->id, new_surface, 0, 0); + current_item = current_item->next; + } + //drawScaledSprite(&player_sprites, 0, new_surface, 0, 0); SDL_SetAlpha(new_surface, SDL_SRCALPHA, 128); SDL_BlitSurface(new_surface, NULL, screen, &render_area); SDL_FreeSurface(new_surface); diff --git a/interface/sdl.h b/interface/sdl.h index f2a13b1..289b7d4 100644 --- a/interface/sdl.h +++ b/interface/sdl.h @@ -37,6 +37,7 @@ struct Spritesheet { SDL_Surface *s_spritesheet; }; struct Spritesheet player_sprites; +struct Spritesheet item_sprites; struct Spritesheet shadow_sprites; struct Spritesheet npc_sprites; struct Spritesheet door_sprites; diff --git a/pack_tiles.c b/pack_tiles.c index 5313da2..32816be 100644 --- a/pack_tiles.c +++ b/pack_tiles.c @@ -34,6 +34,7 @@ int main(int argc, char **argv) { convert("tiles/font_mini.png", "font_mini_images"); convert("tiles/ui.png", "ui_images"); convert("tiles/players.png", "player_images"); + convert("tiles/items.png", "item_images"); convert("tiles/npcs.png", "npc_images"); convert("tiles/walls.png", "wall_images"); convert("tiles/floors.png", "floor_images"); diff --git a/tile.c b/tile.c index 2c64b0c..3d83313 100644 --- a/tile.c +++ b/tile.c @@ -59,6 +59,10 @@ struct Tile *newTile(unsigned int type_id, short id, short x, short y) { new_tile->data = (struct NpcTile *) malloc(sizeof(struct NpcTile)); memcpy(new_tile->data, &npcs[id], sizeof(struct NpcTile)); break; + case ITEM: + new_tile->data = (struct ItemTile *) malloc(sizeof(struct ItemTile)); + memcpy(new_tile->data, &items[id], sizeof(struct ItemTile)); + break; default: new_tile->data = (struct BasicTile *) malloc(sizeof(struct BasicTile)); memcpy(new_tile->data, &walls[id], sizeof(struct BasicTile)); @@ -111,3 +115,8 @@ struct PlayerTile players[] = { struct NpcTile npcs[] = { { NO_PASS, "nupi", 4, BEHAVE_WANDER, 0, 0} }; + +struct ItemTile items[] = { + { 0, "small macana", 1, "P1d4" }, + { 0, "large macana", 1, "P1d8" } +}; diff --git a/tile.h b/tile.h index b2169df..a660eed 100644 --- a/tile.h +++ b/tile.h @@ -62,6 +62,15 @@ struct NpcTile { struct Tile *target; }; extern struct NpcTile npcs[]; + +struct ItemTile { + int collision; + char name[16]; + int type; // 0 = generic item, 1 = weapons, 2 = armour + char stats[31]; // instead of having each stat a separate property, a string is used. e.g., "P1d8F1d2I1d4" = physical 1d8, fire 1d2, ice 1d4 +}; +extern struct ItemTile items[]; + /* interface used for creating new Tile */ diff --git a/tiles/items.png b/tiles/items.png new file mode 100644 index 0000000000000000000000000000000000000000..1c37e5960b83e4eccb183da55a0c9e3d673f34b0 GIT binary patch literal 466 zcmeAS@N?(olHy`uVBq!ia0y~yU<5K5893O0R7}x|G$3cDr;B4q#hka-H}WzW3a}gy zE*03(z@5?9(DY)e(~AQsVpX-DeyAo_s%?Lha=ly-s1XGSnkr?bUAxHNcs157X4cG) z75kky4