Merge branch 'phase/44-quarrel-fight'

Co-authored-by: Cursor <cursoragent@cursor.com>

# Conflicts:
#	docs/phases/README.md
#	src/HSchool.Content/PeopleDefs.cs
#	src/HSchool.People/Roster.cs
#	src/HSchool.People/Seed.cs
This commit is contained in:
Leonid Pershin
2026-08-20 13:24:12 +03:00
21 changed files with 1505 additions and 24 deletions
+32
View File
@@ -227,6 +227,20 @@ public sealed class TraitDef : Def
/// higher (jealous). Ignored without affinity rules.
/// </summary>
public int AffinityBreakOffset { get; init; }
/// <summary>
/// Multiplies quarrel and fight chance. Hot-tempered and bully above 1. Missing is 1.
/// </summary>
public float ConflictChance { get; init; } = 1f;
/// <summary>
/// This person keeps one victim id until they leave or opinion hits the floor.
/// A field, not a <c>defName == "Bully"</c> branch.
/// </summary>
public bool RemembersVictim { get; init; }
/// <summary>Multiplies the chance to start an apology. Bully below 1. Missing is 1.</summary>
public float ApologyChance { get; init; } = 1f;
}
/// <summary>
@@ -528,6 +542,24 @@ public sealed class BehaviorDef : Def
/// <summary>Per-decision chance a pupil in class tries to start a whisper, before initiative.</summary>
public float WhisperStartChance { get; init; } = 0.12f;
/// <summary>Rivals always roll this before traits. 1 means every enemy pair can start a quarrel.</summary>
public float QuarrelChance { get; init; } = 1f;
/// <summary>Base chance a yard or gym clash becomes a fight. Traits scale it; kept rare.</summary>
public float FightChance { get; init; } = 0.1f;
/// <summary>Opinion shift per other participant when a quarrel ends. Stronger than rude talk (3).</summary>
public int QuarrelOpinionShift { get; init; } = -8;
/// <summary>Opinion shift when a fight ends. No health need is touched.</summary>
public int FightOpinionShift { get; init; } = -16;
/// <summary>Fraction of lost opinion an apology returns. Never climbs past the pre-quarrel value.</summary>
public float ApologyRestoreFraction { get; init; } = 0.5f;
/// <summary>Opinion of the victim at or above this — a third person may join the quarrel.</summary>
public int DefendOpinionMin { get; init; } = 40;
public static IReadOnlyList<OpinionBand> DefaultOpinionBands { get; } =
[
new() { Min = 70, Id = "OpinionCloseFriend" },