-/* Druckt eine entsprechende Zeile aus */
-static void print_log(BYTE n, int einheiten, char *nickname) {
- BYTE c;
- char *time = get_time();
- char price[10];
- /* Format:
- Transaction-ID (Anzahl verkaufter Einträge, inklusive des zu druckenden!)
- Uhrzeit
- Eintragname (= Getränk)
- Preis (in Cents)
- Anzahl
- Nickname (falls es vom Guthaben abgezogen wird)
- */
- if (format_euro(price, 10, status.status[n].price) == NULL) {
- cprintf("Preis %d konnte nicht umgerechnet werden\r\n", status.status[n].price);
- exit(1);
- }
-
- sprintf(print_buffer, "[%lu] %s - %s - %s - %d - an %s\r\n",
- items_sold, time, status.status[n].item_name, price,
- einheiten, (nickname != NULL ? nickname : "Unbekannt"));
- c = cbm_open((BYTE)4, (BYTE)4, (BYTE)0, NULL);
- if (c != 0) {
- c128_perror(c, "cbm_open(printer)");
- save_items();
- save_credits();
- exit(1);
- }
- c = cbm_write((BYTE)4, print_buffer, strlen(print_buffer));
- if (c != strlen(print_buffer)) {
- c128_perror(c, "write(printer)");
- save_items();
- save_credits();
- exit(1);
- }
- cbm_close((BYTE)4);
- log_file(print_buffer);
+/* dialog which is called for each bought item */
+static signed int buy(char *name, unsigned int price) {
+ BYTE matches = 0;
+ BYTE c, nickname_len;
+ int einheiten;
+ char nickname[NICKNAME_MAX_LEN + 1];
+ char rest[10];
+ struct credits_t *credit;
+
+ memset(nickname, '\0', sizeof(nickname));
+ memset(rest, '\0', sizeof(rest));
+
+ clrscr();
+ cprintf("Wieviel Einheiten \"%s\"? [1] \r\n", name);
+
+ einheiten = cget_number(1);
+
+ if (einheiten > 100 || einheiten < -100 || einheiten == 0) {
+ cprintf("\r\nEinheit nicht in [-100, 100] oder 0, Abbruch, dr" uUML "cke "
+ "RETURN...\r\n");
+ cgetc();
+ return 1;
+ }
+
+ cprintf("\r\nAuf ein Guthaben kaufen? Wenn ja, Nickname eingeben:\r\n");
+ {
+ BYTE i;
+ BYTE x;
+ BYTE y;
+ BYTE matches;
+ char *uniquematch;
+ input_terminator_t terminator;
+ while (1) {
+ terminator = get_input_terminated_by(INPUT_TERMINATOR_RETURN |
+ INPUT_TERMINATOR_SPACE,
+ nickname, sizeof(nickname));
+
+ /* Clear the screen from any previous completions */
+ x = wherex();
+ y = wherey();
+ for (i = 1; i < 7; i++) {
+ /* "Completion:" is longer than NICKNAME_MAX_LEN */
+ cclearxy(0, y + i, strlen("Completion:"));
+ }
+ gotoxy(x, y);
+
+ if (terminator != INPUT_TERMINATOR_SPACE) {
+ break;
+ }
+
+ matches = 0;
+ uniquematch = NULL;
+ for (i = 0; i < credits.num_items; i++) {
+ if (strncmp(nickname, credits.credits[i].nickname, strlen(nickname)) !=
+ 0) {
+ continue;
+ }
+ matches++;
+ if (matches > 1) {
+ break;
+ }
+ uniquematch = credits.credits[i].nickname;
+ }
+ if (matches == 1) {
+ /* Display the rest of the nickname */
+ textcolor(TC_LIGHT_GREEN);
+ cprintf("%s", uniquematch + strlen(nickname));
+ textcolor(TC_LIGHT_GRAY);
+ strcat(nickname, uniquematch + strlen(nickname));
+ } else {
+ /* Multiple nicknames match what was entered so far. Abort and
+ * display all matches, then prompt the user again. */
+ char completion[NICKNAME_MAX_LEN + 1];
+ BYTE len = strlen(nickname);
+ x = wherex();
+ y = wherey();
+ cprintf("\r\nCompletion:\r\n");
+ matches = 0;
+ for (i = 0; i < credits.num_items; i++) {
+ if (strncmp(nickname, credits.credits[i].nickname, len) != 0) {
+ continue;
+ }
+ if (++matches == 5) {
+ cprintf("...\r\n");
+ break;
+ }
+ strcpy(completion, credits.credits[i].nickname);
+ *(completion + len) = '\0';
+ cprintf("%s", completion);
+ textcolor(TC_LIGHT_GREEN);
+ cprintf("%c", *(credits.credits[i].nickname + len));
+ textcolor(TC_LIGHT_GRAY);
+ cprintf("%s\r\n", completion + len + 1);
+ }
+ gotoxy(x, y);
+ }
+ }
+ }
+
+ if (*nickname != '\0' && *nickname != PETSCII_SP) {
+ nickname_len = strlen(nickname);
+ /* go through credits and remove the amount of money or set nickname
+ * to NULL if no such credit could be found */
+ credit = find_credit(nickname);
+ if (credit != NULL) {
+ while ((signed int)credit->credit < ((signed int)price * einheiten)) {
+ if (format_euro(rest, sizeof(rest), credit->credit) == NULL) {
+ cprintf("Preis %d konnte nicht umgerechnet werden\r\n",
+ credit->credit);
+ exit(1);
+ }
+ cprintf(
+ "\r\n%s hat nicht genug Geld (%s). e) einzahlen a) abbruch \r\n",
+ nickname, rest);
+ c = cgetc();
+ if (c == 'e') {
+ deposit_credit(nickname);
+ } else {
+ return 0;
+ }
+ }
+ /* substract money */
+ credit->credit -= (price * einheiten);
+
+ if (format_euro(rest, sizeof(rest), credit->credit) == NULL) {
+ cprintf("Preis %d konnte nicht umgerechnet werden\r\n", credit->credit);
+ exit(1);
+ }
+
+ textcolor(TC_LIGHT_GREEN);
+ cprintf("\r\nVerbleibendes Guthaben f" uUML "r %s: %s. Dr" uUML
+ "cke RETURN...\r\n",
+ nickname, rest);
+ textcolor(TC_LIGHT_GRAY);
+ cget_return();
+ matches++;
+ } else {
+ textcolor(TC_LIGHT_RED);
+ cprintf("\r\nNickname nicht gefunden in der Guthabenverwaltung! Abbruch, "
+ "dr" uUML "cke RETURN...\r\n");
+ textcolor(TC_LIGHT_GRAY);
+ cget_return();
+ return 0;
+ }
+ } else {
+ /* Ensure that nickname is NULL if it's empty because it's used in print_log
+ */
+ *nickname = '\0';
+ }
+
+ money += price * einheiten;
+ items_sold += einheiten;
+ if (printing == 1)
+ print_log(name, price, einheiten, nickname, rest);
+
+ return einheiten;