/*
 * xrick/devtools.c
 *
 * Copyright (C) 1998-2002 BigOrno (bigorno@bigorno.net).
 * Copyright (C) 2008-2014 Pierluigi Vicinanza.
 * All rights reserved.
 *
 * The use and distribution terms for this software are contained in the file
 * named README, which can be found in the root of this distribution. By
 * using this software in any fashion, you are agreeing to be bound by the
 * terms of this license.
 *
 * You must not remove this notice, or any other, from this software.
 */

#include "xrick/config.h"

#ifdef ENABLE_DEVTOOLS

#include "xrick/devtools.h"
#include "xrick/game.h"
#include "xrick/control.h"
#include "xrick/screens.h"
#include "xrick/draw.h"
#include "xrick/data/sprites.h"
#include "xrick/maps.h"
#include "xrick/system/system.h"

/*
 * DevTools
 */

U8
devtools_run(void)
{
  static U8 seq = 0;
  static U8 pos = 0;
  static U8 pos2 = 0;
  U8 i, j, k, l;
  U8 s[128];

  if (seq == 0) {
    sysvid_clear();
    game_rects = &draw_SCREENRECT;
#ifdef GFXPC
    draw_filter = 0xffff;
#endif
    seq = 1;
  }

  switch (seq) {
  case 1:  /* draw tiles */
    sysvid_clear();
    draw_tilesBank = 0;
    sys_snprintf(s, sizeof(s), "TILES@BANK@%d\376", pos);
    draw_setfb(4, 4);
    draw_tilesListImm(s);
    k = 0;
    for (i = 0; i < 0x10; i++) {
      draw_setfb(80 + i * 0x0a, 14);
      draw_tile((i<10?0x30:'A'-10) + i);
      draw_setfb(64, 30 + i * 0x0a);
      draw_tile((i<10?0x30:'A'-10) + i);
    }
    draw_tilesBank = pos;
    for (i = 0; i < 0x10; i++)
      for (j = 0; j < 0x10; j++) {
    draw_setfb(80 + j * 0x0a, 30 + i * 0x0a);
    draw_tile(k++);
      }
    seq = 10;
    break;
  case 10:  /* wait for key pressed */
    if (control_test(Control_FIRE))
      seq = 98;
    if (control_test(Control_UP))
      seq = 12;
    if (control_test(Control_DOWN))
      seq = 13;
    if (control_test(Control_RIGHT))
      seq = 11;
    break;
  case 11:  /* wait for key released */
    if (!(control_test(Control_RIGHT))) {
      pos = 0;
      seq = 21;
    }
    break;
  case 12:  /* wait for key released */
    if (!(control_test(Control_UP))) {
      if (pos < 4) pos++;
      seq = 1;
    }
    break;
  case 13:  /* wait for key released */
    if (!(control_test(Control_DOWN))) {
      if (pos > 0) pos--;
      seq = 1;
    }
    break;
  case 21:  /* draw sprites */
    sysvid_clear();
    draw_tilesBank = 0;
    sys_snprintf(s, sizeof(s), "SPRITES\376");
    draw_setfb(4, 4);
    draw_tilesListImm(s);
    for (i = 0; i < 8; i++) {
      draw_setfb(0x08 + 0x20 + i * 0x20, 0x30 - 26);
      draw_tile((i<10?0x30:'A'-10) + i);
      draw_setfb(0x08 + 0x20 + i * 0x20, 0x30 - 16);
      draw_tile((i+8<10?0x30:'A'-10) + i+8);
    }
    for (i = 0; i < 4; i++) {
      k = pos + i * 8;
      draw_setfb(0x20 - 16, 0x08 + 0x30 + i * 0x20);
      j = k%16;
      k /= 16;
      draw_tile((j<10?0x30:'A'-10) + j);
      draw_setfb(0x20 - 26, 0x08 + 0x30 + i * 0x20);
      j = k%16;
      draw_tile((j<10?0x30:'A'-10) + j);
    }
    k = pos;
    for (i = 0; i < 4; i++)
      for (j = 0; j < 8; j++) {
      draw_sprite(k++, 0x20 + j * 0x20, 0x30 + i * 0x20);
      }
    seq = 30;
    break;
  case 30:  /* wait for key pressed */
    if (control_test(Control_FIRE))
      seq = 98;
    if (control_test(Control_UP))
      seq = 32;
    if (control_test(Control_DOWN))
      seq = 33;
    if (control_test(Control_LEFT))
      seq = 31;
    if (control_test(Control_RIGHT))
      seq = 40;
    break;
  case 31:  /* wait for key released */
    if (!(control_test(Control_LEFT))) {
      pos = 0;
      seq = 1;
    }
    break;
  case 32:  /* wait for key released */
    if (!(control_test(Control_UP))) {
      if (pos < sprites_nbr_sprites - 32) pos += 32;
      seq = 21;
    }
    break;
  case 33:  /* wait for key released */
    if (!(control_test(Control_DOWN))) {
      if (pos > 0) pos -= 32;
      seq = 21;
    }
    break;
  case 40:
    sysvid_clear();
#ifdef GFXPC
    if (pos2 == 0) pos2 = 2;
#endif
#ifdef GFXST
    if (pos2 == 0) pos2 = 1;
#endif
    sys_snprintf(s, sizeof(s), "BLOCKS@%#04X@TO@%#04X@WITH@BANK@%d\376",
        pos, pos + 4*8-1, pos2);
    draw_setfb(4, 4);
    draw_tilesBank = 0;
    draw_tilesListImm(s);
    draw_tilesBank = pos2;
    for (l = 0; l < 8; l++)
      for (k = 0; k < 4; k++)
    for (i = 0; i < 4; i++)
      for (j = 0; j < 4; j++) {
        draw_setfb(20 + j * 8 + l * 36, 30 + i * 8 + k * 36);
        draw_tile(map_blocks[pos + l + k * 8][i * 4 + j]);
      }
    seq = 41;
    break;
  case 41:
    if (control_test(Control_FIRE))
      seq = 98;
    if (control_test(Control_UP))
      seq = 42;
    if (control_test(Control_DOWN))
      seq = 43;
    if (control_test(Control_LEFT))
      seq = 44;
    if (control_test(Control_PAUSE))
      seq = 45;
    break;
  case 42:
    if (!(control_test(Control_UP))) {
      if (pos < map_nbr_blocks - 8*4) pos += 8 * 4;
      seq = 40;
    }
    break;
  case 43:
    if (!(control_test(Control_DOWN))) {
      if (pos > 0) pos -= 8 * 4;
      seq = 40;
    }
    break;
  case 44:
    if (!(control_test(Control_LEFT))) {
      pos = 0;
      pos2 = 0;
      seq = 21;
    }
    break;
  case 45:
    if (!(control_test(Control_PAUSE))) {
#ifdef GFXPC
      if (pos2 == 2) pos2 = 3;
      else pos2 = 2;
#endif
#ifdef GFXST
      if (pos2 == 1) pos2 = 2;
      else pos2 = 1;
#endif
      seq = 40;
    }
    break;
  case 98:  /* wait for key released */
    if (!(control_test(Control_FIRE)))
      seq = 99;
    break;
  }

  if (control_test(Control_EXIT))  /* check for exit request */
    return SCREEN_EXIT;

  if (seq == 99) {  /* we're done */
    sysvid_clear();
    seq = 0;
    return SCREEN_DONE;
  }

  return SCREEN_RUNNING;
}

#endif /* ENABLE_DEVTOOLS */

/* eof */
