From 8fba2176bc34aa7e507f0b9d983427bb5e522e17 Mon Sep 17 00:00:00 2001 From: XaviDCR92 Date: Sun, 5 Nov 2017 05:38:31 +0100 Subject: [PATCH] * Modified shadows for Town centre. * Bugfixes in unit movement and collision detection. Now it should work fine. * Added include guards to all *.i files. * Other minor changes --- Exe/POCKET.ELF | Bin 46488 -> 47220 bytes Exe/POCKET.HEX | 2685 ++++++++++++++++---------------- Exe/POCKET.MAP | 1121 ++++++------- Gfx.cpp | 11 + Gfx.h | 1 + MouseSpr.i | 5 + PeasantSpr.i | 5 + Player.cpp | 82 +- Player.h | 10 +- SoldierSpr.i | 26 + Sprites/SoldierSpr.bmp | Bin 0 -> 246 bytes Sprites/SoldierSpr_Walking.bmp | Bin 0 -> 246 bytes Sprites/TownCentreShadow.bmp | Bin 1782 -> 1782 bytes System.c | 6 +- System.h | 2 +- TownCentre.i | 43 +- Unit.c | 97 +- Unit.h | 64 +- 18 files changed, 2163 insertions(+), 1995 deletions(-) create mode 100644 SoldierSpr.i create mode 100644 Sprites/SoldierSpr.bmp create mode 100644 Sprites/SoldierSpr_Walking.bmp diff --git a/Exe/POCKET.ELF b/Exe/POCKET.ELF index 94e29f1702b68afe69ac5bd0f8816150cbfd1739..b06b678b196ef9de174c6891c367a87e89510b7b 100755 GIT binary patch delta 16075 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 WAxqwg2xxgnd<7*~4Ii+laQ!bvsrVlN delta 15421 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 bldgCB.h = UnitGetHeightFromID(ptrUnit->id); - if (SystemCollisionCheck(*cb, bldgCB) == true) + if (SystemCollisionCheck(cb, &bldgCB) == true) { success = false; } @@ -227,29 +232,48 @@ bool Player::checkNewBuildingPosition(TYPE_COLLISION_BLOCK * cb) return true; } -bool Player::createUnit(TYPE_UNIT_ID id, TYPE_COLLISION_BLOCK cb) +void Player::createUnit(TYPE_UNIT_ID id, TYPE_COLLISION_BLOCK cb) { + TYPE_RESOURCES res = UnitNeededResourcesFromID(id); + + if ( (Resources.Food < res.Food) + || + (Resources.Wood < res.Wood) + || + (Resources.Gold < res.Gold) ) + { + GfxPrintText_Flash(F("Insuff. resources")); + return; + } + if (unit_i < PLAYER_MAX_UNITS_BUILDINGS) { - TYPE_UNIT* ptrNewUnit = &units[unit_i]; + TYPE_UNIT* ptrNewUnit = &units[unit_i++]; ptrNewUnit->id = id; ptrNewUnit->x = cb.x; ptrNewUnit->y = cb.y; ptrNewUnit->hp = UnitGetHpFromID(id); ptrNewUnit->alive = true; - ptrNewUnit->building = (id > MAX_UNIT_ID); - unit_i++; + /* Substract resources from player */ + Resources.Wood -= res.Wood; + Resources.Gold -= res.Gold; + Resources.Food -= res.Food; - return true; + if (ptrNewUnit->building == true) + { + GfxPrintText_Flash(F("Building created")); + } + else + { + GfxPrintText_Flash(F("Unit created")); + } } else { - return false; + GfxPrintText_Flash(F("Popul. limit")); } - - return false; } TYPE_COLLISION_BLOCK Player::GetCursorPos(void) @@ -422,10 +446,18 @@ void Player::ButtonAReleased(void) ActionCreateUnit(ptrUnit, PEASANT); break; + case ACTION_CREATE_SOLDIER: + ActionCreateUnit(ptrUnit, SOLDIER); + break; + case ACTION_BUILD_BARRACKS: ActionCreateBuilding(ptrUnit, BARRACKS); break; + case ACTION_BUILD_TOWER_CENTER: + ActionCreateBuilding(ptrUnit, TOWN_CENTER); + break; + default: break; } diff --git a/Player.h b/Player.h index 07101ed..e7c15fc 100644 --- a/Player.h +++ b/Player.h @@ -13,7 +13,7 @@ * Defines * * **************************************/ -#define PLAYER_NAME_LENGTH 16 +#define PLAYER_NAME_LENGTH 16 #define PLAYER_MAX_UNITS_BUILDINGS 32 /* ************************************** @@ -22,9 +22,9 @@ typedef struct t_Resource { - uint8_t Wood; - uint8_t Gold; - uint8_t Food; + uint16_t Wood; + uint16_t Gold; + uint16_t Food; }TYPE_RESOURCES; /* ************************************** @@ -44,7 +44,7 @@ class Player char* getName(void) {return name;} void setHuman(bool value) { human = value; } bool isHuman(void) {return human;} - bool createUnit(TYPE_UNIT_ID id, TYPE_COLLISION_BLOCK cb); + void createUnit(TYPE_UNIT_ID id, TYPE_COLLISION_BLOCK cb); uint8_t getPopulation(void) {return (unit_i + 1);} void ShowResources(void); diff --git a/SoldierSpr.i b/SoldierSpr.i new file mode 100644 index 0000000..aacf4ee --- /dev/null +++ b/SoldierSpr.i @@ -0,0 +1,26 @@ +#ifndef UNIT_SPR_I__ +#define UNIT_SPR_I__ + +const uint8_t SoldierSprData[] PROGMEM = {8,8, +0x3C, +0x42, +0x99, +0xBD, +0xFE, +0x58, +0x40, +0x40, +}; + +const uint8_t SoldierSprData_Walking[] PROGMEM = {8,8, +0xE0, +0xBC, +0xC2, +0x99, +0xBD, +0xFF, +0x5D, +0x47, +}; + +#endif // UNIT_SPR_I__ diff --git a/Sprites/SoldierSpr.bmp b/Sprites/SoldierSpr.bmp new file mode 100644 index 0000000000000000000000000000000000000000..09437af5fe8f597900675a30137d955d0dae276e GIT binary patch literal 246 zcmZ?r{l)+RWnv9ek6kHdIPEpt6}5Neb8Y?h+m*cXb{) zx6ytdxIB@rGn_DpZ`j0_cd<`VR92AC4WEiM8Gp$~{?Z7NAbis(1RD6j)@Vtnw}ua| zG#Ria{X46Z8PxbLS2{Q`gqP_}LgjNEInkR3yMZ?|l;HF}<%Lt~;GK z+GE<67=`ep{%hbJg>-ymNkMPv=*>ON^GKZ%<$cW>9I>WbJ+-KlQ?q8Z9!_RhNcQ3^ z;OBChi}|>QxY7EVLq>~jaJXf~F1CV_Llx4ObqC>;#Z^5xRii8ZIc^{>?U@g0Aai!4 c5Jc^|9!3|Om4jzuK6oiwn*z((7j-P{3wHA`w*UYD diff --git a/System.c b/System.c index 8535eb9..43f2c91 100644 --- a/System.c +++ b/System.c @@ -271,8 +271,8 @@ bool SystemArrayCompare(unsigned short * arr1, unsigned short * arr2, size_t sz) return true; } -bool SystemCollisionCheck(TYPE_COLLISION_BLOCK c1, TYPE_COLLISION_BLOCK c2) +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 ); + 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 index 421183a..4670f2e 100644 --- a/System.h +++ b/System.h @@ -84,7 +84,7 @@ 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); +bool SystemCollisionCheck(TYPE_COLLISION_BLOCK* c1, TYPE_COLLISION_BLOCK* c2); /* ************************************** * Global Variables * diff --git a/TownCentre.i b/TownCentre.i index 6d78342..89c5c0b 100644 --- a/TownCentre.i +++ b/TownCentre.i @@ -1,3 +1,6 @@ +#ifndef TOWN_CENTRE_I__ +#define TOWN_CENTRE_I__ + const uint8_t TownCentreSprData[] PROGMEM = {24,24, 0x3,0xFF,0xC0, 0xC,0x0,0x30, @@ -30,24 +33,26 @@ const uint8_t TownCentreShadowSprData[] PROGMEM = {24,24, 0x7E,0x0,0x0, 0xF8,0x0,0x0, 0xF0,0x0,0x0, -0xE0,0x0,0x0, -0xE0,0x0,0x4, -0xE0,0x0,0x4, -0xE0,0x0,0x4, -0xE2,0xE0,0x4, -0xE2,0x80,0x4, -0xE2,0x80,0x4, -0xE2,0x80,0x4, -0xE2,0x80,0x4, -0xE2,0x80,0x4, -0xE2,0xE0,0x4, -0xE0,0x60,0xC, -0xE0,0x0,0x10, -0xE0,0x0,0x0, -0xE0,0x0,0x0, -0xE0,0x1,0x80, -0xF0,0x1,0x80, -0xF8,0x1,0x80, -0x7E,0x1,0x80, +0xF8,0x0,0x0, +0xF8,0x0,0x4, +0xF8,0x0,0x4, +0xF8,0x0,0x4, +0xFA,0xE0,0x4, +0xFA,0x80,0x4, +0xFA,0x80,0x4, +0xFA,0x80,0x4, +0xFA,0x80,0x4, +0xFA,0x80,0x4, +0xFA,0xE0,0x4, +0xF8,0x60,0xC, +0xF8,0x0,0x10, +0xFC,0x0,0x0, +0xFF,0x0,0x0, +0xFF,0xF1,0x80, +0xFF,0xF1,0x80, +0xFF,0xF1,0x80, +0x7F,0xF1,0x80, 0x1F,0x81,0x80, }; + +#endif // TOWN_CENTRE_I__ diff --git a/Unit.c b/Unit.c index 26beae0..9147306 100644 --- a/Unit.c +++ b/Unit.c @@ -3,7 +3,12 @@ * **************************************/ #include "Unit.h" + +/* Units sprite data */ #include "PeasantSpr.i" +#include "SoldierSpr.i" + +/* Buildings sprite data */ #include "BarracksSpr.i" #include "TownCentre.i" @@ -30,21 +35,31 @@ struct t_coordinates * **************************************/ /* Tables */ -static uint8_t const UnitHPTable[MAX_UNITS_BUILDINGS] = { [PEASANT] = 25 , - [BARRACKS] = 100, - [TOWN_CENTER] = 200 }; +static uint8_t const UnitHPTable[MAX_UNITS_BUILDINGS] = { [PEASANT] = 25, + [SOLDIER] = 80, + [BARRACKS] = 100, + [TOWN_CENTER] = 200 }; + +static TYPE_RESOURCES const UnitResourcesTable[MAX_UNITS_BUILDINGS] = { [PEASANT] = {.Wood = 0, .Gold = 0, .Food = 50}, + [SOLDIER] = {.Wood = 25, .Gold = 10, .Food = 50}, + [BARRACKS] = {.Wood = 100, .Gold = 0, .Food = 0}, + [TOWN_CENTER] = {.Wood = 200, .Gold = 0, .Food = 0} }; static uint8_t const UnitSpeedTable[MAX_UNITS_BUILDINGS] = { [PEASANT] = 1, - [BARRACKS] = 0, - [TOWN_CENTER] = 0 }; + [SOLDIER] = 1, + [BARRACKS] = 0, + [TOWN_CENTER] = 0 }; -static const char* const UnitActionsTable_Level[MAX_ACTIONS] = { [ACTION_BUILD_BARRACKS] = "B.BARR", - [ACTION_ATTACK] = "ATTACK", - [ACTION_CREATE_PEASANT] = "C.PEAS."}; +static const char* const UnitActionsTable_Level[MAX_ACTIONS] = { [ACTION_BUILD_BARRACKS] = "B.BARR", + [ACTION_ATTACK] = "ATTACK", + [ACTION_CREATE_PEASANT] = "C.PEAS.", + [ACTION_CREATE_SOLDIER] = "C.SLDR.", + [ACTION_BUILD_TOWER_CENTER] = "C.TWNC."}; -static uint8_t const UnitActionsTable[MAX_UNITS_BUILDINGS] = { [PEASANT] = ((1 << ACTION_BUILD_BARRACKS) | (1 << ACTION_ATTACK)), - [BARRACKS] = (1 << ACTION_CREATE_PEASANT), - [TOWN_CENTER] = (1 << ACTION_CREATE_PEASANT) }; +static uint8_t const UnitActionsTable[MAX_UNITS_BUILDINGS] = { [PEASANT] = ((1 << ACTION_BUILD_BARRACKS) | (1 << ACTION_BUILD_TOWER_CENTER) | (1 << ACTION_ATTACK)), + [SOLDIER] = (1 << ACTION_ATTACK), + [BARRACKS] = (1 << ACTION_CREATE_SOLDIER), + [TOWN_CENTER] = (1 << ACTION_CREATE_PEASANT) }; // ************** // Sprite tables @@ -56,6 +71,10 @@ static const struct t_coordinates UnitShadowOffsetTable[MAX_BUILDING_ID - FIRST_ void UnitInit(void) { + /* *********************************** + * Unit sprite data init + * ***********************************/ + UnitSprTable[PEASANT].Data = Peasant_SprData; UnitSprTable[PEASANT].w = GfxGetWidthFromSpriteData(Peasant_SprData); UnitSprTable[PEASANT].h = GfxGetHeightFromSpriteData(Peasant_SprData); @@ -63,6 +82,13 @@ void UnitInit(void) UnitSprTable[PEASANT].rotation = 0; UnitSprTable[PEASANT].color = GFX_BLACK; + UnitSprTable[SOLDIER].Data = SoldierSprData; + UnitSprTable[SOLDIER].w = GfxGetWidthFromSpriteData(SoldierSprData); + UnitSprTable[SOLDIER].h = GfxGetHeightFromSpriteData(SoldierSprData); + UnitSprTable[SOLDIER].flip = 0; + UnitSprTable[SOLDIER].rotation = 0; + UnitSprTable[SOLDIER].color = GFX_BLACK; + UnitWalkingShadowSprTable[PEASANT].Data = Peasant_Walking_SprData; UnitWalkingShadowSprTable[PEASANT].w = GfxGetWidthFromSpriteData(Peasant_Walking_SprData); UnitWalkingShadowSprTable[PEASANT].h = GfxGetHeightFromSpriteData(Peasant_Walking_SprData); @@ -70,6 +96,17 @@ void UnitInit(void) UnitWalkingShadowSprTable[PEASANT].rotation = 0; UnitWalkingShadowSprTable[PEASANT].color = GFX_BLACK; + UnitWalkingShadowSprTable[SOLDIER].Data = SoldierSprData_Walking; + UnitWalkingShadowSprTable[SOLDIER].w = GfxGetWidthFromSpriteData(SoldierSprData_Walking); + UnitWalkingShadowSprTable[SOLDIER].h = GfxGetHeightFromSpriteData(SoldierSprData_Walking); + UnitWalkingShadowSprTable[SOLDIER].flip = 0; + UnitWalkingShadowSprTable[SOLDIER].rotation = 0; + UnitWalkingShadowSprTable[SOLDIER].color = GFX_BLACK; + + /* *********************************** + * Buildings sprite data init + * ***********************************/ + UnitSprTable[BARRACKS].Data = BarracksSpr_Data; UnitSprTable[BARRACKS].w = GfxGetWidthFromSpriteData(BarracksSpr_Data); UnitSprTable[BARRACKS].h = GfxGetHeightFromSpriteData(BarracksSpr_Data); @@ -213,21 +250,26 @@ void UnitDraw(TYPE_UNIT* ptrUnit, TYPE_CAMERA* ptrCamera, bool bHighlighted) } } -uint8_t UnitGetWidthFromID(uint8_t id) +uint8_t UnitGetWidthFromID(TYPE_UNIT_ID id) { return GfxGetWidthFromSpriteData(UnitSprTable[id].Data); } -uint8_t UnitGetHeightFromID(uint8_t id) +uint8_t UnitGetHeightFromID(TYPE_UNIT_ID id) { return GfxGetHeightFromSpriteData(UnitSprTable[id].Data); } -uint8_t UnitGetHpFromID(uint8_t id) +uint8_t UnitGetHpFromID(TYPE_UNIT_ID id) { return UnitHPTable[id]; } +TYPE_RESOURCES UnitNeededResourcesFromID(TYPE_UNIT_ID id) +{ + return UnitResourcesTable[id]; +} + void UnitMoveTo(TYPE_UNIT* ptrUnit, uint16_t x, uint16_t y) { ptrUnit->target_x = x; @@ -264,37 +306,28 @@ void UnitHandler(TYPE_UNIT* unitArray, size_t sz) if ( (ptrUnit->x - UnitSpeedTable[ptrUnit->id]) > ptrUnit->target_x) { ptrUnit->dir = DIRECTION_LEFT; - x_d = -UnitSpeedTable[ptrUnit->id]; - //~ ptrUnit->x -= UnitSpeedTable[ptrUnit->id]; + x_d = (int8_t)-UnitSpeedTable[ptrUnit->id]; } else if ( (ptrUnit->x + UnitSpeedTable[ptrUnit->id]) < ptrUnit->target_x) { ptrUnit->dir = DIRECTION_RIGHT; - x_d = UnitSpeedTable[ptrUnit->id]; - //~ ptrUnit->x += UnitSpeedTable[ptrUnit->id]; + x_d = (int8_t)UnitSpeedTable[ptrUnit->id]; } - - if ( (ptrUnit->y - UnitSpeedTable[ptrUnit->id]) > ptrUnit->target_y) + else if ( (ptrUnit->y - UnitSpeedTable[ptrUnit->id]) > ptrUnit->target_y) { ptrUnit->dir = DIRECTION_UP; - y_d = -UnitSpeedTable[ptrUnit->id]; - //~ ptrUnit->y -= UnitSpeedTable[ptrUnit->id]; + y_d = (int8_t)-UnitSpeedTable[ptrUnit->id]; } else if ( (ptrUnit->y + UnitSpeedTable[ptrUnit->id]) < ptrUnit->target_y) { ptrUnit->dir = DIRECTION_DOWN; - y_d = UnitSpeedTable[ptrUnit->id]; - //~ ptrUnit->y += UnitSpeedTable[ptrUnit->id]; + y_d = (int8_t)UnitSpeedTable[ptrUnit->id]; } else { - x_d = ptrUnit->x - ptrUnit->target_x; - y_d = ptrUnit->y - ptrUnit->target_y; bMoving = false; } - ptrUnit->walking = bMoving; - if (ptrUnit->walking == true) { // If player is still walking, check collisions @@ -324,18 +357,20 @@ void UnitHandler(TYPE_UNIT* unitArray, size_t sz) ou.x = ptrOtherUnit->x; - ou.y = ptrOtherUnit->x; + ou.y = ptrOtherUnit->y; ou.w = UnitGetWidthFromID(ptrOtherUnit->id); ou.h = UnitGetHeightFromID(ptrOtherUnit->id); - if (SystemCollisionCheck(cu, ou) == true) + if (SystemCollisionCheck(&cu, &ou) == true) { - ptrUnit->walking = false; + bMoving = false; break; } } } + ptrUnit->walking = bMoving; + if (ptrUnit->walking == true) { // If no collision is detected, keep moving to the new position diff --git a/Unit.h b/Unit.h index 86bd6f7..0f554c7 100644 --- a/Unit.h +++ b/Unit.h @@ -7,6 +7,7 @@ #include "Global_Inc.h" #include "Camera.h" +#include "Player.h" #ifdef __cplusplus extern "C" @@ -29,29 +30,11 @@ typedef enum t_unitdirection DIRECTION_DOWN }UNIT_DIRECTION; -typedef struct t_Unit -{ - uint16_t x; - uint16_t y; - uint16_t target_x; - uint16_t target_y; - uint8_t hp; - uint8_t id; - UNIT_DIRECTION dir; - bool mirror; // True = down or left; true = up or right - bool building; - bool walking; - bool alive; - bool selected; - bool selecting_attack; - bool attacking; - uint8_t walk_counter; -}TYPE_UNIT; - typedef enum t_unitid { // Walking units - PEASANT = 0, + PEASANT, + SOLDIER, MAX_UNIT_ID, @@ -68,6 +51,25 @@ typedef enum t_unitid FIRST_BUILDING_ID = BARRACKS }TYPE_UNIT_ID; +typedef struct t_Unit +{ + uint16_t x; + uint16_t y; + uint16_t target_x; + uint16_t target_y; + uint8_t hp; + TYPE_UNIT_ID id; + UNIT_DIRECTION dir; + bool mirror; // True = down or left; true = up or right + bool building; + bool walking; + bool alive; + bool selected; + bool selecting_attack; + bool attacking; + uint8_t walk_counter; +}TYPE_UNIT; + typedef struct { const char* str; @@ -79,32 +81,36 @@ typedef enum t_availableactions ACTION_BUILD_BARRACKS, ACTION_ATTACK, ACTION_CREATE_PEASANT, + ACTION_CREATE_SOLDIER, + ACTION_BUILD_TOWER_CENTER, MAX_ACTIONS }UNIT_ACTION; typedef struct t_Camera TYPE_CAMERA; +typedef struct t_Resource TYPE_RESOURCES; /* ************************************** * Global prototypes * * **************************************/ // Initialization and handling -void UnitInit(void); -void UnitHandler(TYPE_UNIT* unitArray, size_t sz); +void UnitInit(void); +void UnitHandler(TYPE_UNIT* unitArray, size_t sz); // Unit information -uint8_t UnitGetHpFromID(uint8_t id); -uint8_t UnitGetWidthFromID(uint8_t id); -uint8_t UnitGetHeightFromID(uint8_t id); -uint8_t UnitGetAvailableActions(TYPE_UNIT* ptrUnit); +uint8_t UnitGetHpFromID(TYPE_UNIT_ID id); +uint8_t UnitGetWidthFromID(TYPE_UNIT_ID id); +uint8_t UnitGetHeightFromID(TYPE_UNIT_ID id); +uint8_t UnitGetAvailableActions(TYPE_UNIT* ptrUnit); +TYPE_RESOURCES UnitNeededResourcesFromID(TYPE_UNIT_ID id); // Rendering -void UnitDraw(TYPE_UNIT* ptrUnit, TYPE_CAMERA* ptrCamera, bool bHighlighted); +void UnitDraw(TYPE_UNIT* ptrUnit, TYPE_CAMERA* ptrCamera, bool bHighlighted); -void UnitMoveTo(TYPE_UNIT* ptrUnit, uint16_t x, uint16_t y); +void UnitMoveTo(TYPE_UNIT* ptrUnit, uint16_t x, uint16_t y); // Selection index -const char* UnitGetActionString(UNIT_ACTION action); +const char* UnitGetActionString(UNIT_ACTION action); #ifdef __cplusplus }