Add health
This commit is contained in:
@@ -90,6 +90,12 @@ ecs_entity_t placeBuilding(Game *game, BuildingType type,
|
|||||||
|
|
||||||
bool hasCollision = true;
|
bool hasCollision = true;
|
||||||
|
|
||||||
|
Health health = {
|
||||||
|
.startHP = 100.0f,
|
||||||
|
.hp = 100.0f,
|
||||||
|
.lastChanged = -1.0f,
|
||||||
|
};
|
||||||
|
|
||||||
switch (type) {
|
switch (type) {
|
||||||
case BUILDING_KEEP:
|
case BUILDING_KEEP:
|
||||||
ecs_set(ECS, building, AddPopCapacity, {10});
|
ecs_set(ECS, building, AddPopCapacity, {10});
|
||||||
@@ -103,6 +109,8 @@ ecs_entity_t placeBuilding(Game *game, BuildingType type,
|
|||||||
.elapsed = 0.0f,
|
.elapsed = 0.0f,
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
health.startHP = 1000.0f;
|
||||||
|
health.hp = health.startHP;
|
||||||
break;
|
break;
|
||||||
case BUILDING_BARRACKS:
|
case BUILDING_BARRACKS:
|
||||||
ecs_set(ECS, building, BuildingRecruitInfo, {
|
ecs_set(ECS, building, BuildingRecruitInfo, {
|
||||||
@@ -137,11 +145,15 @@ ecs_entity_t placeBuilding(Game *game, BuildingType type,
|
|||||||
.harvestLimit = 1
|
.harvestLimit = 1
|
||||||
});
|
});
|
||||||
ecs_set(ECS, building, Resource, {RES_FOOD, INT32_MAX});
|
ecs_set(ECS, building, Resource, {RES_FOOD, INT32_MAX});
|
||||||
|
health.startHP = 20.0f;
|
||||||
|
health.hp = health.startHP;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ecs_set_ptr(ECS, building, Health, &health);
|
||||||
|
|
||||||
if (hasCollision)
|
if (hasCollision)
|
||||||
bzTileMapSetCollisions(&game->map, true, COLL_LAYER_BUILDINGS, posX, posY, sizeX, sizeY);
|
bzTileMapSetCollisions(&game->map, true, COLL_LAYER_BUILDINGS, posX, posY, sizeX, sizeY);
|
||||||
|
|
||||||
|
|||||||
@@ -37,6 +37,7 @@ ECS_TAG_DECLARE(Selected);
|
|||||||
|
|
||||||
ECS_COMPONENT_DECLARE(AddPopCapacity);
|
ECS_COMPONENT_DECLARE(AddPopCapacity);
|
||||||
ECS_COMPONENT_DECLARE(ConsumePopCapacity);
|
ECS_COMPONENT_DECLARE(ConsumePopCapacity);
|
||||||
|
ECS_COMPONENT_DECLARE(Health);
|
||||||
ECS_COMPONENT_DECLARE(Worker);
|
ECS_COMPONENT_DECLARE(Worker);
|
||||||
ECS_COMPONENT_DECLARE(Building);
|
ECS_COMPONENT_DECLARE(Building);
|
||||||
ECS_COMPONENT_DECLARE(Unit);
|
ECS_COMPONENT_DECLARE(Unit);
|
||||||
@@ -83,6 +84,7 @@ void initComponentIDs(ecs_world_t *ecs) {
|
|||||||
|
|
||||||
ECS_COMPONENT_DEFINE(ecs, AddPopCapacity);
|
ECS_COMPONENT_DEFINE(ecs, AddPopCapacity);
|
||||||
ECS_COMPONENT_DEFINE(ecs, ConsumePopCapacity);
|
ECS_COMPONENT_DEFINE(ecs, ConsumePopCapacity);
|
||||||
|
ECS_COMPONENT_DEFINE(ecs, Health);
|
||||||
ECS_COMPONENT_DEFINE(ecs, Worker);
|
ECS_COMPONENT_DEFINE(ecs, Worker);
|
||||||
ECS_COMPONENT_DEFINE(ecs, Building);
|
ECS_COMPONENT_DEFINE(ecs, Building);
|
||||||
ECS_COMPONENT_DEFINE(ecs, Unit);
|
ECS_COMPONENT_DEFINE(ecs, Unit);
|
||||||
|
|||||||
@@ -214,6 +214,13 @@ typedef struct ConsumePopCapacity {
|
|||||||
} ConsumePopCapacity;
|
} ConsumePopCapacity;
|
||||||
extern ECS_COMPONENT_DECLARE(ConsumePopCapacity);
|
extern ECS_COMPONENT_DECLARE(ConsumePopCapacity);
|
||||||
|
|
||||||
|
typedef struct Health {
|
||||||
|
f32 startHP;
|
||||||
|
f32 hp;
|
||||||
|
f32 lastChanged;
|
||||||
|
} Health;
|
||||||
|
extern ECS_COMPONENT_DECLARE(Health);
|
||||||
|
|
||||||
// Worker can:
|
// Worker can:
|
||||||
// - Harvest
|
// - Harvest
|
||||||
// - Build
|
// - Build
|
||||||
|
|||||||
@@ -80,6 +80,12 @@ ecs_entity_t entityCreateWorker(const Position position, Player player, Game *ga
|
|||||||
.carryCapacity = 5,
|
.carryCapacity = 5,
|
||||||
});
|
});
|
||||||
|
|
||||||
|
ecs_set(ECS, e, Health, {
|
||||||
|
.startHP = 20.0f,
|
||||||
|
.hp = 20.0f,
|
||||||
|
.lastChanged = -1.0f
|
||||||
|
});
|
||||||
|
|
||||||
return e;
|
return e;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -270,9 +270,45 @@ void updateBuildingRecruitment(ecs_iter_t *it) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void renderHealth(ecs_iter_t *it) {
|
||||||
|
Position *pos = ecs_field(it, Position, 1);
|
||||||
|
HitBox *hitbox = ecs_field(it, HitBox, 2);
|
||||||
|
Health *health = ecs_field(it, Health, 3);
|
||||||
|
|
||||||
|
for (i32 i = 0; i < it->count; i++) {
|
||||||
|
HitBox hb = entityTransformHitBox(pos[i], hitbox[i]);
|
||||||
|
const f32 HP_WIDTH = 10.0f;
|
||||||
|
const f32 HP_HEIGHT = 1.8f;
|
||||||
|
const f32 HP_OFFSET = 2.0f;
|
||||||
|
|
||||||
|
const Color BG_COLOR = {0, 0, 0, 60};
|
||||||
|
const Color HP_COLOR = {255, 0, 0, 220};
|
||||||
|
|
||||||
|
const f32 PADDING = 0.15f;
|
||||||
|
|
||||||
|
Vector2 hpPos = {
|
||||||
|
hb.x + (hb.width - HP_WIDTH) * 0.5f,
|
||||||
|
hb.y - HP_OFFSET - HP_HEIGHT
|
||||||
|
};
|
||||||
|
Vector2 size = {
|
||||||
|
HP_WIDTH, HP_HEIGHT
|
||||||
|
};
|
||||||
|
f32 hpPercent = health[i].hp / health[i].startHP;
|
||||||
|
Vector2 hpSize = {
|
||||||
|
HP_WIDTH * hpPercent - PADDING * 2.0f,
|
||||||
|
HP_HEIGHT - PADDING * 2.0f
|
||||||
|
};
|
||||||
|
|
||||||
|
DrawRectangleV(hpPos, size, BG_COLOR);
|
||||||
|
hpPos.x += PADDING;
|
||||||
|
hpPos.y += PADDING;
|
||||||
|
DrawRectangleV(hpPos, hpSize, HP_COLOR);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void renderColliders(ecs_iter_t *it) {
|
void renderColliders(ecs_iter_t *it) {
|
||||||
Position *pos = ecs_field(it, Position, 1);
|
Position *pos = ecs_field(it, Position, 1);
|
||||||
HitBox *hitbox = ecs_field(it, HitBox , 2);
|
HitBox *hitbox = ecs_field(it, HitBox, 2);
|
||||||
|
|
||||||
for (i32 i = 0; i < it->count; i++) {
|
for (i32 i = 0; i < it->count; i++) {
|
||||||
HitBox hb = entityTransformHitBox(pos[i], hitbox[i]);
|
HitBox hb = entityTransformHitBox(pos[i], hitbox[i]);
|
||||||
|
|||||||
@@ -113,6 +113,7 @@ void setupSystems() {
|
|||||||
ECS_SYSTEM(ECS, updateAnimation, EcsOnUpdate, Animation, TextureRegion);
|
ECS_SYSTEM(ECS, updateAnimation, EcsOnUpdate, Animation, TextureRegion);
|
||||||
ECS_SYSTEM(ECS, updateEasingSystem, EcsOnUpdate, Easing, Position, HitBox, Rotation);
|
ECS_SYSTEM(ECS, updateEasingSystem, EcsOnUpdate, Easing, Position, HitBox, Rotation);
|
||||||
|
|
||||||
|
ECS_SYSTEM(ECS, renderHealth, EcsOnUpdate, Position, HitBox, Health);
|
||||||
ECS_SYSTEM(ECS, renderDebugPath, EcsOnUpdate, Path);
|
ECS_SYSTEM(ECS, renderDebugPath, EcsOnUpdate, Path);
|
||||||
|
|
||||||
ECS_SYSTEM(ECS, renderColliders, EcsOnUpdate, Position, HitBox);
|
ECS_SYSTEM(ECS, renderColliders, EcsOnUpdate, Position, HitBox);
|
||||||
|
|||||||
@@ -147,6 +147,13 @@ void entityFollowPath(ecs_iter_t *it);
|
|||||||
*/
|
*/
|
||||||
void updateBuildingRecruitment(ecs_iter_t *it);
|
void updateBuildingRecruitment(ecs_iter_t *it);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* 1: Position
|
||||||
|
* 2: HitBox
|
||||||
|
* 3: Health
|
||||||
|
*/
|
||||||
|
void renderHealth(ecs_iter_t *it);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* 1: Position
|
* 1: Position
|
||||||
* 2: HitBox
|
* 2: HitBox
|
||||||
|
|||||||
Reference in New Issue
Block a user