diff --git a/.vimrc b/.vimrc index 29a44e2..d43583d 100644 --- a/.vimrc +++ b/.vimrc @@ -1,4 +1,6 @@ nnoremap :Make nnoremap :Make clean +nnoremap :Make test +nnoremap :!./build/breakhack let g:syntastic_c_include_dirs = [ 'build' ] diff --git a/CMakeLists.txt b/CMakeLists.txt index 3b77b8d..8627f7a 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -61,6 +61,7 @@ add_executable(breakhack src/gui src/item src/item_builder + src/pointer ) target_link_libraries(breakhack diff --git a/Makefile b/Makefile index 759f0cf..31a672d 100644 --- a/Makefile +++ b/Makefile @@ -9,3 +9,7 @@ clean: test: @make test -sC build .PHONY: test + +run: $(all) + @./build/breakhack +.PHONY: run diff --git a/src/item_builder.c b/src/item_builder.c index b2e6655..11fbbc7 100644 --- a/src/item_builder.c +++ b/src/item_builder.c @@ -43,7 +43,8 @@ eat_flesh(Item *item, Player *player) if (player->stats.hp > player->stats.maxhp) player->stats.hp = player->stats.maxhp; - gui_log("You eat some foul meat and gain %d health", player->stats.hp - original_hp); + gui_log("You eat some foul meat and gain %d health", + player->stats.hp - original_hp); } static void @@ -54,7 +55,8 @@ drink_health(Item *item, Player *player) if (player->stats.hp > player->stats.maxhp) player->stats.hp = player->stats.maxhp; - gui_log("You drink a health potion and gain %d health", player->stats.hp - original_hp); + gui_log("You drink a health potion and gain %d health", + player->stats.hp - original_hp); } static Item * @@ -82,11 +84,22 @@ pickup_gold(Item *item, Player *player) } static Item * -create_treasure(void) +create_treasure(int current_level) { - unsigned int value = rand() % TREASURE_COUNT; double amt = (unsigned int) rand() % 40; char label[50]; + unsigned int highest_treasure; + unsigned int value; + + if (current_level > 15) { + highest_treasure = TREASURE_COUNT; + } else if (current_level > 5) { + highest_treasure = PLATINUM; + } else { + highest_treasure = GOLD; + } + + value = rand() % highest_treasure; SDL_Rect clip = { 0, 0, 16, 16 }; switch (value) { @@ -125,7 +138,7 @@ create_treasure(void) } Item * -item_builder_build_item(ItemKey key) +item_builder_build_item(ItemKey key, int level) { static const char *path_flesh = "assets/Items/Flesh.png"; static const char *path_potion = "assets/Items/Potion.png"; @@ -135,7 +148,7 @@ item_builder_build_item(ItemKey key) Item *item = NULL; switch (key) { case TREASURE: - item = create_treasure(); + item = create_treasure(level); break; case FLESH: item = create_item(path_flesh, diff --git a/src/item_builder.h b/src/item_builder.h index c61ace2..4ccfd38 100644 --- a/src/item_builder.h +++ b/src/item_builder.h @@ -28,7 +28,7 @@ void item_builder_init(SDL_Renderer *); Item * -item_builder_build_item(ItemKey key); +item_builder_build_item(ItemKey key, int level); Item * item_builder_build_sack(void); diff --git a/src/main.c b/src/main.c index f2e4521..16ef3f6 100644 --- a/src/main.c +++ b/src/main.c @@ -16,14 +16,15 @@ #include "gui.h" #include "util.h" #include "item_builder.h" +#include "pointer.h" static SDL_Window *gWindow = NULL; static SDL_Renderer *gRenderer = NULL; static Player *gPlayer = NULL; -static LinkedList *gSpriteList = NULL; static Map *gMap = NULL; static RoomMatrix *gRoomMatrix = NULL; static Gui *gGui = NULL; +static Pointer *gPointer = NULL; static unsigned int cLevel = 1; static double renderScale = 1.0; static GameState gGameState; @@ -114,10 +115,11 @@ initViewports(void) static bool initGame(void) { - gSpriteList = linkedlist_create(); initViewports(); gMap = map_lua_generator_run(cLevel, gRenderer); - return gSpriteList == NULL; + gPointer = pointer_create(gRenderer); + + return true; } static @@ -161,6 +163,7 @@ bool handle_events(void) camera_follow_position(&gCamera, &gPlayer->sprite->pos); map_set_current_room(gMap, &gPlayer->sprite->pos); } + pointer_handle_event(gPointer, &event); } return quit; } @@ -198,11 +201,13 @@ check_next_level(void) static void run_game(void) { + SDL_RenderSetViewport(gRenderer, NULL); map_clear_dead_monsters(gMap); map_clear_collected_items(gMap); roommatrix_populate_from_map(gRoomMatrix, gMap); roommatrix_add_lightsource(gRoomMatrix, &gPlayer->sprite->pos); + roommatrix_build_lightmap(gRoomMatrix); gui_set_max_health(gGui, gPlayer->stats.maxhp, gRenderer); @@ -228,6 +233,9 @@ run_game(void) gui_render_log(gGui, BOTTOM_GUI_WIDTH, BOTTOM_GUI_HEIGHT, &gCamera); + SDL_RenderSetViewport(gRenderer, NULL); + pointer_render(gPointer, &gCamera); + SDL_RenderPresent(gRenderer); if (check_if_dead()) @@ -283,6 +291,7 @@ void close(void) map_destroy(gMap); roommatrix_destroy(gRoomMatrix); gui_destroy(gGui); + pointer_destroy(gPointer); item_builder_close(); SDL_DestroyRenderer(gRenderer); SDL_DestroyWindow(gWindow); diff --git a/src/monster.c b/src/monster.c index 3bc0b15..7e672d7 100644 --- a/src/monster.c +++ b/src/monster.c @@ -260,12 +260,12 @@ monster_drop_loot(Monster *monster, Map *map) unsigned int item_count = 0; if ((rand() % treasure_drop_chance) == 0) { - item = item_builder_build_item(TREASURE); + item = item_builder_build_item(TREASURE, map->level); item->sprite->pos = monster->sprite->pos; items[item_count++] = item; } if ((rand() % item_drop_chance) == 0) { - item = item_builder_build_item(rand() % TREASURE); + item = item_builder_build_item(rand() % TREASURE, map->level); item->sprite->pos = monster->sprite->pos; items[item_count++] = item; } diff --git a/src/pointer.c b/src/pointer.c new file mode 100644 index 0000000..66cc387 --- /dev/null +++ b/src/pointer.c @@ -0,0 +1,42 @@ +#include "pointer.h" +#include "util.h" + +Pointer * +pointer_create(SDL_Renderer *renderer) +{ + SDL_ShowCursor(SDL_DISABLE); + + Pointer *p = ec_malloc(sizeof(Pointer)); + p->sprite = sprite_create(); + sprite_load_texture(p->sprite, "assets/Items/MedWep.png", 0, renderer); + p->sprite->fixed = true; + p->sprite->clip = (SDL_Rect) { 0, 0, 16, 16 }; + p->sprite->textures[0]->dim = (Dimension) { + TILE_DIMENSION, TILE_DIMENSION }; + + return p; +} + +void +pointer_handle_event(Pointer *p, SDL_Event *event) +{ + if (event->type == SDL_MOUSEMOTION) { + p->sprite->pos.x = event->motion.x; + p->sprite->pos.y = event->motion.y; + } +} + +void +pointer_render(Pointer *p, Camera *cam) +{ + sprite_render(p->sprite, cam); +} + +void +pointer_destroy(Pointer *p) +{ + SDL_ShowCursor(SDL_ENABLE); + + sprite_destroy(p->sprite); + free(p); +} diff --git a/src/pointer.h b/src/pointer.h new file mode 100644 index 0000000..d92baad --- /dev/null +++ b/src/pointer.h @@ -0,0 +1,24 @@ +#ifndef POINTER_H_ +#define POINTER_H_ + +#include +#include "sprite.h" +#include "camera.h" + +typedef struct Pointer_t { + Sprite *sprite; +} Pointer; + +Pointer * +pointer_create(SDL_Renderer *renderer); + +void +pointer_handle_event(Pointer*, SDL_Event *event); + +void +pointer_render(Pointer*, Camera*); + +void +pointer_destroy(Pointer*); + +#endif // POINTER_H_