]> git.sur5r.net Git - c128-kasse/blob - src/itemz.c
4046c21a819516d4f976fdf31024a774c719b553
[c128-kasse] / src / itemz.c
1 /*
2  * RGB2R-C128-Kassenprogramm
3  * (c) 2007 phil_fry, sECuRE, sur5r
4  *
5  * itemz.c: Verwaltet die ITEMS- und CREDITS-datei
6  *
7  */
8 #include <c128.h>
9 #include <conio.h>
10 #include <stdlib.h>
11 #include <stdio.h>
12 #include <string.h>
13
14 #include "general.h"
15 #include "config.h"
16
17 enum itemz_mode { MODE_ITEMS, MODE_CREDITS };
18
19 static enum itemz_mode mode = MODE_ITEMS;
20 static BYTE current_credits_page = 0;
21
22 static void print_screen() {
23         BYTE i, pages;
24         char buffer[10];
25
26         clrscr();
27         cprintf("itemz (phil_fry, sECuRE, sur5r)\r\n\r\n");
28         if (mode == MODE_ITEMS) {
29                 cprintf("Datei: ITEMS\r\n\r\n");
30                 for (i = 0; i < status.num_items; i++) {
31                         if (format_euro(buffer, 10, status.status[i].price) != buffer) {
32                                 cprintf("Error: Could not format price %d\r\n", status.status[i].price);
33                                 exit(1);
34                         }
35                         cprintf("Eintrag %x: %s (%s, %d mal verkauft)\r\n",
36                                 i, status.status[i].item_name, buffer, status.status[i].times_sold);
37                 }
38                 cprintf("\r\nn) Neu d) Loeschen s) Speichern m) Modus\r\n");
39         } else {
40                 /* 16 entries per page */
41                 pages = (credits.num_items / 16);
42                 if (current_credits_page > pages)
43                         current_credits_page = pages;
44                 cprintf("Datei: CREDITS (Seite %d von %d)\r\n\r\n", current_credits_page, pages);
45                 for (i = (current_credits_page * 16); i < credits.num_items && i < ((current_credits_page+1) * 16); i++) {
46                         if (format_euro(buffer, 10, credits.credits[i].credit) != buffer) {
47                                 cprintf("Error: Could not format credit %d\r\n", credits.credits[i].credit);
48                                 exit(1);
49                         }
50
51                         cprintf("%d: %s: %s\r\n", i, credits.credits[i].nickname, buffer);
52                 }
53                 cprintf("\r\nn) Neu d) Loeschen b) Seite hoch f) Seite runter\r\ne) Aendern s) Speichern m) Modus\r\n");
54         }
55 }
56
57 static void new_item() {
58         char *input, *name;
59         int price;
60
61         if (status.num_items == 16) {
62                 cprintf("\rEs ist bereits die maximale Anzahl an Eintraegen erreicht, druecke RETURN...\r\n");
63                 input = get_input();
64                 return;
65         }
66
67         cprintf("\rName des Eintrags:\r\n");
68         if ((input = get_input()) == NULL || *input == '\0')
69                 return;
70         name = strdup(input);
71         cprintf("\r\nPreis in Cents:\r\n");
72         if ((input = get_input()) == NULL || *input == '\0' || (price = atoi(input)) == 0)
73                 return;
74         cprintf("\r\nWie oft schon verkauft? [0] \r\n");
75         if ((input = get_input()) == NULL || *input == '\0')
76                 return;
77         strcpy(status.status[status.num_items].item_name, name);
78         status.status[status.num_items].price = price;
79         status.status[status.num_items].times_sold = atoi(input);
80         status.num_items++;
81         free(name);
82 }
83
84 static void _delete_item(BYTE num) {
85         memset(status.status[num].item_name, '\0', 10);
86         status.status[num].price = 0;
87         status.status[num].times_sold = 0;
88 }
89
90 static void delete_item() {
91         char *input;
92         BYTE num, last;
93
94         cprintf("\r Welcher Eintrag soll geloescht werden?\r\n");
95         if ((input = get_input()) == NULL || *input == '\0')
96                 return;
97         num = atoi(input);
98         if (status.num_items > 1) {
99                 /* Swap last item with this one and delete the last one to avoid holes */
100                 last = (status.num_items - 1);
101                 strcpy(status.status[num].item_name, status.status[last].item_name);
102                 status.status[num].price = status.status[last].price;
103                 status.status[num].times_sold = status.status[last].times_sold;
104                 _delete_item(last);
105         } else {
106                 /* Just delete it */
107                 _delete_item(num);
108         }
109         status.num_items--;
110 }
111
112 static void new_credit() {
113         char *input, *name;
114         int credit;
115
116         if (credits.num_items == 75) {
117                 cprintf("\rEs ist bereits die maximale Anzahl an Eintraegen erreicht, druecke RETURN...\r\n");
118                 input = get_input();
119                 return;
120         }
121
122         cprintf("\rNickname:\r\n");
123         if ((input = get_input()) == NULL || *input == '\0')
124                 return;
125         name = strdup(input);
126         cprintf("\r\nGuthaben in Cents:\r\n");
127         if ((input = get_input()) == NULL || *input == '\0' || (credit = atoi(input)) == 0)
128                 return;
129         strcpy(credits.credits[credits.num_items].nickname, name);
130         credits.credits[credits.num_items].credit = credit;
131         credits.num_items++;
132         free(name);
133 }
134
135 static void _delete_credit(BYTE num) {
136         memset(credits.credits[num].nickname, '\0', 11);
137         credits.credits[num].credit = 0;
138 }
139
140 static void delete_credit() {
141         char *input;
142         BYTE num, last;
143
144         cprintf("\r Welcher Eintrag soll geloescht werden?\r\n");
145         if ((input = get_input()) == NULL || *input == '\0')
146                 return;
147         num = atoi(input);
148         if (credits.num_items > 1) {
149                 /* Swap last item with this one and delete the last one to avoid holes */
150                 last = (credits.num_items - 1);
151                 strcpy(credits.credits[num].nickname, credits.credits[last].nickname);
152                 credits.credits[num].credit = credits.credits[last].credit;
153                 _delete_credit(last);
154         } else {
155                 /* Just delete it */
156                 _delete_credit(num);
157         }
158         credits.num_items--;
159 }
160
161 int main() {
162         char *c;
163         toggle_videomode();
164         credits.num_items = 0;
165         status.num_items = 0;
166         cprintf("itemz loading...\n");
167         load_config();
168         cprintf("itemz: loading ITEMS...\n");
169         load_items();
170         cprintf("itemz: loading CREDITS...\n");
171         load_credits();
172         while (1) {
173                 print_screen();
174                 c = get_input();
175                 if (mode == MODE_ITEMS) {
176                         if (*c == 'n')
177                                 new_item();
178                         else if (*c == 'd')
179                                 delete_item();
180                         else if (*c == 's')
181                                 save_items();
182                         else if (*c == 'm')
183                                 mode = MODE_CREDITS;
184                         else {
185                                 cprintf("Unbekannter Befehl, druecke RETURN...\r\n");
186                                 c = get_input();
187                         }
188                 } else {
189                         if (*c == 'm')
190                                 mode = MODE_ITEMS;
191                         else if (*c == 'n')
192                                 new_credit();
193                         else if (*c == 'd')
194                                 delete_credit();
195                         else if (*c == 's')
196                                 save_credits();
197                         else if (*c == 'f') {
198                                 if (current_credits_page < (credits.num_items / 16))
199                                         current_credits_page++;
200                         } else if (*c == 'b') {
201                                 if (current_credits_page > 0)
202                                         current_credits_page--;
203                         }
204                         else {
205                                 cprintf("Unbekannter Befehl, druecke RETURN...\r\n");
206                                 c = get_input();
207                         }
208                 }
209         }
210         return 0;
211 }