summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorXaviDCR92 <xavi.dcr@gmail.com>2017-03-07 20:57:09 +0100
committerXaviDCR92 <xavi.dcr@gmail.com>2017-03-07 20:57:09 +0100
commit8ec41b4410aba535008daf991ea59a8740951d44 (patch)
tree01ee0846f579d9d139ee46a6a43f67ba522c7196
downloadpocketempires-8ec41b4410aba535008daf991ea59a8740951d44.tar.gz
+ Initial commit. Added source, sprites and final executable.
-rw-r--r--BarracksSpr.c58
-rw-r--r--Building.c81
-rw-r--r--Building.h46
-rw-r--r--Camera.c150
-rw-r--r--Camera.h41
-rw-r--r--Exe/POCKET.HEX1100
-rw-r--r--Exe/POCKET.elfbin0 -> 95400 bytes
-rw-r--r--GameStructures.h62
-rw-r--r--Gameplay.cpp147
-rw-r--r--Gameplay.h32
-rw-r--r--Gfx.cpp191
-rw-r--r--Gfx.h68
-rw-r--r--Global_Inc.h46
-rw-r--r--Makefile43
-rw-r--r--Menu.cpp54
-rw-r--r--Menu.h18
-rw-r--r--Pad.cpp43
-rw-r--r--Pad.h49
-rw-r--r--PeasantSpr.c27
-rw-r--r--Player.cpp192
-rw-r--r--Player.h59
-rw-r--r--PocketEmpires/PocketEmpires.atsln8
-rw-r--r--PocketEmpires/PocketEmpires.atsuobin0 -> 27648 bytes
-rw-r--r--Sprites/Barracks.bmpbin0 -> 1782 bytes
-rw-r--r--Sprites/BarracksShadow.bmpbin0 -> 1782 bytes
-rw-r--r--Sprites/Mouse.bmpbin0 -> 246 bytes
-rw-r--r--Sprites/Peasant_Left1.bmpbin0 -> 438 bytes
-rw-r--r--Sprites/Peasant_Left2.bmpbin0 -> 438 bytes
-rw-r--r--Sprites/Peasant_Left3.bmpbin0 -> 438 bytes
-rw-r--r--Sprites/Peasant_LeftRight.bmpbin0 -> 246 bytes
-rw-r--r--Sprites/Peasant_UpDown.bmpbin0 -> 198 bytes
-rw-r--r--Sprites/Peasant_Walking_UpDown.bmpbin0 -> 246 bytes
-rw-r--r--Sprites/PocketEmpires.ino284
-rw-r--r--Sprites/PocketEmpires.ino.hex781
-rw-r--r--Sprites/Soldiers.bmpbin0 -> 7734 bytes
-rw-r--r--Sprites/Tower.bmpbin0 -> 1590 bytes
-rw-r--r--System.c278
-rw-r--r--System.h90
-rw-r--r--Unit.cpp81
-rw-r--r--main.cpp33
40 files changed, 4062 insertions, 0 deletions
diff --git a/BarracksSpr.c b/BarracksSpr.c
new file mode 100644
index 0000000..0f881e0
--- /dev/null
+++ b/BarracksSpr.c
@@ -0,0 +1,58 @@
+
+const uint8_t BarracksSpr_Data[] PROGMEM =
+{
+ 24 /* Width */ ,24 /* Height */,
+ 0xE7,0x0,0xE7,
+ 0xBD,0x0,0xBD,
+ 0xE7,0xFF,0xE7,
+ 0xBD,0x0,0xBD,
+ 0x81,0xFF,0x81,
+ 0xE7,0x0,0xE7,
+ 0xA5,0x0,0xA5,
+ 0xBD,0xFF,0xBD,
+ 0xA5,0x0,0xA5,
+ 0xA5,0x0,0xA5,
+ 0xA5,0x0,0xA5,
+ 0xA5,0x0,0xA5,
+ 0xA5,0x0,0xA5,
+ 0xA5,0x0,0xA5,
+ 0xA5,0x0,0xA5,
+ 0xA5,0x0,0xA5,
+ 0xE7,0x0,0xE7,
+ 0xBD,0x0,0xBD,
+ 0xE7,0xFF,0xE7,
+ 0xBD,0x0,0xBD,
+ 0x81,0xFF,0x81,
+ 0x81,0x18,0x81,
+ 0x81,0x24,0x81,
+ 0xFF,0xFF,0xFF,
+};
+
+const uint8_t BarracksShadowSpr_Data[] PROGMEM =
+{
+ 24 /* Width */, 24 /* Height */,
+ 0x0,0x0,0x0,
+ 0x0,0x0,0xFE,
+ 0xFE,0x0,0xFE,
+ 0xFE,0x0,0x3E,
+ 0x3E,0x0,0xFE,
+ 0xFE,0x0,0xFE,
+ 0xFE,0x0,0x1E,
+ 0x1E,0x0,0x1E,
+ 0x1E,0x0,0x1E,
+ 0x1E,0x0,0x1E,
+ 0x1E,0x0,0x1E,
+ 0x1E,0x0,0x1E,
+ 0x1E,0x0,0x1E,
+ 0x1E,0x0,0x1E,
+ 0x1E,0x0,0x1E,
+ 0x1E,0x0,0x1E,
+ 0x1E,0x0,0x1E,
+ 0x1E,0x0,0x1E,
+ 0x1E,0x0,0xFE,
+ 0xFE,0x0,0xFE,
+ 0xFE,0x0,0x3E,
+ 0x3E,0x0,0xFE,
+ 0xFE,0x0,0xFE,
+ 0xFE,0x0,0xFE,
+};
diff --git a/Building.c b/Building.c
new file mode 100644
index 0000000..34be606
--- /dev/null
+++ b/Building.c
@@ -0,0 +1,81 @@
+/* **************************************
+ * Includes *
+ * **************************************/
+
+#include "Building.h"
+#include "BarracksSpr.c"
+
+/* **************************************
+ * Defines *
+ * **************************************/
+
+/* **************************************
+ * Local variables *
+ * **************************************/
+
+/* Sprites */
+static TYPE_SPRITE BarracksSpr;
+static TYPE_SPRITE BarracksShadowSpr;
+
+/* Tables */
+static uint8_t BuildingHPTable[] = { 100 };
+static TYPE_SPRITE * BuildingSprTable[] = {&BarracksSpr};
+static TYPE_SPRITE * BuildingShadowSprTable[] = {&BarracksShadowSpr};
+
+void BuildingInit(void)
+{
+ BarracksSpr.Data = BarracksSpr_Data;
+ BarracksSpr.w = GfxGetWidthFromSpriteData(BarracksSpr_Data);
+ BarracksSpr.h = GfxGetHeightFromSpriteData(BarracksSpr_Data);
+ BarracksSpr.flip = 0;
+ BarracksSpr.rotation = 0;
+ BarracksSpr.color = GFX_BLACK;
+
+ BarracksShadowSpr.Data = BarracksShadowSpr_Data;
+ BarracksShadowSpr.w = GfxGetWidthFromSpriteData(BarracksShadowSpr_Data);
+ BarracksShadowSpr.h = GfxGetHeightFromSpriteData(BarracksShadowSpr_Data);
+ BarracksShadowSpr.flip = 0;
+ BarracksShadowSpr.rotation = 0;
+ BarracksShadowSpr.color = GFX_GRAY;
+
+}
+
+uint8_t BuildingGetHpFromID(uint8_t id)
+{
+ return BuildingHPTable[id];
+}
+
+void BuildingDraw(TYPE_CAMERA * ptrCamera, TYPE_BUILDING * ptrBuilding)
+{
+ uint8_t id = ptrBuilding->id;
+
+ if(ptrBuilding->built == false)
+ {
+ return;
+ }
+
+ CameraApplyCoordinatesToSprite( ptrCamera,
+ BuildingShadowSprTable[id],
+ ptrBuilding->x - 6,
+ ptrBuilding->y );
+ GfxDrawSprite(BuildingShadowSprTable[id]);
+
+ CameraApplyCoordinatesToSprite( ptrCamera,
+ BuildingSprTable[id],
+ ptrBuilding->x,
+ ptrBuilding->y );
+
+ GfxDrawSprite(&BarracksSpr);
+
+}
+
+uint8_t BuildingGetWidthFromID(uint8_t id)
+{
+ return GfxGetWidthFromSpriteData(BuildingSprTable[id]->Data);
+}
+
+uint8_t BuildingGetHeightFromID(uint8_t id)
+{
+ return GfxGetHeightFromSpriteData(BuildingSprTable[id]->Data);
+}
+
diff --git a/Building.h b/Building.h
new file mode 100644
index 0000000..f43d9f4
--- /dev/null
+++ b/Building.h
@@ -0,0 +1,46 @@
+#ifndef __BUILDING_HEADER__
+#define __BUILDING_HEADER__
+
+/* **************************************
+ * Includes *
+ * **************************************/
+
+#include "Global_Inc.h"
+#include "Gfx.h"
+#include "GameStructures.h"
+#include "Camera.h"
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif //__cplusplus
+
+/* **************************************
+ * Defines *
+ * **************************************/
+
+ /* **************************************
+ * Structs and enums *
+ * **************************************/
+
+enum
+{
+ BARRACKS = 0 ,
+ TOWER ,
+};
+
+/* **************************************
+ * Global prototypes *
+ * **************************************/
+
+void BuildingInit(void);
+uint8_t BuildingGetHpFromID(uint8_t id);
+uint8_t BuildingGetWidthFromID(uint8_t id);
+uint8_t BuildingGetHeightFromID(uint8_t id);
+void BuildingDraw(TYPE_CAMERA * ptrCamera, TYPE_BUILDING * ptrBuilding);
+
+#ifdef __cplusplus
+}
+#endif //__cplusplus
+
+#endif //__BUILDING_HEADER__
diff --git a/Camera.c b/Camera.c
new file mode 100644
index 0000000..ba99741
--- /dev/null
+++ b/Camera.c
@@ -0,0 +1,150 @@
+/* *************************************
+ * Includes
+ * *************************************/
+
+#include "Camera.h"
+
+/* *************************************
+ * Defines
+ * *************************************/
+
+#define SPEED_CALCULATION_TIME 3
+#define MAX_CAMERA_SPEED 5
+#define MIN_CAMERA_SPEED 1
+
+/* *************************************
+ * Local Prototypes
+ * *************************************/
+
+static void CameraUpdateSpeed(TYPE_CAMERA * ptrCamera);
+static bool CameraSpecialConditions(TYPE_CAMERA * ptrCamera);
+
+void CameraInit(TYPE_CAMERA * ptrCamera)
+{
+ ptrCamera->X_Offset = 0;
+ ptrCamera->Y_Offset = 0;
+ ptrCamera->X_Speed = 0;
+ ptrCamera->Y_Speed = 0;
+ ptrCamera->Speed_Timer = SPEED_CALCULATION_TIME;
+}
+
+void CameraApplyCoordinatesToSprite(TYPE_CAMERA * ptrCamera,
+ TYPE_SPRITE * spr,
+ uint16_t x,
+ uint16_t y )
+{
+ spr->x = (uint8_t)(x + ptrCamera->X_Offset);
+ spr->y = (uint8_t)(y + ptrCamera->Y_Offset);
+}
+
+void CameraUpdateSpeed(TYPE_CAMERA * ptrCamera)
+{
+ if(PadDirectionKeyPressed() == true)
+ {
+ if(PadButtonPressed(PAD_LEFT) == true)
+ {
+ if(ptrCamera->X_Speed < 0)
+ {
+ ptrCamera->X_Speed += 2;
+ }
+ else if(ptrCamera->X_Speed < MAX_CAMERA_SPEED)
+ {
+ ptrCamera->X_Speed++;
+ }
+ }
+
+ if(PadButtonPressed(PAD_UP) == true)
+ {
+ if(ptrCamera->Y_Speed < 0)
+ {
+ ptrCamera->Y_Speed += 2;
+ }
+ else if(ptrCamera->Y_Speed < MAX_CAMERA_SPEED)
+ {
+ ptrCamera->Y_Speed++;
+ }
+ }
+
+ if(PadButtonPressed(PAD_DOWN) == true)
+ {
+ if(ptrCamera->Y_Speed > 0)
+ {
+ ptrCamera->Y_Speed -= 2;
+ }
+ else if(ptrCamera->Y_Speed > -MAX_CAMERA_SPEED)
+ {
+ ptrCamera->Y_Speed--;
+ }
+ }
+
+ if(PadButtonPressed(PAD_RIGHT) == true)
+ {
+ if(ptrCamera->X_Speed > 0)
+ {
+ ptrCamera->X_Speed -= 2;
+ }
+ else if(ptrCamera->X_Speed > -MAX_CAMERA_SPEED)
+ {
+ ptrCamera->X_Speed--;
+ }
+ }
+ }
+
+ if( (PadButtonPressed(PAD_LEFT) == false)
+ &&
+ (PadButtonPressed(PAD_RIGHT) == false) )
+ {
+ if(ptrCamera->X_Speed > 0)
+ {
+ ptrCamera->X_Speed--;
+ }
+ else if(ptrCamera->X_Speed < 0)
+ {
+ ptrCamera->X_Speed++;
+ }
+ }
+
+ if( (PadButtonPressed(PAD_UP) == false)
+ &&
+ (PadButtonPressed(PAD_DOWN) == false) )
+ {
+ if(ptrCamera->Y_Speed > 0)
+ {
+ ptrCamera->Y_Speed--;
+ }
+ else if(ptrCamera->Y_Speed < 0)
+ {
+ ptrCamera->Y_Speed++;
+ }
+ }
+}
+
+void CameraHandler(TYPE_CAMERA * ptrCamera)
+{
+
+ if(CameraSpecialConditions(ptrCamera) == true)
+ {
+ ptrCamera->X_Speed = 0;
+ ptrCamera->Y_Speed = 0;
+ return;
+ }
+
+ if(ptrCamera->Speed_Timer < SPEED_CALCULATION_TIME)
+ {
+ ptrCamera->Speed_Timer++;
+ }
+ else
+ {
+ ptrCamera->Speed_Timer = 0;
+ CameraUpdateSpeed(ptrCamera);
+ }
+
+ ptrCamera->X_Offset += ptrCamera->X_Speed;
+ ptrCamera->Y_Offset += ptrCamera->Y_Speed;
+}
+
+bool CameraSpecialConditions(TYPE_CAMERA * ptrCamera)
+{
+
+ return false;
+}
diff --git a/Camera.h b/Camera.h
new file mode 100644
index 0000000..6461ab4
--- /dev/null
+++ b/Camera.h
@@ -0,0 +1,41 @@
+#ifndef __CAM_HEADER__
+#define __CAM_HEADER__
+
+/* *************************************
+ * Includes
+ * *************************************/
+
+#include "Global_Inc.h"
+#include "Gfx.h"
+#include "Pad.h"
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif //__cplusplus
+
+
+/* *************************************
+ * Defines
+ * *************************************/
+
+/* *************************************
+ * Structs and enums
+ * *************************************/
+
+/* *************************************
+ * Global prototypes
+ * *************************************/
+
+void CameraInit(TYPE_CAMERA * ptrCamera);
+void CameraHandler(TYPE_CAMERA * ptrCamera);
+void CameraApplyCoordinatesToSprite(TYPE_CAMERA * ptrCamera,
+ TYPE_SPRITE * spr,
+ uint16_t x,
+ uint16_t y );
+
+#ifdef __cplusplus
+}
+#endif //__cplusplus
+
+#endif //__CAM_HEADER__
diff --git a/Exe/POCKET.HEX b/Exe/POCKET.HEX
new file mode 100644
index 0000000..1eaece8
--- /dev/null
+++ b/Exe/POCKET.HEX
@@ -0,0 +1,1100 @@
+:100000000C942B030C9453030C9453030C94530340
+:100010000C9453030C9453030C9453030C94530308
+:100020000C9453030C9453030C9453030C941E1818
+:100030000C9453030C9453030C9453030C945303E8
+:100040000C943B190C9453030C9453030C945303DA
+:100050000C9453030C9453030C9453030C945303C8
+:100060000C9453030C94530318180000000000FE76
+:10007000FE00FEFE003E3E00FEFE00FEFE001E1ED6
+:10008000001E1E001E1E001E1E001E1E001E1E0044
+:100090001E1E001E1E001E1E001E1E001E1E001E16
+:1000A0001E00FEFE00FEFE003E3E00FEFE00FEFEC6
+:1000B00000FE1818E700E7BD00BDE7FFE7BD00BD83
+:1000C00081FF81E700E7A500A5BDFFBDA500A5A5AF
+:1000D00000A5A500A5A500A5A500A5A500A5A500AE
+:1000E000A5A500A5E700E7BD00BDE7FFE7BD00BD92
+:1000F00081FF81811881812481FFFFFF05010001BB
+:100100005175697400526573756D6500506F636B4E
+:10011000657420456D706972657300410130012876
+:1001200001230151756974004F7074696F6E73001B
+:100130004D756C7469706C617965722067616D656D
+:100140000053696E676C6520706C61796572206719
+:10015000616D65004275696C64696E6720627569DE
+:100160006C742100004661696C6564210046616918
+:100170006C656420746F20637265617465206275BC
+:10018000696C64696E6721000303070507050405B0
+:100190000504050306030207020201020203020E20
+:1001A000090E0E0D0E0E0F0E070507050307050FAE
+:1001B00005070507060701020502000702020700FE
+:1001C00002070200020702000706030607070202F1
+:1001D00005050201020204020005020205000607ED
+:1001E00005050705020302020602000000000B00DD
+:1001F00003000307050704070105020507070400BC
+:100200000300000705050700050005020702000CB2
+:1002100000020202000400040201070507050704AA
+:100220000107040507020302070407010706060188
+:100230000107070707030307000500000D0002057B
+:10024000000505050005020107030F090306030663
+:10025000070702020505070702070705070301074D
+:10026000050607020705070504040307020507043E
+:10027000040703070701060705070703030705032C
+:100280000703060407010107010704070304030726
+:100290000607050205010601010704000705010222
+:1002A000040507000201020808080003000603060F
+:1002B00007070202050507050207070507030107EF
+:1002C00005060702070507050404030702050704DE
+:1002D00004070307070106070507070303070503CC
+:1002E00007030604070101070107040703040307C6
+:1002F00006070502050106010107040207050007BC
+:100300000005070206020307050703053F213F1208
+:1003100008120A100A0E1C0E0C1E0C141A14161FBA
+:10032000161E131E1E1B1E1E1F1E3F213F3A2F3A74
+:10033000173D173F213F181F02040A041F0E040433
+:100340000E1F0A1F0A0E0E1F04110E2E252E2F2A15
+:100350002E262929021F02081F08150E04040E1557
+:100360000E15151B151B040604040C0400000000E8
+:1003700017000300031F0A1F16371A1904130A1562
+:100380003A000300000E11110E000A040A040E04C4
+:100390000030000404040010001804031F111F1291
+:1003A0001F101D151711151F07041F17151D1F15E9
+:1003B0001D01011F1F151F17151F000A0000320025
+:1003C000040A110A0A0A110A040115020E11171E65
+:1003D000051E1F150A0E110A1F110E1F15111F05EC
+:1003E000010E111D1F041F111F1108100F1F041BE8
+:1003F0001F10101F061F1E040F0E110E1F09060EE0
+:10040000112E1F051A121509011F011F101F0F18A9
+:100410000F1F0C1F1B041B031C03191513001F11B6
+:10042000030418111F000201022020200001020C09
+:10043000121E1F120C0C12120C121F0C1A14041E86
+:1004400005242A1E1F021C141D1020201D1F081425
+:10045000111F101E041E1E021C0C120C3E0A040C5E
+:10046000123E1E040214160A020F120E101E0E1067
+:100470000E1E081E120C1226281E322A26041E21C9
+:10048000001F00211E040102013F213F0A4E6F2080
+:1004900053442063617264206F720A6E6F204C4F68
+:1004A000414445522E4845580A0A153A4578697420
+:1004B000001D20466C617368696E670A20206C6FAE
+:1004C000616465722E2E2E0A0A444F4E2754205422
+:1004D00055524E204F464621000A0A153A49676E8A
+:1004E0006F7265006D560A0A504C454153452054C1
+:1004F00055524E204F464620004C4F572042415403
+:100500005445525921200017534400161378001601
+:100510001314001510200015201000540A03E18167
+:10052000867F3E186D830F0F0E0183866033186D32
+:10053000C3198F1803C38E6033186DE330CF1803CF
+:10054000C39E603630CDE360CF3006C79E7E3E301E
+:10055000CDB360CF300CC6F6603330D9B660CF3340
+:10056000CFCCF66061B0DB1E60CF30D86CE6C061E6
+:10057000B0DB1E618F19986CC6C063B19B0E330F40
+:100580000FB078C6FF7E1F1B061E0F0500893008BE
+:10059000023802497868140000F6E8DBCFC3B8AE31
+:1005A000A49B928A827B746E68625C57524E494566
+:1005B000413E3A3734312E2C29272523211F1D1C7B
+:1005C0001A1917161514131211100F0E0D0C0B0A11
+:1005D00009080706450068010000050068013801A8
+:1005E00000000500380168010000F205EE05010178
+:1005F000FF030101F70300000007000201000003F0
+:1006000004060000000000000000010204081020A1
+:100610004080010204081020010204081020040494
+:10062000040404040404020202020202030303039A
+:100630000303000000002300260029000000000042
+:10064000250028002B0000000000240027002A00BD
+:100650008104F605850411241FBECFEFD8E0DEBF6C
+:10066000CDBF11E0A0E0B1E0E0E8F4E402C0059005
+:100670000D92A432B107D9F725E0A4E2B1E001C0A0
+:100680001D92A635B207E1F713E0CAE2D3E004C039
+:100690002197FE010E94B21DC832D107C9F70E94FE
+:1006A000E5050C9433220C940000CF93DF93CDE248
+:1006B000D1E082EB90E098878F830E9431058A8396
+:1006C00082EB90E00E9437058B831D821C8281E0C3
+:1006D0008E83C4E2D1E088E690E098878F830E9401
+:1006E00031058A8388E690E00E9437058B831D825E
+:1006F0001C8283E08E83DF91CF91089584E6089574
+:100700000F931F93CF93DF938C01EB018E8188238E
+:1007100001F12A813B81488159814650510964E2A7
+:1007200071E0C8010E94C40384E291E00E941305B5
+:100730002A813B81488159816DE271E0C8010E94A4
+:10074000C4038DE291E0DF91CF911F910F910C9442
+:100750001305DF91CF911F910F910895809134017E
+:10076000909135010C9431058091340190913501BF
+:100770000C943705FC0111821082138212821482BC
+:10078000158283E086830895FC013081430FFB01CD
+:100790004083FC018281280FFB0121830895CF93C0
+:1007A000DF93EC018E81833018F48F5F8E836BC0F2
+:1007B0001E820E9431068823E1F180E090E00E94D1
+:1007C0002606882349F08C8187FF02C08E5F03C014
+:1007D000853014F48F5F8C8381E090E00E942606C0
+:1007E000882349F08D8187FF02C08E5F03C085306A
+:1007F00014F48F5F8D8383E090E00E9426068823A7
+:1008000049F08D81181614F4825003C08C3F14F007
+:1008100081508D8382E090E00E942606882349F073
+:100820008C81181614F4825003C08C3F14F0815050
+:100830008C8380E090E00E94260681110FC082E048
+:1008400090E00E942606811109C08C81181614F4CC
+:10085000815003C0882311F08F5F8C8381E090E08A
+:100860000E94260681110FC083E090E00E942606B8
+:10087000811109C08D81181614F4815003C088239A
+:1008800011F08F5F8D832C8188819981820F911D5A
+:1008900027FD9A95998388832D818A819B81820F78
+:1008A000911D27FD9A959B838A83DF91CF910895AF
+:1008B00086E391E00E9464070E94E50486E090E0F0
+:1008C0000E941B06882349F042E06CEF70E084E54B
+:1008D00092E00E94DA118111089586E391E00E946E
+:1008E000DC070E94490681110E9433080E94ED0432
+:1008F0008823E1F386E391E00E945B060E944F08A3
+:10090000DDCF86E391E00C94590686E391E00C94E8
+:100910005A06DC01643508F057C0403308F054C073
+:1009200090969C919097E42FE595E595E595262F77
+:10093000062E000C330B542F57709230A1F4D901BE
+:1009400084E5E802A00DB11D1124A95BBC4F8C9178
+:1009500090E0052E02C0959587950A94E2F7809560
+:10096000982F91700CC0933051F41C968C91642791
+:10097000062E000C770B682760FF03C014C091118E
+:1009800012C084E5E802200D311D1124F901E95B54
+:10099000FC4F81E090E001C0880F5A95EAF78095FE
+:1009A0009081892310C084E5E802200D311D1124B7
+:1009B000F901E95BFC4F81E090E001C0880F5A9596
+:1009C000EAF79081892B808308951092A8026AE04B
+:1009D00073E082EA92E00C94460E84E592E00E9475
+:1009E0001F1191E0811101C090E0892F0895FC0151
+:1009F0009381418180815281282F082E000C330B76
+:100A0000250F311D37FD0DC084355CF4892F90E032
+:100A1000840F911D47FD9A9597FD03C081E04033F7
+:100A20000CF080E00895EF920F93CF93DF93EC01E9
+:100A30000E94F704882381F040E06E8182EA92E010
+:100A40000E94270A2F813885ED800C8149816881B9
+:100A500082EA92E00E945C0DDF91CF910F91EF90BE
+:100A60000895DC01EC91F0E08491880F0895DC0199
+:100A70001196EC91F0E08491880F08954CE3BC014D
+:100A800084E592E00C94F50F0F931F93CF93DF93BF
+:100A90008C01C091C002D091C10222974093AB0259
+:100AA0002093AC0282EA92E00E94460E40E061E0B0
+:100AB00082EA92E00E94270AB80182EA92E00E944C
+:100AC000B91B209749F0BE0182EA92E0DF91CF91F5
+:100AD0001F910F910C94460EDF91CF911F910F91B2
+:100AE0000895CF92DF92FF920F931F93CF93DF93DE
+:100AF000CDB7DEB728970FB6F894DEBF0FBECDBFD7
+:100B00006C0160E082EA92E00E94230A08E024E59A
+:100B100040E060E082EA92E00E94710AF601808182
+:100B20001F928F9386E091E09F938F931F9288E0AE
+:100B3000F82EFF928E010F5F1F4F1F930F930E949D
+:100B40004D1F24E044E068E871E0C8010E944405BC
+:100B5000F60181811F928F938BE091E09F938F9399
+:100B60001F92FF921F930F930E944D1F24E048E1B4
+:100B700068E871E0C8010E944405F60182811F9275
+:100B80008F9380E191E09F938F931F92FF921F9329
+:100B90000F930E944D1F24E040E368E871E0C80114
+:100BA0000E9444050FB6F894DEBF0FBECDBF289655
+:100BB0000FB6F894DEBF0FBECDBFDF91CF911F916E
+:100BC0000F91FF90DF90CF9008950E94DC190E9452
+:100BD000CD0884E592E00E9425156CE071E084E583
+:100BE00092E00E94A8140E940B06F7CF1092A50273
+:100BF0001092A40289E191E09093A3028093A20253
+:100C0000089520E1FC0111922A95E9F7BC0184E5E1
+:100C100092E00C94801543E06BE171E084E592E092
+:100C20000E94DA11811106C086E391E00E9401065C
+:100C30000C9458040895682F8EE592E00E94800974
+:100C400091E0811101C090E0892F0895682F8EE511
+:100C500092E00E94A10991E0811101C090E0892FEA
+:100C6000089581E090E00E942606811110C083E083
+:100C700090E00E94260681110AC080E090E00E9468
+:100C80002606811104C082E090E00C94260681E0E3
+:100C900008950E94310681110AC084E090E00E940C
+:100CA0002606811104C085E090E00C94260681E0C0
+:100CB000089508950895EF92FF920F931F93CF9395
+:100CC000DF938C01005D1F4F7C0120EFE21A2EEFB5
+:100CD000F20AEC01CC5EDE4FB801CE010E94800327
+:100CE000095F1F4F0E151F05B9F7DF91CF911F91B7
+:100CF0000F91FF90EF9008956F927F928F929F9245
+:100D0000AF92BF92CF92DF92EF92FF920F931F9319
+:100D1000CF93DF9300D000D000D0CDB7DEB74C0129
+:100D20006B013C018BEE681A8EEF780A5401E5E303
+:100D3000AE0EB11CF501818181110AC0F7E0AF0E42
+:100D4000B11CA614B704B1F71092DB0281E047C0D2
+:100D5000F5013597808191819A83898332968081CC
+:100D600091819C838B83F50180810E94AE038D83EA
+:100D7000F50180810E94B4038E83E980FA800B81A3
+:100D80001C812D81382FF601408151816281738150
+:100D9000848195810E94E408882381F220E830E074
+:100DA00040E050E060E070E0CB010E947308F60183
+:100DB0007183608320E830E040E050E060E070E064
+:100DC000CB010E947308F601738362838091DB027A
+:100DD0008F5F8093DB02803108F4A8CF80E02696F5
+:100DE0000FB6F894DEBF0FBECDBFDF91CF911F913C
+:100DF0000F91FF90EF90DF90CF90BF90AF909F90BA
+:100E00008F907F906F9008959F92AF92BF92CF92F4
+:100E1000DF92EF92FF920F931F93CF93DF9300D057
+:100E200000D000D0CDB7DEB77C01962E09831A839F
+:100E30002B833C834D835E83BE016F5F7F4F0E9497
+:100E40007C06D82E882369F157018EEEA81A8EEF02
+:100E5000B80AF5018081803218F597E0C92E870124
+:100E6000C89E000D111D1124F80195AA89819A814F
+:100E700091AB80AB8B819C8193AB82AB892D0E941F
+:100E80007E03F80184ABF5018081F701C89EE00D77
+:100E9000F11D112491E096AB8F5FF501808301C0B5
+:100EA000D12C8D2D26960FB6F894DEBF0FBECDBF88
+:100EB000DF91CF911F910F91FF90EF90DF90CF9036
+:100EC000BF90AF909F900895EF92FF920F931F9362
+:100ED000CF93DF9300D000D000D0CDB7DEB77C0138
+:100EE000FC01EF5EFE4F1082319610828C5E9E4FA9
+:100EF0000E94BA030E945503F701F096C701805F74
+:100F00009E4F27E0DF01322F1D923A95E9F7379681
+:100F1000E817F907B9F7F701E55EFE4F89E180832D
+:100F2000319682E3808331968BE4808324E130E044
+:100F300040E050E060E070E0CB010E9473087A83EB
+:100F4000698324E130E040E050E060E070E0CB01F4
+:100F50000E9473087C836B8380E00E94AE038D83C4
+:100F600080E00E94B40309811A812B813C814D816C
+:100F7000582F60E0C7010E940407811110C08DE660
+:100F800091E026960FB6F894DEBF0FBECDBFDF917D
+:100F9000CF911F910F91FF90EF900C943E052696F4
+:100FA0000FB6F894DEBF0FBECDBFDF91CF911F917A
+:100FB0000F91FF90EF900895EF92FF920F931F9380
+:100FC000CF93DF9300D000D000D0CDB7DEB77C0147
+:100FD0008C5E9E4F0E94CF0384E090E00E941B062F
+:100FE000882381F120E230E040E050E060E070E0F2
+:100FF000CB010E9473087A83698320E230E040E0ED
+:1010000050E060E070E0CB010E9473087C836B834A
+:1010100080E00E94AE038D8380E00E94B4030981CA
+:101020001A812B813C814D81582F60E0C7010E94BD
+:101030000407811103C085E691E002C084E591E0D8
+:101040000E943E05C701855E9E4F26960FB6F89416
+:10105000DEBF0FBECDBFDF91CF911F910F91FF90EB
+:10106000EF900C94710580913E03811117C081E0CF
+:1010700080933E0330913F032091400380914103D0
+:101080008091420380914303809144038091450302
+:1010900080914603832F922F0C94421F0895209134
+:1010A0003F033091400340914103509142036091CE
+:1010B0004303709144038091450390914603A1E05E
+:1010C0000E94A61D20933F033093400340934103A9
+:1010D000509342036093430370934403809345030A
+:1010E000909346030895CF92DF92EF92FF920F9371
+:1010F0001F93CF93DF9300D000D0CDB7DEB76B0145
+:101100007C0129833A834B835C830E943D1FBC0191
+:10111000990F880B990B29813A814B815C81890158
+:101120009A010C191D092E093F09A90198012F5F89
+:101130003F4F4F4F5F4F0E945A1D6C0D7D1D8E1DFE
+:101140009F1D0F900F900F900F90DF91CF911F91E7
+:101150000F91FF90EF90DF90CF900895CF93DF93A2
+:10116000A6EEB2E0ECEDF2E011961C921E92ED01BB
+:10117000219718822197188210821182128213827D
+:1011800014821582168217821C963C9683E0EC33FB
+:10119000F80751F7DF91CF91089510923F03109215
+:1011A00040031092410310924203109243031092A5
+:1011B0004403109245031092460310923D030E948F
+:1011C000AE0810923C030895EF92FF920F931F9385
+:1011D000CF93DF93CDB7DEB72C970FB6F894DEBF71
+:1011E0000FBECDBF49835A836B837C838D839E83DF
+:1011F000EF82F88609871A873C8789819A814F8117
+:101200005885BA01620F711D86179707C8F42D81A2
+:10121000820F911D4817590798F48B819C8149854D
+:101220005A852C85BA01620F711D8617970740F405
+:101230002E81BC01620F711D81E04617570708F02F
+:1012400080E081702C960FB6F894DEBF0FBECDBF44
+:10125000DF91CF911F910F91FF90EF900895FC01C6
+:1012600088E0808389E0818387E0828386E08383CE
+:1012700084E0848382E0858381E186830895DF9220
+:10128000EF92FF920F931F93CF93DF93EC017C01BA
+:1012900087E0E80EF11C8701DD24DA9462E08881A2
+:1012A0000E94BC1A88810E94301BF801892B21F40E
+:1012B00080818F5F808309C08081882351F08F3FB8
+:1012C00011F4108202C0F801D08260E088810E948F
+:1012D000BC1A21960F5F1F4FCE15DF05F9F6DF917F
+:1012E000CF911F910F91FF90EF90DF900895FC0137
+:1012F000E60FF11D81E09781913009F080E00895BB
+:10130000FC01E60FF11D81E097819F3F09F080E02D
+:101310000895262F30E0FC01E20FF31F423030F435
+:101320009781915081E09E3F58F009C087818F3F9F
+:1013300031F0642F0E94261D81E0913009F080E099
+:101340000895860F911DFC0187818F3F09F480E08D
+:1013500008958EBD0DB407FEFDCF8EB508951F9381
+:10136000CF93DF93EC01162FF89460E08F850E94F5
+:10137000F81A888918161CF460E00E94F81A812F68
+:101380000E94A909888918161CF461E00E94F81AC5
+:101390007894DF91CF911F91089528EF31E0E7E431
+:1013A000F3E0DF01A9011D9241505040E1F7DC015B
+:1013B00019961C9219971A961C920895CF92DF9253
+:1013C000EF92FF920F931F93CF93DF93EC018C85E5
+:1013D0008F5F8C8787E4E82E83E0F82E10E0612F82
+:1013E0006064CE010E94AF0960E8CE010E94AF099F
+:1013F00061E08F850E94F81A888918161CF460E055
+:101400000E94F81A670104E5F60181916F010E94BC
+:10141000A9090150C9F7888918161CF461E00E94D7
+:10142000F81A1F5FF4E5EF0EF11C1630C1F660E408
+:10143000CE01DF91CF911F910F91FF90EF90DF9040
+:10144000CF900C94AF09FC0160A361A30895FC0147
+:1014500060A341A30895DF92EF92FF920F931F9331
+:10146000CF93DF931F92CDB7DEB78C01D62EF42E2B
+:10147000E12CE21654F44F2D4E0D6D2DC801298339
+:101480000E948904E3942981F4CF0F90DF91CF91DA
+:101490001F910F91FF90EF90DF900895DF92EF92F0
+:1014A000FF920F931F93CF93DF931F92CDB7DEB7B9
+:1014B0008C01F62ED42EE12CE21654F46F2D6E0D15
+:1014C0004D2DC80129830E948904E3942981F4CF1A
+:1014D0000F90DF91CF911F910F91FF90EF90DF90D0
+:1014E0000895DF92EF92FF920F931F93CF93DF93B4
+:1014F0007C01D62FD22EC42F002E000C110B040F0E
+:10150000111D47FD1A958C2F0C2E000C990B80177E
+:10151000910744F42D2D4C2F6D2FC7010E944E0AC8
+:10152000CF5FF1CFDF91CF911F910F91FF90EF909F
+:10153000DF9008958F929F92AF92BF92CF92DF92E9
+:10154000EF92FF920F931F93CF93DF937C01162F9F
+:10155000D42EC22F81E0C82EC21AB22EB194BB0C79
+:10156000D0E0802F8470A82E802F8270982E802F3C
+:101570008870882E0170DC170CF04DC0C7FC04C0C9
+:10158000C150B394B394CB0CDF5F8D2F880F8F5F66
+:10159000C80EAA2071F04D2D4C0F612F6D0FC701A1
+:1015A0000E9489044D2D4D0F6C2F610FC7010E94C1
+:1015B0008904992071F04D2D4C1B612F6D0FC701CF
+:1015C0000E9489044D2D4D1B6C2F610FC7010E9495
+:1015D0008904882071F04D2D4D0F612F6C1BC701C0
+:1015E0000E9489044D2D4C0F612F6D1BC7010E9475
+:1015F0008904002309F4BFCF4D2D4D1B612F6C1BB7
+:10160000C7010E9489044D2D4C1B612F6D1BC70122
+:101610000E948904B0CFDF91CF911F910F91FF906D
+:10162000EF90DF90CF90BF90AF909F908F900895F4
+:101630008F929F92AF92BF92CF92DF92EF92FF92E2
+:101640000F931F93CF93DF936C01A62E942EC22F7E
+:1016500011E0121BF22EF194FF0C83E0B82EBE0CA9
+:10166000D1E0802F8170882EE39402708FEF8D0F70
+:101670008C17BCF517FD04C0C150F394F3941F0DF3
+:101680008D2F880F8F5F180F882091F02C2F220F3D
+:101690002E0D492D4C1B6D2F6A0DC6010E942B0A81
+:1016A0002B2D492D4D1B6C2F6A0DC6010E942B0A54
+:1016B000011104C0DF5FB394B394D8CF2C2F220F55
+:1016C0002E0D492D4C1B6A2D6D1BC6010E942B0A45
+:1016D0002B2D492D4D1B6A2D6C1BC6010E942B0A18
+:1016E000E9CFDF91CF911F910F91FF90EF90DF90A5
+:1016F000CF90BF90AF909F908F9008959F92AF92A0
+:10170000BF92CF92DF92EF92FF920F931F93CF93EE
+:10171000DF93EC01C62EF42E122FAE2CA194AA0C4E
+:101720009A2C920EBE2CB60E292D6B2D0E944E0ABD
+:10173000DD24DA94D00EDF0C292D4D2D6B2DCE013A
+:101740000E944E0A0A0DFE0C202F4F2D6C2DCE014B
+:101750000E942B0ACA941C0D202F4F2D612FCE0101
+:101760000E942B0A01E02E2D4F2D6B2DCE010E94E1
+:101770009A0A1E1902E02E2D4F2D612FCE010E94D4
+:101780009A0AFD2CFE1804E02E2D4F2D612FCE015C
+:101790000E949A0A08E02E2D4F2D6B2DCE010E943B
+:1017A0009A0ADF91CF911F910F91FF90EF90DF90F8
+:1017B000CF90BF90AF909F9008959F92AF92BF92AD
+:1017C000CF92DF92EF92FF920F931F93CF93DF930D
+:1017D0006C01A62EB42EF22EC02F1E2DDE2DD1951B
+:1017E000DD0F9E2C960E2D2F2F0D692D0E94710A54
+:1017F000C150CD0FDB2DDE0D6FEF6A0D6F0D6E1931
+:10180000EC2E01E0212F4D2FC6010E94180B02E0A3
+:10181000212F4D2F692DC6010E94180BDF91CF910A
+:101820001F910F91FF90EF90DF90CF90BF90AF90FE
+:101830009F9008954F925F926F927F928F929F92A6
+:10184000AF92BF92CF92DF92EF92FF920F931F93CE
+:10185000CF93DF938C01F901E49031968491643544
+:101860000CF019C10E2C000CFF08A62F062E000C40
+:10187000BB0BF701EA0FFB1F1E161F060CF00BC176
+:1018800040330CF008C1782EC42E042E000CDD0865
+:101890005601A80EB11C87FDBA941A141B040CF053
+:1018A000FAC02E5F3F4F570197E0A90EB11CB7FE5B
+:1018B00004C05701CEE0AC0EB11C93E0B594A794E0
+:1018C0009A95E1F747FF0AC0742E780EAC9CC001D0
+:1018D000AD9C900D1124281B390B40E0872D072C5F
+:1018E000000C990B840F911D47FD9A95C1971CF030
+:1018F000C0E37C2E741AE801F8A067FD60E0E535CE
+:10190000F10514F0E4E5F0E09E2FF801D484D4262C
+:10191000062F062E000C110BE801CA1BDB0BDE01A3
+:101920004E01D7E08D229924E0E8F0E002C0F59561
+:10193000E7958A94E2F77E2FB7FD179683E0B59579
+:10194000A7958A95E1F72A0F3B1F542F577081E026
+:1019500001C0880F5A95EAF7459545954595F801D8
+:10196000A4E54A02E00DF11D1124AF01495B5C4F73
+:10197000C12C472C770C550899249394BB24EC2D4B
+:10198000F0E0E415F5050CF086C0F901E490F1E013
+:10199000FF121AC0862E8A01A72FF901891608F0B6
+:1019A00071C0BA2FBE2121F0E801B881B82BB883ED
+:1019B000B0E0B595A795109719F43196E490A0E89A
+:1019C00083940F5F1F4FEACFF1101CC0782E7094E4
+:1019D000862E8A01A72FF901891608F053C0BA2F65
+:1019E000BE2121F0E801B881B721B883B0E0B595F8
+:1019F000A795109719F43196E490A0E883940F5FAF
+:101A00001F4FEACFD3E0FD1629F0862E8A01A72FBB
+:101A1000F90136C0782E7094862E8A01A72FF9011D
+:101A20008916D0F4BA2FBE2159F0E801B8816D2C87
+:101A3000682460FE02C0B82B02C0B721E801B88359
+:101A4000B0E0B595A795109719F43196E490A0E809
+:101A500083940F5F1F4FE4CFD92414C0BA2FBE2147
+:101A600021F0E801B881B827B883B0E0B595A79513
+:101A7000109719F43196E490A0E883940F5F1F4FFC
+:101A8000891660F3880F19F44C5A5F4F81E0C394B4
+:101A90002A0D3B1D74CFDF91CF911F910F91FF90C5
+:101AA000EF90DF90CF90BF90AF909F908F907F90FE
+:101AB0006F905F904F9008952F923F924F925F9258
+:101AC0006F927F928F929F92AF92BF92CF92DF924E
+:101AD000EF92FF920F931F93CF93DF93CDB7DEB7B3
+:101AE0002C970FB6F894DEBF0FBECDBF5C01F62E6B
+:101AF000342E8E2D01111DC0E1101BC0C5012C9686
+:101B00000FB6F894DEBF0FBECDBFDF91CF911F910E
+:101B10000F91FF90EF90DF90CF90BF90AF909F908C
+:101B20008F907F906F905F904F903F902F900C948C
+:101B30001A0CF90194913196E490492E512CA2018E
+:101B4000495F5F4FBA0153E0759567955A95E1F784
+:101B50007C836B8303700A8791509A83592F19866F
+:101B60008E2C912C0985602F002E000C770B6415AC
+:101B700075050CF072C0902F07FD995FC92EC594B2
+:101B8000C594C5949985977897FF03C09150986F35
+:101B90009F5F40E8642E712C02C0759467949A95FB
+:101BA000E2F77FEF7E0D212C0C2C000CDD0812E0FB
+:101BB000C10ED11CA22D022C000CBB0BA815B9051F
+:101BC0000CF046C00B811C810A9FF0010B9FF00DA9
+:101BD0001A9FF00D1124EC0DFD1DE20FF31FE4918F
+:101BE000F0E0E621F721EF2B81F11A85123039F070
+:101BF000133041F0113049F4452F622D08C0652F94
+:101C0000472F05C0672F498502C0422D698588236B
+:101C100069F0182F137080FF03C00A81061B602F24
+:101C200081FF05C08E2D841B482F01C010E06F0D71
+:101C3000430DC5012F8338875D837E830E9489040D
+:101C4000812F7E815D8138852F8123947150B2CFA1
+:101C500009850F5F0987515085CF2C960FB6F894F0
+:101C6000DEBF0FBECDBFDF91CF911F910F91FF90CF
+:101C7000EF90DF90CF90BF90AF909F908F907F902C
+:101C80006F905F904F903F902F900895DC01FB0183
+:101C900084918F5F14968C9314973196E491EF5F43
+:101CA0001596EC9315976E5F7F4F5F967C936E93BE
+:101CB0005E970895EF920F93CF93DF93EC014E87D9
+:101CC0006D872F87E98A088B81E0888788A319A20E
+:101CD0008F836AE073E0CE010E94460E0E94E31CEF
+:101CE00081E00E94F91C85E00E94071D8CE00E94A3
+:101CF000021D61E08E850E94BC1A61E08D850E9404
+:101D0000BC1A61E08F850E94BC1A898918161CF4E0
+:101D100061E00E94BC1A888918161CF461E00E94D8
+:101D2000BC1A898918166CF460E00E94F81A6AE0FF
+:101D300070E080E090E00E94B61961E089890E941D
+:101D4000F81A8D85082E000C990BFC01E25EF94F04
+:101D5000E491F0E0EE0FFF1FE45CF94F2591349120
+:101D60003D8B2C8BFC01E65FF94FE491EB8F8E8568
+:101D7000082E000C990BFC01E25EF94FE491F0E0B3
+:101D8000EE0FFF1FE45CF94F259134913B8B2A8BBA
+:101D9000FC01E65FF94FE491EA8F8889082E000C78
+:101DA000990BFC01E25EF94FE491F0E0EE0FFF1FAA
+:101DB000E45CF94F259134913F8B2E8BFC01E65F5B
+:101DC000F94FE491EC8F8F85082E000C990BFC01E4
+:101DD000E25EF94FE491F0E0EE0FFF1FE45CF94F93
+:101DE00025913491398F288FFC01E65FF94FE491FA
+:101DF000ED8F61E2CE010E94AF0964E1CE010E9445
+:101E0000AF098B8587FF02C08FE78B876B85606882
+:101E1000CE010E94AF0960E2CE010E94AF096CE0E2
+:101E2000CE010E94AF09CE01DF91CF910F91EF90CB
+:101E30000C94DE096F927F928F929F92AF92BF9225
+:101E4000CF92DF92EF92FF920F931F93CF93DF9386
+:101E5000EC01B62EA42EF02E83E586170CF483C079
+:101E60008FE284170CF47FC08C8190E00197089F6B
+:101E7000A001099F500D1124CA01860F911D67FD15
+:101E80009A95181619060CF06EC03D818A2D0A2C01
+:101E9000000C990B039F800D911D11241816190633
+:101EA0000CF061C088A0E62E962EC22ED12CEE2D0D
+:101EB000EB190E2E000CFF0B8C8190E0E817F90750
+:101EC0000CF050C00197E817F90779F0C89E90010F
+:101ED000C99E300DD89E300D1124E20FF31F8E8D58
+:101EE0009F8DE80FF91F149101C010E07A2C6A2C25
+:101EF000272D2A19022E000C330B8D8190E0281714
+:101F000039076CF510FF11C081E0F81206C0472DAB
+:101F10006E2DCE010E9489041EC00F2D2F2D462D3F
+:101F2000692DCE010E94710A16C089A198A1891756
+:101F300091F088A381E0F81206C0472D6E2DCE01E6
+:101F40000E94890407C00F2D2F2D462D692DCE012B
+:101F50000E94710A88A216956F0C7394C9CF9F0CCA
+:101F6000E394A5CF88A2DF91CF911F910F91FF90AD
+:101F7000EF90DF90CF90BF90AF909F908F907F9029
+:101F80006F9008950F93CF93DF93EC01262F6A3063
+:101F900011F428851DC06D3011F108854A856985C9
+:101FA0000E941A0F28853C818985239F800D11246A
+:101FB00089879F81992399F0082E000C990B44E59D
+:101FC00050E0239F401951091124481759073CF448
+:101FD0009D818A85299F800D11248A87198681E039
+:101FE00090E0DF91CF910F910895FC01EC57FF4FE6
+:101FF000718360833296445F408308956F927F922D
+:102000008F929F92AF92BF92CF92DF92EF920F93F7
+:10201000CF93DF936C014C0186E8880E911CD401AC
+:102020008C91882309F44BC08C3018F4CCE0C81B89
+:1020300001C0C0E0F601EA5AFF4F81E080835601FB
+:10204000BEE4AB0EB11C60E0C5010E94230A36015C
+:10205000E3E56E0E711CD3018C9103E0080FDDE205
+:102060004D2F481B4C0F83E0E82E24E560E0C501AE
+:102070000E94DD0B61E0C5010E94230AF30180810B
+:1020800003E0080F4D2F481B4C0F24E560E0C5010D
+:102090000E947E0BF601E95AFF4F84E0808331965F
+:1020A000D3018C91C81BC15DC083BC9660817181D6
+:1020B000C5010E94961BF401808181508083DF91CD
+:1020C000CF910F91EF90DF90CF90BF90AF909F9006
+:1020D0008F907F906F900895CF92DF92FF920F9331
+:1020E0001F93CF93DF93EC018C8D9D8D892B09F489
+:1020F0009EC08E01025B1F4F40E061E0C8010E945C
+:10210000270AFE01E95AFF4FDE01AE5ABF4F9C91EC
+:1021100085E5891B808331961082698D613009F4D1
+:1021200063C028F0888D653008F074C06FC0CE01A0
+:1021300085960E94C31681E0FE01EA5AFF4F808314
+:102140006AE073E0C8010E94460E1D8E1C8EFE01DF
+:10215000EC5AFF4F108288EAF82E6E018AE0C80E12
+:10216000D11CCE010E941F118823D9F369EF74E0BE
+:10217000C8010E94961B6A8D7B8D4AE050E0C80121
+:102180000E944B1C64EE74E0C8010E94961B6F2DE8
+:1021900062956F7070E04AE050E0C8010E949B1C9D
+:1021A00069ED74E0C8010E94961B64E0C6010E94BC
+:1021B000770981113CC0FA94F110D3CF60E0CE01D1
+:1021C0000E94961883B7817F846083BF83B7816044
+:1021D00083BF83B7816083BF889583B78E7F83BFBA
+:1021E00083B78E7F83BFBDCFCF58DF4F8881998162
+:1021F000AA81BB818F709927AA27BB270897A105C1
+:10220000B10510F467E009C068E707C0882379F0DA
+:102210006B5F03C0882359F06FE2C801DF91CF9153
+:102220001F910F91FF90DF90CF900C94BB1BDF911B
+:10223000CF911F910F91FF90DF90CF9008958F92D3
+:102240009F92AF92BF92CF92DF92EF92FF920F9345
+:102250001F93CF93DF93EC017C0180E8E80EF11C23
+:10226000F70180809180A280B3800E948519861A30
+:10227000970AA80AB90A6E01FFE7CF0ED11CF60132
+:10228000808190E0A0E0B0E08E0105581F4F8815D6
+:102290009905AA05BB0550F4F80180819181A281BE
+:1022A000B381892B8A2B8B2B09F040C0F8018081E8
+:1022B0009181A281B381892B8A2B8B2BA9F57E0179
+:1022C000F5E2EF0EF11CC7010E94C016C7010E9483
+:1022D0002C17C7010E94F117CE010E94FE0FCE01FC
+:1022E0000E946C107E018EE4E80EF11CC7010E9472
+:1022F000DE09FE01EC5AFF4F8081811103C0C70146
+:102300000E94CD090E949119F80160837183828334
+:102310009383FE01EB58FF4FC958DF4F2881398165
+:10232000621B730B7183608380E037C00E94851944
+:10233000F6012081DC01CB01820F911DA11DB11D91
+:10234000F70180839183A283B383FE01EF58FF4F8F
+:1023500080819181A281B3810196A11DB11D8083ED
+:102360009183A283B383F8011082118212821382B7
+:102370000E949119FE01E958FF4F608371838283A7
+:102380009383CE010E949A18CE010A960E943F09BB
+:10239000CE0148960E94031981E0DF91CF911F91F1
+:1023A0000F91FF90EF90DF90CF90BF90AF909F90F4
+:1023B0008F9008952F923F924F925F926F927F92EB
+:1023C0008F929F92AF92BF92CF92DF92EF92FF9245
+:1023D0000F931F93CF93DF93CDB7DEB766970FB6FA
+:1023E000F894DEBF0FBECDBF6C01688B798B4B8339
+:1023F000FC01EC5AFF4F10823FEF3D831C821E8A86
+:1024000010E31D8A5C015AE0A50EB11C1C0183E596
+:10241000280E311CBF972F01242F30E03F832E83DD
+:10242000C601895A9F4F99878887F396FB87EA8769
+:1024300096012A5A3F4F3D872C8702979F878E87A8
+:102440003A973F01C6010E941F118823D9F364E027
+:10245000C5010E947709012F110F110B811144C092
+:1024600065E0C5010E94770981113EC066E0C501A3
+:102470000E947709811138C05C8151114BC044E042
+:1024800063E0C5010E948909882331F03D893F5FDF
+:102490003D8BC2010E946E1844E061E0C5010E94BC
+:1024A0008909882331F05D8951505D8BC2010E94FA
+:1024B0006E183D89832F032E000C990BEE81FF814E
+:1024C0008E179F0731F037FF05C03B8131503D8BA0
+:1024D00001C01D8AF101808194E0980F3D89839F9E
+:1024E000901911249E8B21C0F101F08064E0C50198
+:1024F0000E947709882309F48EC0C2010E94421805
+:102500003D893D83F1943B81F39EF02C1124FA9494
+:10251000FA94FE8AC8015E89851B910957FD93953F
+:1025200002970CF47CC031E03C835E89050F111DDD
+:1025300057FD1A9517FF02C00F5F1F4FC8019595F1
+:1025400087959A8389830981102FE885F985108200
+:10255000EA85FB85808381E0EC85FD858083EE85BF
+:10256000FF851082E888F988812C912C5D89252FC0
+:10257000550F330B43E08E819F818816990621F118
+:102580002815390571F4E885F9854083F1018081CA
+:10259000F02F5D89589FF00D11248F2FEA85FB8560
+:1025A0008083F70165917491C3012A8B3B8B4C8B1F
+:1025B0000E94D61BFFEF8F1A9F0A52E0E50EF11C16
+:1025C0002A893B894C89D7CF60E0C3010E94230A46
+:1025D000F101808149813D89389F400D112441508E
+:1025E00024E560E0C3010E944E0A61E0C3010E943D
+:1025F000230AF101808103E0080F49813D89389F5A
+:10260000400D1124425083E0E82E24E560E0C30130
+:102610000E947E0B17CFC2010E94581873CF8D8184
+:1026200066960FB6F894DEBF0FBECDBFDF91CF9197
+:102630001F910F91FF90EF90DF90CF90BF90AF90E0
+:102640009F908F907F906F905F904F903F902F90D2
+:1026500008950F931F93CF93DF93EC018C01025BDE
+:102660001F4FC8010E94CD0961EB74E0C8010E94B0
+:10267000961BC8010E94DE0983E00E94071D8DE1C0
+:1026800091E0EEEFFFE30995FE01EC5AFF4F108257
+:102690006CE874E0C8010E94D61BC8010E94DE09E4
+:1026A0002A96CE010E943F0964E0CE010E9477097C
+:1026B000811107C062E370E080E090E00E94B619EB
+:1026C000F0CFDF91CF911F910F9108952F923F92FC
+:1026D0004F925F926F927F928F929F92AF92BF9232
+:1026E000CF92DF92EF92FF920F931F93CF93DF93DE
+:1026F000CDB7DEB729970FB6F894DEBF0FBECDBFBA
+:10270000998788871B012A013C0180E7680E711CAC
+:10271000F3018081882309F402C181E0E885F9850D
+:10272000EA5AFF4F8083E885F985EB5AFF4F108204
+:10273000E885F985EC5AFF4F1082E885F985108EFF
+:102740008F01025B1F4F61E0C8010E94230A888548
+:1027500099858D5A9F4F9C838B83C884D98497E534
+:10276000C90ED11CE884F984E8E5EE0EF11C8885D9
+:1027700099858E5A9F4F9A838983E885F985EF580A
+:10278000FF4FFE83ED8388849984FAE08F0E911CBD
+:10279000A884B98485E2A80EB11C888599850E9419
+:1027A0001F118823D1F3F1018491882321F0EB815B
+:1027B000FC81508101C050E02BE135E040E060E059
+:1027C000C8015F830E941A0C5F814114510439F0E3
+:1027D0004CE0450F920160E0C8010E941A0CF6011E
+:1027E00010828CE0F7018083B101C8010E94961B22
+:1027F000E981FA818081982F990F890F81958D5AEF
+:10280000F6018083EB81FC818081982F990F890FDD
+:102810008195835DF7018083ED81FE81808184FF56
+:1028200003C067E175E002C063E175E0C8010E9482
+:10283000D61BE981FA818081982F990F890F8195A4
+:102840008D5AF6018083F70180818F5F8083E88550
+:10285000F98582A5882319F06FE075E002C06BE06E
+:1028600075E0C8010E94D61BE981FA818081982F0A
+:10287000990F890F81958D5AF6018083F701808128
+:102880008F5F808367E075E0C8010E94D61B65E01A
+:10289000C4010E947709882351F0E885F98562A573
+:1028A0006F5FC5010E948418C5010E946E1864E024
+:1028B000C4010E947709811113C0F3012081422FC6
+:1028C00050E060E070E0ED81FE8180819181A28125
+:1028D000B38184179507A607B707A8F02F3F99F093
+:1028E0008FEFF3018083088519850B5D1F4F60E032
+:1028F000C8010E946A16C8010E94421881E0E8855A
+:10290000F985808F0CC066E0C4010E947709882396
+:1029100009F443CF888599850E94291334CF2996DD
+:102920000FB6F894DEBF0FBECDBFDF91CF911F91E0
+:102930000F91FF90EF90DF90CF90BF90AF909F905E
+:102940008F907F906F905F904F903F902F90089561
+:1029500040E050E00C946613E0E8F7E725913491ED
+:1029600081E02130304C09F080E00895CF93DF936F
+:10297000EC010E94AC149E01275A3F4FDE01A05982
+:10298000BF4F882309F43CC0E6E9F7E78491F901D9
+:102990008083E7E9F7E7E491EC83E8E9F7E7E4917E
+:1029A000ED83E9E9F7E7859194919F838E83EBE9C5
+:1029B000F7E78591949199878887EDE9F7E7E491A6
+:1029C000EBA7EEE9F7E7E491EAA7EFE9F7E7E4918F
+:1029D000EC93E0EAF7E7859194919D8F8C8FE2EA82
+:1029E000F7E7859194919F8F8E8FE4EAF7E78591C1
+:1029F000949199A388A3E6EAF7E78591949120C082
+:102A00008CE3F90180831C828FEF8D8320E233E019
+:102A10003F832E8324ED33E03987288791E09BA7FD
+:102A20009AA78C938CEA9DE09D8F8C8F8EED9DE014
+:102A30009F8F8E8F84E79EE099A388A38CE39FE00D
+:102A40009BA38AA3DF91CF910895CF92DF92EF925B
+:102A50000F93CF93DF93EC01FC01E158FF4F82E32A
+:102A60008083349781E090E0A0E0B0E080839183A0
+:102A7000A283B3833B978FEF8083CE010E94B6146D
+:102A8000CE010E9492186FEFCE010E9496186E013F
+:102A90008AE0C80ED11CC6010E942F09C6010E94FF
+:102AA0003F09CE0148960E94F9188EE0E82E0FE00B
+:102AB00020E14BE06DE0CE01825B9F4F0E945A0EF9
+:102AC000A596CE010E94D61565E0C6010E94770941
+:102AD000882351F060E0CE01DF91CF910F91EF900C
+:102AE000DF90CF900C94841840E06BE875E0CE0145
+:102AF000DF91CF910F91EF90DF90CF900C947516EE
+:102B0000CF93DF9300D0CDB7DEB769837A830E947D
+:102B1000AC1469817A81882351F0DB01EBE8F7E797
+:102B200084918D933196E53987E7F807C9F70F90BF
+:102B30000F90DF91CF91089550E0DA01AA0FBB1FEB
+:102B4000A80FB91F1F963C911F9750962C91509734
+:102B5000E32FF22FE60FF11DE60FF11D25913491C1
+:102B600090963C932E935F97F90165917491FC01C7
+:102B70007481769F602D1124DC01A40FB51F9196FE
+:102B80006C939197F90185919491E92FF0E0862F4C
+:102B900090E0E817F90720F4F90185919491692FE5
+:102BA000769F602D112492966C93089521E0FC018C
+:102BB000248324E020A72AEE35E0308B278740E0ED
+:102BC00060E00E949C1561E070E083E00E94341A8E
+:102BD000E1EBF0E08081887F81608083F89410923F
+:102BE0008000E1E8F0E010821092850010928400ED
+:102BF00088E191E0909389008093880080818860CB
+:102C00008083808181608083EFE6F0E08081826054
+:102C10008083789408950F93FC01842F01112AC0BA
+:102C20006230D9F050F4662399F0613019F540E034
+:102C3000682FCF010F910C949C156330A9F064307C
+:102C4000C9F46481649F802D1124858F268F12C062
+:102C50004B3008F08AE0868B0DC06481649F802D24
+:102C60001124818F228F06C06481649F802D1124DE
+:102C7000838F248F0F910895FC0121110EC0648B66
+:102C80008481849F402D1124458B15A214A213A288
+:102C900081E0878B80934B05108E089580914B05C2
+:102CA000882319F08091480501C080E08093B4002A
+:102CB0000895FC0161110DC0178A158A14A213A290
+:102CC000108E109248051092490510924B050C94F5
+:102CD0004E160895CF93DF93EC01611103C00E945B
+:102CE00059161982DF91CF9108950F931F93CF93B7
+:102CF000DF93EC018B0141110EC060E00E946A1667
+:102D00001E870D871B8A1A8A81E0898389E08E8B52
+:102D1000198E1B8E1D8EDF91CF911F910F910895FB
+:102D2000CF93DF93EC01611128C08881882329F1BA
+:102D30008981811122C089852F819885E22FF92F01
+:102D4000E80FF11DE80FF11D859194918F3F2FEF52
+:102D5000920711F4188211C09C879927880F991F38
+:102D6000EA85FB85E80FF91F6591749140E0CE017B
+:102D70000E94751689858F5F8987DF91CF910895AD
+:102D800060E00C94901660E00C946A160F93CF9359
+:102D9000DF93EC0161115CC08981882309F458C07C
+:102DA0008D89811155C02D853E85EA89FB89EE0FFD
+:102DB000FF1FE20FF31F85919491009701F5898918
+:102DC000813021F41B8A1A8AF90110C01982888186
+:102DD00060E0882371F0CE010E949016EA89FB8999
+:102DE000EE0FFF1F8D859E85E80FF91F8591949149
+:102DF00006C0CE01DF91CF910F910C945916BC0102
+:102E0000769567957695679580FF17C0AC0186E04B
+:102E1000569547958A95E1F7292F2695269526956B
+:102E200020514F716F7000E0CE010E940B16EA89AD
+:102E3000FB893196FB8BEA8BD3CF492F6F7320E050
+:102E4000CE010E943C168A899B8901969B8B8A8BB6
+:102E5000DF91CF910F91089560E00C94C616CF9347
+:102E6000DF93EC016111BAC08F89882309F4B6C0E1
+:102E70008D89811105C0CE01DF91CF910C94591637
+:102E800081508D8B8DA1811139C02BA13CA12F5F69
+:102E90003F4FC901880F991FEF8DF8A1E80FF91F67
+:102EA00065917491862F87708EA3AB0163E0569570
+:102EB00047956A95E1F7CA0196958795972F96955C
+:102EC00096959FA38F739C81899F802D11248DA33C
+:102ED0004170409347053CA32BA389A190E028179C
+:102EE000390760F02AA1222329F0821B91099CA3B3
+:102EF0008BA304C060E0CE010E9459168DA18150C1
+:102F00008DA3888D21E0280F288F4C893FA1340F95
+:102F10008C85380F3A836B8D662361F070E0822FC9
+:102F2000022E000C990B0E94461D8C8D869F300D41
+:102F300011243A838A8190E0CB966BE370E00E9483
+:102F4000461D8A833E893B83698D662371F0062E78
+:102F5000000C770B822F022E000C990B0E94461D4D
+:102F60008A8D869F300D11243B836D8D662389F0F9
+:102F7000822F220F990B70E00E94461DCB0162E068
+:102F800070E00E94461D2E8D9B81289F900D11247C
+:102F90009B834F3341F08B818A300CF089E087FDB1
+:102FA00080E08B8301C01B82F894EA81F0E0E75651
+:102FB000FA4FE491E0934A058D8198A5899F802D71
+:102FC00011249B81899F802D11249EA1899F802D92
+:102FD000112480934905809348057894DF91CF911F
+:102FE000089560E00C942F1760914905662329F13C
+:102FF00080914C058F5F80934C0590914A0589170D
+:10300000E0F081E090914B05911180E080934B05B9
+:1030100010924C0580914705882369F08091040146
+:1030200093E4899F802D1124895B809304010E9481
+:10303000261D909348050C944E1608951F920F92EA
+:103040000FB60F9211242F933F934F935F936F937B
+:103050007F938F939F93AF93BF93EF93FF930E94C0
+:10306000F417FF91EF91BF91AF919F918F917F9155
+:103070006F915F914F913F912F910F900FBE0F90E5
+:103080001F901895CF93DF93EC0160E00E946A16C1
+:1030900082EE95E09E878D871B8A1A8A81E089835C
+:1030A00089E08E8B198E1B8E1D8EDF91CF91089536
+:1030B000CF93DF93EC0160E00E946A168AED95E001
+:1030C0009E878D871B8A1A8A81E0898389E08E8B8F
+:1030D000198E1B8E1D8EDF91CF910895CF93DF93B4
+:1030E000EC0160E00E946A1684ED95E09E878D8772
+:1030F0001B8A1A8A81E0898389E08E8B198E1B8E48
+:103100001D8EDF91CF910895FC01262F660F330BA2
+:103110009681692F70E06F5F7F4FC9010E94461D45
+:103120008583089521E0FC012083089570E085E007
+:103130000C94341AAF92BF92CF92DF92EF92FF922B
+:103140000F931F93CF93DF93EC0189819A812FE036
+:10315000289F8001299F100D112485E10E94171AD4
+:10316000800F911F24E0969587952A95E1F79A8321
+:1031700089832881222391F1EC81AD80B12CC12C6F
+:10318000D12CA885B9857D0100E010E06E817F819A
+:103190009B0140E050E08617970728F0BC01A81774
+:1031A000B90708F4BD0180E090E01F921F921F92C2
+:1031B000EF930E94A21C6B830F900F900F900F90C3
+:1031C00070E085E0DF91CF911F910F91FF90EF901C
+:1031D000DF90CF90BF90AF900C94341ADF91CF91D5
+:1031E0001F910F91FF90EF90DF90CF90BF90AF9025
+:1031F0000895FC018CE39FE09383828384E08183C4
+:1032000081E084870895CF93DF93EC018C819D81C9
+:10321000892B71F18C858F7141F584E10E94171A19
+:10322000BC01990F880B990B0E94F81D26EE3FE315
+:103230004EEC50E40E94841E0E94C71D9B017B83BC
+:103240006A83672B81F084E08983FE01349680E0F5
+:10325000419151912417350710F4898309C08F5F7C
+:103260008430B1F702C08FEF89838C858F5F8C87A4
+:10327000DF91CF9108951F920F920FB60F921124F4
+:103280002F933F938F939F93AF93BF9380914E055E
+:1032900090914F05A0915005B091510530914D0589
+:1032A00023E0230F2D3720F40196A11DB11D05C089
+:1032B00026E8230F0296A11DB11D20934D05809392
+:1032C0004E0590934F05A0935005B0935105809102
+:1032D000520590915305A0915405B0915505019662
+:1032E000A11DB11D8093520590935305A0935405E1
+:1032F000B0935505BF91AF919F918F913F912F91C1
+:103300000F900FBE0F901F9018952FB7F8946091F3
+:103310004E0570914F0580915005909151052FBF3A
+:1033200008953FB7F8948091520590915305A0916C
+:103330005405B091550526B5A89B05C02F3F19F03F
+:103340000196A11DB11D3FBFBA2FA92F982F882725
+:10335000820F911DA11DB11DBC01CD0142E0660F80
+:10336000771F881F991F4A95D1F70895CF92DF9252
+:10337000EF92FF92CF93DF936B017C010E94911932
+:10338000EB01C114D104E104F10479F00E94911918
+:103390006C1B7D0B683E7340A0F381E0C81AD10816
+:1033A000E108F108C851DC4FECCFDF91CF91FF90DD
+:1033B000EF90DF90CF900895789484B5826084BDBB
+:1033C00084B5816084BD85B5826085BD85B5816029
+:1033D00085BDEEE6F0E0808181608083E1E8F0E089
+:1033E0001082808182608083808181608083E0E8B8
+:1033F000F0E0808181608083E1EBF0E08081846097
+:103400008083E0EBF0E0808181608083EAE7F0E098
+:1034100080818460808380818260808380818160FC
+:1034200080838081806880831092C10008958E30EF
+:1034300008F08E502091050190E4299F90011124FD
+:103440008770822B80937C0080917A0080648093C7
+:103450007A0080917A0086FDFCCF809178002091DF
+:10346000790090E0922B08951F93CF93DF93182F4C
+:10347000EB0161E00E94BC1A209711F460E004C0E7
+:10348000CF3FD10539F461E0812FDF91CF911F91BA
+:103490000C94F81AE12FF0E0EA50FA4FE491E3308F
+:1034A000F9F048F4E130B9F0E230A1F584B580627A
+:1034B00084BDC8BD34C0E630E9F0E73019F1E4302E
+:1034C00049F580918000806280938000D0938B00CA
+:1034D000C0938A0024C084B5806884BDC7BD1FC066
+:1034E00080918000806880938000D0938900C09391
+:1034F000880015C08091B00080688093B000C093B0
+:10350000B3000DC08091B00080628093B000C09382
+:10351000B40005C0C038D1050CF0B5CFAFCFDF91F6
+:10352000CF911F910895833081F028F4813099F074
+:103530008230A1F008958630A9F08730B9F0843048
+:10354000D1F4809180008F7D03C0809180008F77BF
+:1035500080938000089584B58F7702C084B58F7DF5
+:1035600084BD08958091B0008F7703C08091B00032
+:103570008F7D8093B0000895CF93DF9390E0FC019E
+:10358000E65FF94F2491FC01E25EF94F84918823B4
+:1035900061F190E0880F991FFC01EA5BF94FC5913A
+:1035A000D491FC01E45CF94FA591B491611109C07B
+:1035B0009FB7F8948881209582238883EC912E23ED
+:1035C0000BC0623061F49FB7F8948881322F309538
+:1035D00083238883EC912E2B2C939FBF06C08FB73B
+:1035E000F894E8812E2B28838FBFDF91CF91089527
+:1035F0000F931F93CF93DF931F92CDB7DEB7282F82
+:1036000030E0F901EA50FA4F8491F901E65FF94F91
+:103610001491F901E25EF94F04910023D9F0882357
+:1036200021F069830E94931A6981E02FF0E0EE0F88
+:10363000FF1FE45CF94FA591B4919FB7F894611115
+:1036400005C08C91E12FE095E82302C0EC91E12BBD
+:10365000EC939FBF0F90DF91CF911F910F91089531
+:10366000CF93DF93282F30E0F901EA50FA4F84918D
+:10367000F901E65FF94FD491F901E25EF94FC49187
+:10368000CC2391F081110E94931AEC2FF0E0EE0F01
+:10369000FF1FEE5CF94FA591B491EC91ED2381E011
+:1036A00090E021F480E002C080E090E0DF91CF91D3
+:1036B0000895CF92DF92EF92FF920F931F93CF93D3
+:1036C000DF936C01EB017B01E40EF51E00E010E0DE
+:1036D000CE15DF0561F06991D601ED91FC91019065
+:1036E000F081E02DC6010995080F191FF1CFC8011F
+:1036F000DF91CF911F910F91FF90EF90DF90CF90CE
+:1037000008956115710579F0FB0101900020E9F73A
+:103710003197AF01461B570BDC01ED91FC91028004
+:10372000F381E02D099480E090E00895EF92FF92FC
+:103730000F931F93CF93DF937C01FB0100E010E018
+:103740006491EF012196662361F0D701ED91FC9120
+:103750000190F081E02DC7010995080F191FFE01A6
+:10376000EFCFC801DF91CF911F910F91FF90EF90A4
+:1037700008950C94811BDC01ED91FC910190F08186
+:10378000E02D09940F931F93CF93DF93EC016DE02D
+:103790000E94BB1B8C016AE0CE010E94BB1B800F04
+:1037A000911FDF91CF911F910F9108950F931F9358
+:1037B000CF93DF93EC010E94961B8C01CE010E94F7
+:1037C000C21B800F911FDF91CF911F910F91089520
+:1037D0008F929F92AF92BF92CF92DF92EF92FF9221
+:1037E0000F931F93CF93DF93CDB7DEB7A1970FB69B
+:1037F000F894DEBF0FBECDBF6C01142FE52FCB01B7
+:10380000022F19A2223008F40AE07E0121E2E20E22
+:10381000F11C802E912CA12CB12C612F7E2FA501A3
+:1038200094010E945A1D029F1019112481E0E81A88
+:10383000F1081A3014F4105D01C0195CF70110830F
+:10384000122FE32FCA01232B242B252B31F7B7018D
+:10385000C6010E94811BA1960FB6F894DEBF0FBE71
+:10386000CDBFDF91CF911F910F91FF90EF90DF902F
+:10387000CF90BF90AF909F908F9008952115310504
+:1038800041F4DC01ED91FC910190F081E02D642F79
+:1038900009940C94E81B9A01AB0160E070E00C9471
+:1038A0003E1CCF92DF92EF92FF920F931F93CF9324
+:1038B000DF93EC016A017B012115310579F4E88180
+:1038C000F9810190F081E02D642FDF91CF911F915C
+:1038D0000F91FF90EF90DF90CF9009942A3031053F
+:1038E000E9F477FF1AC06DE20E94BB1B8C014427EC
+:1038F0005527BA014C195D096E097F092AE0CE01EE
+:103900000E94E81B800F911FDF91CF911F910F91B3
+:10391000FF90EF90DF90CF9008952AE0B701A601C5
+:10392000CE01DF91CF911F910F91FF90EF90DF902B
+:10393000CF900C94E81B9A01AB01770F660B770BC5
+:103940000C94511C4F925F926F927F92AF92BF92F4
+:10395000CF92DF92EF92FF920F931F93CF93DF935B
+:10396000CDB7DEB729013A019B01AC012419350915
+:103970004609570989899A89AB89BC89BC01CD015F
+:103980006A197B098C099D090E94161DA8019701DF
+:1039900024193509460957090E947C1DCA01B9013D
+:1039A0006A0D7B1D8C1D9D1DDF91CF911F910F9185
+:1039B000FF90EF90DF90CF90BF90AF907F906F908F
+:1039C0005F904F90089561E08AE00E94F81A61E0EC
+:1039D0008AE00E94BC1A8CB580618CBD8CB5806475
+:1039E0008CBD61E08DE00E94BC1A61E08BE00C941C
+:1039F000BC1A811103C08CB5806202C08CB58F7D6A
+:103A00008CBD08959CB5937F892B8CBD08959CB582
+:103A10009C7F282F2370922B9CBD2DB582FB99276C
+:103A200090F9822F8E7F892B8DBD0895DB018F93B6
+:103A30009F930E949B1DBF91AF91A29F800D911DEE
+:103A4000A39F900DB29F900D11240895991B79E0CA
+:103A500004C0991F961708F0961B881F7A95C9F71E
+:103A600080950895AA1BBB1B51E107C0AA1FBB1F6D
+:103A7000A617B70710F0A61BB70B881F991F5A95FA
+:103A8000A9F780959095BC01CD01089597FB072E6D
+:103A900016F4009407D077FD09D00E94321D07FC70
+:103AA00005D03EF4909581959F4F0895709561954E
+:103AB0007F4F0895A1E21A2EAA1BBB1BFD010DC06A
+:103AC000AA1FBB1FEE1FFF1FA217B307E407F507CE
+:103AD00020F0A21BB30BE40BF50B661F771F881FAA
+:103AE000991F1A9469F760957095809590959B0140
+:103AF000AC01BD01CF010895052E97FB1EF4009483
+:103B00000E94931D57FD07D00E945A1D07FC03D049
+:103B10004EF40C94931D50954095309521953F4F50
+:103B20004F4F5F4F089590958095709561957F4FA9
+:103B30008F4F9F4F08950E94B81DA59F900DB49F71
+:103B4000900DA49F800D911D112408950024A7FDC0
+:103B500000942A0F301D401D501D601D701D801DDA
+:103B6000901D0895EE0FFF1F0590F491E02D09942C
+:103B7000A29FB001B39FC001A39F700D811D1124AE
+:103B8000911DB29F700D811D1124911D08950E94F9
+:103B9000631E88F09F5798F0B92F9927B751B0F05E
+:103BA000E1F0660F771F881F991F1AF0BA95C9F7C1
+:103BB00014C0B13091F00E947D1EB1E008950C94C4
+:103BC0007D1E672F782F8827B85F39F0B93FCCF377
+:103BD000869577956795B395D9F73EF4909580953E
+:103BE000709561957F4F8F4F9F4F0895E89409C05E
+:103BF00097FB3EF490958095709561957F4F8F4F20
+:103C00009F4F9923A9F0F92F96E9BB279395F69535
+:103C1000879577956795B795F111F8CFFAF4BB0FB3
+:103C200011F460FF1BC06F5F7F4F8F4F9F4F16C017
+:103C3000882311F096E911C0772321F09EE8872FA1
+:103C4000762F05C0662371F096E8862F70E060E05D
+:103C50002AF09A95660F771F881FDAF7880F9695D6
+:103C6000879597F9089597F99F6780E870E060E07D
+:103C700008959FEF80EC089500240A941616170605
+:103C800018060906089500240A941216130614064D
+:103C900005060895092E0394000C11F4882352F0B0
+:103CA000BB0F40F4BF2B11F460FF04C06F5F7F4F68
+:103CB0008F4F9F4F089557FD9058440F551F59F04F
+:103CC0005F3F71F04795880F97FB991F61F09F3F09
+:103CD00079F087950895121613061406551FF2CF32
+:103CE0004695F1DF08C0161617061806991FF1CF82
+:103CF00086957105610508940895E894BB276627A9
+:103D00007727CB0197F908950E94971E0C944A1EBD
+:103D10000E943C1E38F00E94431E20F0952311F0B3
+:103D20000C94331E0C94391E11240C947E1E0E9498
+:103D30005B1E70F3959FC1F3950F50E0551F629F76
+:103D4000F001729FBB27F00DB11D639FAA27F00DF4
+:103D5000B11DAA1F649F6627B00DA11D661F829F1B
+:103D60002227B00DA11D621F739FB00DA11D621F00
+:103D7000839FA00D611D221F749F3327A00D611D1D
+:103D8000231F849F600D211D822F762F6A2F1124FF
+:103D90009F5750409AF0F1F088234AF0EE0FFF1F32
+:103DA000BB1F661F771F881F91505040A9F79E3F89
+:103DB000510580F00C94331E0C947E1E5F3FE4F39B
+:103DC000983ED4F3869577956795B795F795E795DF
+:103DD0009F5FC1F7FE2B880F911D9695879597F9E8
+:103DE00008958F929F92AF92BF92CF92DF92EF92FF
+:103DF000FF92CF93DF93EC01688179818A819B8167
+:103E0000611571058105910521F464E279ED8BE579
+:103E100097E02DE133EF41E050E00E947C1D490125
+:103E20005A019B01AC01A7EAB1E40E949B1D6B0102
+:103E30007C01ACEEB4EFA50194010E94F721DC01F6
+:103E4000CB018C0D9D1DAE1DBF1DB7FF03C001979B
+:103E5000A109B04888839983AA83BB839F77DF91A8
+:103E6000CF91FF90EF90DF90CF90BF90AF909F9059
+:103E70008F9008950E94F11E089580E091E00E94C5
+:103E8000F11E0895A0E0B0E080930001909301013D
+:103E9000A0930201B09303010895AEE0B0E0E3E522
+:103EA000FFE10C940A220D891E898F89988D26E0E6
+:103EB0002C831A83098397FF02C080E090E8019762
+:103EC0009E838D83AE01455E5F4F698D7A8DCE01F5
+:103ED00001960E947D1F4D815E8157FD0AC02F8192
+:103EE0003885421753070CF49A01F801E20FF31FCB
+:103EF00010822E96E4E00C942622ACE0B0E0E3E8D9
+:103F0000FFE10C94FC216C017B018A01FC0117820A
+:103F10001682838181FFBEC1CE0101964C01F6015C
+:103F20009381F70193FD859193FF81917F01882310
+:103F300009F4ACC1853239F493FD859193FF8191E9
+:103F40007F01853229F4B60190E00E946621E7CF17
+:103F5000512C312C20E02032A0F48B3269F030F467
+:103F6000803259F0833269F420612CC08D3239F0EF
+:103F7000803339F4216026C02260246023C0286089
+:103F800021C027FD27C030ED380F3A3078F426FFE6
+:103F900006C0FAE05F9E300D1124532E13C08AE054
+:103FA000389E300D1124332E20620CC08E3221F445
+:103FB00026FD6CC1206406C08C3611F4206802C056
+:103FC000883641F4F70193FD859193FF81917F013C
+:103FD0008111C1CF982F9F7D9554933028F40C5FA9
+:103FE0001F4F9FE399830DC0833631F0833771F003
+:103FF000833509F05BC022C0F801808189830E5FA0
+:104000001F4F44244394512C540115C03801F2E051
+:104010006F0E711CF801A080B18026FF03C0652DD2
+:1040200070E002C06FEF7FEFC5012C870E945B211B
+:104030002C0183012C852F77222E17C03801F2E046
+:104040006F0E711CF801A080B18026FF03C0652DA2
+:1040500070E002C06FEF7FEFC5012C870E945021F6
+:104060002C012C852068222E830123FC1BC0832D6C
+:1040700090E048165906B0F4B60180E290E00E9444
+:1040800066213A94F4CFF50127FC859127FE8191B2
+:104090005F01B60190E00E94662131103A94F1E090
+:1040A0004F1A51084114510471F7E6C0843611F0DB
+:1040B000893639F5F80127FF07C060817181828157
+:1040C00093810C5F1F4F08C060817181072E000C27
+:1040D000880B990B0E5F1F4F2F76722E97FF09C02A
+:1040E00090958095709561957F4F8F4F9F4F206879
+:1040F000722E2AE030E0A4010E949621A82EA81872
+:1041000044C0853729F42F7EB22E2AE030E025C046
+:10411000F22FF97FBF2E8F36C1F018F4883579F071
+:10412000B5C0803719F0883721F0B0C02F2F20613B
+:10413000B22EB4FE0DC08B2D8460B82E09C024FFB2
+:104140000AC09F2F9660B92E06C028E030E005C057
+:1041500020E130E002C020E132E0F801B7FE07C004
+:1041600060817181828193810C5F1F4F06C06081E5
+:10417000718180E090E00E5F1F4FA4010E949621A4
+:10418000A82EA818FB2DFF777F2E76FE0BC0372DAB
+:104190003E7FA51450F474FE0AC072FC08C0372D8F
+:1041A0003E7E05C0BA2C372D03C0BA2C01C0B52CF9
+:1041B00034FF0DC0FE01EA0DF11D8081803311F442
+:1041C000397E09C032FF06C0B394B39404C0832F74
+:1041D000867809F0B39433FD13C030FF06C0B314E2
+:1041E00098F43A0C532C5B1810C0B31470F4B60159
+:1041F00080E290E03C870E946621B3943C85F5CF35
+:10420000B31418F43B1802C05A2C312C34FF12C0DE
+:10421000B60180E390E03C870E9466213C8532FF36
+:1042200017C031FD03C088E790E002C088E590E048
+:10423000B6010CC0832F867859F031FF02C08BE2A3
+:1042400001C080E237FD8DE2B60190E00E94662158
+:10425000A51438F4B60180E390E00E9466215A94D8
+:10426000F7CFAA94F401EA0DF11D8081B60190E028
+:104270000E946621A110F5CF332009F450CEB6017B
+:1042800080E290E00E9466213A94F6CFF6018681A2
+:10429000978102C08FEF9FEF2C96E2E10C941822D9
+:1042A000FC010590615070400110D8F78095909501
+:1042B0008E0F9F1F0895FC01615070400190011006
+:1042C000D8F7809590958E0F9F1F08950F931F9399
+:1042D000CF93DF93182F092FEB018B8181FD03C052
+:1042E0008FEF9FEF1EC082FF0FC02E813F818C8118
+:1042F0009D812817390774F4E881F981CF0101966F
+:1043000099838883108306C0E885F985812F0995F4
+:10431000892B31F78E819F8101969F838E83812F18
+:10432000902FDF91CF911F910F910895FA01AA2745
+:10433000283051F1203181F1E8946F936E7F6E5FE8
+:104340007F4F8F4F9F4FAF4FB1E03ED0B4E03CD096
+:10435000670F781F891F9A1FA11D680F791F8A1F79
+:10436000911DA11D6A0F711D811D911DA11D20D0E0
+:1043700009F468943F912AE0269F11243019305D9A
+:104380003193DEF6CF010895462F4770405D41938B
+:10439000B3E00FD0C9F7F6CF462F4F70405D4A33D8
+:1043A00018F0495D31FD4052419302D0A9F7EACFA0
+:1043B000B4E0A6959795879577956795BA95C9F7CF
+:1043C00000976105710508959B01AC010A2E0694C2
+:1043D0005795479537952795BA95C9F7620F731F7B
+:1043E000841F951FA01D0895B7FF0C949B1D0E946C
+:1043F0009B1D821B930B08952F923F924F925F92C9
+:104400006F927F928F929F92AF92BF92CF92DF92E4
+:10441000EF92FF920F931F93CF93DF93CDB7DEB749
+:10442000CA1BDB0B0FB6F894DEBF0FBECDBF0994DD
+:104430002A88398848885F846E847D848C849B8434
+:10444000AA84B984C884DF80EE80FD800C811B8142
+:10445000AA81B981CE0FD11D0FB6F894DEBF0FBE71
+:10446000CDBFED01089513E0CAE2D3E004C0FE0120
+:104470000E94B21D2196CB32D107C9F7F894FFCF25
+:10448000010000000101573D256400473D256400FF
+:10449000463D25640000000000C20F591B4C4F41EF
+:0444A000444552003D
+:00000001FF
diff --git a/Exe/POCKET.elf b/Exe/POCKET.elf
new file mode 100644
index 0000000..83128eb
--- /dev/null
+++ b/Exe/POCKET.elf
Binary files differ
diff --git a/GameStructures.h b/GameStructures.h
new file mode 100644
index 0000000..315c22b
--- /dev/null
+++ b/GameStructures.h
@@ -0,0 +1,62 @@
+#ifndef __GAME_STRUCTURES__HEADER__
+#define __GAME_STRUCTURES__HEADER__
+
+#ifdef __cplusplus
+extern "C" {
+#endif //__cplusplus
+
+/* *************************************
+ * Defines
+ * *************************************/
+
+/* *************************************
+ * Structs and enums
+ * *************************************/
+
+typedef struct t_Camera
+{
+ int16_t X_Offset;
+ int16_t Y_Offset;
+ int8_t X_Speed;
+ int8_t Y_Speed;
+ uint8_t Speed_Timer;
+}TYPE_CAMERA;
+
+typedef struct t_Building
+{
+ uint16_t x;
+ uint16_t y;
+ uint8_t hp;
+ uint8_t id;
+ bool built;
+}TYPE_BUILDING;
+
+typedef struct t_Unit
+{
+ uint16_t x;
+ uint16_t y;
+ uint8_t hp;
+ uint8_t id;
+ bool alive;
+}TYPE_UNIT;
+
+typedef struct t_CollisionBlock
+{
+ uint16_t x;
+ uint16_t y;
+ uint8_t w;
+ uint8_t h;
+}TYPE_COLLISION_BLOCK;
+
+typedef struct t_Resource
+{
+ uint8_t Wood;
+ uint8_t Gold;
+ uint8_t Food;
+}TYPE_RESOURCES;
+
+#ifdef __cplusplus
+}
+#endif //__cplusplus
+
+#endif // __GAME_STRUCTURES__HEADER__
diff --git a/Gameplay.cpp b/Gameplay.cpp
new file mode 100644
index 0000000..2ae632e
--- /dev/null
+++ b/Gameplay.cpp
@@ -0,0 +1,147 @@
+/* **************************************
+ * Includes *
+ * **************************************/
+
+#include "Gameplay.h"
+
+/* **************************************
+ * Defines *
+ * **************************************/
+
+/* **************************************
+ * Global variables *
+ * **************************************/
+
+Player GamePlayers[GAME_MAX_PLAYERS];
+
+/* **************************************
+ * Local variables *
+ * **************************************/
+
+static const char PauseMenuOption_0[] PROGMEM = "Resume";
+static const char PauseMenuOption_1[] PROGMEM = "Quit";
+
+static const char * const PauseMenuOptions[] PROGMEM = {PauseMenuOption_0,
+ PauseMenuOption_1 };
+
+/* **************************************
+ * Local prototypes *
+ * **************************************/
+
+static void GameCalculations(void);
+static void GameGraphics(void);
+static bool GamePause(void);
+static void GameLoop(void);
+
+/*
+
+const byte TowerSpr[] PROGMEM = {16,32,
+0xF,0xF0,
+0x8,0x10,
+0x8,0x10,
+0xF,0xF0,
+0x8,0x10,
+0x8,0x10,
+0x8,0x10,
+0x8,0x10,
+0x1B,0xD8,
+0x2A,0x54,
+0x4A,0x52,
+0xFB,0xDF,
+0x8,0x10,
+0x8,0x10,
+0x8,0x10,
+0x9,0x90,
+0x9,0x90,
+0x8,0x10,
+0x8,0x10,
+0x8,0x10,
+0x8,0x10,
+0x9,0x90,
+0x9,0x90,
+0x8,0x10,
+0x8,0x10,
+0x8,0x10,
+0x8,0x10,
+0x8,0x10,
+0xB,0xD0,
+0xA,0x50,
+0xA,0x50,
+0xF,0xF0,
+};*/
+
+void GameInit(void)
+{
+ uint8_t i;
+
+ for(i = 0; i < GAME_MAX_PLAYERS; i++)
+ {
+ GamePlayers[i].Init();
+ }
+
+ GfxInit();
+
+ GameLoop();
+}
+
+bool GamePause(void)
+{
+ if(PadButtonReleased(PAD_C) == true)
+ {
+ //int8_t menu(const char* const* items, uint8_t length);
+ uint8_t choice = gb.menu(PauseMenuOptions, 2);
+
+ if(choice != 0)
+ {
+ return true;
+ }
+ }
+
+ return false;
+}
+
+void GameCalculations(void)
+{
+ uint8_t i;
+
+ for(i = 0; i < GAME_MAX_PLAYERS; i++)
+ {
+ GamePlayers[i].Handler();
+ }
+
+ if(PadAnyKeyPressed() == true)
+ {
+ SystemSetRandSeed();
+ }
+}
+
+void GameGraphics(void)
+{
+ uint8_t i;
+
+ //GfxClearScreen();
+
+ for(i = 0; i < GAME_MAX_PLAYERS; i++)
+ {
+ GamePlayers[i].DrawHandler();
+ }
+}
+
+void GameLoop(void)
+{
+ while(1)
+ {
+ if(GamePause() == true)
+ {
+ return;
+ }
+
+ GameCalculations();
+
+ while(GfxRefreshNeeded() == false);
+
+ GameGraphics();
+
+ SystemIncreaseGlobalTimer();
+ }
+}
diff --git a/Gameplay.h b/Gameplay.h
new file mode 100644
index 0000000..513f420
--- /dev/null
+++ b/Gameplay.h
@@ -0,0 +1,32 @@
+#ifndef __GAMEPLAY_H__
+#define __GAMEPLAY_H__
+
+/* **************************************
+ * Includes *
+ * **************************************/
+
+#include "Global_Inc.h"
+#include "Gfx.h"
+#include "Pad.h"
+#include "Menu.h"
+#include "Player.h"
+
+/* **************************************
+ * Defines *
+ * **************************************/
+
+#define GAME_MAX_PLAYERS 1
+
+/* **************************************
+ * Global prototypes *
+ * **************************************/
+
+void GameInit(void);
+
+/* **************************************
+ * Global variables *
+ * **************************************/
+
+extern Player GamePlayers[GAME_MAX_PLAYERS];
+
+#endif // __GAMEPLAY_H__
diff --git a/Gfx.cpp b/Gfx.cpp
new file mode 100644
index 0000000..469ddd7
--- /dev/null
+++ b/Gfx.cpp
@@ -0,0 +1,191 @@
+/* *************************************
+ * Includes
+ * *************************************/
+
+#include "Gfx.h"
+
+/* *************************************
+ * Defines
+ * *************************************/
+
+/* *************************************
+ * Structs and enums
+ * *************************************/
+
+/* *************************************
+ * Local variables
+ * *************************************/
+
+static bool GfxIsInsideScreenArea(int8_t x, int8_t y, uint8_t w, uint8_t h);
+
+void GfxInit(void)
+{
+ gb.display.persistence = false; // Clears screen automatically
+ gb.display.setFont(font3x5);
+}
+
+void GfxDrawSprite(TYPE_SPRITE * ptrSprite)
+{
+ if(GfxIsSpriteInsideScreenArea(ptrSprite) == true)
+ {
+ gb.display.setColor(ptrSprite->color, GFX_WHITE);
+ gb.display.drawBitmap( ptrSprite->x,
+ ptrSprite->y,
+ ptrSprite->Data,
+ ptrSprite->rotation,
+ ptrSprite->flip );
+ }
+}
+
+bool GfxRefreshNeeded(void)
+{
+ return gb.update();
+}
+
+void GfxShowKeyboard(char * str, uint8_t length)
+{
+ gb.keyboard(str, length);
+}
+
+void GfxClearScreen(void)
+{
+ //gb.display.fillScreen(GFX_WHITE);
+ gb.display.clear();
+}
+
+bool GfxIsInsideScreenArea(int8_t x, int8_t y, uint8_t w, uint8_t h)
+{
+ /*char strBuffer[16];
+
+ snprintf(strBuffer, 16, "%d", (int)(x + w));
+ GfxPrintText(strBuffer,48,8);
+
+ snprintf(strBuffer, 16, "x = %d", (int)(x));
+ GfxPrintText(strBuffer,48,16);
+
+ snprintf(strBuffer, 16, "w = %d", (int)(w));
+ GfxPrintText(strBuffer,48,24);*/
+
+ if( ( (x + w) >= 0)
+ &&
+ (x < X_SCREEN_RESOLUTION)
+ &&
+ ( (y + h) >= 0)
+ &&
+ (y < Y_SCREEN_RESOLUTION) )
+ {
+ return true;
+ }
+
+ return false;
+}
+
+bool GfxIsSpriteInsideScreenArea(TYPE_SPRITE * spr)
+{
+ return GfxIsInsideScreenArea(spr->x, spr->y, spr->w, spr->h);
+}
+
+uint8_t GfxGetWidthFromSpriteData(const uint8_t * sprData)
+{
+ // On Gamebuino bitmaps, width is always stored on first byte.
+ return pgm_read_byte_near(sprData[0]) << 1;
+}
+
+uint8_t GfxGetHeightFromSpriteData(const uint8_t * sprData)
+{
+ // On Gamebuino bitmaps, height is always stored on second byte.
+ return pgm_read_byte_near(sprData[1]) << 1;
+}
+
+void GfxPrintText_Flash(const __FlashStringHelper * str)
+{
+ gb.popup(str, 20 * 3 /* 3 seconds */);
+}
+
+void GfxPrintTextFont(const char * str, const uint8_t * font, uint8_t x, uint8_t y)
+{
+ uint8_t * orig_font = gb.display.getFont();
+
+ gb.display.cursorX = x;
+ gb.display.cursorY = y;
+
+ gb.display.setFont(font);
+
+ gb.display.setColor(GFX_BLACK, GFX_WHITE);
+
+ gb.display.print(str);
+
+ if(orig_font != NULL)
+ {
+ gb.display.setFont(orig_font);
+ }
+}
+
+void GfxRenderTiles(TYPE_CAMERA * ptrCamera)
+{
+ gb.display.setColor(GFX_GRAY);
+
+ if(ptrCamera == NULL)
+ {
+ return;
+ }
+
+ for(int i = 0; i < Y_SCREEN_RESOLUTION; i+=8)
+ {
+ for(int j = 0; j < X_SCREEN_RESOLUTION; j++)
+ {
+ //if(j & 1)
+ //{
+ int x = j + ptrCamera->X_Offset;
+ int y = i + ptrCamera->Y_Offset;
+
+ if((x >= 0) && (y >= 0))
+ {
+ gb.display.drawPixel(j + ptrCamera->X_Offset, i + ptrCamera->Y_Offset);
+ }
+ //}
+ }
+ }
+
+ for(int i = 0; i < X_SCREEN_RESOLUTION; i+=8)
+ {
+ for(int j = 0; j < Y_SCREEN_RESOLUTION; j++)
+ {
+ //if(j & 1)
+ //{
+ int x = j + ptrCamera->X_Offset;
+ int y = i + ptrCamera->Y_Offset;
+
+ if((x >= 0) && (y >= 0))
+ {
+ gb.display.drawPixel(i + ptrCamera->X_Offset, j + ptrCamera->Y_Offset);
+ }
+ //}
+ }
+ }
+}
+
+void GfxPrintText(const char * str, uint8_t x, uint8_t y)
+{
+ GfxPrintTextFont(str, font3x5, x, y);
+}
+
+void GfxShowResources(TYPE_RESOURCES * ptrResources)
+{
+ char str[8];
+
+ gb.display.setColor(GFX_WHITE);
+ gb.display.fillRect(0, 0, X_SCREEN_RESOLUTION, 8);
+
+ snprintf(str, 8, "W=%d", ptrResources->Wood);
+
+ GfxPrintTextFont(str, font3x3, 4, 4);
+
+ snprintf(str, 8, "G=%d", ptrResources->Gold);
+
+ GfxPrintTextFont(str, font3x3, 24, 4);
+
+ snprintf(str, 8, "F=%d", ptrResources->Food);
+
+ GfxPrintTextFont(str, font3x3, 48, 4);
+}
diff --git a/Gfx.h b/Gfx.h
new file mode 100644
index 0000000..b07e0c6
--- /dev/null
+++ b/Gfx.h
@@ -0,0 +1,68 @@
+#ifndef __GFX_HEADER__
+#define __GFX_HEADER__
+
+/* *************************************
+ * Includes
+ * *************************************/
+
+#include "Global_Inc.h"
+#include "GameStructures.h"
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif //__cplusplus
+
+/* *************************************
+ * Defines
+ * *************************************/
+
+#define X_SCREEN_RESOLUTION 84
+#define Y_SCREEN_RESOLUTION 48
+
+#define GFX_WHITE 0
+#define GFX_BLACK 1
+#define GFX_INVERT 2
+#define GFX_GRAY 3
+
+/* *************************************
+ * Structs and enums
+ * *************************************/
+
+typedef struct
+{
+ int8_t x;
+ int8_t y;
+ uint8_t w;
+ uint8_t h;
+ uint8_t rotation;
+ uint8_t flip;
+ uint8_t color;
+ const uint8_t * Data;
+}TYPE_SPRITE;
+
+/* *************************************
+ * Global prototypes
+ * *************************************/
+
+void GfxDrawSprite(TYPE_SPRITE * ptrSprite);
+bool GfxRefreshNeeded(void);
+void GfxShowKeyboard(char * str, uint8_t length);
+uint8_t GfxGetWidthFromSpriteData(const uint8_t * sprData);
+uint8_t GfxGetHeightFromSpriteData(const uint8_t * sprData);
+bool GfxIsSpriteInsideScreenArea(TYPE_SPRITE * spr);
+void GfxClearScreen(void);
+#ifdef __cplusplus
+void GfxPrintText_Flash(const __FlashStringHelper * str);
+#endif // __cplusplus
+void GfxPrintText(const char * str, uint8_t x, uint8_t y);
+void GfxPrintTextFont(const char * str, const uint8_t * font, uint8_t x, uint8_t y);
+void GfxShowResources(TYPE_RESOURCES * ptrResources);
+void GfxInit(void);
+void GfxRenderTiles(TYPE_CAMERA * ptrCamera);
+
+#ifdef __cplusplus
+}
+#endif //__cplusplus
+
+#endif //__GFX_HEADER__
diff --git a/Global_Inc.h b/Global_Inc.h
new file mode 100644
index 0000000..8c95e20
--- /dev/null
+++ b/Global_Inc.h
@@ -0,0 +1,46 @@
+#ifndef __GLOBAL_INC_HEADER__
+#define __GLOBAL_INC_HEADER__
+
+
+/* *************************************
+ * Includes
+* *************************************/
+
+#include <inttypes.h>
+#include <stdbool.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <avr/pgmspace.h>
+#include "System.h"
+#include "settings.c"
+#include "GameStructures.h"
+
+#ifdef __cplusplus
+#include <Gamebuino.h>
+#include <Print.h>
+#endif //__cplusplus
+
+/* *************************************
+ * Defines
+* *************************************/
+
+/* *************************************
+ * Structs and enums
+* *************************************/
+
+/* *************************************
+ * Global variables
+* *************************************/
+
+#ifdef __cplusplus
+extern Gamebuino gb;
+extern const uint8_t font3x5[];
+extern const uint8_t font3x3[];
+#endif //__cplusplus
+
+/* *************************************
+ * Global prototypes
+* *************************************/
+
+#endif //__GLOBAL_INC_HEADER__
diff --git a/Makefile b/Makefile
new file mode 100644
index 0000000..c71c0ef
--- /dev/null
+++ b/Makefile
@@ -0,0 +1,43 @@
+PROJECT=POCKET
+
+CC=avr-gcc
+CXX=avr-g++
+LINKER=$(CXX)
+
+MCU=atmega328p
+CPU_SPEED=-DF_CPU=16000000UL
+ARDUINO_VERSION=ARDUINO_150
+
+INCLUDE_FOLDERS= gamebuino arduino
+LIBS=-L../lib -lgamebuino -larduino
+INCLUDE= $(foreach dir,$(INCLUDE_FOLDERS),-I$/../include/$(dir))
+CC_FLAGS=-mmcu=$(MCU) $(CPU_SPEED) -Wall -Werror -Os -c -ffunction-sections -fdata-sections -g
+DEFINE = -D$(ARDUINO_VERSION)
+
+OBJ_DIR = Obj
+SRC_DIR = .
+
+default: build $(PROJECT).HEX size
+
+size:
+ avr-size Exe/$(PROJECT).ELF
+
+clean:
+ rm *.elf -f
+ rm $(OBJ_DIR)/*.o -f -r
+
+build: $(addprefix $(OBJ_DIR)/,main.o Gameplay.o System.o Gfx.o Pad.o \
+ Player.o Camera.o Menu.o Building.o)
+
+$(OBJ_DIR)/%.o: $(SRC_DIR)/%.cpp
+ $(CXX) $< -o $@ $(INCLUDE) $(DEFINE) $(CC_FLAGS)
+
+$(OBJ_DIR)/%.o: $(SRC_DIR)/%.c
+ $(CC) $< -o $@ $(INCLUDE) $(DEFINE) $(CC_FLAGS)
+
+$(PROJECT).ELF:
+ $(LINKER) $(OBJ_DIR)/*.o -o Exe/$(PROJECT).elf -mmcu=$(MCU) -g $(LIBS) $(INCLUDE) -flto -Wl,--gc-sections
+
+$(PROJECT).HEX: $(PROJECT).ELF
+ avr-objcopy -j.text -j.data -j.bss -O ihex Exe/$^ $@
+ mv $@ Exe/
diff --git a/Menu.cpp b/Menu.cpp
new file mode 100644
index 0000000..06d5c18
--- /dev/null
+++ b/Menu.cpp
@@ -0,0 +1,54 @@
+/* **************************************
+ * Includes *
+ * **************************************/
+
+#include "Menu.h"
+
+/* **************************************
+ * Defines *
+ * **************************************/
+
+/* **************************************
+ * Local variables *
+ * **************************************/
+
+static const char MainMenuOption_0[] PROGMEM = "Single player game";
+static const char MainMenuOption_1[] PROGMEM = "Multiplayer game";
+static const char MainMenuOption_2[] PROGMEM = "Options";
+static const char MainMenuOption_3[] PROGMEM = "Quit";
+
+static const char * const MainMenuOptions[] PROGMEM = { MainMenuOption_0,
+ MainMenuOption_1,
+ MainMenuOption_2,
+ MainMenuOption_3 };
+
+void MenuGetPlayerName(Player * ptrPlayer)
+{
+ memset(ptrPlayer->getName(), 0, PLAYER_NAME_LENGTH);
+ gb.getDefaultName(ptrPlayer->getName());
+}
+
+void MainMenu(void)
+{
+ //int8_t menu(const char* const* items, uint8_t length);
+
+ uint8_t choice = gb.menu(MainMenuOptions, 3);
+
+ switch(choice)
+ {
+ case 0:
+ MenuGetPlayerName(&GamePlayers[0]);
+ GameInit();
+ break;
+ case 1:
+ break;
+ break;
+ case 2:
+
+ break;
+
+ default:
+ break;
+ }
+
+}
diff --git a/Menu.h b/Menu.h
new file mode 100644
index 0000000..ef29f4e
--- /dev/null
+++ b/Menu.h
@@ -0,0 +1,18 @@
+#ifndef __MENU_HEADER__
+#define __MENU_HEADER__
+
+/* **************************************
+ * Includes *
+ * **************************************/
+
+#include "Global_Inc.h"
+#include "Player.h"
+#include "Gameplay.h"
+
+/* **************************************
+ * Global prototypes *
+ * **************************************/
+
+void MainMenu(void);
+
+#endif // __MENU_HEADER__
diff --git a/Pad.cpp b/Pad.cpp
new file mode 100644
index 0000000..bb2a0ab
--- /dev/null
+++ b/Pad.cpp
@@ -0,0 +1,43 @@
+/* *************************************
+ * Includes
+ * *************************************/
+
+#include "Pad.h"
+
+/* *************************************
+ * Defines
+ * *************************************/
+
+/* *************************************
+ * Structs and enums
+ * *************************************/
+
+bool PadButtonReleased(PAD_BUTTONS btn)
+{
+ return gb.buttons.released(btn);
+}
+
+bool PadButtonPressed(PAD_BUTTONS btn)
+{
+ return gb.buttons.timeHeld(btn) > 0;
+}
+
+bool PadDirectionKeyPressed(void)
+{
+ return ( PadButtonPressed(PAD_UP)
+ ||
+ PadButtonPressed(PAD_DOWN)
+ ||
+ PadButtonPressed(PAD_LEFT)
+ ||
+ PadButtonPressed(PAD_RIGHT) );
+}
+
+bool PadAnyKeyPressed(void)
+{
+ return ( (PadDirectionKeyPressed() == true)
+ ||
+ (PadButtonPressed(PAD_A) == true)
+ ||
+ (PadButtonPressed(PAD_B) == true) );
+}
diff --git a/Pad.h b/Pad.h
new file mode 100644
index 0000000..d4c97be
--- /dev/null
+++ b/Pad.h
@@ -0,0 +1,49 @@
+#ifndef __PAD_HEADER__
+#define __PAD_HEADER__
+
+/* **************************************
+ * Includes *
+ * **************************************/
+
+#include "Global_Inc.h"
+
+/* **************************************
+ * Defines *
+ * **************************************/
+
+/* **************************************
+ * Structs and enums *
+ * **************************************/
+ //BTN_A, BTN_B, BTN_C, BTN_UP, BTN_RIGHT, BTN_DOWN, BTN_LEFT
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif //__cplusplus
+
+
+typedef enum t_padbuttons
+{
+ PAD_A = BTN_A,
+ PAD_B = BTN_B,
+ PAD_C = BTN_C,
+ PAD_LEFT = BTN_LEFT,
+ PAD_RIGHT = BTN_RIGHT,
+ PAD_UP = BTN_UP,
+ PAD_DOWN = BTN_DOWN,
+}PAD_BUTTONS;
+
+/* **************************************
+ * Global prototypes *
+ * **************************************/
+
+bool PadButtonReleased(PAD_BUTTONS btn);
+bool PadButtonPressed(PAD_BUTTONS btn);
+bool PadDirectionKeyPressed(void);
+bool PadAnyKeyPressed(void);
+
+#ifdef __cplusplus
+}
+#endif //__cplusplus
+
+#endif //__PAD_HEADER__
diff --git a/PeasantSpr.c b/PeasantSpr.c
new file mode 100644
index 0000000..a4a23d7
--- /dev/null
+++ b/PeasantSpr.c
@@ -0,0 +1,27 @@
+static byte PROGMEM Peasant_LeftRight_Spr[] =
+{
+ 8,8, //width and height
+ B00011000,
+ B00100100,
+ B00110010,
+ B01001010,
+ B01001010,
+ B00110010,
+ B00100100,
+ B00011000,
+
+};
+
+static byte PROGMEM Peasant_Walking_UpDown_Spr[] =
+{
+ 8,8, //width and height
+ B00000010,
+ B00011101,
+ B01100111,
+ B10100101,
+ B10011001,
+ B11000010,
+ B10111100,
+ B01100000,
+
+};
diff --git a/Player.cpp b/Player.cpp
new file mode 100644
index 0000000..59391db
--- /dev/null
+++ b/Player.cpp
@@ -0,0 +1,192 @@
+/* **************************************
+ * Includes *
+ * **************************************/
+
+#include "Player.h"
+
+/* **************************************
+ * Defines *
+ * **************************************/
+
+/* **************************************
+ * Local variables *
+ * **************************************/
+
+Player::Player(void)
+{
+
+}
+
+Player::~Player(void)
+{
+
+}
+
+void Player::Init(void)
+{
+ uint8_t i;
+
+ unit_i = 0;
+ bldg_i = 0;
+
+ CameraInit(&Camera);
+ BuildingInit();
+
+ for(i = 0; i < PLAYER_MAX_BUILDINGS; i++)
+ {
+ memset(&buildings[i], 0, sizeof(TYPE_BUILDING));
+ }
+
+ TYPE_COLLISION_BLOCK cl;
+
+ Resources.Wood = 25;
+ Resources.Gold = 50;
+ Resources.Food = 75;
+
+ cl.x = SystemRand(0, 20);
+ cl.y = SystemRand(0, 20);
+ cl.w = BuildingGetWidthFromID(0);
+ cl.h = BuildingGetHeightFromID(0);
+
+ if(createBuilding(0, cl) == false)
+ {
+ GfxPrintText_Flash(F("Failed to create building!"));
+ }
+}
+
+bool Player::createUnit(uint8_t id)
+{
+ if(unit_i < PLAYER_MAX_UNITS)
+ {
+ units[unit_i++] = id;
+ return true;
+ }
+ else
+ {
+ return false;
+ }
+
+ return false;
+}
+
+void Player::DrawHandler(void)
+{
+ uint8_t i;
+
+ //GfxRenderTiles(&Camera);
+
+ for(i = 0; i < PLAYER_MAX_BUILDINGS; i++)
+ {
+ BuildingDraw(&Camera, &buildings[i]);
+ }
+}
+
+bool Player::checkNewBuildingPosition(TYPE_COLLISION_BLOCK * cb)
+{
+ uint8_t i;
+ TYPE_COLLISION_BLOCK bldgCB;
+ bool success;
+ static uint8_t max_tries = 0;
+
+ for(i = 0; i < PLAYER_MAX_BUILDINGS; i++)
+ {
+ success = false;
+
+ if(buildings[i].built == false)
+ {
+ continue;
+ }
+
+ bldgCB.x = buildings[i].x;
+ bldgCB.y = buildings[i].y;
+ bldgCB.w = BuildingGetWidthFromID(buildings[i].id);
+ bldgCB.h = BuildingGetHeightFromID(buildings[i].id);
+
+ if(SystemCollisionCheck(*cb, bldgCB) == true)
+ {
+ success = false;
+ }
+ else
+ {
+ success = true;
+ }
+
+ if(success == false)
+ {
+ cb->x = SystemRand(0, 128);
+ cb->y = SystemRand(0, 128);
+
+ if(++max_tries < 16)
+ {
+ if(checkNewBuildingPosition(cb) == false)
+ {
+ return false;
+ }
+ else
+ {
+ return true;
+ }
+ }
+ else
+ {
+ return false;
+ }
+ }
+ }
+
+ max_tries = 0;
+ return true;
+}
+
+bool Player::createBuilding(uint8_t id, TYPE_COLLISION_BLOCK cb)
+{
+ if(checkNewBuildingPosition(&cb) == false)
+ {
+ return false;
+ }
+
+ if(bldg_i < PLAYER_MAX_BUILDINGS)
+ {
+ buildings[bldg_i].id = id;
+ buildings[bldg_i].x = cb.x;
+ buildings[bldg_i].y = cb.y;
+ buildings[bldg_i].hp = BuildingGetHpFromID(id);
+ buildings[bldg_i].built = true;
+
+ bldg_i++;
+
+ return true;
+ }
+ else
+ {
+ return false;
+ }
+
+ return false;
+}
+
+void Player::Handler(void)
+{
+ CameraHandler(&Camera);
+
+ if(PadButtonReleased(PAD_A) == true)
+ {
+ TYPE_COLLISION_BLOCK cl;
+
+ cl.x = SystemRand(0, 32);
+ cl.y = SystemRand(0, 32);
+ cl.w = BuildingGetWidthFromID(BARRACKS);
+ cl.h = BuildingGetHeightFromID(BARRACKS);
+
+ if(createBuilding(BARRACKS, cl) == false)
+ {
+ GfxPrintText_Flash(F("Failed!"));
+ }
+ else
+ {
+ GfxPrintText_Flash(F("Building built!\0"));
+ }
+ }
+
+ GfxShowResources(&Resources);
+}
diff --git a/Player.h b/Player.h
new file mode 100644
index 0000000..68a2353
--- /dev/null
+++ b/Player.h
@@ -0,0 +1,59 @@
+#ifndef __PLAYER_HEADER__
+#define __PLAYER_HEADER__
+
+/* **************************************
+ * Includes *
+ * **************************************/
+
+#include "Global_Inc.h"
+#include "GameStructures.h"
+#include "Camera.h"
+#include "Building.h"
+
+/* **************************************
+ * Defines *
+ * **************************************/
+
+#define PLAYER_NAME_LENGTH 16
+#define PLAYER_MAX_UNITS 32
+#define PLAYER_MAX_BUILDINGS 32
+
+/* **************************************
+ * Structs and enums *
+ * **************************************/
+
+/* **************************************
+ * Class definition *
+ * **************************************/
+
+class Player
+{
+ public:
+ Player();
+ ~Player();
+ void Init(void);
+ void Handler(void);
+ void DrawHandler(void);
+ char * getName(void) {return name;}
+ void setHuman(bool value) { human = value; }
+ bool isHuman(void) {return human;}
+ bool createUnit(uint8_t id);
+ bool createBuilding(uint8_t id, TYPE_COLLISION_BLOCK cb);
+ uint8_t getPopulation(void) {return (unit_i + 1);}
+ uint8_t getBuildings(void) {return (bldg_i + 1);}
+
+ private:
+ bool checkNewBuildingPosition(TYPE_COLLISION_BLOCK * cb);
+ char name[PLAYER_NAME_LENGTH];
+ uint8_t units[PLAYER_MAX_UNITS];
+ TYPE_BUILDING buildings[PLAYER_MAX_BUILDINGS];
+ uint8_t id;
+ uint8_t unit_i;
+ uint8_t bldg_i;
+ bool human;
+ TYPE_CAMERA Camera;
+ TYPE_RESOURCES Resources;
+ //Print _serial;
+};
+
+#endif //PLAYER_HEADER__
diff --git a/PocketEmpires/PocketEmpires.atsln b/PocketEmpires/PocketEmpires.atsln
new file mode 100644
index 0000000..406bb3c
--- /dev/null
+++ b/PocketEmpires/PocketEmpires.atsln
@@ -0,0 +1,8 @@
+
+Microsoft Visual Studio Solution File, Format Version 11.00
+# Atmel Studio Solution File, Format Version 11.00
+Global
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+EndGlobal
diff --git a/PocketEmpires/PocketEmpires.atsuo b/PocketEmpires/PocketEmpires.atsuo
new file mode 100644
index 0000000..080e58d
--- /dev/null
+++ b/PocketEmpires/PocketEmpires.atsuo
Binary files differ
diff --git a/Sprites/Barracks.bmp b/Sprites/Barracks.bmp
new file mode 100644
index 0000000..65d6b50
--- /dev/null
+++ b/Sprites/Barracks.bmp
Binary files differ
diff --git a/Sprites/BarracksShadow.bmp b/Sprites/BarracksShadow.bmp
new file mode 100644
index 0000000..c24383a
--- /dev/null
+++ b/Sprites/BarracksShadow.bmp
Binary files differ
diff --git a/Sprites/Mouse.bmp b/Sprites/Mouse.bmp
new file mode 100644
index 0000000..49e7e14
--- /dev/null
+++ b/Sprites/Mouse.bmp
Binary files differ
diff --git a/Sprites/Peasant_Left1.bmp b/Sprites/Peasant_Left1.bmp
new file mode 100644
index 0000000..e8c82fe
--- /dev/null
+++ b/Sprites/Peasant_Left1.bmp
Binary files differ
diff --git a/Sprites/Peasant_Left2.bmp b/Sprites/Peasant_Left2.bmp
new file mode 100644
index 0000000..a92ef3f
--- /dev/null
+++ b/Sprites/Peasant_Left2.bmp
Binary files differ
diff --git a/Sprites/Peasant_Left3.bmp b/Sprites/Peasant_Left3.bmp
new file mode 100644
index 0000000..d6f8e21
--- /dev/null
+++ b/Sprites/Peasant_Left3.bmp
Binary files differ
diff --git a/Sprites/Peasant_LeftRight.bmp b/Sprites/Peasant_LeftRight.bmp
new file mode 100644
index 0000000..b31b973
--- /dev/null
+++ b/Sprites/Peasant_LeftRight.bmp
Binary files differ
diff --git a/Sprites/Peasant_UpDown.bmp b/Sprites/Peasant_UpDown.bmp
new file mode 100644
index 0000000..81a678e
--- /dev/null
+++ b/Sprites/Peasant_UpDown.bmp
Binary files differ
diff --git a/Sprites/Peasant_Walking_UpDown.bmp b/Sprites/Peasant_Walking_UpDown.bmp
new file mode 100644
index 0000000..9ed48db
--- /dev/null
+++ b/Sprites/Peasant_Walking_UpDown.bmp
Binary files differ
diff --git a/Sprites/PocketEmpires.ino b/Sprites/PocketEmpires.ino
new file mode 100644
index 0000000..892bde4
--- /dev/null
+++ b/Sprites/PocketEmpires.ino
@@ -0,0 +1,284 @@
+#include <Backlight.h>
+#include <Battery.h>
+#include <Buttons.h>
+#include <Display.h>
+#include <Gamebuino.h>
+#include <Sound.h>
+#include <SPI.h>
+
+#define POPULATION_LIMIT 20
+#define PEASANT_HEALTH 25
+
+Gamebuino gb;
+unsigned long int global_timer;
+
+class Unit
+{
+ public:
+ Unit();
+ ~Unit();
+ inline short GetX(void){return _x;}
+ inline short GetY(void){return _y;}
+ inline const byte * GetSprite(void){return _sprite;}
+
+ protected:
+ unsigned char _health;
+ unsigned char _team;
+ unsigned char _strength;
+ unsigned char _armor;
+ bool _walking;
+ bool _direction;
+ short _x;
+ short _y;
+ const byte * _sprite;
+};
+
+class Peasant: public Unit
+{
+ public:
+ Peasant(short x, short y);
+ ~Peasant();
+
+ private:
+};
+
+class Team
+{
+ public:
+ Team(unsigned char number);
+ ~Team();
+ void IncreasePopulation(void);
+ inline bool LimitReached(void){return _limit_reached;}
+ template <class T>
+ T *createUnit(short x, short y);
+ inline int GetPopulation(void){return _unitArrayIterator;}
+ Unit * GetUnit(int i){return _unitArray[i];}
+
+ private:
+ Unit * _unitArray[POPULATION_LIMIT];
+ unsigned char _team_number;
+ int _unitArrayIterator;
+ bool _limit_reached;
+
+};
+
+const byte BarracksSpr[] PROGMEM = {24,24,
+0xE7,0x0,0xE7,
+0xBD,0x0,0xBD,
+0xE7,0xFF,0xE7,
+0xBD,0x0,0xBD,
+0x81,0xFF,0x81,
+0xE7,0x0,0xE7,
+0xA5,0x0,0xA5,
+0xBD,0xFF,0xBD,
+0xA5,0x0,0xA5,
+0xA5,0x0,0xA5,
+0xA5,0x0,0xA5,
+0xA5,0x0,0xA5,
+0xA5,0x0,0xA5,
+0xA5,0x0,0xA5,
+0xA5,0x0,0xA5,
+0xA5,0x0,0xA5,
+0xE7,0x0,0xE7,
+0xBD,0x0,0xBD,
+0xE7,0xFF,0xE7,
+0xBD,0x0,0xBD,
+0x81,0xFF,0x81,
+0x81,0x18,0x81,
+0x81,0x24,0x81,
+0xFF,0xFF,0xFF,
+};
+
+const byte BarracksShadowSpr[] PROGMEM = {24,24,
+0x0,0x0,0x0,
+0x0,0x0,0xFE,
+0xFE,0x0,0xFE,
+0xFE,0x0,0x3E,
+0x3E,0x0,0xFE,
+0xFE,0x0,0xFE,
+0xFE,0x0,0x1E,
+0x1E,0x0,0x1E,
+0x1E,0x0,0x1E,
+0x1E,0x0,0x1E,
+0x1E,0x0,0x1E,
+0x1E,0x0,0x1E,
+0x1E,0x0,0x1E,
+0x1E,0x0,0x1E,
+0x1E,0x0,0x1E,
+0x1E,0x0,0x1E,
+0x1E,0x0,0x1E,
+0x1E,0x0,0x1E,
+0x1E,0x0,0xFE,
+0xFE,0x0,0xFE,
+0xFE,0x0,0x3E,
+0x3E,0x0,0xFE,
+0xFE,0x0,0xFE,
+0xFE,0x0,0xFE,
+};
+
+const byte TowerSpr[] PROGMEM = {16,32,
+0xF,0xF0,
+0x8,0x10,
+0x8,0x10,
+0xF,0xF0,
+0x8,0x10,
+0x8,0x10,
+0x8,0x10,
+0x8,0x10,
+0x1B,0xD8,
+0x2A,0x54,
+0x4A,0x52,
+0xFB,0xDF,
+0x8,0x10,
+0x8,0x10,
+0x8,0x10,
+0x9,0x90,
+0x9,0x90,
+0x8,0x10,
+0x8,0x10,
+0x8,0x10,
+0x8,0x10,
+0x9,0x90,
+0x9,0x90,
+0x8,0x10,
+0x8,0x10,
+0x8,0x10,
+0x8,0x10,
+0x8,0x10,
+0xB,0xD0,
+0xA,0x50,
+0xA,0x50,
+0xF,0xF0,
+};
+
+const byte Peasant_UpDownSpr[] PROGMEM = {8,6,
+0x3C,
+0x42,
+0x99,
+0xA5,
+0x66,
+0x18,
+};
+
+const byte Peasant_Walking_UpDownSpr[] PROGMEM = {8,8,
+0x2,
+0x1D,
+0x67,
+0xA5,
+0x99,
+0xC2,
+0xBC,
+0x60,
+};
+
+const byte Peasant_LeftRightSpr[] PROGMEM = {8,8,
+0x30,
+0x48,
+0x64,
+0x94,
+0x94,
+0x64,
+0x48,
+0x30,
+};
+
+Team::Team(unsigned char number)
+{
+ _team_number = number;
+ _unitArrayIterator = 0;
+ _limit_reached = false;
+}
+
+Team::~Team(void)
+{
+
+
+}
+
+Team Player(0);
+
+Unit::Unit(void)
+{
+
+}
+
+Unit::~Unit(void)
+{
+
+}
+
+void Team::IncreasePopulation(void)
+{
+ _unitArrayIterator++;
+
+ if(_unitArrayIterator >= POPULATION_LIMIT)
+ {
+ _limit_reached = true;
+ }
+}
+
+template <class T>
+T* Team::createUnit(short x, short y)
+{
+ T* ptr = new T(x,y);
+
+ _unitArray[_unitArrayIterator] = ptr;
+ IncreasePopulation();
+ return ptr;
+}
+
+Peasant::Peasant(short x, short y)
+{
+ _health = PEASANT_HEALTH;
+ _armor = 0;
+ _x = x;
+ _y = y;
+ _sprite = Peasant_UpDownSpr;
+}
+
+Peasant::~Peasant(void)
+{
+
+}
+
+void setup()
+{
+ // put your setup code here, to run once:
+ gb.begin();
+ gb.titleScreen(F("Pocket Empires"));
+
+ global_timer = 0;
+}
+
+void loop()
+{
+ // put your main code here, to run repeatedly:
+ if(gb.update() )
+ {
+ /*gb.display.drawBitmap(x,y,bitmap,rotation,flip);*/
+ gb.display.drawBitmap(7,0,BarracksSpr);
+ gb.display.drawBitmap(32,0,TowerSpr);
+
+ gb.display.setColor(GRAY, WHITE);
+ gb.display.drawBitmap(0,0,BarracksShadowSpr);
+ gb.display.setColor(BLACK, WHITE);
+
+ /*if(global_timer & 1)
+ {
+ gb.display.drawBitmap(0,0,BarracksShadowSpr);
+ }*/
+
+ if(gb.buttons.pressed(BTN_B) == true)
+ {
+ Player.createUnit<Peasant>(rand() % 20,rand() % 20);
+ }
+
+ for(int i = 0; i < Player.GetPopulation() ; i++)
+ {
+ gb.display.drawBitmap(Player.GetUnit(i)->GetX(), Player.GetUnit(i)->GetY(),Player.GetUnit(i)->GetSprite() );
+ }
+ // gb.display.println(F("Hello World!"));
+
+ global_timer++;
+ }
+}
diff --git a/Sprites/PocketEmpires.ino.hex b/Sprites/PocketEmpires.ino.hex
new file mode 100644
index 0000000..18e1e22
--- /dev/null
+++ b/Sprites/PocketEmpires.ino.hex
@@ -0,0 +1,781 @@
+:100000000C944B020C9473020C9473020C947302C4
+:100010000C9473020C9473020C9473020C9473028C
+:100020000C9473020C9473020C9473020C94A81039
+:100030000C9473020C9473020C9473020C9473026C
+:100040000C943B110C9473020C9473020C94730285
+:100050000C9473020C9473020C9473020C9473024C
+:100060000C9473020C947302506F636B657420459B
+:100070006D70697265730008063C4299A566181098
+:10008000200FF0081008100FF008100810081008D2
+:10009000101BD82A544A52FBDF0810081008100918
+:1000A000900990081008100810081009900990088D
+:1000B0001008100810081008100BD00A500A500F32
+:1000C000F018180000000000FEFE00FEFE003E3E9C
+:1000D00000FEFE00FEFE001E1E001E1E001E1E0074
+:1000E0001E1E001E1E001E1E001E1E001E1E001EC6
+:1000F0001E001E1E001E1E001E1E00FEFE00FEFE36
+:10010000003E3E00FEFE00FEFE00FE1818E700E77F
+:10011000BD00BDE7FFE7BD00BD81FF81E700E7A5AA
+:1001200000A5BDFFBDA500A5A500A5A500A5A5002E
+:10013000A5A500A5A500A5A500A5A500A5E700E724
+:10014000BD00BDE7FFE7BD00BD81FF818118818152
+:100150002481FFFFFF03053F213F1208120A100A06
+:100160000E1C0E0C1E0C141A14161F161E131E1E27
+:100170001B1E1E1F1E3F213F3A2F3A173D173F21DE
+:100180003F181F02040A041F0E04040E1F0A1F0A50
+:100190000E0E1F04110E2E252E2F2A2E262929027F
+:1001A0001F02081F08150E04040E150E15151B1549
+:1001B0001B040604040C04000000001700030003E5
+:1001C0001F0A1F16371A1904130A153A00030000F4
+:1001D0000E11110E000A040A040E0400300004047B
+:1001E000040010001804031F111F121F101D151703
+:1001F00011151F07041F17151D1F151D01011F1FB6
+:10020000151F17151F000A00003200040A110A0A00
+:100210000A110A040115020E11171E051E1F150AE8
+:100220000E110A1F110E1F15111F05010E111D1FA2
+:10023000041F111F1108100F1F041B1F10101F0691
+:100240001F1E040F0E110E1F09060E112E1F051A78
+:10025000121509011F011F101F0F180F1F0C1F1B64
+:10026000041B031C03191513001F11030418111F8D
+:10027000000201022020200001020C121E1F120C9D
+:100280000C12120C121F0C1A14041E05242A1E1F15
+:10029000021C141D1020201D1F0814111F101E0405
+:1002A0001E1E021C0C120C3E0A040C123E1E0402FE
+:1002B00014160A020F120E101E0E100E1E081E1229
+:1002C0000C1226281E322A26041E21001F00211E81
+:1002D000040102013F213F0A4E6F20534420636115
+:1002E0007264206F720A6E6F204C4F414445522E4B
+:1002F0004845580A0A153A45786974001D20466C2D
+:10030000617368696E670A20206C6F616465722E84
+:100310002E2E0A0A444F4E2754205455524E204F39
+:10032000464621000A0A153A49676E6F7265006DEC
+:10033000560A0A504C45415345205455524E204FC1
+:10034000464620004C4F57204241545445525921B3
+:1003500020001753440016137800161314001510CC
+:10036000200015201000540A03E181867F3E186D9D
+:10037000830F0F0E0183866033186DC3198F180326
+:10038000C38E6033186DE330CF1803C39E603630E0
+:10039000CDE360CF3006C79E7E3E30CDB360CF3018
+:1003A0000CC6F6603330D9B660CF33CFCCF660617F
+:1003B000B0DB1E60CF30D86CE6C061B0DB1E618F51
+:1003C00019986CC6C063B19B0E330F0FB078C6FF8F
+:1003D0007E1F1B061E0F050089300802380249786F
+:1003E00068140000F6E8DBCFC3B8AEA49B928A8203
+:1003F0007B746E68625C57524E4945413E3A3734D1
+:10040000312E2C29272523211F1D1C1A19171615DB
+:1004100014131211100F0E0D0C0B0A0908070645D4
+:100420000068010000050038016801000035043152
+:10043000040101FF030101F70300000008000201AD
+:100440000000030407000000000000000001020497
+:100450000810204080010204081020010204081046
+:10046000200404040404040404020202020202033D
+:1004700003030303030000000023002600290000FB
+:10048000000000250028002B0000000000240027A9
+:10049000002A00003D0311241FBECFEFD8E0DEBFCD
+:1004A000CDBF11E0A0E0B1E0E6E8F0E302C00590C6
+:1004B0000D92A033B107D9F723E0A0E3B1E001C06A
+:1004C0001D92AB3FB207E1F714E0C6E9D4E004C0E7
+:1004D0002297FE010E94A116C439D107C9F70E94D4
+:1004E000E0140C9441180C9400001092B101109289
+:1004F000B00184E191E09093AF018093AE0110923E
+:10050000580110925A011092590110925B010895FE
+:10051000FC0121A532A52F5F3F4F32A721A724312F
+:10052000310514F081E083A7089580E691E00E94F0
+:10053000C90D68E670E080E691E00E944C0D1092D3
+:100540005C0110925D0110925E0110925F010895AE
+:100550000F931F93CF93DF9380E691E00E940F0BE0
+:10056000882309F485C02BE031E040E067E08EEAA3
+:1005700091E00E9406072FE730E040E060E28EEA5B
+:1005800091E00E94060740E063E08EEA91E00E945D
+:10059000140521EC30E040E060E08EEA91E00E943A
+:1005A000060740E061E08EEA91E00E94140565E0F4
+:1005B0008AE691E00E943104882371F10E94291893
+:1005C000EC010E9429188C018CE090E00E94EF144D
+:1005D000FC0189E18083138224E130E0C801B90184
+:1005E0000E943F1697838683CE01B9010E943F1671
+:1005F0009187808787E790E093878287A091590150
+:10060000B0915A01AA0FBB1FA05DBE4FED93FC93A2
+:1006100080E391E00E94880200E311E0C0E0D0E0B6
+:100620008091590190915A01C817D90774F4D801E3
+:10063000ED91FD918D0122853385408566818EEA9D
+:1006400091E00E9406072196EBCF80915C0190918A
+:100650005D01A0915E01B0915F010196A11DB11DE8
+:1006600080935C0190935D01A0935E01B0935F0164
+:10067000DF91CF911F910F9108950C94750221E0A5
+:10068000FC012083089570E085E00C944612AF923F
+:10069000BF92CF92DF92EF92FF920F931F93CF936F
+:1006A000DF93EC0189819A812FE0289F8001299FA7
+:1006B000100D112485E10E942912800F911F24E062
+:1006C000969587952A95E1F79A8389832881222335
+:1006D00091F1AC81AD80B12CC12CD12CE885F9858C
+:1006E0007F0100E010E06E817F819B0140E050E0DF
+:1006F0008617970728F0BC01E817F90708F4BF012F
+:1007000080E090E01F921F921F92AF930E94981476
+:100710006B830F900F900F900F9070E085E0DF914A
+:10072000CF911F910F91FF90EF90DF90CF90BF90EE
+:10073000AF900C944612DF91CF911F910F91FF90D3
+:10074000EF90DF90CF90BF90AF900895FC018CE3C5
+:100750009FE09383828384E0818381E0848708958E
+:10076000CF93DF93EC018C819D81892B81F18C8566
+:100770008F7151F584E10E942912BC01882777FD11
+:100780008095982F0E94201526EE3FE34EEC50E412
+:100790000E94AC150E94F2149B017B836A83611551
+:1007A000710581F084E08983FE0140E084819581B8
+:1007B0002817390710F449830AC04F5F3296443036
+:1007C000A9F702C08FEF89838C858F5F8C87DF91BB
+:1007D000CF910895FC0188E0808389E0818387E0E0
+:1007E000828386E0838384E0848382E0858381E161
+:1007F00086830895DF92EF92FF920F931F93CF931A
+:10080000DF937C01EC0100E010E0DD24DA9462E08B
+:1008100088810E94CE1288810E943D13F701E00F6B
+:10082000F11F892B21F487818F5F878308C087811F
+:10083000882349F08F3F11F4178201C0D78260E00E
+:1008400088810E94CE120F5F1F4F2196073011053D
+:10085000F1F6DF91CF911F910F91FF90EF90DF9014
+:100860000895FC01E60FF11D81E09781913009F0B8
+:1008700080E008958EBD00000DB407FEFDCF8EB55B
+:100880000895DC01643508F053C0403308F050C0CF
+:1008900090968C919097342F359535953595E62F18
+:1008A000FF27E7FDF095242F2770823099F4DF01B0
+:1008B000A951BE4F84E53802A00DB11D11248C91C1
+:1008C00090E0022E02C0959587950A94E2F78095F4
+:1008D000817009C0833039F446271C968C914827D3
+:1008E00040FF03C014C0811112C084E53802E00D3E
+:1008F000F11D1124E951FE4F81E090E0022E01C06C
+:10090000880F0A94EAF780959081982310C084E5B7
+:100910003802E00DF11D1124E951FE4F81E090E015
+:10092000022E01C0880F0A94EAF79081982B9083D9
+:1009300008951F93CF93DF93EC01162FF89460E096
+:100940008F850E940713888918161CF460E00E94A6
+:100950000713812F0E943A04888918161CF461E05D
+:100960000E9407137894DF91CF911F91089528EF8B
+:1009700031E0E7EEF1E0DF01A9011D924150504066
+:10098000E1F7DC0119961C9219971A961C920895AA
+:10099000DF92EF92FF920F931F93CF93DF93EC01BF
+:1009A0008C858F5F8C8787EEE82E81E0F82ED12C26
+:1009B0006D2D6064CE010E94990460E8CE010E9412
+:1009C000990461E08F850E940713888918161CF42A
+:1009D00060E00E94071300E010E0F701E00FF11F54
+:1009E00080810E943A040F5F1F4F04351105A9F75B
+:1009F000888918161CF461E00E940713D39484E5DB
+:100A0000E80EF11C86E0D812D3CF60E4CE01DF916E
+:100A1000CF911F910F91FF90EF90DF900C9499046C
+:100A2000FC0160A361A30895FC0160A341A30895A4
+:100A3000CF92DF92FF920F931F93CF93DF931F927A
+:100A4000CDB7DEB76C01062FF42E10E0121754F468
+:100A5000412F4F0D602FC60129830E9441041F5F63
+:100A60002981F4CF0F90DF91CF911F910F91FF90CB
+:100A7000DF90CF900895CF92DF92FF920F931F9354
+:100A8000CF93DF931F92CDB7DEB76C01062FF42E04
+:100A900010E0121754F4612F600F4F2DC601298307
+:100AA0000E9441041F5F2981F4CF0F90DF91CF9105
+:100AB0001F910F91FF90DF90CF900895DF92EF92FA
+:100AC000FF920F931F93CF93DF93EC01E62ED22E6C
+:100AD000F42E112707FD1095040F111D47FD1A95DF
+:100AE0008F2D992787FD90958017910744F42D2D20
+:100AF0004F2D6E2DCE010E943B05F394F1CFDF9177
+:100B0000CF911F910F91FF90EF90DF9008958F92FA
+:100B10009F92AF92BF92CF92DF92EF92FF920F938C
+:100B20001F93CF93DF93EC01E62ED42E122FCC240B
+:100B3000C394C21AB22EB194BB0CF12C802F8470D6
+:100B4000A82E802F8270982E802F8870882E01709A
+:100B5000F1160CF04DC0C7FC04C01150B394B3940F
+:100B6000CB0CF3948F2D880F8F5FC80EAA2071F0E5
+:100B7000412F4D0D6F2D6E0DCE010E9441044F2D62
+:100B80004D0D612F6E0DCE010E944104992071F030
+:100B90004D2D411B6F2D6E0DCE010E9441044D2D38
+:100BA0004F19612F6E0DCE010E944104882071F013
+:100BB0004F2D4D0D6E2D611BCE010E944104412F22
+:100BC0004D0D6E2D6F19CE010E944104002309F4D2
+:100BD000BFCF4D2D4F196E2D611BCE010E944104D8
+:100BE0004D2D411B6E2D6F19CE010E944104B0CFD7
+:100BF000DF91CF911F910F91FF90EF90DF90CF90F9
+:100C0000BF90AF909F908F9008958F929F92AF92D8
+:100C1000BF92CF92DF92EF92FF920F931F93CF93E9
+:100C2000DF93EC01B62EA42E122FDD24D394D21A1A
+:100C3000C22EC194CC0CFF24F394802F8170882E97
+:100C4000992493949E0C02708FEF8F0D8117C4F539
+:100C5000D7FC04C01150C394C394DC0C8F2D880FB3
+:100C60008F5FD80E882099F0212F220F290D4A2D51
+:100C7000411B6F2D6B0DCE010E94180523E02E0D38
+:100C80004A2D4F19612F6B0DCE010E9418050023CC
+:100C900099F0212F220F290D4A2D411B6B2D6F1921
+:100CA000CE010E94180523E02E0D4A2D4F196B2D01
+:100CB000611BCE010E941805F394E394E394C4CF22
+:100CC000DF91CF911F910F91FF90EF90DF90CF9028
+:100CD000BF90AF909F908F9008959F92AF92BF92D8
+:100CE000CF92DF92EF92FF920F931F93CF93DF93F8
+:100CF000EC01B62EF42EA22EDE2CD194DD0C9D2C10
+:100D0000920E1E2D160F292D612F0E943B05CC241B
+:100D1000CA94C00ECF0C292D4C2D612FCE010E94FC
+:100D20003B05D00EFE0C2D2D4F2D6B2DCE010E94BC
+:100D30001805BA0C6FEF6B0D2D2D4F2DCE010E94B3
+:100D4000180501E02E2D4F2D612FCE010E94870541
+:100D5000DE2CD094DB0C02E02E2D4F2D6D2DCE011C
+:100D60000E948705CE1804E02E2D4C2D6D2DCE014E
+:100D70000E94870508E02E2D4C2D612FCE010E9488
+:100D80008705DF91CF911F910F91FF90EF90DF903A
+:100D9000CF90BF90AF909F900895AF92BF92CF92A7
+:100DA000DF92EF92FF920F931F93CF93DF93EC01AB
+:100DB000A62EC42EB22EF02E1E2DE194EE0CD12EB6
+:100DC000D60E2E2D2B0D6D2D0E945E05FA94FE0C75
+:100DD000C10E6FEF6A0D6B0D611BEF2C01E0212F2F
+:100DE0004C2DCE010E94050602E0212F4C2D6D2DC9
+:100DF000CE010E940506DF91CF911F910F91FF90C8
+:100E0000EF90DF90CF90BF90AF9008956F927F9258
+:100E10008F929F92AF92BF92CF92DF92EF92FF920A
+:100E20000F931F93CF93DF93F901A49031965491C0
+:100E3000FC01F0A064350CF00CC1BB24A7FCB094FD
+:100E4000A62FBB27A7FDB095FD01EA0DFB1D1E16C1
+:100E50001F060CF0FEC040330CF0FBC0C52E042F63
+:100E6000112707FD1095E801C50FD11D57FDDA9533
+:100E70001C161D060CF0EDC0E90122969501295FB4
+:100E80003F4F37FF02C0295F3F4F73E035952795ED
+:100E90007A95E1F747FF0AC0C52EC40E209FA00136
+:100EA000219F500D1124C41BD50B40E00C2D1127A0
+:100EB00007FD1095040F111D47FD1A95013311050B
+:100EC0001CF070E3C72EC41A67FD60E0E535F1053C
+:100ED00014F0E4E5F0E01E2FFC0174857427862FE2
+:100EE000992787FD9095FC01EA1BFB0BDF015F0151
+:100EF000F7E0AF22BB24E0E8F0E002C0F595E7950B
+:100F0000AA94E2F70E2FB7FD179653E0B595A79573
+:100F10005A95E1F7AC0FBD1FE42FE77051E001C017
+:100F2000550FEA95EAF7459545954595E4E54E0256
+:100F3000800D911D112489519E4F40E0DD24C7FC96
+:100F4000D094BB24B3943327E42FF0E0EC15FD05D7
+:100F50000CF07FC0FD01E490F1E0FF1219C0EC013C
+:100F6000A02EFD01862E881A9C2E980C911608F052
+:100F700067C09E2C9A2019F09880952A9882A69492
+:100F800029F43196E4906894AA24A7F82196ECCF2E
+:100F9000F1101BC0752E7094EC01A02EFD01862E61
+:100FA000881A9C2E980C911608F04AC09E2C9A2004
+:100FB00019F0988097209882A69429F43196E490AD
+:100FC0006894AA24A7F82196ECCFE3E0FE1631F04E
+:100FD000EC01A02EFD01862E881A2EC0752E70946D
+:100FE000962EEC01A02EFD019116B0F48E2C8A20D5
+:100FF00049F08880692C672660FE02C0852A01C0FE
+:1010000087208882A69429F43196E4906894AA24D3
+:10101000A7F893942196E8CF7B2512C09E2C9A20A6
+:1010200019F0988095269882A69429F43196E49038
+:101030006894AA24A7F821969C2E980C911670F318
+:10104000550F19F48C5A9F4F51E04F5FA20FB31FF9
+:101050007BCFDF91CF911F910F91FF90EF90DF90A9
+:10106000CF90BF90AF909F908F907F906F9008959A
+:10107000DC01FB0184918F5F14968C931497319659
+:10108000E491EF5F1596EC9315976E5F7F4F5F9637
+:101090007C936E935E970895EF920F93CF93DF93B7
+:1010A000EC014E876D872F87E98A088B81E088875E
+:1010B00088A319A28F8365E571E0CE010E943808EC
+:1010C0000E9405118CB58F7D8CBD8CB58C7F8160A5
+:1010D0008CBD8DB581608DBD8CB58C608CBD61E0A3
+:1010E0008E850E94CE1261E08D850E94CE1261E055
+:1010F0008F850E94CE12898918161CF461E00E9427
+:10110000CE12888918161CF461E00E94CE128989DB
+:1011100018166CF460E00E9407136AE070E080E04B
+:1011200090E00E94B41161E089890E9407138D85C7
+:10113000992787FD9095FC01EF59FB4FE491F0E072
+:10114000EE0FFF1FE158FB4F259134913D8B2C8B07
+:10115000FC01E35BFB4F84918B8F8E85992787FD84
+:101160009095FC01EF59FB4FE491F0E0EE0FFF1F6B
+:10117000E158FB4F259134913B8B2A8BFC01E35BBB
+:10118000FB4F84918A8F8889992787FD9095FC0170
+:10119000EF59FB4FE491F0E0EE0FFF1FE158FB4FDA
+:1011A000259134913F8B2E8BFC01E35BFB4F8491A7
+:1011B0008C8F8F85992787FD9095FC01EF59FB4F08
+:1011C000E491F0E0EE0FFF1FE158FB4F25913491C1
+:1011D000398F288FFC01E35BFB4F84918D8F61E297
+:1011E000CE010E94990464E1CE010E9499048B858E
+:1011F00087FF02C08FE78B876B856068CE010E94F6
+:10120000990460E2CE010E9499046CE0CE010E9434
+:101210009904CE01DF91CF910F91EF900C94C80407
+:101220006F927F928F929F92AF92BF92CF92DF92F6
+:10123000EF92FF920F931F93CF93DF93EC01162F42
+:10124000F42EB02EE8A064350CF081C08FE2841734
+:101250000CF47DC0EC81F0E031970E9FC0010F9F30
+:10126000900D1124860F911D67FD9A951816190689
+:101270000CF06DC08D81809FC0011124840F911DE1
+:1012800047FD9A95181619060CF061C0A62E962EE9
+:10129000C22ED12C8A2D811B992787FD90952C81F8
+:1012A00030E0821793070CF051C0215031098217AA
+:1012B000930779F0C29ED001C39EB00DD29EB00DAF
+:1012C0001124A80FB91FEE8DFF8DEA0FFB1F74903C
+:1012D00001C0712C8F2C6F2C282D2F19332727FD3F
+:1012E00030958D8190E0281739076CF570FE11C09C
+:1012F00081E0B81206C0482D6A2DCE010E9441043B
+:101300001EC00B2D2B2D462D692DCE010E945E0592
+:1013100016C089A198A1891791F088A381E0B8121D
+:1013200006C0482D6A2DCE010E94410407C00B2D36
+:101330002B2D462D692DCE010E945E05E8A27694E4
+:101340006B0C8394C9CF9B0CA394A4CFE8A2DF912C
+:10135000CF911F910F91FF90EF90DF90CF90BF90B2
+:10136000AF909F908F907F906F9008950F93CF9341
+:10137000DF93EC01262F6A3039F42D8198858A8518
+:10138000299F800D112422C06D3011F108854A85F6
+:1013900069850E94100948855C812985549F200D2C
+:1013A000112429878F81882399F0332727FD3095D1
+:1013B00084E590E0459F80199109112482179307D5
+:1013C0003CF49D818A85499F800D11248A87198666
+:1013D00081E090E0DF91CF910F9108958F929F92DD
+:1013E000AF92BF92CF92DF92EF92FF920F931F9333
+:1013F000CF93DF93EC015C0186E8A80EB11CD50108
+:101400008C91882309F44DC08C3018F41CE0181B13
+:1014100001C010E0FE01EA5AFF4F81E080836E01B7
+:10142000BEE4CB0ED11C60E0C6010E9410054E0147
+:10143000E3E58E0E911CD4018C9103E0080F9DE230
+:10144000F92E4F2D481B410F23E0E22E24E560E0EA
+:10145000C6010E94CD0661E0C6010E941005F4019C
+:10146000808103E0080F4F2D481B410F24E560E009
+:10147000C6010E946D06FE01E95AFF4F84E0808399
+:101480003196D4018C91181B115D1083CC57DF4F1E
+:1014900068817981C6010E94A413F5018081815081
+:1014A0008083DF91CF911F910F91FF90EF90DF909C
+:1014B000CF90BF90AF909F908F900895DF92EF9262
+:1014C000FF920F931F93CF93DF93EC018C8D9D8D33
+:1014D000892B09F49CC08E01025B1F4F40E061E044
+:1014E000C8010E94140585E5FE01EE5AFF4F908168
+:1014F000891B3596808331961082698D613009F49D
+:1015000062C028F0888D653008F074C06FC0CE01CD
+:1015100085960E944E0F81E0FE01EA5AFF4F8083BC
+:1015200065E571E0C8010E9438081D8E1C8EFE0121
+:10153000EC5AFF4F108238EAD32E7E018AE0E80E83
+:10154000F11CCE010E940F0B8823D9F364E473E0F1
+:10155000C8010E94A4136A8D7B8D4AE050E0C80147
+:101560000E9492146FE273E0C8010E94A4136D2DD3
+:1015700062956F7070E04AE050E0C8010E947D14EF
+:1015800064E273E0C8010E94A41364E0C7010E94F2
+:10159000310481113CC0DA94A1F660E0CE010E94D2
+:1015A000430383B7817F846083BF83B7816083BF38
+:1015B00083B7816083BF889583B78E7F83BF83B7EE
+:1015C0008E7F83BFBECFCF58DF4F488159816A815C
+:1015D0007B814F7055276627772748305105610575
+:1015E000710510F467E009C068E707C0882379F047
+:1015F0006B5F03C0882359F06FE2C801DF91CF9180
+:101600001F910F91FF90EF90DF900C94C713DF9123
+:10161000CF911F910F91FF90EF90DF9008958F92DF
+:101620009F92AF92BF92EF92FF920F931F93CF932F
+:10163000DF93EC017C0100E8E00EF11CF7018080F3
+:101640009180A280B3800E94851195018401061BC0
+:10165000170B280B390BB901A8015E011FE7A10E7A
+:10166000B11CF501808190E0A0E0B0E08E0105584A
+:101670001F4F84179507A607B70750F4F80180811C
+:101680009181A281B381892B8A2B8B2B09F040C0D9
+:10169000F80180819181A281B381892B8A2B8B2BC8
+:1016A000A9F57E01F5E2EF0EF11CC7010E944B0F78
+:1016B000C7010E94B80FC7010E947C10CE010E9492
+:1016C000EE09CE010E945E0A7E012EE4E20EF11CBC
+:1016D000C7010E94C804FE01EC5AFF4F80818111AE
+:1016E00003C0C7010E94B7040E949111F8016083F2
+:1016F000718382839383FE01EB58FF4FC958DF4FFC
+:1017000028813981621B730B7183608380E036C04E
+:101710000E948511F5012081620F711D811D911DAF
+:10172000F7016083718382839383FE01EF58FF4F3B
+:1017300040815181628173814F5F5F4F6F4F7F4F57
+:101740004083518362837383F80110821182128275
+:1017500013820E949111FE01E958FF4F608371834B
+:1017600082839383CE010E944703CE010A960E9492
+:10177000FA03CE0148960E94B00381E0DF91CF9139
+:101780001F910F91FF90EF90BF90AF909F908F901F
+:1017900008950F931F93CF93DF938C01EC01C25BED
+:1017A000DF4FCE010E94B7046CEF72E0CE010E94C1
+:1017B000A413CE010E94C8048CB583608CBD8DB586
+:1017C0008E7F8DBD88E191E0EEEFFFE30995F80192
+:1017D000EC5AFF4F108267ED72E0CE010E94D213E7
+:1017E000CE010E94C804065F1F4FC8010E94FA0381
+:1017F00064E0C8010E943104811107C062E370E017
+:1018000080E090E00E94B411F0CFDF91CF911F9162
+:101810000F9108952F923F924F925F926F927F9215
+:101820008F929F92AF92BF92CF92DF92EF92FF92F0
+:101830000F931F93CF93DF93CDB7DEB729970FB6E2
+:10184000F894DEBF0FBECDBF998788871B012A01A0
+:101850003C0180E7680E711CF3018081882309F444
+:1018600002C181E0E885F985EA5AFF4F8083E88567
+:10187000F985EB5AFF4F1082E885F985EC5AFF4F46
+:101880001082E885F985108E8F01025B1F4F61E0A1
+:10189000C8010E941005888599858D5A9F4F9C83A9
+:1018A0008B83C884D98497E5C90ED11CE884F98458
+:1018B000E8E5EE0EF11C888599858E5A9F4F9A8334
+:1018C0008983E885F985EF58FF4FFE83ED8388848F
+:1018D0009984FAE08F0E911CA884B98485E2A80E41
+:1018E000B11C888599850E940F0B8823D1F3F101E3
+:1018F0008491882321F0EB81FC81508101C050E06C
+:1019000026E633E040E060E0C8015F830E940607FE
+:101910005F814114510439F04CE0450F920160E0C1
+:10192000C8010E940607F60110828CE0F70180834F
+:10193000B101C8010E94A413E981FA819081892F25
+:10194000880F890F81958D5AF6018083EB81FC8188
+:101950009081892F880F890F8195835DF70180839E
+:10196000ED81FE81808184FF03C062E673E002C0E6
+:101970006EE573E0C8010E94D213E981FA8190817B
+:10198000892F880F890F81958D5AF6018083F70181
+:1019900080818F5F8083E885F98582A5882319F08F
+:1019A0006AE573E002C066E573E0C8010E94D213E5
+:1019B000E981FA819081892F880F890F81958D5A4D
+:1019C000F6018083F70180818F5F808362E573E099
+:1019D000C8010E94D21365E0C4010E94310488232B
+:1019E00051F0E885F98562A56F5FC5010E94F81086
+:1019F000C5010E94E21064E0C4010E94310481111B
+:101A000013C0F3012081822F90E0A0E0B0E0ED81CF
+:101A1000FE814081518162817381481759076A07AD
+:101A20007B07A8F02F3F99F08FEFF30180830885A3
+:101A300019850B5D1F4F60E0C8010E94F50EC801BB
+:101A40000E94CC1081E0E885F985808F0CC066E0AB
+:101A5000C4010E943104882309F443CF8885998505
+:101A60000E94C90B34CF29960FB6F894DEBF0FBE83
+:101A7000CDBFDF91CF911F910F91FF90EF90DF903D
+:101A8000CF90BF90AF909F908F907F906F905F901E
+:101A90004F903F902F90089540E050E00C940A0C36
+:101AA000E0E8F7E72591349181E02130304C09F0EE
+:101AB00080E00895CF93DF93EC010E94500D9E01CA
+:101AC000275A3F4FDE01A059BF4F882309F43CC07D
+:101AD000E6E9F7E78491F9018083E7E9F7E7E49124
+:101AE000EC83E8E9F7E7E491ED83E9E9F7E785912D
+:101AF00094919F838E83EBE9F7E785919491998781
+:101B00008887EDE9F7E7E491EBA7EEE9F7E7E491E1
+:101B1000EAA7EFE9F7E7E491EC93E0EAF7E78591CC
+:101B200094919D8F8C8FE2EAF7E7859194919F8F36
+:101B30008E8FE4EAF7E78591949199A388A3E6EA6A
+:101B4000F7E78591949120C08CE3F90180831C8292
+:101B50002FEF2D8380E293E09F838E8384ED93E0CB
+:101B60009987888781E08BA78AA72C938CEA9DE0D0
+:101B70009D8F8C8F8EED9DE09F8F8E8F84E79EE0F2
+:101B800099A388A38CE39FE09BA38AA3DF91CF91C5
+:101B90000895CF92DF92EF920F93CF93DF93EC01F2
+:101BA000FC01E158FF4F82E38083349741E050E02D
+:101BB00060E070E040835183628373833B978FEFD3
+:101BC0008083CE010E945A0DCE010E943F036FEF29
+:101BD000CE010E9443036E018AE0C80ED11CC601EB
+:101BE0000E94EA03C6010E94FA03CE0148960E94B1
+:101BF000A6033EE0E32E0FE020E14BE06DE0CE01D6
+:101C0000825B9F4F0E944C08A596CE010E94610EF8
+:101C100065E0C6010E943104882351F060E0CE01E6
+:101C2000DF91CF910F91EF90DF90CF900C94F8104F
+:101C300040E066ED73E0CE01DF91CF910F91EF9020
+:101C4000DF90CF900C94000FCF93DF9350E0FA0118
+:101C5000EE0FFF1FE80FF91F37852089E32FF22FC2
+:101C6000E60FF11DE60FF11D25913491FA01EE0FFB
+:101C7000FF1FE80FF91F30A3278FF90165917491B9
+:101C8000FC01D481D69FC02D1124E40FF51FC1A300
+:101C9000F901A591B4916B2F70E0EC2FF0E0DC011D
+:101CA000A40FB51F6E177F0720F4F9012591349119
+:101CB000C32FCD9FC02D11249296CC93DF91CF914D
+:101CC000089521E0FC01248324E020A72DE234E0E4
+:101CD000308B278740E060E00E94240E61E070E0D6
+:101CE00083E00E944612E1EBF0E08081887F816012
+:101CF0008083F89410928000E1E8F0E01082109266
+:101D000085001092840088E191E09093890080938F
+:101D10008800808188608083808181608083EFE695
+:101D2000F0E0808182608083789408950F93FC01B5
+:101D3000862F642F011129C08230D1F048F4882306
+:101D400091F0813011F540E0CF010F910C94240EF9
+:101D50008330A9F08430C9F48481489F602D112418
+:101D6000658F268F12C04B3008F06AE0668B0DC07D
+:101D70008481489F602D1124618F228F06C0848149
+:101D8000489F602D1124638F248F0F910895FC01CB
+:101D900021110EC0648B8481489F402D1124458BF6
+:101DA00015A214A213A281E0878B8093EB03108EFF
+:101DB00008958091EB03882319F08091E80301C016
+:101DC00080E08093B4000895FC0161110DC0178A72
+:101DD000158A14A213A2108E1092E8031092E90340
+:101DE0001092EB030C94D90E0895CF93DF93EC017E
+:101DF000611103C00E94E40E1982DF91CF91089512
+:101E00000F931F93CF93DF93EC018B0141110EC011
+:101E100060E00E94F50E1E870D871B8A1A8A81E0FA
+:101E2000898389E08E8B198E1B8E1D8EDF91CF9159
+:101E30001F910F910895CF93DF93EC01611128C09A
+:101E40008881882329F18981811122C089852F8188
+:101E50009885E22FF92FE80FF11DE80FF11D85910C
+:101E600094918F3F2FEF920711F4188211C09C8735
+:101E70009927880F991FEA85FB85E80FF91F65915F
+:101E8000749140E0CE010E94000F89858F5F8987A1
+:101E9000DF91CF91089560E00C941B0F60E00C94EB
+:101EA000F50E0F93CF93DF93EC0161115DC0898133
+:101EB000882309F459C08D89811156C02D853E852E
+:101EC0008A899B89880F991F820F931FFC01859136
+:101ED00094910097D1F48989882321F01B8A1A8A6A
+:101EE000F90111C01982888160E0882331F0CE01A8
+:101EF0000E941B0F8A899B8925C0CE01DF91CF915B
+:101F00000F910C94E40E85919491BC0176956795A0
+:101F10007695679580FF1DC0AC01A6E05695479564
+:101F2000AA95E1F7292F26952695269520514F71E0
+:101F30006F7000E0CE010E94960E8A899B890196FF
+:101F40009B8B8A8B880F991FED85FE85E80FF91F03
+:101F5000DACF492F6F7320E0CE010E94C70E8A8925
+:101F60009B8901969B8B8A8BDF91CF910F9108956E
+:101F700060E00C94510FCF93DF93EC016111B9C075
+:101F80008F89882309F4B5C08D89811105C0CE01E0
+:101F9000DF91CF910C94E40E81508D8B8DA1811136
+:101FA00038C08BA19CA101969C01220F331FEF8D9D
+:101FB000F8A1E20FF31F25913491422F47704EA3F1
+:101FC000A90163E0569547956A95E1F7BA017695C0
+:101FD0006795232F269526952FA36F732C81629FDB
+:101FE000602D11246DA341704093E7039CA38BA344
+:101FF00029A130E08217930760F08AA1882329F095
+:10200000281B31093CA32BA304C060E0CE010E9431
+:10201000E40E8DA181508DA3288D2F5F288F4C89D0
+:102020003FA1340F8C85380F3A836B8D662361F0A6
+:1020300070E0822F992787FD90950E943F168C8D26
+:10204000869F300D11243A838A8190E0CB966BE312
+:1020500070E00E943F168A833E893B83698D662328
+:1020600071F0772767FD7095822F992787FD9095EE
+:102070000E943F168A8D869F300D11243B836D8D03
+:10208000662391F0822F992787FD909570E00E943A
+:102090003F16CB0162E070E00E943F162E8D9B81BF
+:1020A000289F900D11249B838B814F3339F08A3008
+:1020B0000CF089E087FD80E08B8301C01B82F894DF
+:1020C000EA81F0E0EC51FC4FE491E093EA0398A53B
+:1020D0008D81989F802D11249B81899F802D1124B3
+:1020E0009EA1899F802D11248093E9038093E803AA
+:1020F0007894DF91CF91089560E00C94BB0F6091CC
+:10210000E903662321F18091EC038F5F8093EC0358
+:102110009091EA038917D8F08091EB0391E0892729
+:102120008093EB031092EC038091E703882369F01E
+:1021300090910E0183E4989F802D1124895B8093F8
+:102140000E010E941F169093E8030C94D90E089577
+:102150001F920F920FB60F9211242F933F934F931C
+:102160005F936F937F938F939F93AF93BF93EF93FF
+:10217000FF930E947F10FF91EF91BF91AF919F91CC
+:102180008F917F916F915F914F913F912F910F9020
+:102190000FBE0F901F901895CF93DF93EC0160E076
+:1021A0000E94F50E85E294E09E878D871B8A1A8A2D
+:1021B00081E0898389E08E8B198E1B8E1D8EDF91C5
+:1021C000CF910895CF93DF93EC0160E00E94F50E6C
+:1021D0008FE194E09E878D871B8A1A8A81E089832C
+:1021E00089E08E8B198E1B8E1D8EDF91CF91089505
+:1021F000FC01862F992787FD9095668170E06F5FBF
+:102200007F4F0E943F1685830895CF93CFB7F894F0
+:102210008091ED03811127C0EBE6F4E08491E7E5BE
+:10222000F4E09491E82FF0E0EE0FFF1FE757FB4F2B
+:10223000A591B4918C91892321F461E08AE00E94F8
+:10224000071361E08AE00E94CE128CB580618CBDDC
+:102250008CB580648CBD61E08DE00E94CE1261E09F
+:102260008BE00E94CE128091ED038F5F8093ED038F
+:10227000CFBFCF9108951F920F920FB60F921124E6
+:102280002F933F938F939F93AF93BF938091EF03CF
+:102290009091F003A091F103B091F2033091EE031D
+:1022A00023E0230F2D3720F40196A11DB11D05C099
+:1022B00026E8230F0296A11DB11D2093EE03809303
+:1022C000EF039093F003A093F103B093F203809196
+:1022D000F3039091F403A091F503B091F6030196F6
+:1022E000A11DB11D8093F3039093F403A093F50314
+:1022F000B093F603BF91AF919F918F913F912F9132
+:102300000F900FBE0F901F9018952FB7F894609103
+:10231000EF037091F0038091F1039091F2032FBFCE
+:1023200008953FB7F8948091F3039091F403A0913E
+:10233000F503B091F60326B5A89B05C02F3F19F011
+:102340000196A11DB11D3FBF6627782F892F9A2FB7
+:10235000620F711D811D911D42E0660F771F881F5E
+:10236000991F4A95D1F708958F929F92AF92BF928D
+:10237000CF92DF92EF92FF926B017C010E9491114C
+:102380004B015C01C114D104E104F104F1F00E949D
+:10239000F1140E949111681979098A099B09683E14
+:1023A00073408105910570F321E0C21AD108E1085C
+:1023B000F10888EE880E83E0981EA11CB11CC114A0
+:1023C000D104E104F10429F7DDCFFF90EF90DF9015
+:1023D000CF90BF90AF909F908F900895789484B5E0
+:1023E000826084BD84B5816084BD85B5826085BD11
+:1023F00085B5816085BDEEE6F0E0808181608083F7
+:10240000E1E8F0E0108280818260808380818160D9
+:102410008083E0E8F0E0808181608083E1EBF0E0A0
+:10242000808184608083E0EBF0E080818160808344
+:10243000EAE7F0E08081846080838081826080832D
+:102440008081816080838081806880831092C10058
+:1024500008958E3008F08E50877020910F0190E41F
+:10246000299F90011124822B80937C0080917A0017
+:10247000806480937A0080917A0086FDFCCF809101
+:1024800078002091790090E0922B08951F93CF93CC
+:10249000DF93182FEB0161E00E94CE12209711F418
+:1024A00060E004C0CF3FD10539F461E0812FDF91B6
+:1024B000CF911F910C940713E12FF0E0E75CFB4FE5
+:1024C000E491E330F9F048F4E130B9F0E230A1F5FD
+:1024D00084B5806284BDC8BD34C0E730E9F0E8301F
+:1024E00019F1E43049F5809180008062809380008A
+:1024F000D0938B00C0938A0024C084B5806884BDCB
+:10250000C7BD1FC080918000806880938000D093F9
+:102510008900C093880015C08091B00080688093C6
+:10252000B000C093B3000DC08091B0008062809372
+:10253000B000C093B40005C0C038D1050CF0B5CFD1
+:10254000AFCFDF91CF911F910895833081F028F4B0
+:10255000813099F08230A1F008958730A9F0883059
+:10256000B9F08430D1F4809180008F7D03C08091D8
+:1025700080008F7780938000089584B58F7702C0A4
+:1025800084B58F7D84BD08958091B0008F7703C09E
+:102590008091B0008F7D8093B0000895CF93DF933A
+:1025A00090E0FC01E35BFB4F2491FC01EF59FB4FF2
+:1025B0008491882349F190E0880F991FFC01E75727
+:1025C000FB4FA591B49181589B4FFC01C591D491CB
+:1025D0009FB7611108C0F8948C91209582238C9349
+:1025E000888182230AC0623051F4F8948C91322F92
+:1025F000309583238C938881822B888304C0F89440
+:102600008C91822B8C939FBFDF91CF9108950F9374
+:102610001F93CF93DF931F92CDB7DEB7282F30E003
+:10262000F901E75CFB4F8491F901E35BFB4F1491E7
+:10263000F901EF59FB4F04910023C9F0882321F0E1
+:1026400069830E94A5126981E02FF0E0EE0FFF1F61
+:10265000E158FB4FA591B4919FB7F8948C9161110B
+:1026600003C01095812301C0812B8C939FBF0F90D5
+:10267000DF91CF911F910F910895CF93DF93282F72
+:1026800030E0F901E75CFB4F8491F901E35BFB4F1C
+:10269000D491F901EF59FB4FC491CC2391F08111F2
+:1026A0000E94A512EC2FF0E0EE0FFF1FEB58FB4F3E
+:1026B000A591B4912C912D2381E090E021F480E04C
+:1026C00002C080E090E0DF91CF910895CF92DF9239
+:1026D000EF92FF920F931F93CF93DF937C016A01D8
+:1026E000EB0100E010E00C151D0571F06991D701B8
+:1026F000ED91FC910190F081E02DC7010995892BA6
+:1027000019F00F5F1F4FEFCFC801DF91CF911F91DD
+:102710000F91FF90EF90DF90CF90089561157105B4
+:1027200081F0DB010D900020E9F7AD014150510926
+:10273000461B570BDC01ED91FC910280F381E02DEB
+:10274000099480E090E00895EF92FF920F931F9319
+:10275000CF93DF938C017B01C0E0D0E0F701EC0F59
+:10276000FD1F6491662359F0F801A081B181ED91BC
+:10277000FC91C8010995892B11F02196EFCFCE016C
+:10278000DF91CF911F910F91FF90EF900895DC01A1
+:10279000ED91FC910190F081E02D09946FE171E0E1
+:1027A0000C948E130F931F93CF93DF93EC010E9431
+:1027B000A4138C01CE010E94CE13800F911FDF91D4
+:1027C000CF911F910F9108958F929F92AF92BF92D8
+:1027D000DF92EF92FF920F931F93CF93DF93CDB7CA
+:1027E000DEB7A1970FB6F894DEBF0FBECDBF7C0158
+:1027F000F42FD52ECB0119A2223008F42AE08E0145
+:102800000F5D1F4F822E912CA12CB12C6F2F7D2D8F
+:10281000A50194010E945316F22FD32ECA01015034
+:1028200011096A3014F4E0E301C0E7E3E60FD801D0
+:10283000EC93232B242B252B49F7B801C7010E94C9
+:102840008E13A1960FB6F894DEBF0FBECDBFDF91F9
+:10285000CF911F910F91FF90EF90DF90BF90AF90BD
+:102860009F908F900895CF92DF92EF92FF920F93F7
+:102870001F93CF93DF93EC016A017B012115310592
+:1028800079F4E881F9810190F081E02D642FDF91E6
+:10289000CF911F910F91FF90EF90DF90CF9009940F
+:1028A0002A303105E9F477FF1AC06DE20E94C713A0
+:1028B0008C0144275527BA014C195D096E097F091F
+:1028C0002AE0CE010E94E413800F911FDF91CF9187
+:1028D0001F910F91FF90EF90DF90CF9008952AE025
+:1028E000B701A601CE01DF91CF911F910F91FF900B
+:1028F000EF90DF90CF900C94E4139A01AB01662720
+:1029000057FD6095762F0C9433142115310541F451
+:10291000DC01ED91FC910190F081E02D642F099490
+:102920000C94E4139A01AB0160E070E00C94851400
+:102930004F925F926F927F92AF92BF92CF92DF924F
+:10294000EF92FF920F931F93CF93DF93CDB7DEB734
+:1029500029013A01621B730B840B950B29893A8973
+:102960004B895C892A193B094C095D09298B3A8BF3
+:102970004B8B5C8B9B01AC0169897A898B899C8923
+:102980000E940F16E418F50806091709A801970117
+:102990000E9475162A0D3B1D4C1D5D1DCA01B90113
+:1029A000DF91CF911F910F91FF90EF90DF90CF902B
+:1029B000BF90AF907F906F905F904F900895089573
+:1029C0000E94EE110E94DF140E949502C0E0D0E048
+:1029D0000E94A8022097E1F30E940000F9CF0C9416
+:1029E000B416089598D088F09F5790F0B92F992782
+:1029F000B751A0F0D1F0660F771F881F991F1AF00A
+:102A0000BA95C9F712C0B13081F09FD0B1E00895F6
+:102A10009CC0672F782F8827B85F39F0B93FCCF377
+:102A2000869577956795B395D9F73EF490958095FF
+:102A3000709561957F4F8F4F9F4F0895E89409C01F
+:102A400097FB3EF490958095709561957F4F8F4FE1
+:102A50009F4F9923A9F0F92F96E9BB279395F695F7
+:102A6000879577956795B795F111F8CFFAF4BB0F75
+:102A700011F460FF1BC06F5F7F4F8F4F9F4F16C0D9
+:102A8000882311F096E911C0772321F09EE8872F63
+:102A9000762F05C0662371F096E8862F70E060E01F
+:102AA0002AF09A95660F771F881FDAF7880F969598
+:102AB000879597F9089597F99F6780E870E060E03F
+:102AC00008959FEF80EC089500240A9416161706C7
+:102AD00018060906089500240A941216130614060F
+:102AE00005060895092E0394000C11F4882352F072
+:102AF000BB0F40F4BF2B11F460FF04C06F5F7F4F2A
+:102B00008F4F9F4F089557FD9058440F551F59F010
+:102B10005F3F71F04795880F97FB991F61F09F3FCA
+:102B200079F087950895121613061406551FF2CFF3
+:102B30004695F1DF08C0161617061806991FF1CF43
+:102B400086957105610508940895E894BB2766276A
+:102B50007727CB0197F908950BD0C4CFB5DF28F0C4
+:102B6000BADF18F0952309F0A6CFABCF1124EECF32
+:102B7000CADFA0F3959FD1F3950F50E0551F629FD8
+:102B8000F001729FBB27F00DB11D639FAA27F00DC6
+:102B9000B11DAA1F649F6627B00DA11D661F829FED
+:102BA0002227B00DA11D621F739FB00DA11D621FD2
+:102BB000839FA00D611D221F749F3327A00D611DEF
+:102BC000231F849F600D211D822F762F6A2F1124D1
+:102BD0009F5750408AF0E1F088234AF0EE0FFF1F24
+:102BE000BB1F661F771F881F91505040A9F79E3F5B
+:102BF000510570F060CFAACF5F3FECF3983EDCF355
+:102C0000869577956795B795F795E7959F5FC1F797
+:102C1000FE2B880F911D9695879597F90895DB01F6
+:102C20008F939F930E949416BF91AF91A29F800DA6
+:102C3000911DA39F900DB29F900D11240895991B93
+:102C400079E004C0991F961708F0961B881F7A95A3
+:102C5000C9F780950895AA1BBB1B51E107C0AA1FA5
+:102C6000BB1FA617B70710F0A61BB70B881F991F2D
+:102C70005A95A9F780959095BC01CD01089597FBD1
+:102C8000072E16F4009407D077FD09D00E942B166A
+:102C900007FC05D03EF4909581959F4F089570955F
+:102CA00061957F4F0895A1E21A2EAA1BBB1BFD015F
+:102CB0000DC0AA1FBB1FEE1FFF1FA217B307E4071B
+:102CC000F50720F0A21BB30BE40BF50B661F771F73
+:102CD000881F991F1A9469F7609570958095909553
+:102CE0009B01AC01BD01CF010895052E97FB1EF499
+:102CF00000940E948C1657FD07D00E94531607FCC3
+:102D000003D04EF40C948C16509540953095219537
+:102D10003F4F4F4F5F4F0895909580957095619507
+:102D20007F4F8F4F9F4F08950E94A516A59F900D2E
+:102D3000B49F900DA49F800D911D11240895EE0F56
+:102D4000FF1F0590F491E02D0994A29FB001B39F5D
+:102D5000C001A39F700D811D1124911DB29F700DA4
+:102D6000811D1124911D0895CF93DF938230910529
+:102D700010F482E090E0E091F903F091FA0320E092
+:102D800030E0A0E0B0E0309739F140815181481740
+:102D90005907B8F04817590771F482819381109749
+:102DA00029F013969C938E9312972CC09093FA035C
+:102DB0008093F90327C02115310531F042175307DD
+:102DC00018F0A901DB0101C0EF019A01BD01DF018B
+:102DD0000280F381E02DD7CF21153105F9F0281BB2
+:102DE000390B2430310580F48A819B81611571058E
+:102DF00021F0FB019383828304C09093FA038093B4
+:102E0000F903FE01329644C0FE01E20FF31F8193E5
+:102E1000919322503109398328833AC02091F703D6
+:102E20003091F803232B41F42091020130910301EA
+:102E30003093F8032093F7032091000130910101B2
+:102E40002115310541F42DB73EB740910401509151
+:102E50000501241B350BE091F703F091F803E2170D
+:102E6000F307A0F42E1B3F0B2817390778F0AC01AD
+:102E70004E5F5F4F2417350748F04E0F5F1F50938A
+:102E8000F8034093F7038193919302C0E0E0F0E0F0
+:102E9000CF01DF91CF910895CF93DF93009709F48D
+:102EA00087C0FC01329713821282C091F903D0913E
+:102EB000FA03209781F420813181280F391F8091F6
+:102EC000F7039091F8038217930779F5F093F803CD
+:102ED000E093F7036DC0DE0120E030E0AE17BF07DE
+:102EE00050F412964D915C9113979D014115510537
+:102EF00009F1DA01F3CFB383A28340815181840FBA
+:102F0000951F8A179B0771F48D919C911197840FDF
+:102F1000951F02969183808312968D919C911397B1
+:102F2000938382832115310529F4F093FA03E0930A
+:102F3000F9033EC0D9011396FC93EE9312974D917D
+:102F40005D91A40FB51FEA17FB0779F48081918189
+:102F5000840F951F0296D90111969C938E938281BE
+:102F6000938113969C938E931297E0E0F0E08A8110
+:102F70009B81009719F0FE01EC01F9CFCE0102967A
+:102F800028813981820F931F2091F7033091F80334
+:102F90002817390769F4309729F41092FA03109230
+:102FA000F90302C013821282D093F803C093F7038F
+:102FB000DF91CF9108958F929F92AF92BF92CF925F
+:102FC000DF92EF92FF92CF93DF93EC0168817981DA
+:102FD0008A819B81611571058105910521F464E267
+:102FE00079ED8BE597E02DE133EF41E050E00E9471
+:102FF000751649015A019B01AC01A7EAB1E40E9490
+:1030000094166B017C01ACEEB4EFA50194010E9413
+:103010003C18C60ED71EE81EF91EF7FE06C081E05A
+:10302000C81AD108E10880E8F80AC882D982EA8281
+:10303000FB82C6019F77DF91CF91FF90EF90DF90E9
+:10304000CF90BF90AF909F908F9008950E94DB1714
+:10305000089586E091E00E94DB170895A0E0B0E0BB
+:103060008093060190930701A0930801B093090192
+:103070000895B7FF0C9494160E949416821B930B2C
+:063080000895F894FFCF53
+:103086000000FB03800001000000010000000101B8
+:1030960000000000B60966134C4F41444552000D2E
+:1030A6000A006E616E00696E66006F7666002E001D
+:00000001FF
diff --git a/Sprites/Soldiers.bmp b/Sprites/Soldiers.bmp
new file mode 100644
index 0000000..7bce8a5
--- /dev/null
+++ b/Sprites/Soldiers.bmp
Binary files differ
diff --git a/Sprites/Tower.bmp b/Sprites/Tower.bmp
new file mode 100644
index 0000000..1838724
--- /dev/null
+++ b/Sprites/Tower.bmp
Binary files differ
diff --git a/System.c b/System.c
new file mode 100644
index 0000000..09e086a
--- /dev/null
+++ b/System.c
@@ -0,0 +1,278 @@
+/* *************************************
+ * Includes
+ * *************************************/
+
+#include "System.h"
+
+/* *************************************
+ * Defines
+ * *************************************/
+
+#define SYSTEM_MAX_TIMERS 8
+#define check_bb_collision(x1,y1,w1,h1,x2,y2,w2,h2) (!( ((x1)>=(x2)+(w2)) || ((x2)>=(x1)+(w1)) || \
+ ((y1)>=(y2)+(h2)) || ((y2)>=(y1)+(h1)) ))
+
+/* *************************************
+ * Local Prototypes
+ * *************************************/
+
+//static void SystemCheckTimer(bool * timer, uint64_t * last_timer, uint8_t step);
+
+/* *************************************
+ * Local Variables
+ * *************************************/
+
+//Global timer (called by interrupt)
+static volatile uint64_t global_timer;
+//Tells whether rand seed has been set
+static bool rand_seed;
+//Timers
+static bool one_second_timer;
+static bool hundred_ms_timer;
+//Critical section is entered
+static bool system_busy;
+//Timer array
+static TYPE_TIMER timer_array[SYSTEM_MAX_TIMERS];
+
+/* *************************************
+ * @name: void SystemInit(void)
+ * @date: 19/05/2016
+ * @author: Xavier Del Campo
+ * @brief:
+ * *************************************/
+
+void SystemInit(void)
+{
+ //Reset global timer
+ global_timer = 0;
+ //Reset 1 second timer
+ one_second_timer = 0;
+ //Reset all user-handled timers
+ SystemResetTimers();
+ //Initial value for system_busy
+ system_busy = false;
+
+ #if defined(USBCON)
+ USBDevice.attach();
+ #endif
+}
+
+void SystemSetRandSeed(void)
+{
+ if(rand_seed == false)
+ {
+ rand_seed = true;
+ //Set random seed using global timer as reference
+ srand((unsigned int)global_timer);
+ }
+}
+
+bool SystemIsRandSeedSet(void)
+{
+ return rand_seed;
+}
+
+void SystemIncreaseGlobalTimer(void)
+{
+ global_timer++;
+}
+
+uint64_t SystemGetGlobalTimer(void)
+{
+ return global_timer;
+}
+
+bool System1SecondTick(void)
+{
+ return one_second_timer;
+}
+
+bool System100msTick(void)
+{
+ return hundred_ms_timer;
+}
+
+void SystemRunTimers(void)
+{
+/* static uint64_t last_one_second_tick;
+ static uint64_t last_100_ms_tick;
+
+ SystemCheckTimer(&one_second_timer, &last_one_second_tick, REFRESH_FREQUENCY);
+ SystemCheckTimer(&hundred_ms_timer, &last_100_ms_tick, 2);
+ * */
+}
+
+void SystemCheckTimer(bool * timer, uint64_t * last_timer, uint8_t step)
+{
+ if(*timer == true)
+ {
+ *timer = false;
+ *last_timer = global_timer;
+ }
+
+ if(global_timer >= (*last_timer + step) )
+ {
+ *timer = true;
+ }
+}
+
+void SystemWaitCycles(uint32_t cycles)
+{
+ uint64_t currentTime = global_timer;
+
+ while(global_timer < (currentTime + cycles) );
+}
+
+uint32_t SystemRand(uint32_t min, uint32_t max)
+{
+ return rand() % (max - min + 1) + min;
+}
+
+bool SystemIsBusy(void)
+{
+ return system_busy;
+}
+
+bool SystemContains_u8(uint8_t value, uint8_t * buffer, size_t sz)
+{
+ size_t i = 0;
+
+ for(i = 0; i < sz; i++)
+ {
+ if(buffer[i] == value)
+ {
+ return true;
+ }
+ }
+
+ return false;
+}
+
+bool SystemContains_u16(uint16_t value, uint16_t * buffer, size_t sz)
+{
+ size_t i = 0;
+
+ for(i = 0; i < sz; i++)
+ {
+ if(buffer[i] == value)
+ {
+ return true;
+ }
+ }
+
+ return false;
+}
+
+TYPE_TIMER * SystemCreateTimer(uint32_t seconds, bool rf, void (*timer_callback)(void) )
+{
+ bool success = false;
+ uint8_t i;
+
+ if(seconds == 0)
+ {
+ return NULL;
+ }
+
+ for(i = 0; i < SYSTEM_MAX_TIMERS; i++)
+ {
+ if(timer_array[i].busy == false)
+ {
+ timer_array[i].Timeout_Callback = timer_callback;
+ timer_array[i].time = seconds;
+ timer_array[i].orig_time = seconds;
+ timer_array[i].repeat_flag = rf;
+ timer_array[i].busy = true;
+ success = true;
+ break;
+ }
+ }
+
+ if(success == false)
+ {
+ return NULL;
+ }
+
+ return &timer_array[i];
+}
+
+void SystemResetTimers(void)
+{
+ uint8_t i;
+
+ for(i = 0; i < SYSTEM_MAX_TIMERS; i++)
+ {
+ timer_array[i].Timeout_Callback = NULL;
+ timer_array[i].busy = false;
+ timer_array[i].repeat_flag = false;
+ timer_array[i].time = 0;
+ timer_array[i].orig_time = 0;
+ }
+}
+
+void SystemUserTimersHandler(void)
+{
+ uint8_t i;
+
+ for(i = 0; i < SYSTEM_MAX_TIMERS; i++)
+ {
+ if(timer_array[i].busy == true)
+ {
+ if(System1SecondTick() == true)
+ {
+ timer_array[i].time--;
+
+ if(timer_array[i].time == 0)
+ {
+ timer_array[i].Timeout_Callback();
+
+ if(timer_array[i].repeat_flag == true)
+ {
+ timer_array[i].time = timer_array[i].orig_time;
+ }
+ else
+ {
+ // Clean timer data
+ timer_array[i].busy = false;
+ timer_array[i].orig_time = 0;
+ timer_array[i].Timeout_Callback = NULL;
+ }
+ }
+ }
+ }
+ }
+}
+
+void SystemTimerRestart(TYPE_TIMER * timer)
+{
+ timer->time = timer->orig_time;
+}
+
+void SystemTimerRemove(TYPE_TIMER * timer)
+{
+ timer->time = 0;
+ timer->orig_time = 0;
+ timer->Timeout_Callback = NULL;
+ timer->busy = false;
+ timer->repeat_flag = false;
+}
+
+bool SystemArrayCompare(unsigned short * arr1, unsigned short * arr2, size_t sz)
+{
+ size_t i;
+
+ for(i = 0; i < sz; i++)
+ {
+ if(arr1[i] != arr2[i])
+ {
+ return false;
+ }
+ }
+
+ return true;
+}
+
+bool SystemCollisionCheck(TYPE_COLLISION_BLOCK c1, TYPE_COLLISION_BLOCK c2)
+{
+ return (bool)check_bb_collision( c1.x, c1.y, c1.w, c1.h,
+ c2.x, c2.y, c2.w, c2.h );
+}
diff --git a/System.h b/System.h
new file mode 100644
index 0000000..ec86a2b
--- /dev/null
+++ b/System.h
@@ -0,0 +1,90 @@
+#ifndef __SYSTEM_HEADER__
+#define __SYSTEM_HEADER__
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+/* **************************************
+ * Includes *
+ * **************************************/
+
+#include "Global_Inc.h"
+#include "GameStructures.h"
+
+/* **************************************
+ * Defines *
+ * **************************************/
+
+#define TIMEBASE_1_SECOND 1
+#define TIMEBASE_1_MINUTE TIMEBASE_1_SECOND * 60
+
+/* **************************************
+ * Structs and enums *
+ * **************************************/
+
+typedef struct t_Timer
+{
+ uint32_t time;
+ uint32_t orig_time;
+ bool repeat_flag;
+ bool busy;
+ void (*Timeout_Callback)(void);
+}TYPE_TIMER;
+
+/* **************************************
+ * Global Prototypes *
+ * **************************************/
+
+// Calls init routines
+void SystemInit(void);
+// Calls srand() using current global_timer value as seed
+void SystemSetRandSeed(void);
+// Tells whether srand() has been called using a pseudo-random value
+bool SystemIsRandSeedSet(void);
+// Stops program flow during X cycles
+void SystemWaitCycles(uint32_t cycles);
+// To be called from GfxDrawScene after each cycle
+void SystemRunTimers(void);
+// 1 cycle-length flag with a frequency of 1 Hz
+bool System1SecondTick(void);
+// 1 cycle-length flag with a frequency of 10 Hz
+bool System100msTick(void);
+// Returns random value between given minimum and maximum values
+uint32_t SystemRand(uint32_t min, uint32_t max);
+// Increases global timer by 1 step
+void SystemIncreaseGlobalTimer(void);
+// (Experimental)
+uint64_t SystemGetGlobalTimer(void);
+// Returns whether critical section of code is being entered
+bool SystemIsBusy(void);
+// Returns whether indicated value is contained inside buffer
+bool SystemContains_u8(uint8_t value, uint8_t * buffer, size_t sz);
+// Overload for uint16_t
+bool SystemContains_u16(uint16_t value, uint16_t * buffer, size_t sz);
+// Creates a timer instance wiht a determined value and associates it to a callback
+// Once time expires, callback is automatically called right after GfxDrawScene().
+TYPE_TIMER * SystemCreateTimer(uint32_t seconds, bool rf, void (*timer_callback)(void) );
+// Reportedly, sets all timer data to zero.
+void SystemResetTimers(void);
+// To be called every cycle (i.e.: inside GfxDrawScene() ).
+void SystemUserTimersHandler(void);
+// Sets timer remaining time to initial value.
+void SystemTimerRestart(TYPE_TIMER * timer);
+// Flushes a timer pointed to by timer.
+void SystemTimerRemove(TYPE_TIMER * timer);
+// Compares two arrays of unsigned short type.
+bool SystemArrayCompare(unsigned short * arr1, unsigned short * arr2, size_t sz);
+// Checks collision of two objects
+bool SystemCollisionCheck(TYPE_COLLISION_BLOCK c1, TYPE_COLLISION_BLOCK c2);
+
+/* **************************************
+ * Global Variables *
+ * **************************************/
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif //__SYSTEM_HEADER__
diff --git a/Unit.cpp b/Unit.cpp
new file mode 100644
index 0000000..8e6555e
--- /dev/null
+++ b/Unit.cpp
@@ -0,0 +1,81 @@
+/* **************************************
+ * Includes *
+ * **************************************/
+
+#include "Unit.h"
+#include "PeasantSpr.c"
+
+/* **************************************
+ * Defines *
+ * **************************************/
+
+/* **************************************
+ * Local variables *
+ * **************************************/
+
+/* Sprites */
+static TYPE_SPRITE PeasantSpr;
+static TYPE_SPRITE PeasantShadowSpr;
+
+/* Tables */
+static uint8_t UnitHPTable[] = { 25 };
+static TYPE_SPRITE * UnitSprTable[] = {&PeasantSpr};
+static TYPE_SPRITE * UnitShadowSprTable[] = {&PeasantShadowSpr};
+
+void UnitInit(void)
+{
+ PeasantSpr.Data = PeasantSpr_Data;
+ PeasantSpr.w = GfxGetWidthFromSpriteData(PeasantSpr_Data);
+ PeasantSpr.h = GfxGetHeightFromSpriteData(PeasantSpr_Data);
+ PeasantSpr.flip = 0;
+ PeasantSpr.rotation = 0;
+ PeasantSpr.color = GFX_BLACK;
+
+ PeasantShadowSpr.Data = PeasantShadowSpr_Data;
+ PeasantShadowSpr.w = GfxGetWidthFromSpriteData(PeasantShadowSpr_Data);
+ PeasantShadowSpr.h = GfxGetHeightFromSpriteData(PeasantShadowSpr_Data);
+ PeasantShadowSpr.flip = 0;
+ PeasantShadowSpr.rotation = 0;
+ PeasantShadowSpr.color = GFX_GRAY;
+
+}
+
+uint8_t UnitGetHpFromID(uint8_t id)
+{
+ return UnitHPTable[id];
+}
+
+void UnitDraw(TYPE_CAMERA * ptrCamera, TYPE_UNIT * ptrUnit)
+{
+ uint8_t id = ptrUnit->id;
+
+ if(ptrUnit->built == false)
+ {
+ return;
+ }
+
+ CameraApplyCoordinatesToSprite( ptrCamera,
+ UnitShadowSprTable[id],
+ ptrUnit->x - 6,
+ ptrUnit->y );
+ GfxDrawSprite(UnitShadowSprTable[id]);
+
+ CameraApplyCoordinatesToSprite( ptrCamera,
+ UnitSprTable[id],
+ ptrUnit->x,
+ ptrUnit->y );
+
+ GfxDrawSprite(&PeasantSpr);
+
+}
+
+uint8_t UnitGetWidthFromID(uint8_t id)
+{
+ return GfxGetWidthFromSpriteData(UnitSprTable[id]->Data);
+}
+
+uint8_t UnitGetHeightFromID(uint8_t id)
+{
+ return GfxGetHeightFromSpriteData(UnitSprTable[id]->Data);
+}
+
diff --git a/main.cpp b/main.cpp
new file mode 100644
index 0000000..fbeede5
--- /dev/null
+++ b/main.cpp
@@ -0,0 +1,33 @@
+/* **************************************
+ * Includes *
+ * **************************************/
+
+#include "Global_Inc.h"
+#include "Gameplay.h"
+
+/* **************************************
+ * Global variables *
+ * **************************************/
+
+Gamebuino gb;
+
+int main(){
+
+ init();
+
+ SystemInit();
+
+ gb.begin();
+
+ /* MAIN LOOP */
+ while(1)
+ {
+ gb.titleScreen(F("Pocket Empires"));
+
+ MainMenu();
+ }
+
+
+ return 0;
+
+}