]> git.sur5r.net Git - c128-kasse/blob - kasse.c
684af7294f3959b7fa02425ee7253a206efbd00c
[c128-kasse] / kasse.c
1 #include <stdio.h>
2 #include <conio.h>
3 #include <stdlib.h>
4 #include <string.h>
5
6 #include "general.h"
7 #include "config.h"
8 #include "kasse.h"
9 #include "credit_manager.h"
10 // drucker 4 oder 5
11 // graphic 4,0,10
12
13
14
15 /* Hauptbildschirm ausgeben */
16 void print_screen() {
17         uc i = 0;
18         clrscr();
19         printf("C128-Kassenprogramm\n\n");
20         printf("Eingenommen: %ld Cents, Verkauft: %ld Flaschen, Drucken: %s\n\n", money, items_sold, (printing == 1 ? "ein" : "aus"));
21         for (; i < num_items; ++i)
22                 printf("Eintrag %x: %s (%d Cents, %d mal verkauft)\n", i, status[i].item_name, status[i].price, status[i].times_sold);
23         printf("\nBefehle: s) Daten sichern d) Drucken umschalten g) Guthabenverwaltung\n");
24 }
25
26 /* Druckt eine entsprechende Zeile aus */
27 void print_log(uc n, int einheiten, char *nickname) {
28         /* Format: 
29            Transaction-ID (Anzahl verkaufter Einträge, inklusive des zu druckenden!)
30            Uhrzeit (TODO)
31            Eintragname (= Getränk)
32            Preis (in Cents)
33            Anzahl
34            Nickname (falls es vom Guthaben abgezogen wird)
35            */
36         printf("[%d] UHRZEIT - %s - %d - %d - an %s\n", items_sold, status[n].item_name, status[n].price, einheiten, (nickname != NULL ? nickname : "Unbekannt"));
37 }
38
39 /* Dialog, der einen durch's Abrechnen der Einträge führt */
40 void buy(uc n) {
41         int negative = 1;
42         char entered[5] = {'1', 0, 0, 0, 0};
43         uc i = 0, matches = 0;
44         uc c, nickname_len, single_match;
45         int einheiten;
46         char *nickname;
47         if (status[n].item_name == NULL)
48                 printf("FEHLER: Diese Einheit existiert nicht.\n");
49         else {
50                 printf("Wieviel Einheiten \"%s\"?\n", status[n].item_name);
51                 while (1) {
52                         c = getchar();
53                         if (c == 13)
54                                 break;
55                         else if (c == '-'&& i == 0)
56                                 negative = -1;
57                         else if (c > 47 && c < 58)
58                                 entered[i++] = c;
59                 }
60                 einheiten = atoi(entered) * negative;
61                 printf("\nAuf ein Guthaben kaufen? Wenn ja, Nickname eingeben:\n");
62                 nickname = get_input();
63                 if (nickname[0] == '\0') {
64                         free(nickname);
65                         nickname = NULL;
66                 } else {
67                         nickname_len = strlen(nickname);
68                         /* go through credits and remove the amount of money or set nickname
69                          * to NULL if no such credit could be found */
70                         for (c = 0; c < num_credit_items; ++c)
71                                 if (strncmp(nickname, credits[c].nickname, nickname_len) == 0) {
72                                         if (++matches == 2)
73                                                 break;
74                                         else single_match = c;
75                                 }
76                         if (matches == 1) {
77                                 if (credits[single_match].credit < (status[n].price * einheiten)) {
78                                         printf("Sorry, %s hat nicht genug Geld :-(\n", nickname);
79                                         free(nickname);
80                                         return;
81                                 } else {
82                                         /* Geld abziehen */
83                                         credits[single_match].credit -= (status[n].price * einheiten);
84                                         printf("\nVerbleibendes Guthaben fuer %s: %d Cents. Druecke ANYKEY...\n", nickname, credits[single_match].credit);
85                                         getchar();
86                                 }
87                         } else {
88                                 free(nickname);
89                                 nickname = NULL;
90                         }
91                 }
92                 status[n].times_sold += einheiten;
93                 money += status[n].price * einheiten;
94                 items_sold += einheiten;
95                 if (printing == 1)
96                         print_log(n, einheiten, nickname);
97                 if (nickname != NULL)
98                         free(nickname);
99         }
100 }
101
102 int main() {
103         static uc c;
104         /* Konfigurationsdatei laden */
105         load_config();
106         /* Einträge (=Getränke) laden */
107         load_items();
108         /* Zustand laden */
109         load_state();
110         /* Guthaben laden */
111         load_credits();
112         while (1) {
113                 /* Bildschirm anzeigen */
114                 print_screen();
115                 /* Tastatureingaben abfragen */
116                 c = getchar();
117                 /* und eventuell weitere Dialoge anzeigen */
118                 if (c > 47 && c < 58)
119                         buy(c - 48);
120                 else if (c == 's') {
121                         /* Zustandsdatei schreiben */
122                         save_state();
123                         save_credits();
124                         printf("Statefile/Creditfile gesichert, druecke ANYKEY...\n");
125                         getchar();
126                 } else if (c == 'd') {
127                         /* Drucken an- oder ausschalten */
128                         printing = (printing == 1 ? 0 : 1);
129                         printf("Drucken ist nun %s, druecke ANYKEY...\n", (printing == 1 ? "eingeschaltet" : "ausgeschaltet"));
130                         getchar();
131                 } else if (c == 'g') {
132                         /* Guthabenverwalter aufrufen */
133                         credit_manager();
134                 } else if (c == 'q')
135                         break;
136         }
137         printf("BYEBYE\n");
138 }