#include "defines.txt"



#define left_key 106   // 'j'
#define down_key 107   // 'k'
#define right_key 108   // 'l'
#define rotate_c_key 105  // 'i'
#define rotate_ac_key 111  // 'o'
#define show_pri_key 112 // 'p'

#define cur_x v253
#define cur_y v252
#define flagno v251
#define tmp_x v250
#define tmp_y v249
#define varno v248

if (new_room) {
  load.pic(room_no);
  draw.pic(room_no);
  discard.pic(room_no);
  load.logics(3); // new piece
  load.logics(4); // erase piece
  load.logics(5); // draw piece
  load.logics(6); // check block move ook
  load.logics(7); // rotate piece
  load.logics(8);  // check for filled rows
  load.view(1);
  load.view(2);
  set.view(ego,1);
  set.horizon(0);
  trace.info(95,13,6);
  set(trace_enabled);
  x = 5;
  y = 0;
 
  call(3);  // next piece
  reset(drop_pressed);

//  animate.obj(ego);
//  stop.motion(ego);
//  draw(ego);
  show.pic();
  program.control();
}

if (key_pressed == right_key) {
  check_x = x;  check_x++;
  call(6);  // check block move ok
  if (block_move_ok) {
    x++;
  }
}

if (key_pressed == left_key && x > 0) {
  check_x = x;  check_x--;
  call(6);  // check block move ok
  if (block_move_ok) {
    x--;
  }
}

if (key_pressed == down_key) {
  set(drop_pressed);
}

if (key_pressed == show_pri_key) {
    show.pri.screen();
}

if (key_pressed == rotate_c_key) {
  old_x = x;
  old_y = y;
  set(rotate_clockwise);
  call(7);  // rotate piece clockwise
  check_x = x;
  check_y = y;
  call(6);  // check block move ok
  reset(rotate_clockwise);
  call(7);  // rotate piece anti-clockwise
  if (block_move_ok) {
    old_x = x;
    old_y = y;
    call(4);  // erase piece
    set(rotate_clockwise);
    call(7);  // rotate piece clockwise
    call(5);  // draw piece
  }
}


cycles_till_next_fall--;
if ((cycles_till_next_fall == 0 || drop_pressed)) {
  cycles_till_next_fall = fall_delay;
DownOneMore:
  check_x = x;
  check_y = y; check_y++;
  call(6);  // check block move ok

  if (!block_move_ok) {
    cur_y = 0;
    cur_x = 0;
  Label2:
    tmp_x = x; tmp_x += cur_x;
    tmp_y = y; tmp_y += cur_y;
    varno = tmp_y;  varno *= 10;  varno += tmp_x;  varno += 9;
    flagno = cur_y; flagno *=4;  flagno += cur_x;  flagno += 100;
    if (issetv(flagno)) {
      *varno = piece_colour;
    }
    cur_x++;
    if (cur_x < 4) {
      goto(Label2);
    }
    else {
      cur_y++;
      if (cur_y < 4) {
        cur_x = 0;
        goto(Label2);
      }
    }
    if ((x != old_x || y != old_y || y == 1)) {
      call(4);  // erase piece
      call(5);  // draw piece
    }
    reset(drop_pressed);
    call(8);  // check for filled rows
    call(3);  // next piece
  }
  else {
    y++;
    if (drop_pressed) { goto(DownOneMore); }
  }
}

if ((x != old_x || y != old_y || y == 1)) {
  call(4);  // erase piece
  call(5);  // draw piece
}

old_x = x;
old_y = y;

//show.mem();

return();