From: Christian Heller Date: Wed, 10 Jul 2013 22:56:32 +0000 (+0200) Subject: Renamed "objects_on_map" library to "map_objects". X-Git-Tag: tce~1155 X-Git-Url: https://plomlompom.com/repos/?a=commitdiff_plain;h=8661a8acfacc7cdd2935732fe5ead7d279a200b0;p=plomrogue Renamed "objects_on_map" library to "map_objects". --- diff --git a/src/draw_wins.c b/src/draw_wins.c index dd96c36..c32d8b4 100644 --- a/src/draw_wins.c +++ b/src/draw_wins.c @@ -6,7 +6,7 @@ #include "windows.h" #include "misc.h" #include "keybindings.h" -#include "objects_on_map.h" +#include "map_objects.h" #include "map.h" #include "main.h" diff --git a/src/main.c b/src/main.c index 4dd1673..c22e0c2 100644 --- a/src/main.c +++ b/src/main.c @@ -7,7 +7,7 @@ #include "draw_wins.h" #include "keybindings.h" #include "readwrite.h" -#include "objects_on_map.h" +#include "map_objects.h" #include "map.h" #include "misc.h" diff --git a/src/map.c b/src/map.c index f72482e..2db0b9b 100644 --- a/src/map.c +++ b/src/map.c @@ -2,7 +2,7 @@ #include #include #include "misc.h" -#include "objects_on_map.h" +#include "map_objects.h" struct Map init_map () { // Initialize map with some experimental start values. diff --git a/src/map_objects.c b/src/map_objects.c new file mode 100644 index 0000000..1927e14 --- /dev/null +++ b/src/map_objects.c @@ -0,0 +1,161 @@ +#include "map_objects.h" +#include +#include +#include "yx_uint16.h" +#include "readwrite.h" +#include "misc.h" +#include "map.h" +#include "main.h" + +static struct ChainMapObject * get_next_cmo (void *, char *, size_t, struct ChainMapObject *); + +extern void readwrite_map_objects_dummy (void * dummy, FILE * file) { +// Dummy function for calls of (write|read)_map_objects on map objects without specific attributes. + ; } + +extern void write_map_objects_monsterdata (void * start, FILE * file) { +// Write to file data specific tto map objects of type monster. + struct Monster * monster = (struct Monster *) start; + fputc(monster->hitpoints, file); } + +extern void write_map_objects (void * start, FILE * file, void (* f) (void *, FILE *) ) { +// Write into file the map object chain starting at start, use f() for object-type specific data. + struct ChainMapObject * cmo; + for (cmo = start; cmo != 0; cmo = cmo->next) { + write_uint16_bigendian(cmo->pos.y + 1, file); + write_uint16_bigendian(cmo->pos.x + 1, file); + fputc(cmo->name, file); + f (cmo, file); } + write_uint16_bigendian(0, file); } + +extern void read_map_objects_monsterdata (void * start, FILE * file) { +// Read from file data speciifc to map objects of type monster. + struct Monster * monster = (struct Monster *) start; + monster->hitpoints = fgetc(file); } + +static struct ChainMapObject * get_next_cmo (void * start, char * still_at_start, size_t size, struct ChainMapObject * cmo) { +// Return pointer to map object of size "size". If first in chain ("still_at_start"), make "start" point to it. + if (*still_at_start) { + struct ChainMapObject * * z = start; + cmo = malloc(size); + * z = cmo; + *still_at_start = 0; } + else { + cmo->next = malloc(size); + cmo = cmo->next; } + return cmo; } + +extern void read_map_objects (void * start, FILE * file, size_t size, void (* f) (void *, FILE *) ) { +// Read from file chain of map objects starting at start, use f() for object-type specific data. + struct ChainMapObject * cmo; + uint16_t test; + char still_at_start = 1; + while (1) { + test = read_uint16_bigendian(file); + if (0 == test) + break; + cmo = get_next_cmo(start, &still_at_start, size, cmo); + cmo->pos.y = test - 1; + cmo->pos.x = read_uint16_bigendian(file) - 1; + cmo->name = fgetc(file); + f (cmo, file); } + if (!still_at_start) + cmo->next = 0; } + +extern void build_map_objects_monsterdata (void * start) { +// Build data specific to map objects of type monster. + struct Monster * monster = (struct Monster *) start; + monster->cmo.name = 'A' + (rrand(0, 0) % 8); + monster->hitpoints = 5; } + +extern void build_map_objects_itemdata (void * start) { +// Build data speciifc to map objects of type data. + struct Item * item = (struct Item *) start; + item->cmo.name = '#' + (rrand(0, 0) % 4); } + +extern void build_map_objects (void * start, unsigned char n, size_t size, void (* f) (void *), struct Map * map) { +// Build chain of n map objects starting at start, use f() for object-specific data. + unsigned char i; + struct ChainMapObject * cmo; + char still_at_start = 1; + for (i = 0; i < n; i++) { + cmo = get_next_cmo(start, &still_at_start, size, cmo); + cmo->pos = find_passable_pos(map); + f (cmo); } + if (!still_at_start) + cmo->next = 0; } + +extern struct yx_uint16 find_passable_pos (struct Map * map) { +// Return a random passable position on map. + struct yx_uint16 pos; + for (pos.y = pos.x = 0; 0 == is_passable(map, pos);) { + pos.y = rrand(0, 0) % map->size.y; + pos.x = rrand(0, 0) % map->size.x; } + return pos; } + +extern char is_passable (struct Map * map, struct yx_uint16 pos) { +// Check if coordinate on (or beyond) map is accessible to actor movement. + char passable = 0; + if (0 <= pos.x && pos.x < map->size.x && 0 <= pos.y && pos.y < map->size.y) + if ('.' == map->cells[pos.y * map->size.x + pos.x]) + passable = 1; + return passable; } + +extern void move_monster (struct World * world, struct Monster * monster) { +// Move monster in random direction, trigger fighting when hindered by player/monster. + char d = rrand(0, 0) % 5; + struct yx_uint16 t = mv_yx_in_dir (d, monster->cmo.pos); + if (yx_uint16_cmp (t, world->player->pos)) { + update_log (world, "\nThe monster hits you."); + world->player->hitpoints--; + if (0 == world->player->hitpoints) + update_log (world, "\nYou are dead."); + return; } + struct Monster * other_monster; + for (other_monster = world->monster; other_monster != 0; other_monster = other_monster->cmo.next) { + if (other_monster == monster) + continue; + if (yx_uint16_cmp (t, other_monster->cmo.pos)) { + update_log (world, "\nMonster bumps into monster."); + return; } } + if (is_passable(world->map, t)) + monster->cmo.pos = t; } + +extern void move_player (struct World * world, char d) { +// Move player in direction d, update log and turn over to the enemy. + struct yx_uint16 t = mv_yx_in_dir (d, world->player->pos); + struct Monster * monster; + for (monster = world->monster; monster != 0; monster = monster->cmo.next) + if (yx_uint16_cmp (t, monster->cmo.pos)) { + update_log (world, "\nYou hit the monster."); + monster->hitpoints--; + if (0 == monster->hitpoints) { + update_log (world, "\nYou kill the monster."); + if (world->monster == monster) + world->monster = world->monster->cmo.next; + else { + struct Monster * m_prev; + for (m_prev = world->monster; m_prev->cmo.next != monster; m_prev = m_prev->cmo.next); + m_prev->cmo.next = monster->cmo.next; } + free(monster); } + turn_over (world, d); + return; } + char * msg = calloc(25, sizeof(char)); + char * msg_content = "You fail to move"; + char * dir; + if (NORTH == d) dir = "north"; + else if (EAST == d) dir = "east" ; + else if (SOUTH == d) dir = "south"; + else if (WEST == d) dir = "west" ; + if (is_passable(world->map, t)) { + msg_content = "You move"; + world->player->pos = t; } + sprintf(msg, "\n%s %s.", msg_content, dir); + update_log (world, msg); + free(msg); + turn_over (world, d); } + +extern void player_wait (struct World * world) { +// Make player wait one turn. + update_log (world, "\nYou wait."); + turn_over (world, 0); } diff --git a/src/map_objects.h b/src/map_objects.h new file mode 100644 index 0000000..6f3772e --- /dev/null +++ b/src/map_objects.h @@ -0,0 +1,41 @@ +#ifndef ACTORS_H +#define ACTORS_H + +#include +#include "yx_uint16.h" + +struct World; +struct Map; + +struct Player { + struct yx_uint16 pos; + unsigned char hitpoints; }; + +struct ChainMapObject { + void * next; + unsigned char name; + struct yx_uint16 pos; }; + +struct Item { + struct ChainMapObject cmo; }; + +struct Monster { + struct ChainMapObject cmo; + unsigned char hitpoints; }; + +extern void readwrite_map_objects_dummy (void *, FILE *); +extern void write_map_objects_monsterdata (void *, FILE *); +extern void write_map_objects (void * start, FILE *, void (*) (void *, FILE *) ); +extern void read_map_objects_monsterdata (void *, FILE *); +extern void read_map_objects (void *, FILE *, size_t, void (*) (void *, FILE *) ); +extern void build_map_objects_monsterdata (void *); +extern void build_map_objects_itemdata (void *); +extern void build_map_objects (void *, unsigned char, size_t, void (*) (void *), struct Map *); + +extern struct yx_uint16 find_passable_pos (struct Map *); +extern char is_passable (struct Map *, struct yx_uint16); +extern void move_monster (struct World *, struct Monster *); +extern void move_player (struct World *, char); +extern void player_wait(struct World *); + +#endif diff --git a/src/misc.c b/src/misc.c index d4d0ae6..6832b1a 100644 --- a/src/misc.c +++ b/src/misc.c @@ -4,7 +4,7 @@ #include "windows.h" #include "keybindings.h" #include "readwrite.h" -#include "objects_on_map.h" +#include "map_objects.h" #include "map.h" #include "main.h" diff --git a/src/objects_on_map.c b/src/objects_on_map.c deleted file mode 100644 index d74981b..0000000 --- a/src/objects_on_map.c +++ /dev/null @@ -1,161 +0,0 @@ -#include "objects_on_map.h" -#include -#include -#include "yx_uint16.h" -#include "readwrite.h" -#include "misc.h" -#include "map.h" -#include "main.h" - -static struct ChainMapObject * get_next_cmo (void *, char *, size_t, struct ChainMapObject *); - -extern void readwrite_map_objects_dummy (void * dummy, FILE * file) { -// Dummy function for calls of (write|read)_map_objects on map objects without specific attributes. - ; } - -extern void write_map_objects_monsterdata (void * start, FILE * file) { -// Write to file data specific tto map objects of type monster. - struct Monster * monster = (struct Monster *) start; - fputc(monster->hitpoints, file); } - -extern void write_map_objects (void * start, FILE * file, void (* f) (void *, FILE *) ) { -// Write into file the map object chain starting at start, use f() for object-type specific data. - struct ChainMapObject * cmo; - for (cmo = start; cmo != 0; cmo = cmo->next) { - write_uint16_bigendian(cmo->pos.y + 1, file); - write_uint16_bigendian(cmo->pos.x + 1, file); - fputc(cmo->name, file); - f (cmo, file); } - write_uint16_bigendian(0, file); } - -extern void read_map_objects_monsterdata (void * start, FILE * file) { -// Read from file data speciifc to map objects of type monster. - struct Monster * monster = (struct Monster *) start; - monster->hitpoints = fgetc(file); } - -static struct ChainMapObject * get_next_cmo (void * start, char * still_at_start, size_t size, struct ChainMapObject * cmo) { -// Return pointer to map object of size "size". If first in chain ("still_at_start"), make "start" point to it. - if (*still_at_start) { - struct ChainMapObject * * z = start; - cmo = malloc(size); - * z = cmo; - *still_at_start = 0; } - else { - cmo->next = malloc(size); - cmo = cmo->next; } - return cmo; } - -extern void read_map_objects (void * start, FILE * file, size_t size, void (* f) (void *, FILE *) ) { -// Read from file chain of map objects starting at start, use f() for object-type specific data. - struct ChainMapObject * cmo; - uint16_t test; - char still_at_start = 1; - while (1) { - test = read_uint16_bigendian(file); - if (0 == test) - break; - cmo = get_next_cmo(start, &still_at_start, size, cmo); - cmo->pos.y = test - 1; - cmo->pos.x = read_uint16_bigendian(file) - 1; - cmo->name = fgetc(file); - f (cmo, file); } - if (!still_at_start) - cmo->next = 0; } - -extern void build_map_objects_monsterdata (void * start) { -// Build data specific to map objects of type monster. - struct Monster * monster = (struct Monster *) start; - monster->cmo.name = 'A' + (rrand(0, 0) % 8); - monster->hitpoints = 5; } - -extern void build_map_objects_itemdata (void * start) { -// Build data speciifc to map objects of type data. - struct Item * item = (struct Item *) start; - item->cmo.name = '#' + (rrand(0, 0) % 4); } - -extern void build_map_objects (void * start, unsigned char n, size_t size, void (* f) (void *), struct Map * map) { -// Build chain of n map objects starting at start, use f() for object-specific data. - unsigned char i; - struct ChainMapObject * cmo; - char still_at_start = 1; - for (i = 0; i < n; i++) { - cmo = get_next_cmo(start, &still_at_start, size, cmo); - cmo->pos = find_passable_pos(map); - f (cmo); } - if (!still_at_start) - cmo->next = 0; } - -extern struct yx_uint16 find_passable_pos (struct Map * map) { -// Return a random passable position on map. - struct yx_uint16 pos; - for (pos.y = pos.x = 0; 0 == is_passable(map, pos);) { - pos.y = rrand(0, 0) % map->size.y; - pos.x = rrand(0, 0) % map->size.x; } - return pos; } - -extern char is_passable (struct Map * map, struct yx_uint16 pos) { -// Check if coordinate on (or beyond) map is accessible to actor movement. - char passable = 0; - if (0 <= pos.x && pos.x < map->size.x && 0 <= pos.y && pos.y < map->size.y) - if ('.' == map->cells[pos.y * map->size.x + pos.x]) - passable = 1; - return passable; } - -extern void move_monster (struct World * world, struct Monster * monster) { -// Move monster in random direction, trigger fighting when hindered by player/monster. - char d = rrand(0, 0) % 5; - struct yx_uint16 t = mv_yx_in_dir (d, monster->cmo.pos); - if (yx_uint16_cmp (t, world->player->pos)) { - update_log (world, "\nThe monster hits you."); - world->player->hitpoints--; - if (0 == world->player->hitpoints) - update_log (world, "\nYou are dead."); - return; } - struct Monster * other_monster; - for (other_monster = world->monster; other_monster != 0; other_monster = other_monster->cmo.next) { - if (other_monster == monster) - continue; - if (yx_uint16_cmp (t, other_monster->cmo.pos)) { - update_log (world, "\nMonster bumps into monster."); - return; } } - if (is_passable(world->map, t)) - monster->cmo.pos = t; } - -extern void move_player (struct World * world, char d) { -// Move player in direction d, update log and turn over to the enemy. - struct yx_uint16 t = mv_yx_in_dir (d, world->player->pos); - struct Monster * monster; - for (monster = world->monster; monster != 0; monster = monster->cmo.next) - if (yx_uint16_cmp (t, monster->cmo.pos)) { - update_log (world, "\nYou hit the monster."); - monster->hitpoints--; - if (0 == monster->hitpoints) { - update_log (world, "\nYou kill the monster."); - if (world->monster == monster) - world->monster = world->monster->cmo.next; - else { - struct Monster * m_prev; - for (m_prev = world->monster; m_prev->cmo.next != monster; m_prev = m_prev->cmo.next); - m_prev->cmo.next = monster->cmo.next; } - free(monster); } - turn_over (world, d); - return; } - char * msg = calloc(25, sizeof(char)); - char * msg_content = "You fail to move"; - char * dir; - if (NORTH == d) dir = "north"; - else if (EAST == d) dir = "east" ; - else if (SOUTH == d) dir = "south"; - else if (WEST == d) dir = "west" ; - if (is_passable(world->map, t)) { - msg_content = "You move"; - world->player->pos = t; } - sprintf(msg, "\n%s %s.", msg_content, dir); - update_log (world, msg); - free(msg); - turn_over (world, d); } - -extern void player_wait (struct World * world) { -// Make player wait one turn. - update_log (world, "\nYou wait."); - turn_over (world, 0); } diff --git a/src/objects_on_map.h b/src/objects_on_map.h deleted file mode 100644 index 6f3772e..0000000 --- a/src/objects_on_map.h +++ /dev/null @@ -1,41 +0,0 @@ -#ifndef ACTORS_H -#define ACTORS_H - -#include -#include "yx_uint16.h" - -struct World; -struct Map; - -struct Player { - struct yx_uint16 pos; - unsigned char hitpoints; }; - -struct ChainMapObject { - void * next; - unsigned char name; - struct yx_uint16 pos; }; - -struct Item { - struct ChainMapObject cmo; }; - -struct Monster { - struct ChainMapObject cmo; - unsigned char hitpoints; }; - -extern void readwrite_map_objects_dummy (void *, FILE *); -extern void write_map_objects_monsterdata (void *, FILE *); -extern void write_map_objects (void * start, FILE *, void (*) (void *, FILE *) ); -extern void read_map_objects_monsterdata (void *, FILE *); -extern void read_map_objects (void *, FILE *, size_t, void (*) (void *, FILE *) ); -extern void build_map_objects_monsterdata (void *); -extern void build_map_objects_itemdata (void *); -extern void build_map_objects (void *, unsigned char, size_t, void (*) (void *), struct Map *); - -extern struct yx_uint16 find_passable_pos (struct Map *); -extern char is_passable (struct Map *, struct yx_uint16); -extern void move_monster (struct World *, struct Monster *); -extern void move_player (struct World *, char); -extern void player_wait(struct World *); - -#endif