Skip to content

feat(lighting): make colored portal art emit matching light #86

Description

@zoeyrose

Important

Evidence policy update (2026-08-11): #66 is complete through #124; any wording
below treating it as a future prerequisite is superseded. #126/#127 retire the
committed renderer-review capture surface. The removed files were generated
review artifacts, not authored gameplay art. Any requirement below to commit
rendered screenshots, contact sheets, manifests, proof maps, or capture tooling
is superseded. Keep authored semantic review in
maps/light-source-review.json (rationales, current digests, complete coverage,
and zero unreviewed emitters). Optional smooth/discrete diagnostics belong only
under ignored build/ or deployment output; summarize conclusions in the PR,
but never commit or gate merge on those files.

Follow-up to #65 and its implementation in #67, with the compatible main integration tracked by #66.

Outcome

Make colored portal art emit a small, matching light in every active context, covering both the dedicated portal archetypes and map-authored exits that replace their animation with a portal_* animation.

This is deliberately separate from #65: that issue audits and colors effective nonzero emitters, while most of these portal objects have no radius and therefore do not emit today.

Evidence

The dedicated family has 19 direct authored placements across eight maps, all without an effective radius:

Archetype Direct placements Established palette direction
portal_azure 1 60d0ff crystal cyan
portal_big 13 4060ff forcefield blue
portal_green 3 40ff60 forcefield green
portal_red 0 ff3030 emissive red
portal_yellow 2 ffe060 forcefield yellow
perm_magic_portal 0 static; spawned by town portal reviewed cyan or arcane entry

Maps also contain 37 generic exit/exit_green objects across 19 maps that render colored portal animations: ten big, nine red, eight azure, six yellow, and four green. Thirty-six have no radius; one red portal has radius 9 but remains neutral. None has a map-local color override. The 23 based on exit_green would inherit green if a radius were added without respecting their replacement animation, while the 14 based on exit have no color supplier.

Together, direct and custom-animation portals touch 26 unique maps. Twenty of the custom exits are the four colored links on the Wizards' Tower hub and four floors, so this work must coordinate with #80 rather than layering conflicting ambient pools there.

Scope

  • Add the smallest rendered-effective default radius and matching color to the six dedicated portal archetypes.
  • Add map-local radius and color overrides to generic exits only where they render a portal_* animation. Do not add a global radius to exit or exit_green as part of this issue.
  • Use the established chore(maps): audit authored light-source colors #65 palette where possible and require rendered comparison for the permanent town portal.
  • Review all active, inactive, hidden, creator/duplicator, and script-controlled states. An invisible or disabled portal must not leak light before it appears.
  • Reconcile co-located neutral light7/light9 sources deliberately; retain them only when they still serve independent ambient or navigation purposes.
  • Preserve teleport destinations, timing, scripts/events, walk/fly triggers, player-only behavior, sounds, zoom/alignment, and every other gameplay field.
  • Preserve main-only plural-name fields while delivering the compatible archetype changes across release lines.

Acceptance criteria

  • Azure, blue, green, red, and yellow portal art emits a small distinguishable matching light when active.
  • The town-portal spell's persistent portal has a reviewed color and radius and retains its full create/use/expire behavior.
  • Custom portal-animation exits match the rendered animation rather than their generic base archetype.
  • Hidden creator/duplicator prototypes and disabled portal states do not leak illumination.
  • Wizards' Tower portal lighting is coordinated with feat(maps): give Wizards' Tower floors distinct ambient palettes #80, with no double-light clipping or palette conflict.
  • Existing ambient lights are retained, adjusted, or removed only with context-specific rendered evidence.
  • Teleport behavior, destinations, timing, events, sounds, triggers, and non-light fields remain unchanged.
  • Every affected source and map is checked in smooth and discrete Classic lighting.
  • The chore(maps): audit authored light-source colors #65 inventory, review records, source/map semantic digests, evidence manifest, and affected rendered evidence are refreshed.
  • python3 tools/world_content_audit.py lights --check, python3 tools/validate.py, and git diff --check pass.

Release lines

Land only after #65/#67 are integrated on 1.x and #66 supplies the matching field/audit contract on main. Deliver compatible authored changes through separate linked pull requests. The canonical main pull request closes this issue; the 1.x companion links the issue and canonical PR without a closing keyword. Classic 1.x owns runtime rendering evidence; validate the authored mirror independently on main, or document a concrete compatibility exception.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Fields

Priority

None yet

Start date

None yet

Target date

None yet

Effort

None yet

Projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions