Files
TheriapolisV3/Theriapolis.Core/Tactical/TacticalTile.cs
T
Christopher Wiebe b451f83174 Initial commit: Theriapolis baseline at port/godot branch point
Captures the pre-Godot-port state of the codebase. This is the rollback
anchor for the Godot port (M0 of theriapolis-rpg-implementation-plan-godot-port.md).
All Phase 0 through Phase 6.5 work is included; Phase 7 is in flight.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-04-30 20:40:51 -07:00

127 lines
5.1 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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)
}