Pokitto turn based strategy game.

Dependencies:   PokittoLib

Committer:
trelemar
Date:
Sat Dec 09 20:49:10 2017 +0000
Revision:
2:af768faf5329
Parent:
1:189e78ff65b1
current vorking stuff. all day to code still.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
trelemar 0:86d8ece873ca 1 #include "Pokitto.h"
trelemar 1:189e78ff65b1 2 #include "warsprites.h"
trelemar 2:af768faf5329 3 uint16_t dark_pal[16];
trelemar 1:189e78ff65b1 4 #include "warfont.cpp"
trelemar 0:86d8ece873ca 5 #include <vector>
trelemar 0:86d8ece873ca 6 #include <stdint.h>
trelemar 0:86d8ece873ca 7
trelemar 2:af768faf5329 8 Pokitto::Core game;
trelemar 2:af768faf5329 9 Pokitto::Display disp;
trelemar 2:af768faf5329 10 Pokitto::Buttons btn;
trelemar 2:af768faf5329 11
trelemar 2:af768faf5329 12 void init_dark_palette() {
trelemar 2:af768faf5329 13 for (uint8_t c=1;c<15;c++) {
trelemar 2:af768faf5329 14 dark_pal[c] = disp.interpolateColor(sprite_pal[c], sprite_pal[0], 100);
trelemar 2:af768faf5329 15 }
trelemar 2:af768faf5329 16 }
trelemar 2:af768faf5329 17
trelemar 2:af768faf5329 18 bool loading;
trelemar 0:86d8ece873ca 19 float solids[64] {
trelemar 0:86d8ece873ca 20 0,1,1,1,1,0,0,0,
trelemar 0:86d8ece873ca 21 0,0,1,0,1,0,0,0,
trelemar 0:86d8ece873ca 22 0,0,1,1,1,0,0,0,
trelemar 0:86d8ece873ca 23 0,0,0,0,0,0,0,0,
trelemar 0:86d8ece873ca 24 0,0,0,0,0,0,0,0,
trelemar 0:86d8ece873ca 25 0,0,0,0,0,0,0,0,
trelemar 0:86d8ece873ca 26 0,0,0,0,0,0,0,0,
trelemar 0:86d8ece873ca 27 0,0,0,0,0,0,0,0,
trelemar 0:86d8ece873ca 28 };
trelemar 0:86d8ece873ca 29 //Sprite sheet:2x1
trelemar 0:86d8ece873ca 30 const uint8_t cursor_sprites [][244] ={
trelemar 0:86d8ece873ca 31 //[0] cell:0x0
trelemar 0:86d8ece873ca 32 {
trelemar 0:86d8ece873ca 33 22,22,
trelemar 0:86d8ece873ca 34 204,0,12,204,204,204,204,204,192,0,204,
trelemar 0:86d8ece873ca 35 192,255,240,204,204,204,204,204,15,255,12,
trelemar 0:86d8ece873ca 36 15,160,12,204,204,204,204,204,192,10,240,
trelemar 0:86d8ece873ca 37 15,12,204,204,204,204,204,204,204,192,240,
trelemar 0:86d8ece873ca 38 15,12,204,204,204,204,204,204,204,192,240,
trelemar 0:86d8ece873ca 39 192,204,204,204,204,204,204,204,204,204,12,
trelemar 0:86d8ece873ca 40 204,204,204,204,204,204,204,204,204,204,204,
trelemar 0:86d8ece873ca 41 204,204,204,204,204,204,204,204,204,204,204,
trelemar 0:86d8ece873ca 42 204,204,204,204,204,204,204,204,204,204,204,
trelemar 0:86d8ece873ca 43 204,204,204,204,204,204,204,204,204,204,204,
trelemar 0:86d8ece873ca 44 204,204,204,204,204,204,204,204,204,204,204,
trelemar 0:86d8ece873ca 45 204,204,204,204,204,204,204,204,204,204,204,
trelemar 0:86d8ece873ca 46 204,204,204,204,204,204,204,204,204,204,204,
trelemar 0:86d8ece873ca 47 204,204,204,204,204,204,204,204,204,204,204,
trelemar 0:86d8ece873ca 48 204,204,204,204,204,204,204,204,204,204,204,
trelemar 0:86d8ece873ca 49 204,204,204,204,204,204,204,204,204,204,204,
trelemar 0:86d8ece873ca 50 192,204,204,204,204,204,204,204,204,204,12,
trelemar 0:86d8ece873ca 51 15,12,204,204,204,204,204,204,204,192,240,
trelemar 0:86d8ece873ca 52 15,12,204,204,204,204,204,204,204,192,240,
trelemar 0:86d8ece873ca 53 15,160,12,204,204,204,204,204,192,10,240,
trelemar 0:86d8ece873ca 54 192,255,240,204,204,204,204,204,15,255,12,
trelemar 0:86d8ece873ca 55 204,0,12,204,204,204,204,204,192,0,204,
trelemar 0:86d8ece873ca 56 },
trelemar 0:86d8ece873ca 57 //[1] cell:1x0
trelemar 0:86d8ece873ca 58 {
trelemar 0:86d8ece873ca 59 22,22,
trelemar 0:86d8ece873ca 60 204,204,204,204,204,204,204,204,204,204,204,
trelemar 0:86d8ece873ca 61 204,192,0,204,204,204,204,204,0,12,204,
trelemar 0:86d8ece873ca 62 204,15,255,12,204,204,204,192,255,240,204,
trelemar 0:86d8ece873ca 63 192,250,0,204,204,204,204,204,0,175,12,
trelemar 0:86d8ece873ca 64 192,240,204,204,204,204,204,204,204,15,12,
trelemar 0:86d8ece873ca 65 192,240,204,204,204,204,204,204,204,15,12,
trelemar 0:86d8ece873ca 66 204,12,204,204,204,204,204,204,204,192,204,
trelemar 0:86d8ece873ca 67 204,204,204,204,204,204,204,204,204,204,204,
trelemar 0:86d8ece873ca 68 204,204,204,204,204,204,204,204,204,204,204,
trelemar 0:86d8ece873ca 69 204,204,204,204,204,204,204,204,204,204,204,
trelemar 0:86d8ece873ca 70 204,204,204,204,204,204,204,204,204,204,204,
trelemar 0:86d8ece873ca 71 204,204,204,204,204,204,204,204,204,204,204,
trelemar 0:86d8ece873ca 72 204,204,204,204,204,204,204,204,204,204,204,
trelemar 0:86d8ece873ca 73 204,204,204,204,204,204,204,204,204,204,204,
trelemar 0:86d8ece873ca 74 204,204,204,204,204,204,204,204,204,204,204,
trelemar 0:86d8ece873ca 75 204,12,204,204,204,204,204,204,204,192,204,
trelemar 0:86d8ece873ca 76 192,240,204,204,204,204,204,204,204,15,12,
trelemar 0:86d8ece873ca 77 192,240,204,204,204,204,204,204,204,15,12,
trelemar 0:86d8ece873ca 78 192,250,0,204,204,204,204,204,0,175,12,
trelemar 0:86d8ece873ca 79 204,15,255,12,204,204,204,192,255,240,204,
trelemar 0:86d8ece873ca 80 204,192,0,204,204,204,204,204,0,12,204,
trelemar 0:86d8ece873ca 81 204,204,204,204,204,204,204,204,204,204,204,
trelemar 0:86d8ece873ca 82 },
trelemar 0:86d8ece873ca 83 };
trelemar 0:86d8ece873ca 84
trelemar 0:86d8ece873ca 85 using namespace std;
trelemar 0:86d8ece873ca 86
trelemar 0:86d8ece873ca 87 int clamp(int low, int n, int high) {return min(max(low, n), high);}
trelemar 0:86d8ece873ca 88
trelemar 0:86d8ece873ca 89 float dist(int x1, int y1, int x2, int y2) {
trelemar 0:86d8ece873ca 90 int x = x1 - x2;
trelemar 0:86d8ece873ca 91 int y = y1 - y2;
trelemar 0:86d8ece873ca 92 float dist;
trelemar 0:86d8ece873ca 93 dist = pow((float)x,2)+pow((float)y,2);
trelemar 0:86d8ece873ca 94 dist = sqrt((float)dist);
trelemar 0:86d8ece873ca 95 return dist;
trelemar 0:86d8ece873ca 96 }
trelemar 0:86d8ece873ca 97
trelemar 0:86d8ece873ca 98 int lerp(int a, int b, float t) {
trelemar 0:86d8ece873ca 99 return (1-t)*a + t*b;
trelemar 0:86d8ece873ca 100 }
trelemar 0:86d8ece873ca 101
trelemar 2:af768faf5329 102 float lerp(float a, float b, float t) {
trelemar 2:af768faf5329 103 return (1-t)*a + t*b;
trelemar 2:af768faf5329 104 }
trelemar 2:af768faf5329 105
trelemar 1:189e78ff65b1 106 enum GameState {MAIN, PAUSE, MENU} State = MENU;
trelemar 0:86d8ece873ca 107
trelemar 0:86d8ece873ca 108 #define KEY_REPEAT 5
trelemar 0:86d8ece873ca 109
trelemar 0:86d8ece873ca 110 #define TASK_MOVE 0
trelemar 2:af768faf5329 111 #define TASK_ITEM 2
trelemar 2:af768faf5329 112 #define TASK_ATTACK 1
trelemar 0:86d8ece873ca 113 #define TASK_WAIT 3
trelemar 0:86d8ece873ca 114 #define TASK_NONE 4
trelemar 0:86d8ece873ca 115 #define TEAM_USER 0
trelemar 0:86d8ece873ca 116 #define TEAM_CPU 1
trelemar 0:86d8ece873ca 117
trelemar 0:86d8ece873ca 118 int current_team = TEAM_USER;
trelemar 0:86d8ece873ca 119 uint8_t selected_task = 0;
trelemar 0:86d8ece873ca 120 uint8_t current_task = TASK_NONE;
trelemar 0:86d8ece873ca 121 static char task_names[4][7] {
trelemar 0:86d8ece873ca 122 {"MOVE"},
trelemar 2:af768faf5329 123 {"ATTACK"},
trelemar 0:86d8ece873ca 124 {"ITEM"},
trelemar 0:86d8ece873ca 125 {"WAIT"},
trelemar 0:86d8ece873ca 126 };
trelemar 0:86d8ece873ca 127 int task_colors[4] {
trelemar 0:86d8ece873ca 128 11,9,6,8
trelemar 0:86d8ece873ca 129 };
trelemar 0:86d8ece873ca 130
trelemar 0:86d8ece873ca 131 #define SW disp.width
trelemar 0:86d8ece873ca 132 #define SH disp.height
trelemar 0:86d8ece873ca 133
trelemar 0:86d8ece873ca 134 int map_x, map_y, cursor_x, cursor_y;
trelemar 0:86d8ece873ca 135
trelemar 0:86d8ece873ca 136 bool center_cursor = true;
trelemar 0:86d8ece873ca 137
trelemar 0:86d8ece873ca 138 void centerCursor() {
trelemar 0:86d8ece873ca 139 map_x = cursor_x - 3;
trelemar 0:86d8ece873ca 140 map_y = cursor_y - 2;
trelemar 0:86d8ece873ca 141 }
trelemar 0:86d8ece873ca 142
trelemar 0:86d8ece873ca 143 static void printb(int x, int y, int text) {
trelemar 0:86d8ece873ca 144 disp.setColor(0);
trelemar 0:86d8ece873ca 145 disp.print(x,y-1,text);
trelemar 0:86d8ece873ca 146 disp.print(x,y+1,text);
trelemar 0:86d8ece873ca 147 disp.print(x+1,y,text);
trelemar 0:86d8ece873ca 148 disp.print(x-1,y,text);
trelemar 0:86d8ece873ca 149 disp.setColor(15);
trelemar 0:86d8ece873ca 150 disp.print(x,y,text);
trelemar 0:86d8ece873ca 151 }
trelemar 0:86d8ece873ca 152 static void printb(int x, int y, char text[]) {
trelemar 0:86d8ece873ca 153 disp.setColor(0);
trelemar 0:86d8ece873ca 154 disp.print(x,y-1,text);
trelemar 0:86d8ece873ca 155 disp.print(x,y+1,text);
trelemar 0:86d8ece873ca 156 disp.print(x+1,y,text);
trelemar 0:86d8ece873ca 157 disp.print(x-1,y,text);
trelemar 0:86d8ece873ca 158 disp.setColor(15);
trelemar 0:86d8ece873ca 159 disp.print(x,y,text);
trelemar 0:86d8ece873ca 160 }
trelemar 0:86d8ece873ca 161
trelemar 0:86d8ece873ca 162 struct Dialog {
trelemar 0:86d8ece873ca 163 char text[20];
trelemar 0:86d8ece873ca 164 int start_time;
trelemar 0:86d8ece873ca 165 int position;
trelemar 0:86d8ece873ca 166 Dialog(char _text[20]) {
trelemar 0:86d8ece873ca 167 strcpy(text, _text);
trelemar 0:86d8ece873ca 168 position = 0;
trelemar 0:86d8ece873ca 169 start_time = game.frameCount;
trelemar 0:86d8ece873ca 170 };
trelemar 0:86d8ece873ca 171 void update() {
trelemar 0:86d8ece873ca 172 position = min(position + 1, 19);
trelemar 0:86d8ece873ca 173 };
trelemar 0:86d8ece873ca 174 void draw(int x, int y) {
trelemar 0:86d8ece873ca 175 disp.setCursor(x, y);
trelemar 0:86d8ece873ca 176 for (int p=0;p<position;p++) {
trelemar 0:86d8ece873ca 177 disp.print(text[p]);
trelemar 0:86d8ece873ca 178 }
trelemar 0:86d8ece873ca 179 };
trelemar 0:86d8ece873ca 180 };
trelemar 0:86d8ece873ca 181
trelemar 0:86d8ece873ca 182 struct Transition {
trelemar 0:86d8ece873ca 183 int on_val, off_val, val;
trelemar 0:86d8ece873ca 184 bool enabled;
trelemar 1:189e78ff65b1 185 Transition() {};
trelemar 0:86d8ece873ca 186 Transition(int _onv, int _offv, bool _enabled) {
trelemar 0:86d8ece873ca 187 on_val = _onv;
trelemar 0:86d8ece873ca 188 off_val = _offv;
trelemar 0:86d8ece873ca 189 enabled = _enabled;
trelemar 0:86d8ece873ca 190 if (enabled) val=on_val;
trelemar 0:86d8ece873ca 191 else val = off_val;
trelemar 0:86d8ece873ca 192 };
trelemar 0:86d8ece873ca 193 void toggle() {enabled=!enabled;};
trelemar 0:86d8ece873ca 194 void update() {
trelemar 0:86d8ece873ca 195 if (enabled) val = lerp(val, on_val, 0.2);
trelemar 0:86d8ece873ca 196 else val = lerp(val, off_val, 0.2);
trelemar 0:86d8ece873ca 197 };
trelemar 0:86d8ece873ca 198 };
trelemar 0:86d8ece873ca 199
trelemar 0:86d8ece873ca 200 struct Vec2 {
trelemar 0:86d8ece873ca 201 int x, y;
trelemar 0:86d8ece873ca 202 Vec2(int _x, int _y) {x=_x; y=_y;};
trelemar 0:86d8ece873ca 203 };
trelemar 0:86d8ece873ca 204
trelemar 0:86d8ece873ca 205 struct Item {
trelemar 0:86d8ece873ca 206 int id, x, y;
trelemar 0:86d8ece873ca 207 Item(int _id, int _x, int _y) {
trelemar 0:86d8ece873ca 208 id = _id;
trelemar 0:86d8ece873ca 209 x = _x;
trelemar 0:86d8ece873ca 210 y = _y;
trelemar 0:86d8ece873ca 211 };
trelemar 0:86d8ece873ca 212 void Draw() {
trelemar 0:86d8ece873ca 213 int dx = (x-map_x)*16;
trelemar 0:86d8ece873ca 214 int dy = (y-map_y)*16;
trelemar 0:86d8ece873ca 215 //disp.setColor(1);
trelemar 0:86d8ece873ca 216 //disp.fillRectangle(dx+4,dy+12,8,3);
trelemar 0:86d8ece873ca 217 //disp.drawBitmap(dx, dy+(sin(game.frameCount/4))*2, sprites[id]);
trelemar 0:86d8ece873ca 218 };
trelemar 0:86d8ece873ca 219 };
trelemar 0:86d8ece873ca 220
trelemar 1:189e78ff65b1 221 #define ID_SOLDIER 0
trelemar 1:189e78ff65b1 222 #define ID_ORC 1
trelemar 1:189e78ff65b1 223
trelemar 1:189e78ff65b1 224 char id_names[][8] {
trelemar 1:189e78ff65b1 225 {"SOLDIER"},
trelemar 1:189e78ff65b1 226 {"ORC"},
trelemar 1:189e78ff65b1 227 };
trelemar 1:189e78ff65b1 228
trelemar 0:86d8ece873ca 229 struct Hero {
trelemar 0:86d8ece873ca 230 unsigned int index, team, id, x, y;
trelemar 0:86d8ece873ca 231 uint8_t atk, def, hp, max_hp;
trelemar 0:86d8ece873ca 232 float range;
trelemar 0:86d8ece873ca 233 int spr;
trelemar 0:86d8ece873ca 234 int hurt_time;
trelemar 0:86d8ece873ca 235 bool tasks[4], flip;
trelemar 0:86d8ece873ca 236 Hero(int _x, int _y, int _id, int _team) {
trelemar 0:86d8ece873ca 237 x = _x; y = _y; flip = false;
trelemar 0:86d8ece873ca 238 id = _id; team = _team;
trelemar 0:86d8ece873ca 239 if (_team == TEAM_USER) {
trelemar 0:86d8ece873ca 240 spr = 32;
trelemar 0:86d8ece873ca 241 }
trelemar 1:189e78ff65b1 242 else {spr = 26; flip=true; id = ID_ORC;}
trelemar 0:86d8ece873ca 243 max_hp = 10;
trelemar 0:86d8ece873ca 244 hp = max_hp;
trelemar 0:86d8ece873ca 245 atk = random(4,6);
trelemar 0:86d8ece873ca 246 def = random(1,3);
trelemar 0:86d8ece873ca 247 range = 2.1;
trelemar 0:86d8ece873ca 248 NewTurn();
trelemar 0:86d8ece873ca 249 };
trelemar 0:86d8ece873ca 250 void NewTurn() {
trelemar 0:86d8ece873ca 251 for (int i=0;i<4;i++) {tasks[i]=true;}
trelemar 0:86d8ece873ca 252 };
trelemar 0:86d8ece873ca 253 void update(int i) {
trelemar 0:86d8ece873ca 254 index = i;
trelemar 0:86d8ece873ca 255 };
trelemar 0:86d8ece873ca 256 void Draw() {
trelemar 0:86d8ece873ca 257 int ox = 0;
trelemar 0:86d8ece873ca 258 int oy = 0;
trelemar 0:86d8ece873ca 259 int dx = (x-map_x)*16;
trelemar 0:86d8ece873ca 260 int dy = (y-map_y)*16;
trelemar 0:86d8ece873ca 261 bool draw = true;
trelemar 0:86d8ece873ca 262 if (game.frameCount-hurt_time<10) {
trelemar 0:86d8ece873ca 263 ox = random(-2,2);
trelemar 0:86d8ece873ca 264 oy = random(-2,2);
trelemar 0:86d8ece873ca 265 if (game.frameCount%2==0) {draw=false;}
trelemar 0:86d8ece873ca 266 }
trelemar 0:86d8ece873ca 267 int spr_id = spr + (game.frameCount/6)%2;
trelemar 0:86d8ece873ca 268 disp.invisiblecolor = 13;
trelemar 0:86d8ece873ca 269 if (draw) disp.drawBitmap((dx)+ox,(dy)+oy,sprites[spr_id], 0, flip);
trelemar 0:86d8ece873ca 270 disp.invisiblecolor = 12;
trelemar 0:86d8ece873ca 271 };
trelemar 0:86d8ece873ca 272 bool inRange(Hero * enemy) {
trelemar 0:86d8ece873ca 273 return (dist(x, y, enemy->x, enemy->y)<=range);
trelemar 0:86d8ece873ca 274 };
trelemar 0:86d8ece873ca 275 bool inRange(int dx, int dy) {
trelemar 0:86d8ece873ca 276 return (dist(x, y, dx, dy)<=range);
trelemar 0:86d8ece873ca 277 }
trelemar 0:86d8ece873ca 278 };
trelemar 2:af768faf5329 279 Hero * cursor_hero = NULL;
trelemar 2:af768faf5329 280 Hero * current_hero = NULL;
trelemar 2:af768faf5329 281 vector<Hero> * hptr;
trelemar 0:86d8ece873ca 282
trelemar 0:86d8ece873ca 283 void DrawCursorHeroUI (Hero * h, int x, int y) {
trelemar 0:86d8ece873ca 284 int bw = 24;
trelemar 0:86d8ece873ca 285 int hw = (bw/h->max_hp) * h->hp;
trelemar 0:86d8ece873ca 286 disp.setColor(0);
trelemar 0:86d8ece873ca 287 disp.drawRoundRect(x-1,y-1,bw+2,5,2); //HEALTH BAR
trelemar 0:86d8ece873ca 288 disp.fillRoundRect(x-1, y+26,bw+2,7,2); //TEXT BG BOX
trelemar 0:86d8ece873ca 289 disp.setColor(6);
trelemar 0:86d8ece873ca 290 disp.fillRect(x, y, bw, 2);
trelemar 0:86d8ece873ca 291 disp.setColor(11);
trelemar 0:86d8ece873ca 292 disp.fillRect(x, y, hw+4, 2);
trelemar 0:86d8ece873ca 293 disp.setColor(11);
trelemar 0:86d8ece873ca 294 disp.print(x,y+27,"^");
trelemar 0:86d8ece873ca 295 disp.setColor(15);
trelemar 0:86d8ece873ca 296 disp.print((int)h->atk);
trelemar 0:86d8ece873ca 297 disp.setColor(6);
trelemar 0:86d8ece873ca 298 disp.print("n");
trelemar 0:86d8ece873ca 299 disp.setColor(15);
trelemar 0:86d8ece873ca 300 disp.print((int)h->def);
trelemar 0:86d8ece873ca 301 }
trelemar 0:86d8ece873ca 302
trelemar 0:86d8ece873ca 303 void DrawSelectedHeroUI(Hero * h, int y) {
trelemar 0:86d8ece873ca 304 disp.setColor(0);
trelemar 0:86d8ece873ca 305 //disp.fillRect(0,66,SW,88-66);
trelemar 0:86d8ece873ca 306 disp.fillRoundRect(1,y,SW-2,88-67,3);
trelemar 0:86d8ece873ca 307 //disp.setColor(15);
trelemar 0:86d8ece873ca 308 if (!h) return;
trelemar 0:86d8ece873ca 309 printb(3,y-3,id_names[h->id]);
trelemar 0:86d8ece873ca 310 disp.setColor(8);
trelemar 0:86d8ece873ca 311 disp.print(3,y+3,">");
trelemar 0:86d8ece873ca 312 disp.setColor(15);
trelemar 0:86d8ece873ca 313 disp.print((int)h->atk);
trelemar 0:86d8ece873ca 314 disp.print(" ATK");
trelemar 0:86d8ece873ca 315 disp.setColor(6);
trelemar 0:86d8ece873ca 316 disp.print(3,y+9,"n");
trelemar 0:86d8ece873ca 317 disp.setColor(15);
trelemar 0:86d8ece873ca 318 disp.print((int)h->def);
trelemar 0:86d8ece873ca 319 disp.print(" DEF");
trelemar 0:86d8ece873ca 320 disp.setColor(11);
trelemar 0:86d8ece873ca 321 disp.print(3,y+15,"^");
trelemar 0:86d8ece873ca 322 disp.setColor(15);
trelemar 0:86d8ece873ca 323 disp.print((int)h->range);
trelemar 0:86d8ece873ca 324 disp.print(" RNG");
trelemar 0:86d8ece873ca 325 printb(16,(-y)+68,task_names[selected_task]);
trelemar 0:86d8ece873ca 326
trelemar 0:86d8ece873ca 327 for (int i=0;i<4;i++) {
trelemar 0:86d8ece873ca 328 int spr = i+48;
trelemar 0:86d8ece873ca 329 if (!h->tasks[i]) spr-=8;
trelemar 0:86d8ece873ca 330 else if (selected_task==i) spr+=8;
trelemar 0:86d8ece873ca 331 disp.drawBitmap(44+(i*16), y+4, sprites[spr]);
trelemar 0:86d8ece873ca 332 }
trelemar 0:86d8ece873ca 333 int bw = 62;
trelemar 0:86d8ece873ca 334 int hw = (bw/h->max_hp) * h->hp;
trelemar 0:86d8ece873ca 335 disp.setColor(0);
trelemar 0:86d8ece873ca 336 disp.drawRoundRect(44,y-4,bw+2,7,3);
trelemar 0:86d8ece873ca 337 disp.setColor(6);
trelemar 0:86d8ece873ca 338 disp.fillRoundRect(45,y-3,bw,5,2);
trelemar 0:86d8ece873ca 339 disp.setColor(11);
trelemar 0:86d8ece873ca 340 disp.fillRoundRect(45,y-3,hw+2,5,2);
trelemar 0:86d8ece873ca 341 disp.setColor(15);
trelemar 0:86d8ece873ca 342 printb(50+(bw/2)-10,y-3,(int)h->hp);
trelemar 0:86d8ece873ca 343 }
trelemar 0:86d8ece873ca 344
trelemar 0:86d8ece873ca 345 void DrawItemList(Hero * h, int y) {
trelemar 0:86d8ece873ca 346 disp.setColor(0);
trelemar 0:86d8ece873ca 347 disp.fillRoundRect(32,y,SW-63,12,3);
trelemar 0:86d8ece873ca 348 disp.setColor(15);
trelemar 0:86d8ece873ca 349 for (int i = 0; i<4; i++) {
trelemar 0:86d8ece873ca 350 disp.drawRoundRect(34+(i*11),y+1,10,10,2);
trelemar 0:86d8ece873ca 351 }
trelemar 0:86d8ece873ca 352
trelemar 0:86d8ece873ca 353 }
trelemar 0:86d8ece873ca 354
trelemar 0:86d8ece873ca 355 void DrawTurnCounter(vector<Hero> &_heros) {
trelemar 0:86d8ece873ca 356 disp.invisiblecolor = 13;
trelemar 0:86d8ece873ca 357 int spr = 44;
trelemar 0:86d8ece873ca 358 if (current_team==TEAM_CPU) spr = 45;
trelemar 0:86d8ece873ca 359 disp.drawBitmap(0, 0, sprites[spr]);
trelemar 0:86d8ece873ca 360 disp.invisiblecolor = 12;
trelemar 0:86d8ece873ca 361 int count = 0;
trelemar 0:86d8ece873ca 362 for (int i=0; i<_heros.size();i++) {
trelemar 0:86d8ece873ca 363 if (_heros[i].team == current_team) count++;
trelemar 0:86d8ece873ca 364 }
trelemar 0:86d8ece873ca 365 printb(11,10,(int)count);
trelemar 0:86d8ece873ca 366 }
trelemar 0:86d8ece873ca 367
trelemar 0:86d8ece873ca 368 #define MAP_WIDTH 12
trelemar 0:86d8ece873ca 369 #define MAP_HEIGHT 12
trelemar 2:af768faf5329 370 int Map[MAP_HEIGHT][MAP_WIDTH] {
trelemar 2:af768faf5329 371 {0,8,0,5,10,8,8,1,8,8,0,8},
trelemar 2:af768faf5329 372 {1,0,0,21,15,14,8,0,8,0,1,0},
trelemar 2:af768faf5329 373 {0,8,0,8,10,5,8,8,0,9,8,8},
trelemar 2:af768faf5329 374 {0,1,8,0,10,5,1,8,8,8,0,8},
trelemar 2:af768faf5329 375 {8,0,9,0,18,7,3,3,3,4,8,1},
trelemar 2:af768faf5329 376 {0,8,8,0,0,5,0,0,0,12,8,13},
trelemar 2:af768faf5329 377 {0,0,1,8,8,5,8,1,8,11,0,5},
trelemar 2:af768faf5329 378 {8,0,8,0,8,5,8,0,0,10,0,5},
trelemar 2:af768faf5329 379 {8,8,0,8,1,21,6,30,6,15,6,22},
trelemar 2:af768faf5329 380 {8,0,0,8,8,0,0,5,8,12,0,0},
trelemar 2:af768faf5329 381 {0,1,8,9,0,8,1,5,8,18,3,3},
trelemar 2:af768faf5329 382 {0,0,8,8,8,8,0,5,8,0,8,0},
trelemar 2:af768faf5329 383 };
trelemar 2:af768faf5329 384
trelemar 2:af768faf5329 385 void loadTileMap(char * filename) {
trelemar 2:af768faf5329 386 disp.fillLCD(disp.palette[0]);
trelemar 2:af768faf5329 387 disp.directBitmap(110-16,176/2-16,sprites[72],4,2);
trelemar 2:af768faf5329 388 int inc = 220/144;
trelemar 2:af768faf5329 389 #ifdef POK_SIM
trelemar 2:af768faf5329 390 game.wait(20);
trelemar 2:af768faf5329 391 #endif
trelemar 2:af768faf5329 392 pokInitSD();
trelemar 2:af768faf5329 393 fileOpen(filename,FILE_MODE_BINARY);
trelemar 0:86d8ece873ca 394 for (int i = 0; i<144; i++) {
trelemar 0:86d8ece873ca 395 int x = i%MAP_WIDTH;
trelemar 0:86d8ece873ca 396 int y = (i-x)/MAP_WIDTH;
trelemar 0:86d8ece873ca 397 //fileSetPosition(i);
trelemar 0:86d8ece873ca 398 Map[y][x] = (int)filePeek(i);
trelemar 2:af768faf5329 399 #ifdef POK_SIM
trelemar 2:af768faf5329 400 game.wait(10);
trelemar 2:af768faf5329 401 #endif // POK_SIM
trelemar 2:af768faf5329 402 disp.directRectangle(inc*(i*2),0,inc,8,disp.palette[15]);
trelemar 0:86d8ece873ca 403 }
trelemar 2:af768faf5329 404 fileClose();
trelemar 0:86d8ece873ca 405 }
trelemar 0:86d8ece873ca 406
trelemar 0:86d8ece873ca 407 void saveTileMap() {
trelemar 0:86d8ece873ca 408
trelemar 0:86d8ece873ca 409 }
trelemar 0:86d8ece873ca 410
trelemar 0:86d8ece873ca 411 void DrawTileMap(int8_t x, int8_t y, Hero * hero) {
trelemar 0:86d8ece873ca 412 disp.setColor(15);
trelemar 0:86d8ece873ca 413 for (int map_x=0; map_x<7; map_x++) {
trelemar 0:86d8ece873ca 414 for (int map_y=0; map_y<6; map_y++) {
trelemar 0:86d8ece873ca 415 int spr;
trelemar 0:86d8ece873ca 416 if (map_x+x<0||x+map_x>MAP_WIDTH-1||y+map_y<0||y+map_y>MAP_HEIGHT-1) {
trelemar 0:86d8ece873ca 417 spr = 9;
trelemar 0:86d8ece873ca 418 }
trelemar 0:86d8ece873ca 419 else {
trelemar 0:86d8ece873ca 420 spr = Map[map_y+y][map_x+x];
trelemar 0:86d8ece873ca 421 }
trelemar 0:86d8ece873ca 422
trelemar 0:86d8ece873ca 423 float distance;
trelemar 0:86d8ece873ca 424
trelemar 0:86d8ece873ca 425 disp.drawBitmap((map_x*16), (map_y*16),sprites[spr]);
trelemar 0:86d8ece873ca 426
trelemar 0:86d8ece873ca 427 //RANGE BOXES
trelemar 0:86d8ece873ca 428 if (hero && (current_task == TASK_MOVE || current_task == TASK_ATTACK)) {
trelemar 0:86d8ece873ca 429 distance = dist(map_x+x, map_y+y, hero->x, hero->y);
trelemar 0:86d8ece873ca 430 if (distance<hero->range&&x+map_x<MAP_WIDTH&&y+map_y<MAP_HEIGHT) {
trelemar 0:86d8ece873ca 431 disp.setColor(8);
trelemar 0:86d8ece873ca 432 if (solids[Map[map_y+y][map_x+x]]) {disp.setColor(6);}
trelemar 0:86d8ece873ca 433 disp.drawRoundRect(map_x*16+2, map_y*16+2, 12, 12,3);
trelemar 0:86d8ece873ca 434 //disp.print(map_x*16,map_y*16,(float)distance);
trelemar 0:86d8ece873ca 435 }
trelemar 0:86d8ece873ca 436 }
trelemar 0:86d8ece873ca 437 }
trelemar 0:86d8ece873ca 438 }
trelemar 0:86d8ece873ca 439 }
trelemar 0:86d8ece873ca 440
trelemar 0:86d8ece873ca 441 void DrawCursor(int x, int y) {
trelemar 0:86d8ece873ca 442 //uint8_t spr = 52 + (game.frameCount/12)%2;
trelemar 0:86d8ece873ca 443 disp.drawBitmap(x*16-3, y*16-3,cursor_sprites[(game.frameCount/4)%2]);
trelemar 0:86d8ece873ca 444 }
trelemar 0:86d8ece873ca 445
trelemar 0:86d8ece873ca 446 Hero * getHeroAtCoords(int x, int y, vector<Hero> &herovect) {
trelemar 0:86d8ece873ca 447 Hero *h = NULL;
trelemar 0:86d8ece873ca 448 bool found = false;
trelemar 0:86d8ece873ca 449 for (int i=0;i<herovect.size();i++) {
trelemar 0:86d8ece873ca 450 if (herovect[i].x==x&&herovect[i].y==y) {
trelemar 0:86d8ece873ca 451 h = &herovect[i];
trelemar 0:86d8ece873ca 452 break;
trelemar 0:86d8ece873ca 453 }
trelemar 0:86d8ece873ca 454 }
trelemar 0:86d8ece873ca 455 return h;
trelemar 0:86d8ece873ca 456 }
trelemar 0:86d8ece873ca 457
trelemar 0:86d8ece873ca 458
trelemar 0:86d8ece873ca 459
trelemar 0:86d8ece873ca 460 void CursorInput() {
trelemar 0:86d8ece873ca 461 int last_x=cursor_x;
trelemar 0:86d8ece873ca 462 int last_y=cursor_y;
trelemar 0:86d8ece873ca 463 if (btn.repeat(BTN_UP,KEY_REPEAT)) {
trelemar 0:86d8ece873ca 464 if (cursor_y-map_y<=0) {
trelemar 0:86d8ece873ca 465 map_y=max(map_y-1,0);
trelemar 0:86d8ece873ca 466 }
trelemar 0:86d8ece873ca 467 cursor_y=max(cursor_y-1,0);
trelemar 0:86d8ece873ca 468 }
trelemar 0:86d8ece873ca 469 if (btn.repeat(BTN_DOWN,KEY_REPEAT)) {
trelemar 0:86d8ece873ca 470 if (cursor_y-map_y>=4) {
trelemar 0:86d8ece873ca 471 map_y=min(map_y+1,MAP_HEIGHT-6);
trelemar 0:86d8ece873ca 472 }
trelemar 0:86d8ece873ca 473 cursor_y=min(cursor_y+1,MAP_HEIGHT-1);
trelemar 0:86d8ece873ca 474
trelemar 0:86d8ece873ca 475 }
trelemar 0:86d8ece873ca 476 if (btn.repeat(BTN_LEFT,KEY_REPEAT)) {
trelemar 0:86d8ece873ca 477 if (cursor_x-map_x<=0) {
trelemar 0:86d8ece873ca 478 map_x=max(map_x-1,0);
trelemar 0:86d8ece873ca 479 }
trelemar 0:86d8ece873ca 480 cursor_x=max(cursor_x-1,0);
trelemar 0:86d8ece873ca 481 }
trelemar 0:86d8ece873ca 482 if (btn.repeat(BTN_RIGHT,KEY_REPEAT)) {
trelemar 0:86d8ece873ca 483 if (cursor_x-map_x>=6) {
trelemar 0:86d8ece873ca 484 map_x=min(map_x+1,MAP_WIDTH-7);
trelemar 0:86d8ece873ca 485 }
trelemar 0:86d8ece873ca 486 cursor_x=min(cursor_x+1,MAP_WIDTH-1);
trelemar 0:86d8ece873ca 487 }
trelemar 0:86d8ece873ca 488
trelemar 0:86d8ece873ca 489 if (center_cursor) {
trelemar 0:86d8ece873ca 490 centerCursor();
trelemar 0:86d8ece873ca 491 }
trelemar 0:86d8ece873ca 492 }
trelemar 0:86d8ece873ca 493
trelemar 2:af768faf5329 494 struct PauseMenu {
trelemar 2:af768faf5329 495 char items[3][12];
trelemar 2:af768faf5329 496 unsigned int selected_item;
trelemar 2:af768faf5329 497 Transition lb; //letterbox
trelemar 2:af768faf5329 498 PauseMenu() {
trelemar 2:af768faf5329 499 lb.off_val=0;
trelemar 2:af768faf5329 500 lb.on_val=16;
trelemar 2:af768faf5329 501 lb.enabled=true;
trelemar 2:af768faf5329 502 lb.val = lb.off_val;
trelemar 2:af768faf5329 503 selected_item = 0;
trelemar 2:af768faf5329 504 strcpy(items[0], "RESUME");
trelemar 2:af768faf5329 505 strcpy(items[1], "END TURN");
trelemar 2:af768faf5329 506 strcpy(items[2], "QUIT GAME");
trelemar 2:af768faf5329 507 };
trelemar 2:af768faf5329 508 void endTurn(vector<Hero> * _heros) {
trelemar 2:af768faf5329 509 for (int i=0; i<0+_heros->size(); i++) {
trelemar 2:af768faf5329 510 _heros->at(i).NewTurn();
trelemar 2:af768faf5329 511 }
trelemar 2:af768faf5329 512 };
trelemar 2:af768faf5329 513 void update() {
trelemar 2:af768faf5329 514 lb.update();
trelemar 2:af768faf5329 515 for (int i = 1; i<15; i++) {
trelemar 2:af768faf5329 516 disp.palette[i] = disp.interpolateColor(disp.palette[i],dark_pal[i], 80);
trelemar 2:af768faf5329 517 }
trelemar 2:af768faf5329 518 if (btn.pressed(BTN_DOWN)) {
trelemar 2:af768faf5329 519 selected_item++;
trelemar 2:af768faf5329 520 selected_item%=3;
trelemar 2:af768faf5329 521 }
trelemar 2:af768faf5329 522 else if (btn.pressed(BTN_UP)) {
trelemar 2:af768faf5329 523 selected_item--;
trelemar 2:af768faf5329 524 selected_item%=3;
trelemar 2:af768faf5329 525 }
trelemar 2:af768faf5329 526
trelemar 2:af768faf5329 527 if (btn.pressed(BTN_A)) {
trelemar 2:af768faf5329 528 lb.val = lb.off_val;
trelemar 2:af768faf5329 529 disp.load565Palette(sprite_pal);
trelemar 2:af768faf5329 530 switch (selected_item) {
trelemar 2:af768faf5329 531 case 0:
trelemar 2:af768faf5329 532 State = MAIN;
trelemar 2:af768faf5329 533 break;
trelemar 2:af768faf5329 534 case 1:
trelemar 2:af768faf5329 535 current_team=(current_team+1) % 2;
trelemar 2:af768faf5329 536 endTurn(hptr);
trelemar 2:af768faf5329 537 State = MAIN;
trelemar 2:af768faf5329 538 break;
trelemar 2:af768faf5329 539 case 2:
trelemar 2:af768faf5329 540 State = MENU;
trelemar 2:af768faf5329 541 game.filemenu();
trelemar 2:af768faf5329 542 break;
trelemar 2:af768faf5329 543 }
trelemar 2:af768faf5329 544 }
trelemar 2:af768faf5329 545 };
trelemar 2:af768faf5329 546 void draw() {
trelemar 2:af768faf5329 547 //disp.fillRoundRect()
trelemar 2:af768faf5329 548 DrawTileMap(map_x, map_y, current_hero);
trelemar 2:af768faf5329 549 disp.setColor(0);
trelemar 2:af768faf5329 550 disp.fillRect(0,0,SW,lb.val);
trelemar 2:af768faf5329 551 disp.fillRect(0,SH-lb.val,SW,lb.on_val);
trelemar 2:af768faf5329 552 disp.setColor(15);
trelemar 2:af768faf5329 553 disp.setCursor(0,lb.val+2);
trelemar 2:af768faf5329 554 disp.println("PAUSED");
trelemar 2:af768faf5329 555 disp.print("CURRENT TEAM ");
trelemar 2:af768faf5329 556 disp.println(current_team);
trelemar 2:af768faf5329 557 disp.println(selected_item);
trelemar 2:af768faf5329 558 for (int i=0;i<3; i++) {
trelemar 2:af768faf5329 559 int color = 0;
trelemar 2:af768faf5329 560 if (selected_item==i) {
trelemar 2:af768faf5329 561 color = 15;
trelemar 2:af768faf5329 562 }
trelemar 2:af768faf5329 563 disp.setColor(color);
trelemar 2:af768faf5329 564 disp.print(32, 32+ (i*6), items[i]);
trelemar 2:af768faf5329 565 }
trelemar 2:af768faf5329 566 };
trelemar 2:af768faf5329 567 };
trelemar 2:af768faf5329 568
trelemar 2:af768faf5329 569 struct LevelList {
trelemar 2:af768faf5329 570 int pos;
trelemar 2:af768faf5329 571 int files;
trelemar 2:af768faf5329 572 char * fname;
trelemar 2:af768faf5329 573 LevelList() {
trelemar 2:af768faf5329 574 pokInitSD();
trelemar 2:af768faf5329 575 pos = 0;
trelemar 2:af768faf5329 576 files = 0;
trelemar 2:af768faf5329 577 fname = getFirstFile("war");
trelemar 2:af768faf5329 578 files++;
trelemar 2:af768faf5329 579 while(fname!=NULL) {
trelemar 2:af768faf5329 580 fname = getNextFile("war");
trelemar 2:af768faf5329 581 files++;
trelemar 2:af768faf5329 582 }
trelemar 2:af768faf5329 583 fname = getFirstFile("war");
trelemar 2:af768faf5329 584 };
trelemar 2:af768faf5329 585
trelemar 2:af768faf5329 586 void update() {
trelemar 2:af768faf5329 587 if (btn.pressed(BTN_DOWN)) {
trelemar 2:af768faf5329 588 fname = getNextFile("war");
trelemar 2:af768faf5329 589 if (fname==NULL) {
trelemar 2:af768faf5329 590 fname = getFirstFile("war");
trelemar 2:af768faf5329 591 }
trelemar 2:af768faf5329 592 }
trelemar 2:af768faf5329 593 if (btn.pressed(BTN_A)&&fname!=NULL) {
trelemar 2:af768faf5329 594 loadTileMap(fname);
trelemar 2:af768faf5329 595 }
trelemar 2:af768faf5329 596 };
trelemar 2:af768faf5329 597 void draw() {
trelemar 2:af768faf5329 598 disp.setFont(font5x7);
trelemar 2:af768faf5329 599 disp.bgcolor=0;
trelemar 2:af768faf5329 600 disp.clear();
trelemar 2:af768faf5329 601 disp.setColor(15);
trelemar 2:af768faf5329 602 disp.setCursor(2,2);
trelemar 2:af768faf5329 603 disp.print((int)files);
trelemar 2:af768faf5329 604 disp.print(" MAPS FOUND");
trelemar 2:af768faf5329 605 disp.print(2,SH/2-3, fname);
trelemar 2:af768faf5329 606 disp.setFont(fontWAR);
trelemar 2:af768faf5329 607
trelemar 2:af768faf5329 608 disp.bgcolor = 12;
trelemar 2:af768faf5329 609 };
trelemar 2:af768faf5329 610
trelemar 2:af768faf5329 611 };
trelemar 2:af768faf5329 612 #define MENU_STATE_MAIN 0
trelemar 2:af768faf5329 613 #define MENU_STATE_LEVEL 1
trelemar 1:189e78ff65b1 614 struct MainMenu {
trelemar 2:af768faf5329 615 int state;
trelemar 1:189e78ff65b1 616 struct Transition trans;
trelemar 1:189e78ff65b1 617 char items[3][10];
trelemar 1:189e78ff65b1 618 int selected_item;
trelemar 2:af768faf5329 619 int box_x;
trelemar 2:af768faf5329 620 int box_target;
trelemar 1:189e78ff65b1 621 MainMenu() {
trelemar 2:af768faf5329 622 state = MENU_STATE_MAIN;
trelemar 2:af768faf5329 623 box_x = 0;
trelemar 2:af768faf5329 624 box_target = 0;
trelemar 2:af768faf5329 625 trans.off_val=SH+16;
trelemar 2:af768faf5329 626 trans.on_val = SH-12;
trelemar 1:189e78ff65b1 627 trans.val=trans.off_val;
trelemar 1:189e78ff65b1 628 trans.enabled=true;
trelemar 1:189e78ff65b1 629 strcpy(items[0], "CAMPAIGN");
trelemar 1:189e78ff65b1 630 strcpy(items[1], "SKIRMISH");
trelemar 1:189e78ff65b1 631 strcpy(items[2], "OPTIONS");
trelemar 1:189e78ff65b1 632 selected_item = 0;
trelemar 1:189e78ff65b1 633 };
trelemar 2:af768faf5329 634 void update(LevelList *l) {
trelemar 2:af768faf5329 635 switch (state) {
trelemar 2:af768faf5329 636 case MENU_STATE_MAIN:
trelemar 2:af768faf5329 637 box_x = lerp(box_x, box_target, 0.50);
trelemar 2:af768faf5329 638 trans.update();
trelemar 1:189e78ff65b1 639 if (btn.pressed(BTN_RIGHT)) {
trelemar 1:189e78ff65b1 640 selected_item = min(selected_item + 1, 2);
trelemar 2:af768faf5329 641 trans.val=trans.off_val;
trelemar 1:189e78ff65b1 642 }
trelemar 1:189e78ff65b1 643 if (btn.pressed(BTN_LEFT)) {
trelemar 1:189e78ff65b1 644 selected_item = max(selected_item - 1, 0);
trelemar 2:af768faf5329 645 trans.val=trans.off_val;
trelemar 1:189e78ff65b1 646 }
trelemar 1:189e78ff65b1 647
trelemar 1:189e78ff65b1 648 if (btn.pressed(BTN_A)) {
trelemar 1:189e78ff65b1 649 switch (selected_item){
trelemar 1:189e78ff65b1 650 case (0): //CAMPAIGN
trelemar 1:189e78ff65b1 651 break;
trelemar 1:189e78ff65b1 652 case (1): //SKIRMISH
trelemar 1:189e78ff65b1 653 disp.clear();
trelemar 1:189e78ff65b1 654 disp.print("LOADING");
trelemar 2:af768faf5329 655 //pokInitSD();
trelemar 2:af768faf5329 656 //loadTileMap("file_out.war");
trelemar 1:189e78ff65b1 657 State = MAIN;
trelemar 1:189e78ff65b1 658 break;
trelemar 1:189e78ff65b1 659 case (2): //OPTIONS
trelemar 2:af768faf5329 660 state = MENU_STATE_LEVEL;
trelemar 1:189e78ff65b1 661 break;
trelemar 1:189e78ff65b1 662 }
trelemar 1:189e78ff65b1 663 }
trelemar 2:af768faf5329 664 break;
trelemar 2:af768faf5329 665 case (MENU_STATE_LEVEL):
trelemar 2:af768faf5329 666 if (btn.pressed(BTN_B)) {
trelemar 2:af768faf5329 667 state = MENU_STATE_MAIN;
trelemar 2:af768faf5329 668 }
trelemar 2:af768faf5329 669 l->update();
trelemar 2:af768faf5329 670 break;
trelemar 2:af768faf5329 671 }//SWITCH
trelemar 1:189e78ff65b1 672 };
trelemar 2:af768faf5329 673 void draw(LevelList *l) {
trelemar 2:af768faf5329 674 switch (state) {
trelemar 2:af768faf5329 675 case (MENU_STATE_MAIN):
trelemar 2:af768faf5329 676 disp.bgcolor=0;
trelemar 1:189e78ff65b1 677 disp.clear();
trelemar 1:189e78ff65b1 678 disp.setColor(15);
trelemar 2:af768faf5329 679 disp.print(2,2,"POKIT WARS");
trelemar 2:af768faf5329 680 disp.print(SW/2-(strlen(items[selected_item])*6/2),trans.val, items[selected_item]);
trelemar 2:af768faf5329 681 disp.fillRoundRect(box_x, SH/2, 16, 16,2);
trelemar 2:af768faf5329 682 for (int i=0; i<3; i++) {
trelemar 2:af768faf5329 683 int x = (SW/4)*(i+1)-8;
trelemar 2:af768faf5329 684 int spr = 64+i;
trelemar 2:af768faf5329 685 if (i==selected_item) {
trelemar 2:af768faf5329 686 box_target = x;
trelemar 2:af768faf5329 687 if (box_x-2<x&&box_x+2>x) {
trelemar 2:af768faf5329 688 box_x = x;
trelemar 2:af768faf5329 689 }
trelemar 2:af768faf5329 690 }
trelemar 2:af768faf5329 691 disp.drawBitmap(x, SH/2, sprites[spr]);
trelemar 2:af768faf5329 692 }
trelemar 2:af768faf5329 693 disp.bgcolor=12;
trelemar 2:af768faf5329 694 break;
trelemar 2:af768faf5329 695 case (MENU_STATE_LEVEL):
trelemar 2:af768faf5329 696 l->draw();
trelemar 2:af768faf5329 697 break;
trelemar 2:af768faf5329 698 }//SWITCH
trelemar 1:189e78ff65b1 699 };
trelemar 1:189e78ff65b1 700 };
trelemar 1:189e78ff65b1 701
trelemar 0:86d8ece873ca 702 int main() {
trelemar 1:189e78ff65b1 703 MainMenu main_menu;
trelemar 2:af768faf5329 704 PauseMenu pause_menu;
trelemar 0:86d8ece873ca 705 Transition tTrans(66,96,false);
trelemar 0:86d8ece873ca 706 Transition itemlist(40,72,false);
trelemar 0:86d8ece873ca 707 game.begin();
trelemar 2:af768faf5329 708 game.initClock();
trelemar 2:af768faf5329 709 game.initRandom();
trelemar 0:86d8ece873ca 710 game.setFrameRate(30);
trelemar 0:86d8ece873ca 711 disp.invisiblecolor = 12;
trelemar 0:86d8ece873ca 712 disp.bgcolor=12;
trelemar 0:86d8ece873ca 713 disp.persistence = 1;
trelemar 2:af768faf5329 714 disp.directbgcolor = disp.palette[0];
trelemar 2:af768faf5329 715 disp.directcolor = disp.palette[15];
trelemar 0:86d8ece873ca 716 disp.load565Palette(sprite_pal);
trelemar 2:af768faf5329 717 init_dark_palette();
trelemar 0:86d8ece873ca 718 disp.setFont(fontWAR);
trelemar 0:86d8ece873ca 719 map_x=0;
trelemar 0:86d8ece873ca 720 map_y=0;
trelemar 0:86d8ece873ca 721 cursor_x=4;
trelemar 0:86d8ece873ca 722 cursor_y=6;
trelemar 0:86d8ece873ca 723 vector<Hero> heros;
trelemar 2:af768faf5329 724 hptr = &heros;
trelemar 1:189e78ff65b1 725 pokInitSD();
trelemar 2:af768faf5329 726
trelemar 2:af768faf5329 727 char dir[3];
trelemar 2:af768faf5329 728 strcpy(dir, "War");
trelemar 2:af768faf5329 729
trelemar 2:af768faf5329 730 LevelList level_menu;
trelemar 2:af768faf5329 731
trelemar 0:86d8ece873ca 732 /*
trelemar 0:86d8ece873ca 733 heros.push_back(Hero(4,5,ID_SOLDIER, TEAM_USER));
trelemar 0:86d8ece873ca 734 heros.push_back(Hero(5,6,ID_SOLDIER, TEAM_USER));
trelemar 0:86d8ece873ca 735 heros.push_back(Hero(3,8,ID_SOLDIER, TEAM_USER));
trelemar 0:86d8ece873ca 736 heros.push_back(Hero(8,5,ID_SOLDIER, TEAM_CPU));
trelemar 0:86d8ece873ca 737 heros.push_back(Hero(8,7,ID_SOLDIER, TEAM_CPU));
trelemar 0:86d8ece873ca 738 heros.push_back(Hero(6,9,ID_SOLDIER, TEAM_CPU));
trelemar 0:86d8ece873ca 739 */
trelemar 0:86d8ece873ca 740
trelemar 0:86d8ece873ca 741 for (int i=0;i<6;i++) {
trelemar 0:86d8ece873ca 742 int team = TEAM_USER;
trelemar 0:86d8ece873ca 743 if (i>2) team = TEAM_CPU;
trelemar 0:86d8ece873ca 744 heros.push_back(Hero(random(0,MAP_WIDTH-1),random(0,MAP_HEIGHT-1),ID_SOLDIER, team));
trelemar 0:86d8ece873ca 745 }
trelemar 0:86d8ece873ca 746
trelemar 2:af768faf5329 747 //Hero * cursor_hero = NULL;
trelemar 2:af768faf5329 748 //Hero * current_hero = NULL;
trelemar 0:86d8ece873ca 749 Item itest(52, 3, 3);
trelemar 0:86d8ece873ca 750
trelemar 0:86d8ece873ca 751 while (game.isRunning()) {
trelemar 0:86d8ece873ca 752 if (game.update()) {
trelemar 0:86d8ece873ca 753 switch (State) {
trelemar 1:189e78ff65b1 754 case MENU:
trelemar 2:af768faf5329 755 main_menu.update(&level_menu);
trelemar 2:af768faf5329 756 main_menu.draw(&level_menu);
trelemar 1:189e78ff65b1 757 break;
trelemar 0:86d8ece873ca 758 case MAIN:
trelemar 0:86d8ece873ca 759 tTrans.update();
trelemar 0:86d8ece873ca 760 itemlist.update();
trelemar 0:86d8ece873ca 761 //If no current hero or current task is to move our current hero, accept cursor movement.
trelemar 0:86d8ece873ca 762 if (!current_hero||current_task==TASK_MOVE||current_task==TASK_ATTACK) {
trelemar 0:86d8ece873ca 763 CursorInput();
trelemar 0:86d8ece873ca 764 cursor_hero = getHeroAtCoords(cursor_x,cursor_y, heros);
trelemar 0:86d8ece873ca 765 }
trelemar 0:86d8ece873ca 766 //This will call when there is a current hero and not in a current task
trelemar 0:86d8ece873ca 767 else if (current_hero) {
trelemar 0:86d8ece873ca 768 //TASK SELECTOR
trelemar 0:86d8ece873ca 769 int dir = 0;
trelemar 0:86d8ece873ca 770 if (btn.pressed(BTN_RIGHT)) {
trelemar 0:86d8ece873ca 771 selected_task=min(selected_task+1,3);
trelemar 0:86d8ece873ca 772 }
trelemar 0:86d8ece873ca 773 if (btn.pressed(BTN_LEFT)) {
trelemar 0:86d8ece873ca 774 selected_task=max(selected_task-1,0);
trelemar 0:86d8ece873ca 775 }
trelemar 0:86d8ece873ca 776 if (selected_task==TASK_ITEM) {
trelemar 0:86d8ece873ca 777 itemlist.enabled = true;
trelemar 0:86d8ece873ca 778 }
trelemar 0:86d8ece873ca 779 else itemlist.enabled = false;
trelemar 0:86d8ece873ca 780 //selected_task=selected_task%4;
trelemar 0:86d8ece873ca 781 }
trelemar 0:86d8ece873ca 782
trelemar 0:86d8ece873ca 783 DrawTileMap(map_x, map_y, current_hero);
trelemar 0:86d8ece873ca 784 for (int i = 0; i<heros.size(); i++) {
trelemar 0:86d8ece873ca 785 heros[i].Draw();
trelemar 0:86d8ece873ca 786 heros[i].update(i);
trelemar 0:86d8ece873ca 787 }
trelemar 0:86d8ece873ca 788 itest.Draw();
trelemar 0:86d8ece873ca 789 DrawCursor(cursor_x-map_x,cursor_y-map_y);
trelemar 0:86d8ece873ca 790 disp.setColor(15);
trelemar 0:86d8ece873ca 791
trelemar 0:86d8ece873ca 792 if (btn.pressed(BTN_A)) {
trelemar 0:86d8ece873ca 793 if (current_hero&&current_task!=TASK_NONE) {
trelemar 0:86d8ece873ca 794 //THIS IS WITHIN A TASK, EX: SELECTING A MOVE LOCATION OR ATTACK TARGET.
trelemar 0:86d8ece873ca 795 switch (current_task) {
trelemar 0:86d8ece873ca 796 case TASK_MOVE:
trelemar 0:86d8ece873ca 797 //MOVE HERO TO CURSOR, NO COLISSIONS YET.
trelemar 0:86d8ece873ca 798 //ONLY IF IN RANGE AND NOT SOLID
trelemar 0:86d8ece873ca 799 //FIX STACKABLE HEROS
trelemar 0:86d8ece873ca 800 if (current_hero->inRange(cursor_x, cursor_y)&&!getHeroAtCoords(cursor_x, cursor_y, heros)&&!solids[Map[cursor_y][cursor_x]]) {
trelemar 0:86d8ece873ca 801 if (cursor_x<current_hero->x) current_hero->flip=true;
trelemar 0:86d8ece873ca 802 else if (cursor_x>current_hero->x) current_hero->flip=false;
trelemar 0:86d8ece873ca 803 current_hero->x = cursor_x;
trelemar 0:86d8ece873ca 804 current_hero->y = cursor_y;
trelemar 0:86d8ece873ca 805
trelemar 0:86d8ece873ca 806 current_task = TASK_NONE;
trelemar 0:86d8ece873ca 807 current_hero->tasks[TASK_MOVE] = false;
trelemar 0:86d8ece873ca 808 }
trelemar 0:86d8ece873ca 809 break;
trelemar 0:86d8ece873ca 810 case TASK_ATTACK:
trelemar 0:86d8ece873ca 811 if (cursor_hero&&current_hero->inRange(cursor_hero)) {
trelemar 0:86d8ece873ca 812 //FOUND TARGET AT CURSOR.
trelemar 0:86d8ece873ca 813 cursor_x = current_hero->x;
trelemar 0:86d8ece873ca 814 cursor_y = current_hero->y;
trelemar 0:86d8ece873ca 815 int8_t result = cursor_hero->hp - (current_hero->atk-cursor_hero->def);
trelemar 0:86d8ece873ca 816 cursor_hero->hp = result;
trelemar 0:86d8ece873ca 817 cursor_hero->hurt_time=game.frameCount;
trelemar 0:86d8ece873ca 818 if (result<=0) {
trelemar 0:86d8ece873ca 819 heros.erase(heros.begin()+cursor_hero->index);
trelemar 0:86d8ece873ca 820 }
trelemar 0:86d8ece873ca 821
trelemar 0:86d8ece873ca 822 current_task = TASK_NONE;
trelemar 0:86d8ece873ca 823 current_hero->tasks[TASK_ATTACK] = false;
trelemar 0:86d8ece873ca 824 }
trelemar 0:86d8ece873ca 825 else {
trelemar 0:86d8ece873ca 826 //NO TARGET FOUND, ERROR SOUND SHOULD PLAY.
trelemar 0:86d8ece873ca 827 }
trelemar 0:86d8ece873ca 828 break;
trelemar 0:86d8ece873ca 829
trelemar 0:86d8ece873ca 830 //DUMMY CODE, THESE ARE CALLED BELOW. NOT HERE.
trelemar 0:86d8ece873ca 831 case TASK_ITEM:
trelemar 0:86d8ece873ca 832 current_task = TASK_NONE;
trelemar 0:86d8ece873ca 833 current_hero->tasks[TASK_ITEM] = false;
trelemar 0:86d8ece873ca 834 break;
trelemar 0:86d8ece873ca 835 case TASK_WAIT:
trelemar 0:86d8ece873ca 836 current_task = TASK_NONE;
trelemar 0:86d8ece873ca 837 current_hero->tasks[TASK_WAIT] = false;
trelemar 0:86d8ece873ca 838 break;
trelemar 0:86d8ece873ca 839 }
trelemar 0:86d8ece873ca 840 }
trelemar 0:86d8ece873ca 841 else if (current_hero&&current_hero->tasks[selected_task]==true) {
trelemar 0:86d8ece873ca 842 //TASK SWITCH HERE
trelemar 0:86d8ece873ca 843 //THIS HAPPENS DIRECTLY AFTER PRESSING BTN_A ON A NEW TASK.
trelemar 0:86d8ece873ca 844 current_task=selected_task;
trelemar 0:86d8ece873ca 845
trelemar 0:86d8ece873ca 846 switch (selected_task) {
trelemar 0:86d8ece873ca 847 case TASK_ITEM:
trelemar 0:86d8ece873ca 848 current_task = TASK_NONE;
trelemar 0:86d8ece873ca 849 current_hero->tasks[TASK_ITEM] = false;
trelemar 0:86d8ece873ca 850 break;
trelemar 0:86d8ece873ca 851 case TASK_WAIT:
trelemar 0:86d8ece873ca 852 current_task = TASK_NONE;
trelemar 0:86d8ece873ca 853 current_hero->tasks[TASK_WAIT] = false;
trelemar 0:86d8ece873ca 854 break;
trelemar 0:86d8ece873ca 855 }
trelemar 0:86d8ece873ca 856 }
trelemar 0:86d8ece873ca 857 else if (cursor_hero) {
trelemar 0:86d8ece873ca 858 //NO CURRENT HERO, SELECT A HERO ONLY IF IN CURSOR HERE.
trelemar 0:86d8ece873ca 859 if (cursor_hero->team == current_team) {
trelemar 0:86d8ece873ca 860 current_hero = cursor_hero;
trelemar 0:86d8ece873ca 861 selected_task = TASK_MOVE;
trelemar 0:86d8ece873ca 862 tTrans.enabled = true;
trelemar 0:86d8ece873ca 863 }
trelemar 0:86d8ece873ca 864 }
trelemar 0:86d8ece873ca 865 }
trelemar 0:86d8ece873ca 866 if (btn.pressed(BTN_B)) {
trelemar 0:86d8ece873ca 867 if (current_task!=TASK_NONE) {
trelemar 0:86d8ece873ca 868 //BACK OUT OF CURRENT TASK.
trelemar 0:86d8ece873ca 869 current_task=TASK_NONE;
trelemar 0:86d8ece873ca 870 cursor_x = current_hero->x;
trelemar 0:86d8ece873ca 871 cursor_y = current_hero->y;
trelemar 0:86d8ece873ca 872 }
trelemar 0:86d8ece873ca 873 else if (current_hero&&current_task==TASK_NONE) {
trelemar 0:86d8ece873ca 874 tTrans.enabled=false; current_hero = NULL; //UNSELECT HERO.
trelemar 0:86d8ece873ca 875 }
trelemar 0:86d8ece873ca 876 }
trelemar 0:86d8ece873ca 877 if (btn.pressed(BTN_C)&& !current_hero) {
trelemar 0:86d8ece873ca 878 //heros.push_back(Hero(cursor_x,cursor_y,0,0));
trelemar 2:af768faf5329 879 //for (int i=0;i<heros.size();i++) heros[i].NewTurn();
trelemar 0:86d8ece873ca 880 State = PAUSE;
trelemar 2:af768faf5329 881 //disp.print("PAUSED");
trelemar 0:86d8ece873ca 882 //tTrans.toggle();
trelemar 0:86d8ece873ca 883 }
trelemar 0:86d8ece873ca 884 if (cursor_hero&&cursor_hero!=current_hero&&current_task) {
trelemar 0:86d8ece873ca 885 DrawCursorHeroUI(cursor_hero, (cursor_hero->x-map_x)*16-4,(cursor_hero->y-map_y)*16-7);
trelemar 0:86d8ece873ca 886 }
trelemar 0:86d8ece873ca 887 if (tTrans.val==tTrans.on_val) {
trelemar 0:86d8ece873ca 888 DrawItemList(current_hero, itemlist.val);
trelemar 0:86d8ece873ca 889 }
trelemar 0:86d8ece873ca 890 DrawSelectedHeroUI(current_hero, tTrans.val);
trelemar 0:86d8ece873ca 891
trelemar 0:86d8ece873ca 892 disp.setCursor(0,0);
trelemar 0:86d8ece873ca 893 DrawTurnCounter(heros);
trelemar 0:86d8ece873ca 894 //disp.print(0,32,dtest.text);
trelemar 0:86d8ece873ca 895 //disp.print(1,SH-6,(int)game.battery.level);
trelemar 0:86d8ece873ca 896 //disp.print(" ");
trelemar 0:86d8ece873ca 897 break;
trelemar 0:86d8ece873ca 898 case PAUSE:
trelemar 2:af768faf5329 899 pause_menu.update();
trelemar 2:af768faf5329 900 pause_menu.draw();
trelemar 0:86d8ece873ca 901 break;
trelemar 0:86d8ece873ca 902 }//GAME STATE SWITCH
trelemar 0:86d8ece873ca 903
trelemar 0:86d8ece873ca 904 }//UPDATE
trelemar 0:86d8ece873ca 905 }//IS RUNNING
trelemar 0:86d8ece873ca 906 return 1;
trelemar 0:86d8ece873ca 907 }