Remove m_HoldNote array entirely. Remove 2sAnd3s. Store hold note
durations in the hold head. hold_tail only still exists when InsertHoldTails
is used, to make SM parsing a little easier (may go away). Add helpers
for iterating over ranges while including or excluding adjacent and overlapping
hold notes. Range operations are now [start,end) instead of [start,end].
(probably more details coming to sm-dev soon)
Maybe we should stop calling note indexes "rows" and "indexes", and just
call them "beats"; if they're stored as an integer, they're in fixed-point. Things
like "note rows per second" are a lot less intuitive than just calling them "beats
per second".
data into TapNote and HoldNote. This reduces lookup costs significantly.
It's a bit simpler, though I'm not entirely happy with the resulting encapsulation ...
Have gameplay objects hold a PlayerState pointer instead of a PlayerNumber and indexing back into GameState.
This will simplify off-screen players (e.g. CPU ghosts, network replicated human players, >2 players using one NoteField)
store attack info in TapNote
in the SMNoteData string, store the attack params inline (like with keysounds)
play keysounds when hit
still doesn't play keysounds on a miss
still doesn't play autoKeysounds
re-configured for each arrow/hold part. Cache each object, so we don't
waste memory with duplicate actors; multiplied by NOTE_COLOR_IMAGES
for each player, this adds up quite a bit.
instead of moving HoldNote::iStartRow forward while a hold note is
held, set HoldNoteResult::iLastHeldRow
fixes hold heads cycling through all note colors while held (wasn't very
visible due to the hold ghost) and GetSuccessfulHands bugs