Exemple #1
0
static void
place_in_initial_fall (struct anim *g)
{
  struct pos pmt, pmtf, pmtb;
  struct pos fall_pos;

  int dirf = (g->f.dir == LEFT) ? -1 : +1;
  int dirb = (g->f.dir == LEFT) ? +1 : -1;
  survey (_mt, pos, &g->f, NULL, &pmt, NULL);
  prel (&pmt, &pmtf, +0, dirf);
  prel (&pmt, &pmtb, +0, dirb);

  invalid_pos (&fall_pos);

  if (is_strictly_traversable (&pmt)) fall_pos = pmt;
  else if (is_strictly_traversable (&pmtf)) fall_pos = pmtf;
  else if (is_strictly_traversable (&pmtb)) fall_pos = pmtb;

  struct frameset *frameset = get_guard_fall_frameset (g->type);

  if (is_valid_pos (&fall_pos))
    place_frame (&g->f, &g->f, frameset[0].frame,
                 &fall_pos,
                 (g->f.dir == LEFT) ? PLACE_WIDTH - 12 : +6,
                 (g->f.dir == LEFT) ? 23 : 27);
}
Exemple #2
0
struct pos *
get_mouse_pos (struct pos *p)
{
  struct mouse_coord m;
  get_mouse_coord (&m);

  if (! is_valid_coord (&m.c)) {
    invalid_pos (p);
    return p;
  }

  int ry = (m.c.y - 3) % PLACE_HEIGHT;

  pos_gen (&m.c, p, 0, 3);

  if (edit == EDIT_NONE) {
    invalid_pos (p);
    return p;
  }

  struct pos p0;

  switch (fake (p)) {
  case MIRROR: case CHOPPER:
  case WALL: case PILLAR: case BIG_PILLAR_TOP:
  case BIG_PILLAR_BOTTOM: case ARCH_BOTTOM:
  case ARCH_TOP_MID: case ARCH_TOP_SMALL:
  case ARCH_TOP_LEFT: case ARCH_TOP_RIGHT: break;
  default:
    if (is_arch_top (prel (p, &p0, +0, -1)))
      break;
    if (ry >= 60) pos_gen (&m.c, p, 0, 3);
    else if (ry >= 50) pos_gen (&m.c, p, 23 - 2.5 * (ry - 50), 3);
    else pos_gen (&m.c, p, 23, 3);
    break;
  }

  struct pos np; npos (p, &np);
  if (! np.room) {
    invalid_pos (p);
    return p;
  }

  return p;
}
Exemple #3
0
struct pos *
get_new_rel_pos (struct pos *old_src, struct pos *old_dest,
                 struct pos *new_src, struct pos *new_dest)
{

  struct pos nold_src; npos (old_src, &nold_src);
  struct pos nold_dest; npos (old_dest, &nold_dest);
  struct pos nnew_src; npos (new_src, &nnew_src);

  pos2room (&nold_dest, nold_src.room, &nold_dest);
  if (nold_dest.room != nold_src.room)
    return invalid_pos (new_dest);

  new_pos (new_dest, nnew_src.l, nnew_src.room,
           nnew_src.floor + (nold_dest.floor - nold_src.floor),
           nnew_src.place + (nold_dest.place - nold_src.place));

  return npos (new_dest, new_dest);
}
Exemple #4
0
void
update_room0_cache (enum em em, enum vm vm)
{
  room_view = 0;
  struct pos mouse_pos_bkp = mouse_pos;
  invalid_pos (&mouse_pos);
  con_caching = true;

  if (! room0) room0 = create_bitmap (ORIGINAL_WIDTH, ORIGINAL_HEIGHT);

  clear_bitmap (room0, TRANSPARENT_COLOR);

  mr.dx = 0;
  mr.dy = 0;
  draw_room (room0, 0, em, vm);

  con_caching = false;
  mouse_pos = mouse_pos_bkp;
}
Exemple #5
0
static bool
flow (struct anim *k)
{
  struct pos p;

  if (k->oaction != kid_drink)
    k->i = -1, k->wait = 4, k->reverse = false;

  if (k->i < 14 && ! k->reverse) k->i++;
  else if (k->wait > 0) k->wait--;
  else if (k->i == 14 && k->wait == 0) k->reverse = true, k->i = 10;
  else if (k->i == 10 && k->reverse) k->i = 7;
  else {
    kid_normal (k);
    invalid_pos (&k->item_pos);
    return false;
  }

  if (k->i == 14 && k->wait == 1)
    switch (k->item) {
    case EMPTY_POTION: break;
    case SMALL_LIFE_POTION: increase_kid_current_lives (k); break;
    case BIG_LIFE_POTION: increase_kid_total_lives (k); break;
    case SMALL_POISON_POTION:
      if (k->immortal
          || k->poison_immune) break;
      k->current_lives--;
      k->splash = true;
      if (k->current_lives == 0) k->death_reason = POTION_DEATH;
      play_sample (harm_sample, NULL, k->id);
      if (k->id == current_kid_id) {
        mr.flicker = 2;
        mr.color = get_flicker_blood_color ();
      }
      break;
    case BIG_POISON_POTION:
      if (k->immortal
          || k->poison_immune) break;
      k->current_lives = 0;
      k->splash = true;
      k->death_reason = POTION_DEATH;
      play_sample (harm_sample, NULL, k->id);
      if (k->id == current_kid_id) {
        mr.flicker = 2;
        mr.color = get_flicker_blood_color ();
      }
      break;
    case FLOAT_POTION: float_kid (k); break;
    case FLIP_POTION:
      if (screen_flags) screen_flags = 0;
      else {
        switch (prandom_pos (&k->item_pos, 2)) {
        case 0: screen_flags ^= ALLEGRO_FLIP_VERTICAL; break;
        case 1: screen_flags ^= ALLEGRO_FLIP_HORIZONTAL; break;
        case 2: screen_flags ^= ALLEGRO_FLIP_VERTICAL | ALLEGRO_FLIP_HORIZONTAL; break;
        }
      }
      break;
    case ACTIVATION_POTION: p.room = 8, p.floor = p.place = 0;
      activate_con (&p); break;
    default: break;
    }

  select_frame (k, kid_drink_frameset, k->i);

  if (k->i == 14 && k->wait < 4) k->fo.dx = 0;
  if (k->i == 10 && k->reverse) k->fo.dx = -2, k->fo.dy = +1;
  if (k->i == 7 && k->reverse) k->fo.dx = +1;

  return true;
}