Armageddon - a missile commad clone by Wuuff, originally for Gamebuino. Conversion by Jonne

Dependencies:   PokittoLib

Fork of Asterocks by Pokitto Community Team

Committer:
wuuff
Date:
Mon Oct 30 09:13:39 2017 +0000
Revision:
15:933ac6bcd8b8
Parent:
14:41173f26c0ef
Child:
21:153974d672f8
Restored saving highscores to EEPROM

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Pokitto 5:56c4f2f12ec0 1 /* This file was automatically parsed from an Arduino sourcefile */
Pokitto 5:56c4f2f12ec0 2 /* by PokittoParser v0.1 Copyright 2016 Jonne Valola */
Pokitto 5:56c4f2f12ec0 3 /* USE AT YOUR OWN RISK - NO GUARANTEES GIVEN OF 100% CORRECTNESS */
Pokitto 5:56c4f2f12ec0 4
Pokitto 5:56c4f2f12ec0 5 #include "PokittoCore.h"
wuuff 15:933ac6bcd8b8 6 #include "PokittoEEPROM.h"
Pokitto 5:56c4f2f12ec0 7 /* Auto-generated function declarations */
Pokitto 5:56c4f2f12ec0 8 void setup();
Pokitto 5:56c4f2f12ec0 9 void nextStage();
Pokitto 5:56c4f2f12ec0 10 void nextLull();
Pokitto 5:56c4f2f12ec0 11 void drawScore();
Pokitto 5:56c4f2f12ec0 12 void drawTargets();
Pokitto 5:56c4f2f12ec0 13 void drawCities();
Pokitto 5:56c4f2f12ec0 14 void drawAmmo();
Pokitto 5:56c4f2f12ec0 15 void drawMissiles();
Pokitto 5:56c4f2f12ec0 16 void drawDetonations();
Pokitto 5:56c4f2f12ec0 17 void launchMissile(uint8_t);
Pokitto 5:56c4f2f12ec0 18 void tryLaunchEnemy();
Pokitto 5:56c4f2f12ec0 19 void stepMissiles();
Pokitto 5:56c4f2f12ec0 20 void stepDetonations();
Pokitto 5:56c4f2f12ec0 21 void stepCollision();
Pokitto 5:56c4f2f12ec0 22 void checkMenu();
Pokitto 5:56c4f2f12ec0 23 void checkWin();
Pokitto 5:56c4f2f12ec0 24 void checkLose();
Pokitto 5:56c4f2f12ec0 25 void stepGame();
Pokitto 5:56c4f2f12ec0 26 void drawLull();
Pokitto 5:56c4f2f12ec0 27 void stepLull();
Pokitto 5:56c4f2f12ec0 28 void stepDead();
Pokitto 5:56c4f2f12ec0 29 void stepPregame();
Pokitto 5:56c4f2f12ec0 30 void loop();
Pokitto 5:56c4f2f12ec0 31 void loadHighscores();
Pokitto 5:56c4f2f12ec0 32 uint8_t isHighscore(uint32_t);
wuuff 14:41173f26c0ef 33 void saveHighscore(uint32_t,char*);
Pokitto 5:56c4f2f12ec0 34 void drawHighscores();
Pokitto 5:56c4f2f12ec0 35 void initSound();
Pokitto 5:56c4f2f12ec0 36 void playSound(uint8_t);
Pokitto 5:56c4f2f12ec0 37 Pokitto::Core gb;
Pokitto 5:56c4f2f12ec0 38
Pokitto 5:56c4f2f12ec0 39 int main() {
Pokitto 5:56c4f2f12ec0 40 setup();
wuuff 13:b133c46dbda7 41 gb.display.setDefaultPalette();
Pokitto 5:56c4f2f12ec0 42 while (gb.isRunning()) {
Pokitto 5:56c4f2f12ec0 43 loop();
Pokitto 5:56c4f2f12ec0 44 }
Pokitto 5:56c4f2f12ec0 45 }
Pokitto 5:56c4f2f12ec0 46
wuuff 14:41173f26c0ef 47 #define WIDTH 110
wuuff 14:41173f26c0ef 48 #define HEIGHT 88
wuuff 14:41173f26c0ef 49 #define TEXT_WIDTH 6
wuuff 14:41173f26c0ef 50 #define TEXT_HEIGHT 8
wuuff 14:41173f26c0ef 51
wuuff 14:41173f26c0ef 52 const byte armageddon[] PROGMEM = {112,88,
wuuff 14:41173f26c0ef 53 B11111111,B11111111,B11111000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B01111111,B11111111,B11111100,
wuuff 14:41173f26c0ef 54 B11111111,B11111111,B11111000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B01111111,B11111111,B11111100,
wuuff 14:41173f26c0ef 55 B11111111,B11000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00001111,B11111100,
wuuff 14:41173f26c0ef 56 B11111111,B11000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00001111,B11111100,
wuuff 14:41173f26c0ef 57 B11111111,B11000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00001111,B11111100,
wuuff 14:41173f26c0ef 58 B11111000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B01111100,
wuuff 14:41173f26c0ef 59 B11111000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B01111100,
wuuff 14:41173f26c0ef 60 B11000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00001100,
wuuff 14:41173f26c0ef 61 B11000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00001100,
wuuff 14:41173f26c0ef 62 B11000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00001100,
wuuff 14:41173f26c0ef 63 B00000001,B10000001,B11100000,B00110000,B11000000,B11000000,B00111000,B00111111,B10011110,B00000111,B10000000,B00011000,B00011000,B01100000,
wuuff 14:41173f26c0ef 64 B00000001,B10000001,B11100000,B00110000,B11000000,B11000000,B00111000,B00111111,B10011110,B00000111,B10000000,B00011000,B00011000,B01100000,
wuuff 14:41173f26c0ef 65 B00000001,B10000001,B10011000,B00111001,B11000000,B11000000,B11000110,B00110000,B00011001,B10000110,B01100000,B01100110,B00011100,B01100000,
wuuff 14:41173f26c0ef 66 B00000001,B10000001,B10011000,B00111001,B11000000,B11000000,B11000110,B00110000,B00011001,B10000110,B01100000,B01100110,B00011100,B01100000,
wuuff 14:41173f26c0ef 67 B00000001,B10000001,B10011000,B00111001,B11000000,B11000000,B11000110,B00110000,B00011001,B10000110,B01100000,B01100110,B00011100,B01100000,
wuuff 14:41173f26c0ef 68 B00000110,B01100001,B11111000,B00111001,B11000011,B00110000,B11000000,B00111111,B00011000,B01100110,B00011001,B10000001,B10011011,B01100000,
wuuff 14:41173f26c0ef 69 B00000110,B01100001,B11111000,B00111001,B11000011,B00110000,B11000000,B00111111,B00011000,B01100110,B00011001,B10000001,B10011011,B01100000,
wuuff 14:41173f26c0ef 70 B00000111,B11100001,B10011000,B00110110,B11000011,B11110000,B11001110,B00110000,B00011000,B01100110,B00011001,B10000001,B10011000,B11100000,
wuuff 14:41173f26c0ef 71 B00000111,B11100001,B10011000,B00110110,B11000011,B11110000,B11001110,B00110000,B00011000,B01100110,B00011001,B10000001,B10011000,B11100000,
wuuff 14:41173f26c0ef 72 B00000111,B11100001,B10011000,B00110110,B11000011,B11110000,B11001110,B00110000,B00011000,B01100110,B00011001,B10000001,B10011000,B11100000,
wuuff 14:41173f26c0ef 73 B00000110,B01100001,B10011100,B00110000,B11000011,B00110000,B11000110,B00110000,B00011001,B10000110,B01100000,B01100110,B00011000,B01100000,
wuuff 14:41173f26c0ef 74 B00000110,B01100001,B10001110,B00110000,B11000011,B00110000,B11000110,B00110000,B00011001,B10000110,B01100000,B01100110,B00011000,B01100000,
wuuff 14:41173f26c0ef 75 B00011110,B01111001,B10000110,B00110000,B11001111,B00111100,B00111000,B00111111,B10011110,B00000111,B10000000,B00011000,B00011000,B01100000,
wuuff 14:41173f26c0ef 76 B00011110,B01111001,B10000110,B00110000,B11001111,B00111100,B00111000,B00111111,B10011110,B00000111,B10000000,B00011000,B00011000,B01100000,
wuuff 14:41173f26c0ef 77 B11000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00001100,
wuuff 14:41173f26c0ef 78 B11000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00001100,
wuuff 14:41173f26c0ef 79 B11000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00001100,
wuuff 14:41173f26c0ef 80 B11100000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00011100,
wuuff 14:41173f26c0ef 81 B11100000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00011100,
wuuff 14:41173f26c0ef 82 B11111000,B00000000,B00000000,B00000000,B01111111,B10000000,B00000000,B00000000,B00000111,B11111000,B00000000,B00000000,B00000000,B01111100,
wuuff 14:41173f26c0ef 83 B11111000,B00000000,B00000000,B00000000,B01111111,B10000000,B00000000,B00000000,B00000111,B11111000,B00000000,B00000000,B00000000,B01111100,
wuuff 14:41173f26c0ef 84 B11111000,B00000000,B00000000,B00000000,B01111111,B10000000,B00000000,B00000000,B00000111,B11111000,B00000000,B00000000,B00000000,B01111100,
wuuff 14:41173f26c0ef 85 B11111111,B10000000,B00000000,B00111111,B11111111,B11111100,B00000000,B00000000,B11111111,B11111111,B11110000,B00000000,B00000111,B11111100,
wuuff 14:41173f26c0ef 86 B11111111,B10000000,B00000000,B00111111,B11111111,B11111100,B00000000,B00000000,B11111111,B11111111,B11110000,B00000000,B00000111,B11111100,
wuuff 14:41173f26c0ef 87 B11111111,B11110000,B00000111,B11111111,B11111111,B11111111,B00000000,B00000011,B11111111,B11111111,B11111111,B10000000,B00111111,B11111100,
wuuff 14:41173f26c0ef 88 B11111111,B11110000,B00000111,B11111111,B11111111,B11111111,B00000000,B00000011,B11111111,B11111111,B11111111,B10000000,B00111111,B11111100,
wuuff 14:41173f26c0ef 89 B11111111,B11110000,B00000111,B11111111,B11111111,B11111111,B00000000,B00000011,B11111111,B11111111,B11111111,B10000000,B00111111,B11111100,
wuuff 14:41173f26c0ef 90 B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B00000000,B00000011,B11111111,B11111111,B11111111,B11111111,B11111111,B11111100,
wuuff 14:41173f26c0ef 91 B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B00000000,B00000011,B11111111,B11111111,B11111111,B11111111,B11111111,B11111100,
wuuff 14:41173f26c0ef 92 B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11000000,B00001111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111100,
wuuff 14:41173f26c0ef 93 B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11000000,B00001111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111100,
wuuff 14:41173f26c0ef 94 B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11000000,B00001111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111100,
wuuff 14:41173f26c0ef 95 B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11000000,B00001111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111100,
wuuff 14:41173f26c0ef 96 B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11000000,B00001111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111100,
wuuff 14:41173f26c0ef 97 B11111111,B11111111,B11111111,B11111111,B11111111,B00000000,B00000000,B00000000,B00000011,B11111111,B11111111,B11111111,B11111111,B11111100,
wuuff 14:41173f26c0ef 98 B11111111,B11111111,B11111111,B11111111,B11111111,B00000000,B00000000,B00000000,B00000011,B11111111,B11111111,B11111111,B11111111,B11111100,
wuuff 14:41173f26c0ef 99 B11111111,B11111111,B11111111,B11111111,B10000000,B11111111,B11000000,B00001111,B11111100,B00000111,B11111111,B11111111,B11111111,B11111100,
wuuff 14:41173f26c0ef 100 B11111111,B11111111,B11111111,B11111111,B10000000,B11111111,B11000000,B00001111,B11111100,B00000111,B11111111,B11111111,B11111111,B11111100,
wuuff 14:41173f26c0ef 101 B11111111,B11111111,B11111111,B11111111,B10000000,B11111111,B11000000,B00001111,B11111100,B00000111,B11111111,B11111111,B11111111,B11111100,
wuuff 14:41173f26c0ef 102 B11111111,B11111111,B11111111,B11111110,B01111111,B11111111,B00000000,B00000011,B11111111,B11111001,B11111111,B11111111,B11111111,B11111100,
wuuff 14:41173f26c0ef 103 B11111111,B11111111,B11111111,B11111110,B01111111,B11111111,B00000000,B00000011,B11111111,B11111001,B11111111,B11111111,B11111111,B11111100,
wuuff 14:41173f26c0ef 104 B11111111,B11111111,B11111111,B11111110,B01111111,B11111111,B00000000,B00000011,B11111111,B11111001,B11111111,B11111111,B11111111,B11111100,
wuuff 14:41173f26c0ef 105 B11111111,B11111111,B11111111,B11111110,B01111111,B11111111,B00000000,B00000011,B11111111,B11111001,B11111111,B11111111,B11111111,B11111100,
wuuff 14:41173f26c0ef 106 B11111111,B11111111,B11111111,B11111110,B01111111,B11111111,B00000000,B00000011,B11111111,B11111001,B11111111,B11111111,B11111111,B11111100,
wuuff 14:41173f26c0ef 107 B11111111,B11111111,B11111111,B11111110,B01111111,B11111111,B00000000,B00000011,B11111111,B11111001,B11111111,B11111111,B11111111,B11111100,
wuuff 14:41173f26c0ef 108 B11111111,B11111111,B11111111,B11111110,B01111111,B11111111,B00000000,B00000011,B11111111,B11111001,B11111111,B11111111,B11111111,B11111100,
wuuff 14:41173f26c0ef 109 B11111111,B11111111,B11111111,B11111111,B10000000,B11111111,B00000000,B00000011,B11111100,B00000111,B11111111,B11111111,B11111111,B11111100,
wuuff 14:41173f26c0ef 110 B11111111,B11111111,B11111111,B11111111,B10000000,B11111111,B00000000,B00000011,B11111100,B00000111,B11111111,B11111111,B11111111,B11111100,
wuuff 14:41173f26c0ef 111 B11111111,B11111111,B11111111,B11111111,B10000000,B11111111,B00000000,B00000011,B11111100,B00000111,B11111111,B11111111,B11111111,B11111100,
wuuff 14:41173f26c0ef 112 B11111111,B11111111,B11111111,B11111111,B11111111,B00000011,B00000000,B00000011,B00000011,B11111111,B11111111,B11111111,B11111111,B11111100,
wuuff 14:41173f26c0ef 113 B11111111,B11111111,B11111111,B11111111,B11111111,B00000011,B00000000,B00000011,B00000011,B11111111,B11111111,B11111111,B11111111,B11111100,
wuuff 14:41173f26c0ef 114 B11111111,B11111111,B11111111,B11111111,B11111111,B11111100,B00000000,B00000000,B11111111,B11111111,B11111111,B11111111,B11111111,B11111100,
wuuff 14:41173f26c0ef 115 B11111111,B11111111,B11111111,B11111111,B11111111,B11111100,B00000000,B00000000,B11111111,B11111111,B11111111,B11111111,B11111111,B11111100,
wuuff 14:41173f26c0ef 116 B11111111,B11111111,B11111111,B11111111,B11111111,B11111100,B00000000,B00000000,B11111111,B11111111,B11111111,B11111111,B11111111,B11111100,
wuuff 14:41173f26c0ef 117 B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B00000000,B00000011,B11111111,B11111111,B11111111,B11111111,B11111111,B11111100,
wuuff 14:41173f26c0ef 118 B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B00000000,B00000011,B11111111,B11111111,B11111111,B11111111,B11111111,B11111100,
wuuff 14:41173f26c0ef 119 B11111111,B11111111,B11111111,B11111111,B11111111,B11111100,B00000000,B00000000,B11111111,B11111111,B11111111,B11111111,B11111111,B11111100,
wuuff 14:41173f26c0ef 120 B11111111,B11111111,B11111111,B11111111,B11111111,B11111100,B00000000,B00000000,B11111111,B11111111,B11111111,B11111111,B11111111,B11111100,
wuuff 14:41173f26c0ef 121 B11111111,B11111111,B11111111,B11111111,B11111111,B11111100,B00000000,B00000000,B11111111,B11111111,B11111111,B11111111,B11111111,B11111100,
wuuff 14:41173f26c0ef 122 B11111111,B11111111,B11111111,B11111111,B11111111,B11111100,B00000000,B00000000,B11111111,B11111111,B11111111,B11111111,B11111111,B11111100,
wuuff 14:41173f26c0ef 123 B11111111,B11111111,B11111111,B11111111,B11111111,B11111100,B00000000,B00000000,B11111111,B11111111,B11111111,B11111111,B11111111,B11111100,
wuuff 14:41173f26c0ef 124 B11111111,B11111111,B11111111,B11111111,B11111111,B11111100,B00000000,B00000000,B11111111,B11111111,B11111111,B11111111,B11111111,B11111100,
wuuff 14:41173f26c0ef 125 B11111111,B11111111,B11111111,B11111111,B11111111,B11111100,B00000000,B00000000,B11111111,B11111111,B11111111,B11111111,B11111111,B11111100,
wuuff 14:41173f26c0ef 126 B11111111,B11111111,B11111111,B11111111,B11111111,B11111100,B00000000,B00000000,B11111111,B11111111,B11111111,B11111111,B11111111,B11111100,
wuuff 14:41173f26c0ef 127 B11111111,B11111111,B11111111,B11111111,B11111111,B11111100,B00000000,B00000000,B11111111,B11111111,B11111111,B11111111,B11111111,B11111100,
wuuff 14:41173f26c0ef 128 B11111111,B11111111,B11111111,B11111111,B11111111,B11111100,B00000000,B00000000,B11111111,B11111111,B11111111,B11111111,B11111111,B11111100,
wuuff 14:41173f26c0ef 129 B11111111,B11111111,B11111111,B11111111,B11111111,B11111100,B00000000,B00000000,B11111111,B11111111,B11111111,B11111111,B11111111,B11111100,
wuuff 14:41173f26c0ef 130 B11111111,B11111111,B11111111,B11111111,B11111111,B11111100,B00000000,B00000000,B11111111,B11111111,B11111111,B11111111,B11111111,B11111100,
wuuff 14:41173f26c0ef 131 B11111111,B11111111,B11111111,B11111111,B11111111,B11111000,B00000000,B00000000,B01111111,B11111111,B11111111,B11111111,B11111111,B11111100,
wuuff 14:41173f26c0ef 132 B11111111,B11111111,B11111111,B11111111,B11111111,B11111000,B00000000,B00000000,B01111111,B11111111,B11111111,B11111111,B11111111,B11111100,
wuuff 14:41173f26c0ef 133 B11111111,B11111111,B11111111,B11111111,B11111111,B11111000,B00000000,B00000000,B01111111,B11111111,B11111111,B11111111,B11111111,B11111100,
wuuff 14:41173f26c0ef 134 B11111111,B11111111,B11111111,B11111111,B11111111,B11100000,B00000000,B00000000,B00011111,B11111111,B11111111,B11111111,B11111111,B11111100,
wuuff 14:41173f26c0ef 135 B11111111,B11111111,B11111111,B11111111,B11111111,B11100000,B00000000,B00000000,B00011111,B11111111,B11111111,B11111111,B11111111,B11111100,
wuuff 14:41173f26c0ef 136 B11111111,B11111111,B11111111,B11111111,B11111111,B00000000,B00000000,B00000000,B00000011,B11111111,B11111111,B11111111,B11111111,B11111100,
wuuff 14:41173f26c0ef 137 B11111111,B11111111,B11111111,B11111111,B11111111,B00000000,B00000000,B00000000,B00000011,B11010101,B01010100,B01000111,B00010001,B01000100,
wuuff 14:41173f26c0ef 138 B11111111,B11111111,B11111111,B11111111,B11111111,B00000000,B00000000,B00000000,B00000011,B11010101,B01010101,B11011111,B11010101,B01110100,
wuuff 14:41173f26c0ef 139 B11111111,B11111111,B11111111,B11111111,B11111100,B00000000,B00000000,B00000000,B00000000,B11000101,B01010100,B11001111,B00110101,B01101100,
wuuff 14:41173f26c0ef 140 B11111111,B11111111,B11111111,B11111111,B11111100,B00000000,B00000000,B00000000,B00000000,B11010100,B01000101,B11011111,B00010001,B01011100,
Pokitto 5:56c4f2f12ec0 141 };
Pokitto 5:56c4f2f12ec0 142
Pokitto 5:56c4f2f12ec0 143 /*const byte city[] PROGMEM = {8,8,
Pokitto 5:56c4f2f12ec0 144 B00000000,
Pokitto 5:56c4f2f12ec0 145 B00000000,
Pokitto 5:56c4f2f12ec0 146 B00000000,
Pokitto 5:56c4f2f12ec0 147 B00000000,
Pokitto 5:56c4f2f12ec0 148 B00100010,
Pokitto 5:56c4f2f12ec0 149 B01110110,
Pokitto 5:56c4f2f12ec0 150 B01111110,
Pokitto 5:56c4f2f12ec0 151 B11111111,
Pokitto 5:56c4f2f12ec0 152 };*/
Pokitto 5:56c4f2f12ec0 153
Pokitto 5:56c4f2f12ec0 154 const byte city[] PROGMEM = {8,8,
Pokitto 5:56c4f2f12ec0 155 B00000000,
Pokitto 5:56c4f2f12ec0 156 B00000000,
Pokitto 5:56c4f2f12ec0 157 B00000000,
Pokitto 5:56c4f2f12ec0 158 B00000000,
Pokitto 5:56c4f2f12ec0 159 B01100100,
Pokitto 5:56c4f2f12ec0 160 B01101110,
Pokitto 5:56c4f2f12ec0 161 B01111111,
Pokitto 5:56c4f2f12ec0 162 B11111111,
Pokitto 5:56c4f2f12ec0 163 };
Pokitto 5:56c4f2f12ec0 164
Pokitto 5:56c4f2f12ec0 165 const byte deadcity[] PROGMEM = {8,8,
Pokitto 5:56c4f2f12ec0 166 B00000000,
Pokitto 5:56c4f2f12ec0 167 B00000000,
Pokitto 5:56c4f2f12ec0 168 B00000000,
Pokitto 5:56c4f2f12ec0 169 B00000000,
Pokitto 5:56c4f2f12ec0 170 B00000000,
Pokitto 5:56c4f2f12ec0 171 B00000000,
Pokitto 5:56c4f2f12ec0 172 B00100000,
Pokitto 5:56c4f2f12ec0 173 B01100010,
Pokitto 5:56c4f2f12ec0 174 };
Pokitto 5:56c4f2f12ec0 175
Pokitto 5:56c4f2f12ec0 176 const byte launcher[] PROGMEM = {8,8,
Pokitto 5:56c4f2f12ec0 177 B00011000,
Pokitto 5:56c4f2f12ec0 178 B00011000,
Pokitto 5:56c4f2f12ec0 179 B00011000,
Pokitto 5:56c4f2f12ec0 180 B00100100,
Pokitto 5:56c4f2f12ec0 181 B00100100,
Pokitto 5:56c4f2f12ec0 182 B01000010,
Pokitto 5:56c4f2f12ec0 183 B01000010,
Pokitto 5:56c4f2f12ec0 184 B10000001,
Pokitto 5:56c4f2f12ec0 185 };
Pokitto 5:56c4f2f12ec0 186
Pokitto 5:56c4f2f12ec0 187 const byte deadlauncher[] PROGMEM = {8,8,
Pokitto 5:56c4f2f12ec0 188 B00000000,
Pokitto 5:56c4f2f12ec0 189 B00000000,
Pokitto 5:56c4f2f12ec0 190 B00000000,
Pokitto 5:56c4f2f12ec0 191 B00000000,
Pokitto 5:56c4f2f12ec0 192 B00000000,
Pokitto 5:56c4f2f12ec0 193 B01100110,
Pokitto 5:56c4f2f12ec0 194 B01011010,
Pokitto 5:56c4f2f12ec0 195 B10000001,
Pokitto 5:56c4f2f12ec0 196 };
Pokitto 5:56c4f2f12ec0 197
Pokitto 5:56c4f2f12ec0 198 #define SOUND_PLAUNCH 0
Pokitto 5:56c4f2f12ec0 199 #define SOUND_ELAUNCH 1
Pokitto 5:56c4f2f12ec0 200 #define SOUND_DETONATE 2
Pokitto 5:56c4f2f12ec0 201 #define SOUND_SCORE 3
Pokitto 5:56c4f2f12ec0 202 #define SOUND_DEAD 4
Pokitto 5:56c4f2f12ec0 203 #define SOUND_LOSE 5
Pokitto 5:56c4f2f12ec0 204
Pokitto 5:56c4f2f12ec0 205 #define MODE_PREGAME 0
Pokitto 5:56c4f2f12ec0 206 #define MODE_GAME 1
Pokitto 5:56c4f2f12ec0 207 #define MODE_LULL 2
Pokitto 5:56c4f2f12ec0 208 #define MODE_DEAD 3
Pokitto 5:56c4f2f12ec0 209 #define MODE_POSTDEAD 4
Pokitto 5:56c4f2f12ec0 210
Pokitto 5:56c4f2f12ec0 211 #define TARGET_SPEED 3
Pokitto 5:56c4f2f12ec0 212
Pokitto 5:56c4f2f12ec0 213 #define LAUNCHER_ONE 1
Pokitto 5:56c4f2f12ec0 214 #define LAUNCHER_TWO 2
Pokitto 5:56c4f2f12ec0 215 #define MAX_PMISSILES 10
Pokitto 5:56c4f2f12ec0 216 #define PSPEED 4
Pokitto 5:56c4f2f12ec0 217 #define PRADIUS 7
Pokitto 5:56c4f2f12ec0 218 #define EXPAND 0
Pokitto 5:56c4f2f12ec0 219 #define SHRINK 1
Pokitto 5:56c4f2f12ec0 220
Pokitto 5:56c4f2f12ec0 221 #define MAX_EMISSILES 10
Pokitto 5:56c4f2f12ec0 222 #define MAX_CHANCE 50
Pokitto 5:56c4f2f12ec0 223
Pokitto 5:56c4f2f12ec0 224 // State variables
Pokitto 5:56c4f2f12ec0 225 uint8_t mode = 0;
Pokitto 5:56c4f2f12ec0 226 uint8_t counter = 0;
Pokitto 5:56c4f2f12ec0 227 uint8_t flash = 0;
Pokitto 5:56c4f2f12ec0 228 uint8_t stage = 0; //Maximum of 255 stages
Pokitto 5:56c4f2f12ec0 229 uint32_t score = 0; //Score needs more space than other vars
Pokitto 5:56c4f2f12ec0 230
wuuff 13:b133c46dbda7 231 uint32_t lullMissiles = 0;
Pokitto 5:56c4f2f12ec0 232 uint8_t lullCities[8] = {0,0,0,0,0,0,0,0};
Pokitto 5:56c4f2f12ec0 233
Pokitto 5:56c4f2f12ec0 234 uint8_t cities[8] = {1,1,1,1,1,1,1,1}; //Whether the cities or launchers are alive
Pokitto 5:56c4f2f12ec0 235
wuuff 14:41173f26c0ef 236 uint8_t targetX = WIDTH/2;
wuuff 14:41173f26c0ef 237 uint8_t targetY = HEIGHT/2;
Pokitto 5:56c4f2f12ec0 238 uint8_t pammo[2] = {10,10};
Pokitto 5:56c4f2f12ec0 239 uint8_t pDests[MAX_PMISSILES][2] = {{100,100},{100,100},{100,100},{100,100},{100,100},{100,100},{100,100},{100,100},{100,100},{100,100}};
Pokitto 5:56c4f2f12ec0 240 float pMissiles[MAX_PMISSILES][3] = {{100,100,0},{100,100,0},{100,100,0},{100,100,0},{100,100,0},{100,100,0},{100,100,0},{100,100,0},{100,100,0},{100,100,0}};
Pokitto 5:56c4f2f12ec0 241 uint8_t pDetonations[MAX_PMISSILES][4] = {{100,100,0,0},{100,100,0,0},{100,100,0,0},{100,100,0,0},{100,100,0,0},{100,100,0,0},{100,100,0,0},{100,100,0,0},{100,100,0,0},{100,100,0,0}};
Pokitto 5:56c4f2f12ec0 242
Pokitto 5:56c4f2f12ec0 243 uint8_t etotal = 5;
Pokitto 5:56c4f2f12ec0 244 uint8_t echance = 1;
Pokitto 5:56c4f2f12ec0 245 float espeed = 0.2;
Pokitto 5:56c4f2f12ec0 246 uint8_t eDests[MAX_EMISSILES] = {100,100,100,100,100,100,100,100,100,100};
Pokitto 5:56c4f2f12ec0 247 float eMissiles[MAX_EMISSILES][4] = {{100,100,100,100},{100,100,100,100},{100,100,100,100},{100,100,100,100},{100,100,100,100},{100,100,100,100},{100,100,100,100},{100,100,100,100},{100,100,100,100},{100,100,100,100}};
Pokitto 5:56c4f2f12ec0 248
wuuff 14:41173f26c0ef 249 void doTitle(uint8_t is_pause){
wuuff 14:41173f26c0ef 250 while (gb.isRunning()) {
wuuff 14:41173f26c0ef 251 if( gb.update() ){
wuuff 14:41173f26c0ef 252 gb.display.setColor(7);
wuuff 14:41173f26c0ef 253 gb.display.drawBitmap(0,0,armageddon);
wuuff 14:41173f26c0ef 254 if( counter%8 == 0 ){
wuuff 14:41173f26c0ef 255 flash ^= 255;
wuuff 14:41173f26c0ef 256 }
wuuff 14:41173f26c0ef 257
wuuff 14:41173f26c0ef 258 if( flash ){
wuuff 14:41173f26c0ef 259 gb.display.setColor(4);
wuuff 14:41173f26c0ef 260 gb.display.cursorY = HEIGHT - TEXT_HEIGHT*2;
wuuff 14:41173f26c0ef 261 if( is_pause ){
wuuff 14:41173f26c0ef 262 gb.display.cursorX = WIDTH/2 - TEXT_WIDTH*3;
wuuff 14:41173f26c0ef 263 gb.display.print(("PAUSED"));
wuuff 14:41173f26c0ef 264 }else{
wuuff 14:41173f26c0ef 265 gb.display.cursorX = WIDTH/2 - TEXT_WIDTH*3;
wuuff 14:41173f26c0ef 266 gb.display.print(("PRESS \25"));
wuuff 14:41173f26c0ef 267 }
wuuff 14:41173f26c0ef 268 }
wuuff 14:41173f26c0ef 269 counter++;
wuuff 14:41173f26c0ef 270 if( gb.buttons.pressed(BTN_A) ){
wuuff 14:41173f26c0ef 271 gb.display.setColor(WHITE);
wuuff 14:41173f26c0ef 272 break;
wuuff 14:41173f26c0ef 273 }
wuuff 14:41173f26c0ef 274 }
wuuff 14:41173f26c0ef 275 }
wuuff 14:41173f26c0ef 276 }
wuuff 14:41173f26c0ef 277
Pokitto 5:56c4f2f12ec0 278 void setup() {
Pokitto 5:56c4f2f12ec0 279 gb.begin();
Pokitto 5:56c4f2f12ec0 280 loadHighscores();
wuuff 14:41173f26c0ef 281
wuuff 14:41173f26c0ef 282 //We need to do extra Gamebuino-formatting-specific initialization if we don't use the title screen
wuuff 14:41173f26c0ef 283 gb.display.setFont(font5x7);
wuuff 14:41173f26c0ef 284 gb.display.fontSize = 1;
wuuff 14:41173f26c0ef 285 gb.display.textWrap = false;
wuuff 14:41173f26c0ef 286 gb.display.persistence = false;
Pokitto 5:56c4f2f12ec0 287 gb.battery.show = false;
wuuff 14:41173f26c0ef 288 gb.display.setColor(BLACK);
wuuff 14:41173f26c0ef 289 gb.display.setColorDepth(1);
wuuff 14:41173f26c0ef 290
wuuff 14:41173f26c0ef 291 doTitle(0);
Pokitto 5:56c4f2f12ec0 292 gb.pickRandomSeed();
Pokitto 5:56c4f2f12ec0 293 }
Pokitto 5:56c4f2f12ec0 294
Pokitto 5:56c4f2f12ec0 295 void nextStage(){
Pokitto 5:56c4f2f12ec0 296 stage++;
Pokitto 5:56c4f2f12ec0 297 //Reset cities (since we cleared them for the visual effect
Pokitto 5:56c4f2f12ec0 298 for( uint8_t i = 0; i < 8; i++ ){
Pokitto 5:56c4f2f12ec0 299 cities[i] = lullCities[i];
Pokitto 5:56c4f2f12ec0 300 }
Pokitto 5:56c4f2f12ec0 301 //Reset launchers
Pokitto 5:56c4f2f12ec0 302 cities[2] = 1;
Pokitto 5:56c4f2f12ec0 303 cities[5] = 1;
Pokitto 5:56c4f2f12ec0 304 //Reset missiles
Pokitto 5:56c4f2f12ec0 305 pammo[0] = 10;
Pokitto 5:56c4f2f12ec0 306 pammo[1] = 10;
Pokitto 5:56c4f2f12ec0 307 //Reset in-flight missiles
Pokitto 5:56c4f2f12ec0 308 for( uint8_t i = 0; i < 10; i++ ){
wuuff 14:41173f26c0ef 309 pDests[i][0] = 127;
wuuff 14:41173f26c0ef 310 pDetonations[i][0] = 127;
wuuff 14:41173f26c0ef 311 eDests[i] = 127;
Pokitto 5:56c4f2f12ec0 312 }
Pokitto 5:56c4f2f12ec0 313
Pokitto 5:56c4f2f12ec0 314 etotal = stage > 10 ? 20 : 10+stage; //Max of 20 missiles per stage, start at 10
Pokitto 5:56c4f2f12ec0 315 //echance = stage > 5 ? 5 : stage; //Max of 5/100 chance per frame
Pokitto 5:56c4f2f12ec0 316 espeed = stage > 18 ? 2 : 0.2+(stage*0.1); //Max speed of 2, up 0.1 per stage, starts at 0.2
Pokitto 5:56c4f2f12ec0 317 }
Pokitto 5:56c4f2f12ec0 318
Pokitto 5:56c4f2f12ec0 319 void nextLull(){
Pokitto 5:56c4f2f12ec0 320 //Reset lullMissiles
Pokitto 5:56c4f2f12ec0 321 lullMissiles = 0;
Pokitto 5:56c4f2f12ec0 322 //Reset lullCities
Pokitto 5:56c4f2f12ec0 323 for( uint8_t i = 0; i < 8; i++ ){
Pokitto 5:56c4f2f12ec0 324 lullCities[i] = 0;
Pokitto 5:56c4f2f12ec0 325 }
Pokitto 5:56c4f2f12ec0 326 }
Pokitto 5:56c4f2f12ec0 327
Pokitto 5:56c4f2f12ec0 328 void drawScore(){
wuuff 14:41173f26c0ef 329 gb.display.cursorX = WIDTH/2 - TEXT_WIDTH*3;
Pokitto 5:56c4f2f12ec0 330 gb.display.cursorY = 0;
Pokitto 5:56c4f2f12ec0 331
Pokitto 5:56c4f2f12ec0 332 if( score < 100000 ){
Pokitto 5:56c4f2f12ec0 333 gb.display.print(0);
Pokitto 5:56c4f2f12ec0 334 }
Pokitto 5:56c4f2f12ec0 335 if( score < 10000 ){
Pokitto 5:56c4f2f12ec0 336 gb.display.print(0);
Pokitto 5:56c4f2f12ec0 337 }
Pokitto 5:56c4f2f12ec0 338 if( score < 1000 ){
Pokitto 5:56c4f2f12ec0 339 gb.display.print(0);
Pokitto 5:56c4f2f12ec0 340 }
Pokitto 5:56c4f2f12ec0 341 if( score < 100 ){
Pokitto 5:56c4f2f12ec0 342 gb.display.print(0);
Pokitto 5:56c4f2f12ec0 343 }
Pokitto 5:56c4f2f12ec0 344 if( score < 10 ){
Pokitto 5:56c4f2f12ec0 345 gb.display.print(0);
Pokitto 5:56c4f2f12ec0 346 }
Pokitto 5:56c4f2f12ec0 347 gb.display.print(score);
Pokitto 5:56c4f2f12ec0 348 }
Pokitto 5:56c4f2f12ec0 349
Pokitto 5:56c4f2f12ec0 350 void drawTargets(){
Pokitto 5:56c4f2f12ec0 351 gb.display.drawFastHLine(targetX-1,targetY,3);
wuuff 13:b133c46dbda7 352 gb.display.drawFastVLine(targetX,targetY-1,2);
Pokitto 5:56c4f2f12ec0 353
Pokitto 5:56c4f2f12ec0 354 for(uint8_t i = 0; i < MAX_PMISSILES; i++){
Pokitto 5:56c4f2f12ec0 355 //Check for a valid destination without a current detonation
wuuff 14:41173f26c0ef 356 if( pDests[i][0] <= WIDTH && pDetonations[i][0] > WIDTH ){
Pokitto 5:56c4f2f12ec0 357 gb.display.drawPixel(pDests[i][0], pDests[i][1]);
Pokitto 5:56c4f2f12ec0 358 }
Pokitto 5:56c4f2f12ec0 359 }
Pokitto 5:56c4f2f12ec0 360 }
Pokitto 5:56c4f2f12ec0 361
Pokitto 5:56c4f2f12ec0 362 void drawCities(){
wuuff 13:b133c46dbda7 363 gb.display.setColor(4);
Pokitto 5:56c4f2f12ec0 364 //uint8_t alldead = 1;
Pokitto 5:56c4f2f12ec0 365 for(uint8_t i = 0; i < 8; i++){
Pokitto 5:56c4f2f12ec0 366 if( i == 2 || i == 5 ){
Pokitto 5:56c4f2f12ec0 367 if( cities[i] ){
wuuff 14:41173f26c0ef 368 gb.display.drawBitmap(i*14+2,HEIGHT-8,launcher);
Pokitto 5:56c4f2f12ec0 369 }else{
wuuff 14:41173f26c0ef 370 gb.display.drawBitmap(i*14+2,HEIGHT-8,deadlauncher);
Pokitto 5:56c4f2f12ec0 371 }
Pokitto 5:56c4f2f12ec0 372 }else{
Pokitto 5:56c4f2f12ec0 373 if( cities[i] ){
Pokitto 5:56c4f2f12ec0 374 //alldead = 0;
wuuff 14:41173f26c0ef 375 gb.display.drawBitmap(i*14+2,HEIGHT-8,city);
Pokitto 5:56c4f2f12ec0 376 }else{
wuuff 14:41173f26c0ef 377 gb.display.drawBitmap(i*14+2,HEIGHT-8,deadcity);
Pokitto 5:56c4f2f12ec0 378 }
Pokitto 5:56c4f2f12ec0 379 }
Pokitto 5:56c4f2f12ec0 380 }
Pokitto 5:56c4f2f12ec0 381
wuuff 13:b133c46dbda7 382 gb.display.setColor(1);
Pokitto 5:56c4f2f12ec0 383 /*
Pokitto 5:56c4f2f12ec0 384 if( alldead ){
Pokitto 5:56c4f2f12ec0 385 gb.display.cursorX = 84/2 - 5*3;
Pokitto 5:56c4f2f12ec0 386 gb.display.cursorY = 48/2 - 5;
Pokitto 5:56c4f2f12ec0 387 gb.display.print("THE END");
Pokitto 5:56c4f2f12ec0 388 }
Pokitto 5:56c4f2f12ec0 389 */
Pokitto 5:56c4f2f12ec0 390 }
Pokitto 5:56c4f2f12ec0 391
Pokitto 5:56c4f2f12ec0 392 void drawAmmo(){
wuuff 13:b133c46dbda7 393 gb.display.setColor(3);
Pokitto 5:56c4f2f12ec0 394 for( uint8_t i = 0; i < 2; i++ ){
wuuff 14:41173f26c0ef 395 uint8_t xcoord = i == 0 ? 2*14 + 5 : 5*14 + 5;
wuuff 14:41173f26c0ef 396 uint8_t ycoord = HEIGHT-1;
Pokitto 5:56c4f2f12ec0 397 if( cities[i*3+2] ){ //Is launcher alive?
Pokitto 5:56c4f2f12ec0 398 for( uint8_t j = 0; j < pammo[i]; j++ ){
Pokitto 5:56c4f2f12ec0 399 gb.display.drawPixel(xcoord,ycoord);
Pokitto 5:56c4f2f12ec0 400 if( xcoord % 2 == 0 ){
Pokitto 5:56c4f2f12ec0 401 xcoord--;
Pokitto 5:56c4f2f12ec0 402 ycoord--;
Pokitto 5:56c4f2f12ec0 403 }else{
Pokitto 5:56c4f2f12ec0 404 xcoord++;
Pokitto 5:56c4f2f12ec0 405 }
Pokitto 5:56c4f2f12ec0 406 }
Pokitto 5:56c4f2f12ec0 407 }
Pokitto 5:56c4f2f12ec0 408 }
HomineLudens 6:22d706e5dd6e 409 gb.display.setColor(1);
Pokitto 5:56c4f2f12ec0 410 }
Pokitto 5:56c4f2f12ec0 411
Pokitto 5:56c4f2f12ec0 412 void drawMissiles(){
Pokitto 5:56c4f2f12ec0 413 //Player Missiles
wuuff 13:b133c46dbda7 414 gb.display.setColor(3);
Pokitto 5:56c4f2f12ec0 415 for(uint8_t i = 0; i < MAX_PMISSILES; i++){
Pokitto 5:56c4f2f12ec0 416 //Check for a valid destination without a current detonation
wuuff 14:41173f26c0ef 417 if( pDests[i][0] <= WIDTH && pDetonations[i][0] > WIDTH ){
Pokitto 5:56c4f2f12ec0 418 if(pMissiles[i][2] == LAUNCHER_ONE){
wuuff 14:41173f26c0ef 419 gb.display.drawLine(2*14 + 5,HEIGHT-8,pMissiles[i][0], pMissiles[i][1]);
Pokitto 5:56c4f2f12ec0 420 }else{
wuuff 14:41173f26c0ef 421 gb.display.drawLine(5*14 + 6,HEIGHT-8,pMissiles[i][0], pMissiles[i][1]);
Pokitto 5:56c4f2f12ec0 422 }
Pokitto 5:56c4f2f12ec0 423 }
Pokitto 5:56c4f2f12ec0 424 }
Pokitto 5:56c4f2f12ec0 425
Pokitto 5:56c4f2f12ec0 426 //Enemy Missiles
wuuff 13:b133c46dbda7 427 gb.display.setColor(7);
Pokitto 5:56c4f2f12ec0 428 for(uint8_t i = 0; i < MAX_EMISSILES; i++){
Pokitto 5:56c4f2f12ec0 429 //Check for a valid destination
wuuff 14:41173f26c0ef 430 if( eDests[i] <= WIDTH ){
Pokitto 5:56c4f2f12ec0 431 gb.display.drawLine(eMissiles[i][0],eMissiles[i][1],eMissiles[i][2], eMissiles[i][3]);
Pokitto 5:56c4f2f12ec0 432 }
Pokitto 5:56c4f2f12ec0 433 }
Pokitto 5:56c4f2f12ec0 434 gb.display.setColor(1);
Pokitto 5:56c4f2f12ec0 435 }
Pokitto 5:56c4f2f12ec0 436
wuuff 13:b133c46dbda7 437 uint8_t explosionColor = 0;
Pokitto 5:56c4f2f12ec0 438 void drawDetonations(){
wuuff 13:b133c46dbda7 439 gb.display.setColor(explosionColor+1);
wuuff 13:b133c46dbda7 440 if(counter%2 == 0){
wuuff 13:b133c46dbda7 441 explosionColor++;
wuuff 13:b133c46dbda7 442 explosionColor%=7;
wuuff 13:b133c46dbda7 443 }
Pokitto 5:56c4f2f12ec0 444 for(uint8_t i = 0; i < MAX_PMISSILES; i++){
wuuff 14:41173f26c0ef 445 if( pDetonations[i][0] <= WIDTH ){
wuuff 13:b133c46dbda7 446 gb.display.fillCircle(pDetonations[i][0],pDetonations[i][1],pDetonations[i][2]);
Pokitto 5:56c4f2f12ec0 447 }
Pokitto 5:56c4f2f12ec0 448 }
wuuff 13:b133c46dbda7 449 gb.display.setColor(1);
Pokitto 5:56c4f2f12ec0 450 }
Pokitto 5:56c4f2f12ec0 451
Pokitto 5:56c4f2f12ec0 452 void launchMissile(uint8_t launcher){
Pokitto 5:56c4f2f12ec0 453 //If there is no free slot in pDests, do not launch
Pokitto 5:56c4f2f12ec0 454 for(uint8_t i = 0; i < MAX_PMISSILES; i++){
wuuff 14:41173f26c0ef 455 if( pDests[i][0] > WIDTH ){
Pokitto 5:56c4f2f12ec0 456 // Which launcher? Alive? Has ammo?
Pokitto 5:56c4f2f12ec0 457 if(launcher == LAUNCHER_ONE && cities[2] && pammo[0]){
Pokitto 5:56c4f2f12ec0 458 pDests[i][0] = targetX;
Pokitto 5:56c4f2f12ec0 459 pDests[i][1] = targetY;
wuuff 14:41173f26c0ef 460 pMissiles[i][0] = 2*14 + 5; //X-coord of left launcher
Pokitto 5:56c4f2f12ec0 461 pMissiles[i][2] = LAUNCHER_ONE; //Launched from launcher one
Pokitto 5:56c4f2f12ec0 462 pammo[0]--;
Pokitto 5:56c4f2f12ec0 463 playSound(SOUND_PLAUNCH);
Pokitto 5:56c4f2f12ec0 464 }else if(launcher == LAUNCHER_TWO && cities[5] && pammo[1]){
Pokitto 5:56c4f2f12ec0 465 pDests[i][0] = targetX;
Pokitto 5:56c4f2f12ec0 466 pDests[i][1] = targetY;
wuuff 14:41173f26c0ef 467 pMissiles[i][0] = 5*14 + 6; //X-coord of right launcher
Pokitto 5:56c4f2f12ec0 468 pMissiles[i][2] = LAUNCHER_TWO; //Launched from launcher two
Pokitto 5:56c4f2f12ec0 469 pammo[1]--;
Pokitto 5:56c4f2f12ec0 470 playSound(SOUND_PLAUNCH);
Pokitto 5:56c4f2f12ec0 471 }
wuuff 14:41173f26c0ef 472 pMissiles[i][1] = HEIGHT-8; //Y-coord of both launchers
Pokitto 5:56c4f2f12ec0 473 break;
Pokitto 5:56c4f2f12ec0 474 }
Pokitto 5:56c4f2f12ec0 475 }
Pokitto 5:56c4f2f12ec0 476 }
Pokitto 5:56c4f2f12ec0 477
Pokitto 5:56c4f2f12ec0 478 void tryLaunchEnemy(){
Pokitto 5:56c4f2f12ec0 479 uint8_t someActive = 0;
Pokitto 5:56c4f2f12ec0 480
Pokitto 5:56c4f2f12ec0 481 if( etotal > 0 ){
Pokitto 5:56c4f2f12ec0 482
Pokitto 5:56c4f2f12ec0 483 // Check whether there are any active missiles
Pokitto 5:56c4f2f12ec0 484 // If none are active, always spawn one to avoid
Pokitto 5:56c4f2f12ec0 485 // long pauses without any enemy missiles
Pokitto 5:56c4f2f12ec0 486 for(uint8_t i = 0; i < MAX_EMISSILES; i++){
wuuff 14:41173f26c0ef 487 if( eDests[i] <= WIDTH ){
Pokitto 5:56c4f2f12ec0 488 someActive = 1;
Pokitto 5:56c4f2f12ec0 489 break;
Pokitto 5:56c4f2f12ec0 490 }
Pokitto 5:56c4f2f12ec0 491 }
Pokitto 5:56c4f2f12ec0 492
Pokitto 5:56c4f2f12ec0 493 if( (!someActive || echance >= random(100)) ){ //echance of 100
Pokitto 5:56c4f2f12ec0 494 for(uint8_t i = 0; i < MAX_EMISSILES; i++){
wuuff 14:41173f26c0ef 495 if( eDests[i] > WIDTH ){
Pokitto 5:56c4f2f12ec0 496 etotal--;
wuuff 13:b133c46dbda7 497 eDests[i] = random(7); //Target one of the 6 cities or 2 launch sites TODO: Come back later if random's behavior changes
wuuff 14:41173f26c0ef 498 eMissiles[i][0] = random(WIDTH); //Screen width //TODO: if random is supposed to be inclusive, add a -1
Pokitto 5:56c4f2f12ec0 499 eMissiles[i][1] = 0; //Top of screen
Pokitto 5:56c4f2f12ec0 500 eMissiles[i][2] = eMissiles[i][0]; //Start and end are same
Pokitto 5:56c4f2f12ec0 501 eMissiles[i][3] = 0; //Top of screen
Pokitto 5:56c4f2f12ec0 502 playSound(SOUND_ELAUNCH);
Pokitto 5:56c4f2f12ec0 503 break; //Only spawn one
Pokitto 5:56c4f2f12ec0 504 }
Pokitto 5:56c4f2f12ec0 505 }
Pokitto 5:56c4f2f12ec0 506 }
Pokitto 5:56c4f2f12ec0 507
Pokitto 5:56c4f2f12ec0 508 }
Pokitto 5:56c4f2f12ec0 509 }
Pokitto 5:56c4f2f12ec0 510
Pokitto 5:56c4f2f12ec0 511 void stepMissiles(){
Pokitto 5:56c4f2f12ec0 512 //Player Missiles
Pokitto 5:56c4f2f12ec0 513 for(uint8_t i = 0; i < MAX_PMISSILES; i++){
Pokitto 5:56c4f2f12ec0 514 //Check for a valid destination without a current detonation
wuuff 14:41173f26c0ef 515 if( pDests[i][0] <= WIDTH && pDetonations[i][0] > WIDTH ){
Pokitto 5:56c4f2f12ec0 516 //If the missile is close enough to the destination, detonate
Pokitto 5:56c4f2f12ec0 517 if( abs( pDests[i][0] - pMissiles[i][0] ) < PSPEED && abs( pDests[i][1] - pMissiles[i][1] ) < PSPEED ){
Pokitto 5:56c4f2f12ec0 518 pDetonations[i][0] = pDests[i][0];
Pokitto 5:56c4f2f12ec0 519 pDetonations[i][1] = pDests[i][1];
Pokitto 5:56c4f2f12ec0 520 pDetonations[i][2] = 0; //Start detonation at radius of 0
Pokitto 5:56c4f2f12ec0 521 pDetonations[i][3] = EXPAND; //Detonation is increasing in size
Pokitto 5:56c4f2f12ec0 522 //Otherwise, keep moving towards destination
Pokitto 5:56c4f2f12ec0 523 }else{
Pokitto 5:56c4f2f12ec0 524 float dir = atan2(pDests[i][1]-pMissiles[i][1], pDests[i][0]-pMissiles[i][0]);
Pokitto 5:56c4f2f12ec0 525 pMissiles[i][0] += PSPEED * cos(dir);
Pokitto 5:56c4f2f12ec0 526 pMissiles[i][1] += PSPEED * sin(dir);
Pokitto 5:56c4f2f12ec0 527 }
Pokitto 5:56c4f2f12ec0 528 }
Pokitto 5:56c4f2f12ec0 529 }
Pokitto 5:56c4f2f12ec0 530
Pokitto 5:56c4f2f12ec0 531 //Enemy Missiles
Pokitto 5:56c4f2f12ec0 532 for(uint8_t i = 0; i < MAX_EMISSILES; i++){
Pokitto 5:56c4f2f12ec0 533 //Check for a valid destination
wuuff 14:41173f26c0ef 534 if( eDests[i] <= WIDTH ){
Pokitto 5:56c4f2f12ec0 535 //If enemy missile is close enough to the destination, detonate
wuuff 14:41173f26c0ef 536 if( abs( (eDests[i]*14+6) - eMissiles[i][2] ) < PSPEED && abs( HEIGHT-4 - eMissiles[i][3] ) < PSPEED ){
Pokitto 5:56c4f2f12ec0 537 cities[eDests[i]] = 0; //Destroy city/launcher
Pokitto 5:56c4f2f12ec0 538
Pokitto 5:56c4f2f12ec0 539 //If launcher, remove its ammo
Pokitto 5:56c4f2f12ec0 540 if( eDests[i] == 2 ){
Pokitto 5:56c4f2f12ec0 541 pammo[0] = 0;
Pokitto 5:56c4f2f12ec0 542 }
Pokitto 5:56c4f2f12ec0 543 if( eDests[i] == 5 ){
Pokitto 5:56c4f2f12ec0 544 pammo[1] = 0;
Pokitto 5:56c4f2f12ec0 545 }
Pokitto 5:56c4f2f12ec0 546
wuuff 14:41173f26c0ef 547 eDests[i] = 127; //Reset enemy missile
Pokitto 5:56c4f2f12ec0 548 playSound(SOUND_DEAD);
Pokitto 5:56c4f2f12ec0 549 //Otherwise, keep moving towards destination
Pokitto 5:56c4f2f12ec0 550 }else{
wuuff 14:41173f26c0ef 551 float dir = atan2( HEIGHT-4 - eMissiles[i][3], (eDests[i]*14+6)-eMissiles[i][2] );
Pokitto 5:56c4f2f12ec0 552 eMissiles[i][2] += espeed * cos(dir);
Pokitto 5:56c4f2f12ec0 553 eMissiles[i][3] += espeed * sin(dir);
Pokitto 5:56c4f2f12ec0 554 }
Pokitto 5:56c4f2f12ec0 555 }
Pokitto 5:56c4f2f12ec0 556 }
Pokitto 5:56c4f2f12ec0 557 }
Pokitto 5:56c4f2f12ec0 558
Pokitto 5:56c4f2f12ec0 559 void stepDetonations(){
Pokitto 5:56c4f2f12ec0 560 if( counter%2 == 0 ){
Pokitto 5:56c4f2f12ec0 561 for(uint8_t i = 0; i < MAX_PMISSILES; i++){
wuuff 14:41173f26c0ef 562 if( pDetonations[i][0] <= WIDTH ){
Pokitto 5:56c4f2f12ec0 563 if( pDetonations[i][3] == EXPAND ){ //If detonation is expanding
Pokitto 5:56c4f2f12ec0 564 if( pDetonations[i][2] < PRADIUS ){
Pokitto 5:56c4f2f12ec0 565 pDetonations[i][2]++;
Pokitto 5:56c4f2f12ec0 566 }else{
Pokitto 5:56c4f2f12ec0 567 pDetonations[i][3] = SHRINK; //Start shrinking
Pokitto 5:56c4f2f12ec0 568 }
Pokitto 5:56c4f2f12ec0 569 }
Pokitto 5:56c4f2f12ec0 570 //Check this now instead of using else because it may have just
Pokitto 5:56c4f2f12ec0 571 //set to SHRINK; immediately checking will remove a delay at full
Pokitto 5:56c4f2f12ec0 572 //size. If a delay is desired, this if can be switched to an else.
Pokitto 5:56c4f2f12ec0 573 if( pDetonations[i][3] == SHRINK ){ //If detonation is shrinking
Pokitto 5:56c4f2f12ec0 574 if( pDetonations[i][2] > 0 ){
Pokitto 5:56c4f2f12ec0 575 pDetonations[i][2]--;
Pokitto 5:56c4f2f12ec0 576 }else{
wuuff 14:41173f26c0ef 577 pDetonations[i][0] = 127; //Detonation is complete, remove it
wuuff 14:41173f26c0ef 578 pDests[i][0] = 127; //Remove this destination
Pokitto 5:56c4f2f12ec0 579 }
Pokitto 5:56c4f2f12ec0 580 }
Pokitto 5:56c4f2f12ec0 581 }
Pokitto 5:56c4f2f12ec0 582 }
Pokitto 5:56c4f2f12ec0 583 }
Pokitto 5:56c4f2f12ec0 584 }
Pokitto 5:56c4f2f12ec0 585
Pokitto 5:56c4f2f12ec0 586 void stepCollision(){
Pokitto 5:56c4f2f12ec0 587 //Player Detonations with Enemy Missiles
Pokitto 5:56c4f2f12ec0 588 for(uint8_t i = 0; i < MAX_PMISSILES; i++){
wuuff 14:41173f26c0ef 589 if( pDetonations[i][0] <= WIDTH ){
Pokitto 5:56c4f2f12ec0 590 for(uint8_t j = 0; j < MAX_EMISSILES; j++){
wuuff 14:41173f26c0ef 591 //Add extra +1 to explosion radius so that collisions are more generous
wuuff 14:41173f26c0ef 592 if( eDests[j] <= WIDTH && pDetonations[i][2] + 1 >= sqrt( (eMissiles[j][2]-pDetonations[i][0])*(eMissiles[j][2]-pDetonations[i][0]) + (eMissiles[j][3]-pDetonations[i][1])*(eMissiles[j][3]-pDetonations[i][1]) ) ){
wuuff 14:41173f26c0ef 593 eDests[j] = 127; //Remove enemy missile
Pokitto 5:56c4f2f12ec0 594 score+=25;
Pokitto 5:56c4f2f12ec0 595 playSound(SOUND_DETONATE);
Pokitto 5:56c4f2f12ec0 596 }
Pokitto 5:56c4f2f12ec0 597 }
Pokitto 5:56c4f2f12ec0 598 }
Pokitto 5:56c4f2f12ec0 599 }
Pokitto 5:56c4f2f12ec0 600 }
Pokitto 5:56c4f2f12ec0 601
Pokitto 5:56c4f2f12ec0 602
Pokitto 5:56c4f2f12ec0 603 void checkMenu(){
Pokitto 5:56c4f2f12ec0 604 if( gb.buttons.pressed(BTN_C) ){
wuuff 14:41173f26c0ef 605 doTitle(1);
Pokitto 5:56c4f2f12ec0 606 }
Pokitto 5:56c4f2f12ec0 607 }
Pokitto 5:56c4f2f12ec0 608
Pokitto 5:56c4f2f12ec0 609 void checkWin(){
Pokitto 5:56c4f2f12ec0 610 if( etotal == 0 ){
Pokitto 5:56c4f2f12ec0 611 for(uint8_t i = 0; i < MAX_EMISSILES; i++){
Pokitto 5:56c4f2f12ec0 612 //Check for a valid destination
wuuff 14:41173f26c0ef 613 if( eDests[i] <= WIDTH ){
Pokitto 5:56c4f2f12ec0 614 return;
Pokitto 5:56c4f2f12ec0 615 }
Pokitto 5:56c4f2f12ec0 616 }
Pokitto 5:56c4f2f12ec0 617 //If we get here, all enemy missiles are destroyed and they have no more
Pokitto 5:56c4f2f12ec0 618 nextLull();
Pokitto 5:56c4f2f12ec0 619 mode = MODE_LULL;
Pokitto 5:56c4f2f12ec0 620 }
Pokitto 5:56c4f2f12ec0 621 }
Pokitto 5:56c4f2f12ec0 622
Pokitto 5:56c4f2f12ec0 623 void checkLose(){
Pokitto 5:56c4f2f12ec0 624 for(uint8_t i = 0; i < 8; i++){
Pokitto 5:56c4f2f12ec0 625 if( i != 2 && i != 5 ){
Pokitto 5:56c4f2f12ec0 626 if( cities[i] ){
Pokitto 5:56c4f2f12ec0 627 return; // A city remains alive
Pokitto 5:56c4f2f12ec0 628 }
Pokitto 5:56c4f2f12ec0 629 }
Pokitto 5:56c4f2f12ec0 630 }
Pokitto 5:56c4f2f12ec0 631 //If we get here, all cities are dead. It is the end of days.
Pokitto 5:56c4f2f12ec0 632 counter = 0;
Pokitto 5:56c4f2f12ec0 633 mode = MODE_DEAD;
Pokitto 5:56c4f2f12ec0 634 playSound(SOUND_LOSE);
Pokitto 5:56c4f2f12ec0 635 }
Pokitto 5:56c4f2f12ec0 636
Pokitto 5:56c4f2f12ec0 637 void stepGame(){
Pokitto 5:56c4f2f12ec0 638 //Player input
Pokitto 5:56c4f2f12ec0 639 if( gb.buttons.pressed(BTN_A) ){
HomineLudens 6:22d706e5dd6e 640 launchMissile(LAUNCHER_TWO);
Pokitto 5:56c4f2f12ec0 641 }
Pokitto 5:56c4f2f12ec0 642 if( gb.buttons.pressed(BTN_B) ){
HomineLudens 6:22d706e5dd6e 643 launchMissile(LAUNCHER_ONE);
Pokitto 5:56c4f2f12ec0 644 }
Pokitto 5:56c4f2f12ec0 645
Pokitto 5:56c4f2f12ec0 646 if( gb.buttons.repeat(BTN_LEFT,1) ){
Pokitto 5:56c4f2f12ec0 647 targetX = targetX-TARGET_SPEED > 0 ? targetX-TARGET_SPEED : 0;
Pokitto 5:56c4f2f12ec0 648 }
Pokitto 5:56c4f2f12ec0 649 if( gb.buttons.repeat(BTN_RIGHT,1) ){
wuuff 14:41173f26c0ef 650 targetX = targetX+TARGET_SPEED < WIDTH ? targetX+TARGET_SPEED : WIDTH;
Pokitto 5:56c4f2f12ec0 651 }
Pokitto 5:56c4f2f12ec0 652 if( gb.buttons.repeat(BTN_UP,1) ){
Pokitto 5:56c4f2f12ec0 653 targetY = targetY-TARGET_SPEED > 0 ? targetY-TARGET_SPEED : 0;
Pokitto 5:56c4f2f12ec0 654 }
Pokitto 5:56c4f2f12ec0 655 if( gb.buttons.repeat(BTN_DOWN,1) ){
wuuff 14:41173f26c0ef 656 targetY = targetY+TARGET_SPEED < HEIGHT ? targetY+TARGET_SPEED : HEIGHT;
Pokitto 5:56c4f2f12ec0 657 }
Pokitto 5:56c4f2f12ec0 658
Pokitto 5:56c4f2f12ec0 659 //Game logic
Pokitto 5:56c4f2f12ec0 660 tryLaunchEnemy();
Pokitto 5:56c4f2f12ec0 661 stepMissiles();
Pokitto 5:56c4f2f12ec0 662 stepDetonations();
Pokitto 5:56c4f2f12ec0 663 stepCollision();
Pokitto 5:56c4f2f12ec0 664
Pokitto 5:56c4f2f12ec0 665 //Drawing
Pokitto 5:56c4f2f12ec0 666 drawScore();
Pokitto 5:56c4f2f12ec0 667 drawTargets();
Pokitto 5:56c4f2f12ec0 668 drawCities();
Pokitto 5:56c4f2f12ec0 669 drawAmmo();
Pokitto 5:56c4f2f12ec0 670 drawMissiles();
Pokitto 5:56c4f2f12ec0 671 drawDetonations();
Pokitto 5:56c4f2f12ec0 672
Pokitto 5:56c4f2f12ec0 673 checkWin();
Pokitto 5:56c4f2f12ec0 674 checkLose();
Pokitto 5:56c4f2f12ec0 675 }
Pokitto 5:56c4f2f12ec0 676
Pokitto 5:56c4f2f12ec0 677 void drawLull(){
wuuff 13:b133c46dbda7 678 uint32_t cityCount = 0;
wuuff 14:41173f26c0ef 679 gb.display.cursorX = WIDTH/2 - TEXT_WIDTH*6;
wuuff 14:41173f26c0ef 680 gb.display.cursorY = HEIGHT/2 - TEXT_HEIGHT*3;
Pokitto 5:56c4f2f12ec0 681 gb.display.print(("BONUS POINTS"));
Pokitto 5:56c4f2f12ec0 682
wuuff 14:41173f26c0ef 683 gb.display.cursorX = WIDTH/2 - TEXT_WIDTH*8;
wuuff 14:41173f26c0ef 684 gb.display.cursorY += TEXT_HEIGHT*2;
Pokitto 5:56c4f2f12ec0 685 gb.display.print(lullMissiles);
Pokitto 5:56c4f2f12ec0 686
wuuff 13:b133c46dbda7 687 gb.display.setColor(3);
Pokitto 5:56c4f2f12ec0 688 for(uint8_t i = 0; i < lullMissiles; i++){
wuuff 14:41173f26c0ef 689 gb.display.drawPixel(WIDTH/2 - TEXT_WIDTH*6 + i*2,HEIGHT/2 - 3);
Pokitto 5:56c4f2f12ec0 690 }
Pokitto 5:56c4f2f12ec0 691
wuuff 13:b133c46dbda7 692 gb.display.setColor(1);
wuuff 14:41173f26c0ef 693 gb.display.cursorX = WIDTH/2 - TEXT_WIDTH*8;
wuuff 14:41173f26c0ef 694 gb.display.cursorY += TEXT_HEIGHT*2;
wuuff 13:b133c46dbda7 695 for( uint8_t i = 0; i < 8; i++ ){
Pokitto 5:56c4f2f12ec0 696 if( lullCities[i] ) cityCount++;
Pokitto 5:56c4f2f12ec0 697 }
Pokitto 5:56c4f2f12ec0 698 gb.display.print(cityCount);
Pokitto 5:56c4f2f12ec0 699
wuuff 13:b133c46dbda7 700 gb.display.setColor(4);
Pokitto 5:56c4f2f12ec0 701 for(uint8_t i = 0; i < cityCount; i++){
wuuff 14:41173f26c0ef 702 gb.display.drawBitmap(WIDTH/2 - TEXT_WIDTH*6 + i*9,HEIGHT/2+2, city);
Pokitto 5:56c4f2f12ec0 703 }
Pokitto 5:56c4f2f12ec0 704
wuuff 13:b133c46dbda7 705 gb.display.setColor(1);
Pokitto 5:56c4f2f12ec0 706 drawScore();
Pokitto 5:56c4f2f12ec0 707 drawCities();
Pokitto 5:56c4f2f12ec0 708 drawAmmo();
Pokitto 5:56c4f2f12ec0 709 }
Pokitto 5:56c4f2f12ec0 710
Pokitto 5:56c4f2f12ec0 711 void stepLull(){
Pokitto 5:56c4f2f12ec0 712
Pokitto 5:56c4f2f12ec0 713 if( counter % 4 == 0 && (pammo[0] > 0 || pammo[1] > 0) ){
Pokitto 5:56c4f2f12ec0 714 lullMissiles++;
Pokitto 5:56c4f2f12ec0 715 score+=10;
Pokitto 5:56c4f2f12ec0 716 if( pammo[0] > 0 ) pammo[0]--;
Pokitto 5:56c4f2f12ec0 717 else pammo[1]--;
Pokitto 5:56c4f2f12ec0 718 playSound(SOUND_SCORE);
Pokitto 5:56c4f2f12ec0 719 }
Pokitto 5:56c4f2f12ec0 720
Pokitto 5:56c4f2f12ec0 721 //If we have already iterated through the missiles
Pokitto 5:56c4f2f12ec0 722 if( counter % 8 == 0 && pammo[0] == 0 && pammo[1] == 0 ){
Pokitto 5:56c4f2f12ec0 723 for( uint8_t i = 0; i < 9; i++ ){
Pokitto 5:56c4f2f12ec0 724 if( i == 8 ){ //We have iterated through all live cities
Pokitto 5:56c4f2f12ec0 725 nextStage();
Pokitto 5:56c4f2f12ec0 726 mode = MODE_GAME;
Pokitto 5:56c4f2f12ec0 727 return;
Pokitto 5:56c4f2f12ec0 728 }
Pokitto 5:56c4f2f12ec0 729 //If not a launcher and the city is alive
Pokitto 5:56c4f2f12ec0 730 if( i != 2 && i != 5 && cities[i] != 0 ){
Pokitto 5:56c4f2f12ec0 731 lullCities[i] = 1;
Pokitto 5:56c4f2f12ec0 732 score+=100;
Pokitto 5:56c4f2f12ec0 733 cities[i] = 0;
Pokitto 5:56c4f2f12ec0 734 playSound(SOUND_SCORE);
Pokitto 5:56c4f2f12ec0 735 break;
Pokitto 5:56c4f2f12ec0 736 }
Pokitto 5:56c4f2f12ec0 737 }
Pokitto 5:56c4f2f12ec0 738 }
Pokitto 5:56c4f2f12ec0 739
Pokitto 5:56c4f2f12ec0 740 drawLull();
Pokitto 5:56c4f2f12ec0 741 }
Pokitto 5:56c4f2f12ec0 742
Pokitto 5:56c4f2f12ec0 743 void stepDead(){
wuuff 14:41173f26c0ef 744 gb.display.setColor(7);
wuuff 14:41173f26c0ef 745 gb.display.cursorX = WIDTH/2 - TEXT_WIDTH*3 - TEXT_WIDTH/2;;
wuuff 14:41173f26c0ef 746 gb.display.cursorY = HEIGHT/2 - TEXT_HEIGHT;
Pokitto 5:56c4f2f12ec0 747 gb.display.print(("THE END"));
wuuff 14:41173f26c0ef 748 gb.display.setColor(1);
Pokitto 5:56c4f2f12ec0 749
Pokitto 5:56c4f2f12ec0 750 if( mode == MODE_DEAD && counter%20 == 0 ){
Pokitto 5:56c4f2f12ec0 751 mode = MODE_POSTDEAD;
Pokitto 5:56c4f2f12ec0 752 }else if( mode == MODE_POSTDEAD ){
Pokitto 5:56c4f2f12ec0 753 if( counter%8 == 0 ){
Pokitto 5:56c4f2f12ec0 754 flash ^= 255;
Pokitto 5:56c4f2f12ec0 755 }
Pokitto 5:56c4f2f12ec0 756 if( flash ){
wuuff 14:41173f26c0ef 757 gb.display.setColor(4);
wuuff 14:41173f26c0ef 758 gb.display.cursorX = WIDTH/2 - TEXT_WIDTH*3 - TEXT_WIDTH/2;
wuuff 14:41173f26c0ef 759 gb.display.cursorY = HEIGHT - TEXT_HEIGHT*2;
Pokitto 5:56c4f2f12ec0 760 gb.display.print(("PRESS \25"));
Pokitto 5:56c4f2f12ec0 761
Pokitto 5:56c4f2f12ec0 762 if( isHighscore(score) ){
wuuff 14:41173f26c0ef 763 gb.display.cursorX = WIDTH/2 - TEXT_WIDTH*6 - TEXT_WIDTH/2;
wuuff 14:41173f26c0ef 764 gb.display.cursorY = HEIGHT - TEXT_HEIGHT*3;
Pokitto 5:56c4f2f12ec0 765 gb.display.print(("NEW HIGHSCORE"));
Pokitto 5:56c4f2f12ec0 766 }
wuuff 14:41173f26c0ef 767 gb.display.setColor(1);
Pokitto 5:56c4f2f12ec0 768 }
Pokitto 5:56c4f2f12ec0 769
Pokitto 5:56c4f2f12ec0 770 if( gb.buttons.pressed(BTN_A) ){
Pokitto 5:56c4f2f12ec0 771 if( isHighscore(score) ){
wuuff 14:41173f26c0ef 772 char tmp_name[11] = "User";
Pokitto 5:56c4f2f12ec0 773 //gb.getDefaultName(tmp_name);
Pokitto 5:56c4f2f12ec0 774 gb.keyboard(tmp_name, 11);
wuuff 14:41173f26c0ef 775 saveHighscore(score,tmp_name);
Pokitto 5:56c4f2f12ec0 776 }
Pokitto 5:56c4f2f12ec0 777 score = 0;
Pokitto 5:56c4f2f12ec0 778 mode = MODE_PREGAME;
Pokitto 5:56c4f2f12ec0 779 }
Pokitto 5:56c4f2f12ec0 780 }
Pokitto 5:56c4f2f12ec0 781 }
Pokitto 5:56c4f2f12ec0 782
Pokitto 5:56c4f2f12ec0 783 void stepPregame(){
Pokitto 5:56c4f2f12ec0 784 drawHighscores();
Pokitto 5:56c4f2f12ec0 785
Pokitto 5:56c4f2f12ec0 786 if( counter%8 == 0 ){
Pokitto 5:56c4f2f12ec0 787 flash ^= 255;
Pokitto 5:56c4f2f12ec0 788 }
Pokitto 5:56c4f2f12ec0 789 if( flash ){
wuuff 14:41173f26c0ef 790 gb.display.setColor(4);
wuuff 14:41173f26c0ef 791 gb.display.cursorX = WIDTH/2 - TEXT_WIDTH*3;
wuuff 14:41173f26c0ef 792 gb.display.cursorY = HEIGHT - TEXT_HEIGHT*2;
Pokitto 5:56c4f2f12ec0 793 gb.display.print(("PRESS \25"));
wuuff 14:41173f26c0ef 794 gb.display.setColor(1);
Pokitto 5:56c4f2f12ec0 795 }
Pokitto 5:56c4f2f12ec0 796
Pokitto 5:56c4f2f12ec0 797 if( gb.buttons.pressed(BTN_A) ){
Pokitto 5:56c4f2f12ec0 798 stage = 255;
Pokitto 5:56c4f2f12ec0 799 for( uint8_t i = 0; i < 8; i++ ){
Pokitto 5:56c4f2f12ec0 800 lullCities[i] = 1;
Pokitto 5:56c4f2f12ec0 801 }
Pokitto 5:56c4f2f12ec0 802 nextStage(); //Reset to stage 0
Pokitto 5:56c4f2f12ec0 803 mode = MODE_GAME;
Pokitto 5:56c4f2f12ec0 804 }
Pokitto 5:56c4f2f12ec0 805 }
Pokitto 5:56c4f2f12ec0 806
Pokitto 5:56c4f2f12ec0 807 void loop() {
Pokitto 5:56c4f2f12ec0 808 if(gb.update()){
Pokitto 5:56c4f2f12ec0 809
Pokitto 5:56c4f2f12ec0 810 switch( mode ){
Pokitto 5:56c4f2f12ec0 811 case MODE_GAME:
Pokitto 5:56c4f2f12ec0 812 stepGame();
Pokitto 5:56c4f2f12ec0 813 break;
Pokitto 5:56c4f2f12ec0 814
Pokitto 5:56c4f2f12ec0 815 case MODE_LULL:
Pokitto 5:56c4f2f12ec0 816 stepLull();
Pokitto 5:56c4f2f12ec0 817 break;
Pokitto 5:56c4f2f12ec0 818
Pokitto 5:56c4f2f12ec0 819 case MODE_DEAD:
Pokitto 5:56c4f2f12ec0 820 case MODE_POSTDEAD:
Pokitto 5:56c4f2f12ec0 821 stepDead();
Pokitto 5:56c4f2f12ec0 822 break;
Pokitto 5:56c4f2f12ec0 823
Pokitto 5:56c4f2f12ec0 824 case MODE_PREGAME:
Pokitto 5:56c4f2f12ec0 825 stepPregame();
Pokitto 5:56c4f2f12ec0 826 break;
Pokitto 5:56c4f2f12ec0 827 }
Pokitto 5:56c4f2f12ec0 828
Pokitto 5:56c4f2f12ec0 829 checkMenu();
Pokitto 5:56c4f2f12ec0 830
Pokitto 5:56c4f2f12ec0 831 counter++;
Pokitto 5:56c4f2f12ec0 832 }
Pokitto 5:56c4f2f12ec0 833 }
Pokitto 5:56c4f2f12ec0 834 #define NUM_HIGHSCORES 5
Pokitto 5:56c4f2f12ec0 835 #define NAME_SIZE 10
Pokitto 5:56c4f2f12ec0 836 #define ENTRY_SIZE 15
Pokitto 5:56c4f2f12ec0 837
wuuff 14:41173f26c0ef 838 uint32_t highscores[NUM_HIGHSCORES] = {10000,7000,5000,4000,2000};
wuuff 14:41173f26c0ef 839 char names[NUM_HIGHSCORES][NAME_SIZE+1] = {"Crack Shot", "Defender", "Gunner", "We Tried", "No Hope"};
Pokitto 5:56c4f2f12ec0 840
Pokitto 5:56c4f2f12ec0 841 void loadHighscores(){
Pokitto 5:56c4f2f12ec0 842 for( uint8_t entry = 0; entry < NUM_HIGHSCORES; entry++ ){
Pokitto 5:56c4f2f12ec0 843 for( uint8_t offset = 0; offset < ENTRY_SIZE; offset++ ){
Pokitto 5:56c4f2f12ec0 844 if( offset < NAME_SIZE ){
wuuff 15:933ac6bcd8b8 845 names[entry][offset] = EEPROM.read( ENTRY_SIZE * entry + offset );
Pokitto 5:56c4f2f12ec0 846 }else{
Pokitto 5:56c4f2f12ec0 847 uint8_t* addr = (uint8_t*) &highscores[entry];
Pokitto 5:56c4f2f12ec0 848 addr+=offset-NAME_SIZE;
wuuff 15:933ac6bcd8b8 849 *addr = EEPROM.read( ENTRY_SIZE * entry + offset );
Pokitto 5:56c4f2f12ec0 850 }
Pokitto 5:56c4f2f12ec0 851 }
Pokitto 5:56c4f2f12ec0 852 }
Pokitto 5:56c4f2f12ec0 853 }
Pokitto 5:56c4f2f12ec0 854
Pokitto 5:56c4f2f12ec0 855 uint8_t isHighscore(uint32_t score){
Pokitto 5:56c4f2f12ec0 856 if( score > highscores[NUM_HIGHSCORES-1] ){
Pokitto 5:56c4f2f12ec0 857 return 1;
Pokitto 5:56c4f2f12ec0 858 }
Pokitto 5:56c4f2f12ec0 859 return 0;
Pokitto 5:56c4f2f12ec0 860 }
Pokitto 5:56c4f2f12ec0 861
Pokitto 5:56c4f2f12ec0 862 void saveHighscore(uint32_t score, char* who){
Pokitto 5:56c4f2f12ec0 863 uint8_t found = 0;
Pokitto 5:56c4f2f12ec0 864 uint32_t tmp_score = 0;
Pokitto 5:56c4f2f12ec0 865 char tmp_name[10];
Pokitto 5:56c4f2f12ec0 866 for( uint8_t entry = 0; entry < NUM_HIGHSCORES; entry++ ){
Pokitto 5:56c4f2f12ec0 867 if( score > highscores[entry] ){
Pokitto 5:56c4f2f12ec0 868 found = 1;
Pokitto 5:56c4f2f12ec0 869 }
Pokitto 5:56c4f2f12ec0 870 if( found ){
Pokitto 5:56c4f2f12ec0 871 tmp_score = highscores[entry];
Pokitto 5:56c4f2f12ec0 872 strcpy(tmp_name,names[entry]);
Pokitto 5:56c4f2f12ec0 873
Pokitto 5:56c4f2f12ec0 874 highscores[entry] = score;
Pokitto 5:56c4f2f12ec0 875 strcpy(names[entry], who);
Pokitto 5:56c4f2f12ec0 876
Pokitto 5:56c4f2f12ec0 877 score = tmp_score;
Pokitto 5:56c4f2f12ec0 878 strcpy(who, tmp_name);
Pokitto 5:56c4f2f12ec0 879 }
Pokitto 5:56c4f2f12ec0 880 }
Pokitto 5:56c4f2f12ec0 881 for( uint8_t entry = 0; entry < NUM_HIGHSCORES; entry++ ){
Pokitto 5:56c4f2f12ec0 882 for( uint8_t offset = 0; offset < ENTRY_SIZE; offset++ ){
Pokitto 5:56c4f2f12ec0 883 if( offset < NAME_SIZE ){
wuuff 15:933ac6bcd8b8 884 EEPROM.write( ENTRY_SIZE * entry + offset, names[entry][offset] );
Pokitto 5:56c4f2f12ec0 885 }else{
Pokitto 5:56c4f2f12ec0 886 uint8_t* addr = (uint8_t*) &highscores[entry];
Pokitto 5:56c4f2f12ec0 887 addr+=offset-NAME_SIZE;
wuuff 15:933ac6bcd8b8 888 EEPROM.write( ENTRY_SIZE * entry + offset, *addr );
Pokitto 5:56c4f2f12ec0 889 }
Pokitto 5:56c4f2f12ec0 890 }
Pokitto 5:56c4f2f12ec0 891 }
Pokitto 5:56c4f2f12ec0 892 }
Pokitto 5:56c4f2f12ec0 893
Pokitto 5:56c4f2f12ec0 894 void drawHighscores(){
wuuff 14:41173f26c0ef 895 gb.display.setColor(4);
wuuff 14:41173f26c0ef 896 gb.display.cursorX = WIDTH/2 - TEXT_WIDTH*5;
wuuff 14:41173f26c0ef 897 gb.display.cursorY = TEXT_HEIGHT;
Pokitto 5:56c4f2f12ec0 898 gb.display.print(("HIGHSCORES"));
wuuff 14:41173f26c0ef 899 gb.display.setColor(1);
Pokitto 5:56c4f2f12ec0 900
Pokitto 5:56c4f2f12ec0 901 for( uint8_t entry = 0; entry < NUM_HIGHSCORES; entry++ ){
wuuff 14:41173f26c0ef 902 gb.display.cursorX = 0;
wuuff 14:41173f26c0ef 903 gb.display.cursorY = TEXT_HEIGHT*3 + TEXT_HEIGHT*entry;
Pokitto 5:56c4f2f12ec0 904 gb.display.print(names[entry]);
wuuff 14:41173f26c0ef 905 gb.display.cursorX = WIDTH - TEXT_WIDTH*6;
Pokitto 5:56c4f2f12ec0 906 if( highscores[entry] < 100000 ){
Pokitto 5:56c4f2f12ec0 907 gb.display.print(0);
Pokitto 5:56c4f2f12ec0 908 }
Pokitto 5:56c4f2f12ec0 909 if( highscores[entry] < 10000 ){
Pokitto 5:56c4f2f12ec0 910 gb.display.print(0);
Pokitto 5:56c4f2f12ec0 911 }
Pokitto 5:56c4f2f12ec0 912 if( highscores[entry] < 1000 ){
Pokitto 5:56c4f2f12ec0 913 gb.display.print(0);
Pokitto 5:56c4f2f12ec0 914 }
Pokitto 5:56c4f2f12ec0 915 if( highscores[entry] < 100 ){
Pokitto 5:56c4f2f12ec0 916 gb.display.print(0);
Pokitto 5:56c4f2f12ec0 917 }
Pokitto 5:56c4f2f12ec0 918 if( highscores[entry] < 10 ){
Pokitto 5:56c4f2f12ec0 919 gb.display.print(0);
Pokitto 5:56c4f2f12ec0 920 }
Pokitto 5:56c4f2f12ec0 921 gb.display.print(highscores[entry]);
Pokitto 5:56c4f2f12ec0 922 }
Pokitto 5:56c4f2f12ec0 923 }
Pokitto 5:56c4f2f12ec0 924
Pokitto 5:56c4f2f12ec0 925 // Wave, pitch, duration, arpeggio step duration, arpeggio step size
Pokitto 5:56c4f2f12ec0 926 const int8_t sounds[][5] = {
Pokitto 5:56c4f2f12ec0 927 { 0, 20, 5, 1, 1 }, //Player launch
Pokitto 5:56c4f2f12ec0 928 { 0, 25, 5, 1, -1 }, //Enemy launch
Pokitto 5:56c4f2f12ec0 929 { 1, 10, 5, 1, -1 }, //Detonating enemy missile
Pokitto 5:56c4f2f12ec0 930 { 1, 10, 2, 0, 0 }, //Score pips
Pokitto 5:56c4f2f12ec0 931 { 1, 2, 10, 1, -1 }, //A city dies
Pokitto 5:56c4f2f12ec0 932 { 0, 20, 14, 3, -1 }, //Lose
Pokitto 5:56c4f2f12ec0 933 };
Pokitto 5:56c4f2f12ec0 934
Pokitto 5:56c4f2f12ec0 935 void initSound(){
Pokitto 5:56c4f2f12ec0 936 gb.sound.command(CMD_VOLUME, 5, 0, 0);
Pokitto 5:56c4f2f12ec0 937 gb.sound.command(CMD_SLIDE, 0, 0, 0);
Pokitto 5:56c4f2f12ec0 938 }
Pokitto 5:56c4f2f12ec0 939
Pokitto 5:56c4f2f12ec0 940 void playSound(uint8_t i){
Pokitto 5:56c4f2f12ec0 941 gb.sound.command(CMD_VOLUME, 5, 0, 0);
Pokitto 5:56c4f2f12ec0 942 gb.sound.command(CMD_SLIDE, 0, 0, 0);
Pokitto 5:56c4f2f12ec0 943 gb.sound.command(CMD_ARPEGGIO, sounds[i][3], sounds[i][4], 0);
Pokitto 5:56c4f2f12ec0 944 gb.sound.command(CMD_INSTRUMENT, sounds[i][0], 0, 0);
Pokitto 5:56c4f2f12ec0 945 gb.sound.playNote(sounds[i][1], sounds[i][2], 0);
Pokitto 5:56c4f2f12ec0 946
Pokitto 5:56c4f2f12ec0 947 //gb.sound.playNote(20, 5, 0);
Pokitto 5:56c4f2f12ec0 948 }
Pokitto 5:56c4f2f12ec0 949
Pokitto 5:56c4f2f12ec0 950