Skip to content

handlers: PermitPlace injection so the Grand Gaia world map renders - #41

Open
Seltraeh wants to merge 1 commit into
decompfrontier:devfrom
Seltraeh:split/12-quest-map
Open

handlers: PermitPlace injection so the Grand Gaia world map renders#41
Seltraeh wants to merge 1 commit into
decompfrontier:devfrom
Seltraeh:split/12-quest-map

Conversation

@Seltraeh

@Seltraeh Seltraeh commented Aug 5, 2026

Copy link
Copy Markdown
Contributor

handlers: PermitPlace injection so the Grand Gaia world map renders

Branch: split/12-quest-map
Base: dev
Merge position: 12 of 13

Part of the PR #28 split. Each PR branches from dev and contains only its
own changes, so this diff is exactly one subsystem. The set is designed to be
merged in numeric order; merging all 13 reproduces PR #28 byte for byte
(verified against tree 79a4e065).

Later PRs in the series touch Handlers.hpp, GmeControllerHandlers.cpp and
UserInfo.cpp too, so once earlier ones land this branch may need a rebase.
Those conflicts are always additions on both sides — keep both. Maintainer
edits are enabled, so feel free to push the rebase directly to this branch.

Isolated deliberately — this is the change most likely to draw an objection, and I didn't want it blocking the campaign work.

What it does

Injects PermitPlace unlock data into the serialised UserInfo response so the Grand Gaia world map renders and is navigable.

Why it's a string replace

The generated PermitPlace struct is a stub with an INVALID key, so there is no typed path to populate it. The empty serialised array is located and replaced in place instead. If the token isn't found the injection is skipped with a LOG_WARN rather than corrupting the buffer, so a schema change degrades instead of breaking.

I'm not attached to the mechanism — if there's a way to make the generated struct carry this, I'd rather do that. But I couldn't find one that produces the wire shape the client accepts.

Why the categories are tuned differently

They serve different purposes and cannot be set uniformly:

  • Areas are the mission-parent topology link and must stay full. Narrowing them leaves every land rendering empty and crashing on click.
  • Lands act as the cutscene gate — each visible land plays its intro on first entry — so they're held at 1-2.
  • Gates, missions, dungeons are availability flags only and are left full.

The client silently ignores entries for ids absent from its local MST, which is why the ranges are generous.

Verification

Grand Gaia loads; Mistral renders with areas visible; missions are clickable.

Injects PermitPlace unlock data into the serialised UserInfo response so the
Grand Gaia world map renders and is navigable.

The generated PermitPlace struct is a stub with an INVALID key, so the empty
serialised array is located and replaced in place rather than populated
through the struct.

The five categories serve different purposes and cannot be tuned uniformly.
Areas are the mission-parent topology link and must stay full: narrowing them
leaves every land rendering empty and crashing on click. Lands act as the
cutscene gate, since each visible land plays its intro on first entry, so they
are held at 1-2. Gates, missions and dungeons are availability flags only and
are left full. The client silently ignores entries for ids absent from its
local MST.

If the token is not found the injection is skipped with a warning rather than
corrupting the buffer, so a schema change degrades instead of breaking.
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

Successfully merging this pull request may close these issues.

1 participant