Files

127 lines
5.1 KiB
C#
Raw Permalink Normal View History

namespace Theriapolis.Core.Tactical;
/// <summary>
/// Tactical-scale ground class. One tile = 1 world pixel.
/// Phase 4 keeps this enum tight; richer typing (subtypes per biome, special
/// surface effects) lands in later phases when art shows up.
/// </summary>
public enum TacticalSurface : byte
{
None = 0,
Grass,
TallGrass,
Dirt,
Sand,
Mud,
Snow,
Rock,
Cobble, // city plaza / highway / post road
Gravel, // footpath
TroddenDirt, // dirt road — visually distinct from wild Dirt biome ground
ShallowWater, // wadeable
DeepWater, // impassable
Marsh,
Floor, // building interior placeholder
Wall, // building wall (impassable)
// ── Phase 7 M1: dungeon surfaces ─────────────────────────────────────
// Distinct from settlement Floor / Wall so the renderer can pick the
// right tile-art family per dungeon type, and so the savegame can tell
// a building floor apart from a dungeon floor when (eventually) building
// deltas and dungeon state share a chunk-coord namespace.
DungeonFloor, // generic dungeon-interior floor (Imperium / general)
DungeonRubble, // damaged / collapsed floor — slows movement
DungeonTile, // mosaic / inlay floor (narrative rooms)
Cave, // natural-cave floor (Cult Den / Natural Cave dungeon types)
MineFloor, // worked tunnel floor (Abandoned Mine)
}
/// <summary>
/// Decoration on top of the ground (rendered above surface, may affect walkability).
/// </summary>
public enum TacticalDeco : byte
{
None = 0,
Tree,
Bush, // slows but does not block
Rock, // small — does not block
Boulder, // blocks
Flower,
Crop,
Reed,
Snag,
// Phase 6 M0 — interior decorations stamped by SettlementStamper.
Door = 16, // walkable, marks a building entrance
Counter, // shop / inn furniture, blocks movement
Bed, // furniture, blocks
Hearth, // furniture, blocks
Sign, // outdoor signpost, blocks (one tile)
// ── Phase 7 M1: dungeon decorations ─────────────────────────────────
// Stairs is the PoI-entrance interaction tile on the surface chunk
// *and* the dungeon-exit interaction tile inside a dungeon. The
// PlayScreen tells them apart by the active scene (chunk vs dungeon).
Stairs = 32, // walkable; player E to enter / exit
DungeonDoor, // walkable when open; lockable per RoomDoor
Container, // chest / sarcophagus / locked box (loot)
Trap, // tripwire (Phase 7 only ships this kind)
Brazier, // light source furniture, blocks
Pillar, // structural pillar, blocks
ImperiumStatue, // Imperium-themed deco, blocks (cover; flavour)
}
/// <summary>
/// Per-tactical-tile data. 16 bytes (well below the 64-byte cache line) so a
/// 64×64 chunk fits comfortably in L1.
/// </summary>
public struct TacticalTile
{
public TacticalSurface Surface;
public TacticalDeco Deco;
public byte Variant; // small RNG nibble for visual variation
public byte Flags; // packed bool flags, see TacticalFlags
public bool IsWalkable
{
get
{
if ((Flags & (byte)TacticalFlags.Impassable) != 0) return false;
return Surface switch
{
TacticalSurface.Wall => false,
TacticalSurface.DeepWater => false,
_ => true,
}
&& Deco != TacticalDeco.Tree && Deco != TacticalDeco.Boulder
&& Deco != TacticalDeco.Counter && Deco != TacticalDeco.Bed
&& Deco != TacticalDeco.Hearth && Deco != TacticalDeco.Sign
// Phase 7 M1 — dungeon decos that block movement.
&& Deco != TacticalDeco.Brazier && Deco != TacticalDeco.Pillar
&& Deco != TacticalDeco.ImperiumStatue && Deco != TacticalDeco.Container;
}
}
public bool SlowsMovement
=> (Flags & (byte)TacticalFlags.Slow) != 0
|| Deco == TacticalDeco.Bush
|| Surface == TacticalSurface.ShallowWater
|| Surface == TacticalSurface.Marsh
|| Surface == TacticalSurface.Mud
// Phase 7 M1 — dungeon rubble slows movement.
|| Surface == TacticalSurface.DungeonRubble;
}
[Flags]
public enum TacticalFlags : byte
{
None = 0,
Impassable = 1 << 0,
Slow = 1 << 1,
Bridge = 1 << 2, // walkable even though water is below
River = 1 << 3, // burned in by a river polyline
Road = 1 << 4, // burned in by a road polyline
Settlement = 1 << 5, // inside a settlement footprint
// Phase 6 M0 — building structure flags. Interior is derived
// (Settlement && Building && Surface==Floor) so we don't waste a bit.
Building = 1 << 6, // building wall or floor (subset of Settlement)
Doorway = 1 << 7, // walkable building entrance (subset of Building)
}