Subversion Repositories Games.Rick Dangerous

Rev

Rev 1 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

  1. /*
  2.  * src/scr_getname.c
  3.  *
  4.  * Copyright (C) 1998-2002 BigOrno (bigorno@bigorno.net). All rights reserved.
  5.  *
  6.  * The use and distribution terms for this software are contained in the file
  7.  * named README, which can be found in the root of this distribution. By
  8.  * using this software in any fashion, you are agreeing to be bound by the
  9.  * terms of this license.
  10.  *
  11.  * You must not remove this notice, or any other, from this software.
  12.  */
  13.  
  14. #include <stdlib.h> // Pierre-Marie Baty -- for qsort()
  15. #include <string.h> // Pierre-Marie Baty -- for memcmp()
  16.  
  17. #include "system.h"
  18. #include "game.h"
  19. #include "screens.h"
  20.  
  21. #include "draw.h"
  22. #include "control.h"
  23.  
  24. /*
  25.  * local vars
  26.  */
  27. static U8 seq = 0;
  28. static U8 x, y, p;
  29. static U8 name[10];
  30.  
  31. #define TILE_POINTER '\072'
  32. #define TILE_CURSOR '\073'
  33. #define TOPLEFT_X 116
  34. #define TOPLEFT_Y 64
  35. #define NAMEPOS_X 120
  36. #define NAMEPOS_Y 160
  37. #define AUTOREPEAT_TMOUT 100
  38.  
  39.  
  40. // Pierre-Marie Baty -- external prototype
  41. extern int sort_hscores (const void *q1, const void *q2);
  42.  
  43.  
  44. /*
  45.  * prototypes
  46.  */
  47. static void pointer_show (U8);
  48. static void name_update (void);
  49. static void name_draw (void);
  50.  
  51.  
  52. /*
  53.  * Get name
  54.  *
  55.  * return: 0 while running, 1 when finished.
  56.  */
  57. U8 screen_getname (void)
  58. {
  59.    static U32 tm = 0;
  60.    U8 i, j;
  61.  
  62.    if (seq == 0)
  63.    {
  64.       /* figure out if this is a high score */
  65.       if (game_score < game_hscores[7].score)
  66.          return SCREEN_DONE;
  67.  
  68.       /* prepare */
  69.       draw_tilesBank = 0;
  70.  
  71.       for (i = 0; i < 10; i++)
  72.          name[i] = '@';
  73.  
  74.       x = y = p = 0;
  75.       game_rects = &draw_SCREENRECT;
  76.       seq = 1;
  77.    }
  78.  
  79.    switch (seq)
  80.    {
  81.    case 1:   /* prepare screen */
  82.       sysvid_clear ();
  83.       draw_setfb (76, 40);
  84.       draw_tilesListImm ((U8 *) "PLEASE@ENTER@YOUR@NAME\376");
  85.  
  86.       for (i = 0; i < 6; i++)
  87.          for (j = 0; j < 4; j++)
  88.          {
  89.             draw_setfb (TOPLEFT_X + i * 8 * 2, TOPLEFT_Y + j * 8 * 2);
  90.             draw_tile ((U8) ('A' + i + j * 6));
  91.          }
  92.  
  93.       draw_setfb (TOPLEFT_X, TOPLEFT_Y + 64);
  94.       draw_tilesListImm ((U8 *) "Y@Z@.@@@\074\373\374\375\376");
  95.       name_draw ();
  96.       pointer_show (TRUE);
  97.       seq = 2;
  98.  
  99.       break;
  100.  
  101.    case 2:   /* wait for key pressed */
  102.       if (control_status & CONTROL_FIRE)
  103.          seq = 3;
  104.  
  105.       if (control_status & CONTROL_UP)
  106.       {
  107.          if (y > 0)
  108.          {
  109.             pointer_show (FALSE);
  110.             y--;
  111.             pointer_show (TRUE);
  112.             tm = sys_gettime ();
  113.          }
  114.          seq = 4;
  115.       }
  116.  
  117.       if (control_status & CONTROL_DOWN)
  118.       {
  119.          if (y < 4)
  120.          {
  121.             pointer_show (FALSE);
  122.             y++;
  123.             pointer_show (TRUE);
  124.             tm = sys_gettime ();
  125.          }
  126.          seq = 5;
  127.       }
  128.  
  129.       if (control_status & CONTROL_LEFT)
  130.       {
  131.          if (x > 0)
  132.          {
  133.             pointer_show (FALSE);
  134.             x--;
  135.             pointer_show (TRUE);
  136.             tm = sys_gettime ();
  137.          }
  138.          seq = 6;
  139.       }
  140.  
  141.       if (control_status & CONTROL_RIGHT)
  142.       {
  143.          if (x < 5)
  144.          {
  145.             pointer_show (FALSE);
  146.             x++;
  147.             pointer_show (TRUE);
  148.             tm = sys_gettime ();
  149.          }
  150.          seq = 7;
  151.       }
  152.  
  153.       if (seq == 2)
  154.          sys_sleep (50);
  155.  
  156.       break;
  157.  
  158.    case 3:   /* wait for FIRE released */
  159.       if (!(control_status & CONTROL_FIRE))
  160.       {
  161.          if (x == 5 && y == 4)
  162.          {
  163.             /* end */
  164.  
  165.             // Pierre-Marie Baty -- discard empty names
  166.             if (memcmp (name, "@@@@@@@@@@", 10) != 0)
  167.             {
  168.                // Pierre-Marie Baty -- look if this same name already exists in the hiscore table
  169.                for (i = 0; i < 8; i++)
  170.                   if (memcmp (game_hscores[i].name, name, 10) == 0)
  171.                      break;
  172.                if (i == 8) // new name ?
  173.                {
  174.                   i = 0;
  175.  
  176.                   while (game_score < game_hscores[i].score)
  177.                      i++;
  178.  
  179.                   j = 7;
  180.  
  181.                   while (j > i)
  182.                   {
  183.                      game_hscores[j].score = game_hscores[j - 1].score;
  184.  
  185.                      for (x = 0; x < 10; x++)
  186.                         game_hscores[j].name[x] = game_hscores[j - 1].name[x];
  187.  
  188.                      j--;
  189.                   }
  190.  
  191.                   game_hscores[i].score = game_score;
  192.  
  193.                   for (x = 0; x < 10; x++)
  194.                      game_hscores[i].name[x] = name[x];
  195.                }
  196.                else if (game_score > game_hscores[i].score) // existing name: update only if score is higher, else discard
  197.                {
  198.                   game_hscores[i].score = game_score;
  199.                   qsort (game_hscores, 8, sizeof (hscore_t), sort_hscores);
  200.                }
  201.             }
  202.  
  203.             seq = 99;
  204.          }
  205.          else
  206.          {
  207.             name_update ();
  208.             name_draw ();
  209.             seq = 2;
  210.          }
  211.       }
  212.       else
  213.          sys_sleep (50);
  214.  
  215.       break;
  216.  
  217.    case 4:   /* wait for UP released */
  218.       if (!(control_status & CONTROL_UP) || sys_gettime () - tm > AUTOREPEAT_TMOUT)
  219.          seq = 2;
  220.       else
  221.          sys_sleep (50);
  222.  
  223.       break;
  224.  
  225.    case 5:   /* wait for DOWN released */
  226.       if (!(control_status & CONTROL_DOWN) || sys_gettime () - tm > AUTOREPEAT_TMOUT)
  227.          seq = 2;
  228.       else
  229.          sys_sleep (50);
  230.  
  231.       break;
  232.  
  233.    case 6:   /* wait for LEFT released */
  234.       if (!(control_status & CONTROL_LEFT) || sys_gettime () - tm > AUTOREPEAT_TMOUT)
  235.          seq = 2;
  236.       else
  237.          sys_sleep (50);
  238.  
  239.       break;
  240.  
  241.    case 7:   /* wait for RIGHT released */
  242.       if (!(control_status & CONTROL_RIGHT) || sys_gettime () - tm > AUTOREPEAT_TMOUT)
  243.          seq = 2;
  244.       else
  245.          sys_sleep (50);
  246.  
  247.       break;
  248.  
  249.    }
  250.  
  251.    if (control_status & CONTROL_EXIT)   /* check for exit request */
  252.       return SCREEN_EXIT;
  253.  
  254.    if (seq == 99)
  255.    {   /* seq 99, we're done */
  256.       sysvid_clear ();
  257.       seq = 0;
  258.       return SCREEN_DONE;
  259.    }
  260.    else
  261.       return SCREEN_RUNNING;
  262. }
  263.  
  264.  
  265. static void pointer_show (U8 show)
  266. {
  267.    draw_setfb (TOPLEFT_X + x * 8 * 2, TOPLEFT_Y + y * 8 * 2 + 8);
  268.    draw_tile ((U8) ((show == TRUE) ? TILE_POINTER : '@'));
  269. }
  270.  
  271.  
  272. static void name_update (void)
  273. {
  274.    U8 i;
  275.  
  276.    i = x + y * 6;
  277.  
  278.    if (i < 26 && p < 10)
  279.       name[p++] = 'A' + i;
  280.    if (i == 26 && p < 10)
  281.       name[p++] = '.';
  282.    if (i == 27 && p < 10)
  283.       name[p++] = '@';
  284.    if (i == 28 && p > 0)
  285.       name[p--] = '@';
  286. }
  287.  
  288.  
  289. static void name_draw (void)
  290. {
  291.    U8 i;
  292.  
  293.    draw_setfb (NAMEPOS_X, NAMEPOS_Y);
  294.    for (i = 0; i < p; i++)
  295.       draw_tile (name[i]);
  296.    for (i = p; i < 10; i++)
  297.       draw_tile (TILE_CURSOR);
  298.  
  299.    draw_setfb (NAMEPOS_X, NAMEPOS_Y + 8);
  300.    for (i = 0; i < 10; i++)
  301.       draw_tile ('@');
  302.    draw_setfb (NAMEPOS_X + 8 * (p < 9 ? p : 9), NAMEPOS_Y + 8);
  303.    draw_tile (TILE_POINTER);
  304. }
  305.