X-Git-Url: https://plomlompom.com/repos/?a=blobdiff_plain;ds=sidebyside;f=roguelike.c;h=4c294e5564aae21262c404ea3583f5f958e185f9;hb=f6ee23265cf2e798c7a9d2d9010add035cfeb68a;hp=aef863e532f071a73b7d63f320666234b755b8b2;hpb=5412e81a7b206b84e82c73ff322e0f34db71dcf3;p=plomrogue diff --git a/roguelike.c b/roguelike.c index aef863e..4c294e5 100644 --- a/roguelike.c +++ b/roguelike.c @@ -105,19 +105,25 @@ struct Map init_map () { map.height = 64; map.offset_x = 0; map.offset_y = 0; - map.cells = malloc(map.width * map.height); - uint16_t x, y, ran; - char terrain; + uint32_t size = map.width * map.height; + map.cells = malloc(size); + uint16_t y, x; for (y = 0; y < map.height; y++) - for (x = 0; x < map.width; x++) { - terrain = '.'; - ran = rrand(0, 0); - if ( 0 == ran % ((x*x) / 3 + 1) - || 0 == ran % ((y*y) / 3 + 1) - || 0 == ran % ((map.width - x - 1) * (map.width - x - 1) / 3 + 1) - || 0 == ran %((map.height - y - 1) * (map.height - y - 1) / 3 + 1)) - terrain = ' '; - map.cells[(y * map.width) + x] = terrain; } + for (x = 0; x < map.width; x++) + map.cells[(y * map.width) + x] = '~'; + map.cells[size / 2 + (map.width / 2)] = '.'; + uint32_t repeats, root, curpos; + for (root = 0; root * root * root < size; root++); + for (repeats = 0; repeats < size * root; repeats++) { + y = rrand(0, 0) % map.height; + x = rrand(0, 0) % map.width; + curpos = y * map.width + x; + if ('~' == map.cells[curpos] && + ( (curpos >= map.width && '.' == map.cells[curpos - map.width]) + || (curpos < map.width * (map.height - 1) && '.' == map.cells[curpos + map.width]) + || (curpos > 0 && '.' == map.cells[curpos - 1] && curpos % map.width != 0) + || (curpos < (map.width * map.height) && '.' == map.cells[curpos + 1] && (curpos + 1) % map.width != 0))) + map.cells[y * map.width + x] = '.'; } return map; } void map_scroll (struct Map * map, char dir) { @@ -291,10 +297,14 @@ int main (int argc, char *argv[]) { struct World world; world.interactive = 1; int opt; - while ((opt = getopt(argc, argv, "s")) != -1) { + uint32_t start_turn; + while ((opt = getopt(argc, argv, "s::")) != -1) { switch (opt) { case 's': world.interactive = 0; + start_turn = 0; + if (optarg) + start_turn = atoi(optarg); break; default: exit(EXIT_FAILURE); } } @@ -345,16 +355,22 @@ int main (int argc, char *argv[]) { toggle_window(&win_meta, &win_log); int key; - unsigned char result; + unsigned char quit_called; if (0 == world.interactive) { + unsigned char still_reading_file = 1; int action; while (1) { - draw_all_windows (&win_meta); - key = getch(); - if (key == get_action_key(world.keybindings, "wait / next turn") ) { + if (start_turn == world.turn) + start_turn = 0; + if (0 == start_turn) { + draw_all_windows (&win_meta); + key = getch(); } + if (1 == still_reading_file && + (world.turn < start_turn || key == get_action_key(world.keybindings, "wait / next turn")) ) { action = getc(file); - if (EOF == action) - break; + if (EOF == action) { + start_turn = 0; + still_reading_file = 0; } else if (0 == action) player_wait (&world); else if ('s' == action) @@ -366,8 +382,8 @@ int main (int argc, char *argv[]) { else if ('w' == action) move_player(&world, 'w'); } else - result = meta_keys(key, &world, &win_meta, &win_keys, &win_map, &win_info, &win_log); - if (1 == result) + quit_called = meta_keys(key, &world, &win_meta, &win_keys, &win_map, &win_info, &win_log); + if (1 == quit_called) break; } } else { uint32_t last_turn = 0; @@ -388,8 +404,8 @@ int main (int argc, char *argv[]) { else if (key == get_action_key(world.keybindings, "wait / next turn")) player_wait (&world); else - result = meta_keys(key, &world, &win_meta, &win_keys, &win_map, &win_info, &win_log); - if (1 == result) + quit_called = meta_keys(key, &world, &win_meta, &win_keys, &win_map, &win_info, &win_log); + if (1 == quit_called) break; } } free(map.cells);