X-Git-Url: https://plomlompom.com/repos/berlin_corona.txt?a=blobdiff_plain;f=src%2Fobjects_on_map.c;h=a7d9c32a75b4e78a9b9e3ff7970aa618bd03c560;hb=f29ca8b607b7e7cdb23ba90c491aaee2e294633d;hp=53027cd4944029f20019b6a57ee5ab4d1a1aac41;hpb=0e8033daabeddfea46bbb756280292df84cd61af;p=plomrogue diff --git a/src/objects_on_map.c b/src/objects_on_map.c index 53027cd..a7d9c32 100644 --- a/src/objects_on_map.c +++ b/src/objects_on_map.c @@ -4,6 +4,9 @@ #include "yx_uint16.h" #include "readwrite.h" #include "roguelike.h" +#include "map.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. @@ -29,23 +32,28 @@ extern void read_map_objects_monsterdata (void * start, FILE * file) { 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; - struct ChainMapObject * * z = start; uint16_t test; char still_at_start = 1; while (1) { test = read_uint16_bigendian(file); if (0 == test) break; - if (still_at_start) { - cmo = malloc(size); - * z = cmo; - still_at_start = 0; } - else { - cmo->next = malloc(size); - cmo = cmo->next; } + 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); @@ -68,18 +76,11 @@ extern void build_map_objects (void * start, unsigned char n, size_t size, void // Build chain of n map objects starting at start, use f() for object-specific data. unsigned char i; struct ChainMapObject * cmo; - struct ChainMapObject * * z = start; char still_at_start = 1; for (i = 0; i < n; i++) { - if (still_at_start) { - cmo = malloc(size); - * z = cmo; - still_at_start = 0; } - else { - cmo->next = malloc(size); - cmo = cmo->next; } + cmo = get_next_cmo(start, &still_at_start, size, cmo); cmo->pos = find_passable_pos(map); - f(cmo); } + f (cmo); } if (!still_at_start) cmo->next = 0; } @@ -105,6 +106,9 @@ extern void move_monster (struct World * world, struct Monster * monster) { 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) {