Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Variant Loader #22

Open
KABoissonneault opened this issue Mar 24, 2023 · 0 comments
Open

Variant Loader #22

KABoissonneault opened this issue Mar 24, 2023 · 0 comments
Milestone

Comments

@KABoissonneault
Copy link
Owner

New system to make LL handle block/location variants through a more global "rules" system, rather than letting users do specific variant assignments themselves.

DFU's WorldDataVariant

  • WDV is what we're dealing with. What items (ie: files) and what operations WDV allows limits what we can do without sending PRs to Gavin

Items:

  • Location variant (ex: Daggerfall_wod)
  • New Location
  • Block variant (ex: ALCHALAA00_wod)
  • Building variant (ex: ALCHALAA00.0_wod)

Operations:

  • SetLocationVariant(location, variant) -> change Daggerfall to Daggerfall_wod
  • SetNewLocationVariant(region, locationName, variant)
  • SetBlockVariant(blockName, variant) -> change all ALCHALAA00 to ALCHALAA00_wod
  • SetBlockVariant(blockName, variant, locationKey) -> change all ALCHALAA00 to ALCHALAA00_wod in Daggerfall
  • SetBuildingVariant(blockName, recordIndex, variant) -> set building 0 in all ALCHALAA00 to _wod variant
  • SetBuildingVariant(blockName, recordIndex, variant, locationKey) -> set building 0 in ALCHALAA00 in Daggerfall to _wod variant

Notes:

  • Building variants apply to all variants of a given block! ALCHALAA00_wod must still work with ALCHALAA00.0_wod

VariantLoader

Tools:
RMBVariantScriptGenerator

  • Generates variant scripts from rule specifications.
  • Also generates location variants if needed (see local rules)
  • Block variants are all provided by the user before running this tool
    RMBVariantRules -> RMBVariantScripts + location variants

VariantLoader

  • Runtime system in LocationLoader.dfmod
  • Reads RMBVariantScripts from all mods and applies instructions
  • WorldDataVariant.SetBlockVariant(...) / WorldDataVariant.SetLocationVariant(...)
  • Scripts are applied by mod order (if a mod has multiple scripts, their order is random)
    Question: Global scripts, script per region, script per map pixel?
    Scenario:
    Scenario 1
    • World of Daggerfall has script Daggerfall.rmbs.txt which sets ALCHALAA00 to variant _wod in location key 12317
    • Alchemy Expanded depends on World of Daggerfall, and therefore has "higher priority" (lower on the list)
    • Alchemy Expanded has HighRock.rmbs.txt, which sets ALCHALAA00 to _ae in location key 12317
    • When location 12317 is loaded, Alchemy Expanded wins, and the WoD instruction is ignored (clashing location and block target)
      Scenario 2
    • World of Daggerfall has script Daggerfall.rmbs.txt which sets ALCHALAA00 to variant _wod in location key 12317
    • Alchemy Renovated has a building replacement as ALCHALAA00.RMB-60-building0_ar.json
    • Building variant still applies to ALCHALAA00_wod

Items:
RMBVariantRules

  • CSV file with .rmb.csv extension
  • Each line forces a "target" block to a specified variant, if conditions are met
  • Rules are not built into the mod - they're used only for the generator
    Rules
  • We can divide conditions in three type
    Global
  • Rule applies to all the blocks with the target in the location
  • The effect can be applied with WorldDataVariant.SetBlockVariant(blockName, variant, locationKey)
  • A block variant is sufficient
    Local
  • Rule applies only to certain blocks with the target in the location,
    ex: North Edge, No Edge, ...
  • The effect cannot be applied with WorldDataVariant.SetBlockVariant(blockName, variant, locationKey)
  • Therefore, we need a location variant
    Runtime
  • Rule applies depending on runtime conditions,
    ex: quest active
  • Depending on other conditions, might be global or local. Global rules still work as block variants, and local rules as location variants
  • This requires extra runtime to apply and remove the variant as needed

Format
OLD_BLOCK VARIANT RULE1 ... RULEN
ex: ALCHALAA00 _dhw Daggerfall HauntedWoods

  • ALCHALAA00 is the target block. When the region is Daggerfall and the climate is haunted woods, the _dhw variant (ex: ALCHALAA00_dhw) should be set

RMBVariantScript

  • Text file with .rmbs.txt extension. Each line has a specific format
  • Set of instructions for knowing what variants to apply where
  • Instruction may have runtime constraints (ex: quest id)
  • Scripts are part of a built mod
    Issues:
  • For any runtime rule we invent, extra data needs to be hardcoded here. VariantLoader will not try to find what rules it was generated from.
  • We might not invent that many
    Format
    <locationkey> <blockname> <blockvariant> [quest <quest_id>]
    or <locationkey> variant <locvariant> [quest <quest_id>]
@KABoissonneault KABoissonneault added this to the 0.4 milestone Mar 24, 2023
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant