aboutsummaryrefslogtreecommitdiff
path: root/plugins
diff options
context:
space:
mode:
Diffstat (limited to 'plugins')
-rw-r--r--plugins/game/game.c42
-rw-r--r--plugins/game/game.h1
-rw-r--r--plugins/score/score.c75
-rw-r--r--plugins/score/score.h1
4 files changed, 117 insertions, 2 deletions
diff --git a/plugins/game/game.c b/plugins/game/game.c
index 152a5c9..94ad148 100644
--- a/plugins/game/game.c
+++ b/plugins/game/game.c
@@ -129,6 +129,48 @@ double calculate_dtime(struct timespec from, struct timespec to)
return (double) (to.tv_sec - from.tv_sec) + (double) (to.tv_nsec - from.tv_nsec) / 1000000000.0;
}
+/*struct roman_conversion_rule
+{
+ int number;
+ const char *symbol;
+};*/
+
+static struct
+{
+ int number;
+ const char *symbol;
+} roman_ct[13] = {
+ {1000, "M"},
+ {900, "CM"},
+ {500, "D"},
+ {400, "CD"},
+ {100, "C"},
+ {90, "XC"},
+ {50, "L"},
+ {40, "XL"},
+ {10, "X"},
+ {9, "IX"},
+ {5, "V"},
+ {4, "IV"},
+ {1, "I"}
+};
+
+void get_roman_numeral(int number, char **ptr, size_t *len)
+{
+ *ptr = NULL;
+ *len = 0;
+
+ for (int i = 0; i < 13; i++) {
+ while (number >= roman_ct[i].number) {
+ number -= roman_ct[i].number;
+ size_t old_len = *len;
+ *len += 1 + i % 2;
+ *ptr = realloc(*ptr, *len + 1);
+ strcpy(*ptr + old_len, roman_ct[i].symbol);
+ }
+ }
+}
+
/* Game-related utility functions */
void quit()
diff --git a/plugins/game/game.h b/plugins/game/game.h
index 60c1d61..21a9433 100644
--- a/plugins/game/game.h
+++ b/plugins/game/game.h
@@ -113,6 +113,7 @@ int max(int a, int b);
int min(int a, int b);
void *make_buffer(void *ptr, size_t size);
double calculate_dtime(struct timespec from, struct timespec to);
+void get_roman_numeral(int number, char **ptr, size_t *len);
void quit();
bool player_dead();
diff --git a/plugins/score/score.c b/plugins/score/score.c
index 7ad8b66..c310d3b 100644
--- a/plugins/score/score.c
+++ b/plugins/score/score.c
@@ -1,11 +1,40 @@
#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <math.h>
#include "../game/game.h"
static int score = 0;
+static int needed_score = 5;
+static int level = 0;
+static char *level_symbol = NULL;
+static size_t level_symbol_len = 0;
+static double score_timer = 0.0;
+static double level_timer = 0.0;
+
+static void level_up()
+{
+ level += 1;
+ needed_score = (level + 1) * 5;
+
+ if (level_symbol)
+ free(level_symbol);
+
+ get_roman_numeral(level, &level_symbol, &level_symbol_len);
+
+ level_timer = 2.0;
+}
void add_score(int s)
{
score += s;
+
+ if (score >= needed_score) {
+ score -= needed_score;
+ level_up();
+ } else {
+ score_timer = 2.0;
+ }
}
int get_score()
@@ -13,14 +42,56 @@ int get_score()
return score;
}
+int get_level()
+{
+ return level;
+}
+
static void render_score(struct winsize ws)
{
- (void) ws;
+ int bar_flash = clamp(score_timer * 255, 0, 255);
+ set_color((struct color) {bar_flash, 255, bar_flash}, true);
+
+ int level_flash = clamp(level_timer * 255, 0, 255);
+ set_color((struct color) {255, 255, 255 - level_flash}, false);
+
+ size_t level_len = level_symbol_len > 0 ? 6 + level_symbol_len + 1 : 0;
+ char level_display[level_len];
+
+ if (level_len > 0)
+ sprintf(level_display, "Level %s", level_symbol);
+
+ int bar = (double) score / (double) needed_score * ws.ws_col;
+ int level_start = (ws.ws_col - level_len) / 2;
+ int level_end = level_start + level_len - 1;
+
+ for (int i = 0; i < ws.ws_col; i++) {
+ if (i == bar)
+ printf("\e[49m");
+
+ if (i >= level_start && i < level_end)
+ printf("%c", level_display[i - level_start]);
+ else
+ printf(" ");
+ }
+
+ printf("\n");
+}
+
+static void score_globalstep(double dtime)
+{
+ if (level_timer > 0.0)
+ level_timer -= dtime;
- printf("\e[32m\e[3mScore:\e[23m %d", score);
+ if (score_timer > 0.0)
+ score_timer -= dtime * 3.0;
}
__attribute__ ((constructor)) static void init()
{
register_render_component(&render_score);
+ register_globalstep((struct globalstep) {
+ .run_if_dead = true,
+ .callback = &score_globalstep,
+ });
}
diff --git a/plugins/score/score.h b/plugins/score/score.h
index 8ee531a..4d02903 100644
--- a/plugins/score/score.h
+++ b/plugins/score/score.h
@@ -3,5 +3,6 @@
void add_score(int s);
int get_score();
+int get_level();
#endif