X-Git-Url: https://plomlompom.com/repos/foo.html?a=blobdiff_plain;f=roguelike.c;h=76f124a1822c08d77ba89aea3658bfff185895ae;hb=461523407ee764d156d262e7de8780debb49beba;hp=cd96364a9979221903bbc07ecf17f5e16fe568fd;hpb=a09638673d6c79fcf430299c63aab915e2ca19ba;p=plomrogue
diff --git a/roguelike.c b/roguelike.c
index cd96364..76f124a 100644
--- a/roguelike.c
+++ b/roguelike.c
@@ -2,7 +2,6 @@
#include
#include
#include
-#include
#include "windows.h"
struct Map {
@@ -10,10 +9,12 @@ struct Map {
int height;
int offset_x;
int offset_y;
- int player_x;
- int player_y;
char * cells; };
+struct Player {
+ int y;
+ int x; };
+
struct KeyBinding {
char * name;
int key; };
@@ -26,6 +27,8 @@ struct KeysWinData {
struct World {
char * log;
int turn;
+ struct Map * map;
+ struct Player * player;
struct KeyBinding * keybindings;
struct KeysWinData * keyswindata; };
@@ -45,7 +48,7 @@ void draw_with_linebreaks (struct Win * win, char * text, int start_y) {
toggle = 1;
continue; }
else
- mvwaddch(win->curses_win, y, x, text[z]);
+ mvwaddch(win->curses, y, x, text[z]);
if ('\n' == text[z+1]) {
z++;
toggle = 1; }
@@ -58,12 +61,12 @@ void draw_text_from_bottom (struct Win * win, char * text) {
char toggle = 0;
int x, y, offset;
int z = -1;
- for (y = 0; 0 == toggle; y++) // Determine number of lines text would have in a window of
- for (x = 0; x < win->width; x++) { // available width, but infinite height.
+ for (y = 0; 0 == toggle; y++) // Determine number of lines text would have in
+ for (x = 0; x < win->width; x++) { // a window of available width, but infinite height.
z++;
- if ('\n' == text[z]) // Treat \n and \0 as control characters for incrementing y and
- break; // stopping the loop. Make sure they don't count as cell space
- if ('\n' == text[z+1]) { // themselves.
+ if ('\n' == text[z]) // Treat \n and \0 as control characters for incrementing y and stopping
+ break; // the loop. Make sure they don't count as cell space themselves.
+ if ('\n' == text[z+1]) {
z++;
break; }
else if (0 == text[z+1]) {
@@ -93,19 +96,21 @@ void draw_log (struct Win * win) {
void draw_map (struct Win * win) {
// Draw map determined by win->data Map struct into window. Respect offset.
- struct Map map = * (struct Map *) win->data;
- char * cells = map.cells;
- int width_map_av = map.width - map.offset_x;
- int height_map_av = map.height - map.offset_y;
+ struct World * world = (struct World *) win->data;
+ struct Map * map = world->map;
+ struct Player * player = world->player;
+ char * cells = map->cells;
+ int width_map_av = map->width - map->offset_x;
+ int height_map_av = map->height - map->offset_y;
int x, y, z;
for (y = 0; y < win->height; y++) {
- z = map.offset_x + (map.offset_y + y) * (map.width);
+ z = map->offset_x + (map->offset_y + y) * (map->width);
for (x = 0; x < win->width; x++) {
if (y < height_map_av && x < width_map_av) {
- if (z == (map.width * map.player_y) + map.player_x)
- mvwaddch(win->curses_win, y, x, '@');
+ if (z == (map->width * player->y) + player->x)
+ mvwaddch(win->curses, y, x, '@');
else
- mvwaddch(win->curses_win, y, x, cells[z]);
+ mvwaddch(win->curses, y, x, cells[z]);
z++; } } } }
void draw_info (struct Win * win) {
@@ -118,7 +123,7 @@ void draw_info (struct Win * win) {
void toggle_window (struct WinMeta * win_meta, struct Win * win) {
// Toggle display of window win.
- if (0 != win->curses_win)
+ if (0 != win->curses)
suspend_window(win_meta, win);
else
append_window(win_meta, win); }
@@ -130,8 +135,6 @@ struct Map init_map () {
map.height = 128;
map.offset_x = 0;
map.offset_y = 0;
- map.player_x = 2;
- map.player_y = 2;
map.cells = malloc(map.width * map.height);
int x, y;
for (y = 0; y < map.height; y++)
@@ -146,7 +149,6 @@ void update_info (struct World * world) {
// Update info data by incrementing turn value.
world->turn++; }
-//void update_log (struct Win * win, char * text) {
void update_log (struct World * world, char * text) {
// Update log with new text to be appended.
char * new_text;
@@ -237,11 +239,11 @@ void draw_keys_window (struct Win * win) {
free(keyname);
for (x = 0; x < win->width; x++)
if (x < strlen(keydesc))
- mvwaddch(win->curses_win, y, x, keydesc[x] | attri);
+ mvwaddch(win->curses, y, x, keydesc[x] | attri);
else if (strlen(keydesc) < x && x < strlen(keybindings[y + offset].name) + strlen(keydesc) + 1)
- mvwaddch(win->curses_win, y, x, keybindings[y + offset].name[x - strlen(keydesc) - 1] | attri);
+ mvwaddch(win->curses, y, x, keybindings[y + offset].name[x - strlen(keydesc) - 1] | attri);
else
- mvwaddch(win->curses_win, y, x, ' ' | attri); }
+ mvwaddch(win->curses, y, x, ' ' | attri); }
free(keydesc); }
void init_keybindings(struct World * world) {
@@ -256,43 +258,22 @@ void init_keybindings(struct World * world) {
c = getc(file);
if ('\n' == c) {
if (c_count > linemax)
- linemax = c_count;
+ linemax = c_count + 1;
c_count = 0;
lines++; } }
struct KeyBinding * keybindings = malloc(lines * sizeof(struct KeyBinding));
fseek(file, 0, SEEK_SET);
char * command = malloc(linemax);
int commcount = 0;
- char * digits = malloc(3);
- int digicount = 0;
- int key, digimax;
- int keycount = 0;
- c = getc(file);
- while (EOF != c) {
- if ('\n' == c) {
- keybindings[keycount].name = calloc(commcount + 1, sizeof(char));
- memcpy(keybindings[keycount].name, command, commcount);
- keybindings[keycount].key = key;
- keycount++;
- digicount = 0;
- commcount = 0; }
- else if (-1 != digicount)
- if (' ' == c) {
- key = 0;
- digimax = digicount - 1;
- while (digicount > 0) {
- digicount--;
- key = key + ((digits[digicount] - 48) * pow(10, digimax - digicount)); }
- digicount = -1; }
- else {
- digits[digicount] = c;
- digicount++; }
- else {
- command[commcount] = c;
- commcount++; }
- c = getc(file); }
+ char * cmdptr;
+ while (fgets(command, linemax, file)) {
+ keybindings[commcount].key = atoi(command);
+ cmdptr = strchr(command, ' ') + 1;
+ keybindings[commcount].name = malloc(strlen(cmdptr));
+ memcpy(keybindings[commcount].name, cmdptr, strlen(cmdptr) - 1);
+ keybindings[commcount].name[strlen(cmdptr) - 1] = '\0';
+ commcount++; }
free(command);
- free(digits);
fclose(file);
struct KeysWinData * keyswindata = malloc(sizeof(struct KeysWinData));
keyswindata->max = lines - 1;
@@ -311,7 +292,7 @@ void save_keybindings(struct World * world) {
for (i = 0; i <= keyswindata->max; i++)
if (strlen(keybindings[i].name) > linemax)
linemax = strlen(keybindings[i].name);
- linemax = linemax + 6; // + 6 = + 3 digits + whitespace + newline + null byte
+ linemax = linemax + 6; // + 6 = + 3 digits + whitespace + newline + null byte
char * line = malloc(linemax);
for (i = 0; i <= keyswindata->max; i++) {
snprintf(line, linemax, "%d %s\n", keybindings[i].key, keybindings[i].name);
@@ -322,6 +303,12 @@ void save_keybindings(struct World * world) {
int main () {
struct World world;
init_keybindings(&world);
+ struct Map map = init_map();
+ world.map = ↦
+ struct Player player;
+ player.y = 2;
+ player.x = 2;
+ world.player = &player;
WINDOW * screen = initscr();
noecho();
@@ -336,8 +323,7 @@ int main () {
struct Win win_map = init_window(&win_meta, "Map");
win_map.draw = draw_map;
- struct Map map = init_map();
- win_map.data = ↦
+ win_map.data = &world;
world.turn = 0;
struct Win win_info = init_window(&win_meta, "Info");
@@ -405,22 +391,22 @@ int main () {
map.offset_x++;
else if (key == get_action_key(world.keybindings, "map left") && map.offset_x > 0)
map.offset_x--;
- else if (key == get_action_key(world.keybindings, "player down") && map.player_y < map.height - 1) {
+ else if (key == get_action_key(world.keybindings, "player down") && player.y < map.height - 1) {
update_info (&world);
update_log (&world, "\nYou move south.");
- map.player_y++; }
- else if (key == get_action_key(world.keybindings, "player up") && map.player_y > 0) {
+ player.y++; }
+ else if (key == get_action_key(world.keybindings, "player up") && player.y > 0) {
update_info (&world);
update_log (&world, "\nYou move north.");
- map.player_y--; }
- else if (key == get_action_key(world.keybindings, "player right") && map.player_x < map.width - 1) {
+ player.y--; }
+ else if (key == get_action_key(world.keybindings, "player right") && player.x < map.width - 1) {
update_info (&world);
update_log (&world, "\nYou move east.");
- map.player_x++; }
- else if (key == get_action_key(world.keybindings, "player left") && map.player_x > 0) {
+ player.x++; }
+ else if (key == get_action_key(world.keybindings, "player left") && player.x > 0) {
update_info (&world);
update_log (&world, "\nYou move west.");
- map.player_x--; }
+ player.x--; }
else if (key == get_action_key(world.keybindings, "wait") ) {
update_info (&world);
update_log (&world, "\nYou wait."); } }