Pokitto turn based strategy game.

Dependencies:   PokittoLib

Committer:
trelemar
Date:
Sun Dec 10 04:19:20 2017 +0000
Revision:
5:ef209f39269a
Parent:
4:e77580278416
Child:
6:2b8e70d68247
Sniper art, and gun line

Who changed what in which revision?

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