-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathscore.c
86 lines (68 loc) · 1.71 KB
/
score.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include "lib/SMSlib.h"
#include "lib/PSGlib.h"
#include "score.h"
void init_score_display(score_display *score, char x, char y, char base_tile) {
score->x = x;
score->y = y;
score->base_tile = base_tile;
score->dirty = 1;
score->value = 0;
score->characters[0] = 0;
}
void update_score_display(score_display *score, unsigned int value) {
score->value = value;
score->dirty = 1;
}
void increment_score_display(score_display *score, int delta) {
update_score_display(score, score->value + delta);
}
// Adapted from https://stackoverflow.com/a/784455/679240
void reverse_string(char *str) {
static char *start, *end, temp;
/* get range */
start = str;
end = start + strlen(str) - 1; /* -1 for \0 */
/* reverse */
while (end > start) {
/* swap */
temp = *start;
*start = *end;
*end = temp;
/* move */
start++;
end--;
}
}
void update_score_display_characters(score_display *_score) {
static score_display *score;
static unsigned int remaining;
static char digit, base_tile;
static char *ch;
score = _score;
base_tile = score->base_tile;
ch = score->characters;
remaining = score->value;
do {
digit = remaining % 10;
remaining /= 10;
*ch = base_tile + (digit << 1);
ch++;
} while (remaining);
*ch = 0;
reverse_string(score->characters);
score->dirty = 0;
}
void draw_score_display(score_display *_score) {
static score_display *score;
static char x, y, *ch;
score = _score;
if (score->dirty) update_score_display_characters(score);
x = score->x;
y = score->y;
for (ch = score->characters; *ch; ch++, x += 8) {
SMS_addSprite(x, y, *ch);
}
}