Great puzzle game by STUDIOCRAFTAPPS. Originally for Gamebuino, ported via automatic parser by Jonne
Dependencies: PokittoLib
Fork of Asterocks by
Diff: bbb.cpp
- Revision:
- 7:c167ef9d3f4b
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/bbb.cpp Wed Oct 18 22:03:14 2017 +0000 @@ -0,0 +1,2607 @@ +#include "PokittoCore.h" + +/* Auto-generated function declarations */ +byte getTile(byte,byte); +byte getPreviewTile(byte,byte); +void sfx(int,int); +void ChangeDirection (); +void DefinePos (byte,byte); +byte GetPosX (); +byte GetPosY (); +boolean GetDirection (); +void update (); +void setup(); +void DrawPlayer (); +void ClampCamera (); +int ClampInt (int,int,int); +byte GetTPSer1X(byte); +byte GetTPSer1Y(byte); +byte GetTPSer2X(byte); +byte GetTPSer2Y(byte); +void CheckForCollider (); +void PrepareMap (); +boolean inRay (byte,byte,byte); +boolean inRange (byte,byte); +void loop(); +void LoadCineStart(); +void LoadCineEnd(); +void SelectMap (); +void Die (); +void UnlockNext (); + +Pokitto::Core gb; + + + +int main () { + setup(); + while (gb.isRunning()) { + loop(); + } +} + +/* + * (C) Create by STUDIOCRAFTapps + * + * You are free to modify this code as long as you keep this message. + * Do not sell this game. Feel free to copy 'parts' of the game to + * help you create your. + * + * Vous etes libre de modifier ce code aussi longtemps que vous garder + * ce message. Vous ne devez pas vendre ce jeu. N'hésitez pas à copier + * des parties de ce jeu pour créer le votre. + * + */ + + +#include <math.h> +//#include <string> + + +int CamX; +int CamY; +int Frame; + +byte Mode = 0; + +byte NbrOfLevel = 13; +byte LevelsUnlock = 0; +byte MapCursor = 0; + +byte KeysGot = 0; + +byte EnnemieCount; + +byte CurrentLoadedMap = 0; + +byte Scroll = 0; +bool Found; + +boolean last = false; +boolean AC = false; +byte ACT; +boolean PistonPressed = false; + +const byte TeleporterSerie1X[] PROGMEM { + 12, + 0, + 11, + 10 +}; +const byte TeleporterSerie1Y[] PROGMEM { + 7, + 3, + 15, + 13 +}; +const byte TeleporterSerie2X[] PROGMEM { + 12, + 0, + 11, + 11 +}; +const byte TeleporterSerie2Y[] PROGMEM { + 1, + 8, + 11, + 2 +}; + +byte TeleporterCount = 4; + +byte* KeyX; +byte* KeyY; +bool* KeyGot; +byte KeyCount; + +byte* LockerX; +byte* LockerY; +bool* LockerGot; +byte LockerCount; + +///////////////////////////////////// +////Map stuf and sprite drawing V//// +///////////////////////////////////// + +const byte Map0Preview[] PROGMEM = { + 2,0,0, + 3,0,9, + 2,1,1 +}; + +const byte Map1Preview[] PROGMEM = { + 2,0,0, + 3,0,2, + 0,0,3 +}; + +const byte Map2Preview[] PROGMEM = { + 0,0,2, + 19,0,20, + 10,12,11 +}; + +const byte Map3Preview[] PROGMEM = { + 0,0,0, + 23,0,9, + 2,26,2 +}; + +const byte Map4Preview[] PROGMEM = { + 21,0,21, + 3,0,3, + 3,26,3 +}; + +const byte Map5Preview[] PROGMEM = { + 2,1,2, + 15,0,28, + 27,1,4 +}; + +const byte Map6Preview[] PROGMEM = { + 0,0,21, + 0,0,2, + 26,0,3 +}; + +const byte Map7Preview[] PROGMEM = { + 0,0,0, + 0,9,0, + 21,21,21 +}; + +const byte Map8Preview[] PROGMEM = { + 0,0,0, + 0,9,0, + 10,12,11 +}; + +const byte Map9Preview[] PROGMEM = { + 0,30,0, + 0,29,0, + 0,14,0 +}; + +const byte Map10Preview[] PROGMEM = { + 0,35,0, + 0,35,0, + 39,37,40 +}; + +const byte Map11Preview[] PROGMEM = { + 35,30,0, + 33,34,0, + 23,23,23 +}; + +const byte Map12Preview[] PROGMEM = { + 0,48,49, + 31,50,51, + 33,32,0 +}; + +const byte* MapsPreviews[13] = { + Map0Preview, + Map1Preview, + Map2Preview, + Map3Preview, + Map4Preview, + Map5Preview, + Map6Preview, + Map7Preview, + Map8Preview, + Map9Preview, + Map10Preview, + Map11Preview, + Map12Preview +}; + +const byte SpawnCoordX[] PROGMEM = { + 10, + 2, + 7, + 9, + 2, + 7, + 2, + 4, + 1, + 2, + 3, + 1, + 1 +}; + +const byte SpawnCoordY[] PROGMEM = { + 5, + 9, + 7, + 17, + 25, + 3, + 10, + 2, + 9, + 12, + 15, + 6, + 3 +}; + +const byte MapSizeX[] PROGMEM = { + 13, + 19, + 16, + 21, + 12, + 16, + 21, + 9, + 19, + 20, + 19, + 19, + 22 +}; + +const byte MapSizeY[] PROGMEM = { + 9, + 11, + 12, + 19, + 27, + 17, + 12, + 22, + 13, + 15, + 19, + 10, + 23 +}; + + + +const byte Logo[] PROGMEM = {64,30,0xAD,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0xB5,0x0,0x0,0x0,0x77,0x70,0x0,0x0,0xAD,0x0,0x0,0x0,0x52,0x40,0x0,0x0,0xB5,0x0,0x0,0x0,0x62,0x50,0x0,0x0,0xAD,0x0,0x0,0x0,0x52,0x50,0x0,0x0,0xB5,0x0,0x0,0x0,0x77,0x70,0x0,0x0,0xAD,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0xB5,0x0,0x0,0x0,0x74,0x27,0x50,0x0,0xAD,0x0,0x0,0x0,0x54,0x54,0x50,0x0,0xB5,0x0,0x0,0x0,0x64,0x74,0x60,0x0,0xAD,0x0,0x0,0x0,0x54,0x54,0x50,0x0,0xB5,0x0,0x0,0x0,0x77,0x57,0x50,0x0,0xAD,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0xB5,0x0,0x0,0x0,0x77,0x50,0x0,0x0,0xAD,0x0,0xF,0xF0,0x55,0x50,0x0,0x0,0xB5,0x0,0xF,0xF0,0x65,0x20,0x20,0x0,0xAD,0x0,0xD,0xD0,0x55,0x50,0x0,0x0,0xB5,0x0,0xD,0xD0,0x77,0x50,0x40,0x0,0xAD,0x0,0xF,0xF0,0x0,0x0,0x20,0x0,0xB5,0x0,0xF,0xF0,0xFF,0x0,0xF0,0x0,0xAD,0x0,0xF,0xF0,0x81,0x0,0x60,0x0,0xB5,0x0,0xF,0xF0,0xBD,0x0,0x60,0x0,0xFF,0xFF,0xFF,0xFF,0xA5,0x0,0xF0,0x0,0xC3,0xA6,0x66,0x65,0xA5,0x1,0xB8,0x0,0xA5,0xB9,0x99,0x9D,0xA5,0x3,0x9C,0x0,0x99,0xA6,0x66,0x65,0xA5,0x3,0xC,0x0,0x99,0xB9,0x99,0x9D,0xA5,0x1,0xF8,0x0,0xA5,0xA6,0x66,0x65,0xA5,0x0,0x0,0x0,0xC3,0xB9,0x99,0x9D,0xA5,0x0,0x0,0x0,0xFF,0xA6,0x66,0x65,0xE7,0x0,0x0,0x0,}; + +const PROGMEM byte Back0[] +{ + 8,8, + B01000000, + B00000100, + B00000000, + B00000000, + B01000000, + B00000000, + B00010000, + B00000001, +}; + +const PROGMEM byte Back1[] +{ + 8,8, + B00001000, + B01000000, + B00000000, + B00010000, + B00000001, + B00000000, + B00100000, + B10000000, +}; + +const PROGMEM byte ExclPoint[] +{ + 8,8, + B10000000, + B10000000, + B10000000, + B10000000, + B10000000, + B10000000, + B00000000, + B10000000, +}; + +const PROGMEM byte WhitePotion[] +{ + 8,8, + B00111100, + B00011000, + B00011000, + B01101110, + B10000101, + B10100001, + B10001001, + B01111110, +}; + +const PROGMEM byte PlayerSprite[] +{ + 8,8, + B11111111, + B11111111, + B11101101, + B11101101, + B11111111, + B11111111, + B11111111, + B11111111, +}; + +const PROGMEM byte EArrow1[] +{ + 8,8, + B00000000, + B01000000, + B01100000, + B01110000, + B01110000, + B01100000, + B01000000, + B00000000, +}; + +const PROGMEM byte EArrow2[] +{ + 8,8, + B00000000, + B00000010, + B00000110, + B00001110, + B00001110, + B00000110, + B00000010, + B00000000, +}; + +const PROGMEM byte ELocked[] +{ + 8,8, + B00000000, + B00110000, + B01001000, + B01111000, + B01111000, + B01111000, + B00000000, + B00000000, +}; + +const PROGMEM byte EUnLocked[] +{ + 8,8, + B00000000, + B00000110, + B00001001, + B01111000, + B01111000, + B01111000, + B00000000, + B00000000, +}; + +const PROGMEM byte Key[] = //ID: 19 +{ + 8,8, + B00000000, + B00000110, + B00001111, + B11111101, + B10101111, + B00000110, + B00000000, + B00000000, +}; + +const PROGMEM byte LockedBlock[] = //ID: 20 +{ + 8,8, + B01111110, + B11011111, + B10100011, + B10100011, + B11110111, + B10110111, + B11110111, + B01111110, +}; + +const PROGMEM byte Empty[] = //ID: 0 +{ + 8,8, + B00000000, + B00000000, + B00000000, + B00000000, + B00000000, + B00000000, + B00000000, + B00000000, +}; + +const PROGMEM byte Missing[] +{ + 8,8, + B10101010, + B00000001, + B10000000, + B00000001, + B10000000, + B00000001, + B10000000, + B01010101, +}; + +const PROGMEM byte GroundLeft[] = //ID: 10 +{ + 8,8, + B11111111, + B10111001, + B10100110, + B10111001, + B10100110, + B10111001, + B10100110, + B10111001, +}; + +const PROGMEM byte GroundRight[] = //ID: 11 +{ + 8,8, + B11111111, + B10011101, + B01100101, + B10011101, + B01100101, + B10011101, + B01100101, + B10011101, +}; + +const PROGMEM byte GroundMiddle[] = //ID: 12 +{ + 8,8, + B11111111, + B10011001, + B01100110, + B10011001, + B01100110, + B10011001, + B01100110, + B10011001, +}; + +const PROGMEM byte Window[] = //ID: 13 +{ + 8,8, + B11111111, + B10000001, + B10000001, + B10000001, + B10000001, + B10000001, + B10000001, + B11111111, +}; + +const PROGMEM byte Brick[] = //ID: 1 +{ + 8,8, + B11111111, + B00100001, + B11111111, + B10001000, + B11111111, + B00100001, + B11111111, + B10001000, +}; + +const PROGMEM byte SharpBrick[]= //ID: 2 +{ + 8,8, + B11111111, + B11000011, + B10100101, + B10011001, + B10011001, + B10100101, + B11000011, + B11111111, +}; +const PROGMEM byte TowerBrick[]= //ID: 3 +{ + 8,8, + B10101101, + B10110101, + B10101101, + B10110101, + B10101101, + B10110101, + B10101101, + B10110101, +}; + +const PROGMEM byte Piston[]= //ID: 4 +{ + 8,8, + B11111111, + B10000001, + B11011011, + B11011011, + B00111100, + B11100111, + B10000001, + B11111111, +}; + +const PROGMEM byte Holder[]= //ID: 5 +{ + 8,8, + B11111111, + B10100101, + B11111111, + B00000000, + B00000000, + B00000000, + B00000000, + B00000000, +}; + +const PROGMEM byte Teleporter1[]= //ID: 6 +{ + 8,8, + B11111111, + B10101011, + B11010110, + B10101100, + B10101100, + B11010110, + B10101011, + B11111111, +}; + +const PROGMEM byte Teleporter0[]= //ID: 7 +{ + 8,8, + B11111111, + B11010101, + B01101011, + B00110101, + B00110101, + B01101011, + B11010101, + B11111111, +}; + +const PROGMEM byte Wall[]= //ID: 8 +{ + 8,8, + B11110000, + B10010000, + B10010000, + B10010000, + B10010000, + B10010000, + B10010000, + B11110000, +}; + +const PROGMEM byte Ennemie[]= //ID: 9 +{ + 8,8, + B00000000, + B00000000, + B00000000, + B00000000, + B00000000, + B00000000, + B00000000, + B00000000, +}; + +const PROGMEM byte End[]= //ID: 22 +{ + 8,8, + B00000000, + B00110011, + B11001100, + B00000000, + B00000000, + B00000000, + B00000000, + B00000000, +}; + +const PROGMEM byte EnnemieSprite[]= +{ + 8,8, + B11111111, + B10000001, + B10010011, + B10010011, + B10000001, + B10000001, + B10000001, + B11111111, +}; +const PROGMEM byte EnnemieSprite1[]= +{ + 8,8, + B11111111, + B10000001, + B11001001, + B11001001, + B10000001, + B10000001, + B10000001, + B11111111, +}; + +const PROGMEM byte Table[] = //ID: 14 +{ + 8,8, + B11111111, + B10000001, + B10111101, + B10100101, + B10100101, + B10100101, + B10100101, + B11100111, +}; + +const PROGMEM byte PistonExtension[] = //ID: 15 +{ + 8,8, + B11100111, + B10011001, + B11100111, + B10011001, + B11100111, + B10011001, + B11100111, + B10011001, +}; + +const PROGMEM byte Arrow1[]= //ID: 16 +{ + 8,8, + B11111110, + B10010100, + B10111000, + B11111100, + B10111110, + B11011111, + B10001111, + B00000110, +}; + +const PROGMEM byte Arrow2[]= //ID: 17 +{ + 8,8, + B01111111, + B00101111, + B00010111, + B00101111, + B01011111, + B10111011, + B11110001, + B01100000, +}; + +const PROGMEM byte PlantPot[] = //ID: 18 +{ + 8,8, + B00000000, + B00101000, + B00010100, + B00001000, + B00010000, + B00111100, + B00111100, + B00011000, +}; + +const PROGMEM byte Spike[] = //ID: 21 +{ + 8,8, + B00000000, + B00100010, + B00100010, + B01010101, + B01010101, + B10001000, + B10101010, + B10101010, +}; + +const PROGMEM byte ConveyerBeltR[] = //ID: 23 +{ + 8,8, + B01111110, + B10100011, + B11000101, + B01111110, + B00000000, + B00000000, + B00000000, + B00000000, +}; + +const PROGMEM byte ConveyerBeltL[] = //ID: 24 +{ + 8,8, + B01111110, + B11000101, + B10100011, + B01111110, + B00000000, + B00000000, + B00000000, + B00000000, +}; + +const PROGMEM byte TowerBrickHat[]= //ID: 25 +{ + 8,8, + B00000000, + B00000000, + B00000000, + B11111111, + B10000001, + B11111111, + B10101101, + B10110101, +}; + +const PROGMEM byte Trampoline[] = //ID: 26 +{ + 8,8, + B11111111, + B00100100, + B01000010, + B10000001, + B01000010, + B00100100, + B11111111, + B11111111, +}; + +const PROGMEM byte AntiPiston[]= //ID: 27 +{ + 8,8, + B11111111, + B10000001, + B11000011, + B00100100, + B00111100, + B01000010, + B10000001, + B11000011, +}; + +const PROGMEM byte Potion[]= //ID: 29 +{ + 8,8, + B00111100, + B00011000, + B00011000, + B00111100, + B01101110, + B11100111, + B11000011, + B01111110, +}; + +const PROGMEM byte Bubble[]= //ID: 30 +{ + 8,8, + B00000000, + B00000000, + B00000000, + B00000000, + B00001000, + B00000000, + B00010000, + B00001000, +}; + +const PROGMEM byte Pipe0[]= //ID: 31 +{ + 8,8, + B00000000, + B00000000, + B00001111, + B00010000, + B00100000, + B00100011, + B00100100, + B00100100, +}; + +const PROGMEM byte Pipe1[]= //ID: 32 +{ + 8,8, + B00000000, + B00000000, + B11110000, + B00001000, + B00000100, + B11000100, + B00100100, + B00100100, +}; + +const PROGMEM byte Pipe2[]= //ID: 33 +{ + 8,8, + B00100100, + B00100100, + B00100011, + B00100000, + B00010000, + B00001111, + B00000000, + B00000000, +}; + +const PROGMEM byte Pipe3[]= //ID: 34 +{ + 8,8, + B00100100, + B00100100, + B11000100, + B00000100, + B00001000, + B11110000, + B00000000, + B00000000, +}; + +const PROGMEM byte Pipe4[]= //ID: 35 +{ + 8,8, + B00100100, + B00100100, + B00100100, + B00100100, + B00100100, + B00100100, + B00100100, + B00100100, +}; + +const PROGMEM byte Pipe5[]= //ID: 36 +{ + 8,8, + B00000000, + B00000000, + B11111111, + B00000000, + B00000000, + B11111111, + B00000000, + B00000000, +}; + +const PROGMEM byte Stock0[]= //ID: 37 +{ + 8,8, + B01000010, + B10000001, + B00000000, + B10011001, + B01100110, + B00000000, + B11111111, + B00000000, +}; + +const PROGMEM byte Stock1[]= //ID: 38 +{ + 8,8, + B00000000, + B11111111, + B00000000, + B10011001, + B01100110, + B00000000, + B11111111, + B00000000, +}; + +const PROGMEM byte Stock2[]= //ID: 39 +{ + 8,8, + B00000000, + B01111111, + B10000000, + B10011001, + B11100110, + B10000000, + B01111111, + B00000000, +}; + +const PROGMEM byte Stock3[]= //ID: 40 +{ + 8,8, + B00000000, + B11111110, + B00000001, + B10011001, + B01100111, + B00000001, + B11111110, + B00000000, +}; + +const PROGMEM byte Controller0[]= //ID: 41 +{ + 8,8, + B00000000, + B00000000, + B00000000, + B00000000, + B00000000, + B00000000, + B00000000, + B11100000, +}; + +const PROGMEM byte Controller1[]= //ID: 42 +{ + 8,8, + B10110000, + B10101000, + B10101100, + B10101010, + B10101001, + B11111111, + B10000001, + B11111111, +}; + +const PROGMEM byte Crate[]= //ID: 43 +{ + 8,8, + B00000000, + B00000000, + B01111110, + B01000010, + B01110110, + B01101110, + B01000010, + B01111110, +}; + +const PROGMEM byte Experiment0[]= //ID: 44 +{ + 8,8, + B00001111, + B00010000, + B00010011, + B00011100, + B00010000, + B00010000, + B00010000, + B00010111, +}; + +const PROGMEM byte Experiment1[]= //ID: 45 +{ + 8,8, + B11110000, + B00001000, + B00001000, + B11001000, + B00111000, + B00001000, + B00001000, + B11101000, +}; + +const PROGMEM byte Experiment2[]= //ID: 46 +{ + 8,8, + B00010011, + B00010011, + B11110111, + B00000111, + B00000111, + B11110110, + B00010000, + B00001111, +}; + +const PROGMEM byte Experiment3[]= //ID: 47 +{ + 8,8, + B01101000, + B01101000, + B11101000, + B11101000, + B11101000, + B01101000, + B00001000, + B11110000, +}; + +//--- + +const PROGMEM byte Experiment4[]= +{ + 8,8, + B00001111, + B00010000, + B00010011, + B00011100, + B00010000, + B00010111, + B00010111, + B00010101 +}; + +const PROGMEM byte Experiment5[]= +{ + 8,8, + B11111100, + B00000010, + B00110010, + B11001110, + B00000010, + B11111010, + B11111010, + B10111010 +}; + +const PROGMEM byte Experiment6[]= +{ + 8,8, + B00010101, + B00010111, + B11110111, + B00000111, + B00000111, + B11110000, + B00010000, + B00011111 +}; + +const PROGMEM byte Experiment7[]= +{ + 8,8, + B10111010, + B11111010, + B11111010, + B11111010, + B11111010, + B00000010, + B00000010, + B11111100 +}; + +/*const PROGMEM byte Name[]= //ID: 40 +{ + 8,8, + B00000000, + B00000000, + B00000000, + B00000000, + B00000000, + B00000000, + B00000000, + B00000000, +};*/ + +const byte Map0[] PROGMEM = { +0,0,0,0,0,0,0,0,0,0,0,0,2, +2,1,2,5,5,0,0,0,0,0,0,0,6, +3,0,0,0,0,0,4,5,2,0,0,0,2, +3,0,25,0,16,0,15,0,0,0,0,0,3, +2,0,3,0,0,0,15,18,0,0,0,0,3, +3,0,3,0,17,0,15,14,0,0,0,0,3, +3,0,3,0,0,0,2,5,5,0,5,5,2, +3,0,3,0,9,0,3,0,9,0,0,0,6, +2,22,2,1,1,1,2,1,1,1,1,1,2, +}; + +const byte Map1[] PROGMEM = { + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 2,1,2,0,0,0,0,2,1,1,1,1,1,1,1,1,1,1,2, + 3,0,0,0,0,0,0,0,0,8,0,2,0,0,0,0,0,0,3, + 3,0,0,0,21,0,0,0,0,8,0,3,0,0,0,0,0,0,3, + 3,0,0,5,5,5,5,0,0,0,0,2,0,0,5,5,5,0,3, + 2,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,2, + 3,0,0,0,2,0,0,0,3,0,0,0,0,0,0,21,0,0,3, + 3,0,0,0,21,21,21,21,3,0,0,21,0,0,0,2,0,0,3, + 3,0,0,0,2,2,2,2,2,0,5,5,5,0,0,3,0,0,3, + 3,0,0,0,3,0,0,0,3,21,21,21,21,21,21,3,22,22,3, + 2,1,1,1,2,0,0,0,2,1,1,1,1,1,1,2,1,1,2 +}; + +const byte Map2[] PROGMEM = { + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 2,0,0,0,0,8,0,0,0,0,0,2,0,0,0,2, + 3,0,0,0,0,8,0,0,0,0,0,3,0,0,0,3, + 7,0,0,0,0,0,0,0,0,0,0,3,0,0,0,3, + 2,5,0,0,0,0,0,21,19,0,0,3,0,0,0,3, + 3,0,0,0,9,0,21,2,5,0,0,2,0,0,0,3, + 3,1,1,1,1,1,2,5,0,0,0,0,0,0,0,2, + 2,0,0,0,0,0,0,0,0,0,0,0,0,0,19,3, + 7,0,0,19,0,0,0,0,0,21,0,17,0,2,1,2, + 2,1,1,1,1,2,0,5,0,2,5,0,0,3,0,3, + 3,0,20,20,20,0,0,0,0,3,0,0,0,3,0,3, + 2,22,10,12,11,2,10,12,11,2,21,21,21,2,0,2, +}; + +const byte Map3[] PROGMEM = { + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2, + 3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3, + 3,0,0,0,0,0,0,0,15,0,15,15,0,15,0,15,15,0,0,0,3, + 3,0,0,0,0,0,0,0,0,15,21,21,21,21,21,15,0,4,0,16,3, + 3,0,0,0,0,0,0,0,0,2,1,1,1,1,1,2,0,0,0,0,3, + 3,0,0,0,0,0,0,15,0,0,0,0,0,0,0,0,0,0,0,0,3, + 3,0,0,0,0,0,0,15,0,0,0,0,0,0,0,0,0,0,2,5,3, + 3,0,21,0,0,21,0,25,0,0,9,0,0,0,21,0,0,0,0,0,3, + 3,0,5,5,5,5,0,3,23,23,23,23,23,23,3,5,0,0,0,0,3, + 2,15,0,0,0,0,27,2,5,5,5,5,5,5,2,0,0,0,0,5,2, + 3,5,0,0,0,0,2,21,0,0,0,0,0,21,0,0,0,0,0,0,3, + 3,4,0,0,0,0,1,2,1,1,1,1,1,2,0,17,0,0,9,0,3, + 3,5,5,5,0,5,15,0,0,0,0,0,0,8,0,25,21,21,21,21,3, + 2,0,0,0,0,2,0,25,0,0,0,0,19,8,0,2,1,2,5,5,2, + 3,0,24,24,24,0,0,3,24,24,24,24,24,8,0,0,0,0,0,0,3, + 3,0,0,0,0,0,0,2,5,5,5,5,5,2,0,0,18,0,25,20,3, + 3,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,14,0,3,22,3, + 2,1,1,1,1,1,26,2,10,12,12,12,11,2,26,2,10,12,12,11,2 +}; + +const byte Map4[] PROGMEM = { + 0,0,0,0,0,0,0,0,0,0,0,0, + 2,1,1,1,1,1,2,0,0,0,0,0, + 3,0,0,0,0,0,3,0,0,0,0,0, + 3,0,0,0,0,0,1,1,2,0,0,0, + 3,0,0,0,0,0,0,0,3,0,0,0, + 3,0,0,0,21,0,0,0,2,1,1,2, + 3,22,2,0,3,0,0,0,0,0,0,3, + 3,2,2,0,3,21,0,0,21,0,0,3, + 3,0,0,0,5,5,5,5,2,0,0,3, + 3,0,0,0,0,0,0,0,3,0,0,3, + 3,0,0,0,0,0,0,0,3,0,0,2, + 3,0,21,21,21,21,21,21,3,0,0,6, + 3,21,2,1,1,1,1,1,1,2,21,3, + 3,2,2,0,0,0,0,0,0,1,1,2, + 2,0,0,0,0,0,0,0,0,0,0,3, + 3,0,0,0,21,0,0,21,0,0,0,6, + 3,0,0,0,2,5,5,2,5,5,5,2, + 3,0,0,0,0,0,0,3,0,0,0,0, + 2,0,0,0,0,0,0,2,1,1,1,2, + 3,0,0,0,0,0,0,0,0,0,0,3, + 3,0,0,0,21,0,0,0,0,0,0,3, + 3,0,21,21,3,0,0,21,0,0,0,3, + 2,1,1,1,2,1,1,2,17,0,0,3, + 3,0,0,0,0,0,0,0,0,0,0,3, + 3,0,0,0,0,0,0,0,0,0,16,3, + 3,0,0,0,0,0,0,0,0,0,0,3, + 2,1,1,1,2,21,21,21,26,21,21,2 +}; + +const byte Map5[] PROGMEM = { + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 2,1,1,1,2,3,2,4,2,3,1,1,1,1,1,2, + 3,0,0,0,28,3,0,0,0,15,0,0,0,0,0,3, + 3,0,8,0,28,20,0,0,0,15,0,0,0,0,0,3, + 2,0,4,1,2,3,2,27,2,3,0,0,0,0,0,3, + 3,0,0,0,0,0,0,0,0,3,15,15,27,28,28,3, + 3,16,0,0,0,0,0,0,0,3,0,0,15,0,0,3, + 3,0,0,0,0,0,0,0,0,3,0,0,15,0,0,3, + 3,0,0,21,0,21,0,0,0,3,28,28,4,15,15,4, + 3,21,21,2,15,2,0,26,0,3,0,0,28,0,0,3, + 3,5,5,5,0,5,5,5,5,3,0,0,28,0,0,3, + 3,0,0,0,0,0,0,0,0,3,0,0,27,28,28,3, + 3,0,0,0,0,18,0,0,0,3,0,0,15,0,0,3, + 3,0,25,0,0,14,0,0,0,3,0,0,15,0,0,3, + 3,0,2,5,5,2,5,20,5,2,1,1,1,2,28,3, + 3,0,0,0,19,3,22,22,22,3,19,0,0,0,0,3, + 2,1,1,1,1,2,1,1,1,2,1,1,1,1,1,2 +}; + +const byte Map6[] PROGMEM = { + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 2,1,1,1,2,1,1,1,1,2,0,0,0,0,0,0,0,0,0,0,2, + 3,0,0,0,0,0,0,0,0,3,21,21,0,0,0,0,0,0,0,0,3, + 3,0,0,0,0,0,0,0,0,2,1,2,0,0,0,0,0,0,0,0,3, + 3,0,0,0,21,0,0,0,0,0,0,8,17,0,0,0,0,0,0,0,3, + 3,0,0,0,2,0,0,0,0,0,0,8,0,21,0,0,21,0,0,0,3, + 3,0,0,0,3,0,0,0,0,21,0,0,0,2,0,0,2,0,0,0,3, + 3,0,0,0,3,21,21,21,21,2,0,0,0,3,0,0,0,0,0,0,3, + 3,0,0,0,3,5,5,5,5,3,0,0,0,3,21,21,21,21,21,0,3, + 3,0,0,0,3,0,0,0,0,3,0,0,0,3,5,5,5,5,2,0,3, + 3,0,26,0,3,0,0,0,0,3,0,26,0,3,0,0,0,0,3,22,3, + 2,10,12,11,2,0,0,0,0,2,10,12,11,2,0,0,0,0,2,5,2 +}; + +const byte Map7 [] PROGMEM = { + 0,0,0,0,0,0,0,0,0, + 2,1,4,1,1,1,1,1,2, + 3,0,0,0,0,0,0,0,3, + 3,28,28,28,28,28,28,28,3, + 3,0,0,0,0,0,0,0,3, + 3,0,0,0,0,0,21,21,3, + 3,0,0,0,0,0,5,5,3, + 3,21,0,0,0,0,0,0,3, + 3,5,21,0,0,0,0,16,3, + 3,5,5,21,0,0,0,21,3, + 3,5,5,5,21,0,21,5,3, + 3,5,5,5,5,0,5,5,3, + 3,0,0,0,0,0,2,0,3, + 3,0,0,0,0,0,3,0,3, + 3,0,21,21,21,21,2,0,3, + 3,0,5,5,5,5,5,0,3, + 3,0,0,0,0,0,0,0,3, + 3,0,0,0,0,0,0,0,3, + 3,0,0,0,0,0,0,0,3, + 3,2,0,0,0,0,0,0,3, + 3,3,0,9,0,0,0,0,3, + 3,2,21,21,21,21,2,22,3, + 2,1,1,1,1,1,1,1,2 +}; + +const byte Map8 [] PROGMEM = { + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2, + 3,0,0,0,0,0,3,0,0,0,3,0,0,0,0,0,0,0,3, + 3,0,0,0,0,19,3,0,0,0,20,0,0,0,0,0,25,20,3, + 3,0,5,5,5,5,5,0,0,0,25,0,0,0,0,0,3,22,3, + 3,0,0,0,0,0,0,0,0,0,5,5,5,5,5,5,5,5,2, + 3,0,0,0,25,0,0,0,0,0,0,0,0,0,0,0,0,0,3, + 2,1,1,1,2,0,0,0,0,0,0,0,0,0,0,0,0,0,3, + 3,0,0,0,3,0,0,0,25,0,9,0,25,0,0,0,0,0,3, + 3,0,0,0,5,0,0,0,3,5,5,5,5,0,0,0,0,0,3, + 3,5,5,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,3, + 3,0,0,9,0,0,0,0,3,19,0,0,9,0,0,0,0,0,3, + 2,10,12,11,2,10,12,11,2,10,12,11,2,10,12,11,2,1,2 +}; + +const byte Map9 [] PROGMEM = { + 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00, + 02,04,01,02,01,01,02,01,01,01,02,01,01,01,01,02,00,35,00,00, + 03,00,00,03,00,00,03,27,00,00,03,07,00,15,00,03,00,33,36,32, + 03,00,00,03,00,00,02,00,00,00,02,05,00,15,00,03,00,30,00,35, + 03,00,00,03,17,00,28,00,00,00,00,00,05,02,00,02,00,29,00,35, + 03,00,00,27,00,00,28,00,00,00,00,00,00,03,00,03,00,14,00,35, + 03,00,00,03,00,00,02,00,00,21,00,00,00,03,00,02,01,01,02,35, + 03,00,00,02,00,00,03,05,05,02,21,00,00,02,00,00,00,00,03,35, + 03,00,00,28,00,00,03,00,00,03,05,21,00,03,05,05,05,00,03,35, + 03,00,00,28,00,00,03,32,00,03,05,05,00,03,00,00,00,00,02,35, + 03,00,00,02,21,21,02,35,00,02,00,00,00,02,22,22,22,22,03,35, + 03,00,00,03,05,05,03,35,00,03,00,00,00,03,05,05,05,05,05,35, + 03,00,00,03,00,00,03,35,00,03,00,00,00,03,00,00,31,36,36,34, + 03,21,26,03,00,00,03,33,36,03,07,00,00,03,39,38,37,38,38,40, + 02,10,12,02,00,00,02,00,00,02,01,01,01,02,01,01,01,01,01,01, +}; + +const byte Map10 [] PROGMEM = { + 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00, + 02,01,01,01,01,02,00,00,00,00,00,00,00,00,00,00,00,00,00, + 03,00,00,20,20,00,00,00,00,00,00,00,00,00,00,00,00,00,00, + 02,22,02,01,01,02,00,00,00,00,00,00,00,00,00,30,00,19,00, + 00,02,00,00,31,32,00,00,00,00,00,00,00,00,00,33,03,05,00, + 00,00,00,00,35,35,00,00,21,00,00,00,00,00,00,00,05,00,00, + 36,36,36,36,34,33,36,36,02,00,9,00,00,02,00,00,00,00,00, + 00,00,39,38,38,40,00,00,05,05,05,05,05,05,00,00,00,00,21, + 00,31,36,32,00,00,00,00,00,00,00,00,00,00,00,00,00,00,02, + 00,35,39,37,38,38,40,00,00,00,00,00,00,00,00,00,00,00,03, + 36,34,00,00,00,00,00,00,00,00,00,21,41,00,00,00,21,00,03, + 00,00,00,00,00,00,00,00,00,00,00,02,42,00,9,00,02,00,03, + 00,00,00,00,00,00,00,00,00,00,00,03,05,05,05,05,03,19,03, + 00,00,00,00,00,00,00,00,00,00,00,03,00,43,00,00,03,05,02, + 36,36,32,00,00,00,00,26,00,00,00,03,00,14,00,00,03,00,00, + 00,39,37,40,00,00,02,01,02,00,00,02,05,05,05,05,02,00,00, + 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00, + 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00, + 21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21, +}; + +const byte Map11 [] PROGMEM = { + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 2,0,0,0,0,35,0,0,0,0,0,0,0,0,0,0,0,0,2, + 3,0,0,0,0,35,0,0,0,0,0,0,0,0,0,0,0,0,3, + 3,22,8,21,0,33,32,0,21,0,0,0,21,0,0,0,0,0,3, + 3,2,1,1,1,2,35,0,5,0,0,2,1,8,0,0,0,0,2, + 3,0,0,0,0,0,35,0,30,0,0,0,0,0,0,0,0,0,3, + 3,0,0,0,0,0,35,0,35,0,0,0,0,0,0,0,0,0,3, + 3,5,0,0,0,0,33,36,34,21,0,0,0,0,0,0,0,0,3, + 3,0,0,0,0,9,0,0,0,3,0,0,21,21,0,25,0,0,3, + 2,23,23,23,23,23,23,23,23,2,23,23,23,23,23,2,21,21,2 +}; + +const byte Map12 [] PROGMEM = { + 0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 2,1,2,1,2,1,2,0,0,0,0,0,0,0,0,0,0,2,0,4,0,2, + 3,0,5,0,0,0,3,0,0,0,0,0,0,0,0,0,0,15,0,0,0,3, + 3,0,0,0,0,0,3,19,0,25,0,9,0,0,8,0,0,15,0,0,0,3, + 2,1/*1*/,2,1,2,0,3,5,5,5,5,5,5,5,8,0,0,2,28,28,28,3, + 0,0,0,0,3,0,3,0,0,0,0,0,0,0,5,0,0,3,0,0,0,3, + 0,0,0,0,3,0,2,0,0,0,0,0,0,0,0,0,0,3,0,0,0,3, + 0,0,0,0,3,0,0,0,0,21,0,0,0,0,0,0,0,3,0,21,0,3, + 0,0,0,0,3,0,21,0,0,3,0,0,21,21,0,25,0,3,0,2,0,3, + 0,0,0,0,3,0,2,23,23,3,23,23,23,23,23,3,5,3,0,0,0,3, + 0,0,0,0,3,21,3,0,0,3,0,43,0,0,0,3,0,3,21,0,21,3, + 2,1/*1*/,1,1,2,5,2,1,1,2,1,1,1,1,1,2,1,2,2,0,2,2, + 3,35,0,0,35,0,0,35,0,0,0,0,0,33,32,3,0,0,0,0,0,3, + 3,35,44,45,35,48,49,35,48,49,0,0,0,31,34,3,0,0,0,0,0,3, + 3,33,46,47,33,50,51,33,50,51,0,0,39,37,40,3,0,21,0,0,0,3, + 3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,2,0,0,0,3, + 3,1,1,1,1,1,1,1,2,0,0,0,0,0,30,3,0,3,0,0,0,3, + 3,0,0,0,0,0,0,0,0,0,0,0,0,0,33,3,0,3,0,0,0,3, + 3,0,0,0,0,0,0,0,0,0,5,5,5,0,0,3,0,3,21,0,21,3, + 3,0,0,30,0,0,0,0,0,0,0,0,0,0,43,3,0,3,5,0,5,3, + 3,0,0,29,0,0,0,41,0,0,0,0,0,0,5,2,0,3,0,0,0,3, + 3,0,0,14,0,9,2,42,0,0,0,0,0,0,0,20,0,3,0,26,0,3, + 2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,2,1,1,1,2 +}; + +const byte* GetMap[] { + Map0, + Map1, + Map2, + Map3, + Map4, + Map5, + Map6, + Map7, + Map8, + Map9, + Map10, + Map11, + Map12 +}; + +////////////////////////////////////////////// +////Var Initi. for physics and grounding V//// +////////////////////////////////////////////// + +#define LCDWidth 84 +#define LCDHeight 48 + +#define BouncyMath1 0.0322580//6452 +#define BouncyMath2 -0.0483870f//9677 +#define BouncyMath3 -0.0393700f//7874 +#define BouncyMath4 0.0236220f//4724 + +byte MapHeigth = 9; +byte MapWidth = 13; + +boolean GoingRight = true; + +boolean GroundedDown = false; +boolean GroundedRight = false; +boolean GroundedLeft = false; + +boolean IsPlaying = false; + +///////////////////// +////Block Setup V//// +///////////////////// + +const byte* sprites[52] = { + Empty, + Brick, + SharpBrick, + TowerBrick, + Piston, + Holder, + Teleporter0, + Teleporter1, + Wall, + Ennemie, + GroundLeft, + GroundRight, + GroundMiddle, + Window, + Table, + PistonExtension, + Arrow1, + Arrow2, + PlantPot, + Key, + LockedBlock, + Spike, + End, + ConveyerBeltR, + ConveyerBeltL, + TowerBrickHat, + Trampoline, + AntiPiston, + Missing, + Potion, + Bubble, + Pipe0, + Pipe1, + Pipe2, + Pipe3, + Pipe4, + Pipe5, + Stock0, + Stock1, + Stock2, + Stock3, + Controller0, + Controller1, + Crate, + Experiment0, + Experiment1, + Experiment2, + Experiment3, + Experiment4, + Experiment5, + Experiment6, + Experiment7 +}; + +const byte coltype[52] = { //0 = empty 1 = block + 0, + 1, + 1, + 1, + 9, + 2, //2 + 3, + 4, + 5, //5 + 0, + 1, + 1, + 1, + 0, + 0, + 6, + 0, + 0, + 0, + 7, + 8, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17, + 18, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + //0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 +}; + +const byte coltypeSys[52] = { //0 = empty 1 = block + 0, + 1, + 1, + 1, + 1, + 1, //2 + 1, + 1, + 1, //5 + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1 +}; + +////////////////////////////// +////GetTile & Var initi. V//// +////////////////////////////// + + +byte getTile(byte x, byte y){ + return pgm_read_byte(GetMap[MapCursor] + (x+y*MapWidth)); + //return (Maps[CurrentLoadedMap])[x+y*MapWidth]; +} + +byte getPreviewTile(byte x, byte y){ + return pgm_read_byte(MapsPreviews[MapCursor] + (x+y*3)); + //return MapsPreviews[MapCursor][(x+y*MapWidth)]; +} + +///////Sound//////// + +const int soundfx[8][8] = { + {1,27,90,2,7,7,3,7}, //jump < + {1,27,112,1,1,1,6,4}, // walljump < + {0,27,57,1,1,1,6,4}, // unlockdoor < + {0,9,57,1,6,8,7,8}, // land + {0,46,57,1,0,18,7,47}, // getkey < + {0,38,79,3,6,7,7,20}, // finish < + {0,30,68,3,0,0,7,5}, // click < + {0,30,55,1,7,0,7,15} //Death < +}; + +void sfx(int fxno, int channel) { + gb.sound.command(0, soundfx[fxno][6], 0, channel); // set volume + gb.sound.command(1, soundfx[fxno][0], 0, channel); // set waveform + gb.sound.command(2, soundfx[fxno][5], -soundfx[fxno][4], channel); // set volume slide + gb.sound.command(3, soundfx[fxno][3], soundfx[fxno][2] - 58, channel); // set pitch slide + gb.sound.playNote(soundfx[fxno][1], soundfx[fxno][7], channel); // play note + //WAVEFORM, PITCH, PMD, PMT, VMD, VMT, VOL, LENGTH +} + +int CPosX = 0; //Cam Position +int CPosY = 0; + +float PPosX = 0; //Player Position +float PPosY = 0; + +byte SquisheVertical = 8; //Player squishness :) +byte SquisheHorizontal = 8; + +signed char VelocityX; //Velocity (used for physics) +signed char VelocityY; + +/////////////////// +////EnnemieAi V//// +/////////////////// + +class EnnemieAI { + private: + byte PosX; + byte PosY; + + byte Progress; + + boolean GoRight; + boolean Pre; + + void ChangeDirection () { + GoRight = !GoRight; + } + + bool SimplePixInColl (byte PIMX, byte PIMY) { //PIM = Pos in map (0-255), PIC = Pos in cube (0-8) + byte GlobalColiderType = coltype[getTile(PIMX,PIMY)]; + + if(GlobalColiderType == 0) { + return false; + } else if(GlobalColiderType == 16 || GlobalColiderType == 17) { + return false; + } else if(GlobalColiderType == 15) { + return false; + } else { + return true; + } + } + + public: + EnnemieAI() { + Progress = 0; + GoRight = true; + Pre = false; + } + + void DefinePos (byte PositionX, byte PositionY) { + PosX = PositionX; + PosY = PositionY; + } + + byte GetPosX () { + return PosX; + } + + byte GetPosY () { + return PosY; + } + + boolean GetDirection () { + return GoRight; + } + + void update () { + if(Progress > 2) { + Progress = 0; + } else { + Progress++; + if(GoRight) { + if(!SimplePixInColl((floor((PosX + 5) / 8.0)) , (floor((PosY + 3) / 8.0)))) { + PosX++; + } else { + ChangeDirection(); + } + } + if(!GoRight) { + if(!SimplePixInColl((floor((PosX - 5) / 8.0)) , (floor((PosY + 3) / 8.0)))) { + PosX--; + } else { + ChangeDirection(); + } + } + } + Pre = false; + byte ColY[8]; + for(int yd=0; yd < 8; yd++) { //yd = Y Down + ColY[yd] = SimplePixInColl((floor((PosX - 3 + yd) / 8.0)) , (floor((PosY + /*4*/4 + 0) / 8.0))); + } + for(int yd=0; yd < 8; yd++) { + if(ColY[yd] == 1) { + Pre = true; + break; + } + } + if(!Pre) { + PosY++; + } + } +}; + +EnnemieAI* ennemieArray; + +/////////////////////////////// +////Setup & PlayerDrawing V//// +/////////////////////////////// + +void setup() { + // put your setup code here, to run once: + gb.begin(); + gb.display.palette[0]=COLOR_MAGENTA; + gb.display.palette[1]=COLOR_BLACK; + gb.titleScreen(("v1.0"),Logo); + gb.battery.show = false; + gb.setFrameRate(20); + + //LevelsUnlock = EEPROM.read(0); +} + +void DrawPlayer () { //Draw player based on squisness + if(GoingRight == true) { + gb.display.fillRect(CPosX - (PPosX + SquisheHorizontal/2.0) + 8, CPosY - (PPosY + SquisheVertical/2.0) + 8, SquisheHorizontal, SquisheVertical); + gb.display.setColor(WHITE,WHITE); + gb.display.drawFastVLine(CPosX - (PPosX + SquisheHorizontal/2.0) + 6 + SquisheHorizontal, CPosY - (PPosY + SquisheVertical/2.0) + 10, 2); + gb.display.drawFastVLine(CPosX - (PPosX + SquisheHorizontal/2.0) + 3 + SquisheHorizontal, CPosY - (PPosY + SquisheVertical/2.0) + 10, 2); + gb.display.setColor(BLACK,WHITE); + } else { + gb.display.fillRect(CPosX - (PPosX + SquisheHorizontal/2.0) + 8, CPosY - (PPosY + SquisheVertical/2.0) + 8, SquisheHorizontal, SquisheVertical); + gb.display.setColor(WHITE,WHITE); + gb.display.drawFastVLine(CPosX - (PPosX + SquisheHorizontal/2.0) + 9, CPosY - (PPosY + SquisheVertical/2.0) + 10, 2); + gb.display.drawFastVLine(CPosX - (PPosX + SquisheHorizontal/2.0) + 12, CPosY - (PPosY + SquisheVertical/2.0) + 10, 2); + gb.display.setColor(BLACK,WHITE); + } +} + +//////////////// +////Camera V//// +//////////////// + + + +int ClampInt (int minv, int maxv, int value) { + if(value < minv) + return minv; + else if(value >= maxv) + return maxv; + else + return value; +} + +void ClampCamera () { //Clamp the camera in the world + if(MapWidth < 11) { + CPosX = (LCDWIDTH - MapWidth*8)/2; + } else { + CPosX = ClampInt(-(8*MapWidth-LCDWidth),0,PPosX+(LCDWIDTH/2)-8); + } + CPosY = ClampInt(-(8*MapHeigth-LCDHeight),-8,PPosY+(LCDHEIGHT/2)-8); +} +/////////////////// +////Colliding V//// +/////////////////// + +byte GetTPSer1X(byte i) { + return pgm_read_byte(TeleporterSerie1X + i); +} + +byte GetTPSer1Y(byte i) { + return pgm_read_byte(TeleporterSerie1Y + i); +} + +byte GetTPSer2X(byte i) { + return pgm_read_byte(TeleporterSerie2X + i); +} + +byte GetTPSer2Y(byte i) { + return pgm_read_byte(TeleporterSerie2Y + i); +} + +int PixelInCollider (byte PIMX, byte PIMY, byte PICX, byte PICY) { //PIM = Pos in map (0-255), PIC = Pos in cube (0-8) + + byte GlobalColiderType = coltype[getTile(PIMX,PIMY)]; + + byte x1; + byte y1; + byte x2; + byte y2; + + byte Value = 0; + switch (GlobalColiderType) { + case 0: + Value = 1; + break; + case 1: + Value = 2; + break; + case 2: + x1 = 1; + y1 = 0; + x2 = 6; + y2 = 3; + break; + case 3: + //Teleporter0 + for(int a = 0; a < TeleporterCount; a++) { + if(GetTPSer1X(a) == PIMX && GetTPSer1Y(a) == PIMY) { + //Found = true; + PPosX = -((float)GetTPSer2X(a)*8) + 13; + PPosY = -((float)GetTPSer2Y(a)*8) + 4; //Reverse + VelocityX = 63; + VelocityY = 40; + } + if(GetTPSer2X(a) == PIMX && GetTPSer2Y(a) == PIMY) { + //Found = true; + PPosX = -((float)GetTPSer1X(a)*8) + 13; + PPosY = -((float)GetTPSer1Y(a)*8) + 4; + VelocityX = 63; + VelocityY = 40; + } + } + break; + case 4: + //Teleporter0 + for(int a = 0; a < TeleporterCount; a++) { + if(GetTPSer1X(a) == PIMX && GetTPSer1Y(a) == PIMY) { + //Found = true; + PPosX = -((float)GetTPSer2X(a)*8) - 5; + PPosY = -((float)GetTPSer2Y(a)*8) + 4; //Reverse + VelocityX = -63; + AC = true; + VelocityY = 40; + } + if(GetTPSer2X(a) == PIMX && GetTPSer2Y(a) == PIMY) { + //Found = true; + PPosX = -((float)GetTPSer1X(a)*8) - 5; + PPosY = -((float)GetTPSer1Y(a)*8) + 4; + VelocityX = -63; + AC = true; + VelocityY = 40; + } + } + break; + case 5: + x1 = 0; + y1 = 0; + x2 = 4; + y2 = 8; + break; + case 6: + if(PistonPressed) { + Value = 2; + } else { + Value = 1; + } + break; + case 7: + //That's the key + Value = 1; + for(int a = 0; a < KeyCount; a++) { + if(KeyX[a] == PIMX && KeyY[a] == PIMY) { + if(!KeyGot[a]) { + sfx(4, 1); + KeysGot++; + KeyGot[a] = true; + break; + } + } + } + break; + case 8: + //That's the locker + if(KeysGot > 0) { + for(int a = 0; a < LockerCount; a++) { + if(LockerX[a] == PIMX && LockerY[a] == PIMY) { + if(LockerGot[a] == false) { + sfx(2, 1); + LockerGot[a] = true; + KeysGot--; + break; + } + } + } + } + for(int a = 0; a < LockerCount; a++) { + if(LockerX[a] == PIMX && LockerY[a] == PIMY) { + if(LockerGot[a]) { + Value = 1; + } else { + Value = 2; + } + break; + } else { + Value = 2; + } + } + break; + case 9: + x1 = 0; + y1 = 0; + x2 = 7; + y2 = 7; + PistonPressed = true; + break; + case 10: + x1 = 2; + y1 = 5; + x2 = 7; + y2 = 7; + if(7-PICX >= x1 && 7-PICX <= x2 && 7-PICY>= y1 && 7-PICY<= y2) { + sfx(7, 1); + Die(); + } + break; + case 11: + sfx(5, 2); + UnlockNext(); + break; + case 12: + x1 = 0; + y1 = 0; + x2 = 7; + y2 = 4; + if(7-PICX >= x1 && 7-PICX <= x2 && 7-PICY>= y1 && 7-PICY<= y2) { + VelocityX = 30; + ACT = 0; + } + break; + case 13: + x1 = 0; + y1 = 0; + x2 = 7; + y2 = 4; + if(7-PICX >= x1 && 7-PICX <= x2 && 7-PICY>= y1 && 7-PICY<= y2) { + VelocityY = -30; + ACT = 1; + } + break; + case 14: + x1 = 0; + y1 = 3; + x2 = 7; + y2 = 7; + break; + case 15: + x1 = 0; + y1 = 0; + x2 = 7; + y2 = 7; + VelocityY = 110; + ACT = 2; + break; + case 16: + x1 = 0; + y1 = 0; + x2 = 7; + y2 = 7; + PistonPressed = false; + break; + case 17: + if(!PistonPressed) { + Value = 2; + } else { + Value = 1; + } + break; + case 18: + LoadCineEnd(); + break; + default: + Value = 1; + break; + } + + if(Value == 0) { + if(7-PICX >= x1 && 7-PICX <= x2 && 7-PICY>= y1 && 7-PICY<= y2) { + Value = 2; + } else { + Value = 1; + } + } + return Value - 1; +} + +void CheckForCollider () { //Based on current velocity //Need improvement to support BigWhiteBox + if(VelocityX != 0) { + byte ColX[8]; + if(VelocityX > 0) { + for(int xd=0; xd < 8; xd++) { //yd = Y Down + ColX[xd] = PixelInCollider( (-(floor((PPosX + 5 + 0) / 8.0))) , (-(floor((PPosY - 3 + xd) / 8.0))) , -(-(PPosX + 5/*e5<4*/ + 0) - (-(floor((PPosX + 5/*e5<4*/ + 0) / 8.0)))*8) , -(-(PPosY - 3 + xd) - (-(floor((PPosY - 3 + xd) / 8.0)))*8) ); + } + for(int xd=0; xd < 8; xd++) { + if(ColX[xd] == 1) { + //gb.popup(F("A wall has been detected"), 20); + VelocityX = 0; + GroundedLeft = true; + } + } + } + + if(VelocityX < 0) { + for(int xd=0; xd < 8; xd++) { //yd = Y Down + ColX[xd] = PixelInCollider( (-(floor((PPosX - 4 + 0) / 8.0))) , (-(floor((PPosY - 3 + xd) / 8.0))) , -(-(PPosX - 4 + 0) - (-(floor((PPosX - 4 + 0) / 8.0)))*8) , -(-(PPosY - 3 + xd) - (-(floor((PPosY - 3 + xd) / 8.0)))*8) ); + } + } + for(int xd=0; xd < 8; xd++) { + if(ColX[xd] == 1) { + //gb.popup(F("A wall has been detected"), 20); + VelocityX = 0; + GroundedRight = true; + } + } + } + + + //working stuff V + + + if(VelocityY != 0) { + byte ColY[8]; + if(VelocityY > 0) { + for(int yd=0; yd < 8; yd++) { //yd = Y Down + ColY[yd] = PixelInCollider((-(floor((PPosX - 3 + yd) / 8.0))) , (-(floor((PPosY + 5 + 0) / 8.0))) , -(-(PPosX - 3 + yd) - (-(floor((PPosX - 3 + yd) / 8.0)))*8) , -(-(PPosY + 5/*e5*/ + 0) - (-(floor((PPosY + 5/*e5*/ + 0) / 8.0)))*8)); + } + for(int yd=0; yd < 8; yd++) { + if(ColY[yd] == 1) { + VelocityY = 0; + } + } + } + if(VelocityY < 0) { + for(int yd=0; yd < 8; yd++) { //yd = Y Down + ColY[yd] = PixelInCollider((-(floor((PPosX - 3 + yd) / 8.0))) , (-(floor((PPosY - 4 + 0) / 8.0))) , -(-(PPosX - 3/*e3*/ + yd) - (-(floor((PPosX - 3/*e3*/ + yd) / 8.0)))*8) , -(-(PPosY - 4/*e4*/ + 0) - (-(floor((PPosY - 4/*e4*/ + 0) / 8.0)))*8)); + } + for(int yd=0; yd < 8; yd++) { + if(ColY[yd] == 1) { + VelocityY = 0; + GroundedDown = true; + } + } + } + } + + byte ColG[6]; + + for(int yd=0; yd < 6; yd++) { //yd = Y Down + ColG[yd] = PixelInCollider((-(floor((PPosX - 2 + yd) / 8.0))) , (-(floor((PPosY - 3 + 0) / 8.0))) , -(-(PPosX - 2/*e3*/ + yd) - (-(floor((PPosX - 2/*e3*/ + yd) / 8.0)))*8) , -(-(PPosY - 3/*e4*/ + 0) - (-(floor((PPosY - 3/*e4*/ + 0) / 8.0)))*8)); + } + for(int yd=0; yd < 6; yd++) { + if(ColG[yd] == 1) { + VelocityY = 30; + } + } +} + +////////////////////// +////PreparingMap V//// +////////////////////// + +void PrepareMap () { + //PPosX = (8*SpawnCoordX[CurrentLoadedMap]); + //PPosY = (8*SpawnCoordY[CurrentLoadedMap]); + PPosX = -(8*pgm_read_byte(SpawnCoordX + CurrentLoadedMap)) + 4; //Convert Spawnpos to Worldpos + PPosY = -(8*pgm_read_byte(SpawnCoordY + CurrentLoadedMap)) + 4; + + VelocityX = 0; + VelocityY = 0; + PistonPressed = false; + IsPlaying = true; + MapWidth = pgm_read_byte(MapSizeX + CurrentLoadedMap); + MapHeigth = pgm_read_byte(MapSizeY + CurrentLoadedMap); + + KeysGot = 0; + + byte EnnemieC = 0; + KeyCount = 0; + LockerCount = 0; + + for(byte x = 0; x < MapWidth; x++) { //Draw maps + for(byte y = 0; y < MapHeigth; y++) { + if(getTile(x,y)==9) { + EnnemieC++; + } + if(getTile(x,y) == 19) { + KeyCount++; + } + if(getTile(x,y) == 20) { + LockerCount++; + } + } + } + + EnnemieCount = EnnemieC; + + ennemieArray = new EnnemieAI[EnnemieCount]; + + KeyX = new byte[KeyCount]; + KeyY = new byte[KeyCount]; + KeyGot = new bool[KeyCount]; + for(int q = 0; q < KeyCount; q++) { + KeyGot[q] = false; + } + + LockerX = new byte[LockerCount]; + LockerY = new byte[LockerCount]; + LockerGot = new bool[LockerCount]; + for(int q = 0; q < LockerCount; q++) { + LockerGot[q] = false; + } + + int i = 0; + int a = 0; + int b = 0; + for(byte x = 0; x < MapWidth; x++) { //Draw maps + for(byte y = 0; y < MapHeigth; y++) { + if(getTile(x,y)==9) { + ennemieArray[i].DefinePos(x*8+0,y*8+0); + i++; + } + if(getTile(x,y) == 19) { + KeyX[a] = x; + KeyY[a] = y; + a++; + } + if(getTile(x,y) == 20) { + LockerX[b] = x; + LockerY[b] = y; + b++; + } + } + } + + if(CurrentLoadedMap == 0) { + LoadCineStart(); + } +} + +////////////////// +////Updating V//// +////////////////// + +boolean inRay (byte Min, byte Max, byte Value) { + return Value <= Max && Value >= Min; +} + +boolean inRange (byte r, byte v) { + return inRay(r,r+8,v+2) || inRay(r,r+8,v+6); +} + +void loop() { + // put your main code here, to run repeatedly: + if(gb.update()) { + + if(IsPlaying) { + GroundedDown = false; + GroundedRight = false; + GroundedLeft = false; + + if(last == false && GroundedDown == true) { + sfx(3, 3); + } + + last = GroundedDown; + + if(!(gb.buttons.timeHeld(BTN_RIGHT) > 0) && !(gb.buttons.timeHeld(BTN_LEFT) > 0)) { + VelocityX = VelocityX * 0.6f; + } + + if(VelocityY - 3 > -127) { + VelocityY = VelocityY - 3; + } else { + VelocityY = -127; + } + + if(gb.buttons.timeHeld(BTN_RIGHT) > 0) { + if(VelocityX - 4 > -30) { + VelocityX -= 4; + } + GoingRight = true; + } + if(gb.buttons.timeHeld(BTN_LEFT) > 0) { + if(VelocityX + 4 < 30) { + VelocityX += 4; + } + GoingRight = false; + } + + ACT = 3; + + CheckForCollider(); + + if(gb.buttons.pressed(BTN_A) && GroundedDown) { + sfx(0, 0); + VelocityY = 66; + } + + if(gb.buttons.pressed(BTN_A) && GroundedRight && !GroundedDown) { + VelocityX = 60; + VelocityY = 56; + sfx(1, 0); + } + + if(gb.buttons.pressed(BTN_A) && GroundedLeft && !GroundedDown) { + VelocityX = -60; + VelocityY = 56; + sfx(1, 0); + } + + if(gb.buttons.pressed(BTN_C)) { + IsPlaying = false; + SelectMap(); + } + + if(AC == true) { + VelocityX = -63; + AC = false; + } + if(ACT == 0) { + VelocityX = -23; + } else if(ACT == 1){ + VelocityX = 23; + } else if (ACT == 2 && gb.buttons.pressed(BTN_A)) { + VelocityY = 110; + } + + PPosX += VelocityX / 127.0F * 3; + PPosY += VelocityY / 127.0F * 3; + + if(VelocityY > 0) { + //ex: 62 to 0 is flat to normal + if(VelocityY > 62) { + SquisheVertical = 5; + SquisheHorizontal = 10; + } else { + SquisheVertical = 8+(VelocityY*BouncyMath2); + SquisheHorizontal = 8+(VelocityY*BouncyMath1); + } + } + if(VelocityY < 0) { + //ex: 0 to -127 is normal to verticaly flat + SquisheVertical = 8+(VelocityY*BouncyMath3); + SquisheHorizontal = 8+(VelocityY*BouncyMath4); + } + if(VelocityY == 0) { + SquisheVertical = 8; + SquisheHorizontal = 8; + } + + DrawPlayer(); + ClampCamera(); + + for(byte c = 0; c < EnnemieCount; c++) { + ennemieArray[c].update(); + if(ennemieArray[c].GetDirection()) { + gb.display.drawBitmap(CPosX + ennemieArray[c].GetPosX() - 4, CPosY + ennemieArray[c].GetPosY() - 4, EnnemieSprite); + } else { + gb.display.drawBitmap(CPosX + ennemieArray[c].GetPosX() - 4, CPosY + ennemieArray[c].GetPosY() - 4, EnnemieSprite1); + } + if(inRange(ennemieArray[c].GetPosX() - 8, -PPosX) && inRange(ennemieArray[c].GetPosY() - 8, -PPosY)) { + sfx(7, 1); + Die(); + } + } + + /*gb.display.setColor(GRAY, WHITE); + for(byte x = 0; x < MapWidth; x++) { //Draw maps + for(byte y = 0; y < MapHeigth; y++) { + if((x+y*MapWidth) % 2 == 0) { + gb.display.drawBitmap(CPosX*(float)0.7 + x*8, CPosY*(float)0.7 + y*8, Back0); + } else { + gb.display.drawBitmap(CPosX*(float)0.7 + x*8, CPosY*(float)0.7 + y*8, Back1); + } + } + } + + gb.display.setColor(BLACK, WHITE);*/ + for(byte x = 0; x < MapWidth; x++) { //Draw maps + for(byte y = 0; y < MapHeigth; y++) { + if(getTile(x,y) == 15) { + if(PistonPressed) { + gb.display.drawBitmap(CPosX + x*8, CPosY + y*8, sprites[15]); + } else { + gb.display.drawBitmap(CPosX + x*8, CPosY + y*8, Missing); + } + } else if(getTile(x,y) == 19) { + for(int a = 0; a < KeyCount; a++) { + if(KeyX[a] == x && KeyY[a] == y) { + if(KeyGot[a] == true) { + gb.display.drawBitmap(CPosX + x*8, CPosY + y*8, Empty); + } else { + gb.display.drawBitmap(CPosX + x*8, CPosY + y*8, sprites[19]); + } + break; + } else { + if(a >= KeyCount) { + gb.display.drawBitmap(CPosX + x*8, CPosY + y*8, sprites[19]); + } + } + } + } else if(getTile(x,y) == 20) { + for(int a = 0; a < LockerCount; a++) { + if(LockerX[a] == x && LockerY[a] == y) { + if(LockerGot[a]) { + gb.display.drawBitmap(CPosX + x*8, CPosY + y*8, Empty); + } else { + gb.display.drawBitmap(CPosX + x*8, CPosY + y*8, sprites[20]); + } + break; + } else { + if(a >= LockerCount) { + gb.display.drawBitmap(CPosX + x*8, CPosY + y*8, sprites[20]); + } + } + } + } else if(getTile(x,y) == 28) { + if(!PistonPressed) { + gb.display.drawBitmap(CPosX + x*8, CPosY + y*8, sprites[15]); + } else { + gb.display.drawBitmap(CPosX + x*8, CPosY + y*8, Missing); + } + } else { + gb.display.drawBitmap(CPosX + x*8, CPosY + y*8, sprites[getTile(x,y)]); + } + } + } + + } else { + if(Mode == 0) { + SelectMap(); + } else if(Mode == 1) { + for(byte x = 0; x < 3; x++) { + for(byte y = 0; y < 3; y++) { + if(getPreviewTile(x,y) == 9) { + gb.display.drawBitmap(30 + x*8, 12 + y*8, EnnemieSprite); + } else { + gb.display.drawBitmap(30 + x*8, 12 + y*8, sprites[getPreviewTile(x,y)]); + } + } + } + if(MapCursor <= LevelsUnlock) { + gb.display.drawBitmap(0,0,EUnLocked); + if(gb.buttons.pressed(BTN_A)) { + CurrentLoadedMap = MapCursor; + IsPlaying = true; + PrepareMap(); + } + } else { + gb.display.drawBitmap(0,0,ELocked); + } + if(MapCursor - 1 >= 0) { + gb.display.drawBitmap(0,20,EArrow2); + if(gb.buttons.pressed(BTN_LEFT)) { + sfx(6, 2); + MapCursor--; + } + } + if(MapCursor + 1 < NbrOfLevel) { + gb.display.drawBitmap(76,20,EArrow1); + if(gb.buttons.pressed(BTN_RIGHT)) { + sfx(6, 2); + MapCursor++; + } + } + if(gb.buttons.pressed(BTN_C)) { + IsPlaying = false; + gb.begin(); + gb.titleScreen(("v1.0"),Logo); + gb.battery.show = false; + } + } else if(Mode == 2) { + + if(Scroll < 13) { + Scroll++; + } + gb.display.fontSize = 2; + + gb.display.cursorX = 2; + gb.display.cursorY = (-10+Scroll); + + gb.display.print(("Blackout!")); + + gb.display.fontSize = 1; + + gb.display.cursorX = 2; + gb.display.cursorY = (18+(Scroll*0.5f)); + + gb.display.print(("Press A to continue")); + if(gb.buttons.pressed(BTN_A)) { + SelectMap(); + } + } else if(Mode == 3) { + if(Scroll < 13) { + Scroll++; + } + gb.display.fontSize = 2; + + gb.display.cursorX = 2; + gb.display.cursorY = (-10+Scroll); + + gb.display.print(("Good Job!")); + + gb.display.fontSize = 1; + + gb.display.cursorX = 2; + gb.display.cursorY = (18+(Scroll*0.5f)); + + gb.display.print(("Press A to continue")); + if(gb.buttons.pressed(BTN_A)) { + SelectMap(); + } + } else if(Mode == 4) { + if(gb.buttons.pressed(BTN_A)) { + IsPlaying = true; + Frame = 0; + } + //Start - WhitePotion, Potion, Brick, EnnemieSprite, PlayerSprite, End, ExclPoint + if(Frame < 45) { + //Potion is falling and the ennemie is normal + gb.display.drawBitmap((LCDWIDTH/2-4)+CamX,((Frame)-8+CamY)-8, WhitePotion); //Potion + gb.display.drawBitmap((LCDWIDTH/2-4)+CamX,(LCDHEIGHT-8+CamY)-8, PlayerSprite); //Ennemie + for(int i = 0; i < 14; i++) { //Ground + if(i==0||i==13) { + gb.display.drawBitmap(-24+(i*8)+CamX,LCDHEIGHT-8, SharpBrick); + } else { + gb.display.drawBitmap(-24+(i*8)+CamX,LCDHEIGHT-8, Brick); + } + } + } else if(Frame < 80){ + //Ennemie is White, Cam scroll to the player, player has ExclamationPoint + gb.display.drawBitmap((LCDWIDTH/2-4)+CamX,(LCDHEIGHT-8+CamY)-8, EnnemieSprite); //Ennemie + gb.display.drawBitmap(-8+CamX,(LCDHEIGHT-8+CamY)-8,PlayerSprite); //Player + gb.display.drawBitmap(-8+CamX+4,(LCDHEIGHT-8+CamY - 9)-8,ExclPoint); //ExclamationPoint + for(int i = 0; i < 14; i++) { //Ground + if(i==0||i==13) { + gb.display.drawBitmap(-24+(i*8)+CamX,LCDHEIGHT-8, SharpBrick); + } else { + gb.display.drawBitmap(-24+(i*8)+CamX,LCDHEIGHT-8, Brick); + } + } + gb.display.drawBitmap(-24-16+CamX,LCDHEIGHT-8,End); //Display Water + gb.display.drawBitmap(-24-8+CamX,LCDHEIGHT-8,End); //Display Water + CamX++; + } else if(Frame < 110) { + //Cam stop scroll, Player turn his big fat square face (replace face by something else) wait few frames + gb.display.drawBitmap((LCDWIDTH/2-4)+CamX,(LCDHEIGHT-8+CamY)-8, EnnemieSprite); //Ennemie + gb.display.drawBitmap(-8+CamX,(LCDHEIGHT-8+CamY)-8,PlayerSprite, NOROT, FLIPH); //Player + for(int i = 0; i < 14; i++) { //Ground + if(i==0||i==13) { + gb.display.drawBitmap(-24+(i*8)+CamX,LCDHEIGHT-8, SharpBrick); + } else { + gb.display.drawBitmap(-24+(i*8)+CamX,LCDHEIGHT-8, Brick); + } + } + gb.display.drawBitmap(-24-16+CamX,LCDHEIGHT-8,End); //Display Water + gb.display.drawBitmap(-24-8+CamX,LCDHEIGHT-8,End); //Display Water + } else { + //Jumpin'n'dat water. + gb.display.drawBitmap((LCDWIDTH/2-4)+CamX,(LCDHEIGHT-8+CamY)-8, EnnemieSprite); //Ennemie + gb.display.drawBitmap(-8+CamX - (int)((Frame - 110)/(float)(140-110)*30),(LCDHEIGHT-8+CamY)-8 + (int)-(cos( ( (( ((float)Frame - 110)/((float)140-110))*180-90 )*(float)/*57.2958f*/0.0174533))*(float)16),PlayerSprite, NOROT, FLIPH); //Player + for(int i = 0; i < 14; i++) { //Ground + if(i==0||i==13) { + gb.display.drawBitmap(-24+(i*8)+CamX,LCDHEIGHT-8, SharpBrick); + } else { + gb.display.drawBitmap(-24+(i*8)+CamX,LCDHEIGHT-8, Brick); + } + } + gb.display.drawBitmap(-24-16+CamX,LCDHEIGHT-8,End); //Display Water (For the one who want to know why "Water" end a level? It's a one way teleporter!) + gb.display.drawBitmap(-24-8+CamX,LCDHEIGHT-8,End); //Display Water + } + + if(Frame >= 150) { + IsPlaying = true; + Frame = 0; + } + Frame++; + } else if(Mode == 5) { + //End - Potion, Table, EnnemieSprite(Reverse), PlayerSprite + if(Frame < 50) { + for(int i = 0; i < 11; i++) { + if(i==0||i==10) { + gb.display.drawBitmap(i*8+CamX,LCDHEIGHT-8+CamY,SharpBrick); + } else { + gb.display.drawBitmap(i*8+CamX,LCDHEIGHT-8+CamY,Brick); + } + } + + gb.display.drawBitmap(38+CamX,LCDHEIGHT-16+CamY,Table); + + if(Frame < 25) { + gb.display.drawBitmap(38+CamX,LCDHEIGHT-24+CamY,Potion); + } else { + gb.display.drawBitmap(38+CamX+((Frame-25)*(float)0.2),LCDHEIGHT-24+CamY-((Frame-25)*(float)0.1),Potion); + } + + gb.display.drawBitmap(26+CamX + (Frame*(float)0.2),LCDHEIGHT-16+CamY - (Frame*(float)0.2),PlayerSprite); + gb.display.drawBitmap(50+CamX,LCDHEIGHT-16+CamY,EnnemieSprite, NOROT, FLIPH); + } else if(Frame < 90) { + for(int i = 0; i < 11; i++) { + if(i==0||i==10) { + gb.display.drawBitmap(i*8+CamX,LCDHEIGHT-8+CamY,SharpBrick); + } else { + gb.display.drawBitmap(i*8+CamX,LCDHEIGHT-8+CamY,Brick); + } + } + + gb.display.drawBitmap(38+CamX,LCDHEIGHT-16+CamY,Table); + + gb.display.drawBitmap(48+CamX+((Frame-90)*(float)0.075),LCDHEIGHT-16/*22*/+CamY-((Frame-90)*(float)-0.2),Potion); + + gb.display.drawBitmap(26+CamX + ((Frame-90)*(float)-0.2),LCDHEIGHT-14/*22*/+CamY - ((Frame-90)*(float)-0.2),PlayerSprite); + gb.display.drawBitmap(50+CamX,LCDHEIGHT-16+CamY,EnnemieSprite, NOROT, FLIPH); + } else if(Frame >= 90 && Frame < 94) { + gb.display.setColor(BLACK); + gb.display.setColor(INVERT); + gb.display.fillRect(0,0,84,48); + for(int i = 0; i < 11; i++) { + if(i==0||i==10) { + gb.display.drawBitmap(i*8+CamX,LCDHEIGHT-8+CamY,SharpBrick); + } else { + gb.display.drawBitmap(i*8+CamX,LCDHEIGHT-8+CamY,Brick); + } + } + gb.display.drawBitmap(38+CamX,LCDHEIGHT-16+CamY,Table); + gb.display.drawBitmap(26+CamX,LCDHEIGHT-16+CamY,PlayerSprite); + gb.display.drawBitmap(50+CamX,LCDHEIGHT-16+CamY,EnnemieSprite, NOROT, FLIPH); + gb.display.setColor(BLACK); + } else { + for(int i = 0; i < 11; i++) { + if(i==0||i==10) { + gb.display.drawBitmap(i*8+CamX,LCDHEIGHT-8+CamY,SharpBrick); + } else { + gb.display.drawBitmap(i*8+CamX,LCDHEIGHT-8+CamY,Brick); + } + } + gb.display.drawBitmap(38+CamX,LCDHEIGHT-16+CamY,Table); + gb.display.drawBitmap(26+CamX,LCDHEIGHT-16+CamY,PlayerSprite); + gb.display.drawBitmap(50+CamX,LCDHEIGHT-16+CamY, PlayerSprite, NOROT, FLIPH); + + gb.display.fontSize = 2; + + gb.display.cursorX = 2; + gb.display.cursorY = (-10+13); + + gb.display.print(("The end.")); + } + + if(Frame >= 500) { + Frame = 0; + SelectMap(); + } + Frame+=3; + } + } + } +} + +void LoadCineStart() { + Frame = 0; + CamX = 0; + CamY = 0; + Mode = 4; + IsPlaying = false; +} + +void LoadCineEnd() { + Frame = 0; + CamX = 0; + CamY = 0; + Mode = 5; + IsPlaying = false; +} + +void SelectMap () { + IsPlaying = false; + Mode = 1; +} + +void Die () { + IsPlaying = false; + Mode = 2; + Scroll = 0; +} + +void UnlockNext () { + if(CurrentLoadedMap == LevelsUnlock) { + LevelsUnlock++; + } + //EEPROM.update(0, LevelsUnlock); + Mode = 3; + IsPlaying = false; +}