/* 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 sRandomEvent = 0; // no event on first day } 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 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: 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) + 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) + 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; 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]; } return pCapacity - qty; }