Пример #1
0
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);
}
Пример #2
0
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:;
  }
}
Пример #3
0
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:;
  }
}