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:
Mon May 11 18:58:07 2020 +0000
Revision:
8:4220d116f17c
Parent:
4:2e8d7c6d2953
Child:
11:e89dbdb74df5
Moved to passing the address of SDF file system to all functions.; Completed doccumenting Ghosts.h

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