/* Slangin' State Management Author: Rudis Muiznieks License: WTFPL */ void initializeNewGame() { sGameState = STATE_TURN_MENU; pMoney = 2000; pLoanAmount = 5000; pSavingsAmount = 0; pLocation = LOC_BRONX; pGuns = 0; pCapacity = 100; pHealth = 50; for (int i = 0; i < 6; i++) { pInventory[i] = 0; } sCurrentDay = 0; incrementDay(); // start on day 1 } void incrementDay() { sCurrentDay++; // TODO: check for game over sAlreadyBorrowed = false; // generate new drug prices sDrugPrices[DRUG_COCAINE] = random(12001) + 16000; sDrugPrices[DRUG_HEROINE] = random(7001) + 5000; sDrugPrices[DRUG_ACID] = (random(35) + 10) * 100; sDrugPrices[DRUG_WEED] = (random(43) + 33) * 10; sDrugPrices[DRUG_SPEED] = (random(16) + 7) * 10; sDrugPrices[DRUG_LUDES] = (random(5) + 1) * 10; } void newDayRandomEvent() { const int eventId = random(20); sPreviousGameState = STATE_TURN_MENU; dialogSmall = false; switch (eventId) { case 1: dialog[0] = "Rival dealers are"; dialog[1] = "selling cheap"; dialog[2] = "ludes!!!"; dialogLength = 3; sDrugPrices[DRUG_LUDES] = 2; sGameState = STATE_INFO_DIALOG; break; case 2: dialog[0] = "Weed prices have"; dialog[1] = "bottomed out!!!"; dialogLength = 2; sDrugPrices[DRUG_WEED] = 122; sGameState = STATE_INFO_DIALOG; break; case 3: dialog[0] = "Pigs are selling"; dialog[1] = "cheap heroine"; dialog[2] = "from last week's"; dialog[3] = "raid!!!!"; dialogLength = 4; sDrugPrices[DRUG_HEROINE] = random(1150) + 850; sGameState = STATE_INFO_DIALOG; break; case 4: case 5: dialog[0] = "Addicts are"; dialog[1] = "buying heroine"; dialog[2] = "at outrageous"; dialog[3] = "prices!!!"; dialogLength = 4; sDrugPrices[DRUG_HEROINE] = random(25001) + 18000; sGameState = STATE_INFO_DIALOG; break; case 6: case 7: dialog[0] = "Pigs made a big"; dialog[1] = "coke bust! Prices"; dialog[2] = "are outrageous!!!!"; dialogLength = 3; sDrugPrices[DRUG_COCAINE] = random(60001) + 80000; sGameState = STATE_INFO_DIALOG; break; case 8: dialog[0] = "You were mugged"; dialog[1] = "in the subway!"; dialogLength = 2; pMoney = round(pMoney / 3.0) * 2; sGameState = STATE_INFO_DIALOG; break; case 9: case 10: case 11: { if (playerDrugInventoryCount() >= 50) { const int pigs = eventId == 9 ? 1 : eventId == 10 ? 3 : 4; dialog[0] = "Officer Hardass and"; dialog[1] = String(pigs); dialog[1] += F(" of his deputies"); dialog[2] = "are after you!"; dialogLength = 3; sPreviousGameState = STATE_FIGHT_MENU; sGameState = STATE_INFO_DIALOG; } else { sGameState = STATE_TURN_MENU; } break; } case 12: case 13: { if (pMoney >= 500 && playerCapacityRemaining() >= 5) { const int x = random(3); dialog[0] = "Will you buy a"; if (x == 0 || x == 1) { dialog[1] = x == 0 ? "baretta for" : ".44 magnum for"; dialog[2] = "400 dollars?"; dialogLength = 3; } else { dialog[1] = "saturday night"; dialog[2] = "special for 400"; dialog[3] = "dollars?"; dialogLength = 4; } sGameState = STATE_BUY_GUN_DIALOG; } else { sGameState = STATE_TURN_MENU; } break; } case 14: dialog[0] = "There's some weed"; dialog[1] = "here that smells"; dialog[2] = "like good stuff!!"; dialog[3] = "Will you smoke it?"; dialogLength = 4; sGameState = STATE_DO_WEED_DIALOG; break; case 15: if (pMoney >= 300) { dialog[0] = "Will you buy a new"; dialog[1] = "trenchcoat with"; dialog[2] = "more pockets for"; dialog[3] = "200 bucks?"; dialogLength = 4; sGameState = STATE_BUY_COAT_DIALOG; } else { sGameState = STATE_TURN_MENU; } break; case 16: { if (playerCapacityRemaining() >= 8) { const int amount = random(7) + 1; const int drug = random(6); pInventory[drug] += amount; dialog[0] = F("You found "); dialog[0] += String(amount); dialog[1] = F("units of: "); dialog[1] += lookupDrug(drug); dialog[2] = "on a dead dude in"; dialog[3] = "the subway!!!"; dialogLength = 4; sGameState = STATE_INFO_DIALOG; } else { sGameState = STATE_TURN_MENU; } break; } case 17: dialog[0] = "The market has"; dialog[1] = "been flooded with"; dialog[2] = "cheap homemade"; dialog[3] = "acid!!!!"; dialogLength = 4; sDrugPrices[DRUG_ACID] = random(551) + 250; sGameState = STATE_INFO_DIALOG; break; default: sGameState = STATE_TURN_MENU; break; } } void handleMenuAction() { screenInitialized = false; switch (sGameState) { case STATE_TITLE: switch (menuSelected) { case 0: // new game initializeNewGame(); break; // TODO: continue/load saved } break; case STATE_TURN_MENU: sPreviousGameState = STATE_TURN_MENU; switch (menuSelected) { case 0: // trenchcoat sGameState = STATE_INVENTORY; break; case 1: // buy drugs sGameState = STATE_BUY_MENU; break; case 2: // sell drugs sGameState = STATE_SELL_MENU; break; case 3: // jet sGameState = STATE_JET_MENU; break; case 4: // loan shark sGameState = STATE_SHARK_MENU; break; case 5: // bank sGameState = STATE_BANK_MENU; break; } break; case STATE_JET_MENU: incrementDay(); pLocation = menuSelected < pLocation ? menuSelected : menuSelected + 1; newDayRandomEvent(); break; case STATE_BUY_MENU: { int remaining = playerCapacityRemaining(); sPreviousGameState = STATE_BUY_MENU; sCurrentDrug = menuSelected; if (remaining <= 0) { dialog[0] = F("Oops!"); dialog[1] = F(""); dialog[2] = F("You can't carry"); dialog[3] = F("more "); dialog[3] += lookupDrug(sCurrentDrug); dialog[3] += F("!"); dialogLength = 4; dialogSmall = false; sPreviousGameState = sGameState; sGameState = STATE_INFO_DIALOG; } else if (pMoney < sDrugPrices[sCurrentDrug]) { dialog[0] = F("Oops!"); dialog[1] = F(""); dialog[2] = F("You can't afford"); dialog[3] = lookupDrug(sCurrentDrug); dialog[3] += F("!"); dialogLength = 4; dialogSmall = false; sPreviousGameState = sGameState; sGameState = STATE_INFO_DIALOG; } else { sGameState = STATE_BUY_QTY_INPUT; sCurrentQty = 0; sQtyMax = floor(pMoney / (float)sDrugPrices[sCurrentDrug]); if (remaining < sQtyMax) sQtyMax = remaining; } break; } case STATE_SELL_MENU: sPreviousGameState = STATE_SELL_MENU; sCurrentDrug = menuSelected; if (pInventory[sCurrentDrug] > 0) { sGameState = STATE_SELL_QTY_INPUT; sCurrentQty = 0; sQtyMax = pInventory[sCurrentDrug]; } else { dialog[0] = F("Oops!"); dialog[1] = F(""); dialog[2] = F("You don't have any"); dialog[3] = lookupDrug(sCurrentDrug); dialog[3] += F("!"); dialogLength = 4; dialogSmall = false; sPreviousGameState = sGameState; sGameState = STATE_INFO_DIALOG; } break; case STATE_SHARK_MENU: sPreviousGameState = STATE_SHARK_MENU; sCurrentQty = 0; switch (menuSelected) { case 0: // repay loan sGameState = STATE_PAY_LOAN_INPUT; sQtyMax = pLoanAmount > pMoney ? pMoney : pLoanAmount; break; case 1: // borrow money if (sAlreadyBorrowed) { dialog[0] = F("You already"); dialog[1] = F("borrowed money"); dialog[2] = F("today!"); dialogLength = 3; dialogSmall = false; sGameState = STATE_INFO_DIALOG; } else { sGameState = STATE_BORROW_INPUT; sQtyMax = 5000; } break; } break; case STATE_BANK_MENU: sPreviousGameState = STATE_BANK_MENU; sCurrentQty = 0; switch (menuSelected) { case 0: // deposit money sGameState = STATE_DEPOSIT_INPUT; sQtyMax = pMoney; break; case 1: // withdraw money sGameState = STATE_WITHDRAW_INPUT; sQtyMax = pSavingsAmount; break; } break; } } bool checkBackedOut(const bool eitherButton) { if (arduboy.justPressed(B_BUTTON) || (eitherButton && arduboy.justPressed(A_BUTTON))) { screenInitialized = false; sGameState = sPreviousGameState; return true; } return false; } int playerCapacityRemaining() { int qty = 0; for (int i = 0; i < 6; i++) { qty += pInventory[i]; } qty += pGuns * 5; return pCapacity - qty; } int playerDrugInventoryCount() { int count = 0; for (int i = 0; i < 6; i++) { count += pInventory[i]; } return count; }