re: the objective/tutorial marker records; S24-S29 are CHALLENGE, not story
Correction first. stage-numbering-and-player-craft.md called S24-S29 'story' and reported 22 story stages. challenge-mission-gate.md OWNS that split and already had it: S01-S16 story, S18-S23 tutorials, S24-S29 challenge. A third confirmation fell out of this iteration: AUTO_SETTINGS names stage01..16_settings.tbl, tutorial01..06 and challenge01..06, and its field tags are 1-16, 18-23, 24-29 -- the shipped stage numbers exactly. The campaign is 16 story missions, not 22. AUTO_SETTINGS and IGNORE are likewise already owned by isl-condition-builtins.md, so nothing there was new either. What is new: the 11 marker records hud-config.md listed as unread. 12 named fields each, portable HUD data. Colour is ARGB, three per marker -- objectives red 0xFFFF0000, guard/waypoint green 0xFF20FF20, Acropolis/tanker cyan 0xFF00FFFF, sub-objective yellow 0xFFFFFF00, and every TutorialMarker_* amber 0xFFFFA010. Each carries a Normal sprite and an Emphasis part with optional Sub companions; HPGauge 0/1/2; RadarCursorType Circle/Rectangle/blank; BlinkCycle 0x800 on all eleven. TutorialTarget is Yes on exactly the five TutorialMarker_* and No on the six ObjectiveMarker_*. Parameters binds the roles: TargetMarker -> ObjectiveMarker_Target, HelpMarker -> ObjectiveMarker_SubObjective, TutoTargetMarker -> TutorialMarker_Target, plus ReloadDispTime 0.1. Enumerate_ObjectiveMarkers is the 11-name roster. Artefact +13 lines / 0 deletions; the other nine regenerate byte-identical.
This commit is contained in:
@@ -827,6 +827,40 @@ unknown, what evidence exists, and what the first step would be. Move an item in
|
|||||||
field; the stat keys in records not opened here (`MegaTons`, `BulletLimit`,
|
field; the stat keys in records not opened here (`MegaTons`, `BulletLimit`,
|
||||||
`CrewCount`, `HP_CLASS`); why the roster lists 59 of 131.
|
`CrewCount`, `HP_CLASS`); why the roster lists 59 of 131.
|
||||||
|
|
||||||
|
* ✅❌ **(2026-08-27) THE OBJECTIVE/TUTORIAL MARKER RECORDS — and a CORRECTION:
|
||||||
|
S24-S29 are the CHALLENGE missions, not story.**
|
||||||
|
[structures/hud-config](structures/hud-config.md),
|
||||||
|
[structures/stage-numbering-and-player-craft](structures/stage-numbering-and-player-craft.md),
|
||||||
|
artefact `data/hud-config.txt` (+13 lines, 0 deletions — purely additive).
|
||||||
|
❌ **Correction first.** `stage-numbering-and-player-craft.md` called S24-S29
|
||||||
|
"story" and reported "22 story stages". **`challenge-mission-gate.md` OWNS that
|
||||||
|
split and already had it**: `S01-S16` story, `S18-S23` tutorials, **`S24-S29`
|
||||||
|
challenge**. A third confirmation fell out of this iteration's reading:
|
||||||
|
**`AUTO_SETTINGS` names `stage01..16_settings.tbl`,
|
||||||
|
`tutorial01..06_settings.tbl`, `challenge01..06_settings.tbl` — and its field
|
||||||
|
tags are 1-16, 18-23, 24-29**, the shipped stage numbers exactly. The campaign
|
||||||
|
is **16** story missions, not 22. (Fourth time the grep-the-owning-doc rule has
|
||||||
|
caught me; `AUTO_SETTINGS` and `IGNORE` are likewise already owned by
|
||||||
|
`isl-condition-builtins.md`, so nothing there was new either.)
|
||||||
|
✅ **What IS new**: the 11 **marker records** `hud-config.md` listed as unread.
|
||||||
|
12 named fields each, and portable HUD data. **Colour is ARGB, three per
|
||||||
|
marker** (`ColorNormal`, `ColorEmphasis1`, `ColorEmphasis2`): objectives
|
||||||
|
**red** `0xFFFF0000`, guard/waypoint **green** `0xFF20FF20`, Acropolis/tanker
|
||||||
|
**cyan** `0xFF00FFFF`, sub-objective **yellow** `0xFFFFFF00`, and every
|
||||||
|
`TutorialMarker_*` **amber** `0xFFFFA010`. Each carries a `Normal` sprite and
|
||||||
|
an `Emphasis` part with optional `…Sub` companions; `HPGauge` 0/1/2;
|
||||||
|
`RadarCursorType` `Circle` (Acropolis, tanker) / `Rectangle` (guard) / blank;
|
||||||
|
`BlinkCycle` `0x800` on all eleven. `TutorialTarget` is `Yes` on exactly the
|
||||||
|
five `TutorialMarker_*` and `No` on the six `ObjectiveMarker_*`.
|
||||||
|
✅ **`Parameters` binds the roles**: `TargetMarker` -> `ObjectiveMarker_Target`,
|
||||||
|
`HelpMarker` -> `ObjectiveMarker_SubObjective`, `TutoTargetMarker` ->
|
||||||
|
`TutorialMarker_Target`, plus `ReloadDispTime 0.1`.
|
||||||
|
✅ **`Enumerate_ObjectiveMarkers`** is the 11-name roster of the set — the same
|
||||||
|
shape as `Enumerate_Squadrons` in `unit-group-table.md`.
|
||||||
|
⚠️ `pgmark_em_ob_s.prt` appears here and is one of the 28 names
|
||||||
|
`archive-naming.md` shows resolving nowhere — consistent with the namespace
|
||||||
|
finding, not a missing asset.
|
||||||
|
|
||||||
* ✅ **(2026-08-27) `CoverArea` IS A 6-BIT MOUNT MASK — plus the three other
|
* ✅ **(2026-08-27) `CoverArea` IS A 6-BIT MOUNT MASK — plus the three other
|
||||||
turret leftovers, all closed.**
|
turret leftovers, all closed.**
|
||||||
[structures/unit-substructure-records](structures/unit-substructure-records.md),
|
[structures/unit-substructure-records](structures/unit-substructure-records.md),
|
||||||
|
|||||||
@@ -688,6 +688,19 @@
|
|||||||
HudResource_S26.tbl no hit
|
HudResource_S26.tbl no hit
|
||||||
HudMarkerResource_S26.tbl no hit
|
HudMarkerResource_S26.tbl no hit
|
||||||
|
|
||||||
|
## the objective / tutorial MARKER records
|
||||||
|
ObjectiveMarker_Acropolis BlinkCycle=0x800 ColorEmphasis1=0xFFB0FFFF ColorEmphasis2=0xFF00E0FF ColorNormal=0xFF00FFFF Emphasis=pgmark_em_ho.prt EmphasisSub= HPGauge=1 HPGaugeSub=0 Normal=pgmark_ho.t32 NormalSub= RadarCursorType=Circle TutorialTarget=No
|
||||||
|
ObjectiveMarker_SubObjective BlinkCycle=0x800 ColorEmphasis1=0xFFFFFFD0 ColorEmphasis2=0xFFFFFF00 ColorNormal=0xFFFFFF00 Emphasis= EmphasisSub= HPGauge=2 HPGaugeSub=0 Normal=pgmark_help.prt NormalSub=pgmark_help_s.prt RadarCursorType= TutorialTarget=No
|
||||||
|
ObjectiveMarker_Guard BlinkCycle=0x800 ColorEmphasis1=0xFF60FF60 ColorEmphasis2=0xFFC0FFC0 ColorNormal=0xFF20FF20 Emphasis=pgmark_em_ga.prt EmphasisSub= HPGauge=1 HPGaugeSub=0 Normal=pgmark_ga.t32 NormalSub= RadarCursorType=Rectangle TutorialTarget=No
|
||||||
|
TutorialMarker_WayPoint BlinkCycle=0x800 ColorEmphasis1=0xFF60FF60 ColorEmphasis2=0xFFC0FFC0 ColorNormal=0xFF20FF20 Emphasis= EmphasisSub= HPGauge=0 HPGaugeSub=0 Normal=pgmark_ld.t32 NormalSub= RadarCursorType= TutorialTarget=No
|
||||||
|
TutorialMarker_NoMark BlinkCycle=0x800 ColorEmphasis1=0xFFFFA010 ColorEmphasis2=0xFFFFD090 ColorNormal=0xFFFFA010 Emphasis= EmphasisSub= HPGauge=2 HPGaugeSub=0 Normal= NormalSub= RadarCursorType= TutorialTarget=Yes
|
||||||
|
TutorialMarker_Tanker BlinkCycle=0x800 ColorEmphasis1=0xFFFFA010 ColorEmphasis2=0xFFFFD090 ColorNormal=0xFFFFA010 Emphasis=pgmark_em_ta.prt EmphasisSub= HPGauge=2 HPGaugeSub=0 Normal=pgmark_ta.t32 NormalSub= RadarCursorType= TutorialTarget=Yes
|
||||||
|
TutorialMarker_Target BlinkCycle=0x800 ColorEmphasis1=0xFFFFA010 ColorEmphasis2=0xFFFFD090 ColorNormal=0xFFFFA010 Emphasis=pgmark_em_ob.prt EmphasisSub=pgmark_em_ob_s.prt HPGauge=2 HPGaugeSub=0 Normal=pgmark_ob.t32 NormalSub=pgmark_ob_s.t32 RadarCursorType= TutorialTarget=Yes
|
||||||
|
ObjectiveMarker_WayPoint BlinkCycle=0x800 ColorEmphasis1=0xFF60FF60 ColorEmphasis2=0xFFC0FFC0 ColorNormal=0xFF20FF20 Emphasis=pgmark_em_wp.prt EmphasisSub= HPGauge=0 HPGaugeSub=0 Normal=pgmark_wp.t32 NormalSub= RadarCursorType= TutorialTarget=No
|
||||||
|
ObjectiveMarker_Tanker BlinkCycle=0x800 ColorEmphasis1=0xFFB0FFFF ColorEmphasis2=0xFF00E0FF ColorNormal=0xFF00FFFF Emphasis=pgmark_em_ta.prt EmphasisSub= HPGauge=2 HPGaugeSub=0 Normal=pgmark_ta.t32 NormalSub= RadarCursorType=Circle TutorialTarget=No
|
||||||
|
TutorialMarker_Acropolis BlinkCycle=0x800 ColorEmphasis1=0xFFFFA010 ColorEmphasis2=0xFFFFD090 ColorNormal=0xFFFFA010 Emphasis=pgmark_em_ho.prt EmphasisSub= HPGauge=1 HPGaugeSub=0 Normal=pgmark_ho.t32 NormalSub= RadarCursorType= TutorialTarget=Yes
|
||||||
|
ObjectiveMarker_Target BlinkCycle=0x800 ColorEmphasis1=0xFFFF0000 ColorEmphasis2=0xFF800000 ColorNormal=0xFFFF0000 Emphasis=pgmark_em_ob.prt EmphasisSub=pgmark_em_ob_s.prt HPGauge=2 HPGaugeSub=0 Normal=pgmark_ob.t32 NormalSub=pgmark_ob_s.t32 RadarCursorType= TutorialTarget=No
|
||||||
|
|
||||||
## ResourceTable -- 29 pairs, one per stage, with a single override
|
## ResourceTable -- 29 pairs, one per stage, with a single override
|
||||||
GP_MAIN_GAME_D2D.pak 58 fields = 29 pairs ; non-default at [(50, 'HudResource_S26.tbl'), (51, 'HudMarkerResource_S26.tbl')]
|
GP_MAIN_GAME_D2D.pak 58 fields = 29 pairs ; non-default at [(50, 'HudResource_S26.tbl'), (51, 'HudMarkerResource_S26.tbl')]
|
||||||
GP_MAIN_GAME_E2D.pak 58 fields = 29 pairs ; non-default at [(50, 'HudResource_S26.tbl'), (51, 'HudMarkerResource_S26.tbl')]
|
GP_MAIN_GAME_E2D.pak 58 fields = 29 pairs ; non-default at [(50, 'HudResource_S26.tbl'), (51, 'HudMarkerResource_S26.tbl')]
|
||||||
|
|||||||
@@ -60,11 +60,52 @@ and index 25 is **S26 — the one stage with its own HUD configuration**. The
|
|||||||
arithmetic is exact and the `_S26` suffix names the same stage, but nothing here
|
arithmetic is exact and the `_S26` suffix names the same stage, but nothing here
|
||||||
proves the indexing, so this is **a reading, not adopted**.
|
proves the indexing, so this is **a reading, not adopted**.
|
||||||
|
|
||||||
|
## ✅ The objective / tutorial MARKER records
|
||||||
|
|
||||||
|
`hud-config.md` listed these as "in the artefact but unread". Opened now — and
|
||||||
|
they are portable HUD data, 11 records of **12 named fields** each:
|
||||||
|
|
||||||
|
```
|
||||||
|
ObjectiveMarker_Target ColorNormal 0xFFFF0000 Emph1 0xFFFF0000 Emph2 0xFF800000
|
||||||
|
Normal pgmark_ob.t32 NormalSub pgmark_ob_s.t32
|
||||||
|
Emphasis pgmark_em_ob.prt EmphasisSub pgmark_em_ob_s.prt
|
||||||
|
HPGauge 2 HPGaugeSub 0 BlinkCycle 0x800
|
||||||
|
RadarCursorType (blank) TutorialTarget No
|
||||||
|
```
|
||||||
|
|
||||||
|
* **Colour is ARGB**, three per marker: `ColorNormal`, `ColorEmphasis1`,
|
||||||
|
`ColorEmphasis2`. Objectives are **red** `0xFFFF0000`, guard/waypoint **green**
|
||||||
|
`0xFF20FF20`, Acropolis/tanker **cyan** `0xFF00FFFF`, sub-objective **yellow**
|
||||||
|
`0xFFFFFF00`, and every `TutorialMarker_*` is **amber** `0xFFFFA010`.
|
||||||
|
* Each marker carries a `Normal` sprite and an `Emphasis` part, optionally with
|
||||||
|
`…Sub` companions; `HPGauge` is 0 / 1 / 2; `RadarCursorType` is `Circle`
|
||||||
|
(Acropolis, tanker), `Rectangle` (guard) or blank; `BlinkCycle` is `0x800`
|
||||||
|
on all eleven.
|
||||||
|
* `TutorialTarget` is `Yes` on exactly the five `TutorialMarker_*` records and
|
||||||
|
`No` on the six `ObjectiveMarker_*` — the two families are otherwise the same
|
||||||
|
shape.
|
||||||
|
|
||||||
|
**`Parameters` (4 fields) binds the roles**:
|
||||||
|
|
||||||
|
```
|
||||||
|
TargetMarker ObjectiveMarker_Target
|
||||||
|
HelpMarker ObjectiveMarker_SubObjective
|
||||||
|
TutoTargetMarker TutorialMarker_Target
|
||||||
|
ReloadDispTime 0.1
|
||||||
|
```
|
||||||
|
|
||||||
|
**`Enumerate_ObjectiveMarkers`** is the 11-name roster of the set — the same
|
||||||
|
shape as the `Enumerate_Squadrons` record [unit-group-table](unit-group-table.md)
|
||||||
|
uses.
|
||||||
|
|
||||||
|
⚠️ `pgmark_em_ob_s.prt` here is one of the 28 names
|
||||||
|
[archive-naming](archive-naming.md) shows resolving nowhere — consistent with
|
||||||
|
the namespace finding, not a missing asset.
|
||||||
|
|
||||||
## 🟡 Not settled
|
## 🟡 Not settled
|
||||||
|
|
||||||
* How the 2D pak's 574 T8aD and 130 RATC entries *are* addressed, if not by
|
* How the 2D pak's 574 T8aD and 130 RATC entries *are* addressed, if not by
|
||||||
`name_hash` of the config path. That is now the question.
|
`name_hash` of the config path. That is now the question.
|
||||||
* What `HudMarkerResource.tbl` is — presumably the 13-record marker entry, but
|
* What `HudMarkerResource.tbl` is — presumably the 13-record marker entry, but
|
||||||
the filename does not resolve, so the pairing is by content, not by hash.
|
the filename does not resolve, so the pairing is by content, not by hash.
|
||||||
* `Parameters` (4 fields) and `Enumerate_ObjectiveMarkers` (11) are in the
|
* ~~`Parameters` and `Enumerate_ObjectiveMarkers` unread.~~ **Opened above.**
|
||||||
artefact but unread here.
|
|
||||||
|
|||||||
@@ -13,13 +13,23 @@
|
|||||||
The disc's stage numbers are not 1…28:
|
The disc's stage numbers are not 1…28:
|
||||||
|
|
||||||
```
|
```
|
||||||
S01 … S16 story (16)
|
S01 … S16 story (16)
|
||||||
S17 ABSENT
|
S17 ABSENT
|
||||||
S18 … S23 the tutorials (6) -- exactly the six with no AIParams_SNN.tbl
|
S18 … S23 the tutorials (6) -- exactly the six with no AIParams_SNN.tbl
|
||||||
S24 … S29 story (6)
|
S24 … S29 CHALLENGE (6)
|
||||||
== 28 shipped, 22 of them story
|
== 28 shipped
|
||||||
```
|
```
|
||||||
|
|
||||||
|
> ❌ **CORRECTION (2026-08-27, same day).** This page first called S24–S29
|
||||||
|
> "story", giving "22 story stages". They are the **challenge** missions —
|
||||||
|
> [challenge-mission-gate](../challenge-mission-gate.md) owns that split and had
|
||||||
|
> it already (`S01–S16` story, `S18–S23` tutorials, `S24–S29` challenge). A third
|
||||||
|
> confirmation turned up while reading `AUTO_SETTINGS`: it names
|
||||||
|
> `stage01…16_settings.tbl`, `tutorial01…06_settings.tbl`,
|
||||||
|
> `challenge01…06_settings.tbl` — **and its field tags are 1–16, 18–23, 24–29**,
|
||||||
|
> the shipped stage numbers exactly. So the campaign is **16** story missions,
|
||||||
|
> not 22.
|
||||||
|
|
||||||
Measured by hashing `stage\UnitGroup_S%02d.tbl` and `stage\AIParams_S%02d.tbl`
|
Measured by hashing `stage\UnitGroup_S%02d.tbl` and `stage\AIParams_S%02d.tbl`
|
||||||
for N = 0…39 against `GP_MAIN_GAME_E.pak`. Artefact `../data/stage-numbering.txt`,
|
for N = 0…39 against `GP_MAIN_GAME_E.pak`. Artefact `../data/stage-numbering.txt`,
|
||||||
regenerator `tools/re-capture/stage_numbering.py`.
|
regenerator `tools/re-capture/stage_numbering.py`.
|
||||||
|
|||||||
@@ -62,6 +62,18 @@ def main():
|
|||||||
for n in list(DEFAULT) + ['HudResource_S26.tbl', 'HudMarkerResource_S26.tbl']:
|
for n in list(DEFAULT) + ['HudResource_S26.tbl', 'HudMarkerResource_S26.tbl']:
|
||||||
print(" %-30s %s" % (n, 'resolves' if any(U.name_hash(q + n) in H for q in PRE) else 'no hit'))
|
print(" %-30s %s" % (n, 'resolves' if any(U.name_hash(q + n) in H for q in PRE) else 'no hit'))
|
||||||
|
|
||||||
|
print("\n## the objective / tutorial MARKER records")
|
||||||
|
seen = set()
|
||||||
|
for h, b in pak_entries(p2):
|
||||||
|
if b[:4] != b'IDXD': continue
|
||||||
|
for r in U.parse(b):
|
||||||
|
sq = r['squadron']
|
||||||
|
if not (sq.startswith('ObjectiveMarker_') or sq.startswith('TutorialMarker_')): continue
|
||||||
|
if sq in seen: continue
|
||||||
|
seen.add(sq)
|
||||||
|
n = U.named(r)
|
||||||
|
print(" %-30s %s" % (sq, " ".join("%s=%s" % (k, v) for k, v in sorted(n.items()))))
|
||||||
|
|
||||||
print("\n## ResourceTable -- 29 pairs, one per stage, with a single override")
|
print("\n## ResourceTable -- 29 pairs, one per stage, with a single override")
|
||||||
for pk in sorted(glob.glob('/work/sylph_extract/**/GP_MAIN_GAME_*2D.pak', recursive=True)):
|
for pk in sorted(glob.glob('/work/sylph_extract/**/GP_MAIN_GAME_*2D.pak', recursive=True)):
|
||||||
for h, b in pak_entries(pk):
|
for h, b in pak_entries(pk):
|
||||||
|
|||||||
Reference in New Issue
Block a user