Those sets haven't been merged.
[neverball] / ball / st_title.c
index fff75fa..7d5bf97 100644 (file)
@@ -1,4 +1,4 @@
-/*   
+/*
  * Copyright (C) 2003 Robert Kooima
  *
  * NEVERBALL is  free software; you can redistribute  it and/or modify
 
 #include "gui.h"
 #include "vec3.h"
-#include "back.h"
 #include "demo.h"
 #include "game.h"
 #include "audio.h"
 #include "config.h"
+#include "st_shared.h"
 
 #include "st_title.h"
+#include "st_help.h"
 #include "st_demo.h"
 #include "st_conf.h"
 #include "st_set.h"
+#include "st_name.h"
 
 /*---------------------------------------------------------------------------*/
 
 static float real_time = 0.0f;
-static float demo_time = 0.0f;
 static int   mode      = 0;
 
+static int play_id = 0;
+
 #define TITLE_PLAY 1
 #define TITLE_HELP 2
 #define TITLE_DEMO 3
@@ -39,19 +42,74 @@ static int   mode      = 0;
 
 static int title_action(int i)
 {
+    static const char keyphrase[] = "CHEAT";
+    static char queue[sizeof (keyphrase)] = "";
+
+    size_t queue_len = strlen(queue);
+
+    char player[MAXNAM];
+
     audio_play(AUD_MENU, 1.0f);
 
     switch (i)
     {
-    case TITLE_PLAY: return goto_state(&st_set);
-    case TITLE_HELP: return goto_state(&st_help);
-    case TITLE_DEMO: return goto_state(&st_demo);
-    case TITLE_CONF: return goto_state(&st_conf);
-    case TITLE_EXIT: return 0;
+    case TITLE_PLAY:
+        config_get_s(CONFIG_PLAYER, player, MAXNAM);
+
+        if (strlen(player) == 0)
+            return goto_name(&st_set, &st_title, 0);
+        else
+            return goto_state(&st_set);
+
+        break;
+
+    case TITLE_HELP: return goto_state(&st_help); break;
+    case TITLE_DEMO: return goto_state(&st_demo); break;
+    case TITLE_CONF: return goto_state(&st_conf); break;
+    case TITLE_EXIT: return 0;                    break;
+
+    default:
+
+        /* Let the queue fill up. */
+
+        if (queue_len < sizeof (queue) - 1)
+        {
+            queue[queue_len]     = (char) i;
+            queue[queue_len + 1] = '\0';
+        }
+
+        /* Advance the queue before adding the new element. */
+
+        else
+        {
+            int k;
+
+            for (k = 1; k < queue_len; k++)
+                queue[k - 1] = queue[k];
+
+            queue[queue_len - 1] = (char) i;
+        }
+
+        if (strcmp(queue, keyphrase) == 0)
+        {
+            config_set_cheat();
+            gui_set_label(play_id, sgettext("menu^Cheat"));
+            gui_pulse(play_id, 1.2f);
+        }
+        else if (config_cheat())
+        {
+            config_clr_cheat();
+            gui_set_label(play_id, sgettext("menu^Play"));
+            gui_pulse(play_id, 1.2f);
+        }
+
+        break;
     }
     return 1;
 }
 
+static struct level title_level;
+
 static int title_enter(void)
 {
     int id, jd, kd;
@@ -60,7 +118,8 @@ static int title_enter(void)
 
     if ((id = gui_vstack(0)))
     {
-        gui_label(id, _("Neverball"), GUI_LRG, GUI_ALL, 0, 0);
+        gui_label(id, "Neverball", GUI_LRG, GUI_ALL, 0, 0);
+
         gui_space(id);
 
         if ((jd = gui_harray(id)))
@@ -69,7 +128,13 @@ static int title_enter(void)
 
             if ((kd = gui_varray(jd)))
             {
-                gui_start(kd, sgettext("menu^Play"),    GUI_MED, TITLE_PLAY, 1);
+                if (config_cheat())
+                    play_id = gui_start(kd, sgettext("menu^Cheat"),
+                                        GUI_MED, TITLE_PLAY, 1);
+                else
+                    play_id = gui_start(kd, sgettext("menu^Play"),
+                                        GUI_MED, TITLE_PLAY, 1);
+
                 gui_state(kd, sgettext("menu^Replay"),  GUI_MED, TITLE_DEMO, 0);
                 gui_state(kd, sgettext("menu^Help"),    GUI_MED, TITLE_HELP, 0);
                 gui_state(kd, sgettext("menu^Options"), GUI_MED, TITLE_CONF, 0);
@@ -85,34 +150,28 @@ static int title_enter(void)
 
     audio_music_fade_to(0.5f, "bgm/title.ogg");
 
-    /* Initialize the first level of the first set for display. */
-
-    game_init("map-rlk/title.sol",
-              "map-back/jupiter.sol", "png/space.png", 0, 1);
+    /* Initialize the title level for display. */
+    level_load("map-medium/title.sol", &title_level);
+    game_init(&title_level, 0, 0);
 
     real_time = 0.0f;
-    demo_time = 0.0f;
     mode = 0;
 
+    SDL_EnableUNICODE(1);
+
     return id;
 }
 
 static void title_leave(int id)
 {
+    SDL_EnableUNICODE(0);
     demo_replay_stop(0);
     gui_delete(id);
 }
 
-static void title_paint(int id, float st)
-{
-    game_draw(0, st);
-    gui_paint(id);
-}
-
 static void title_timer(int id, float dt)
 {
     static const char *demo = NULL;
-    float t;
 
     real_time += dt;
 
@@ -136,8 +195,8 @@ static void title_timer(int id, float dt)
         {
             if ((demo = demo_pick()))
             {
-                demo_replay_init(demo, NULL, NULL, NULL, NULL, NULL);
-                demo_time = 0.0f;
+                demo_replay_init(demo, NULL);
+                game_set_fly(0.0f);
                 real_time = 0.0f;
                 mode = 2;
             }
@@ -152,24 +211,20 @@ static void title_timer(int id, float dt)
 
     case 2: /* Mode 2: Run demo. */
 
-        while (demo_time < real_time)
-            if (demo_replay_step(&t))
-                demo_time += t;
-            else
-            { 
-                demo_replay_stop(0);
-                game_fade(+1.0f);
-                real_time = 0.0f;
-                mode = 3;
-            }
+        if (!demo_replay_step(dt))
+        {
+            demo_replay_stop(0);
+            game_fade(+1.0f);
+            real_time = 0.0f;
+            mode = 3;
+        }
         break;
 
     case 3: /* Mode 3: Fade out.  Load title level. */
 
         if (real_time > 1.0f)
         {
-            game_init("map-rlk/title.sol",
-                      "map-back/jupiter.sol", "png/space.png", 0, 1);
+            game_init(&title_level, 0, 0);
             real_time = 0.0f;
             mode = 0;
         }
@@ -177,37 +232,16 @@ static void title_timer(int id, float dt)
     }
 
     gui_timer(id, dt);
-    audio_timer(dt);
     game_step_fade(dt);
 }
 
-static void title_point(int id, int x, int y, int dx, int dy)
-{
-    gui_pulse(gui_point(id, x, y), 1.2f);
-}
-
-static void title_stick(int id, int a, int v)
-{
-    if (config_tst_d(CONFIG_JOYSTICK_AXIS_X, a))
-        gui_pulse(gui_stick(id, v, 0), 1.2f);
-    if (config_tst_d(CONFIG_JOYSTICK_AXIS_Y, a))
-        gui_pulse(gui_stick(id, 0, v), 1.2f);
-}
-
-static int title_click(int b, int d)
+static int title_keybd(int c, int d)
 {
-    if (d && b < 0)
-        return title_action(gui_token(gui_click()));
+    if (d && (c & 0xFF80) == 0 && c > ' ')
+        return title_action(c);
     return 1;
 }
 
-static int title_keybd(int c, int d)
-{
-    if (d && c == SDLK_c && ALLOW_CHEAT)
-       config_tgl_d(CONFIG_CHEAT);
-    return 1; 
-}
-       
 static int title_buttn(int b, int d)
 {
     if (d)
@@ -222,131 +256,17 @@ static int title_buttn(int b, int d)
 
 /*---------------------------------------------------------------------------*/
 
-static int help_enter(void)
-{
-    const char *s0 =
-        _("Move the mouse or joystick to tilt the floor\\"
-        "causing the ball to roll.  Roll over coins to\\"
-        "collect them.  Collect coins to unlock the goal\\"
-        "and finish the level.  Earn an extra ball for\\"
-        "each 100 coins collected.\\");
-
-    const char *s4 = _("Left and right mouse buttons rotate the view.");
-    const char *s5 = _("Hold Shift for faster view rotation.");
-    const char *s6 = _("Pause / Release Pointer");
-    const char *s7 = _("Exit / Cancel Menu");
-    const char *s8 = _("Chase View");
-    const char *s9 = _("Lazy View");
-    const char *sA = _("Manual View");
-    const char *sB = _("Comments?  Problems?  robert.kooima@gmail.com");
-
-    const char *k0 = _("Spacebar");
-    const char *k1 = _("Escape");
-    const char *k2 = SDL_GetKeyName(config_get_d(CONFIG_KEY_CAMERA_1));
-    const char *k3 = SDL_GetKeyName(config_get_d(CONFIG_KEY_CAMERA_2));
-    const char *k4 = SDL_GetKeyName(config_get_d(CONFIG_KEY_CAMERA_3));
-
-    int id, jd;
-
-    if ((id = gui_vstack(0)))
-    {
-        gui_multi(id, s0, GUI_SML, GUI_ALL, gui_wht, gui_wht);
-        gui_space(id);
-
-        if ((jd = gui_harray(id)))
-        {
-            gui_label(jd, s6, GUI_SML, GUI_NE, gui_wht, gui_wht);
-            gui_label(jd, k0, GUI_SML, GUI_NW, gui_yel, gui_yel);
-        }
-        if ((jd = gui_harray(id)))
-        {
-            gui_label(jd, s7, GUI_SML, 0,      gui_wht, gui_wht);
-            gui_label(jd, k1, GUI_SML, 0,      gui_yel, gui_yel);
-        }
-        if ((jd = gui_harray(id)))
-        {
-            gui_label(jd, s8, GUI_SML, 0,      gui_wht, gui_wht);
-            gui_label(jd, k2, GUI_SML, 0,      gui_yel, gui_yel);
-        }
-        if ((jd = gui_harray(id)))
-        {
-            gui_label(jd, s9, GUI_SML, 0,      gui_wht, gui_wht);
-            gui_label(jd, k3, GUI_SML, 0,      gui_yel, gui_yel);
-        }
-        if ((jd = gui_harray(id)))
-        {
-            gui_label(jd, sA, GUI_SML, GUI_SE, gui_wht, gui_wht);
-            gui_label(jd, k4, GUI_SML, GUI_SW, gui_yel, gui_yel);
-        }
-
-        gui_space(id);
-        gui_label(id, s4, GUI_SML, GUI_TOP, gui_wht, gui_wht);
-        gui_label(id, s5, GUI_SML, GUI_BOT, gui_wht, gui_wht);
-        gui_space(id);
-        gui_label(id, sB, GUI_SML, GUI_ALL, gui_wht, gui_wht);
-
-        gui_layout(id, 0, 0);
-    }
-    return id;
-}
-
-static void help_leave(int id)
-{
-    gui_delete(id);
-}
-
-static void help_paint(int id, float st)
-{
-    game_draw(0, st);
-    config_pop_matrix();
-    gui_paint(id);
-}
-
-static void help_timer(int id, float dt)
-{
-    gui_timer(id, dt);
-    audio_timer(dt);
-}
-
-static int help_click(int b, int d)
-{
-    return d ? goto_state(&st_title) : 1;
-}
-
-static int help_keybd(int c, int d)
-{
-    return d ? goto_state(&st_title) : 1;
-}
-
-static int help_buttn(int b, int d)
-{
-    return d ? goto_state(&st_title) : 1;
-}
-
-/*---------------------------------------------------------------------------*/
-
 struct state st_title = {
     title_enter,
     title_leave,
-    title_paint,
+    shared_paint,
     title_timer,
-    title_point,
-    title_stick,
-    title_click,
+    shared_point,
+    shared_stick,
+    shared_angle,
+    shared_click,
     title_keybd,
     title_buttn,
     1, 0
 };
 
-struct state st_help = {
-    help_enter,
-    help_leave,
-    help_paint,
-    help_timer,
-    NULL,
-    NULL,
-    help_click,
-    help_keybd,
-    help_buttn,
-    1, 0
-};