2022-06-15 12:47:42 -05:00
|
|
|
/*
|
2022-06-15 12:51:24 -05:00
|
|
|
Slangin'
|
|
|
|
Author: Rudis Muiznieks
|
|
|
|
License: WTFPL
|
2022-06-15 12:47:42 -05:00
|
|
|
*/
|
|
|
|
|
|
|
|
#include <Arduboy2.h>
|
2022-06-16 23:25:49 -05:00
|
|
|
#include "src/Font4x6.h";
|
2022-06-15 12:47:42 -05:00
|
|
|
|
|
|
|
Arduboy2 arduboy;
|
2022-06-16 23:25:49 -05:00
|
|
|
Font4x6 font4x6 = Font4x6();
|
2022-06-15 12:47:42 -05:00
|
|
|
|
2022-06-15 18:36:12 -05:00
|
|
|
enum GameState {
|
|
|
|
STATE_TITLE = 0,
|
|
|
|
STATE_TURN_MENU,
|
|
|
|
STATE_JET_MENU,
|
|
|
|
STATE_PRICE_LIST,
|
|
|
|
STATE_INVENTORY,
|
|
|
|
STATE_BUY_MENU,
|
|
|
|
STATE_SELL_MENU,
|
|
|
|
STATE_FIGHT_MENU,
|
|
|
|
STATE_SHARK_MENU,
|
|
|
|
STATE_BANK_MENU,
|
|
|
|
STATE_INFO_DIALOG,
|
|
|
|
STATE_QUESTION_DIALOG,
|
|
|
|
STATE_AMOUNT_DIALOG,
|
|
|
|
STATE_SUBWAY
|
|
|
|
};
|
|
|
|
|
|
|
|
enum GameLocation {
|
|
|
|
LOC_BRONX = 0,
|
|
|
|
LOC_GHETTO,
|
|
|
|
LOC_CENTRAL_PARK,
|
|
|
|
LOC_MANHATTEN,
|
|
|
|
LOC_CONEY_ISLAND,
|
|
|
|
LOC_BROOKLYN
|
|
|
|
};
|
|
|
|
|
|
|
|
enum Drug {
|
|
|
|
DRUG_COCAINE = 0,
|
|
|
|
DRUG_HEROINE,
|
|
|
|
DRUG_ACID,
|
|
|
|
DRUG_WEED,
|
|
|
|
DRUG_SPEED,
|
|
|
|
DRUG_LUDES
|
|
|
|
};
|
|
|
|
|
|
|
|
enum DialogType {
|
|
|
|
DIALOG_INFO = 0,
|
|
|
|
DIALOG_YESNO,
|
|
|
|
DIALOG_AMOUNT
|
|
|
|
};
|
|
|
|
|
2022-06-16 23:25:49 -05:00
|
|
|
/**************/
|
|
|
|
/* game state */
|
|
|
|
/**************/
|
2022-06-15 18:36:12 -05:00
|
|
|
bool screenInitialized;
|
2022-06-16 23:25:49 -05:00
|
|
|
GameState sGameState;
|
2022-06-15 18:36:12 -05:00
|
|
|
int sCurrentDay;
|
2022-06-16 23:25:49 -05:00
|
|
|
|
|
|
|
/****************/
|
|
|
|
/* player state */
|
|
|
|
/****************/
|
2022-06-15 18:36:12 -05:00
|
|
|
int pMoney;
|
|
|
|
int pLoanAmount;
|
|
|
|
int pSavingsAmount;
|
|
|
|
GameLocation pLocation;
|
|
|
|
int pGuns;
|
|
|
|
int pCapacity;
|
|
|
|
int pHealth;
|
|
|
|
int pInventory[6] = {0};
|
|
|
|
|
2022-06-16 23:25:49 -05:00
|
|
|
/***********************/
|
|
|
|
/* game setup and loop */
|
|
|
|
/***********************/
|
2022-06-15 12:47:42 -05:00
|
|
|
void setup() {
|
2022-06-16 23:25:49 -05:00
|
|
|
sGameState = STATE_TITLE;
|
2022-06-15 18:36:12 -05:00
|
|
|
screenInitialized = false;
|
2022-06-15 12:47:42 -05:00
|
|
|
arduboy.begin();
|
|
|
|
arduboy.setFrameRate(15);
|
|
|
|
}
|
|
|
|
|
|
|
|
void loop() {
|
|
|
|
if (!(arduboy.nextFrame()))
|
|
|
|
return;
|
|
|
|
|
2022-06-17 08:58:56 -05:00
|
|
|
String menu[8];
|
|
|
|
int menuLength = 0;
|
|
|
|
bool menuSmall = false;
|
|
|
|
|
2022-06-15 18:36:12 -05:00
|
|
|
if (!screenInitialized) {
|
2022-06-16 23:25:49 -05:00
|
|
|
arduboy.clear();
|
|
|
|
switch (sGameState) {
|
2022-06-15 18:36:12 -05:00
|
|
|
case STATE_TITLE:
|
2022-06-17 08:58:56 -05:00
|
|
|
drawTitle(F("Slangin'"));
|
|
|
|
menu[0] = F("New Game");
|
|
|
|
menu[1] = F("Continue");
|
|
|
|
menuLength = 2;
|
|
|
|
menuSmall = true;
|
|
|
|
draw1ColMenu(menuSmall, menuLength, menu);
|
2022-06-15 18:36:12 -05:00
|
|
|
break;
|
|
|
|
}
|
2022-06-16 23:25:49 -05:00
|
|
|
arduboy.display();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/***********************/
|
|
|
|
/* screen draw heplers */
|
|
|
|
/***********************/
|
2022-06-17 08:58:56 -05:00
|
|
|
void drawTitle(const String title) {
|
2022-06-16 23:25:49 -05:00
|
|
|
arduboy.setCursor(6, 8);
|
|
|
|
arduboy.print(title);
|
|
|
|
}
|
|
|
|
|
2022-06-17 08:58:56 -05:00
|
|
|
void draw1ColMenu(const bool small, const int itemCount, const String items[]) {
|
2022-06-16 23:25:49 -05:00
|
|
|
int colWidth = 0;
|
|
|
|
for (int i = 0; i < itemCount; i++) {
|
2022-06-17 08:58:56 -05:00
|
|
|
const int newLen = items[i].length();
|
|
|
|
if (newLen > colWidth) colWidth = newLen;
|
2022-06-16 23:25:49 -05:00
|
|
|
}
|
|
|
|
const int charWidth = small ? 5 : 6;
|
2022-06-17 08:58:56 -05:00
|
|
|
const int charHeight = small ? 9 : 10;
|
|
|
|
int x = 66 - round(colWidth * (charWidth / 2.0));
|
2022-06-16 23:25:49 -05:00
|
|
|
int y = 18 - round(itemCount * (charHeight / 2.0));
|
|
|
|
for (int i = 0; i < itemCount; i++) {
|
2022-06-17 08:58:56 -05:00
|
|
|
const int cy = i * charHeight + 22 + y;
|
|
|
|
if (small) {
|
|
|
|
font4x6.setCursor(x, cy);
|
|
|
|
font4x6.print(items[i]);
|
|
|
|
} else {
|
|
|
|
arduboy.setCursor(x, cy);
|
|
|
|
arduboy.print(items[i]);
|
|
|
|
}
|
2022-06-15 18:36:12 -05:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2022-06-17 08:58:56 -05:00
|
|
|
void draw2ColMenu(const bool small, const int itemCount, const String items[]) {
|
2022-06-16 23:25:49 -05:00
|
|
|
const int col1Count = round(itemCount / 2.0);
|
|
|
|
const int col2Count = itemCount - col1Count;
|
|
|
|
int col1Width = 0;
|
|
|
|
int col2Width = 0;
|
|
|
|
for (int i = 0; i < col1Count; i++) {
|
2022-06-17 08:58:56 -05:00
|
|
|
const int newLen = items[i].length();
|
2022-06-16 23:25:49 -05:00
|
|
|
if (newLen > col1Width) col1Width = newLen;
|
|
|
|
}
|
|
|
|
for (int i = 0; i < col2Count; i++) {
|
2022-06-17 08:58:56 -05:00
|
|
|
const int newLen = items[i].length();
|
2022-06-16 23:25:49 -05:00
|
|
|
if (newLen > col2Width) col2Width = newLen;
|
|
|
|
}
|
|
|
|
const int charWidth = small ? 5 : 6;
|
2022-06-17 08:58:56 -05:00
|
|
|
const int charHeight = small ? 9 : 10;
|
|
|
|
int x = 66 - round((col1Width + col2Width + 2) * (charWidth / 2.0));
|
2022-06-16 23:25:49 -05:00
|
|
|
int y = 18 - round(col1Count * (charHeight / 2.0));
|
|
|
|
for (int i = 0; i < itemCount; i++) {
|
|
|
|
const int cx = (i < col1Count)
|
|
|
|
? x
|
|
|
|
: x + (col1Width + 2) * charWidth;
|
|
|
|
const int cy = (i < col1Count)
|
|
|
|
? i * charHeight + 22 + y
|
|
|
|
: (i - col1Count) * charHeight + 22 + y;
|
|
|
|
if (small) {
|
|
|
|
font4x6.setCursor(cx, cy);
|
|
|
|
font4x6.print(items[i]);
|
|
|
|
} else {
|
|
|
|
arduboy.setCursor(cx, cy);
|
|
|
|
arduboy.print(items[i]);
|
|
|
|
}
|
|
|
|
}
|
2022-06-15 12:47:42 -05:00
|
|
|
}
|