]> git.sur5r.net Git - c128-kasse/blob - src/itemz.c
itemz: fix depreciation warnings, make it fast()
[c128-kasse] / src / itemz.c
1 /*
2  * RGB2R-C128-Kassenprogramm
3  * © 2007-2009 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 #include "credit_manager.h"
18 #include "version.h"
19
20 static void itemz_print_screen(void) {
21   BYTE i;
22   char buffer[10];
23
24   clrscr();
25   cprintf("itemz (phil_fry, sECuRE, sur5r) v:" GV "\r\n\r\n");
26   cprintf("Datei: ITEMS\r\n\r\n");
27   for (i = 0; i < max(status.num_items, 15); i++) {
28     if (format_euro(buffer, 10, status.status[i].price) != buffer) {
29       cprintf("Error: Could not format price %d\r\n", status.status[i].price);
30       exit(1);
31     }
32     cprintf("Eintrag %2d: %s (%s, %d mal verkauft)\r\n", i,
33             status.status[i].item_name, buffer, status.status[i].times_sold);
34   }
35   cprintf("\r\nn) Neu d) Loeschen s) Speichern m) Credit Modus q) "
36           "Beenden\r\nr) Reset des Verkauft-Zaehlers\r\n");
37 }
38
39 static void new_item(void) {
40   char *input, *name;
41   int price;
42
43   if (status.num_items == MAX_ITEMS) {
44     cprintf("\rEs ist bereits die maximale Anzahl an Eintraegen erreicht, "
45             "druecke RETURN...\r\n");
46     input = get_input();
47     return;
48   }
49
50   cprintf("\rName des Eintrags:\r\n");
51   if ((input = get_input()) == NULL || *input == '\0')
52     return;
53   name = strdup(input);
54   cprintf("\r\nPreis in Cents:\r\n");
55   if ((input = get_input()) == NULL || *input == '\0' ||
56       (price = atoi(input)) == 0)
57     return;
58   cprintf("\r\nWie oft schon verkauft? [0] \r\n");
59   if ((input = get_input()) == NULL)
60     return;
61   memset(status.status[status.num_items].item_name, '\0',
62          MAX_ITEM_NAME_LENGTH + 1);
63   strncpy(status.status[status.num_items].item_name, name,
64           MAX_ITEM_NAME_LENGTH);
65   status.status[status.num_items].price = price;
66   status.status[status.num_items].times_sold = atoi(input);
67   status.num_items++;
68   free(name);
69 }
70
71 static void _delete_item(BYTE num) {
72   memset(status.status[num].item_name, '\0', MAX_ITEM_NAME_LENGTH);
73   status.status[num].price = 0;
74   status.status[num].times_sold = 0;
75 }
76
77 static void delete_item(void) {
78   char *input;
79   BYTE num, last;
80
81   cprintf("\r Welcher Eintrag soll geloescht werden?\r\n");
82   if ((input = get_input()) == NULL || *input == '\0')
83     return;
84   num = atoi(input);
85   if (status.num_items > 1) {
86     /* Swap last item with this one and delete the last one to avoid holes */
87     last = (status.num_items - 1);
88     strcpy(status.status[num].item_name, status.status[last].item_name);
89     status.status[num].price = status.status[last].price;
90     status.status[num].times_sold = status.status[last].times_sold;
91     _delete_item(last);
92   } else {
93     /* Just delete it */
94     _delete_item(num);
95   }
96   status.num_items--;
97 }
98
99 static void reset_counters(void) {
100   BYTE i;
101
102   for (i = 0; i < status.num_items; i++) {
103     status.status[i].times_sold = 0;
104   }
105 }
106
107 static void itemz_manager() {
108   char *c;
109   while (1) {
110     itemz_print_screen();
111     c = get_input();
112     switch (*c) {
113     case 'n':
114       new_item();
115       break;
116     case 'd':
117       delete_item();
118       break;
119     case 's':
120       save_items();
121       break;
122     case 'r':
123       reset_counters();
124       break;
125     case 'm':
126       return; // switch to credit mode
127     case 'q':
128       exit(0);
129     default:
130       cprintf("Unbekannter Befehl, druecke RETURN...\r\n");
131       get_input();
132     }
133   }
134 }
135
136 int main(void) {
137   if (VIDEOMODE == 40) {
138     videomode(80);
139   }
140
141   /*  clock CPU at double the speed (a whopping 2 Mhz!) */
142   fast();
143
144   credits.num_items = 0;
145   status.num_items = 0;
146   cprintf("itemz loading...\n");
147   load_config();
148   cprintf("itemz: loading ITEMS...\n");
149   load_items();
150   cprintf("itemz: loading CREDITS...\n");
151   load_credits();
152   while (1) {
153     itemz_manager();
154     credit_manager();
155   }
156   return 0;
157 }