nulltask / nulltask/be-music

Implement the P.ATTACK / G.ATTACK gauge types (LR2)

Open
#142 0 comments 0 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

enhancement
Dominant language
TypeScript
Stars
15
Forks
1
Avg merge
1d 4h
Merged PRs (30d)
29

Description

Context

Found by reverse-engineering the actual LR2 (LR2body.exe, beta3) shipped files. LR2's gauge list is larger than what we model.

First-party evidence

  • LR2files/Config/optionstr.csv: #GAUGE,GROOVE,SURVIVAL,DEATH,EASY,P.ATTACK,G.ATTACK — LR2 offers six gauges.
  • history.txt (080313): "ゲージオプションに、PERFECT ATTACKとGOOD ATTACKを追加しました。… PAはGOOD以下で閉店し、黄GREATで少量ゲージが減少します。GAは黄GREATで少量、光GREATでPOORと同量ゲージが減少します。クリアはハードクリア扱いとなります。"
    • P.ATTACK: fails (closes) on GOOD-or-worse; a non-PGREAT GREAT drains a small amount.
    • G.ATTACK: a non-PGREAT GREAT drains a small amount, a PGREAT-flagged GREAT drains the same as a POOR. Clear counts as a HARD clear.

Naming note

Our GrooveGaugeType uses HARD / DEATH; LR2 calls these SURVIVAL / DEATH. Worth aligning the labels (or at least documenting the mapping) when adding the new types.

Current behavior

packages/player/src/core/groove-gauge.ts models GROOVE / HARD (= LR2 SURVIVAL) / DEATH / EASY only. P.ATTACK and G.ATTACK are absent.

Notes

  • The engine currently only exercises GROOVE (gauge-type selection isn't user-exposed yet), so this is gated on gauge-type selection landing first.
  • The binary's gauge constant pool (.rdata ~0x744830) contains unmodeled values (0.048, 0.12, -3.0, ...) that likely belong to these gauges; map them via xref when implementing.

Contributor guide

No contributing guide indexed for this repository

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

Research direction

Start with packages/player/src/core/groove-gauge.ts and confirm how the existing GROOVE, HARD, DEATH, and EASY types update and clear. Use the LR2 evidence in LR2files/Config/optionstr.csv and history.txt, then trace references to the binary gauge constants near .rdata ~0x744830. Done means P.ATTACK and G.ATTACK are modeled with the documented drain, failure, and HARD-clear behavior, with the HARD/SURVIVAL naming mapping addressed.

Written by the indexing model from the issue text.

Assessment

Tech stack
typescript
Domain
game-dev
Issue type
Feature
Difficulty
4/5
Estimated time
3-5 days
Activity status
Quiet
Clarity
Mostly clear
Newbie friendliness
38/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.