From 2300d2813a524cbfeabac794335e7abe99263df6 Mon Sep 17 00:00:00 2001 From: "B. Watson" Date: Tue, 29 Dec 2015 23:10:50 -0500 Subject: initial commit --- taipan-orig.c | 2735 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 2735 insertions(+) create mode 100644 taipan-orig.c (limited to 'taipan-orig.c') diff --git a/taipan-orig.c b/taipan-orig.c new file mode 100644 index 0000000..2b0bc71 --- /dev/null +++ b/taipan-orig.c @@ -0,0 +1,2735 @@ +/* ------------------------------------------------------------------------ * + * Taipan version 0.9 + * A text/ncurses game for Linux. + * + * Created by: + * Art Canfil + * + * Programmed by: + * Jay Link + * + * Apple ][ program coded by: + * Ronald J. Berg + * ------------------------------------------------------------------------ */ + +#include +#include +#include +#include +#include + +#define GENERIC 1 +#define LI_YUEN 2 + +void splash_intro(void); +int get_one(void); +long get_num(int maxlen); +void name_firm(void); +void cash_or_guns(void); +void set_prices(void); +void port_stats(void); +int port_choices(void); +void new_ship(void); +void new_gun(void); +void li_yuen_extortion(void); +void elder_brother_wu(void); +void good_prices(void); +void buy(void); +void sell(void); +void visit_bank(void); +void transfer(void); +void quit(void); +void overload(void); +void fancy_numbers(float num, char *fancy); +int sea_battle(int id, int num_ships); +void draw_lorcha(int x, int y); +void clear_lorcha(int x, int y); +void draw_blast(int x, int y); +void sink_lorcha(int x, int y); +void fight_stats(int ships, int orders); +void mchenry(void); +void retire(void); +void final_stats(void); + +char firm[23], + fancy_num[13]; + +char *item[] = { "Opium", "Silk", "Arms", "General Cargo" }; + +char *location[] = { "At sea", "Hong Kong", "Shanghai", "Nagasaki", + "Saigon", "Manila", "Singapore", "Batavia" }; + +char *months[] = { "Jan", "Feb", "Mar", "Apr", "May", "Jun", + "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" }; + +char *st[] = { "Critical", " Poor", " Fair", + " Good", " Prime", "Perfect" }; + +float cash = 0, + bank = 0, + debt = 0, + booty = 0, + ec = 20, + ed = .5; + +long price[4]; + +int base_price[4][8] = { {1000, 11, 16, 15, 14, 12, 10, 13}, + {100, 11, 14, 15, 16, 10, 13, 12}, + {10, 12, 16, 10, 11, 13, 14, 15}, + {1, 10, 11, 12, 13, 14, 15, 16} }; + +int hkw_[4], + hold_[4]; + +int hold = 0, + capacity = 60, + guns = 0, + bp = 0, + damage = 0, + month = 1, + year = 1860, + li = 0, + port = 1, + wu_warn = 0, + wu_bailout = 0; + +int main(void) +{ + int choice; + + srand(getpid()); + + initscr(); + cbreak(); + noecho(); + + splash_intro(); + name_firm(); + cash_or_guns(); + set_prices(); + + for (;;) + { + choice = 0; + + port_stats(); + + if ((port == 1) && (li == 0) && (cash > 0)) + { + li_yuen_extortion(); + } + + if ((port == 1) && (damage > 0)) + { + mchenry(); + } + + if ((port == 1) && (debt >= 10000) && (wu_warn == 0)) + { + int braves = rand()%100 + 50; + + move(16, 0); + clrtobot(); + printw("Comprador's Report\n\n"); + printw("Elder Brother Wu has sent %d braves\n", braves); + printw("to escort you to the Wu mansion, Taipan.\n"); + + refresh(); + timeout(3000); + getch(); + timeout(-1); + + move(18, 0); + clrtobot(); + printw("Elder Brother Wu reminds you of the\n"); + printw("Confucian ideal of personal worthiness,\n"); + printw("and how this applies to paying one's\n"); + printw("debts.\n"); + + refresh(); + timeout(3000); + getch(); + timeout(-1); + + move(18, 0); + clrtobot(); + printw("He is reminded of a fabled barbarian\n"); + printw("who came to a bad end, after not caring\n"); + printw("for his obligations.\n\n"); + printw("He hopes no such fate awaits you, his\n"); + printw("friend, Taipan.\n"); + + refresh(); + timeout(5000); + getch(); + timeout(-1); + + wu_warn = 1; + } + + if (port == 1) + { + elder_brother_wu(); + } + + if (rand()%4 == 0) + { + if (rand()%2 == 0) + { + new_ship(); + } else if (guns < 1000) { + new_gun(); + } + } + + if ((port != 1) && (rand()%18 == 0) && (hold_[0] > 0)) + { + float fine = ((cash / 1.8) * ((float) rand() / RAND_MAX)) + 1; + + hold += hold_[0]; + hold_[0] = 0; + cash -= fine; + + port_stats(); + + fancy_numbers(fine, fancy_num); + move(16, 0); + clrtobot(); + printw("Comprador's Report\n\n"); + printw("Bad Joss!!\n"); + printw("The local authorities have seized your\n"); + printw("Opium cargo and have also fined you\n"); + printw("%s, Taipan!\n", fancy_num); + + refresh(); + timeout(5000); + getch(); + timeout(-1); + } + + if ((rand()%50 == 0) && + ((hkw_[0] + hkw_[1] + hkw_[2] + hkw_[3]) > 0)) + { + int i; + + for (i = 0; i < 4; i++) + { + hkw_[i] = ((hkw_[i] / 1.8) * ((float) rand() / RAND_MAX)); + } + + port_stats(); + + move(16, 0); + clrtobot(); + printw("Comprador's Report\n\n"); + printw("Messenger reports large theft\n"); + printw("from warehouse, Taipan.\n"); + + refresh(); + timeout(5000); + getch(); + timeout(-1); + } + + if (rand()%20 == 0) + { + if (li > 0) { li++; } + if (li == 4) { li = 0; } + } + + if ((port != 1) && (li == 0) && (rand()%4 != 0)) + { + move(16, 0); + clrtobot(); + printw("Comprador's Report\n\n"); + printw("Li Yuen has sent a Lieutenant,\n"); + printw("Taipan. He says his admiral wishes\n"); + printw("to see you in Hong Kong, posthaste!\n"); + + refresh(); + timeout(3000); + getch(); + timeout(-1); + } + + if (rand()%9 == 0) + { + good_prices(); + } + + if ((cash > 25000) && (rand()%20 == 0)) + { + float robbed = ((cash / 1.4) * ((float) rand() / RAND_MAX)); + + cash -= robbed; + port_stats(); + + fancy_numbers(robbed, fancy_num); + move(16, 0); + clrtobot(); + printw("Comprador's Report\n\n"); + printw("Bad Joss!!\n"); + printw("You've been beaten up and\n"); + printw("robbed of %s in cash, Taipan!!\n", fancy_num); + + refresh(); + timeout(5000); + getch(); + timeout(-1); + } + + for (;;) + { + while ((choice != 'Q') && (choice != 'q')) + { + switch (choice = port_choices()) + { + case 'B': + case 'b': + buy(); + break; + + case 'S': + case 's': + sell(); + break; + + case 'V': + case 'v': + visit_bank(); + break; + + case 'T': + case 't': + transfer(); + break; + + case 'R': + case 'r': + retire(); + } + + port_stats(); + } + + choice = 0; + if (hold >= 0) + { + quit(); + break; + } else { + overload(); + } + } + } + + clear(); + refresh(); + nocbreak(); + endwin(); + + return EXIT_SUCCESS; +} + +void splash_intro(void) +{ + flushinp(); + clear(); + printw("\n"); + printw(" _____ _ ___ ____ _ _ _ ===============\n"); + printw(" |_ _|/ \\ |_ _| _ \\ / \\ | \\ | | Created by:\n"); + printw(" | | / _ \\ | || |_) / _ \\ | \\| | Art Canfil\n"); + printw(" | |/ ___ \\ | || __/ ___ \\| |\\ |\n"); + printw(" |_/_/ \\_\\___|_| /_/ \\_\\_| \\_| ===============\n"); + printw(" Programmed by:\n"); + printw(" A game based on the China trade of the 1800's Jay Link\n"); + printw("\n"); + printw(" ~~| , jlink@ilbbs.com\n"); + printw(" ,|`-._/|\n"); + printw(" .' | /||\\ ===============\n"); + printw(" .' | ./ ||`\\ Copyright (c)\n"); + printw(" / `-. |/._ || \\ 1978 - 2002\n"); + printw(" / `|| `|;-._\\ Art Canfil\n"); + printw(" | || || \\\n"); + printw("~^~_-~^~=~^~~^= / || ||__ \\~^=~^~-~^~_~^~= ===============\n"); + printw(" ~=~^~ _~^~ =~ `--------|`---|| `\"-`___~~^~ =_~^= Press "); + attrset(A_REVERSE); + printw("ANY"); + attrset(A_NORMAL); + printw(" key\n"); + printw("~ ~^~=~^_~^~ =~ \\~~~~~~~'~~~~'~~~~/~~`` ~=~^~ ~^= to start.\n"); + printw(" ~^=~^~_~-=~^~ ^ `--------------'~^~=~^~_~^=~^~=~\n"); + curs_set(0); + refresh(); + + getch(); + curs_set(1); + return; +} + +int get_one(void) +{ + int input, + choice = 0, + character = 0; + + while ((input = getch()) != '\n') + { + if (((input == 8) || (input == 127)) && (character == 0)) + { + refresh(); + } else if ((input == 8) || (input == 127)) { + printw("%c", 8); + printw(" "); + printw("%c", 8); + character--; + refresh(); + } else if (character >= 1) { + refresh(); + } else if (input == '\33') { + flushinp(); + refresh(); + } else { + printw("%c", input); + choice = input; + character++; + refresh(); + } + } + + return choice; +} + +long get_num(int maxlen) +{ + char number[maxlen + 1]; + + int input, + character = 0; + + long amount; + + while ((input = getch()) != '\n') + { + if (((input == 8) || (input == 127)) && (character == 0)) + { + refresh(); + } else if ((input == 8) || (input == 127)) { + printw("%c", 8); + printw(" "); + printw("%c", 8); + number[character] = '\0'; + character--; + refresh(); + } else if (character >= maxlen) { + refresh(); + } else if (input == '\33') { + flushinp(); + refresh(); + } else if (((input == 'A') || (input == 'a')) && + (character == 0) && (maxlen > 1)) { + printw("%c", input); + number[character] = input; + character++; + refresh(); + } else if ((input < 48) || (input > 57)) { + refresh(); + } else { + printw("%c", input); + number[character] = input; + character++; + refresh(); + } + } + + number[character] = '\0'; + if ((strcmp(number, "A") == 0) || (strcmp(number, "a") == 0)) + { + amount = -1; + } else { + amount = strtol(number, (char **)NULL, 10); + } + + return amount; +} + +void name_firm(void) +{ + int input, + character = 0; + + clear(); + move (7, 0); + printw(" _______________________________________\n"); + printw("| Taipan, |\n"); + printw("| |\n"); + printw("| What will you name your |\n"); + printw("| |\n"); + printw("| Firm: |\n"); + printw("| ---------------------- |\n"); + printw("|_______________________________________|\n"); + + move(12, 12); + refresh(); + + while (((input = getch()) != '\n') && (character < 22)) + { + if (((input == 8) || (input == 127)) && (character == 0)) + { + refresh(); + } else if ((input == 8) || (input == 127)) { + printw("%c", 8); + printw(" "); + printw("%c", 8); + firm[character] = '\0'; + character--; + refresh(); + } else if (input == '\33') { + flushinp(); + refresh(); + } else { + printw("%c", input); + firm[character] = input; + character++; + refresh(); + } + } + + firm[character] = '\0'; + + return; +} + +void cash_or_guns(void) +{ + int choice = 0; + + clear(); + move (5, 0); + printw("Do you want to start . . .\n\n"); + printw(" 1) With cash (and a debt)\n\n"); + printw(" >> or <<\n\n"); + printw(" 2) With five guns and no cash\n"); + printw(" (But no debt!)\n"); + + while ((choice != '1') && (choice != '2')) + { + move (15, 0); + clrtoeol(); + printw(" ?"); + refresh(); + choice = get_one(); + } + + if (choice == '1') + { + cash = 400; + debt = 5000; + hold = 60; + guns = 0; + li = 0; + bp = 10; + } else { + cash = 0; + debt = 0; + hold = 10; + guns = 5; + li = 1; + bp = 7; + } + + return; +} + +void set_prices(void) +{ + price[0] = base_price[0][port] / 2 * (rand()%3 + 1) * base_price[0][0]; + price[1] = base_price[1][port] / 2 * (rand()%3 + 1) * base_price[1][0]; + price[2] = base_price[2][port] / 2 * (rand()%3 + 1) * base_price[2][0]; + price[3] = base_price[3][port] / 2 * (rand()%3 + 1) * base_price[3][0]; + return; +} + +void port_stats(void) +{ + int in_use, + status = 100 - (((float) damage / capacity) * 100), + spacer, + i; + + clear(); + spacer = 12 - (strlen(firm) / 2); + for (i = 1; i <= spacer; i++) + { + printw(" "); + } + printw("Firm: %s, Hong Kong\n", firm); + printw(" ______________________________________\n"); + printw("|Hong Kong Warehouse | Date\n"); + printw("| Opium In Use: |\n"); + printw("| Silk |\n"); + printw("| Arms Vacant: | Location\n"); + printw("| General |\n"); + printw("|______________________________________|\n"); + printw("|Hold Guns | Debt\n"); + printw("| Opium |\n"); + printw("| Silk |\n"); + printw("| Arms | Ship Status\n"); + printw("| General |\n"); + printw("|______________________________________|\n"); + printw("Cash: Bank:\n"); + printw("________________________________________\n"); + + move(3, 12); + printw("%d", hkw_[0]); + move(4, 12); + printw("%d", hkw_[1]); + move(5, 12); + printw("%d", hkw_[2]); + move(6, 12); + printw("%d", hkw_[3]); + move(8, 6); + if (hold >= 0) + { + printw("%d", hold); + } else { + attrset(A_REVERSE); + printw("Overload"); + attrset(A_NORMAL); + } + move(9, 12); + printw("%d", hold_[0]); + move(10, 12); + printw("%d", hold_[1]); + move(11, 12); + printw("%d", hold_[2]); + move(12, 12); + printw("%d", hold_[3]); + + move(14, 5); + fancy_numbers(cash, fancy_num); + printw("%s", fancy_num); + + in_use = hkw_[0] + hkw_[1] + hkw_[2] + hkw_[3]; + move(4, 21); + printw("%d", in_use); + move(6, 21); + printw("%d", (10000 - in_use)); + + move(8, 25); + printw("%d", guns); + + move(14, 25); + fancy_numbers(bank, fancy_num); + printw("%s", fancy_num); + + move(3, 42); + printw("15 "); + attrset(A_REVERSE); + printw("%s", months[month - 1]); + attrset(A_NORMAL); + printw(" %d", year); + + move(6, 43); + spacer = (9 - strlen(location[port])) / 2; + for (i = 1; i <= spacer; i++) + { + printw(" "); + } + attrset(A_REVERSE); + printw("%s", location[port]); + attrset(A_NORMAL); + + move(9, 41); + fancy_numbers(debt, fancy_num); + spacer = (12 - strlen(fancy_num)) / 2; + for (i = 1; i <= spacer; i++) + { + printw(" "); + } + attrset(A_REVERSE); + printw("%s", fancy_num); + attrset(A_NORMAL); + + i = status / 20; + if (i < 2) + { + attrset(A_REVERSE); + move(12, 51); + printw(" "); + } + move(12, 42); + printw("%s:%d", st[i], status); + attrset(A_NORMAL); +} + +int port_choices(void) +{ + int choice = 0; + + move(16, 0); + clrtobot(); + printw("Comprador's Report\n\n"); + printw("Taipan, present prices per unit here are\n"); + printw(" Opium: Silk:\n"); + printw(" Arms: General:\n"); + move(19, 11); + printw("%ld", price[0]); + move(19, 29); + printw("%ld", price[1]); + move(20, 11); + printw("%ld", price[2]); + move(20, 29); + printw("%ld", price[3]); + + for (;;) + { + move (22, 0); + clrtobot(); + + if (port == 1) + { + if ((cash + bank) >= 1000000) + { + printw("Shall I Buy, Sell, Visit bank, Transfer\n"); + printw("cargo, Quit trading, or Retire? "); + refresh(); + + choice = get_one(); + if ((choice == 'B') || (choice == 'b') || + (choice == 'S') || (choice == 's') || + (choice == 'V') || (choice == 'v') || + (choice == 'T') || (choice == 't') || + (choice == 'Q') || (choice == 'q') || + (choice == 'R') || (choice == 'r')) + { + break; + } + } else { + printw("Shall I Buy, Sell, Visit bank, Transfer\n"); + printw("cargo, or Quit trading? "); + refresh(); + + choice = get_one(); + if ((choice == 'B') || (choice == 'b') || + (choice == 'S') || (choice == 's') || + (choice == 'V') || (choice == 'v') || + (choice == 'T') || (choice == 't') || + (choice == 'Q') || (choice == 'q')) + { + break; + } + } + } else { + printw("Shall I Buy, Sell, or Quit trading? "); + refresh(); + + choice = get_one(); + if ((choice == 'B') || (choice == 'b') || + (choice == 'S') || (choice == 's') || + (choice == 'Q') || (choice == 'q')) + { + break; + } + } + } + + return choice; +} + +void buy(void) +{ + char space[5]; + + int choice = 0; + + long afford, + amount; + + for (;;) + { + move(22, 0); + clrtobot(); + + printw("What do you wish me to buy, Taipan? "); + refresh(); + + choice = get_one(); + if ((choice == 'O') || (choice == 'o')) + { + choice = 0; + break; + } else if ((choice == 'S') || (choice == 's')) { + choice = 1; + break; + } else if ((choice == 'A') || (choice == 'a')) { + choice = 2; + break; + } else if ((choice == 'G') || (choice == 'g')) { + choice = 3; + break; + } + } + + for (;;) + { + move(21, 42); + clrtobot(); + + afford = cash / price[choice]; + attrset(A_REVERSE); + printw(" You can "); + attrset(A_NORMAL); + move(22, 0); + printw("How much %s shall", item[choice]); + move(22, 42); + attrset(A_REVERSE); + printw(" afford "); + move(23, 42); + printw(" "); + move(23, 42); + if (afford < 100) + { + strcpy(space, " "); + } else if (afford < 10000) { + strcpy(space, " "); + } else if (afford < 1000000) { + strcpy(space, " "); + } else if (afford < 100000000) { + strcpy(space, " "); + } else { + strcpy(space, ""); + } + printw("%s%ld", space, afford); + attrset(A_NORMAL); + + move(23, 0); + printw("I buy, Taipan: "); + refresh(); + + amount = get_num(9); + if (amount == -1) + { + amount = afford; + } + if (amount <= afford) + { + break; + } + } + + cash -= (amount * price[choice]); + hold_[choice] += amount; + hold -= amount; + + return; +} + +void sell(void) +{ + int choice = 0; + + long amount; + + for (;;) + { + move(22, 0); + clrtobot(); + + printw("What do you wish me to sell, Taipan? "); + refresh(); + + choice = get_one(); + if ((choice == 'O') || (choice == 'o')) + { + choice = 0; + break; + } else if ((choice == 'S') || (choice == 's')) { + choice = 1; + break; + } else if ((choice == 'A') || (choice == 'a')) { + choice = 2; + break; + } else if ((choice == 'G') || (choice == 'g')) { + choice = 3; + break; + } + } + + for (;;) + { + move(22, 0); + clrtobot(); + + printw("How much %s shall\n", item[choice]); + printw("I sell, Taipan: "); + refresh(); + + amount = get_num(9); + + if (amount == -1) + { + amount = hold_[choice]; + } + if (hold_[choice] >= amount) + { + hold_[choice] -= amount; + break; + } + } + + cash += (amount * price[choice]); + hold += amount; + + return; +} + +void visit_bank(void) +{ + long amount = 0; + + for (;;) + { + move(16, 0); + clrtobot(); + printw("Comprador's Report\n\n"); + printw("How much will you deposit? "); + refresh(); + + amount = get_num(9); + if (amount == -1) + { + amount = cash; + } + if (amount <= cash) + { + cash -= amount; + bank += amount; + break; + } else { + move(18, 0); + clrtobot(); + fancy_numbers(cash, fancy_num); + printw("Taipan, you only have %s\n", fancy_num); + printw("in cash.\n"); + + refresh(); + timeout(5000); + getch(); + timeout(-1); + } + } + port_stats(); + + for (;;) + { + move(16, 0); + clrtobot(); + printw("Comprador's Report\n\n"); + printw("How much will you withdraw? "); + refresh(); + + amount = get_num(9); + if (amount == -1) + { + amount = bank; + } + if (amount <= bank) + { + cash += amount; + bank -= amount; + break; + } else { + fancy_numbers(cash, fancy_num); + printw("Taipan, you only have %s\n", fancy_num); + printw("in the bank."); + + refresh(); + timeout(5000); + getch(); + timeout(-1); + } + } + port_stats(); + + return; +} + +void transfer(void) +{ + int i, in_use; + + long amount = 0; + + if ((hkw_[0] == 0) && (hold_[0] == 0) && + (hkw_[1] == 0) && (hold_[1] == 0) && + (hkw_[2] == 0) && (hold_[2] == 0) && + (hkw_[3] == 0) && (hold_[3] == 0)) + { + move(22, 0); + clrtobot(); + printw("You have no cargo, Taipan.\n"); + + refresh(); + timeout(5000); + getch(); + timeout(-1); + return; + } + + for (i = 0; i < 4; i++) + { + if (hold_[i] > 0) + { + for (;;) + { + move(16, 0); + clrtobot(); + printw("Comprador's Report\n\n"); + printw("How much %s shall I move\n", item[i]); + printw("to the warehouse, Taipan? "); + refresh(); + + amount = get_num(9); + if (amount == -1) + { + amount = hold_[i]; + } + if (amount <= hold_[i]) + { + in_use = hkw_[0] + hkw_[1] + hkw_[2] + hkw_[3]; + if ((in_use + amount) <= 10000) + { + hold_[i] -= amount; + hkw_[i] += amount; + hold += amount; + break; + } else if (in_use == 10000) { + move (21, 0); + printw("Your warehouse is full, Taipan!"); + } else { + move (21, 0); + printw("Your warehouse will only hold an\n"); + printw("additional %d, Taipan!", (10000 - in_use)); + + refresh(); + timeout(5000); + getch(); + timeout(-1); + } + } else { + move(18, 0); + clrtobot(); + printw("You have only %d, Taipan.\n", hold_[i]); + + refresh(); + timeout(5000); + getch(); + timeout(-1); + } + } + port_stats(); + } + + if (hkw_[i] > 0) + { + for (;;) + { + move(16, 0); + clrtobot(); + printw("Comprador's Report\n\n"); + printw("How much %s shall I move\n", item[i]); + printw("aboard ship, Taipan? "); + refresh(); + + amount = get_num(9); + if (amount == -1) + { + amount = hkw_[i]; + } + if (amount <= hkw_[i]) + { + hold_[i] += amount; + hkw_[i] -= amount; + hold -= amount; + break; + } else { + move(18, 0); + clrtobot(); + printw("You have only %d, Taipan.\n", hkw_[i]); + + refresh(); + timeout(5000); + getch(); + timeout(-1); + } + } + port_stats(); + } + } + + return; +} + +void quit(void) +{ + int choice = 0, + result = 0; + + move(16, 0); + clrtobot(); + printw("Comprador's Report\n\n"); + printw("Taipan, do you wish me to go to:\n"); + printw("1) Hong Kong, 2) Shanghai, 3) Nagasaki,\n"); + printw("4) Saigon, 5) Manila, 6) Singapore, or\n"); + printw("7) Batavia ? "); + refresh(); + + for (;;) + { + move(21, 13); + clrtobot(); + + choice = get_num(1); + + if (choice == port) + { + printw("\n\nYou're already here, Taipan."); + refresh(); + timeout(5000); + getch(); + timeout(-1); + } else if ((choice >= 1) && (choice <= 7)) { + port = choice; + break; + } + } + + move(6, 43); + printw(" "); + attrset(A_REVERSE); + printw("%s", location[0]); + attrset(A_NORMAL); + printw(" "); + + move(16, 0); + clrtobot(); + printw(" Captain's Report\n\n"); + + if (rand()%bp == 0) + { + int num_ships = rand()%((capacity / 10) + guns) + 1; + + if (num_ships > 9999) + { + num_ships = 9999; + } + printw("%d hostile ships approaching, Taipan!\n", num_ships); + refresh(); + + timeout(3000); + getch(); + timeout(-1); + + result = sea_battle(GENERIC, num_ships); + } + + if (result == 2) + { + port_stats(); + move(6, 43); + printw(" "); + attrset(A_REVERSE); + printw("%s", location[0]); + attrset(A_NORMAL); + printw(" "); + + move(16, 0); + clrtobot(); + printw(" Captain's Report\n\n"); + printw("Li Yuen's fleet drove them off!"); + refresh(); + + timeout(3000); + getch(); + timeout(-1); + } + + if (((result == 0) && (rand()%(4 + (8 * li))) == 0) || (result == 2)) + { + move(18, 0); + clrtobot(); + printw("Li Yuen's pirates, Taipan!!\n\n"); + refresh(); + + timeout(3000); + getch(); + timeout(-1); + + if (li > 0) + { + printw("Good joss!! They let us be!!\n"); + refresh(); + + timeout(3000); + getch(); + timeout(-1); + + return; + } else { + int num_ships = rand()%((capacity / 5) + guns) + 5; + + printw("%d ships of Li Yuen's pirate\n", num_ships); + printw("fleet, Taipan!!\n"); + refresh(); + + timeout(3000); + getch(); + timeout(-1); + + sea_battle(LI_YUEN, num_ships); + } + } + + if (result > 0) + { + port_stats(); + move(6, 43); + printw(" "); + attrset(A_REVERSE); + printw("%s", location[0]); + attrset(A_NORMAL); + printw(" "); + + move(16, 0); + clrtobot(); + printw(" Captain's Report\n\n"); + if (result == 1) + { + fancy_numbers(booty, fancy_num); + printw("We captured some booty.\n"); + printw("It's worth %s!", fancy_num); + cash += booty; + } else if (result == 3) { + printw("We made it!"); + } else { + printw("The buggers got us, Taipan!!!\n"); + printw("It's all over, now!!!"); + refresh(); + + timeout(5000); + getch(); + timeout(-1); + + final_stats(); + return; + } + + refresh(); + timeout(3000); + getch(); + timeout(-1); + } + + if (rand()%10 == 0) + { + move(18, 0); + clrtobot(); + printw("Storm, Taipan!!\n\n"); + refresh(); + timeout(3000); + getch(); + timeout(-1); + + if (rand()%30 == 0) + { + printw(" I think we're going down!!\n\n"); + refresh(); + timeout(3000); + getch(); + timeout(-1); + + if (((damage / capacity * 3) * ((float) rand() / RAND_MAX)) >= 1) + { + printw("We're going down, Taipan!!\n"); + refresh(); + timeout(5000); + getch(); + timeout(-1); + + final_stats(); + } + } + + printw(" We made it!!\n\n"); + refresh(); + timeout(3000); + getch(); + timeout(-1); + + if (rand()%3 == 0) + { + int orig = port; + + while (port == orig) + { + port = rand()%7 + 1; + } + + move(18, 0); + clrtobot(); + printw("We've been blown off course\n"); + printw("to %s", location[port]); + refresh(); + timeout(3000); + getch(); + timeout(-1); + } + } + + month++; + if (month == 13) + { + month = 1; + year++; + ec += 10; + ed += .5; + } + + debt = debt + (debt * .1); + bank = bank + (bank * .005); + set_prices(); + + move(18, 0); + clrtobot(); + printw("Arriving at %s...", location[port]); + refresh(); + timeout(3000); + getch(); + timeout(-1); + + return; +} + +void li_yuen_extortion(void) +{ + int time = ((year - 1860) * 12) + month, + choice = 0; + + float i = 1.8, + j = 0, + amount = 0; + + if (time > 12) + { + j = rand()%(1000 * time) + (1000 * time); + i = 1; + } + + amount = ((cash / i) * ((float) rand() / RAND_MAX)) + j; + + fancy_numbers(amount, fancy_num); + + move(16, 0); + clrtobot(); + printw("Comprador's Report\n\n"); + printw("Li Yuen asks %s in donation\n", fancy_num); + printw("to the temple of Tin Hau, the Sea\n"); + + while ((choice != 'Y') && (choice != 'y') && + (choice != 'N') && (choice != 'n')) + { + move (20, 0); + clrtoeol(); + printw("Goddess. Will you pay? "); + refresh(); + choice = get_one(); + } + + if ((choice == 'Y') || (choice == 'y')) + { + if (amount <= cash) + { + cash -= amount; + li = 1; + } else { + move (18, 0); + clrtobot(); + printw("Taipan, you do not have enough cash!!\n\n"); + refresh(); + + timeout(3000); + getch(); + timeout(-1); + + printw("Do you want Elder Brother Wu to make up\n"); + printw("the difference for you? "); + choice = 0; + while ((choice != 'Y') && (choice != 'y') && + (choice != 'N') && (choice != 'n')) + { + choice = get_one(); + } + + if ((choice == 'Y') || (choice == 'y')) + { + amount -= cash; + debt += amount; + cash = 0; + li = 1; + + move (18, 0); + clrtobot(); + printw("Elder Brother has given Li Yuen the\n"); + printw("difference between what he wanted and\n"); + printw("your cash on hand and added the same\n"); + printw("amount to your debt.\n"); + + refresh(); + timeout(5000); + getch(); + timeout(-1); + } else { + cash = 0; + + printw("Very well. Elder Brother Wu will not pay\n"); + printw("Li Yuen the difference. I would be very\n"); + printw("wary of pirates if I were you, Taipan.\n"); + + refresh(); + timeout(5000); + getch(); + timeout(-1); + } + } + } + + port_stats(); + + return; +} + +void elder_brother_wu(void) +{ + int choice = 0; + + long wu = 0; + + move(16, 0); + clrtobot(); + printw("Comprador's Report\n\n"); + printw("Do you have business with Elder Brother\n"); + printw("Wu, the moneylender? "); + + for (;;) + { + move (19, 21); + clrtoeol(); + refresh(); + + choice = get_one(); + if ((choice == 'N') || (choice == 'n')) + { + break; + } else if ((choice == 'Y') || (choice == 'y')) { + if (((int)cash == 0) && ((int)bank == 0) && (guns == 0) && + (hold_[0] == 0) && (hkw_[0] == 0) && + (hold_[1] == 0) && (hkw_[1] == 0) && + (hold_[2] == 0) && (hkw_[2] == 0) && + (hold_[3] == 0) && (hkw_[3] == 0)) + { + int i = rand()%1500 + 500, + j; + + wu_bailout++; + j = rand()%2000 * wu_bailout + 1500; + + for (;;) + { + move(16, 0); + clrtobot(); + printw("Comprador's Report\n\n"); + printw("Elder Brother is aware of your plight,\n"); + printw("Taipan. He is willing to loan you an\n"); + printw("additional %d if you will pay back\n", i); + printw("%d. Are you willing, Taipan? ", j); + refresh(); + + choice = get_one(); + if ((choice == 'N') || (choice == 'n')) + { + move(16, 0); + clrtobot(); + printw("Comprador's Report\n\n"); + printw("Very well, Taipan, the game is over!\n"); + + refresh(); + timeout(5000); + getch(); + timeout(-1); + + final_stats(); + } else if ((choice == 'Y') || (choice == 'y')) { + cash += i; + debt += j; + port_stats(); + + move(16, 0); + clrtobot(); + printw("Comprador's Report\n\n"); + printw("Very well, Taipan. Good joss!!\n"); + + refresh(); + timeout(5000); + getch(); + timeout(-1); + + return; + } + } + } else if ((cash > 0) && (debt != 0)) { + for (;;) + { + move(16, 0); + clrtobot(); + printw("Comprador's Report\n\n"); + printw("How much do you wish to repay\n"); + printw("him? "); + refresh(); + + wu = get_num(9); + if (wu == -1) + { + wu = cash; + } + if (wu <= cash) + { + cash -= wu; + if ((wu > debt) && (debt > 0)) + { + debt -= (wu + 1); + } else { + debt -= wu; + } + break; + } else { + move(18, 0); + clrtobot(); + fancy_numbers(cash, fancy_num); + printw("Taipan, you only have %s\n", fancy_num); + printw("in cash.\n"); + + refresh(); + timeout(5000); + getch(); + timeout(-1); + } + } + } + port_stats(); + + for (;;) + { + move(16, 0); + clrtobot(); + printw("Comprador's Report\n\n"); + printw("How much do you wish to\n"); + printw("borrow? "); + refresh(); + + wu = get_num(9); + if (wu == -1) + { + wu = (cash * 2); + } + if (wu <= (cash * 2)) + { + cash += wu; + debt += wu; + break; + } else { + printw("\n\nHe won't loan you so much, Taipan!"); + + refresh(); + timeout(5000); + getch(); + timeout(-1); + } + } + port_stats(); + + break; + } + } + + if ((debt > 20000) && (cash > 0) && (rand()%5 == 0)) + { + int num = rand()%3 + 1; + + cash = 0; + port_stats(); + + move(16, 0); + clrtobot(); + printw("Comprador's Report\n\n"); + printw("Bad joss!!\n"); + printw("%d of your bodyguards have been killed\n", num); + printw("by cutthroats and you have been robbed\n"); + printw("of all of your cash, Taipan!!\n"); + + refresh(); + timeout(5000); + getch(); + timeout(-1); + } + + return; +} + +void good_prices(void) +{ + char item[14]; + + int i = rand()%4, + j = rand()%2; + + if (i == 0) + { + strcpy(item, "Opium"); + } else if (i == 1) { + strcpy(item, "Silk"); + } else if (i == 2) { + strcpy(item, "Arms"); + } else { + strcpy(item, "General Cargo"); + } + + move(16, 0); + clrtobot(); + printw("Comprador's Report\n\n"); + printw("Taipan!! The price of %s\n", item); + if (j == 0) + { + price[i] = price[i] / 5; + printw("has dropped to %ld!!\n", price[i]); + } else { + price[i] = price[i] * (rand()%5 + 5); + printw("has risen to %ld!!\n", price[i]); + } + + refresh(); + timeout(3000); + getch(); + timeout(-1); +} + +void overload(void) +{ + move(16, 0); + clrtobot(); + printw("Comprador's Report\n\n"); + printw("Your ship is overloaded, Taipan!!"); + refresh(); + timeout(5000); + getch(); + timeout(-1); + return; +} + +void new_ship(void) +{ + int choice = 0, + time; + + float amount; + + time = ((year - 1860) * 12) + month; + amount = rand()%(1000 * (time + 5) / 6) * (capacity / 50) + 1000; + + if (cash < amount) + { + return; + } + + fancy_numbers(amount, fancy_num); + + move(16, 0); + clrtobot(); + printw("Comprador's Report\n\n"); + printw("Do you wish to trade in your "); + if (damage > 0) + { + attrset(A_REVERSE); + printw("damaged"); + attrset(A_NORMAL); + } else { + printw("fine"); + } + printw("\nship for one with 50 more capacity by\n"); + printw("paying an additional %s, Taipan? ", fancy_num); + refresh(); + + while ((choice != 'Y') && (choice != 'y') && + (choice != 'N') && (choice != 'n')) + { + choice = get_one(); + } + + if ((choice == 'Y') || (choice == 'y')) + { + cash -= amount; + hold += 50; + capacity += 50; + damage = 0; + } + + if ((rand()%2 == 0) && (guns < 1000)) + { + port_stats(); + new_gun(); + } + + port_stats(); + + return; +} + +void new_gun(void) +{ + int choice = 0, + time; + + float amount; + + time = ((year - 1860) * 12) + month; + amount = rand()%(1000 * (time + 5) / 6) + 500; + + if ((cash < amount) || (hold < 10)) + { + return; + } + + fancy_numbers(amount, fancy_num); + + move(16, 0); + clrtobot(); + printw("Comprador's Report\n\n"); + printw("Do you wish to buy a ship's gun\n"); + printw("for %s, Taipan? ", fancy_num); + refresh(); + + while ((choice != 'Y') && (choice != 'y') && + (choice != 'N') && (choice != 'n')) + { + choice = get_one(); + } + + if ((choice == 'Y') || (choice == 'y')) + { + cash -= amount; + hold -= 10; + guns += 1; + } + + port_stats(); + + return; +} + +void fancy_numbers(float num, char *fancy) +{ + char number[18]; + + if (num >= 100000000) + { + int num1 = (num / 1000000); + sprintf(number, "%d", num1); + strcpy(fancy, number); + strcat(fancy, " Million"); + } else if (num >= 10000000) { + int num1 = (num / 1000000); + int num2 = (((int) num % 1000000) / 100000); + sprintf(number, "%d", num1); + strcpy(fancy, number); + if (num2 > 0) + { + strcat(fancy, "."); + sprintf(number, "%d", num2); + strcat(fancy, number); + } + strcat(fancy, " Million"); + } else if (num >= 1000000) { + int num1 = (num / 1000000); + int num2 = (((int) num % 1000000) / 10000); + sprintf(number, "%d", num1); + strcpy(fancy, number); + if (num2 > 0) + { + strcat(fancy, "."); + sprintf(number, "%d", num2); + strcat(fancy, number); + } + strcat(fancy, " Million"); + } else { + sprintf(number, "%d", (int) num); + strcpy(fancy, number); + } +} + +int sea_battle(int id, int num_ships) +{ + int orders = 0, + num_on_screen = 0, + ships_on_screen[10], + time = ((year - 1860) * 12) + month, + s0 = num_ships, + ok = 0, + ik = 1, + x, y, i, + input, + status; + + booty = (time / 4 * 1000 * num_ships) + rand()%1000 + 250; + + for (i = 0; i <= 9; i++) + { + ships_on_screen[i] = 0; + } + + clear(); + flushinp(); + fight_stats(num_ships, orders); + + while (num_ships > 0) + { + status = 100 - (((float) damage / capacity) * 100); + if (status <= 0) + { + return 4; + } + flushinp(); + move(3, 0); + clrtoeol(); + printw("Current seaworthiness: %s (%d%%)", st[(status / 20)], status); + refresh(); + + x = 10; + y = 6; + for (i = 0; i <= 9; i++) + { + if (i == 5) + { + x = 10; + y = 12; + } + + if (num_ships > num_on_screen) + { + if (ships_on_screen[i] == 0) + { + usleep(100000); + ships_on_screen[i] = + (int)((ec * ((float) rand() / RAND_MAX)) + 20); + draw_lorcha(x, y); + num_on_screen++; + refresh(); + } + + x += 10; + } + } + + if (num_ships > num_on_screen) + { + move(11, 62); + printw("+"); + } else { + move(11, 62); + printw(" "); + } + + move(16, 0); + printw("\n"); + refresh(); + timeout(3000); + input = getch(); + timeout(-1); + + if ((input == 'F') || (input == 'f')) + { + orders = 1; + } else if ((input == 'R') || (input == 'r')) { + orders = 2; + } else if ((input == 'T') || (input == 't')) { + orders = 3; + } + + if (orders == 0) + { + timeout(3000); + input = getch(); + timeout(-1); + + if ((input == 'F') || (input == 'f')) + { + orders = 1; + } else if ((input == 'R') || (input == 'r')) { + orders = 2; + } else if ((input == 'T') || (input == 't')) { + orders = 3; + } else { + move(3, 0); + clrtoeol(); + printw("Taipan, what shall we do?? (f=fight, r=run, t=throw cargo)"); + refresh(); + timeout(-1); + while ((input != 'F') && (input != 'f') && + (input != 'R') && (input != 'r') && + (input != 'T') && (input != 't')) + { + input = getch(); + } + if ((input == 'F') || (input == 'f')) + { + orders = 1; + } else if ((input == 'R') || (input == 'r')) { + orders = 2; + } else { + orders = 3; + } + } + } + + fight_stats(num_ships, orders); + if ((orders == 1) && (guns > 0)) + { + int targeted, + sk = 0; + + ok = 3; + ik = 1; + move(3, 0); + clrtoeol(); + printw("Aye, we'll fight 'em, Taipan."); + refresh(); + timeout(3000); + input = getch(); + timeout(-1); + + move(3, 0); + clrtoeol(); + printw("We're firing on 'em, Taipan!"); + timeout(1000); + input = getch(); + timeout(-1); + refresh(); + + for (i = 1; i <= guns; i++) + { + if ((ships_on_screen[0] == 0) && (ships_on_screen[1] == 0) && + (ships_on_screen[2] == 0) && (ships_on_screen[3] == 0) && + (ships_on_screen[4] == 0) && (ships_on_screen[5] == 0) && + (ships_on_screen[6] == 0) && (ships_on_screen[7] == 0) && + (ships_on_screen[8] == 0) && (ships_on_screen[9] == 0)) + { + int j; + + x = 10; + y = 6; + for (j = 0; j <= 9; j++) + { + if (j == 5) + { + x = 10; + y = 12; + } + + if (num_ships > num_on_screen) + { + if (ships_on_screen[j] == 0) + { + usleep(100000); + ships_on_screen[j] = + (int)((ec * ((float) rand() / RAND_MAX)) + 20); + draw_lorcha(x, y); + num_on_screen++; + } + + x += 10; + } + } + } + + move(11, 62); + if (num_ships > num_on_screen) + { + printw("+"); + } else { + printw(" "); + } + + move(16, 0); + printw("\n"); + refresh(); + + targeted = rand()%10; + while (ships_on_screen[targeted] == 0) + { + targeted = rand()%10; + } + + x = (targeted < 5) ? ((targeted + 1) * 10) : ((targeted - 4) * 10); + y = (targeted < 5) ? 6 : 12; + + draw_blast(x, y); + refresh(); + usleep(100000); + + draw_lorcha(x, y); + refresh(); + usleep(100000); + + draw_blast(x, y); + refresh(); + usleep(100000); + + draw_lorcha(x, y); + refresh(); + usleep(100000); + + ships_on_screen[targeted] -= rand()%30 + 10; + + if (ships_on_screen[targeted] <= 0) + { + num_on_screen--; + num_ships--; + sk++; + ships_on_screen[targeted] = 0; + + usleep(100000); + + sink_lorcha(x, y); + + if (num_ships == num_on_screen) + { + move(11, 62); + printw(" "); + } + + fight_stats(num_ships, orders); + refresh(); + } + + if (num_ships == 0) + { + i += guns; + } else { + usleep(500000); + } + } + move(3, 0); + clrtoeol(); + if (sk > 0) + { + printw("Sunk %d of the buggers, Taipan!", sk); + } else { + printw("Hit 'em, but didn't sink 'em, Taipan!"); + } + refresh(); + timeout(3000); + input = getch(); + timeout(-1); + + if ((rand()%s0 > (num_ships * .6 / id)) && (num_ships > 2)) + { + int ran = rand()%(num_ships / 3 / id) + 1; + + num_ships -= ran; + fight_stats(num_ships, orders); + move(3, 0); + clrtoeol(); + printw("%d ran away, Taipan!", ran); + + if (num_ships <= 10) + { + for (i = 9; i >= 0; i--) + { + if ((num_on_screen > num_ships) && (ships_on_screen[i] > 0)) + { + ships_on_screen[i] = 0; + num_on_screen--; + + x = (i < 5) ? ((i + 1) * 10) : ((i - 4) * 10); + y = (i < 5) ? 6 : 12; + clear_lorcha(x, y); + refresh(); + usleep(100000); + } + } + if (num_ships == num_on_screen) + { + move(11, 62); + printw(" "); + refresh(); + } + + } + + move(16, 0); + + refresh(); + timeout(3000); + input = getch(); + timeout(-1); + + if ((input == 'F') || (input == 'f')) + { + orders = 1; + } else if ((input == 'R') || (input == 'r')) { + orders = 2; + } else if ((input == 'T') || (input == 't')) { + orders = 3; + } + } + } else if ((orders == 1) && (guns == 0)) { + move(3, 0); + clrtoeol(); + printw("We have no guns, Taipan!!"); + refresh(); + timeout(3000); + input = getch(); + timeout(-1); + } else if (orders == 3) { + int choice = 0; + + long amount = 0, + total = 0; + + move(18, 0); + printw("You have the following on board, Taipan:"); + move(19, 4); + printw("Opium: %d", hold_[0]); + move(19, 24); + printw("Silk: %d", hold_[1]); + move(20, 5); + printw("Arms: %d", hold_[2]); + move(20, 21); + printw("General: %d", hold_[3]); + + move(3, 0); + clrtoeol(); + printw("What shall I throw overboard, Taipan? "); + refresh(); + + while ((choice != 'O') && (choice != 'o') && + (choice != 'S') && (choice != 's') && + (choice != 'A') && (choice != 'a') && + (choice != 'G') && (choice != 'g') && + (choice != '*')) + { + choice = get_one(); + } + + if ((choice == 'O') || (choice == 'o')) + { + choice = 0; + } else if ((choice == 'S') || (choice == 's')) { + choice = 1; + } else if ((choice == 'A') || (choice == 'a')) { + choice = 2; + } else if ((choice == 'G') || (choice == 'g')) { + choice = 3; + } else { + choice = 4; + } + + if (choice < 4) + { + move(3, 0); + clrtoeol(); + printw("How much, Taipan? "); + refresh(); + + amount = get_num(9); + if ((hold_[choice] > 0) && ((amount == -1) || (amount > hold_[choice]))) + { + amount = hold_[choice]; + } + total = hold_[choice]; + } else { + total = hold_[0] + hold_[1] + hold_[2] + hold_[3]; + } + + if (total > 0) + { + move(3, 0); + clrtoeol(); + printw("Let's hope we lose 'em, Taipan!"); + if (choice < 4) + { + hold_[choice] -= amount; + hold += amount; + ok += (amount / 10); + } else { + hold_[0] = 0; + hold_[1] = 0; + hold_[2] = 0; + hold_[3] = 0; + hold += total; + ok += (total / 10); + } + move(18, 0); + clrtobot(); + refresh(); + + timeout(3000); + input = getch(); + timeout(-1); + } else { + move(3, 0); + clrtoeol(); + printw("There's nothing there, Taipan!"); + move(18, 0); + clrtobot(); + refresh(); + + timeout(3000); + input = getch(); + timeout(-1); + } + } + + if ((orders == 2) || (orders == 3)) + { + if (orders == 2) + { + move(3, 0); + clrtoeol(); + printw("Aye, we'll run, Taipan."); + refresh(); + timeout(3000); + input = getch(); + timeout(-1); + } + + ok += ik++; + if (rand()%ok > rand()%num_ships) + { + flushinp(); + move(3, 0); + clrtoeol(); + printw("We got away from 'em, Taipan!"); + refresh(); + timeout(3000); + input = getch(); + timeout(-1); + num_ships = 0; + } else { + move(3, 0); + clrtoeol(); + printw("Couldn't lose 'em."); + refresh(); + timeout(3000); + input = getch(); + timeout(-1); + + if ((num_ships > 2) && (rand()%5 == 0)) + { + int lost = (rand()%num_ships / 2) + 1; + + num_ships -= lost; + fight_stats(num_ships, orders); + move(3, 0); + clrtoeol(); + printw("But we escaped from %d of 'em!", lost); + + if (num_ships <= 10) + { + for (i = 9; i >= 0; i--) + { + if ((num_on_screen > num_ships) && (ships_on_screen[i] > 0)) + { + ships_on_screen[i] = 0; + num_on_screen--; + + x = (i < 5) ? ((i + 1) * 10) : ((i - 4) * 10); + y = (i < 5) ? 6 : 12; + clear_lorcha(x, y); + refresh(); + usleep(100000); + } + } + if (num_ships == num_on_screen) + { + move(11, 62); + printw(" "); + refresh(); + } + } + + move(16, 0); + + refresh(); + timeout(3000); + input = getch(); + timeout(-1); + + if ((input == 'F') || (input == 'f')) + { + orders = 1; + } else if ((input == 'R') || (input == 'r')) { + orders = 2; + } else if ((input == 'T') || (input == 't')) { + orders = 3; + } + } + } + } + + if (num_ships > 0) + { + move(3, 0); + clrtoeol(); + printw("They're firing on us, Taipan!"); + + refresh(); + timeout(3000); + input = getch(); + timeout(-1); + flushinp(); + for (i = 0; i < 3; i++) + { + for (y = 0; y < 24; y++) + { + for (x = 0; x < 79; x++) + { + move(y, x); + printw("*"); + } + } + refresh(); + usleep(200000); + clear(); + refresh(); + usleep(200000); + } + + fight_stats(num_ships, orders); + x = 10; + y = 6; + for (i = 0; i <= 9; i++) + { + if (i == 5) + { + x = 10; + y = 12; + } + + if (ships_on_screen[i] > 0) + { + draw_lorcha(x, y); + } + + x += 10; + } + + move(11, 62); + if (num_ships > num_on_screen) + { + printw("+"); + } else { + printw(" "); + } + + move(3, 0); + clrtoeol(); + printw("We've been hit, Taipan!!"); + + refresh(); + timeout(3000); + input = getch(); + timeout(-1); + + i = (num_ships > 15) ? 15 : num_ships; + if ((guns > 0) && ((rand()%100 < (((float) damage / capacity) * 100)) || + ((((float) damage / capacity) * 100) > 80))) + { + i = 1; + guns--; + hold += 10; + fight_stats(num_ships, orders); + move(3, 0); + clrtoeol(); + printw("The buggers hit a gun, Taipan!!"); + fight_stats(num_ships, orders); + + refresh(); + timeout(3000); + input = getch(); + timeout(-1); + } + damage = damage + ((ed * i * id) * ((float) rand() / RAND_MAX)) + (i / 2); + if ((id == GENERIC) && (rand()%20 == 0)) + { + return 2; + } + } + } + + if (orders == 1) + { + clear(); + fight_stats(num_ships, orders); + move(3, 0); + clrtoeol(); + printw("We got 'em all, Taipan!"); + refresh(); + timeout(3000); + getch(); + timeout(-1); + + return 1; + } else { + return 3; + } +} + +void draw_lorcha(int x, int y) +{ + move (y, x); + printw("-|-_|_ "); + move ((y + 1), x); + printw("-|-_|_ "); + move ((y + 2), x); + printw("_|__|__/"); + move ((y + 3), x); + printw("\\_____/ "); +} + +void clear_lorcha(int x, int y) +{ + move (y, x); + printw(" "); + move ((y + 1), x); + printw(" "); + move ((y + 2), x); + printw(" "); + move ((y + 3), x); + printw(" "); +} + +void draw_blast(int x, int y) +{ + move (y, x); + printw("********"); + move ((y + 1), x); + printw("********"); + move ((y + 2), x); + printw("********"); + move ((y + 3), x); + printw("********"); +} + +void sink_lorcha(int x, int y) +{ + int delay = rand()%20; + + move (y, x); + printw(" "); + move ((y + 1), x); + printw("-|-_|_ "); + move ((y + 2), x); + printw("-|-_|_ "); + move ((y + 3), x); + printw("_|__|__/"); + refresh(); + usleep(500000); + if (delay == 0) + { + usleep(500000); + } + + move ((y + 1), x); + printw(" "); + move ((y + 2), x); + printw("-|-_|_ "); + move ((y + 3), x); + printw("-|-_|_ "); + refresh(); + usleep(500000); + if (delay == 0) + { + usleep(500000); + } + + move ((y + 2), x); + printw(" "); + move ((y + 3), x); + printw("-|-_|_ "); + refresh(); + usleep(500000); + if (delay == 0) + { + usleep(500000); + } + + move ((y + 3), x); + printw(" "); + refresh(); + usleep(500000); + if (delay == 0) + { + usleep(500000); + } +} + +void fight_stats(int ships, int orders) +{ + char ch_orders[12]; + + if (orders == 0) + { + strcpy(ch_orders, "\0"); + } else if (orders == 1) { + strcpy(ch_orders, "Fight "); + } else if (orders == 2) { + strcpy(ch_orders, "Run "); + } else { + strcpy(ch_orders, "Throw Cargo"); + } + + move(0, 0); + if (ships >= 1000) + { + printw("%d", ships); + } else if (ships >= 100) { + printw(" %d", ships); + } else if (ships >= 10) { + printw(" %d", ships); + } else { + printw(" %d", ships); + } + move(0, 5); + if (ships == 1) + { + printw("ship attacking, Taipan! \n"); + } else { + printw("ships attacking, Taipan!\n"); + } + printw("Your orders are to: %s", ch_orders); + move(0, 50); + printw("| We have"); + move(1, 50); + printw("| %d guns", guns); + move(2, 50); + printw("----------"); + move(16, 0); + + return; +} + +void mchenry(void) +{ + int choice = 0; + + move(16, 0); + clrtobot(); + printw("Comprador's Report\n\n"); + printw("Taipan, Mc Henry from the Hong Kong\n"); + printw("Shipyards has arrived!! He says, \"I see\n"); + printw("ye've a wee bit of damage to yer ship.\n"); + printw("Will ye be wanting repairs? "); + refresh(); + + while ((choice != 'Y') && (choice != 'y') && + (choice != 'N') && (choice != 'n')) + { + choice = get_one(); + } + + if ((choice == 'Y') || (choice == 'y')) + { + int percent = ((float) damage / capacity) * 100, + time = ((year - 1860) * 12) + month; + + long br = ((((60 * (time + 3) / 4) * (float) rand() / RAND_MAX) + + 25 * (time + 3) / 4) * capacity / 50), + repair_price = (br * damage) + 1, + amount; + + move(18, 0); + clrtobot(); + printw("Och, 'tis a pity to be %d%% damaged.\n", percent); + printw("We can fix yer whole ship for %ld,\n", repair_price); + printw("or make partial repairs if you wish.\n"); + printw("How much will ye spend? "); + refresh(); + + for (;;) + { + move(21, 24); + amount = get_num(9); + if (amount == -1) + { + amount = cash; + } + if (amount <= cash) + { + cash -= amount; + damage -= (int)((amount / br) + .5); + damage = (damage < 0) ? 0 : damage; + port_stats(); + refresh(); + break; + } + } + } + + return; +} + +void retire(void) +{ + move(16, 0); + clrtobot(); + printw("Comprador's Report\n\n"); + attrset(A_REVERSE); + printw(" \n"); + printw(" Y o u ' r e a \n"); + printw(" \n"); + printw(" M I L L I O N A I R E ! \n"); + printw(" \n"); + attrset(A_NORMAL); + refresh(); + timeout(5000); + getch(); + timeout(-1); + + final_stats(); +} + +void final_stats(void) +{ + int years = year - 1860, + time = ((year - 1860) * 12) + month, + choice = 0; + + clear(); + printw("Your final status:\n\n"); + cash = cash + bank - debt; + fancy_numbers(cash, fancy_num); + printw("Net cash: %s\n\n", fancy_num); + printw("Ship size: %d units with %d guns\n\n", capacity, guns); + printw("You traded for %d year", years); + if (years != 1) + { + printw("s"); + } + printw(" and %d month", month); + if (month > 1) + { + printw("s"); + } + printw("\n\n"); + cash = cash / 100 / time; + attrset(A_REVERSE); + printw("Your score is %.0f.\n", cash); + attrset(A_NORMAL); + printw("\n"); + if ((cash < 100) && (cash >= 0)) + { + printw("Have you considered a land based job?\n\n\n"); + } else if (cash < 0) { + printw("The crew has requested that you stay on\n"); + printw("shore for their safety!!\n\n"); + } else { + printw("\n\n\n"); + } + printw("Your Rating:\n"); + printw(" _______________________________\n"); + printw("|"); + if (cash > 49999) + { + attrset(A_REVERSE); + } + printw("Ma Tsu"); + attrset(A_NORMAL); + printw(" 50,000 and over |\n"); + printw("|"); + if ((cash < 50000) && (cash > 7999)) + { + attrset(A_REVERSE); + } + printw("Master Taipan"); + attrset(A_NORMAL); + printw(" 8,000 to 49,999|\n"); + printw("|"); + if ((cash < 8000) && (cash > 999)) + { + attrset(A_REVERSE); + } + printw("Taipan"); + attrset(A_NORMAL); + printw(" 1,000 to 7,999|\n"); + printw("|"); + if ((cash < 1000) && (cash > 499)) + { + attrset(A_REVERSE); + } + printw("Compradore"); + attrset(A_NORMAL); + printw(" 500 to 999|\n"); + printw("|"); + if (cash < 500) + { + attrset(A_REVERSE); + } + printw("Galley Hand"); + attrset(A_NORMAL); + printw(" less than 500|\n"); + printw("|_______________________________|\n\n"); + + while ((choice != 'Y') && (choice != 'y') && + (choice != 'N') && (choice != 'n')) + { + move (22, 0); + clrtoeol(); + printw("Play again? "); + refresh(); + choice = get_one(); + } + + if ((choice == 'Y') || (choice == 'y')) + { + bank = 0; + hkw_[0] = 0; + hkw_[1] = 0; + hkw_[3] = 0; + hkw_[4] = 0; + hold_[0] = 0; + hold_[1] = 0; + hold_[2] = 0; + hold_[3] = 0; + hold = 0; + capacity = 60; + damage = 0; + month = 1; + year = 1860; + port = 1; + + splash_intro(); + name_firm(); + cash_or_guns(); + set_prices(); + + return; + } + + clear(); + refresh(); + nocbreak(); + endwin(); + + exit(0); +} -- cgit v1.2.3