+ Initial commit. Added source, sprites and final executable.

This commit is contained in:
XaviDCR92 2017-03-07 20:57:09 +01:00
commit 8ec41b4410
40 changed files with 4062 additions and 0 deletions

58
BarracksSpr.c Normal file
View File

@ -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,
};

81
Building.c Normal file
View File

@ -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);
}

46
Building.h Normal file
View File

@ -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__

150
Camera.c Normal file
View File

@ -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;
}

41
Camera.h Normal file
View File

@ -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__

1100
Exe/POCKET.HEX Normal file

File diff suppressed because it is too large Load Diff

BIN
Exe/POCKET.elf Normal file

Binary file not shown.

62
GameStructures.h Normal file
View File

@ -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__

147
Gameplay.cpp Normal file
View File

@ -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();
}
}

32
Gameplay.h Normal file
View File

@ -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__

191
Gfx.cpp Normal file
View File

@ -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);
}

68
Gfx.h Normal file
View File

@ -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__

46
Global_Inc.h Normal file
View File

@ -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__

43
Makefile Normal file
View File

@ -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/

54
Menu.cpp Normal file
View File

@ -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;
}
}

18
Menu.h Normal file
View File

@ -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__

43
Pad.cpp Normal file
View File

@ -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) );
}

49
Pad.h Normal file
View File

@ -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__

27
PeasantSpr.c Normal file
View File

@ -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,
};

192
Player.cpp Normal file
View File

@ -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);
}

59
Player.h Normal file
View File

@ -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__

View File

@ -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

Binary file not shown.

BIN
Sprites/Barracks.bmp Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

BIN
Sprites/BarracksShadow.bmp Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

BIN
Sprites/Mouse.bmp Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 246 B

BIN
Sprites/Peasant_Left1.bmp Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 438 B

BIN
Sprites/Peasant_Left2.bmp Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 438 B

BIN
Sprites/Peasant_Left3.bmp Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 438 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 246 B

BIN
Sprites/Peasant_UpDown.bmp Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 198 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 246 B

284
Sprites/PocketEmpires.ino Normal file
View File

@ -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++;
}
}

View File

@ -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

BIN
Sprites/Soldiers.bmp Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.6 KiB

BIN
Sprites/Tower.bmp Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

278
System.c Normal file
View File

@ -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 );
}

90
System.h Normal file
View File

@ -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__

81
Unit.cpp Normal file
View File

@ -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);
}

33
main.cpp Normal file
View File

@ -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;
}