map.cells[y * map.size.x + x] = '.'; } }
return map; }
-void map_scroll (struct Map * map, char dir) {
+void map_scroll (struct Map * map, char dir, struct yx_uint16 win_size) {
// Scroll map into direction dir if possible by changing the offset.
- if (NORTH == dir && map->offset.y > 0) map->offset.y--;
- else if (SOUTH == dir) map->offset.y++;
- else if (WEST == dir && map->offset.x > 0) map->offset.x--;
- else if (EAST == dir) map->offset.x++; }
+ if (NORTH == dir && map->offset.y > 0)
+ map->offset.y--;
+ else if (WEST == dir && map->offset.x > 0)
+ map->offset.x--;
+ else if (SOUTH == dir && map->offset.y + win_size.y < map->size.y)
+ map->offset.y++;
+ else if (EAST == dir && map->offset.x + win_size.x < map->size.x)
+ map->offset.x++; }
+
+uint16_t center_offset (uint16_t pos, uint16_t mapsize, uint16_t framesize) {
+// Return the offset for display of a map inside a frame centered on pos.
+ uint16_t offset = 0;
+ if (mapsize > framesize) {
+ if (pos > framesize / 2) {
+ if (pos < mapsize - (framesize / 2))
+ offset = pos - (framesize / 2);
+ else
+ offset = mapsize - framesize; } }
+ return offset; }
+
+void map_center_player (struct Map * map, struct Player * player, struct yx_uint16 frame_size) {
+// Center map on player.
+ map->offset.y = center_offset (player->pos.y, map->size.y, frame_size.y);
+ map->offset.x = center_offset (player->pos.x, map->size.x, frame_size.x); }
void turn_over (struct World * world, char action) {
// Record action in game record file, increment turn and move enemy.
else if (key == get_action_key(world->keybindings, "keys mod"))
keyswin_mod_key (world, win_meta);
else if (key == get_action_key(world->keybindings, "map up"))
- map_scroll (world->map, NORTH);
+ map_scroll (world->map, NORTH, win_map->frame.size);
else if (key == get_action_key(world->keybindings, "map down"))
- map_scroll (world->map, SOUTH);
+ map_scroll (world->map, SOUTH, win_map->frame.size);
else if (key == get_action_key(world->keybindings, "map right"))
- map_scroll (world->map, EAST);
+ map_scroll (world->map, EAST, win_map->frame.size);
else if (key == get_action_key(world->keybindings, "map left"))
- map_scroll (world->map, WEST);
+ map_scroll (world->map, WEST, win_map->frame.size);
+ else if (key == get_action_key(world->keybindings, "map center player"))
+ map_center_player (world->map, world->player, win_map->frame.size);
return 0; }
int main (int argc, char *argv[]) {