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>
This commit is contained in:
Christopher Wiebe
2026-04-30 20:40:51 -07:00
commit b451f83174
525 changed files with 75786 additions and 0 deletions
@@ -0,0 +1,49 @@
using Theriapolis.Core.Data;
using Theriapolis.Core.Entities;
using Theriapolis.Core.Rules.Reputation;
namespace Theriapolis.Core.Rules.Dialogue;
/// <summary>
/// Phase 6 M3 — read/write window into player + npc state used by
/// <see cref="DialogueRunner"/> to evaluate conditions and apply effects.
/// Keeps the runner free of direct PlayScreen / ActorManager references
/// so the runner can be unit-tested with a synthetic context.
/// </summary>
public sealed class DialogueContext
{
public NpcActor Npc { get; }
public Rules.Character.Character Pc { get; }
public PlayerReputation Reputation { get; }
public Dictionary<string, int> Flags { get; }
public ContentResolver Content { get; }
/// <summary>Player position for tagging RepEvent origins. Optional; defaults to (0, 0) in tests.</summary>
public int PlayerWorldTileX { get; set; }
public int PlayerWorldTileY { get; set; }
public long WorldClockSeconds { get; set; }
/// <summary>Set true by <see cref="DialogueRunner"/> when an option fires the open_shop effect.</summary>
public bool ShopRequested { get; set; }
/// <summary>
/// Phase 6 M3 — quest hook stub. set_flag-only for M3; the real quest
/// engine wires in M4 and consumes <see cref="StartQuestRequests"/>.
/// </summary>
public List<string> StartQuestRequests { get; } = new();
public DialogueContext(NpcActor npc, Rules.Character.Character pc,
PlayerReputation rep, Dictionary<string, int> flags,
ContentResolver content)
{
Npc = npc;
Pc = pc;
Reputation = rep;
Flags = flags;
Content = content;
}
/// <summary>Effective disposition for the current NPC vs the player. Cached per dialogue turn — recomputed on demand.</summary>
public int EffectiveDispositionScore()
=> EffectiveDisposition.For(Npc, Pc, Reputation, Content);
}