void register_changed_room (int room) { if (has_room_changed (room)) return; changed_room = add_to_array (&room, 1, changed_room, &changed_room_nmemb, changed_room_nmemb, sizeof (room)); qsort (changed_room, changed_room_nmemb, sizeof (room), (m_comparison_fn_t) cint); struct pos p; new_pos (&p, &global_level, room, -1, -1); p.floor = 0; for (p.place = 0; p.place < PLACES; p.place++) register_changed_pos (&p, -1); p.place = 0; for (p.floor = 1; p.floor < FLOORS; p.floor++) register_changed_pos (&p, -1); p.place = 9; for (p.floor = 1; p.floor < FLOORS; p.floor++) register_changed_pos (&p, -1); }
void update_cache_pos (struct pos *p, enum em em, enum vm vm) { struct pos q = *p; int x, y; for (q.room = 1; q.room < ROOMS; q.room++) { for (y = mr.h - 1; y >= 0; y--) for (x = 0; x < mr.w; x++) if (mr.cell[x][y].room == q.room) for (q.floor = FLOORS; q.floor >= -1; q.floor--) for (q.place = -1; q.place < PLACES; q.place++) if (peq (&q, p) && ! has_room_changed (q.room)) { ALLEGRO_BITMAP *bitmap = mr.cell[x][y].cache; room_view = q.room; mr.dx = x; mr.dy = y; con_caching = true; push_clipping_rectangle (bitmap, PLACE_WIDTH * q.place - 1, PLACE_HEIGHT * q.floor - 17, 2 * PLACE_WIDTH + 1, PLACE_HEIGHT + 3 + 17); clear_bitmap (bitmap, TRANSPARENT_COLOR); struct pos p0 = q; for (p0.floor = q.floor + 1; p0.floor >= q.floor - 1; p0.floor--) for (p0.place = q.place - 2; p0.place <= q.place + 1; p0.place++) draw_conbg (bitmap, &p0, em, vm); for (p0.floor = q.floor + 1; p0.floor >= q.floor - 1; p0.floor--) for (p0.place = q.place - 2; p0.place <= q.place + 1; p0.place++) draw_confg (bitmap, &p0, em, vm); pop_clipping_rectangle (); con_caching = false; goto next_room; } next_room:; } }
void optimize_changed_pos (void) { if (changed_pos_nmemb < FLOORS * PLACES) return; size_t total = 0; struct pos p; new_pos (&p, &global_level, -1, -1, -1); for (p.room = 1; p.room < ROOMS; p.room++) { int per_room = 0; if (has_room_changed (p.room)) continue; for (p.floor = 0; p.floor < FLOORS; p.floor++) for (p.place = 0; p.place < PLACES; p.place++) { if (get_changed_pos (&p) && ++per_room > OPTIMIZE_CHANGED_POS_THRESHOLD) { register_changed_room (p.room); goto next_room; } if (++total > changed_pos_nmemb) return; } next_room:; } }