George Sykes ELEC2645 project

Dependencies:   mbed

https://os.mbed.com/media/uploads/el18gs/pixil-frame-0.png

GHOST HUNTER

In a world of ghostly horrors there is much money to be made in underground ghost fighting rings. You've managed to get hold of a Ghostbuster, a special piece of equipment that allows you to catch, train and fight ghosts.

Instructions

Below you will find the instructions for the game. Please note that due to COVID-19 a large part of the game (fighting ghosts) could not be added as it would have required access to a second gamepad which i could not acquire.

Welcome screen

When first started you will be presented with a welcome screen

  • Pot 1 to adjust the contrast on the screen
  • Press A to continue.

Main menu

You have three options, catch ghosts (add ghosts to your inventory), inventory (sell ghosts) or settings(adjust the games settings).

  • Press X and B to move the selection up and down respectively
  • Press A to enter the selected submenu

Catch Ghost

Will now be presented with two challenges. In the first you need to find a ghost, in the second you catch it. Theses stages will start automatically.

Find ghost

Rotate the gamepad on its roll and pitch axis until all the LED's turn on. The ones on the left indicate roll and the right pitch.

  • Rotate the gamepad on it roll and pitch to light up the LED's

Catch ghost

Return the gamepad to a comfortable position and use the joystick to move the crosshairs onto the ghost sprite. When ready press the A button to catch the ghost. You will be told what kind of ghost you have captured and it will be added to your inventory.

  • Press A to catch the ghost
  • Move the joystick to move the crosshairs

Inventory

The inventory allows you to view your ghosts and sell them.

  • Use Pot 1 to scroll through the ghosts
  • Pot 2 to scroll up and down the details of the individual ghosts
  • Press X to prepare to sell a ghost and press again to confirm, if you don't press again the sale screen will disappear after 5 seconds
  • Press Start to return to the main menu

Settings

This menu allows you to adjust some of the settings of the game.

  • Press X to go up one option
  • Press B to go down one option
  • Press A to enter the selected submenu
  • Press Start to return to the main menu

Contrast

Set the contrast of the LCD screen, the contrast will adjust on this screen so you can see the effect (contrast is bounded between 0.4 and 0.6).

  • Pot 1 to increase or decrease the contrast
  • Press A to set the contrast

Button Delay

Set the minimum time between button presses; if this is too low the game will detect two button presses when there was only one, too high and the buttons will seem unresponsive. So as to ensure these issues do not occur while changing the setting button X temporarily operates on the new delay but none of the others will until A is pressed.

  • Pot 1 to increase or decrease the delay
  • Press X to test the new delay, this will toggle the small circle to be filled in or unfilled
  • Press A to save the setting
Committer:
el18gs
Date:
Tue May 12 08:44:30 2020 +0000
Revision:
11:e89dbdb74df5
Parent:
8:4220d116f17c
Child:
13:3b2a4e14937b
Moved display_inventory into the inventory library

Who changed what in which revision?

UserRevisionLine numberNew contents of line
el18gs 2:eaf245af2aae 1 /*
eencae 0:b7f1f47bb26a 2 ELEC2645 Embedded Systems Project
eencae 0:b7f1f47bb26a 3 School of Electronic & Electrical Engineering
eencae 0:b7f1f47bb26a 4 University of Leeds
eencae 0:b7f1f47bb26a 5 2019/20
el18gs 1:8d14be858ca0 6 Name: George Sykes
el18gs 1:8d14be858ca0 7 Username: el18gs
el18gs 1:8d14be858ca0 8 Student ID Number: 201235346
el18gs 1:8d14be858ca0 9 Date: 08/02/2020
eencae 0:b7f1f47bb26a 10 */
eencae 0:b7f1f47bb26a 11
eencae 0:b7f1f47bb26a 12 // includes
eencae 0:b7f1f47bb26a 13 #include "mbed.h"
eencae 0:b7f1f47bb26a 14 #include "Gamepad.h"
eencae 0:b7f1f47bb26a 15 #include "N5110.h"
el18gs 2:eaf245af2aae 16 #include "SDFileSystem.h"
el18gs 2:eaf245af2aae 17 #include "FX0S8700CQ.h"
el18gs 2:eaf245af2aae 18 #include "Ghost.h"
el18gs 3:9d811414d35e 19 #include "Inventory.h"
el18gs 2:eaf245af2aae 20 #include <vector>
el18gs 2:eaf245af2aae 21 #include <string>
eencae 0:b7f1f47bb26a 22
el18gs 2:eaf245af2aae 23 // Declare the string vector type
el18gs 2:eaf245af2aae 24 typedef std::vector<std::string> stringvec;
eencae 0:b7f1f47bb26a 25
el18gs 11:e89dbdb74df5 26 /**struct inven_state {
el18gs 3:9d811414d35e 27 // UID, next{up,down}, type, attack, defense, level, xp, value, hp_max, hp
el18gs 3:9d811414d35e 28 int uid;
el18gs 3:9d811414d35e 29 int next[2];
el18gs 3:9d811414d35e 30 std::string type;
el18gs 3:9d811414d35e 31 std::string name;
el18gs 3:9d811414d35e 32 int attack;
el18gs 3:9d811414d35e 33 int defense;
el18gs 3:9d811414d35e 34 int level;
el18gs 3:9d811414d35e 35 int xp;
el18gs 3:9d811414d35e 36 int value;
el18gs 3:9d811414d35e 37 int hp_max;
el18gs 3:9d811414d35e 38 int hp;
el18gs 11:e89dbdb74df5 39 };*/
el18gs 3:9d811414d35e 40
eencae 0:b7f1f47bb26a 41 // objects
eencae 0:b7f1f47bb26a 42 Gamepad pad;
eencae 0:b7f1f47bb26a 43 N5110 lcd;
el18gs 2:eaf245af2aae 44 FX0S8700CQ accel;
el18gs 4:2e8d7c6d2953 45 SDFileSystem sd(PTE3, PTE1, PTE2, PTE4, "sd"); // MOSI, MISO, SCK, CS
el18gs 2:eaf245af2aae 46
el18gs 2:eaf245af2aae 47 // Declare all the inputs
el18gs 2:eaf245af2aae 48 InterruptIn buttonX(PTC5);
el18gs 2:eaf245af2aae 49 InterruptIn buttonA(PTC7);
el18gs 2:eaf245af2aae 50 InterruptIn buttonB(PTC9);
el18gs 3:9d811414d35e 51 InterruptIn buttonY(PTC0);
el18gs 3:9d811414d35e 52 InterruptIn buttonStart(PTC8);
el18gs 2:eaf245af2aae 53
el18gs 2:eaf245af2aae 54 // Declare output
el18gs 2:eaf245af2aae 55 // RED, YELLOW, GREEN
el18gs 2:eaf245af2aae 56 BusOut left_LED(PTC3,PTC2,PTA2);
el18gs 2:eaf245af2aae 57 BusOut right_LED(PTC11,PTC10,PTA1);
el18gs 2:eaf245af2aae 58
el18gs 2:eaf245af2aae 59 // Function prototypes
el18gs 2:eaf245af2aae 60 void welcome();
el18gs 2:eaf245af2aae 61 int game_menu();
el18gs 2:eaf245af2aae 62 void catch_ghosts();
el18gs 11:e89dbdb74df5 63 //void display_inventory(Inventory inventory, SDFileSystem &sd);
el18gs 3:9d811414d35e 64 std::vector<inven_state> gen_ghost_fsm(Inventory inventory);
el18gs 2:eaf245af2aae 65 void settings();
el18gs 2:eaf245af2aae 66 int** import_sprite(std::string file);
el18gs 2:eaf245af2aae 67 void int_to_bin_digit(unsigned int in, int count, int* out);
el18gs 2:eaf245af2aae 68 void listdir(void);
el18gs 3:9d811414d35e 69 bool hasEnding (std::string const &fullString, std::string const &ending);
el18gs 3:9d811414d35e 70 float cursor_transform(float OldMax,
el18gs 3:9d811414d35e 71 float OldMin,
el18gs 3:9d811414d35e 72 float NewMax,
el18gs 3:9d811414d35e 73 float NewMin,
el18gs 2:eaf245af2aae 74 float OldValue);
el18gs 3:9d811414d35e 75 void adjustContrast();
el18gs 3:9d811414d35e 76 void buttonDelay();
el18gs 3:9d811414d35e 77 bool ghostHit( int xGhost, int yGhost, int xJoy, int yJoy);
el18gs 3:9d811414d35e 78
el18gs 3:9d811414d35e 79
el18gs 3:9d811414d35e 80 // Settings variables
el18gs 3:9d811414d35e 81 volatile int g_button_sesnsitivity = 250;
el18gs 3:9d811414d35e 82 volatile bool g_buttonTesting = false;
el18gs 3:9d811414d35e 83 volatile int g_buttonSensitivityTest = 250;
el18gs 3:9d811414d35e 84
el18gs 2:eaf245af2aae 85
el18gs 2:eaf245af2aae 86 // ISR functions
el18gs 2:eaf245af2aae 87 void buttonX_isr();
el18gs 2:eaf245af2aae 88 void buttonA_isr();
el18gs 2:eaf245af2aae 89 void buttonB_isr();
el18gs 3:9d811414d35e 90 void buttonY_isr();
el18gs 3:9d811414d35e 91 void buttonStart_isr();
el18gs 2:eaf245af2aae 92
el18gs 2:eaf245af2aae 93 // ISR flags
el18gs 2:eaf245af2aae 94 volatile int g_buttonX_flag = 0;
el18gs 2:eaf245af2aae 95 volatile int g_buttonA_flag = 0;
el18gs 2:eaf245af2aae 96 volatile int g_buttonB_flag = 0;
el18gs 3:9d811414d35e 97 volatile int g_buttonY_flag = 0;
el18gs 3:9d811414d35e 98 volatile int g_buttonStart_flag = 0;
el18gs 2:eaf245af2aae 99
el18gs 2:eaf245af2aae 100 // struct for state
el18gs 2:eaf245af2aae 101 struct State {
el18gs 2:eaf245af2aae 102 int output; // output value
el18gs 2:eaf245af2aae 103 int nextState[2]; // array of next states
el18gs 2:eaf245af2aae 104 };
eencae 0:b7f1f47bb26a 105
eencae 0:b7f1f47bb26a 106 int main()
eencae 0:b7f1f47bb26a 107 {
el18gs 4:2e8d7c6d2953 108 sd.mount();
el18gs 2:eaf245af2aae 109 printf("Main function\n");
el18gs 2:eaf245af2aae 110 srand(time(NULL));
el18gs 2:eaf245af2aae 111 buttonX.mode(PullUp); // turn on internal pull-up resistor
el18gs 2:eaf245af2aae 112 buttonX.fall(&buttonX_isr);
el18gs 2:eaf245af2aae 113
el18gs 2:eaf245af2aae 114 buttonA.mode(PullUp); // turn on internal pull-up resistor
el18gs 2:eaf245af2aae 115 buttonA.fall(&buttonA_isr);
el18gs 2:eaf245af2aae 116
el18gs 2:eaf245af2aae 117 buttonB.mode(PullUp); // turn on internal pull-up resistor
el18gs 2:eaf245af2aae 118 buttonB.fall(&buttonB_isr);
el18gs 2:eaf245af2aae 119
el18gs 3:9d811414d35e 120 buttonY.mode(PullUp); // turn on internal pull-up resistor
el18gs 3:9d811414d35e 121 buttonY.fall(&buttonY_isr);
el18gs 3:9d811414d35e 122
el18gs 3:9d811414d35e 123 buttonStart.mode(PullUp); // turn on internal pull-up resistor
el18gs 3:9d811414d35e 124 buttonStart.fall(&buttonStart_isr);
el18gs 3:9d811414d35e 125
el18gs 2:eaf245af2aae 126 /* Initialise the game
el18gs 2:eaf245af2aae 127 * Create an object to hold the players ghosts in
el18gs 2:eaf245af2aae 128 * Print the welcome message on the screen and wait for the player
el18gs 2:eaf245af2aae 129 */
el18gs 2:eaf245af2aae 130
el18gs 8:4220d116f17c 131 Inventory inventory(sd);
el18gs 3:9d811414d35e 132
el18gs 2:eaf245af2aae 133 lcd.init(); // Initialise the screen
el18gs 2:eaf245af2aae 134 lcd.backLightOn();
el18gs 2:eaf245af2aae 135
el18gs 2:eaf245af2aae 136 welcome();
el18gs 2:eaf245af2aae 137 int choice = -1;
el18gs 2:eaf245af2aae 138 while(1) {
el18gs 2:eaf245af2aae 139 choice = game_menu();
el18gs 2:eaf245af2aae 140 switch (choice) {
el18gs 2:eaf245af2aae 141 case 0:
el18gs 2:eaf245af2aae 142 catch_ghosts();
el18gs 8:4220d116f17c 143 inventory.regen(sd);
el18gs 2:eaf245af2aae 144 break;
el18gs 2:eaf245af2aae 145 case 1:
el18gs 11:e89dbdb74df5 146 inventory.display_inventory(sd,
el18gs 11:e89dbdb74df5 147 lcd,
el18gs 11:e89dbdb74df5 148 pad,
el18gs 11:e89dbdb74df5 149 g_buttonX_flag,
el18gs 11:e89dbdb74df5 150 g_buttonStart_flag);
el18gs 2:eaf245af2aae 151 break;
el18gs 2:eaf245af2aae 152 case 2:
el18gs 2:eaf245af2aae 153 settings();
el18gs 2:eaf245af2aae 154 break;
el18gs 2:eaf245af2aae 155 }
el18gs 2:eaf245af2aae 156 }
el18gs 2:eaf245af2aae 157 }
el18gs 2:eaf245af2aae 158
el18gs 2:eaf245af2aae 159 void welcome()
el18gs 2:eaf245af2aae 160 {
el18gs 3:9d811414d35e 161 //printf("entered welcome screen\n");
el18gs 2:eaf245af2aae 162 int** welcome = import_sprite("/sd/assets/welcome.sprite");
el18gs 3:9d811414d35e 163 lcd.clear();
el18gs 3:9d811414d35e 164 for(int i = 0; i < 48; i++) {
el18gs 3:9d811414d35e 165 for(int j = 0; j < 84; j++) {
el18gs 3:9d811414d35e 166 lcd.setPixel(j,i, welcome[i][j]);
el18gs 3:9d811414d35e 167 }
el18gs 3:9d811414d35e 168 }
el18gs 2:eaf245af2aae 169 while(!g_buttonA_flag) {
el18gs 2:eaf245af2aae 170 // contrast should be bounded between 4 and 6
el18gs 2:eaf245af2aae 171 // contrast = 0.4 + contrast.read()/5
el18gs 3:9d811414d35e 172 lcd.setContrast(0.4 + ((double) pad.read_pot1()/5));
el18gs 2:eaf245af2aae 173 lcd.refresh();
el18gs 2:eaf245af2aae 174 wait_ms(10);
el18gs 2:eaf245af2aae 175 }
el18gs 2:eaf245af2aae 176
el18gs 2:eaf245af2aae 177 g_buttonA_flag = 0;
el18gs 3:9d811414d35e 178 //wait_ms(25);
el18gs 2:eaf245af2aae 179 }
el18gs 2:eaf245af2aae 180
el18gs 2:eaf245af2aae 181
el18gs 2:eaf245af2aae 182 int game_menu()
el18gs 2:eaf245af2aae 183 {
el18gs 2:eaf245af2aae 184
el18gs 2:eaf245af2aae 185 State fsm[4] = {
el18gs 2:eaf245af2aae 186 // line next{up, down}
el18gs 2:eaf245af2aae 187 {0,{2,1}}, // State: 0
el18gs 2:eaf245af2aae 188 {2,{0,2}}, // State: 1
el18gs 2:eaf245af2aae 189 {4,{1,0}}, // State: 2
el18gs 2:eaf245af2aae 190 };
el18gs 2:eaf245af2aae 191
el18gs 2:eaf245af2aae 192 int current_state = 0;
el18gs 2:eaf245af2aae 193
el18gs 2:eaf245af2aae 194 printf("entered game menu\n");
el18gs 2:eaf245af2aae 195 g_buttonX_flag = 0;
el18gs 2:eaf245af2aae 196 g_buttonA_flag = 0;
el18gs 2:eaf245af2aae 197 g_buttonB_flag = 0;
el18gs 2:eaf245af2aae 198
el18gs 2:eaf245af2aae 199 while(1) {
el18gs 2:eaf245af2aae 200 lcd.clear();
el18gs 2:eaf245af2aae 201 lcd.printString("Catch Ghosts",0,0);
el18gs 2:eaf245af2aae 202 lcd.printString("Inventory",0,2);
el18gs 2:eaf245af2aae 203 lcd.printString("Settings",0,4);
el18gs 2:eaf245af2aae 204
el18gs 2:eaf245af2aae 205 if(g_buttonA_flag) {
el18gs 2:eaf245af2aae 206 g_buttonA_flag = 0;
el18gs 2:eaf245af2aae 207 return current_state;
el18gs 2:eaf245af2aae 208 }
el18gs 2:eaf245af2aae 209
el18gs 2:eaf245af2aae 210 if(g_buttonX_flag) {
el18gs 2:eaf245af2aae 211 current_state = fsm[current_state].nextState[0];
el18gs 2:eaf245af2aae 212 g_buttonX_flag = 0;
el18gs 2:eaf245af2aae 213 g_buttonB_flag = 0;
el18gs 2:eaf245af2aae 214 } else if(g_buttonB_flag) {
el18gs 2:eaf245af2aae 215 current_state = fsm[current_state].nextState[1];
el18gs 2:eaf245af2aae 216 g_buttonX_flag = 0;
el18gs 2:eaf245af2aae 217 g_buttonB_flag = 0;
el18gs 2:eaf245af2aae 218 }
el18gs 2:eaf245af2aae 219
el18gs 2:eaf245af2aae 220 switch (fsm[current_state].output) {
el18gs 2:eaf245af2aae 221 case 0:
el18gs 2:eaf245af2aae 222 lcd.drawCircle(79, 3, 3, FILL_BLACK);
el18gs 2:eaf245af2aae 223 break;
el18gs 2:eaf245af2aae 224 case 2:
el18gs 2:eaf245af2aae 225 lcd.drawCircle(79, 20, 3, FILL_BLACK);
el18gs 2:eaf245af2aae 226 break;
el18gs 2:eaf245af2aae 227 case 4:
el18gs 2:eaf245af2aae 228 lcd.drawCircle(79, 35, 3, FILL_BLACK);
el18gs 2:eaf245af2aae 229 break;
el18gs 2:eaf245af2aae 230 }
el18gs 2:eaf245af2aae 231 lcd.refresh();
el18gs 2:eaf245af2aae 232 }
eencae 0:b7f1f47bb26a 233 }
eencae 0:b7f1f47bb26a 234
el18gs 2:eaf245af2aae 235 void catch_ghosts()
el18gs 2:eaf245af2aae 236 {
el18gs 3:9d811414d35e 237
el18gs 2:eaf245af2aae 238 float pitch = rand() % 46;
el18gs 2:eaf245af2aae 239 if(rand() & 1) {
el18gs 2:eaf245af2aae 240 pitch = pitch * -1;
el18gs 2:eaf245af2aae 241 }
el18gs 2:eaf245af2aae 242
el18gs 2:eaf245af2aae 243 float roll = rand() % 46;
el18gs 2:eaf245af2aae 244 if(rand() & 1) {
el18gs 2:eaf245af2aae 245 roll = roll * -1;
el18gs 2:eaf245af2aae 246 }
el18gs 2:eaf245af2aae 247
el18gs 2:eaf245af2aae 248 int count = 0;
el18gs 2:eaf245af2aae 249
el18gs 2:eaf245af2aae 250 lcd.clear();
el18gs 2:eaf245af2aae 251 lcd.printString("Align the",18,0);
el18gs 2:eaf245af2aae 252 lcd.printString("Gamepad until",4,1);
el18gs 2:eaf245af2aae 253 lcd.printString("all LEDs",20,2);
el18gs 2:eaf245af2aae 254 lcd.printString("turn on",22,3);
el18gs 2:eaf245af2aae 255 lcd.refresh();
el18gs 2:eaf245af2aae 256
el18gs 2:eaf245af2aae 257
el18gs 2:eaf245af2aae 258 while(1) {
el18gs 2:eaf245af2aae 259 accel.read_data();
el18gs 2:eaf245af2aae 260 bool focused = true;
el18gs 2:eaf245af2aae 261
el18gs 2:eaf245af2aae 262 if((double)accel.sensor.roll/roll > 0.75) {
el18gs 2:eaf245af2aae 263 left_LED = 0b000;
el18gs 2:eaf245af2aae 264 } else if ((double)accel.sensor.roll/roll > 0.3) {
el18gs 2:eaf245af2aae 265 focused = false;
el18gs 2:eaf245af2aae 266 left_LED = 0b001;
el18gs 2:eaf245af2aae 267 } else {
el18gs 2:eaf245af2aae 268 focused = false;
el18gs 2:eaf245af2aae 269 left_LED = 0b011;
el18gs 2:eaf245af2aae 270 }
el18gs 2:eaf245af2aae 271
el18gs 2:eaf245af2aae 272 if((double)accel.sensor.pitch/pitch > 0.75) {
el18gs 2:eaf245af2aae 273 right_LED = 0b000;
el18gs 2:eaf245af2aae 274 } else if ((double)accel.sensor.pitch/pitch > 0.3) {
el18gs 2:eaf245af2aae 275 focused = false;
el18gs 2:eaf245af2aae 276 right_LED = 0b001;
el18gs 2:eaf245af2aae 277 } else {
el18gs 2:eaf245af2aae 278 focused = false;
el18gs 2:eaf245af2aae 279 right_LED = 0b011;
el18gs 2:eaf245af2aae 280 }
el18gs 2:eaf245af2aae 281
el18gs 2:eaf245af2aae 282 if(focused) {
el18gs 2:eaf245af2aae 283 count++;
el18gs 2:eaf245af2aae 284 }
el18gs 2:eaf245af2aae 285
el18gs 2:eaf245af2aae 286 if(count > 500) {
el18gs 2:eaf245af2aae 287 break;
el18gs 2:eaf245af2aae 288 }
el18gs 2:eaf245af2aae 289 wait_ms(10);
el18gs 2:eaf245af2aae 290 }
el18gs 2:eaf245af2aae 291
el18gs 2:eaf245af2aae 292 Vector2D ideal = {rand() % 85,rand() % 49};
el18gs 3:9d811414d35e 293
el18gs 2:eaf245af2aae 294 int** ghost = import_sprite("/sd/assets/ghost.sprite");
el18gs 2:eaf245af2aae 295
el18gs 2:eaf245af2aae 296 while(1) {
el18gs 2:eaf245af2aae 297
el18gs 2:eaf245af2aae 298 lcd.clear();
el18gs 2:eaf245af2aae 299
el18gs 2:eaf245af2aae 300 Vector2D actual = {cursor_transform(2, 0, 84, 0, pad.get_coord().x),
el18gs 2:eaf245af2aae 301 cursor_transform(2, 0, 48, 0, pad.get_coord().y * -1)
el18gs 2:eaf245af2aae 302 };
el18gs 2:eaf245af2aae 303
el18gs 2:eaf245af2aae 304 // x0 y0 x1 y1 type
el18gs 2:eaf245af2aae 305 lcd.drawLine(actual.x, 0, actual.x, 48, 2);
el18gs 2:eaf245af2aae 306 lcd.drawLine(0, actual.y, 84, actual.y, 2);
el18gs 2:eaf245af2aae 307
el18gs 2:eaf245af2aae 308 int col = 0;
el18gs 2:eaf245af2aae 309
el18gs 2:eaf245af2aae 310 for(int i = ideal.x - 8; i < ideal.x + 8; i++) { // Iterate Columns: x
el18gs 2:eaf245af2aae 311 int row = 0;
el18gs 3:9d811414d35e 312 for(int j = ideal.y - 9; j < ideal.y + 9; j++) { // Iterate Rows: y
el18gs 2:eaf245af2aae 313 lcd.setPixel(i,j, ghost[row][col]);
el18gs 2:eaf245af2aae 314 row++;
el18gs 2:eaf245af2aae 315 }
el18gs 2:eaf245af2aae 316 col++;
el18gs 2:eaf245af2aae 317 }
el18gs 2:eaf245af2aae 318
el18gs 3:9d811414d35e 319 if(ghostHit(ideal.x, ideal.y, actual.x, actual.y)) {
el18gs 3:9d811414d35e 320 lcd.printString("Press A!",0,0);
el18gs 3:9d811414d35e 321 if(g_buttonA_flag) {
el18gs 3:9d811414d35e 322 break;
el18gs 2:eaf245af2aae 323 }
el18gs 2:eaf245af2aae 324 }
el18gs 2:eaf245af2aae 325
el18gs 2:eaf245af2aae 326 g_buttonA_flag = 0;
el18gs 2:eaf245af2aae 327
el18gs 2:eaf245af2aae 328 lcd.refresh();
el18gs 2:eaf245af2aae 329
el18gs 2:eaf245af2aae 330 int x_move = 0;
el18gs 2:eaf245af2aae 331 int y_move = 0;
el18gs 2:eaf245af2aae 332
el18gs 2:eaf245af2aae 333 if(rand() & 1) {
el18gs 2:eaf245af2aae 334 x_move = 1;
el18gs 2:eaf245af2aae 335 } else {
el18gs 2:eaf245af2aae 336 x_move = -1;
el18gs 2:eaf245af2aae 337 }
el18gs 2:eaf245af2aae 338
el18gs 2:eaf245af2aae 339 if(rand() & 1) {
el18gs 2:eaf245af2aae 340 y_move = 1;
el18gs 2:eaf245af2aae 341 } else {
el18gs 2:eaf245af2aae 342 y_move = -1;
el18gs 2:eaf245af2aae 343 }
el18gs 2:eaf245af2aae 344
el18gs 2:eaf245af2aae 345 ideal.x = ideal.x + x_move;
el18gs 2:eaf245af2aae 346 ideal.y = ideal.y + y_move;
el18gs 2:eaf245af2aae 347
el18gs 3:9d811414d35e 348 if(ideal.x > 70) {
el18gs 3:9d811414d35e 349 ideal.x = 70;
el18gs 3:9d811414d35e 350 } else if(ideal.x < 13) {
el18gs 3:9d811414d35e 351 ideal.x = 13;
el18gs 2:eaf245af2aae 352 }
el18gs 2:eaf245af2aae 353
el18gs 3:9d811414d35e 354 if(ideal.y > 30) {
el18gs 3:9d811414d35e 355 ideal.y = 30;
el18gs 3:9d811414d35e 356 } else if(ideal.y < 12) {
el18gs 3:9d811414d35e 357 ideal.y = 12;
el18gs 2:eaf245af2aae 358 }
el18gs 2:eaf245af2aae 359
el18gs 2:eaf245af2aae 360
el18gs 2:eaf245af2aae 361 wait_ms(10);
el18gs 2:eaf245af2aae 362 }
el18gs 2:eaf245af2aae 363
el18gs 2:eaf245af2aae 364 printf("Ghost caught\n");
el18gs 2:eaf245af2aae 365
el18gs 8:4220d116f17c 366 Ghost caught_ghost(rand()%100, rand()%20, "/ghosts/", sd);
el18gs 8:4220d116f17c 367 caught_ghost.save(sd);
el18gs 2:eaf245af2aae 368
el18gs 2:eaf245af2aae 369 lcd.clear();
el18gs 2:eaf245af2aae 370 lcd.printString("You caught:", 0, 0);
el18gs 2:eaf245af2aae 371 lcd.printString(caught_ghost.get_type_string().c_str(), 0, 1);
el18gs 3:9d811414d35e 372 lcd.printString("Press A to", 0, 2);
el18gs 3:9d811414d35e 373 lcd.printString("continue", 0, 3);
el18gs 2:eaf245af2aae 374 lcd.refresh();
el18gs 2:eaf245af2aae 375
el18gs 3:9d811414d35e 376 //wait(2);
el18gs 2:eaf245af2aae 377
el18gs 2:eaf245af2aae 378 g_buttonA_flag = 0;
el18gs 2:eaf245af2aae 379
el18gs 2:eaf245af2aae 380 while(!g_buttonA_flag) {
el18gs 2:eaf245af2aae 381 }
el18gs 2:eaf245af2aae 382
el18gs 2:eaf245af2aae 383 g_buttonA_flag = 0;
el18gs 2:eaf245af2aae 384
el18gs 2:eaf245af2aae 385 }
el18gs 2:eaf245af2aae 386
el18gs 3:9d811414d35e 387 bool ghostHit( int xGhost, int yGhost, int xJoy, int yJoy)
el18gs 3:9d811414d35e 388 {
el18gs 3:9d811414d35e 389 int xDifference = abs(xGhost - xJoy);
el18gs 3:9d811414d35e 390 int yDifference = abs(yGhost - yJoy);
el18gs 3:9d811414d35e 391
el18gs 3:9d811414d35e 392 if(xDifference < 10 && yDifference <10){
el18gs 3:9d811414d35e 393 return true;
el18gs 3:9d811414d35e 394 } else {
el18gs 3:9d811414d35e 395 return false;
el18gs 3:9d811414d35e 396 }
el18gs 3:9d811414d35e 397 }
el18gs 3:9d811414d35e 398
el18gs 3:9d811414d35e 399 void settings()
el18gs 3:9d811414d35e 400 {
el18gs 3:9d811414d35e 401 // settings that can be edited:
el18gs 3:9d811414d35e 402 // * contrast
el18gs 3:9d811414d35e 403 // * button delay
el18gs 3:9d811414d35e 404
el18gs 3:9d811414d35e 405 // menu from FSM
el18gs 3:9d811414d35e 406 State fsm[2] = {
el18gs 3:9d811414d35e 407 // line next{up, down}
el18gs 3:9d811414d35e 408 {2,{1,1}}, // State: 0
el18gs 3:9d811414d35e 409 {4,{0,0}}, // State: 1
el18gs 3:9d811414d35e 410 };
el18gs 3:9d811414d35e 411
el18gs 3:9d811414d35e 412
el18gs 3:9d811414d35e 413 int current_state = 0;
el18gs 3:9d811414d35e 414
el18gs 3:9d811414d35e 415 printf("entered game menu\n");
el18gs 3:9d811414d35e 416 g_buttonX_flag = 0;
el18gs 3:9d811414d35e 417 g_buttonA_flag = 0;
el18gs 3:9d811414d35e 418 g_buttonB_flag = 0;
el18gs 3:9d811414d35e 419
el18gs 3:9d811414d35e 420 while(1) {
el18gs 3:9d811414d35e 421 lcd.clear();
el18gs 3:9d811414d35e 422 lcd.printString("Settings",0,0);
el18gs 3:9d811414d35e 423 lcd.printString("Contrast",0,2);
el18gs 3:9d811414d35e 424 lcd.printString("Button delay",0,4);
el18gs 3:9d811414d35e 425
el18gs 3:9d811414d35e 426 if(g_buttonA_flag) {
el18gs 3:9d811414d35e 427 g_buttonA_flag = 0;
el18gs 3:9d811414d35e 428 switch (fsm[current_state].output) {
el18gs 3:9d811414d35e 429 case 2:
el18gs 3:9d811414d35e 430 adjustContrast();
el18gs 3:9d811414d35e 431 break;
el18gs 3:9d811414d35e 432 case 4:
el18gs 3:9d811414d35e 433 buttonDelay();
el18gs 3:9d811414d35e 434 break;
el18gs 3:9d811414d35e 435 }
el18gs 3:9d811414d35e 436 } else if (g_buttonStart_flag) {
el18gs 3:9d811414d35e 437 g_buttonStart_flag = 0;
el18gs 3:9d811414d35e 438 return;
el18gs 3:9d811414d35e 439 }
el18gs 3:9d811414d35e 440
el18gs 3:9d811414d35e 441 if(g_buttonX_flag) {
el18gs 3:9d811414d35e 442 current_state = fsm[current_state].nextState[0];
el18gs 3:9d811414d35e 443 g_buttonX_flag = 0;
el18gs 3:9d811414d35e 444 g_buttonB_flag = 0;
el18gs 3:9d811414d35e 445 } else if(g_buttonB_flag) {
el18gs 3:9d811414d35e 446 current_state = fsm[current_state].nextState[1];
el18gs 3:9d811414d35e 447 g_buttonX_flag = 0;
el18gs 3:9d811414d35e 448 g_buttonB_flag = 0;
el18gs 3:9d811414d35e 449 }
el18gs 3:9d811414d35e 450
el18gs 3:9d811414d35e 451 switch (fsm[current_state].output) {
el18gs 3:9d811414d35e 452 case 2:
el18gs 3:9d811414d35e 453 lcd.drawCircle(79, 20, 3, FILL_BLACK);
el18gs 3:9d811414d35e 454 break;
el18gs 3:9d811414d35e 455 case 4:
el18gs 3:9d811414d35e 456 lcd.drawCircle(79, 35, 3, FILL_BLACK);
el18gs 3:9d811414d35e 457 break;
el18gs 3:9d811414d35e 458 }
el18gs 3:9d811414d35e 459
el18gs 3:9d811414d35e 460 lcd.refresh();
el18gs 3:9d811414d35e 461 }
el18gs 3:9d811414d35e 462 }
el18gs 3:9d811414d35e 463
el18gs 3:9d811414d35e 464 void adjustContrast()
el18gs 3:9d811414d35e 465 {
el18gs 3:9d811414d35e 466 while(1) {
el18gs 3:9d811414d35e 467 lcd.clear();
el18gs 3:9d811414d35e 468 // Print title
el18gs 3:9d811414d35e 469
el18gs 3:9d811414d35e 470 lcd.printString("Contrast", 0, 0);
el18gs 3:9d811414d35e 471 lcd.printString("Press A to set", 0, 3);
el18gs 3:9d811414d35e 472
el18gs 3:9d811414d35e 473 float conSet = 0.4 + ((double) pad.read_pot1()/5);
el18gs 3:9d811414d35e 474 float bar = cursor_transform(0.6,0.4,64,0,conSet);
el18gs 3:9d811414d35e 475
el18gs 3:9d811414d35e 476 printf("conSet: %f\n", conSet);
el18gs 3:9d811414d35e 477 printf("bar: %f\n", bar);
el18gs 3:9d811414d35e 478
el18gs 3:9d811414d35e 479 // example of how to draw rectangles
el18gs 3:9d811414d35e 480 // origin x,y,width,height,type
el18gs 3:9d811414d35e 481 lcd.drawRect(10,10,74,10,FILL_TRANSPARENT); // transparent, just outline
el18gs 3:9d811414d35e 482 lcd.drawRect(10,10,bar,10,FILL_BLACK); // filled black rectangle
el18gs 3:9d811414d35e 483 lcd.setContrast(conSet);
el18gs 3:9d811414d35e 484
el18gs 3:9d811414d35e 485 if(g_buttonA_flag) {
el18gs 3:9d811414d35e 486 g_buttonA_flag = 0;
el18gs 3:9d811414d35e 487 return;
el18gs 3:9d811414d35e 488 }
el18gs 3:9d811414d35e 489
el18gs 3:9d811414d35e 490 lcd.refresh();
el18gs 3:9d811414d35e 491 }
el18gs 3:9d811414d35e 492 }
el18gs 3:9d811414d35e 493
el18gs 3:9d811414d35e 494 void buttonDelay()
el18gs 3:9d811414d35e 495 {
el18gs 3:9d811414d35e 496 g_buttonTesting = true;
el18gs 3:9d811414d35e 497
el18gs 3:9d811414d35e 498 lcd.clear();
el18gs 3:9d811414d35e 499
el18gs 3:9d811414d35e 500 bool circle = false;
el18gs 3:9d811414d35e 501
el18gs 3:9d811414d35e 502 while(1) {
el18gs 3:9d811414d35e 503 lcd.clear();
el18gs 3:9d811414d35e 504 lcd.printString("Button Delay", 0, 0);
el18gs 3:9d811414d35e 505 lcd.printString("Press X to test", 0, 4);
el18gs 3:9d811414d35e 506 lcd.printString("Press A to set", 0, 5);
el18gs 3:9d811414d35e 507
el18gs 3:9d811414d35e 508 g_buttonSensitivityTest = cursor_transform(1,0,2,0,pad.read_pot2()) * 250;
el18gs 3:9d811414d35e 509 int bar = cursor_transform(500,0,64,0,g_buttonSensitivityTest);
el18gs 3:9d811414d35e 510
el18gs 3:9d811414d35e 511 // example of how to draw rectangles
el18gs 3:9d811414d35e 512 // origin x,y,width,height,type
el18gs 3:9d811414d35e 513 lcd.drawRect(10,10,74,10,FILL_TRANSPARENT); // transparent, just outline
el18gs 3:9d811414d35e 514 lcd.drawRect(10,10,bar,10,FILL_BLACK); // filled black rectangle
el18gs 3:9d811414d35e 515
el18gs 3:9d811414d35e 516 if(circle) {
el18gs 3:9d811414d35e 517 lcd.drawCircle(42, 25, 3, FILL_BLACK);
el18gs 3:9d811414d35e 518 } else {
el18gs 3:9d811414d35e 519 lcd.drawCircle(42, 25, 3, FILL_TRANSPARENT);
el18gs 3:9d811414d35e 520 }
el18gs 3:9d811414d35e 521
el18gs 3:9d811414d35e 522 if(g_buttonX_flag) {
el18gs 3:9d811414d35e 523 g_buttonX_flag = 0;
el18gs 3:9d811414d35e 524 circle = !circle;
el18gs 3:9d811414d35e 525 } else if(g_buttonA_flag) {
el18gs 3:9d811414d35e 526 g_buttonA_flag = 0;
el18gs 3:9d811414d35e 527 g_button_sesnsitivity = g_buttonSensitivityTest;
el18gs 3:9d811414d35e 528 g_buttonTesting = false;
el18gs 3:9d811414d35e 529 return;
el18gs 3:9d811414d35e 530 } else if (g_buttonStart_flag) {
el18gs 3:9d811414d35e 531 g_buttonStart_flag = 0;
el18gs 3:9d811414d35e 532 g_buttonTesting = false;
el18gs 3:9d811414d35e 533 return;
el18gs 3:9d811414d35e 534 }
el18gs 3:9d811414d35e 535
el18gs 3:9d811414d35e 536 lcd.refresh();
el18gs 3:9d811414d35e 537
el18gs 3:9d811414d35e 538 }
el18gs 3:9d811414d35e 539 }
el18gs 3:9d811414d35e 540
el18gs 3:9d811414d35e 541
el18gs 3:9d811414d35e 542 float cursor_transform(float OldMax,
el18gs 3:9d811414d35e 543 float OldMin,
el18gs 3:9d811414d35e 544 float NewMax,
el18gs 3:9d811414d35e 545 float NewMin,
el18gs 2:eaf245af2aae 546 float OldValue)
el18gs 2:eaf245af2aae 547 {
el18gs 2:eaf245af2aae 548 float NewValue = -1;
el18gs 3:9d811414d35e 549 float OldRange = (OldMax - OldMin);
el18gs 2:eaf245af2aae 550 if (OldRange == 0) {
el18gs 2:eaf245af2aae 551 NewValue = NewMin;
el18gs 2:eaf245af2aae 552 } else {
el18gs 3:9d811414d35e 553 float NewRange = (NewMax - NewMin);
el18gs 2:eaf245af2aae 554 NewValue = (((OldValue - OldMin) * NewRange) / OldRange) + NewMin;
el18gs 2:eaf245af2aae 555 }
el18gs 2:eaf245af2aae 556 return NewValue;
el18gs 2:eaf245af2aae 557 }
el18gs 2:eaf245af2aae 558
el18gs 8:4220d116f17c 559 void display_inventory(Inventory inventory, SDFileSystem &sd)
el18gs 2:eaf245af2aae 560 {
el18gs 2:eaf245af2aae 561 printf("viewing inventory\n");
el18gs 3:9d811414d35e 562 int which_ghost_state = 0;
el18gs 3:9d811414d35e 563 int which_view_state = 0;
el18gs 3:9d811414d35e 564 int new_which_view_state = 0;
el18gs 3:9d811414d35e 565
el18gs 3:9d811414d35e 566 std::vector<inven_state> ghost_fsm;
el18gs 3:9d811414d35e 567
el18gs 3:9d811414d35e 568 bool regen_inven = true;
el18gs 3:9d811414d35e 569 bool scroll_ghost = false;
el18gs 3:9d811414d35e 570 bool update = true;
el18gs 3:9d811414d35e 571
el18gs 3:9d811414d35e 572 while(1) {
el18gs 3:9d811414d35e 573 if(regen_inven) {
el18gs 8:4220d116f17c 574 inventory.regen(sd);
el18gs 3:9d811414d35e 575 ghost_fsm = gen_ghost_fsm(inventory);
el18gs 3:9d811414d35e 576 regen_inven = false;
el18gs 3:9d811414d35e 577 which_ghost_state = 0;
el18gs 3:9d811414d35e 578 which_view_state = 0;
el18gs 3:9d811414d35e 579 }
el18gs 3:9d811414d35e 580
el18gs 3:9d811414d35e 581 if(update) {
el18gs 3:9d811414d35e 582 update = false;
el18gs 3:9d811414d35e 583
el18gs 3:9d811414d35e 584 if(scroll_ghost) {
el18gs 3:9d811414d35e 585 wait_ms(750);
el18gs 3:9d811414d35e 586 scroll_ghost = false;
el18gs 3:9d811414d35e 587 }
el18gs 3:9d811414d35e 588
el18gs 3:9d811414d35e 589
el18gs 3:9d811414d35e 590 lcd.clear();
el18gs 3:9d811414d35e 591
el18gs 3:9d811414d35e 592 lcd.printString("Inventory", 0, 0);
el18gs 3:9d811414d35e 593 char buffer [64];
el18gs 3:9d811414d35e 594
el18gs 3:9d811414d35e 595 if(ghost_fsm.size() == 0) {
el18gs 3:9d811414d35e 596 lcd.printString("No ghosts", 0, 1);
el18gs 3:9d811414d35e 597 lcd.printString("found, exiting", 0, 2);
el18gs 3:9d811414d35e 598 lcd.refresh();
el18gs 3:9d811414d35e 599 wait(1);
el18gs 3:9d811414d35e 600 return;
el18gs 3:9d811414d35e 601 } else {
el18gs 3:9d811414d35e 602
el18gs 3:9d811414d35e 603 if(which_view_state <= 0) {
el18gs 3:9d811414d35e 604 sprintf(buffer, "%s", ghost_fsm[which_ghost_state].type.c_str());
el18gs 3:9d811414d35e 605 lcd.printString(buffer, 0, 1 - which_view_state);
el18gs 3:9d811414d35e 606 }
el18gs 3:9d811414d35e 607
el18gs 3:9d811414d35e 608 if(which_view_state <= 1) {
el18gs 3:9d811414d35e 609 sprintf(buffer, "Name: %s", ghost_fsm[which_ghost_state].name.c_str());
el18gs 3:9d811414d35e 610 lcd.printString(buffer, 0, 2 - which_view_state);
el18gs 3:9d811414d35e 611 }
el18gs 3:9d811414d35e 612
el18gs 3:9d811414d35e 613 if(which_view_state <= 2) {
el18gs 3:9d811414d35e 614 sprintf(buffer, "Attack: %d", ghost_fsm[which_ghost_state].attack);
el18gs 3:9d811414d35e 615 lcd.printString(buffer, 0, 3 - which_view_state);
el18gs 3:9d811414d35e 616 }
el18gs 3:9d811414d35e 617
el18gs 3:9d811414d35e 618 if(which_view_state <= 3) {
el18gs 3:9d811414d35e 619 sprintf(buffer, "Defense: %d", ghost_fsm[which_ghost_state].defense);
el18gs 3:9d811414d35e 620 lcd.printString(buffer, 0, 4 - which_view_state);
el18gs 3:9d811414d35e 621 }
el18gs 3:9d811414d35e 622
el18gs 3:9d811414d35e 623 if(which_view_state <= 4) {
el18gs 3:9d811414d35e 624 sprintf(buffer, "Level: %d", ghost_fsm[which_ghost_state].level);
el18gs 3:9d811414d35e 625 lcd.printString(buffer, 0, 5 - which_view_state);
el18gs 3:9d811414d35e 626 }
el18gs 3:9d811414d35e 627
el18gs 3:9d811414d35e 628 if(which_view_state <= 5) {
el18gs 3:9d811414d35e 629 sprintf(buffer, "Value: %d", ghost_fsm[which_ghost_state].value);
el18gs 3:9d811414d35e 630 lcd.printString(buffer, 0, 6 - which_view_state);
el18gs 3:9d811414d35e 631 }
el18gs 3:9d811414d35e 632
el18gs 3:9d811414d35e 633 if(which_view_state <= 6) {
el18gs 3:9d811414d35e 634 sprintf(buffer, "HP Max: %d", ghost_fsm[which_ghost_state].hp_max);
el18gs 3:9d811414d35e 635 lcd.printString(buffer, 0, 7 - which_view_state);
el18gs 3:9d811414d35e 636 }
el18gs 3:9d811414d35e 637
el18gs 3:9d811414d35e 638 if(which_view_state <= 7) {
el18gs 3:9d811414d35e 639 sprintf(buffer, "HP: %d", ghost_fsm[which_ghost_state].hp);
el18gs 3:9d811414d35e 640 lcd.printString(buffer, 0, 7 - which_view_state);
el18gs 3:9d811414d35e 641 }
el18gs 3:9d811414d35e 642
el18gs 3:9d811414d35e 643 lcd.refresh();
el18gs 3:9d811414d35e 644 }
el18gs 3:9d811414d35e 645
el18gs 3:9d811414d35e 646 }
el18gs 3:9d811414d35e 647
el18gs 3:9d811414d35e 648 if(pad.read_pot2() <= (double) 0.33) {
el18gs 3:9d811414d35e 649 new_which_view_state = 0;
el18gs 3:9d811414d35e 650 } else if(pad.read_pot2() <= (double) 0.66) {
el18gs 3:9d811414d35e 651 new_which_view_state = 1;
el18gs 3:9d811414d35e 652 } else {
el18gs 3:9d811414d35e 653 new_which_view_state = 2;
el18gs 3:9d811414d35e 654 }
el18gs 3:9d811414d35e 655
el18gs 3:9d811414d35e 656 if(new_which_view_state != which_view_state) {
el18gs 3:9d811414d35e 657 update = true;
el18gs 3:9d811414d35e 658 which_view_state = new_which_view_state;
el18gs 3:9d811414d35e 659 }
el18gs 3:9d811414d35e 660
el18gs 3:9d811414d35e 661 if(pad.read_pot1() < (double) 0.33) {
el18gs 3:9d811414d35e 662 which_ghost_state = ghost_fsm[which_ghost_state].next[1];
el18gs 3:9d811414d35e 663 scroll_ghost = true;
el18gs 3:9d811414d35e 664 } else if(pad.read_pot1() > (double) 0.66) {
el18gs 3:9d811414d35e 665 which_ghost_state = ghost_fsm[which_ghost_state].next[0];
el18gs 3:9d811414d35e 666 scroll_ghost = true;
el18gs 3:9d811414d35e 667 }
el18gs 3:9d811414d35e 668
el18gs 3:9d811414d35e 669 if(scroll_ghost) {
el18gs 3:9d811414d35e 670 update = true;
el18gs 3:9d811414d35e 671 }
el18gs 3:9d811414d35e 672
el18gs 3:9d811414d35e 673 if(g_buttonX_flag) {
el18gs 3:9d811414d35e 674 printf("X button pressed\n");
el18gs 3:9d811414d35e 675 update = true;
el18gs 3:9d811414d35e 676 g_buttonX_flag = 0;
el18gs 3:9d811414d35e 677 lcd.drawRect(0,16,84,16, FILL_WHITE);
el18gs 3:9d811414d35e 678 lcd.printString("Press again",10,2);
el18gs 3:9d811414d35e 679 lcd.printString("to sell",20,3);
el18gs 3:9d811414d35e 680
el18gs 3:9d811414d35e 681 //wait_ms(50);
el18gs 3:9d811414d35e 682
el18gs 3:9d811414d35e 683 Timer t;
el18gs 3:9d811414d35e 684 t.start();
el18gs 3:9d811414d35e 685
el18gs 3:9d811414d35e 686 g_buttonX_flag = 0;
el18gs 3:9d811414d35e 687 bool sell = false;
el18gs 3:9d811414d35e 688
el18gs 3:9d811414d35e 689 while(t.read() <= 5) {
el18gs 3:9d811414d35e 690 int time = t.read();
el18gs 3:9d811414d35e 691 bool changed = false;
el18gs 3:9d811414d35e 692 if(time == 0) {
el18gs 3:9d811414d35e 693 lcd.printString("5",60,3);
el18gs 3:9d811414d35e 694 changed = true;
el18gs 3:9d811414d35e 695 } else if (time == 1) {
el18gs 3:9d811414d35e 696 lcd.printString("4",60,3);
el18gs 3:9d811414d35e 697 changed = true;
el18gs 3:9d811414d35e 698 } else if (time == 2) {
el18gs 3:9d811414d35e 699 lcd.printString("3",60,3);
el18gs 3:9d811414d35e 700 changed = true;
el18gs 3:9d811414d35e 701 } else if (time == 3) {
el18gs 3:9d811414d35e 702 lcd.printString("2",60,3);
el18gs 3:9d811414d35e 703 changed = true;
el18gs 3:9d811414d35e 704 } else if (time == 4) {
el18gs 3:9d811414d35e 705 lcd.printString("1",60,3);
el18gs 3:9d811414d35e 706 changed = true;
el18gs 3:9d811414d35e 707 } else if (time == 5) {
el18gs 3:9d811414d35e 708 lcd.printString("0",60,3);
el18gs 3:9d811414d35e 709 changed = true;
el18gs 3:9d811414d35e 710 }
el18gs 3:9d811414d35e 711
el18gs 3:9d811414d35e 712 if(g_buttonX_flag) {
el18gs 3:9d811414d35e 713 printf("button X pressed\n");
el18gs 3:9d811414d35e 714 g_buttonX_flag = 0;
el18gs 3:9d811414d35e 715 //wait_ms(50);
el18gs 3:9d811414d35e 716 sell = true;
el18gs 3:9d811414d35e 717 }
el18gs 3:9d811414d35e 718
el18gs 3:9d811414d35e 719 if(changed) {
el18gs 3:9d811414d35e 720 lcd.refresh();
el18gs 3:9d811414d35e 721 }
el18gs 3:9d811414d35e 722
el18gs 3:9d811414d35e 723 if(sell) {
el18gs 3:9d811414d35e 724 printf("Exiting to sell\n");
el18gs 3:9d811414d35e 725 break;
el18gs 3:9d811414d35e 726 }
el18gs 3:9d811414d35e 727
el18gs 3:9d811414d35e 728 }
el18gs 3:9d811414d35e 729
el18gs 3:9d811414d35e 730 if(sell) {
el18gs 3:9d811414d35e 731 printf("Running sell function\n");
el18gs 8:4220d116f17c 732 inventory.sell_ghost_by_uid(ghost_fsm[which_ghost_state].uid, sd);
el18gs 3:9d811414d35e 733 regen_inven = true;
el18gs 3:9d811414d35e 734 update = true;
el18gs 3:9d811414d35e 735 //wait_ms(500);
el18gs 3:9d811414d35e 736 }
el18gs 3:9d811414d35e 737
el18gs 3:9d811414d35e 738 } else if(g_buttonStart_flag) {
el18gs 3:9d811414d35e 739 g_buttonStart_flag = 0;
el18gs 3:9d811414d35e 740 return;
el18gs 3:9d811414d35e 741 }
el18gs 3:9d811414d35e 742
el18gs 3:9d811414d35e 743 }
el18gs 2:eaf245af2aae 744
el18gs 2:eaf245af2aae 745 }
el18gs 2:eaf245af2aae 746
el18gs 3:9d811414d35e 747 std::vector<inven_state> gen_ghost_fsm(Inventory inventory)
el18gs 2:eaf245af2aae 748 {
el18gs 3:9d811414d35e 749 std::vector<inven_state> ghost_fsm;
el18gs 3:9d811414d35e 750
el18gs 3:9d811414d35e 751 std::vector<int> uids = inventory.list_ghost_uids();
el18gs 3:9d811414d35e 752
el18gs 3:9d811414d35e 753 sort(uids.begin(), uids.end());
el18gs 3:9d811414d35e 754
el18gs 3:9d811414d35e 755 for(int i = 0; i < uids.size(); i++) {
el18gs 3:9d811414d35e 756 Ghost ghost_temp = inventory.get_ghost_by_uid(uids[i]);
el18gs 3:9d811414d35e 757 inven_state temp;
el18gs 3:9d811414d35e 758 temp.uid = ghost_temp.get_uid();
el18gs 3:9d811414d35e 759 temp.name = ghost_temp.get_name();
el18gs 3:9d811414d35e 760 temp.type = ghost_temp.get_type_string();
el18gs 3:9d811414d35e 761 temp.attack = ghost_temp.get_attack();
el18gs 3:9d811414d35e 762 temp.defense = ghost_temp.get_defense();
el18gs 3:9d811414d35e 763 temp.level = ghost_temp.get_level();
el18gs 3:9d811414d35e 764 temp.xp = ghost_temp.get_xp();
el18gs 3:9d811414d35e 765 temp.value = ghost_temp.get_value();
el18gs 3:9d811414d35e 766 temp.hp_max = ghost_temp.get_hp_max();
el18gs 3:9d811414d35e 767 temp.hp = ghost_temp.get_hp();
el18gs 3:9d811414d35e 768
el18gs 3:9d811414d35e 769 ghost_fsm.push_back(temp);
el18gs 3:9d811414d35e 770 //printf("Added Ghost UID %i to fsm\n", temp.uid);
el18gs 3:9d811414d35e 771 printf("%s\n", temp.name.c_str());
el18gs 3:9d811414d35e 772 }
el18gs 3:9d811414d35e 773
el18gs 3:9d811414d35e 774 for(int i = 0; i < ghost_fsm.size(); i++) {
el18gs 3:9d811414d35e 775 if (i == 0) {
el18gs 3:9d811414d35e 776 int next[2] = {1, ghost_fsm.size() - 1};
el18gs 3:9d811414d35e 777 ghost_fsm[i].next[0] = next[0];
el18gs 3:9d811414d35e 778 ghost_fsm[i].next[1] = next[1];
el18gs 3:9d811414d35e 779 } else if (i == ghost_fsm.size() - 1) {
el18gs 3:9d811414d35e 780 int next[2] = {0, ghost_fsm.size() - 2};
el18gs 3:9d811414d35e 781 ghost_fsm[i].next[0] = next[0];
el18gs 3:9d811414d35e 782 ghost_fsm[i].next[1] = next[1];
el18gs 3:9d811414d35e 783 } else {
el18gs 3:9d811414d35e 784 int next[2] = {i + 1, i - 1};
el18gs 3:9d811414d35e 785 ghost_fsm[i].next[0] = next[0];
el18gs 3:9d811414d35e 786 ghost_fsm[i].next[1] = next[1];
el18gs 3:9d811414d35e 787 }
el18gs 3:9d811414d35e 788 }
el18gs 3:9d811414d35e 789
el18gs 3:9d811414d35e 790 return ghost_fsm;
el18gs 2:eaf245af2aae 791 }
el18gs 2:eaf245af2aae 792
el18gs 2:eaf245af2aae 793
el18gs 2:eaf245af2aae 794 int** import_sprite(std::string file)
el18gs 2:eaf245af2aae 795 {
el18gs 2:eaf245af2aae 796 FILE *fp; // this is our file pointer
el18gs 2:eaf245af2aae 797
el18gs 2:eaf245af2aae 798 // the previous example just read the values into variables and printed to
el18gs 2:eaf245af2aae 799 // serial, we'll now read files into an array.
el18gs 2:eaf245af2aae 800
el18gs 2:eaf245af2aae 801 // now open file for reading...note the 'r'
el18gs 2:eaf245af2aae 802 fp = fopen(file.c_str(), "r");
el18gs 2:eaf245af2aae 803
el18gs 2:eaf245af2aae 804
el18gs 2:eaf245af2aae 805 int n=0; // going to store the number of lines in the file
el18gs 2:eaf245af2aae 806 stringvec values;
el18gs 2:eaf245af2aae 807
el18gs 2:eaf245af2aae 808 if (fp == NULL) { // if it can't open the file then print error message
el18gs 2:eaf245af2aae 809 printf("Error! Unable to open file: %s\n", file.c_str());
el18gs 2:eaf245af2aae 810 listdir();
el18gs 2:eaf245af2aae 811 } else {
el18gs 2:eaf245af2aae 812 //Since we may not know the
el18gs 2:eaf245af2aae 813 // number of lines in the files ahead of time, we'll first count them
el18gs 2:eaf245af2aae 814 // * means scan but don't save
el18gs 2:eaf245af2aae 815 int max_len_tmp = 0;
el18gs 2:eaf245af2aae 816 int max_len = 0;
el18gs 2:eaf245af2aae 817
el18gs 2:eaf245af2aae 818 while (fscanf(fp, "%*i%n", &max_len_tmp) != EOF) {
el18gs 2:eaf245af2aae 819 n++; // increment counter when read a line
el18gs 2:eaf245af2aae 820 if(max_len_tmp > max_len) {
el18gs 2:eaf245af2aae 821 max_len = max_len_tmp;
el18gs 2:eaf245af2aae 822 }
el18gs 2:eaf245af2aae 823 }
el18gs 2:eaf245af2aae 824
el18gs 2:eaf245af2aae 825 max_len--;
el18gs 2:eaf245af2aae 826
el18gs 2:eaf245af2aae 827 rewind(fp); // 'scrolled' to end of file, so go back to beginning
el18gs 2:eaf245af2aae 828
el18gs 2:eaf245af2aae 829 char buffer[n][max_len];
el18gs 2:eaf245af2aae 830
el18gs 2:eaf245af2aae 831 for(int i = 0; i < n; i++) {
el18gs 2:eaf245af2aae 832 fscanf(fp, "%s", &buffer[i][0]);
el18gs 2:eaf245af2aae 833 }
el18gs 2:eaf245af2aae 834
el18gs 2:eaf245af2aae 835 int** sprite = 0;
el18gs 2:eaf245af2aae 836 sprite = new int*[n];
el18gs 2:eaf245af2aae 837 for(int i = 0; i < n; i++) {
el18gs 2:eaf245af2aae 838 sprite[i] = new int[max_len];
el18gs 2:eaf245af2aae 839 }
el18gs 2:eaf245af2aae 840
el18gs 2:eaf245af2aae 841 for(int i = 0; i < n; i++) {
el18gs 2:eaf245af2aae 842 //printf("%s\n", buffer[i]);
el18gs 2:eaf245af2aae 843 for(int j = 0; j < max_len; j++) {
el18gs 2:eaf245af2aae 844 if((int)buffer[i][j] == 48) {
el18gs 2:eaf245af2aae 845 sprite[i][j] = 0;
el18gs 2:eaf245af2aae 846 } else if((int) buffer[i][j] == 49) {
el18gs 2:eaf245af2aae 847 sprite[i][j] = 1;
el18gs 2:eaf245af2aae 848 }
el18gs 2:eaf245af2aae 849 }
el18gs 2:eaf245af2aae 850 }
el18gs 2:eaf245af2aae 851
el18gs 2:eaf245af2aae 852 fclose(fp); // ensure you close the file after reading
el18gs 2:eaf245af2aae 853
el18gs 2:eaf245af2aae 854 return sprite;
el18gs 2:eaf245af2aae 855
el18gs 2:eaf245af2aae 856 }
el18gs 2:eaf245af2aae 857
el18gs 2:eaf245af2aae 858 return 0;
el18gs 2:eaf245af2aae 859 }
el18gs 2:eaf245af2aae 860
el18gs 2:eaf245af2aae 861 void listdir(void)
el18gs 2:eaf245af2aae 862 {
el18gs 2:eaf245af2aae 863 DIR *d;
el18gs 2:eaf245af2aae 864 struct dirent *p;
el18gs 2:eaf245af2aae 865
el18gs 2:eaf245af2aae 866 d = opendir("/sd/assets");
el18gs 2:eaf245af2aae 867 if (d != NULL) {
el18gs 2:eaf245af2aae 868 while ((p = readdir(d)) != NULL) {
el18gs 2:eaf245af2aae 869 printf(" - %s\n", p->d_name);
el18gs 2:eaf245af2aae 870 }
el18gs 2:eaf245af2aae 871 } else {
el18gs 2:eaf245af2aae 872 printf("Could not open directory!\n");
el18gs 2:eaf245af2aae 873 }
el18gs 2:eaf245af2aae 874 closedir(d);
el18gs 2:eaf245af2aae 875 }
el18gs 2:eaf245af2aae 876
el18gs 2:eaf245af2aae 877 stringvec list_ghosts()
el18gs 2:eaf245af2aae 878 {
el18gs 2:eaf245af2aae 879 // Connections to SD card holder on K64F (SPI interface)
el18gs 4:2e8d7c6d2953 880 //SDFileSystem sd(PTE3, PTE1, PTE2, PTE4, "sd"); // MOSI, MISO, SCK, CS
el18gs 2:eaf245af2aae 881 std::string path = "/sd/ghosts";
el18gs 2:eaf245af2aae 882 printf("Listing directory: %s\n", path.c_str());
el18gs 2:eaf245af2aae 883 DIR *d;
el18gs 2:eaf245af2aae 884 struct dirent *p;
el18gs 2:eaf245af2aae 885
el18gs 2:eaf245af2aae 886 stringvec files;
el18gs 2:eaf245af2aae 887
el18gs 2:eaf245af2aae 888 d = opendir(path.c_str());
el18gs 2:eaf245af2aae 889 if (d != NULL) {
el18gs 2:eaf245af2aae 890 while ((p = readdir(d)) != NULL) {
el18gs 2:eaf245af2aae 891 files.push_back(p->d_name);
el18gs 2:eaf245af2aae 892 }
el18gs 2:eaf245af2aae 893 } else {
el18gs 2:eaf245af2aae 894 printf("Could not open directory!\n");
el18gs 2:eaf245af2aae 895 }
el18gs 2:eaf245af2aae 896 closedir(d);
el18gs 2:eaf245af2aae 897
el18gs 2:eaf245af2aae 898 stringvec correct_files;
el18gs 2:eaf245af2aae 899
el18gs 2:eaf245af2aae 900 for(int i = 0; i < files.size(); i++) {
el18gs 2:eaf245af2aae 901 if(hasEnding(files[i], ".ghost")) {
el18gs 2:eaf245af2aae 902 correct_files.push_back(files[i]);
el18gs 2:eaf245af2aae 903 }
el18gs 2:eaf245af2aae 904 }
el18gs 3:9d811414d35e 905
el18gs 2:eaf245af2aae 906 return correct_files;
el18gs 2:eaf245af2aae 907 }
el18gs 2:eaf245af2aae 908
el18gs 3:9d811414d35e 909
el18gs 3:9d811414d35e 910 // Function taken from https://stackoverflow.com/a/874160/10436605
el18gs 3:9d811414d35e 911 bool hasEnding (std::string const &fullString, std::string const &ending)
el18gs 3:9d811414d35e 912 {
el18gs 3:9d811414d35e 913 if (fullString.length() >= ending.length()) {
el18gs 3:9d811414d35e 914 return (0 == fullString.compare (fullString.length() - ending.length(), ending.length(), ending));
el18gs 3:9d811414d35e 915 } else {
el18gs 3:9d811414d35e 916 return false;
el18gs 3:9d811414d35e 917 }
el18gs 3:9d811414d35e 918 }
el18gs 3:9d811414d35e 919
el18gs 2:eaf245af2aae 920 void int_to_bin_digit(unsigned int in, int count, int* out)
el18gs 2:eaf245af2aae 921 {
el18gs 2:eaf245af2aae 922 /* assert: count <= sizeof(int)*CHAR_BIT */
el18gs 2:eaf245af2aae 923 unsigned int mask = 1U << (count-1);
el18gs 2:eaf245af2aae 924 int i;
el18gs 2:eaf245af2aae 925 for (i = 0; i < count; i++) {
el18gs 2:eaf245af2aae 926 out[i] = (in & mask) ? 1 : 0;
el18gs 2:eaf245af2aae 927 in <<= 1;
el18gs 2:eaf245af2aae 928 }
el18gs 2:eaf245af2aae 929 }
el18gs 2:eaf245af2aae 930
el18gs 3:9d811414d35e 931
el18gs 2:eaf245af2aae 932 // Button A event-triggered interrupt
el18gs 2:eaf245af2aae 933 void buttonX_isr()
el18gs 2:eaf245af2aae 934 {
el18gs 2:eaf245af2aae 935 g_buttonX_flag = 1; // set flag in ISR
el18gs 3:9d811414d35e 936 if(!g_buttonTesting) {
el18gs 3:9d811414d35e 937 wait_ms(g_button_sesnsitivity);
el18gs 3:9d811414d35e 938 } else {
el18gs 3:9d811414d35e 939 wait_ms(g_buttonSensitivityTest);
el18gs 3:9d811414d35e 940 }
el18gs 2:eaf245af2aae 941 }
el18gs 2:eaf245af2aae 942
el18gs 2:eaf245af2aae 943 // Button A event-triggered interrupt
el18gs 2:eaf245af2aae 944 void buttonA_isr()
el18gs 2:eaf245af2aae 945 {
el18gs 2:eaf245af2aae 946 g_buttonA_flag = 1; // set flag in ISR
el18gs 3:9d811414d35e 947 wait_ms(g_button_sesnsitivity);
el18gs 2:eaf245af2aae 948 }
el18gs 2:eaf245af2aae 949
el18gs 2:eaf245af2aae 950 // Button A event-triggered interrupt
el18gs 2:eaf245af2aae 951 void buttonB_isr()
el18gs 2:eaf245af2aae 952 {
el18gs 2:eaf245af2aae 953 g_buttonB_flag = 1; // set flag in ISR
el18gs 3:9d811414d35e 954 wait_ms(g_button_sesnsitivity);
el18gs 3:9d811414d35e 955 }
el18gs 3:9d811414d35e 956
el18gs 3:9d811414d35e 957 // Button A event-triggered interrupt
el18gs 3:9d811414d35e 958 void buttonY_isr()
el18gs 3:9d811414d35e 959 {
el18gs 3:9d811414d35e 960 g_buttonY_flag = 1; // set flag in ISR
el18gs 3:9d811414d35e 961 wait_ms(g_button_sesnsitivity);
el18gs 3:9d811414d35e 962 }
el18gs 3:9d811414d35e 963
el18gs 3:9d811414d35e 964 // Button A event-triggered interrupt
el18gs 3:9d811414d35e 965 void buttonStart_isr()
el18gs 3:9d811414d35e 966 {
el18gs 3:9d811414d35e 967 g_buttonStart_flag = 1; // set flag in ISR
el18gs 3:9d811414d35e 968 wait_ms(g_button_sesnsitivity);
el18gs 2:eaf245af2aae 969 }