Commit Graph

4 Commits

Author SHA1 Message Date
JonKazama-Hellion 825c5d3c5c Modul 01 Hotfix A4: AnvilRecipe.IsCollectable ergänzt
01-RecipeData Rev 6 (A4) added the field as a Summarize-branch
discriminator for module 02. Resolved as IsExpertRecipe OR the
output item's AlwaysCollectable flag, the latter being the canonical
FFXIV signal for collectable submissions (custom delivery, masterpiece
supply, collectables shop).

- AnvilRecipe.cs: new required bool property after CanHQ, with a
  why-comment pointing at module 02's Summarize branch and noting
  the OR-resolve.
- LuminaRecipeAdapter.cs: resolve folded into the recipe walk via
  the same itemSheet.TryGetRow call that already fetches the
  display name - no bootstrap-order question, no 2-pass needed.
  hasOutputItem is hoisted so the OR-branch can guard against a
  missing item-sheet row without touching the default(Item) struct.
- RecipeDataAdapterLoadStep.cs: new pass criterion #10 that asserts
  at least one recipe surfaces IsCollectable == true. Catches a
  silent resolve-path failure. Existing Cosmic-surface check shifts
  to #11 to keep numbering stable.

Build clean (0/0), csharpier clean.
2026-05-28 19:26:53 +02:00
JonKazama-Hellion 12013ba6e6 Modul 01 Hotfix A1: AnvilRecipe.RecipeLevelTableClassJobLevel ergaenzt
01-RecipeData Rev 6 (A1) added the field as the character-level
equivalent of a recipe's RecipeLevelTable, so module 02 can branch the
mod-penalty in BaseProgress and BaseQuality. The adapter resolves it
from the existing RecipeLevelTable.Value in the recipe walk.

- AnvilRecipe.cs: new required byte property after RecipeLevel, with
  a why-comment that points consumers at module 02 and warns against
  confusing the field with the row-id one above it.
- LuminaRecipeAdapter.cs: levelTable.ClassJobLevel assignment in the
  Recipe walk - levelTable was already resolved earlier in the loop.
- RecipeDataAdapterLoadStep.cs: new pass criterion #9 that asserts at
  least one recipe carries a positive RecipeLevelTableClassJobLevel.
  Catches a silent RecipeLevelTable-walk failure that would otherwise
  only surface inside the simulator. Existing Cosmic-surface check
  shifted to #10 to keep the spec numbering stable.

Build clean (0/0), csharpier clean.
2026-05-28 18:58:56 +02:00
JonKazama-Hellion ce3fdda51c Modul 01 Hotfix A2: AnvilRecipe.IsSplendorCosmic entfernt
Splendorous-Tool-Bonus is character-equipment state, not recipe state.
The flag moved to the simulator's stats layer (CraftStats.HasSplendorousTool
in module 02) per the 01-RecipeData Rev 6 spec polish (A2).

- AnvilRecipe.cs: IsSplendorCosmic property removed. Cosmic doc-block
  trimmed to four flags (IsCosmic + two MissionHas* + IsIshgardExpert)
  and now points consumers at the stats-layer for the Splendor branch.
- LuminaRecipeAdapter.cs: assignment in the recipe walk removed.
  ValidateCosmicInvariant drops the IsSplendorCosmic implication
  (MissionHas* checks unchanged).
- ConditionMechanicsTable.cs: header comment rewritten to describe
  Splendor as a stats-layer override rather than a recipe-flag override.

Sweep over Anvil/RecipeData/, Anvil/SelfTest/, Anvil/Hosting/,
Plugin.cs, and PluginHostFactory.cs: zero remaining references to
IsSplendorCosmic. Build clean (0/0), csharpier check clean.
2026-05-28 18:30:32 +02:00
JonKazama-Hellion 47790a3f68 feat(recipedata): add plain-data records and enums
Module 01 public-API surface: six sealed records with init-only
properties plus their nine enums. All BCL-only - no Lumina or Dalamud
types in any public property, which is what keeps the simulator and
catalog xUnit-testable per the Critical Boundary in 00-Anvil-Scope §3.3.

- AnvilRecipe + AnvilRecipeIngredient: flat representation of the
  Recipe + RecipeLevelTable sheet pair with the five Cosmic-Exploration
  flags. v0.1.0 ships with MissionHas* always false (SH-15 option B);
  the schema stays in place so v0.2.0 can wire the WKS mission sheet
  without touching the type.
- AnvilItem: slim per-recipe / per-food item view (full ~50k-row item
  mirror is left to the UI layer).
- AnvilAction + AnvilActionKind + AnvilActionCategory + AnvilActionFlags:
  one logical action per Kind value with RowIdByClassJob mapping; Cosmic
  actions use ClassJobId 0 as the sentinel for "every crafter".
  AnvilActionFlags bit 1 << 2 is intentionally vacant (ConsumesGreatStrides
  was removed in spec rev 5; consumption logic lives in 02-CraftingSimulator).
- AnvilBuff + AnvilBuffKind + AnvilBuffBehavior + AnvilBuffCategory:
  static buff catalog entry with the duration field that matches Behavior
  (Steps / Seconds / Actions). Two Cosmic buffs (MaterialMiracleBuff,
  StellarSteadyHandBuff).
- AnvilCondition + AnvilConditionKind: eleven conditions including the
  Cosmic Robust variant. DisplayName comes from AnvilStrings.resx, not
  Lumina (the Status sheet does not expose the crafting condition labels
  cleanly).
- AnvilFood + AnvilFoodBonus + AnvilFoodKind + AnvilFoodStat: ItemFood
  mirror with IsRelative flag (percentage vs flat bonus).
2026-05-27 19:53:54 +02:00