Clean up errno/strerror usage
[neverball] / ball / hud.c
index 0b55ba4..8f74f19 100644 (file)
@@ -1,4 +1,4 @@
-/*   
+/*
  * Copyright (C) 2003 Robert Kooima
  *
  * NEVERBALL is  free software; you can redistribute  it and/or modify
 
 #include <SDL.h>
 #include <math.h>
+#include <string.h>
 
 #include "glext.h"
 #include "hud.h"
 #include "gui.h"
-#include "game.h"
-#include "level.h"
+#include "progress.h"
 #include "config.h"
+#include "video.h"
+#include "audio.h"
+
+#include "game_common.h"
+#include "game_client.h"
 
 /*---------------------------------------------------------------------------*/
 
@@ -39,33 +44,21 @@ static float view_timer;
 
 static void hud_fps(void)
 {
-    static int fps   = 0;
-    static int then  = 0;
-    static int count = 0;
-
-    int now = SDL_GetTicks();
-
-    if (now - then > 250)
-    {
-        fps   = count * 1000 / (now - then);
-        then  = now;
-        count = 0;
-
-        gui_set_count(fps_id, fps);
-    }
-    else count++;
+    gui_set_count(fps_id, video_perf());
 }
 
 void hud_init(void)
 {
     int id;
+    const char *str_view;
+    int v;
 
     if ((Rhud_id = gui_hstack(0)))
     {
         if ((id = gui_vstack(Rhud_id)))
         {
-            gui_label(id, "Coins", GUI_SML, 0, gui_wht, gui_wht);
-            gui_label(id, "Goal",  GUI_SML, 0, gui_wht, gui_wht);
+            gui_label(id, _("Coins"), GUI_SML, 0, gui_wht, gui_wht);
+            gui_label(id, _("Goal"),  GUI_SML, 0, gui_wht, gui_wht);
         }
         if ((id = gui_vstack(Rhud_id)))
         {
@@ -84,8 +77,8 @@ void hud_init(void)
         }
         if ((id = gui_vstack(Lhud_id)))
         {
-            gui_label(id, "Balls", GUI_SML, 0, gui_wht, gui_wht);
-            gui_label(id, "Score", GUI_SML, 0, gui_wht, gui_wht);
+            gui_label(id, _("Balls"), GUI_SML, 0, gui_wht, gui_wht);
+            gui_label(id, _("Score"), GUI_SML, 0, gui_wht, gui_wht);
         }
         gui_layout(Lhud_id, -1, -1);
     }
@@ -93,7 +86,14 @@ void hud_init(void)
     if ((time_id = gui_clock(0, 59999, GUI_MED, GUI_TOP)))
         gui_layout(time_id, 0, -1);
 
-    if ((view_id = gui_label(0, STR_VIEW2, GUI_SML, GUI_SW, gui_wht, gui_wht)))
+
+    /* Find the longest view name. */
+
+    for (str_view = "", v = VIEW_NONE + 1; v < VIEW_MAX; v++)
+        if (strlen(view_to_str(v)) > strlen(str_view))
+            str_view = view_to_str(v);
+
+    if ((view_id = gui_label(0, str_view, GUI_SML, GUI_SW, gui_wht, gui_wht)))
         gui_layout(view_id, 1, 1);
 
     if ((fps_id = gui_count(0, 1000, GUI_SML, GUI_SE)))
@@ -111,58 +111,144 @@ void hud_free(void)
 
 void hud_paint(void)
 {
-    gui_paint(Lhud_id);
+    if (curr_mode() == MODE_CHALLENGE)
+        gui_paint(Lhud_id);
+
     gui_paint(Rhud_id);
     gui_paint(time_id);
 
     if (config_get_d(CONFIG_FPS))
         gui_paint(fps_id);
 
-    if (view_timer > 0.0f)
-        gui_paint(view_id);
+    hud_view_paint();
 }
 
-void hud_timer(float dt)
+void hud_update(int pulse)
 {
-    const int clock = curr_clock();
-    const int balls = curr_balls();
-    const int coins = curr_coins();
-    const int score = curr_score();
-    const int goal  = curr_goal();
-
-    if (gui_value(time_id) != clock) gui_set_clock(time_id, clock);
-    if (gui_value(ball_id) != balls) gui_set_count(ball_id, balls);
-    if (gui_value(scor_id) != score) gui_set_count(scor_id, score);
-    if (gui_value(coin_id) != coins) gui_set_count(coin_id, coins);
-    if (gui_value(goal_id) != goal)  gui_set_count(goal_id, goal);
+    int clock = curr_clock();
+    int coins = curr_coins();
+    int goal  = curr_goal();
+    int balls = curr_balls();
+    int score = curr_score();
+
+    int c_id;
+    int last;
+
+    if (!pulse)
+    {
+        /* reset the hud */
+
+        gui_pulse(ball_id, 0.f);
+        gui_pulse(time_id, 0.f);
+        gui_pulse(coin_id, 0.f);
+    }
+
+    /* time and tick-tock */
+
+    if (clock != (last = gui_value(time_id)))
+    {
+        gui_set_clock(time_id, clock);
+
+        if (last > clock && pulse)
+        {
+            if (clock <= 1000 && (last / 100) > (clock / 100))
+            {
+                audio_play(AUD_TICK, 1.f);
+                gui_pulse(time_id, 1.50);
+            }
+            else if (clock < 500 && (last / 50) > (clock / 50))
+            {
+                audio_play(AUD_TOCK, 1.f);
+                gui_pulse(time_id, 1.25);
+            }
+        }
+    }
+
+    /* balls and score + select coin widget */
+
+    switch (curr_mode())
+    {
+    case MODE_CHALLENGE:
+        if (gui_value(ball_id) != balls) gui_set_count(ball_id, balls);
+        if (gui_value(scor_id) != score) gui_set_count(scor_id, score);
+
+        c_id = coin_id;
+        break;
+
+    default:
+        c_id = coin_id;
+        break;
+    }
+
+
+    /* coins and pulse */
+
+    if (coins != (last = gui_value(c_id)))
+    {
+        last = coins - last;
+
+        gui_set_count(c_id, coins);
+
+        if (pulse && last > 0)
+        {
+            if      (last >= 10) gui_pulse(coin_id, 2.00f);
+            else if (last >=  5) gui_pulse(coin_id, 1.50f);
+            else                 gui_pulse(coin_id, 1.25f);
+
+            if (goal > 0)
+            {
+                if      (last >= 10) gui_pulse(goal_id, 2.00f);
+                else if (last >=  5) gui_pulse(goal_id, 1.50f);
+                else                 gui_pulse(goal_id, 1.25f);
+            }
+        }
+    }
+
+    /* goal and pulse */
+
+    if (goal != (last = gui_value(goal_id)))
+    {
+        gui_set_count(goal_id, goal);
+
+        if (pulse && goal == 0 && last > 0)
+            gui_pulse(goal_id, 2.00f);
+    }
 
     if (config_get_d(CONFIG_FPS))
         hud_fps();
+}
 
-    view_timer -= dt;
+void hud_timer(float dt)
+{
+
+    hud_update(1);
 
     gui_timer(Rhud_id, dt);
     gui_timer(Lhud_id, dt);
     gui_timer(time_id, dt);
-    gui_timer(view_id, dt);
+
+    hud_view_timer(dt);
 }
 
-void hud_ball_pulse(float k) { gui_pulse(ball_id, k); }
-void hud_time_pulse(float k) { gui_pulse(time_id, k); }
-void hud_coin_pulse(float k) { gui_pulse(coin_id, k); }
-void hud_goal_pulse(float k) { gui_pulse(goal_id, k); }
+/*---------------------------------------------------------------------------*/
 
 void hud_view_pulse(int c)
 {
-    switch (c)
-    {   
-    case 0: gui_set_label(view_id, STR_VIEW0); break;
-    case 1: gui_set_label(view_id, STR_VIEW1); break;
-    case 2: gui_set_label(view_id, STR_VIEW2); break;
-    }
-
+    gui_set_label(view_id, view_to_str(c));
     gui_pulse(view_id, 1.2f);
     view_timer = 2.0f;
 }
 
+void hud_view_timer(float dt)
+{
+    view_timer -= dt;
+    gui_timer(view_id, dt);
+}
+
+void hud_view_paint(void)
+{
+    if (view_timer > 0.0f)
+        gui_paint(view_id);
+}
+
 /*---------------------------------------------------------------------------*/