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:
Mon May 11 17:17:20 2020 +0000
Revision:
4:2e8d7c6d2953
Parent:
3:9d811414d35e
Child:
8:4220d116f17c
Doxygen testing

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