aboutsummaryrefslogtreecommitdiff
path: root/src/main.c
diff options
context:
space:
mode:
authorjacob janzen <53062115+JacobJanzen@users.noreply.github.com>2024-02-14 15:52:57 -0600
committerGitHub <noreply@github.com>2024-02-14 21:52:57 +0000
commitb57c21da92563eed58867a9a6b02c201006cbc57 (patch)
treeb42a7654223d228c140870ef711b6f8e499de118 /src/main.c
parent7e249ef2644071ca56bdbf7820ca9a66fef23d3c (diff)
Automake (#2)
* gnu autotools build * ignore dist
Diffstat (limited to 'src/main.c')
-rw-r--r--src/main.c146
1 files changed, 146 insertions, 0 deletions
diff --git a/src/main.c b/src/main.c
new file mode 100644
index 0000000..086a093
--- /dev/null
+++ b/src/main.c
@@ -0,0 +1,146 @@
+#include <curses.h>
+#include <locale.h>
+#include <stdlib.h>
+#include <time.h>
+
+#include "cavegen.h"
+#include "common.h"
+#include "display.h"
+#include "entity.h"
+#include "ht.h"
+
+bool entity_set_pos(struct entity *e, struct point p, struct map *map)
+{
+ if (e->solid) {
+ if (p.y < 0 || p.x < 0 || p.y >= map->height || p.x >= map->width) {
+ return false;
+ }
+ if (map->map[p.y * map->width + p.x] == WALL) {
+ return false;
+ }
+ }
+
+ e->p = p;
+
+ return true;
+}
+
+bool game_update(
+ display_t *disp, enum action action, ht_t *entities, struct map *map
+)
+{
+ struct entity *player = ht_find(entities, "player");
+ struct entity *camera = ht_find(entities, "camera");
+
+ struct point newp = player->p;
+ struct point newp_cam = camera->p;
+ switch (action) {
+ case ACTION_EXIT : return true;
+ case ACTION_UP :
+ --newp.y;
+ --newp_cam.y;
+ display_message(disp, "moving up");
+ break;
+ case ACTION_DOWN :
+ ++newp.y;
+ ++newp_cam.y;
+ display_message(disp, "moving down");
+ break;
+ case ACTION_LEFT :
+ --newp.x;
+ --newp_cam.x;
+ display_message(disp, "moving left");
+ break;
+ case ACTION_RIGHT :
+ ++newp.x;
+ ++newp_cam.x;
+ display_message(disp, "moving right");
+ break;
+ case ACTION_STAIR_DOWN :
+ if (map->map[player->p.y * map->width + player->p.x] == DOWN_STAIR) {
+ free(map->map);
+ create_cave(map);
+
+ newp = map->entry_point;
+ newp_cam.x = map->entry_point.x - MAIN_PANEL_WIDTH / 2 + 1;
+ newp_cam.y = map->entry_point.y - MAIN_PANEL_HEIGHT / 2 + 1;
+ display_message(disp, "moving down stairs");
+ } else {
+ display_message(disp, "no stairs to go down");
+ }
+ break;
+ case ACTION_STAIR_UP :
+ if (map->map[player->p.y * WIDTH + player->p.x] == UP_STAIR) {
+ display_message(disp, "moving up stairs");
+ return true;
+ } else {
+ display_message(disp, "no stairs to go up");
+ }
+ break;
+ default : display_message(disp, "unrecognized command"); break;
+ }
+
+ if (entity_set_pos(player, newp, map))
+ entity_set_pos(camera, newp_cam, map);
+
+ return false;
+}
+
+int main(void)
+{
+ unsigned int seed = time(NULL);
+ srand(seed);
+
+ display_t *disp = display_init();
+
+ // create the map
+ struct map map;
+ create_cave(&map);
+
+ // create the entity map
+ ht_t *entities = ht_create(1);
+
+ // create the camera
+ struct entity camera;
+ camera.disp_ch = "";
+ camera.solid = false;
+ camera.visible = false;
+ ht_insert(entities, "camera", &camera);
+
+ // create the player
+ struct entity player;
+ player.disp_ch = "@";
+ player.solid = true;
+ player.visible = true;
+ ht_insert(entities, "player", &player);
+
+ // set starting point
+ struct point cam_p = {
+ .x = map.entry_point.x - MAIN_PANEL_WIDTH / 2 + 1,
+ .y = map.entry_point.y - MAIN_PANEL_HEIGHT / 2 + 1,
+ };
+ entity_set_pos(&player, map.entry_point, &map);
+ entity_set_pos(&camera, cam_p, &map);
+
+ // start displaying things
+ display_map(disp, &map, entities);
+ display_instructions(disp);
+ display_status(disp, &player);
+ display_message(disp, "");
+
+ int ch;
+ bool done = false;
+ while (!done) {
+ enum action action = display_process_input();
+ done = game_update(disp, action, entities, &map);
+ display_map(disp, &map, entities);
+ }
+
+ free(map.map);
+ ht_destroy(entities);
+ display_destroy(disp);
+
+ endwin();
+
+ return 0;
+}