X-Git-Url: https://plomlompom.com/repos/%7B%7B%20web_path%20%7D%7D/decks/%7B%7Bdeck_id%7D%7D/cards/%7B%7Bcard_id%7D%7D/static/git-logo.png?a=blobdiff_plain;f=src%2Fobjects_on_map.c;h=d74981b6f652ac95f5e0f6430c60761910bf1233;hb=868c0fd39978607ad2f68edd426f48a491ac1a2d;hp=53027cd4944029f20019b6a57ee5ab4d1a1aac41;hpb=0e8033daabeddfea46bbb756280292df84cd61af;p=plomrogue diff --git a/src/objects_on_map.c b/src/objects_on_map.c index 53027cd..d74981b 100644 --- a/src/objects_on_map.c +++ b/src/objects_on_map.c @@ -3,7 +3,11 @@ #include #include "yx_uint16.h" #include "readwrite.h" -#include "roguelike.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. @@ -29,23 +33,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 +77,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 +107,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) {