X-Git-Url: https://plomlompom.com/repos/index.html?a=blobdiff_plain;f=roguelike.c;h=4e369bc75875e165758d2223cb416281683c50e2;hb=b34c99f3322baff9eefdc567691101c9fd39dc45;hp=44995457b69247e9b96513cb27a6acde063c698d;hpb=478bf71176d67ec2528a722b763d32dbd3b32782;p=plomrogue
diff --git a/roguelike.c b/roguelike.c
index 4499545..4e369bc 100644
--- a/roguelike.c
+++ b/roguelike.c
@@ -10,6 +10,7 @@ struct World {
int turn;
char * log;
struct Map * map;
+ struct Monster * monster;
struct Player * player; };
struct KeyBinding {
@@ -32,6 +33,10 @@ struct Player {
int y;
int x; };
+struct Monster {
+ int y;
+ int x; };
+
void draw_with_linebreaks (struct Win *, char *, int);
void draw_text_from_bottom (struct Win *, char *);
void draw_log (struct Win *);
@@ -46,6 +51,8 @@ void update_log (struct World *, char *);
void save_keybindings(struct World *);
int get_action_key (struct KeyBinding *, char *);
char * get_keyname(int);
+char is_passable (struct World *, int, int);
+void move_player (struct World *, char);
void draw_with_linebreaks (struct Win * win, char * text, int start_y) {
// Write text into window content space. Start on row start_y. Fill unused rows with whitespace.
@@ -114,6 +121,7 @@ void draw_map (struct Win * win) {
struct World * world = (struct World *) win->data;
struct Map * map = world->map;
struct Player * player = world->player;
+ struct Monster * monster = world->monster;
char * cells = map->cells;
int width_map_av = map->width - map->offset_x;
int height_map_av = map->height - map->offset_y;
@@ -124,6 +132,8 @@ void draw_map (struct Win * win) {
if (y < height_map_av && x < width_map_av) {
if (z == (map->width * player->y) + player->x)
mvwaddch(win->curses, y, x, '@');
+ else if (z == (map->width * monster->y) + monster->x)
+ mvwaddch(win->curses, y, x, 'M');
else
mvwaddch(win->curses, y, x, cells[z]);
z++; } } } }
@@ -217,18 +227,23 @@ void init_keybindings(struct World * world) {
struct Map init_map () {
// Initialize map with some experimental start values.
struct Map map;
- map.width = 128;
- map.height = 128;
+ map.width = 96;
+ map.height = 32;
map.offset_x = 0;
map.offset_y = 0;
map.cells = malloc(map.width * map.height);
- int x, y;
+ int x, y, ran;
+ char terrain;
for (y = 0; y < map.height; y++)
- for (x = 0; x < map.width; x++)
- map.cells[(y * map.width) + x] = '.';
- map.cells[(5 * map.width) + 5] = 'X';
- map.cells[(3 * map.width) + 8] = 'X';
- map.cells[(8 * map.width) + 3] = 'X';
+ for (x = 0; x < map.width; x++) {
+ terrain = '.';
+ ran = rand();
+ 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; }
return map; }
void update_info (struct World * world) {
@@ -315,6 +330,53 @@ char * get_keyname(int keycode) {
sprintf(keyname, "(unknown)");
return keyname; }
+char is_passable (struct World * world, int x, int y) {
+// Check if coordinate on (or beyond) map is accessible to movement.
+ char passable = 0;
+ if (0 <= x && x < world->map->width && 0 <= y && y < world->map->height)
+ if ( '.' == world->map->cells[y * world->map->width + x]
+ && (y != world->monster->y || x != world->monster->x))
+ passable = 1;
+ return passable; }
+
+void move_player (struct World * world, char d) {
+// Move player in direction d, increment turn counter and update log.
+ static char prev = 0;
+ char success = 0;
+ char * dir;
+ if ('s' == d) {
+ dir = "south";
+ if (is_passable(world, world->player->x, world->player->y + 1)) {
+ world->player->y++;
+ success = 1; } }
+ else if ('n' == d) {
+ dir = "north";
+ if (is_passable(world, world->player->x, world->player->y - 1)) {
+ world->player->y--;
+ success = 1; } }
+ else if ('w' == d) {
+ dir = "west";
+ if (is_passable(world, world->player->x - 1, world->player->y)) {
+ world->player->x--;
+ success = 1; } }
+ else if ('e' == d) {
+ dir = "east";
+ if (is_passable(world, world->player->x + 1, world->player->y)) {
+ world->player->x++;
+ success = 1; } }
+ if (success * d == prev)
+ update_log (world, ".");
+ else {
+ char * msg = calloc(25, sizeof(char));
+ char * msg_content = "You fail to move";
+ if (success)
+ msg_content = "You move";
+ sprintf(msg, "\n%s %s.", msg_content, dir);
+ update_log (world, msg);
+ free(msg); }
+ prev = success * d;
+ update_info (world); }
+
int main () {
struct World world;
init_keybindings(&world);
@@ -324,9 +386,13 @@ int main () {
struct Map map = init_map();
world.map = ↦
struct Player player;
- player.y = 2;
- player.x = 2;
+ player.y = 16;
+ player.x = 16;
world.player = &player;
+ struct Monster monster;
+ monster.y = 16;
+ monster.x = 80;
+ world.monster = &monster;
WINDOW * screen = initscr();
noecho();
@@ -403,22 +469,14 @@ 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") && player.y < map.height - 1) {
- update_info (&world);
- update_log (&world, "\nYou move south.");
- player.y++; }
- else if (key == get_action_key(world.keybindings, "player up") && player.y > 0) {
- update_info (&world);
- update_log (&world, "\nYou move north.");
- 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.");
- player.x++; }
- else if (key == get_action_key(world.keybindings, "player left") && player.x > 0) {
- update_info (&world);
- update_log (&world, "\nYou move west.");
- player.x--; }
+ else if (key == get_action_key(world.keybindings, "player down"))
+ move_player(&world, 's');
+ else if (key == get_action_key(world.keybindings, "player up"))
+ move_player(&world, 'n');
+ else if (key == get_action_key(world.keybindings, "player right"))
+ move_player(&world, 'e');
+ else if (key == get_action_key(world.keybindings, "player left"))
+ move_player(&world, 'w');
else if (key == get_action_key(world.keybindings, "wait") ) {
update_info (&world);
update_log (&world, "\nYou wait."); } }