/*
 * xrick/src/scr_devtools.c
 *
 * Copyright (C) 1998-2002 BigOrno (bigorno@bigorno.net). 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 "config.h"

#ifdef ENABLE_DEVTOOLS

#include "system.h"
#include "game.h"

#include "control.h"
#include "screens.h"
#include "draw.h"
#include "sprites.h"
#include "maps.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;
    sprintf(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_status & CONTROL_FIRE)
      seq = 98;
    if (control_status & CONTROL_UP)
      seq = 12;
    if (control_status & CONTROL_DOWN)
      seq = 13;
    if (control_status & CONTROL_RIGHT)
      seq = 11;
    break;
  case 11:  /* wait for key released */
    if (!(control_status & CONTROL_RIGHT)) {
      pos = 0;
      seq = 21;
    }
    break;
  case 12:  /* wait for key released */
    if (!(control_status & CONTROL_UP)) {
      if (pos < 4) pos++;
      seq = 1;
    }
    break;
  case 13:  /* wait for key released */
    if (!(control_status & CONTROL_DOWN)) {
      if (pos > 0) pos--;
      seq = 1;
    }
    break;
  case 21:  /* draw sprites */
    sysvid_clear();
    draw_tilesBank = 0;
    sprintf(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_status & CONTROL_FIRE)
      seq = 98;
    if (control_status & CONTROL_UP)
      seq = 32;
    if (control_status & CONTROL_DOWN)
      seq = 33;
    if (control_status & CONTROL_LEFT)
      seq = 31;
    if (control_status & CONTROL_RIGHT)
      seq = 40;
    break;
  case 31:  /* wait for key released */
    if (!(control_status & CONTROL_LEFT)) {
      pos = 0;
      seq = 1;
    }
    break;
  case 32:  /* wait for key released */
    if (!(control_status & CONTROL_UP)) {
      if (pos < SPRITES_NBR_SPRITES - 32) pos += 32;
      seq = 21;
    }
    break;
  case 33:  /* wait for key released */
    if (!(control_status & 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
    sprintf(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_status & CONTROL_FIRE)
      seq = 98;
    if (control_status & CONTROL_UP)
      seq = 42;
    if (control_status & CONTROL_DOWN)
      seq = 43;
    if (control_status & CONTROL_LEFT)
      seq = 44;
    if (control_status & CONTROL_PAUSE)
      seq = 45;
    break;
  case 42:
    if (!(control_status & CONTROL_UP)) {
      if (pos < MAP_NBR_BLOCKS - 8*4) pos += 8 * 4;
      seq = 40;
    }
    break;
  case 43:
    if (!(control_status & CONTROL_DOWN)) {
      if (pos > 0) pos -= 8 * 4;
      seq = 40;
    }
    break;
  case 44:
    if (!(control_status & CONTROL_LEFT)) {
      pos = 0;
      pos2 = 0;
      seq = 21;
    }
    break;
  case 45:
    if (!(control_status & 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_status & CONTROL_FIRE))
      seq = 99;
    break;
  }

  if (control_status & 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 */

