diff options
| author | XaviDCR92 <xavi.dcr@gmail.com> | 2017-03-07 20:57:09 +0100 |
|---|---|---|
| committer | XaviDCR92 <xavi.dcr@gmail.com> | 2017-03-07 20:57:09 +0100 |
| commit | 8ec41b4410aba535008daf991ea59a8740951d44 (patch) | |
| tree | 01ee0846f579d9d139ee46a6a43f67ba522c7196 | |
| download | pocketempires-8ec41b4410aba535008daf991ea59a8740951d44.tar.gz | |
+ Initial commit. Added source, sprites and final executable.
| -rw-r--r-- | BarracksSpr.c | 58 | ||||
| -rw-r--r-- | Building.c | 81 | ||||
| -rw-r--r-- | Building.h | 46 | ||||
| -rw-r--r-- | Camera.c | 150 | ||||
| -rw-r--r-- | Camera.h | 41 | ||||
| -rw-r--r-- | Exe/POCKET.HEX | 1100 | ||||
| -rw-r--r-- | Exe/POCKET.elf | bin | 0 -> 95400 bytes | |||
| -rw-r--r-- | GameStructures.h | 62 | ||||
| -rw-r--r-- | Gameplay.cpp | 147 | ||||
| -rw-r--r-- | Gameplay.h | 32 | ||||
| -rw-r--r-- | Gfx.cpp | 191 | ||||
| -rw-r--r-- | Gfx.h | 68 | ||||
| -rw-r--r-- | Global_Inc.h | 46 | ||||
| -rw-r--r-- | Makefile | 43 | ||||
| -rw-r--r-- | Menu.cpp | 54 | ||||
| -rw-r--r-- | Menu.h | 18 | ||||
| -rw-r--r-- | Pad.cpp | 43 | ||||
| -rw-r--r-- | Pad.h | 49 | ||||
| -rw-r--r-- | PeasantSpr.c | 27 | ||||
| -rw-r--r-- | Player.cpp | 192 | ||||
| -rw-r--r-- | Player.h | 59 | ||||
| -rw-r--r-- | PocketEmpires/PocketEmpires.atsln | 8 | ||||
| -rw-r--r-- | PocketEmpires/PocketEmpires.atsuo | bin | 0 -> 27648 bytes | |||
| -rw-r--r-- | Sprites/Barracks.bmp | bin | 0 -> 1782 bytes | |||
| -rw-r--r-- | Sprites/BarracksShadow.bmp | bin | 0 -> 1782 bytes | |||
| -rw-r--r-- | Sprites/Mouse.bmp | bin | 0 -> 246 bytes | |||
| -rw-r--r-- | Sprites/Peasant_Left1.bmp | bin | 0 -> 438 bytes | |||
| -rw-r--r-- | Sprites/Peasant_Left2.bmp | bin | 0 -> 438 bytes | |||
| -rw-r--r-- | Sprites/Peasant_Left3.bmp | bin | 0 -> 438 bytes | |||
| -rw-r--r-- | Sprites/Peasant_LeftRight.bmp | bin | 0 -> 246 bytes | |||
| -rw-r--r-- | Sprites/Peasant_UpDown.bmp | bin | 0 -> 198 bytes | |||
| -rw-r--r-- | Sprites/Peasant_Walking_UpDown.bmp | bin | 0 -> 246 bytes | |||
| -rw-r--r-- | Sprites/PocketEmpires.ino | 284 | ||||
| -rw-r--r-- | Sprites/PocketEmpires.ino.hex | 781 | ||||
| -rw-r--r-- | Sprites/Soldiers.bmp | bin | 0 -> 7734 bytes | |||
| -rw-r--r-- | Sprites/Tower.bmp | bin | 0 -> 1590 bytes | |||
| -rw-r--r-- | System.c | 278 | ||||
| -rw-r--r-- | System.h | 90 | ||||
| -rw-r--r-- | Unit.cpp | 81 | ||||
| -rw-r--r-- | main.cpp | 33 |
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 Binary files differnew file mode 100644 index 0000000..83128eb --- /dev/null +++ b/Exe/POCKET.elf 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__ @@ -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); +} @@ -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; + } + +} @@ -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__ @@ -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) ); +} @@ -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 Binary files differnew file mode 100644 index 0000000..080e58d --- /dev/null +++ b/PocketEmpires/PocketEmpires.atsuo diff --git a/Sprites/Barracks.bmp b/Sprites/Barracks.bmp Binary files differnew file mode 100644 index 0000000..65d6b50 --- /dev/null +++ b/Sprites/Barracks.bmp diff --git a/Sprites/BarracksShadow.bmp b/Sprites/BarracksShadow.bmp Binary files differnew file mode 100644 index 0000000..c24383a --- /dev/null +++ b/Sprites/BarracksShadow.bmp diff --git a/Sprites/Mouse.bmp b/Sprites/Mouse.bmp Binary files differnew file mode 100644 index 0000000..49e7e14 --- /dev/null +++ b/Sprites/Mouse.bmp diff --git a/Sprites/Peasant_Left1.bmp b/Sprites/Peasant_Left1.bmp Binary files differnew file mode 100644 index 0000000..e8c82fe --- /dev/null +++ b/Sprites/Peasant_Left1.bmp diff --git a/Sprites/Peasant_Left2.bmp b/Sprites/Peasant_Left2.bmp Binary files differnew file mode 100644 index 0000000..a92ef3f --- /dev/null +++ b/Sprites/Peasant_Left2.bmp diff --git a/Sprites/Peasant_Left3.bmp b/Sprites/Peasant_Left3.bmp Binary files differnew file mode 100644 index 0000000..d6f8e21 --- /dev/null +++ b/Sprites/Peasant_Left3.bmp diff --git a/Sprites/Peasant_LeftRight.bmp b/Sprites/Peasant_LeftRight.bmp Binary files differnew file mode 100644 index 0000000..b31b973 --- /dev/null +++ b/Sprites/Peasant_LeftRight.bmp diff --git a/Sprites/Peasant_UpDown.bmp b/Sprites/Peasant_UpDown.bmp Binary files differnew file mode 100644 index 0000000..81a678e --- /dev/null +++ b/Sprites/Peasant_UpDown.bmp diff --git a/Sprites/Peasant_Walking_UpDown.bmp b/Sprites/Peasant_Walking_UpDown.bmp Binary files differnew file mode 100644 index 0000000..9ed48db --- /dev/null +++ b/Sprites/Peasant_Walking_UpDown.bmp 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 Binary files differnew file mode 100644 index 0000000..7bce8a5 --- /dev/null +++ b/Sprites/Soldiers.bmp diff --git a/Sprites/Tower.bmp b/Sprites/Tower.bmp Binary files differnew file mode 100644 index 0000000..1838724 --- /dev/null +++ b/Sprites/Tower.bmp 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; + +} |
