home · contact · privacy
Fixed map centering bug, refactored center offseting.
[plomrogue] / src / roguelike.c
index 739d4e3d8f9126b58e77494e454cdd20d8d99bf2..5456e2481ce030a30d12f791b0ada1358d0b21a7 100644 (file)
@@ -82,6 +82,22 @@ void map_scroll (struct Map * map, char dir, struct yx_uint16 win_size) {
   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.
   if (1 == world->interactive) {
@@ -178,6 +194,8 @@ unsigned char meta_keys(int key, struct World * world, struct WinMeta * win_meta
     map_scroll (world->map, EAST, win_map->frame.size);
   else if (key == get_action_key(world->keybindings, "map left"))
     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[]) {