From: Christian Heller Date: Thu, 18 Jul 2013 02:12:29 +0000 (+0200) Subject: Had forgotten to actually add the new library. X-Git-Tag: tce~1150 X-Git-Url: https://plomlompom.com/repos/%7B%7Bprefix%7D%7D/tasks?a=commitdiff_plain;h=e4f2a14c7385d99d49cf831cd3fd92234caf71b5;p=plomrogue Had forgotten to actually add the new library. --- diff --git a/src/map_object_actions.c b/src/map_object_actions.c new file mode 100644 index 0000000..b016c0c --- /dev/null +++ b/src/map_object_actions.c @@ -0,0 +1,89 @@ +#include "map_object_actions.h" +#include +#include "yx_uint16.h" +#include "misc.h" +#include "map.h" +#include "main.h" +#include "map_objects.h" + +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->map_obj.pos); + char * msg = malloc(100); + struct MapObjDef * mod = get_map_obj_def (world, monster->map_obj.type); + char * desc = mod->desc; + char * desc_other; + if (yx_uint16_cmp (t, world->player->pos)) { + sprintf(msg, "\nThe %s hits you.", desc); + update_log (world, msg); + 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->map_obj.next) { + if (other_monster == monster) + continue; + if (yx_uint16_cmp (t, other_monster->map_obj.pos)) { + mod = get_map_obj_def (world, monster->map_obj.type); + desc_other = mod->desc; + sprintf(msg, "\n%s bumps into %s.", desc, desc_other); + update_log (world, msg); + return; } } + free (msg); + if (is_passable(world->map, t)) + monster->map_obj.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; + struct MapObjDef * mod; + char * msg = calloc(100, sizeof(char)); + char * desc; + for (monster = world->monster; monster != 0; monster = monster->map_obj.next) + if (yx_uint16_cmp (t, monster->map_obj.pos)) { + mod = get_map_obj_def (world, monster->map_obj.type); + desc = mod->desc; + sprintf (msg, "\nYou hit the %s.", desc); + update_log (world, msg); + monster->hitpoints--; + if (0 == monster->hitpoints) { + sprintf (msg, "\nYou kill the %s.", desc); + update_log (world, msg); + if (world->monster == monster) + world->monster = world->monster->map_obj.next; + else { + struct Monster * m_prev; + for (m_prev = world->monster; m_prev->map_obj.next != monster; m_prev = m_prev->map_obj.next); + m_prev->map_obj.next = monster->map_obj.next; } + free(monster); } + turn_over (world, d); + return; } + 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_object_actions.h b/src/map_object_actions.h new file mode 100644 index 0000000..d67e8bb --- /dev/null +++ b/src/map_object_actions.h @@ -0,0 +1,15 @@ +#ifndef MAP_OBJECT_ACTIONS_H +#define MAP_OBJECT_ACTIONS_H + +#include "yx_uint16.h" + +struct World; +struct Map; +struct Monster; + +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