Givikap120
57170501cd
Improve code quality
2023-11-04 17:25:09 +02: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
Dean Herbert
2886d2d4c2
Apply same changes to "argon" osu!taiko barline design that were applied to osu!mania
2023-10-25 14:20:43 +09:00
Salman Ahmed
bcbb77d383
Fix incorrect assumption in taiko circle piece logic
2023-10-24 02:29:46 +03:00
Salman Ahmed
ab3b51e4a0
Refactor osu!taiko circle piece logic to read better
2023-10-21 00:22:34 +03: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
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
2a89a25790
Add beat snap grid to osu!taiko editor
...
Addresses https://github.com/ppy/osu/discussions/25150 .
2023-10-17 16:59:56 +09:00
Bartłomiej Dach
71c4b138fb
Merge branch 'master' into fix-legacy-score-multipliers-2
2023-10-09 10:53:14 +02:00
Dean Herbert
f2e56bbb65
Fix publicly-settable bindables
2023-10-06 16:51:24 +09:00
Bartłomiej Dach
0ae4a0f11f
Adjust gameplay element maximum size limits for backwards compatibility
...
The new limits were chosen by sampling across over 4000 skins. The
methodology for doing so is described in the following gist:
https://gist.github.com/bdach/6228ba41d128b23d1f89142f404108a3
2023-10-05 20:37:10 +02:00
Dean Herbert
d660395850
Ensure there's no chance of a press being ignored during rewind flow
2023-10-05 23:02:45 +09:00
Bartłomiej Dach
a1368df62f
Allow judging at most one swell tick per frame
2023-10-04 19:08:03 +02:00
Dan Balasescu
da2a4681d9
Add method to retrieve legacy score multiplier
2023-10-02 16:52:01 +09:00
Dean Herbert
9d8c3f0f5c
Merge pull request #24779 from smoogipoo/split-legacy-scoring-attribs
...
Split legacy scoring attribs into its own table
2023-09-26 22:35:38 +09:00
Dan Balasescu
19a442a32a
Fix incorrect change in taiko score simulator
2023-09-26 17:46:03 +09:00
Dean Herbert
990c54519b
Merge branch 'master' into limit-gameplay-sprite-dimensions
2023-09-26 16:40:32 +09:00
Dean Herbert
0dcf7a2fa9
Merge branch 'master' into split-legacy-scoring-attribs
2023-09-26 15:52:27 +09:00
Salman Ahmed
ad86bf2d56
Revert redundant size limitations
...
Already handled by the sprites themselves being resized.
2023-09-21 19:03:59 +03: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
c5397bdbb3
Merge branch 'master' into mania-edit-disable-sv
2023-09-20 14:23:07 +09:00
Salman Ahmed
291a91be66
Change extension from retrieval to post-processing instead
2023-09-19 03:40:30 +03: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
Givikap120
1a70110a4e
Added BeatmapAttributesDisplay support
2023-09-12 16:44:44 +03:00
Givikap120
c61212c523
Merge pull request #1 from Givikap120/master
...
add display to calibrate
2023-09-12 13:02:19 +03: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
Dan Balasescu
628517569b
Fix another difficulty-specific value
2023-09-08 21:08:09 +09: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
Dean Herbert
1a37543d28
Rename SliderVelocity
to SliderVelocityMultiplier
to distinguish from Velocity
2023-09-06 19:01:08 +09:00
Dean Herbert
9d17539778
Add size limitations for taiko drum rolls
2023-09-05 18:01:19 +09:00
Salman Ahmed
d286816ba8
Add limit to taiko hit elements
2023-09-03 02:22:58 +03:00
Dean Herbert
37c2b330a2
Move toggle implementation to work on all scrolling rulesets automatically
2023-09-01 19:53:10 +09:00
Dean Herbert
0f5eff1230
Merge branch 'master' into mania-edit-disable-sv
2023-09-01 19:08:48 +09:00
Givikap120
290f8db341
fixed stated problems
...
removed functions from `Ruleset.cs` and added a `GetEffectiveDifficulty()` instead
2023-08-26 02:13:14 +03:00
Givikap120
17b9b1649a
Fixed "works only for std" problem
...
1) Now it use AR/OD calculation from Ruleset class
2) Implemented needed functions in each of default rulesets
2023-08-25 00:58:26 +03:00
Dan Balasescu
a2fd7707a1
Allow toggling SVs in the editor
2023-08-18 18:55:24 +09:00
OliBomby
71a96e8be2
Remove SV from DrumRoll
2023-08-13 21:47:13 +02:00
Bartłomiej Dach
6d018c08af
Rename Apply{Vertical -> Horizontal}Centering
to match common understanding
2023-07-28 22:09:28 +02:00
Dean Herbert
deba6e2508
Fix osu!taiko editor playfield missing a piece
...
Regressed with recent centering changes in https://github.com/ppy/osu/pull/24220
2023-07-27 02:24:10 +09:00
Bartłomiej Dach
7e98d319d8
Use update-invariant way of checking for second press on same frame
...
Fixes the same issue that 970ea50269
did,
but with no `AlwaysPresent` usage.
2023-07-25 20:07:03 +02:00
chayleaf
970ea50269
fix alive hitobjects blocking hits in taiko with hd
2023-07-20 23:20:35 +07:00
Bartłomiej Dach
041e818892
Fix nested hits not being hittable if cut off by parent object ending
2023-07-15 18:44:47 +02:00
Bartłomiej Dach
9e960894c2
Add inline commentary about OnKilled()
override
2023-07-15 18:22:04 +02:00
chayleaf
3e91d30825
move StrongNestedHit OnKilled to DrawableStrongNestedHit
2023-07-15 22:33:16 +07:00
chayleaf
7f957d3fbe
Fix some taiko maps not finishing in some conditions
...
I don't know how to reproduce this issue in a test, so no tests for now.
Nonetheless, this fixes the issue for me at least on one map:
https://osu.ppy.sh/beatmapsets/1899665#taiko/3915653
This workaround is similar to #16475 (the test from that commit got
eventually removed for some reason).
2023-07-15 20:24:40 +07:00
Bartłomiej Dach
632077319f
Fix taiko statistics table not using 2-column layout
2023-07-13 20:06:53 +02:00
Bartłomiej Dach
16540d69d5
Merge pull request #24206 from peppy/results-screen-misc
...
Fix some minor issues with results screen
2023-07-13 19:49:49 +02:00
Dean Herbert
9ad63bae37
Add missing heading for statistics section in results screen
2023-07-13 18:50:52 +09:00
Dean Herbert
259ac6d427
Fix osu!taiko swells eating input after already being judged
2023-07-13 13:32:20 +09:00
Bartłomiej Dach
7be5e0e978
Implement back-and-forth conversion of ModScoreV2
and LegacyMods
2023-07-09 16:15:21 +02:00
Bartłomiej Dach
ba0cd7a3f2
Fix flourish sample not playing if strong hits are hit early
2023-07-08 19:22:32 +02:00
Bartłomiej Dach
fee56ac6d2
Use new IGameplayClock.IsRewinding
member
2023-07-08 18:29:49 +02:00
Bartłomiej Dach
055e4a78f0
Merge branch 'master' into taiko-hitsounding-final-attempt
2023-07-08 18:10:04 +02:00
Dean Herbert
a76cd9b0e6
Update osu.Game.Rulesets.Taiko/UI/DrumSamplePlayer.cs
...
Co-authored-by: Jamie Taylor <me@nekodex.net>
2023-07-08 00:44:26 +09:00
Dean Herbert
d72765b6f8
Merge pull request #24114 from peppy/editor-save-local-score-management
...
Ensure scores always have the correct linked `BeatmapInfo`
2023-07-07 15:40:54 +09:00
Dean Herbert
8b5d5c9ae2
Fix rewinding causing incorrectly stronged non-strong hits
2023-07-07 15:13:25 +09:00
Dean Herbert
755b82a308
Implement flourish trigger source via base class
2023-07-07 14:54:49 +09:00
Dean Herbert
9bdc80a749
Move flourish playback to own trigger source
2023-07-07 14:46:36 +09:00
Dean Herbert
6bfbcca2fd
Move VolumeAwareHitSampleInfo
to own file
2023-07-07 14:45:33 +09:00
Dean Herbert
48f27ff340
Move trigger source to own file
...
Having such a large nested class inside a small top level class is VERY
confusing.
2023-07-07 14:31:14 +09:00
Dean Herbert
d4c252ddf9
Revert cancelling logic changes based on review feedback
2023-07-07 14:28:57 +09:00
Dean Herbert
0b5a3d6a91
Merge pull request #24120 from peppy/fix-taiko-animation-timing
...
Fix taiko hit overlay animation timing not accounting for timing section start time
2023-07-07 13:05:20 +09:00
Dean Herbert
5af4aa8741
Avoid strong hits cutting off other strong hits
2023-07-06 14:05:49 +09:00
Dean Herbert
9ff6b3fcd3
Merge branch 'master' into editor-save-local-score-management
2023-07-06 12:28:44 +09:00
Bartłomiej Dach
a87a631c50
Merge branch 'master' into taiko-hitsounding-final-attempt
2023-07-05 22:15:32 +02:00
Bartłomiej Dach
afc0c4f3c2
Merge pull request #24088 from peppy/taiko-hitsounding-drum-sample-player
...
Move all remaining osu!taiko sample playback logic out of `DrawableHitObject`s
2023-07-05 21:57:49 +02:00
Dean Herbert
8f61f5e4c6
Cache Playfield
for the sake of tests
...
I'm open to an alternative. Name it.
2023-07-05 18:44:27 +09:00
Dean Herbert
289f916cd7
Remove outdated TODO
2023-07-05 18:44:27 +09:00
Dean Herbert
759cd5aec7
Warm up pool with argon-specific drum samples
2023-07-05 18:44:27 +09:00
Dean Herbert
f086908831
Don't attempt to play drum samples when rewinding
2023-07-05 18:44:27 +09:00
Dean Herbert
16f1a7694d
Add time-based flourish support
2023-07-05 18:44:27 +09:00
Dean Herbert
c72ebcfd53
Fix skin fallback not working as expected
2023-07-05 18:44:27 +09:00
Dean Herbert
010262c764
Change strong hit sample handling to be user input based, not hit object based
2023-07-05 18:44:27 +09:00
Dean Herbert
a9587fd1aa
Move strong hit handling to DrumSamplePlayer
and separte trigger sources
2023-07-05 18:44:27 +09:00
Dean Herbert
27af07b74b
Add basic implementation of argon osu!taiko hitsounds (volume / flourish / strong)
2023-07-05 18:44:27 +09:00
Dean Herbert
beed390031
Add balance adjust to base implementation of DrumSampleTriggerSource
2023-07-05 18:44:27 +09:00
Dean Herbert
ae86fc736a
Add argon-specific DrumSamplePlayer
2023-07-05 18:44:27 +09:00
Dean Herbert
f54eb8d7fa
Move DrumSamplePlayer
to be a skinnable component
2023-07-05 18:44:27 +09:00
Dean Herbert
9a7bf1bedd
Fix reversed order of sample return
2023-07-05 18:44:01 +09:00
Dean Herbert
3b9d7af9ee
Fix taiko hit overlay animation timing not accounting for timing section start time
2023-07-05 17:25:31 +09:00
Dean Herbert
1629024111
ILegacyScoreProcessor
-> ILegacyScoreSimulator
2023-07-04 17:32:54 +09:00
Dean Herbert
d74b1e148d
Make ScoreInfo.BeatmapInfo
nullable
2023-07-04 14:50:34 +09:00
Dean Herbert
571dbf5ab8
Adjust logic to avoid creating List<>
each playback
2023-06-30 15:42:58 +09:00
Dean Herbert
c98abf1723
More correctly handle StrongNestedHitObject
s
2023-06-30 15:38:17 +09:00
Dean Herbert
e87cf6d256
Move all remaining osu!taiko sample playback logic out of DrawableHitObject
s
2023-06-30 15:21:34 +09:00
Dan Balasescu
c6ad184d94
Move Ruleset method to ILegacyRuleset interface
2023-06-29 17:24:37 +09:00
Dan Balasescu
09bc8e45de
Refactoring
2023-06-28 16:14:32 +09:00
Dan Balasescu
5f350aa66f
Fix float division
...
Firstly, this is intended to be a float division.
Secondly, dividing integers by 0 results in an exception, but dividing
non-zero floats by 0 results in +/- infinity which will be clamped to
the upper range.
In particular, this occurs when the beatmap has 1 hitobject (0 drain
length).
2023-06-27 17:14:35 +09:00
Dan Balasescu
a9c65d200a
Initial conversion of scores
2023-06-26 22:19:01 +09:00
Dan Balasescu
e1d723a2cc
Merge branch 'master' into diffcalc-total-scorev1
2023-06-26 14:32:14 +09:00
Bartłomiej Dach
d7ae430ec2
Merge branch 'master' into framework-update
2023-06-24 18:47:52 +02:00
Dean Herbert
3585c3f1d5
Apply required nullability changes
2023-06-24 09:58:36 +09:00
Dean Herbert
df5b389629
Manual fixes to reduce warnings to zero
2023-06-24 01:52:53 +09:00
Dan Balasescu
06565871d6
Add flag to disable computing legacy scoring values
2023-06-24 01:03:18 +09:00
Dean Herbert
0ab0c52ad5
Automated pass
2023-06-24 01:00:03 +09:00
Dan Balasescu
87447f41d0
Fix incorrect calculation of difficulty
2023-06-24 00:58:45 +09:00
Dan Balasescu
bfa449e47a
Adjust attribute data
2023-06-19 21:38:13 +09:00
Dan Balasescu
0844a21a51
Merge branch 'master' into diffcalc-total-scorev1
2023-06-15 19:33:29 +09:00
Dan Balasescu
aa644832dc
Add ScoreV1 calculation for TaikoRuleset
2023-06-13 19:28:46 +09:00
Dean Herbert
b986d1cee1
Rename variables to give more context
2023-06-12 14:18:26 +09:00
Xinnoh
0c42aa7f3b
lower kiai pulse brightness
2023-06-09 22:51:45 -07:00
Xinnoh
7bf73463f1
reduce argon kiai flashing
2023-06-09 22:46:07 -07:00
Bartłomiej Dach
7acd186a3d
Revert to previous bound in drum roll tick generation
...
While `EndTime + tickSpacing` _was_ closer to what stable was using, it
could cause undesirable edge cases wherein a tick would be spawned
outside of the drum roll's duration
(see https://github.com/ppy/osu/pull/23768/files#r1222073027 ).
For this reason, stick with the old code for now, as it is not as
susceptible to that sort of breakage.
2023-06-08 09:56:39 +02:00
Bartłomiej Dach
b6a1377955
Merge branch 'master' into fix-editor-drum-roll
2023-06-08 09:55:10 +02:00
Salman Ahmed
62cb6a98ca
Remove redundant nullable suppression directives
2023-06-07 08:20:41 +03:00
Dean Herbert
56758afeed
Add note about lastTickHittable
requirement
2023-06-06 17:01:52 +09:00
Dean Herbert
3db080fad2
Fix osu!taiko drum rolls not getting correct tick rate after placement in the editor
2023-06-06 16:54:33 +09:00
Dean Herbert
b096e03a57
Fix ticks being created after the end of drum rolls in osu!taiko editor
...
Closes https://github.com/ppy/osu/issues/23135 .
2023-06-06 16:31:59 +09:00
Dean Herbert
a18a2e48f7
Colour argon osu!taiko explosions based on the object hit
2023-06-06 15:49:03 +09:00
Dan Balasescu
e402c6d2b4
Write max combo attribute from base class
2023-06-02 21:53:25 +09:00
Dean Herbert
985604fab5
Return StatisticItem
s rather than StatisticRow
s from ruleset
...
There were no usages of more than one column being provided per row, so
it seemed like unnecessarily complexity. I'm currently trying to reduce
complexity so we can improve the layout of the results screen, which
currently has up to three levels of nested `GridContainer`s.
Of note, I can't add backwards compatibility because the method
signature has not changed in `Ruleset` (only the return type). If we do
want to keep compatibility with other rulesets, we could designate a new
name for the updated method.
2023-06-01 14:35:15 +09:00
Dan Balasescu
fee3d43596
Merge branch 'master' into scorev2
2023-05-23 19:07:54 +09:00
Bartłomiej Dach
9915fac2c8
Fix sample silence being one level too low
...
4a7b011a53
inadvertently unearthed that
nested strong hits could play samples of their own accord, rather than
delegating to `DrumSampleTriggerSource` as they were supposed to. This
was an unfortunate omission due to how the inheritance structure of
`TaikoHitObject` looks like (some irrelevant classes omitted for
brevity):
DrawableTaikoHitObject
DrawableTaikoHitObject<TObject> <-- `GetSamples()` was overridden to empty here
DrawableTaikoStrongableHitObject
DrawableHit
DrawableDrumRoll
DrawableDrumRollTick
DrawableSwell
DrawableSwellTick
DrawableStrongNestedHit <-- all strong nested hits are here => didn't receive `GetSamples()` override
DrawableHit.StrongNestedHit
DrawableDrumRoll.StrongNestedHit
DrawableDrumRollTick.StrongNestedHit
To fix, move the `GetSamples()` override one level higher, to the
non-generic `DrawableTaikoHitObject`, to suppress the spurious sample
playbacks.
The stale reference in the comment was also updated to match current
code.
2023-05-21 18:58:26 +02:00
Bartłomiej Dach
4a7b011a53
Propagate samples to strong nested hits too
...
The rationale is the same as in
6d325651dc
. Due to the recursive nature of
`GameplaySampleTriggerSource.GetMostValidObject()`, in the case of
nested hits, drum rolls and drum roll ticks, the nested strong hits
would become the most valid object, and so without propagating
the samples down to that level too, nothing would play.
2023-05-21 18:58:05 +02:00
Bartłomiej Dach
6d325651dc
Propagate samples to drum roll/swell ticks for correct playback
...
In d97daee96b
, `DrumSampleTriggerSource`
was changed such that in order to play sounds for the user's inputs, the
bank of the normal sound would always be used.
The problem is that in the case of taiko objects which have nested
objects (swells and drum rolls), the samples were not propagated fully
(drum rolls, where only the finish sample was kept, for the purposes of
determining strongability), or not propagated at all (swells) to ticks.
As ticks of both objects are valid return values of
`GetMostValidHitObject()`, this would lead to the drum making no sounds
if the next object was a drum roll or swell, until that drum roll or
swell was completed. To fix, propagate the full set of samples, so that
`DrumSampleTriggerSource` can retrieve the normal sound to copy the bank
from.
Note that this may not necessarily reproduce prior behaviour. This is
because it is not guaranteed that all realised samples for a given
hitobject have the same bank - some may have been overriden locally on a
given hitobject. Previously, the bank would have been retrieved from the
sample control point, wherein there is only one possible bank to use;
however, when deciding the sound to play on the basis of a constructed
hitobject, it is possible that there are cases wherein the hitnormal
sample was overridden on that given hitobject, and in such cases, this
PR would make samples _play_, but not necessarily the _same_ samples
as prior to #23308 .
If that turns out to be the case, this will have to be revisited.
2023-05-21 18:57:01 +02:00
Dan Balasescu
30a296bd09
Rename parameters
2023-05-19 17:27:02 +09:00
Dan Balasescu
d74bf2a096
Refactor for safety
2023-05-19 14:37:26 +09:00
Dan Balasescu
2ae34530f7
Avoid NaN values during ApplyBeatmap processing()
2023-05-19 14:14:34 +09:00
Dan Balasescu
7cbf48ffcf
Fix TestSceneScoring and incorrect combo calculations
2023-05-19 14:09:19 +09:00
Dan Balasescu
4d14467d95
Invert order of operations
2023-05-19 13:23:04 +09:00
Dan Balasescu
8b56a3f87d
Remove ClassicScoreMultiplier and DefaultScoreProcessor
2023-05-19 12:24:52 +09:00
Dean Herbert
dc51d5ecf3
Rename GetSampleInfo
to better describe what method does
...
Also add full xmldoc
2023-05-17 14:07:48 +09:00
Dean Herbert
31fff72eb6
Fix bank not correctly being assigned to some taiko hit cases
2023-05-16 18:52:52 +09:00
Dean Herbert
f443cfb93e
Move blueprint validity conditions to allow more correct external usage of EndPlacement
...
Until now, these were haphazardly enforce inline in blueprint
implementations. The only thing stopping complete breakage is that
`EndPlacement` wasn't called (too much) from outside the blueprint,
leaving them responsible for their own placement.
By moving this conditional out of the provided paramters to
`EndPlacement`, it allows more flexible usage of that method externally.
Coming in a future PR.
2023-05-12 16:02:22 +09:00
Dan Balasescu
a7b623f52a
Reimplement classic scoring mode
2023-05-09 20:21:38 +09:00
Dan Balasescu
3c3c812ed6
Initial implementation of ScoreV2
2023-05-09 19:33:33 +09:00
Dan Balasescu
5afe57033d
Add parent hitobject to strong hits
2023-05-09 19:30:54 +09:00
OliBomby
608fa3cc73
Merge remote-tracking branch 'upstream/master' into sample-control-points
2023-04-30 19:47:03 +02:00
OliBomby
41d4894aa3
add min and max value to SliderVelocity
2023-04-30 19:32:24 +02:00
OliBomby
4a0ff046ae
pass new hitobject properties through beatmap converters
2023-04-30 19:20:42 +02:00
OliBomby
92efd04f31
fix sample of drumroll ticks being bankless
2023-04-29 23:52:24 +02:00
sw1tchbl4d3
76df5fd3e2
Limit taiko playfield aspect ratio to 5:4 - 16:9
2023-04-26 18:05:47 +02:00
OliBomby
c44f71a737
remove all regular usage of DifficultyControlPoint
2023-04-26 17:55:38 +02:00
OliBomby
9f8d7bccba
fix usings
2023-04-26 17:34:02 +02:00
OliBomby
d97daee96b
remove all non-test usage of SampleControlPoint
2023-04-26 13:55:39 +02:00
OliBomby
6c70948681
Remove IContext & add IHasGenerateTicks
2023-04-26 13:10:57 +02:00
OliBomby
ea1e6e9798
Add LegacyContext
2023-04-25 12:12:46 +02:00
OliBomby
a4c6850ab2
made the SampleControlPoint and DifficultyControlPoint obsolete
2023-04-25 11:34:09 +02:00
Dan Balasescu
ad51f880e0
Remove overrides on DC/NC mods
2023-04-10 17:49:29 +09:00
Dan Balasescu
15f6bc155e
Add progressive score multiplier for HT
2023-04-10 13:35:48 +09:00
Dan Balasescu
c923482976
Add progressive score multiplier for DT
2023-04-10 13:31:48 +09:00
Bartłomiej Dach
7d9327f3e2
Only allow hit placement when left mouse is clicked
2023-04-04 18:40:10 +02:00
Bartłomiej Dach
f42a463479
Remove #nullable disable
...
May as well that we're here...
2023-04-03 20:14:17 +02:00
Bartłomiej Dach
ed07c0640b
Remove unused using directive
2023-04-03 20:13:59 +02:00
Dean Herbert
be79ea1c10
Remove left/right click based placement in taiko editor and respect sample selection
2023-04-03 18:14:58 +09:00
Dan Balasescu
9866321d27
Merge branch 'master' into taiko-single-tap
2023-03-09 13:24:20 +09:00
Bartłomiej Dach
430b09acb2
Expose taiko input manager in same manner as osu!
2023-03-08 22:52:06 +01:00