- /* 
-  * src/scr_getname.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 <stdlib.h> // Pierre-Marie Baty -- for qsort() 
- #include <string.h> // Pierre-Marie Baty -- for memcmp() 
-   
- #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 
-   
-   
- // Pierre-Marie Baty -- external prototype 
- extern int sort_hscores (const void *q1, const void *q2); 
-   
-   
- /* 
-  * 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; 
-   
-       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 (); 
-       draw_setfb (76, 40); 
-       draw_tilesListImm ((U8 *) "PLEASE@ENTER@YOUR@NAME\376"); 
-   
-       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 ((U8) ('A' + i + j * 6)); 
-          } 
-   
-       draw_setfb (TOPLEFT_X, TOPLEFT_Y + 64); 
-       draw_tilesListImm ((U8 *) "Y@Z@.@@@\074\373\374\375\376"); 
-       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 */ 
-   
-             if (memcmp (- name , "POOKY@@@@@", 10) == 0)
 
-             { 
-                // cheat code: restart at last episode 
-                sysarg_args_map = game_map; 
-                syssnd_play (WAV_DIE, 1); 
-             } 
-             else if (memcmp (- name , "FLUFOMATIC", 10) == 0)
 
-             { 
-                // cheat code: restart at last map 
-                sysarg_args_submap = game_submap; 
-                syssnd_play (WAV_DIE, 1); 
-             } 
-   
-             // Pierre-Marie Baty -- discard empty names 
-             else if (memcmp (- name , "@@@@@@@@@@", 10) != 0)
 
-             { 
-                // Pierre-Marie Baty -- look if this same name already exists in the hiscore table 
-                for (i = 0; i < 8; i++) 
-                   if (memcmp (- game_hscores [- i ]- . name,-  name , 10) == 0)
 
-                      break; 
-                if (i == 8) // new name ? 
-                { 
-                   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]; 
-                } 
-                else if (game_score > game_hscores[i].score) // existing name: update only if score is higher, else discard 
-                { 
-                   game_hscores[i].score = game_score; 
-                   qsort (- game_hscores , 8, sizeof (- hscore_t ),-  sort_hscores );
 
-                } 
-             } 
-   
-             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); 
-    draw_tile ((U8) ((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) 
-       name[p--] = '@'; 
- } 
-   
-   
- static void name_draw (void) 
- { 
-    U8 i; 
-   
-    draw_setfb (NAMEPOS_X, NAMEPOS_Y); 
-    for (i = 0; i < p; i++) 
-       draw_tile (name[i]); 
-    for (i = p; i < 10; i++) 
-       draw_tile (TILE_CURSOR); 
-   
-    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); 
- } 
-