/*
 * xrick/src/scr_getname.c
 *
 * This source code file is part of the xrick distribution, and as such is
 * copyrighted. Please read the README file in the root directory of the
 * distribution for information about copyrights, trademarks, license,
 * disclaimers, etc.
 */

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

#include "draw.h"
#include "control.h"

/*
 * local vars
 */
static U8 seq = 0;
static U8 x, y, p;
static U8 name[10];

#define TILE_POINTER '\072'
#define TILE_CURSOR '\073'
#define TOPLEFT_X 116
#define TOPLEFT_Y 64
#define NAMEPOS_X 120
#define NAMEPOS_Y 160
#define AUTOREPEAT_TMOUT 100


/*
 * prototypes
 */
static void pointer_show(U8);
static void name_update(void);
static void name_draw(void);


/*
 * Get name
 *
 * return: 0 while running, 1 when finished.
 */
U8
screen_getname(void)
{
  static U32 tm = 0;
  U8 i, j;

  if (seq == 0) {
    /* figure out if this is a high score */
    if (game_score < game_hscores[7].score)
      return SCREEN_DONE;

    /* prepare */
    draw_tilesBank = 0;
#ifdef GFXPC
    draw_filter = 0xffff;
#endif
    for (i = 0; i < 10; i++)
      name[i] = '@';
    x = y = p = 0;
    game_rects = &draw_SCREENRECT;
    seq = 1;
  }

  switch (seq) {
  case 1:  /* prepare screen */
    sysvid_clear();
#ifdef GFXPC
    draw_setfb(32, 8);
    draw_filter = 0xaaaa; /* red */
    draw_tilesListImm(screen_congrats);
#endif
    draw_setfb(76, 40);
#ifdef GFXPC
    draw_filter = 0xffff; /* yellow */
#endif
    draw_tilesListImm((U8 *)"PLEASE@ENTER@YOUR@NAME\376");
#ifdef GFXPC
    draw_filter = 0x5555; /* green */
#endif
    for (i = 0; i < 6; i++)
      for (j = 0; j < 4; j++) {
	draw_setfb(TOPLEFT_X + i * 8 * 2, TOPLEFT_Y + j * 8 * 2);
	draw_tile('A' + i + j * 6);
      }
    draw_setfb(TOPLEFT_X, TOPLEFT_Y + 64);
#ifdef GFXST
    draw_tilesListImm((U8 *)"Y@Z@.@@@\074\373\374\375\376");
#endif
#ifdef GFXPC
    draw_tilesListImm((U8 *)"Y@Z@.@@@\074@\075@\376");
#endif
    name_draw();
    pointer_show(TRUE);
    seq = 2;
    break;

  case 2:  /* wait for key pressed */
    if (control_status & CONTROL_FIRE)
      seq = 3;
    if (control_status & CONTROL_UP) {
      if (y > 0) {
	pointer_show(FALSE);
	y--;
	pointer_show(TRUE);
	tm = sys_gettime();
      }
      seq = 4;
    }
    if (control_status & CONTROL_DOWN) {
      if (y < 4) {
	pointer_show(FALSE);
	y++;
	pointer_show(TRUE);
	tm = sys_gettime();
      }
      seq = 5;
    }
    if (control_status & CONTROL_LEFT) {
      if (x > 0) {
	pointer_show(FALSE);
	x--;
	pointer_show(TRUE);
	tm = sys_gettime();
      }
      seq = 6;
    }
    if (control_status & CONTROL_RIGHT) {
      if (x < 5) {
	pointer_show(FALSE);
	x++;
	pointer_show(TRUE);
	tm = sys_gettime();
      }
      seq = 7;
    }
    if (seq == 2)
      sys_sleep(50);
    break;

  case 3:  /* wait for FIRE released */
    if (!(control_status & CONTROL_FIRE)) {
      if (x == 5 && y == 4) {  /* end */
	i = 0;
	while (game_score < game_hscores[i].score)
	  i++;
	j = 7;
	while (j > i) {
	  game_hscores[j].score = game_hscores[j - 1].score;
	  for (x = 0; x < 10; x++)
	    game_hscores[j].name[x] = game_hscores[j - 1].name[x];
	  j--;
	}
	game_hscores[i].score = game_score;
	for (x = 0; x < 10; x++)
	  game_hscores[i].name[x] = name[x];
	seq = 99;
      }
      else {
	name_update();
	name_draw();
	seq = 2;
      }
    }
    else
      sys_sleep(50);
    break;

  case 4:  /* wait for UP released */
    if (!(control_status & CONTROL_UP) ||
	sys_gettime() - tm > AUTOREPEAT_TMOUT)
      seq = 2;
    else
      sys_sleep(50);
    break;

  case 5:  /* wait for DOWN released */
    if (!(control_status & CONTROL_DOWN) ||
	sys_gettime() - tm > AUTOREPEAT_TMOUT)
      seq = 2;
    else
      sys_sleep(50);
    break;

  case 6:  /* wait for LEFT released */
    if (!(control_status & CONTROL_LEFT) ||
	sys_gettime() - tm > AUTOREPEAT_TMOUT)
      seq = 2;
    else
      sys_sleep(50);
    break;

  case 7:  /* wait for RIGHT released */
    if (!(control_status & CONTROL_RIGHT) ||
	sys_gettime() - tm > AUTOREPEAT_TMOUT)
      seq = 2;
    else
      sys_sleep(50);
    break;

  }
  
  if (control_status & CONTROL_EXIT)  /* check for exit request */
    return SCREEN_EXIT;

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


static void
pointer_show(U8 show)
{
  draw_setfb(TOPLEFT_X + x * 8 * 2, TOPLEFT_Y + y * 8 * 2 + 8);
#ifdef GFXPC
  draw_filter = 0xaaaa; /* red */
#endif
  draw_tile((show == TRUE)?TILE_POINTER:'@');
}

static void
name_update(void)
{
  U8 i;

  i = x + y * 6;
  if (i < 26 && p < 10)
    name[p++] = 'A' + i;
  if (i == 26 && p < 10)
    name[p++] = '.';
  if (i == 27 && p < 10)
    name[p++] = '@';
  if (i == 28 && p > 0) {
    p--;
  }
}

static void
name_draw(void)
{
  U8 i;

  draw_setfb(NAMEPOS_X, NAMEPOS_Y);
#ifdef GFXPC
  draw_filter = 0xaaaa; /* red */
#endif
  for (i = 0; i < p; i++)
    draw_tile(name[i]);
  for (i = p; i < 10; i++)
    draw_tile(TILE_CURSOR);

#ifdef GFXST
  draw_setfb(NAMEPOS_X, NAMEPOS_Y + 8);
  for (i = 0; i < 10; i++)
    draw_tile('@');
  draw_setfb(NAMEPOS_X + 8 * (p < 9 ? p : 9), NAMEPOS_Y + 8);
  draw_tile(TILE_POINTER);
#endif
}


/* eof */
