Working on implementing tile trait system.

This commit is contained in:
2025-01-17 11:16:26 -05:00
parent 09773fbe5c
commit 823889cc09

View File

@@ -105,8 +105,16 @@ namespace CaveGame::Core {
uint8_t g;
};
/*
class Tile
class TestTile;
class TileTrait {
public:
virtual void Invoke(ITileMap* world, int x, int y) {};
};
// Tile trait code to be fully implemented
/*//////////////////////////////////////////////////////////////////////////////*/
class TestTile
{
public:
TileID numeric_id = TileID::VOID;
@@ -114,17 +122,80 @@ namespace CaveGame::Core {
public:
Color4 base_color;
std::vector<Color4> color_pallet;
TileFlags flags = NonSolid;
//TileFlags flags = NonSolid;
public:
TileID NumericID();
std::string MnemonicID();
TileFlags Flags();
bool HasFlag(TileFlags f);
TestTile(TileID id, std::string mnemonic);
TileID NumericID() { return numeric_id; }
std::string MnemonicID() { return mnemonic_id; }
/*
bool HasTrait(TileTrait* tr) {
Tile* d;
if (Tile* d = dynamic_cast<Tile*>(tr); d != nullptr) {
return true;
}
return false;
}
*/
//TileFlags Flags();
//bool HasFlag(TileFlags f);
virtual void InvokeTraits(ITileMap* world, int x, int y) {};
};
class Ticker : public TileTrait {};
class RandomTicker : public Ticker {};
class ForcedTicker : public Ticker {};
class OnCondition : public TileTrait
{
public:
OnCondition();
virtual bool Condition(ITileMap* world, int x, int y) { return true; }
virtual void Perform(ITileMap* world, int x, int y) {}
virtual void Invoke(ITileMap* world, int x, int y) override {
if (Condition(world, x, y))
Perform(world, x, y);
}
};
class DecayTo : public OnCondition
{
public:
TestTile* dt;
public:
DecayTo(TestTile* dt) : OnCondition(), dt(dt) {};
virtual bool Condition(ITileMap* world, int x, int y) override { return true; }
virtual void Perform(ITileMap* world, int x, int y) override {
world->SetTile(x, y, dt->NumericID());
}
};
class Spreader : public OnCondition
{
public:
TestTile* st;
public:
Spreader(TestTile* st) : OnCondition(), st(st) {};
virtual bool Condition(ITileMap* world, int x, int y) override {
return (world->GetTile(x, y) == st->NumericID()) && world->HasAdjacentOrDiagonalAirBlock(x, y);
}
virtual void Perform(ITileMap* world, int x, int y) override {
world->SetTile(x, y, st->NumericID());
}
};
/*
class Suffocator : public TileTrait
{
public:
Suffocator() : TileTrait() {};
public:
virtual void Invoke(ITileMap* world, int x, int y) override {
if (!world->HasAdjacentOrDiagonalAirBlock(x, y))
return true;
return false;
}
};*/
/*//////////////////////////////////////////////////////////////////////////////*/
class TileGroup {};