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