1
0
mirror of https://github.com/ppy/osu.git synced 2024-11-16 14:17:27 +08:00
Commit Graph

2478 Commits

Author SHA1 Message Date
Dan Balasescu
4e3b994142
Relocate HitResult numeric score to ScoreProcessor 2023-12-21 14:52:31 +09:00
Bartłomiej Dach
8c06d3873d
Merge branch 'master' into mania-scorev2-values 2023-12-20 15:54:31 +01:00
Dan Balasescu
bff08d124b
Remove mania mod multiplier for DT/NC 2023-12-20 22:28:50 +09:00
Dean Herbert
e0c27510f2
Remove remaining usage of NotePerfectBonus 2023-12-20 19:47:36 +09:00
Dan Balasescu
023bbda7db
Change mania to 85% acc / 15% combo 2023-12-20 18:43:06 +09:00
Dan Balasescu
104fbbde94
Change mania scoring to match ScoreV2 2023-12-20 18:35:45 +09:00
Dean Herbert
831c273b45
Merge pull request #25887 from smoogipoo/restore-taiko-accuracy
Restore taiko accuracy to ScoreV2 values
2023-12-20 17:29:40 +09:00
OliBomby
ec578e1d9f fix near-zero length sliders n stuff being placeable 2023-12-19 21:20:21 +01:00
Dean Herbert
372f930f8b
Refactor usage of object counts for mania key count lookup to be a bit safer
Protects against non-initialised values and also div-by-zero.
2023-12-19 18:28:04 +09:00
Dan Balasescu
c1b55c7fac
Add ScoreProcessor methods to override numeric result 2023-12-19 13:50:31 +09:00
Dan Balasescu
30116512ca
Populate MaxCombo scoring attrib for non-osu rulesets 2023-12-18 12:01:51 +09:00
clayton
f07771f59b
Fix fallback column colors for legacy split stage mania skins 2023-12-15 22:41:55 -08:00
Bartłomiej Dach
432ce275c4
Explain magic constants better 2023-12-15 20:43:18 +01:00
Dean Herbert
e8f3e52c9e
Fix nullref failure in tests 2023-12-15 19:17:48 +09:00
Dean Herbert
eb5a8284f1
Move mobile check earlier to avoid unnecessary looping 2023-12-15 19:16:18 +09:00
Dean Herbert
456916f680
Fix column sizing exceeding screen width on tablets 2023-12-15 18:02:27 +09:00
Dean Herbert
fdcf87569c
Merge pull request #25711 from smoogipoo/mania-convert-song-select-keycount
Display osu!mania keycount in song select carousel panels and details
2023-12-13 16:31:25 +09:00
Dean Herbert
0e4e916388
Sneaky comment fix 2023-12-13 15:04:52 +09:00
Dan Balasescu
6ed5613c22
Merge branch 'master' into mania-convert-song-select-keycount 2023-12-13 13:53:50 +09:00
Dan Balasescu
2930b53edd
Simplify implementation 2023-12-13 13:43:14 +09:00
Dan Balasescu
36d0ec34d3
Merge pull request #25727 from PercyDan54/mania-autoplay-0ms-hold
Fix mania Autoplay mod missing 0ms hold notes
2023-12-13 12:13:53 +09:00
PercyDan54
b20b2203ac
Fix mania Autoplay mod missing 0ms hold notes 2023-12-11 21:10:14 +08:00
Dan Balasescu
b36db3518c
Add keycount to song select details panel and carousel panels 2023-12-09 22:31:51 +09:00
Dan Balasescu
81fe15f288
Fix osu!mania converted key count edge cases 2023-12-09 15:39:54 +09:00
Dan Balasescu
0fe2e1e8d6
Re-fix mania conversion following new discoveries 2023-12-08 16:33:10 +09:00
Dan Balasescu
d6cb8b70bb
Fix FP precision issue when converting mania beatmaps 2023-12-07 12:26:02 +09:00
Dan Balasescu
d0acb7f4f9
Improve commenting
Co-authored-by: Bartłomiej Dach <dach.bartlomiej@gmail.com>
2023-12-04 06:08:31 +09:00
Dan Balasescu
230278f2c9
Once again remove Mania passive HP drain 2023-12-03 01:47:20 +09:00
Dan Balasescu
1c3bcbd548
Use IHasPath instead of IHasDistance for mania/taiko 2023-11-29 17:30:21 +09:00
Dan Balasescu
16577829e2
Fix mania and taiko slider conversion distance 2023-11-28 21:14:56 +09:00
Dan Balasescu
d924227810
Add ManiaHealthProcessor that uses the legacy drain rate algorithm 2023-11-27 14:38:31 +09:00
Bartłomiej Dach
a8fc73695f
Rename variable 2023-11-20 22:04:08 +09:00
Bartłomiej Dach
364a3f75e1
Compile regexes 2023-11-20 22:03:25 +09:00
Bartłomiej Dach
b6215b2809
Rename and document SelectFromTimestamp 2023-11-20 21:57:14 +09:00
ratinfx
fab6fc9adb Updated comments, renamed method 2023-11-12 15:09:15 +01:00
ratinfx
4e7c40f1d7 Do Split and Parse before checking HitObjects 2023-11-12 14:58:46 +01:00
ratinfx
4e1e19728c Refactor HitObject selection in Composer 2023-11-11 14:02:42 +01:00
ratinfx
aa87e0a44d HitObject Selection logic and separation for gamemodes
+ moved time_regex into EditorTimestampParser
2023-11-07 01:36:58 +01:00
Bartłomiej Dach
998d709331
Merge branch 'master' into mania-key-expand-mobile 2023-11-02 11:59:01 +01:00
Dean Herbert
704f5a6de3
Adjust sizing slightly to ensure we stay within 1366 limits 2023-11-02 11:44:36 +01:00
Dean Herbert
c83589cb74
Change osu!mania conversion mod ordering to be more appeasing 2023-11-02 15:49:10 +09:00
Dean Herbert
6dab5ee4cf
Add support for "argon" default skin to expand columns when on mobile device
Should ease those looking to play the game on mobile until we
(potentially) have a better solution in the future.

If this works out well, we can consider rolling it out to other skins.

Closes https://github.com/ppy/osu/issues/23377.
2023-11-02 15:13:44 +09:00
Dean Herbert
fbba3787d1
Merge pull request #25190 from frenzibyte/match-skin-element-animation-support
Match capability of animating legacy skin elements with osu!(stable)
2023-10-30 18:25:06 +09:00
Salman Ahmed
976ae62214 Fix incorrect nullability specification 2023-10-21 01:10:06 +03:00
Salman Ahmed
491f119988 Add animation support for legacy osu!mania column lights 2023-10-21 00:22:34 +03:00
Salman Ahmed
517d0f65b6 Adjust frame length of osu!mania hold-note body animation 2023-10-21 00:22:31 +03:00
Salman Ahmed
badb1310a3 Adjust frame length of osu!mania judgement animation 2023-10-20 23:59:03 +03:00
Bartłomiej Dach
b321d556b6
Enforce minimum gameplay sample volume of 5% 2023-10-20 15:50:13 +02:00
Dean Herbert
52c2eb93de
Merge branch 'master' into taiko-beat-snap-grid 2023-10-19 23:53:01 +09:00
Dean Herbert
5341a335a6
Bypass Parent nullability checks for now 2023-10-17 17:48:45 +09:00
Bartłomiej Dach
2192c9f2c2
Remove unused using directive 2023-10-17 10:30:01 +02:00
Bartłomiej Dach
22c1a963e7
Remove unused field 2023-10-17 10:27:16 +02:00
Dean Herbert
4381169a3f
Combine selection and input handling logic for beat snap grids across all rulesets 2023-10-17 17:09:42 +09:00
Dean Herbert
1b9acdf55c
Abstract out common implementation of BeatSnapGrid 2023-10-17 16:42:52 +09:00
Dean Herbert
d26d4b8b79
Cache IScrollingInfo at a HitObjectComposer level automatically 2023-10-17 16:42:22 +09:00
Bartłomiej Dach
b9a84127ac
Remove mention of "any tick"
They're very dead now.
2023-10-16 08:57:35 +02:00
Dean Herbert
4f1546c474
Rename PerfectBonusNote to NotePerfectBonus 2023-10-16 15:14:28 +09:00
Dean Herbert
3f09ed396f
Fix legacy skin body piece dimming when it shouldn't 2023-10-16 15:11:33 +09:00
Dean Herbert
1a957364ae
Add empty hit windows on PefectBonusNote 2023-10-16 14:58:49 +09:00
Dean Herbert
43f619f92a
Add DisplayResult flag and remove unnecessary AlwaysPresent 2023-10-16 14:57:58 +09:00
Dean Herbert
14fedffcc1
Fix MissForcefully not considering the bonus object 2023-10-16 14:53:36 +09:00
Dean Herbert
e85c039722
Adjust method flow to hopefully be more legible 2023-10-16 13:31:14 +09:00
Dean Herbert
ddbda69751
Remove nullability of bonusNote 2023-10-16 13:14:58 +09:00
Dean Herbert
850950ba61
Add note about why SmallBonus is not listed in GetValidHitResults 2023-10-13 17:36:30 +09:00
Dean Herbert
125f28219d
Fix hodl tail notes not correctly handling nested bonus judgement 2023-10-13 17:36:19 +09:00
Dean Herbert
94b64044e0
Add nested bonus judgement to DrawableNote for perfect bonus score 2023-10-13 17:01:48 +09:00
Bartłomiej Dach
a42e75452e
Remove remaining usages of LargeTickHit in mania 2023-10-12 11:16:51 +02:00
Bartłomiej Dach
063623b4e6
Merge branch 'master' into remove-hold-note-ticks 2023-10-11 19:47:51 +02:00
Bartłomiej Dach
3f29f27cd4
Assign empty hit windows to HoldNoteBody
It's not a timed object, so following precedent, it should have empty
hitwindows.

This is not actually just aesthetics; several components check whether a
hitobject has empty hitwindows to determine whether to include it on
various HUD displays and results screen components where timed objects
are explicitly involved.
2023-10-11 19:40:55 +02:00
Dean Herbert
8dc9453d8d
Apply some xmldoc and structural changes 2023-10-10 16:59:25 +09:00
Dean Herbert
1a60d6ade5
Use a DrawablePool for mania's beat snap grid
I'm not sure what the cause of the issue is, but I'm also not sure why
it wasn't using `DrawablePool` (was it not around back then?).

Either way, switching to a proper pool fixes things just fine.

Resolves https://github.com/ppy/osu/issues/25009.
2023-10-10 13:36:31 +09:00
Bartłomiej Dach
71c4b138fb
Merge branch 'master' into fix-legacy-score-multipliers-2 2023-10-09 10:53:14 +02:00
Dan Balasescu
e874ec81c9
Remove unused usings 2023-10-09 12:22:08 +09:00
Dan Balasescu
f0da7f016d
Actually use the judgement 2023-10-09 11:49:54 +09:00
Dan Balasescu
d988ef9b22
Revert functional change 2023-10-09 10:50:39 +09:00
Dan Balasescu
9415fe4446
Add mania hold note body + combo break judgement 2023-10-09 09:47:00 +09:00
Dan Balasescu
b2d9c95441
Remove HoldNoteTickJudgement 2023-10-09 09:31:45 +09:00
Dan Balasescu
5362902c87
Merge branch 'master' into remove-hold-note-ticks 2023-10-09 08:15:10 +09:00
Dean Herbert
f2e56bbb65
Fix publicly-settable bindables 2023-10-06 16:51:24 +09:00
Dan Balasescu
da2a4681d9 Add method to retrieve legacy score multiplier 2023-10-02 16:52:01 +09:00
Dan Balasescu
b4b7a7ea5e Add LegacyBeatmapConversionDifficultyInfo abstraction 2023-10-02 16:52:01 +09:00
NiceAesth
83bf1efc1c Add color search alias for colour settings 2023-09-27 16:29:29 +03:00
Bartłomiej Dach
e1d52134ae
Merge pull request #24930 from peppy/adjust-mania-barlines
Adjust osu!mania "major" barlines to be less visually distracting
2023-09-26 19:39:22 +02:00
Dean Herbert
9949480ccd Add minor edge smoothing to fix flickering of barlines
In most cases.

Closes https://github.com/ppy/osu/issues/15184.
2023-09-26 17:06:52 +09:00
Dean Herbert
5150c5a643 Adjust osu!mania "major" barlines to be less visually distracting
Applies to both "triangles" and "argon" skins.
2023-09-26 17:06:27 +09:00
Dean Herbert
0dcf7a2fa9
Merge branch 'master' into split-legacy-scoring-attribs 2023-09-26 15:52:27 +09:00
Dean Herbert
cb0226f843 Implement new interface-based speed change visualisation support on mania/taiko 2023-09-20 15:28:13 +09:00
Dean Herbert
41a8239e49 Remvoe null default for mods which can't be null 2023-09-20 15:27:50 +09:00
Dean Herbert
c5397bdbb3
Merge branch 'master' into mania-edit-disable-sv 2023-09-20 14:23:07 +09:00
Dean Herbert
56cc2b62f0 Make not extension method 2023-09-15 18:13:04 +09:00
Dean Herbert
0031da76ff Move to extension method and throw on non-legacy ruleset 2023-09-15 17:38:34 +09:00
Dean Herbert
4ecc4632aa Make rounding error even less precise
Basically matching the old code more closely to avoid too much precision
from doing math in a slightly different way.
2023-09-12 18:41:09 +09:00
Bartłomiej Dach
e71fef4b6a
Remove braces 2023-09-07 18:47:03 +02:00
Dan Balasescu
2334be1987 Split legacy scoring attributes into a separate object 2023-09-07 21:10:38 +09:00
Dean Herbert
b34a36f6ce Remove all usage of LegacyDifficultyControlPoint 2023-09-07 17:41:57 +09:00
Bartłomiej Dach
17e791d984
Merge branch 'master' into skin-lookup-debug 2023-09-06 18:44:50 +02:00
Dean Herbert
1a37543d28 Rename SliderVelocity to SliderVelocityMultiplier to distinguish from Velocity 2023-09-06 19:01:08 +09:00
Dean Herbert
6c95b88589 Add debug output for skin configuration lookups
We've struggle with debugging these over the years so I think this was
worth a couple of hours of work.

Example of osu! lookups:

```log
[runtime] 2023-09-06 08:38:30 [verbose]: BeatmapSkinProvidingContainer.GetConfig(lookup: SpinnerFrequencyModulate)
[runtime] 2023-09-06 08:38:30 [verbose]: |-SkinProvidingContainer+DisableableSkinSource{ skin: SkinTransformer{ Skin: LegacyBeatmapSkin{ Name: Vickeblanka - Lucky Ending (TV Size) (tears_) [Normal] } } }.GetConfig(lookup: SpinnerFrequencyModulate)
[runtime] 2023-09-06 08:38:30 [verbose]: |-RulesetSkinProvidingContainer.GetConfig(lookup: SpinnerFrequencyModulate)
[runtime] 2023-09-06 08:38:30 [verbose]: |-|-SkinProvidingContainer+DisableableSkinSource{ skin: SkinTransformer{ Skin: LegacySkin{ Name: Test Skin [test-skin] } } }.GetConfig(lookup: SpinnerFrequencyModulate)
[runtime] 2023-09-06 08:38:30 [verbose]: |-|-|-SkinTransformer{ Skin: LegacySkin{ Name: Test Skin [test-skin] } }.GetConfig(lookup: SpinnerFrequencyModulate)
[runtime] 2023-09-06 08:38:30 [verbose]: |-|-|-|-LegacySkin{ Name: Test Skin [test-skin] }.GetConfig(lookup: SpinnerFrequencyModulate) 🟢
[runtime] 2023-09-06 08:38:30 [verbose]: |-|-SkinProvidingContainer+DisableableSkinSource{ skin: SkinTransformer{ Skin: DefaultLegacySkin{ Name: osu! "classic" (2013) } } }.GetConfig(lookup: SpinnerFrequencyModulate)
[runtime] 2023-09-06 08:38:30 [verbose]: |-|-|-SkinTransformer{ Skin: DefaultLegacySkin{ Name: osu! "classic" (2013) } }.GetConfig(lookup: SpinnerFrequencyModulate)
[runtime] 2023-09-06 08:38:30 [verbose]: |-|-|-|-DefaultLegacySkin{ Name: osu! "classic" (2013) }.GetConfig(lookup: SpinnerFrequencyModulate) 🟢
[runtime] 2023-09-06 08:38:30 [verbose]: |-|-SkinProvidingContainer+DisableableSkinSource{ skin: osu.Game.Skinning.ResourceStoreBackedSkin }.GetConfig(lookup: SpinnerFrequencyModulate)
[runtime] 2023-09-06 08:38:30 [verbose]: |-|-|-osu.Game.Skinning.ResourceStoreBackedSkin.GetConfig(lookup: SpinnerFrequencyModulate) 🔴
[runtime] 2023-09-06 08:38:30 [verbose]: |-|-SkinProvidingContainer+DisableableSkinSource{ skin: TrianglesSkin{ Name: osu! "triangles" (2017) } }.GetConfig(lookup: SpinnerFrequencyModulate)
[runtime] 2023-09-06 08:38:30 [verbose]: |-|-|-TrianglesSkin{ Name: osu! "triangles" (2017) }.GetConfig(lookup: SpinnerFrequencyModulate) 🔴
[runtime] 2023-09-06 08:38:30 [verbose]:
[runtime] 2023-09-06 08:38:30 [verbose]: BeatmapSkinProvidingContainer.GetConfig(lookup: ScorePrefix)
[runtime] 2023-09-06 08:38:30 [verbose]: |-SkinProvidingContainer+DisableableSkinSource{ skin: SkinTransformer{ Skin: LegacyBeatmapSkin{ Name: Vickeblanka - Lucky Ending (TV Size) (tears_) [Normal] } } }.GetConfig(lookup: ScorePrefix)
[runtime] 2023-09-06 08:38:30 [verbose]: |-RulesetSkinProvidingContainer.GetConfig(lookup: ScorePrefix)
[runtime] 2023-09-06 08:38:30 [verbose]: |-|-SkinProvidingContainer+DisableableSkinSource{ skin: SkinTransformer{ Skin: LegacySkin{ Name: Test Skin [test-skin] } } }.GetConfig(lookup: ScorePrefix)
[runtime] 2023-09-06 08:38:30 [verbose]: |-|-|-SkinTransformer{ Skin: LegacySkin{ Name: Test Skin [test-skin] } }.GetConfig(lookup: ScorePrefix)
[runtime] 2023-09-06 08:38:30 [verbose]: |-|-|-|-LegacySkin{ Name: Test Skin [test-skin] }.GetConfig(lookup: ScorePrefix) 🟢
[runtime] 2023-09-06 08:38:30 [verbose]: |-|-SkinProvidingContainer+DisableableSkinSource{ skin: SkinTransformer{ Skin: DefaultLegacySkin{ Name: osu! "classic" (2013) } } }.GetConfig(lookup: ScorePrefix)
[runtime] 2023-09-06 08:38:30 [verbose]: |-|-|-SkinTransformer{ Skin: DefaultLegacySkin{ Name: osu! "classic" (2013) } }.GetConfig(lookup: ScorePrefix)
[runtime] 2023-09-06 08:38:30 [verbose]: |-|-|-|-DefaultLegacySkin{ Name: osu! "classic" (2013) }.GetConfig(lookup: ScorePrefix) 🟢
[runtime] 2023-09-06 08:38:30 [verbose]: |-|-SkinProvidingContainer+DisableableSkinSource{ skin: osu.Game.Skinning.ResourceStoreBackedSkin }.GetConfig(lookup: ScorePrefix)
[runtime] 2023-09-06 08:38:30 [verbose]: |-|-|-osu.Game.Skinning.ResourceStoreBackedSkin.GetConfig(lookup: ScorePrefix) 🔴
[runtime] 2023-09-06 08:38:30 [verbose]: |-|-SkinProvidingContainer+DisableableSkinSource{ skin: TrianglesSkin{ Name: osu! "triangles" (2017) } }.GetConfig(lookup: ScorePrefix)
[runtime] 2023-09-06 08:38:30 [verbose]: |-|-|-TrianglesSkin{ Name: osu! "triangles" (2017) }.GetConfig(lookup: ScorePrefix) 🔴
```

Example of osu!mania lookups:

```log
[runtime] 2023-09-06 08:28:34 [verbose]: |-RulesetSkinProvidingContainer.GetConfig(lookup: [ManiaSkinConfigurationLookup lookup:ColumnWidth col:0])
[runtime] 2023-09-06 08:28:34 [verbose]: |-|-SkinProvidingContainer+DisableableSkinSource{ skin: SkinTransformer{ Skin: LegacySkin{ Name: Test Skin [test-skin] } } }.GetConfig(lookup: [ManiaSkinConfigurationLookup lookup:ColumnWidth col:0])
[runtime] 2023-09-06 08:28:34 [verbose]: |-|-|-SkinTransformer{ Skin: LegacySkin{ Name: Test Skin [test-skin] } }.GetConfig(lookup: [LegacyManiaSkinConfigurationLookup lookup:ColumnWidth col:0 totalcols:4])
[runtime] 2023-09-06 08:28:34 [verbose]: |-|-|-|-LegacySkin{ Name: Test Skin [test-skin] }.GetConfig(lookup: [LegacyManiaSkinConfigurationLookup lookup:ColumnWidth col:0 totalcols:4]) 🔴
[runtime] 2023-09-06 08:28:34 [verbose]: |-|-SkinProvidingContainer+DisableableSkinSource{ skin: SkinTransformer{ Skin: DefaultLegacySkin{ Name: osu! "classic" (2013) } } }.GetConfig(lookup: [ManiaSkinConfigurationLookup lookup:ColumnWidth col:0])
[runtime] 2023-09-06 08:28:34 [verbose]: |-|-|-SkinTransformer{ Skin: DefaultLegacySkin{ Name: osu! "classic" (2013) } }.GetConfig(lookup: [LegacyManiaSkinConfigurationLookup lookup:ColumnWidth col:0 totalcols:4])
[runtime] 2023-09-06 08:28:34 [verbose]: |-|-|-|-DefaultLegacySkin{ Name: osu! "classic" (2013) }.GetConfig(lookup: [LegacyManiaSkinConfigurationLookup lookup:ColumnWidth col:0 totalcols:4]) 🟢
[runtime] 2023-09-06 08:28:34 [verbose]:
[runtime] 2023-09-06 08:28:34 [verbose]: BeatmapSkinProvidingContainer.GetConfig(lookup: [ManiaSkinConfigurationLookup lookup:ColumnSpacing col:0])
[runtime] 2023-09-06 08:28:34 [verbose]: |-SkinProvidingContainer+DisableableSkinSource{ skin: SkinTransformer{ Skin: LegacyBeatmapSkin{ Name: antiPLUR - Runengon (Raveille) [Easy] } } }.GetConfig(lookup: [ManiaSkinConfigurationLookup lookup:ColumnSpacing col:0])
[runtime] 2023-09-06 08:28:34 [verbose]: |-RulesetSkinProvidingContainer.GetConfig(lookup: [ManiaSkinConfigurationLookup lookup:ColumnSpacing col:0])
[runtime] 2023-09-06 08:28:34 [verbose]: |-|-SkinProvidingContainer+DisableableSkinSource{ skin: SkinTransformer{ Skin: LegacySkin{ Name: Test Skin [test-skin] } } }.GetConfig(lookup: [ManiaSkinConfigurationLookup lookup:ColumnSpacing col:0])
[runtime] 2023-09-06 08:28:34 [verbose]: |-|-|-SkinTransformer{ Skin: LegacySkin{ Name: Test Skin [test-skin] } }.GetConfig(lookup: [LegacyManiaSkinConfigurationLookup lookup:ColumnSpacing col:0 totalcols:4])
[runtime] 2023-09-06 08:28:34 [verbose]: |-|-|-|-LegacySkin{ Name: Test Skin [test-skin] }.GetConfig(lookup: [LegacyManiaSkinConfigurationLookup lookup:ColumnSpacing col:0 totalcols:4]) 🔴
[runtime] 2023-09-06 08:28:34 [verbose]: |-|-SkinProvidingContainer+DisableableSkinSource{ skin: SkinTransformer{ Skin: DefaultLegacySkin{ Name: osu! "classic" (2013) } } }.GetConfig(lookup: [ManiaSkinConfigurationLookup lookup:ColumnSpacing col:0])
[runtime] 2023-09-06 08:28:34 [verbose]: |-|-|-SkinTransformer{ Skin: DefaultLegacySkin{ Name: osu! "classic" (2013) } }.GetConfig(lookup: [LegacyManiaSkinConfigurationLookup lookup:ColumnSpacing col:0 totalcols:4])
[runtime] 2023-09-06 08:28:34 [verbose]: |-|-|-|-DefaultLegacySkin{ Name: osu! "classic" (2013) }.GetConfig(lookup: [LegacyManiaSkinConfigurationLookup lookup:ColumnSpacing col:0 totalcols:4]) 🟢
[runtime] 2023-09-06 08:28:34 [verbose]:

```
2023-09-06 18:03:40 +09:00
Dean Herbert
37c2b330a2 Move toggle implementation to work on all scrolling rulesets automatically 2023-09-01 19:53:10 +09:00
Dean Herbert
6ce251fbb5 Expose base VisualisationMethod so we don't need to new it locally per ruleset 2023-09-01 19:17:53 +09:00