void mr_view_page_trans (enum dir d) { int x, y; mr.select_cycles = SELECT_CYCLES; struct mr_origin o; mr_save_origin (&o); switch (d) { case RIGHT: mr_rightmost_cell (&x, &y); mr_set_origin (mr.cell[x][y].room, 0, y); mr_view_trans (RIGHT); break; case LEFT: mr_leftmost_cell (&x, &y); mr_set_origin (mr.cell[x][y].room, mr.w - 1, y); mr_view_trans (LEFT); break; case BELOW: mr_bottommost_cell (&x, &y); mr_set_origin (mr.cell[x][y].room, x, 0); mr_view_trans (BELOW); break; case ABOVE: mr_topmost_cell (&x, &y); mr_set_origin (mr.cell[x][y].room, x, mr.h - 1); mr_view_trans (ABOVE); break; } mr_stabilize_origin (&o, d); }
struct mouse_coord * get_mouse_coord (struct mouse_coord *m) { mr_save_origin (&m->mr); int w = al_get_display_width (display); int h = al_get_display_height (display); int sw, sh; mr_get_resolution (&sw, &sh); al_get_mouse_state (&mouse_state); m->sx = mouse_state.x; m->sy = mouse_state.y; int x = (mouse_state.x * (sw - 1)) / w; int y = (mouse_state.y * (sh - 1)) / h; int flags = screen_flags | potion_flags; if (flags & ALLEGRO_FLIP_HORIZONTAL) x = (sw - 1) - x; if (flags & ALLEGRO_FLIP_VERTICAL) y = (sh - 1) - y; m->c.l = &global_level; if (y < 3 || y >= sh - 8 || x < 0 || x > sw - 1) { m->x = m->y = -1; invalid_coord (&m->c); } else { m->x = x / ORIGINAL_WIDTH; m->y = (y - 3) / ROOM_HEIGHT; m->c.room = mr.cell[m->x][m->y].room; m->c.room = (m->c.room > 0) ? m->c.room : 0; } m->c.x = x % ORIGINAL_WIDTH; m->c.y = ((y - 3) % ROOM_HEIGHT) + 3; return m; }
void set_mouse_room (int room) { struct mouse_coord m; int x, y; if (mr_coord (room, -1, &x, &y)) mr_set_origin (room, x, y); mr_save_origin (&m.mr); new_coord (&m.c, &global_level, room, ORIGINAL_WIDTH / 2, ORIGINAL_HEIGHT / 2); set_mouse_coord (&m); if (! room) { mr_center_room (0); mr.select_cycles = 0; int w = al_get_display_width (display); int h = al_get_display_height (display); al_set_mouse_xy (display, w / 2, h / 2); } }
void mr_view_trans (enum dir d) { int x, y, dx = +0, dy = +0; mr.select_cycles = SELECT_CYCLES; struct mr_origin o; mr_save_origin (&o); for (y = mr.h - 1; y >= 0; y--) for (x = 0; x < mr.w; x++) { int r = mr.cell[x][y].room; if (r <= 0) continue; r = roomd (&global_level, r, d); if (r) { mr_set_origin (r, x, y); mr_stabilize_origin (&o, d); return; } } switch (d) { case RIGHT: if (mr.x > 0) dx = -1; break; case LEFT: if (mr.x < mr.w - 1) dx = +1; break; case BELOW: if (mr.y > 0) dy = -1; break; case ABOVE: if (mr.y < mr.h - 1) dy = +1; break; } mr_set_origin (mr.room, mr.x + dx, mr.y + dy); mr_stabilize_origin (&o, d); return; }