Nachlese zu #21: vier tote Stellen im Produktcode, ein Solver-Aufruf mit falscher Bedeutung – und zwei CJK-Zeichen im ausgelieferten Dokument #28
Labels
No labels
accessibility
bug
cleanup
consistency
crash
critical
game-feel
gameplay
high
input
level-generation
low
maintainability
medium
pause
physics
responsive
security
spec-gap
ui
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set
Reference
gilli/pulse-sprint#28
Loading…
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Komponente: GAME (
S2800,el-Liste 2786,updateDemo3383/3403), RENDER (poseFor2210),CORE (
verifyContent1555 →strategyList1471–1489), Kommentar Zeile 1482Betroffene Version:
main@86a481d,index.html(3.684 Zeilen, MD5777d18c3edbb834aa41fccc7d10a7d18)Beschreibung
Issue #21 hat 14 Fundstellen „Flag ohne Setzer / Zustand ohne Leser“ bereinigt. Sechs weitere
Fundstellen derselben Klasse sind übrig — fünf tote Stellen und ein Aufruf, der ein Argument mit
anderer Bedeutung füttert. Dazu kommt ein Textdefekt im ausgelieferten Dokument.
Alle sieben Punkte sind ausgeführt bzw. per Skript gegen das Dokument geprüft (Schreib-/Lesezähler
über
index.html, kein Verdacht ohne Zähler):S.shakePhase: 0(Zeile 2800)shakePhasekommt genau einmal vor)"hudSector"in derel-Liste (Zeile 2786)el.hudSector(gelesen werdenhudSectorCap,hudSectorName,hudSectorNo,hudEndless)state === "DEMO"inposeFor(Zeile 2210)"DEMO":drawBody(3524–3545) mapptSLACK → "FALLING", Tod →"DEAD", sonstb.state;b.statenimmt nurRUNNING/JUMPING/FALLING/ROLLING/HANGING/SLACKeinS.distance = before === undefined ? 0 : …inupdateDemo(Zeile 3403)const before = d.body.x;(Zeile 3383) ist immer definiert; der Ternary ist dauerhaft im zweiten Zweig undbeforewird sonst nirgends benutzt — die Zeile tut exakt dasselbe wieS.distance = Math.max(0, (d.body.x − K.START_X) / 10)strategyList(hasHooks, content.obstacles.length > 0)inverifyContent(Zeile 1555)hasGates(Zeile 1471) und entscheidetrollLeads = hasGates ? ROLL_LEADS : [110]. EinJUMP-Muster ohne Tor sagttrueund bekommt alle dreiROLL_LEADS(52/110/168) — 54 Solver-Versuche statt 18, alle mit identischem Ergebnis, weil ohne Tor niemand eine Rolle auslöstdamit es auf Touch-Geräten同样 spielbar ist.U+540C,U+6837) mitten im deutschen Satz, ohne Leerzeichen an „Geräten“ü ä ö ß · – — × „ “ − √ → ° ≥ ± ∞die gesamten Nicht-Latin-Zeichen des Dokuments — mit Ausnahme der beiden Ideogramme aus Punkt 6Zählprobe (Skript, gegen
index.html)Ursache im Code
1.–4. sind Reste früherer Umbauten: Feld im State-Literal angelegt und nie benutzt (#21 hat genau
diese Klasse entfernt, hier nur für
S.paused/S.newRecord), Element-Liste mitwachsen lassen,Pose-Zustand für eine Demo erfunden, die später über
simStepDemo/autopilotläuft (Issue #15),und ein Ternary, dessen Null-Fall durch eine spätere Zeilen-Umstellung unerreichbar wurde.
strategyListbekommt an der einzigenAufrufstelle ein Mengenmaß (
obstacles.length > 0) für ein Typprädikat (hasGates).6./7. sind ein Kippfehler beim Tippen des Kommentars zu Issue #22 — in einer Datei, die laut
AGENTS.md „kein Build, keine Tooling-Artefakte“ ist und deren sichtbare Texte Deutsch, deren
Kommentare ebenfalls Deutsch sind.
Folgeverhalten
einfordern: ein Leser darf sich darauf verlassen können, dass ein Feld im State-Literal einen
Grund hat, eine
el-Liste nur Existsierendes enthält und eine Pose nur Zustände kennt, diejemand übergibt.
Tor. Der Generierungs-Aufwand ist gemessen p99 6,7 ms / Spitze 12,6 ms pro
generateAhead-Aufruf(
issues/README.md, „Bestätigt in Ordnung“) — ein Drittel dieser Versuche ist hier unnütz.kaputte Zeile auf; in Diff-Werkzeugen mit Narrow-Width-Annahme verrutscht die Spalte.
Nicht verletzt (bewusst abgegrenzt)
statt sieben.
body.dead,o.dead,S.paused,S.newRecord,pit.double,ev.releaseTheta,ev.leftGround,gen.stats.attempted,gen.lastPitHook,hooks.onPointerkommen im Dokument 0-mal vor (tests/issue9.mjsprüft das).pit.platformundINPUT.state.anyPointerDownbleiben die dokumentierten Test-APIs (#21).Lösungsvorschlag
S.shakePhasestreichen;S.camShakeist die einzige Kamera-Schüttel-Größe (renderzeichnet daraus
shakeX/shakeY,updatezählt es herunter)."hudSector"aus derel-Liste nehmen (das Markup behält dieid, sie ist CSS-Anker)."DEMO"-Zweig inposeForstreichen oder — wenn die Demo künftig eine eigene Pose bekommensoll — als dokumentierte, gebundene Möglichkeit kommentieren (wie
pit.platformin #21).updateDemo:S.distance = Math.max(0, (d.body.x - K.START_X) / 10);undconst before = …entfernen.
verifyContent:const hasGates = content.obstacles.some(o => o.type === "GATE" || o.type === "MGATE");und das an
strategyListübergeben — ein Prädikat, kein Mengenmaß.damit es auf Touch-Geräten同样 spielbar ist.→damit es auf Touch-Geräten ebenso spielbar ist.Erwarteter Test
tests/issue9.mjs(die Suite hält bereits die Schreib-/Lesekontrolle zu #21) die Whitelistder gestrichenen Bezeichner erweitern:
shakePhase,DEMOals Pose-Zustand,beforeinupdateDemo— jeweils 0-mal im Dokument.tests/browser_smoke.py(liest ohnehin dasAuslieferungsdokument): keine Zeichen außerhalb von Latin + den dokumentierten Satzzeichen
(En-dash, Em-dash, „ “, ·, ×, −, √, →, °, ≥, ±, ∞) im Dokument. Damit ist auch jede künftige CJK-Einsprengsel rot, bevor sie
eingecheckt wird.
Dokumentiert in
issues/28-nachlese-21-tote-stellen-und-cjk-im-dokument.md(Commit86a481d).