Compare commits
946 Commits
2025.1118.
...
7d38e6c8eb
| Author | SHA1 | Date | |
|---|---|---|---|
| 7d38e6c8eb | |||
|
|
c4402e9ce5 | ||
|
|
de9cf751d2 | ||
|
|
0988552567 | ||
|
|
0fd0bd3580 | ||
|
|
16bc1de9fd | ||
|
|
0d74983551 | ||
|
|
b46656e7d3 | ||
|
|
482d31d598 | ||
|
|
f9e863af01 | ||
|
|
04767f44bb | ||
|
|
8fe63ade31 | ||
|
|
c1555af620 | ||
|
|
e911217980 | ||
|
|
ba2ae3218e | ||
|
|
b76a7e1bb6 | ||
|
|
6b10ef8709 | ||
|
|
43897457fb | ||
|
|
bb289363a2 | ||
|
|
28a18f768c | ||
|
|
45945e3bb1 | ||
|
|
cab50e94c8 | ||
|
|
ae032622ac | ||
|
|
a0ecbd7c87 | ||
|
|
459d5e8a45 | ||
|
|
9b55e1dfdb | ||
|
|
4c873787c1 | ||
|
|
43af89f75c | ||
|
|
f74a21c1e1 | ||
|
|
a028f0ba4a | ||
|
|
1aa42a73b1 | ||
|
|
d9e182230d | ||
|
|
65b49137ee | ||
|
|
2f96e96576 | ||
|
|
e64e0f0ca9 | ||
|
|
d37f59430b | ||
|
|
d748470754 | ||
|
|
2539bd90fa | ||
|
|
317be21569 | ||
|
|
b1044b6b2d | ||
|
|
c28c64940a | ||
|
|
b4f40639a1 | ||
|
|
7e7421e1ea | ||
|
|
1a8d2855d4 | ||
|
|
54a1417dd8 | ||
|
|
ce542b03db | ||
|
|
f20d182775 | ||
|
|
a7e6286396 | ||
|
|
521a40d860 | ||
|
|
564b6ebd0c | ||
|
|
7dfbab212e | ||
|
|
b831bcbcd4 | ||
|
|
c372f9b8f5 | ||
|
|
b0759ff34d | ||
|
|
d60a12a351 | ||
|
|
d27d0f40c1 | ||
|
|
ee9f8d5e92 | ||
|
|
9c8dfaf386 | ||
|
|
033e13cb3b | ||
|
|
b88cba0829 | ||
|
|
9c489aacf8 | ||
|
|
105342e5bf | ||
|
|
c72b6412ea | ||
|
|
2e659a79ec | ||
|
|
5131b188d1 | ||
|
|
7e2771c3f0 | ||
|
|
5174d8b918 | ||
|
|
32d10406c9 | ||
|
|
0dfb362b2d | ||
|
|
047ea7c09d | ||
|
|
cb597c4120 | ||
|
|
99ab245cf0 | ||
|
|
ee8d99034c | ||
|
|
5b1d4ceb9d | ||
|
|
ccb0224a1b | ||
|
|
5602281bd9 | ||
|
|
fabce18552 | ||
|
|
cb12d35d8f | ||
|
|
efc9a27d2d | ||
|
|
e2cbfb970e | ||
|
|
f39615a374 | ||
|
|
4916c87f14 | ||
|
|
a09489d4c0 | ||
|
|
d139f5997c | ||
|
|
29a39cbfb7 | ||
|
|
c144cf188a | ||
|
|
1e8b9a7639 | ||
|
|
69c2747883 | ||
|
|
d3b48364c5 | ||
|
|
9ae99648fb | ||
|
|
f9f927fa45 | ||
|
|
1153d17153 | ||
|
|
e15cb08b44 | ||
|
|
25d630898b | ||
|
|
48544733c3 | ||
|
|
d33a6d5512 | ||
|
|
110f11fa5e | ||
|
|
fb8c228d32 | ||
|
|
93d1a61dc2 | ||
|
|
83587e2265 | ||
|
|
f15e086bb0 | ||
|
|
9fa78123a6 | ||
|
|
7445efaecd | ||
|
|
86ab507e2e | ||
|
|
cc9a5ede29 | ||
|
|
6e03d5b00e | ||
|
|
71583bc06f | ||
|
|
94cec71502 | ||
|
|
42bf25442b | ||
|
|
fc4e29793d | ||
|
|
8e26cf4e1b | ||
|
|
810edebe87 | ||
|
|
2f459dd94e | ||
|
|
87f323a2e5 | ||
|
|
94d9de955f | ||
|
|
860427e4ae | ||
|
|
5afd6c6835 | ||
|
|
50426eb3c8 | ||
|
|
56bc80ffb9 | ||
|
|
c59e5bf335 | ||
|
|
655d725f0c | ||
|
|
15c49a729e | ||
|
|
3678ea0d0f | ||
|
|
dbce8886f8 | ||
|
|
a1136c3cea | ||
|
|
b613c1dcd5 | ||
|
|
cae8d3f4d4 | ||
|
|
f39b310eb5 | ||
|
|
efd4d12c21 | ||
|
|
60d98f0afd | ||
|
|
01982030ec | ||
|
|
bb83f3dcf2 | ||
|
|
0a4497db3c | ||
|
|
bb04a18060 | ||
|
|
7263551aa8 | ||
|
|
239951eda9 | ||
|
|
5cdf07c7e1 | ||
|
|
2efe0c95e6 | ||
|
|
a616fa61c9 | ||
|
|
e77e08c049 | ||
|
|
5231cfa1c7 | ||
|
|
40b331654e | ||
|
|
5e01dda411 | ||
|
|
5d4bb1bd37 | ||
|
|
1230da33a5 | ||
|
|
57222ea0c7 | ||
|
|
892e34b1f8 | ||
|
|
b8b6327624 | ||
|
|
85b8480e46 | ||
|
|
9e9b5cfc50 | ||
|
|
c9a50b40d0 | ||
|
|
8c21a5ba06 | ||
|
|
2ab7492759 | ||
|
|
cf09ed3e0d | ||
|
|
a774f19aef | ||
|
|
14d8cf7275 | ||
|
|
7d476b4b7c | ||
|
|
de97660fa4 | ||
|
|
5468215de8 | ||
|
|
1885ab86f5 | ||
|
|
586b2987a7 | ||
|
|
9bf52034d7 | ||
|
|
a53ba5e4ef | ||
|
|
35b9c74cf8 | ||
|
|
64a29313a8 | ||
|
|
d5ef0d75fc | ||
|
|
3b3bb266fc | ||
|
|
487347dac6 | ||
|
|
d7648afe96 | ||
|
|
c86f76b972 | ||
|
|
8e5eed63e1 | ||
|
|
b705313d3f | ||
|
|
5dd34f165f | ||
|
|
10651512a5 | ||
|
|
4c2ffa0f79 | ||
|
|
6997f89698 | ||
|
|
0ed4a8dbe5 | ||
|
|
c47f9c5259 | ||
|
|
a401c7d5e9 | ||
|
|
6185a81bd5 | ||
|
|
6d54d20943 | ||
|
|
02fbcaba23 | ||
|
|
7b7777bb56 | ||
|
|
ca7b850c8c | ||
|
|
88e5ac4834 | ||
|
|
b9d5606fd4 | ||
|
|
c8c91cedfa | ||
|
|
0c90cf3cef | ||
|
|
1a0193001d | ||
|
|
6bdb0e1cbb | ||
|
|
0d3b7ab6be | ||
|
|
8202ad18d0 | ||
|
|
fa5a278cf3 | ||
|
|
70321e2f89 | ||
|
|
c1fc1edd9c | ||
|
|
40e55ecb6e | ||
|
|
4a5dbea2a2 | ||
|
|
cffeb92248 | ||
|
|
2c56419fe9 | ||
|
|
add67b95c7 | ||
|
|
6fad798227 | ||
|
|
60690cbccc | ||
|
|
6329e3ee1b | ||
|
|
fa22d1f202 | ||
|
|
12eeab581e | ||
|
|
b5e93b98c9 | ||
|
|
786ea35274 | ||
|
|
d6bf4fd90d | ||
|
|
c407e07514 | ||
|
|
ed0051d119 | ||
|
|
99ea19d55c | ||
|
|
dba17b1fa6 | ||
|
|
fdf28474bf | ||
|
|
42dc73d849 | ||
|
|
6983227240 | ||
|
|
585ce682ef | ||
|
|
3db3b603bc | ||
|
|
1c537a3278 | ||
|
|
c88f10ca1b | ||
|
|
7fef2ce1de | ||
|
|
9a5fd0addb | ||
|
|
9c0b1a4914 | ||
|
|
acdb4477f7 | ||
|
|
4ff29339ed | ||
|
|
f1f4a0001b | ||
|
|
df1dc46603 | ||
|
|
84ec4bb866 | ||
|
|
9f0f9ef229 | ||
|
|
290b141d8f | ||
|
|
7cc025d8f4 | ||
|
|
978fc91b09 | ||
|
|
259c5708f1 | ||
|
|
b7559f93f2 | ||
|
|
c2604e22c7 | ||
|
|
dddd75b7f9 | ||
|
|
d3c9548b52 | ||
|
|
225f4d8814 | ||
|
|
d80934c344 | ||
|
|
6f038bff48 | ||
|
|
98c6f6afcd | ||
|
|
ff28839a09 | ||
|
|
52d5c986ef | ||
|
|
dd9e70b29c | ||
|
|
04e378c09f | ||
|
|
d4cf46e3cd | ||
|
|
42302c45ec | ||
|
|
e2dd4d86b4 | ||
|
|
6693307064 | ||
|
|
f0e7817dda | ||
|
|
a1d325370c | ||
|
|
1e8ffdf128 | ||
|
|
ea0b281f48 | ||
|
|
fdd13cd7e1 | ||
|
|
6354286452 | ||
|
|
6f146a5ce9 | ||
|
|
5d651628bc | ||
|
|
10dc1314f6 | ||
|
|
ce2d54f118 | ||
|
|
042f716b2a | ||
|
|
0ea060c612 | ||
|
|
ea8788a509 | ||
|
|
46b2d5374e | ||
|
|
8860eec9f9 | ||
|
|
8c86ff36a2 | ||
|
|
fdf9092f41 | ||
|
|
76f05a4837 | ||
|
|
ae1402c9cd | ||
|
|
741620d89c | ||
|
|
4ee4aac708 | ||
|
|
dfa7ac2082 | ||
|
|
2a0bafde8c | ||
|
|
91ee5eebc9 | ||
|
|
6bf95068ae | ||
|
|
6d999a8d8e | ||
|
|
c1d9de7e83 | ||
|
|
763dbe1494 | ||
|
|
65f7037e84 | ||
|
|
e62a01cf77 | ||
|
|
a60f262679 | ||
|
|
c0b644c905 | ||
|
|
cf73f8f9e6 | ||
|
|
7608ed4d87 | ||
|
|
eee88a3955 | ||
|
|
676b7a36da | ||
|
|
b5a989d31e | ||
|
|
a6489cd758 | ||
|
|
952fd0d493 | ||
|
|
06b89919be | ||
|
|
e1bde264bc | ||
|
|
e05b6f44b9 | ||
|
|
a8ada50549 | ||
|
|
1add946db4 | ||
|
|
a2ca650a9f | ||
|
|
cd433fea50 | ||
|
|
a6756157d1 | ||
|
|
367d133d2f | ||
|
|
1313883394 | ||
|
|
e8154080b3 | ||
|
|
b4ba327c1c | ||
|
|
c646b4e5ec | ||
|
|
15cb3b7a27 | ||
|
|
0551c75c6b | ||
|
|
2bf0dcf398 | ||
|
|
3302e2e180 | ||
|
|
79f1d77fed | ||
|
|
91718447db | ||
|
|
3f92b451d9 | ||
|
|
ed091dc9cd | ||
|
|
029d544720 | ||
|
|
876dcd060c | ||
|
|
b9a37453f9 | ||
|
|
c5a30d3244 | ||
|
|
96c414be86 | ||
|
|
30a60d83e2 | ||
|
|
ed760e6389 | ||
|
|
5d9ea9d699 | ||
|
|
874e3adcb7 | ||
|
|
e548cd40dc | ||
|
|
7ea1bbf91e | ||
|
|
27abce74ce | ||
|
|
8a581f5a90 | ||
|
|
3f4d1b798e | ||
|
|
d1a231cacf | ||
|
|
9c8d6e63a7 | ||
|
|
5abc0f93fe | ||
|
|
d5aa5b61ad | ||
|
|
f9e70f06b3 | ||
|
|
363b7cf3cb | ||
|
|
eeb4680795 | ||
|
|
f892d5fbaa | ||
|
|
0ba4e9e2a4 | ||
|
|
8de5726aa0 | ||
|
|
d3ed93280a | ||
|
|
37257a7a02 | ||
|
|
df1304af9e | ||
|
|
18fd4758d7 | ||
|
|
9acc632788 | ||
|
|
eb1417696a | ||
|
|
5de23e41cf | ||
|
|
5899800293 | ||
|
|
b15b4e70a5 | ||
|
|
40d8fb6316 | ||
|
|
a8989eb117 | ||
|
|
a81a77c60f | ||
|
|
4726489dba | ||
|
|
38c89a914b | ||
|
|
57f16646a3 | ||
|
|
9bad2c634b | ||
|
|
ae284fcf05 | ||
|
|
8a21c6814c | ||
|
|
f320592229 | ||
|
|
ee5cf25628 | ||
|
|
3e7f0f4c61 | ||
|
|
dda1c7f75b | ||
|
|
7652c91a53 | ||
|
|
1c1a3fbe8d | ||
|
|
7c1b1f4548 | ||
|
|
22082097f8 | ||
|
|
d35658985a | ||
|
|
576be6793b | ||
|
|
5e4e28ef00 | ||
|
|
a2d2c3287b | ||
|
|
23c68cbfea | ||
|
|
3f577aae60 | ||
|
|
2963ebae96 | ||
|
|
3157e82f51 | ||
|
|
b40ffd633f | ||
|
|
48de70e719 | ||
|
|
4f44d13e67 | ||
|
|
9b26b83d55 | ||
|
|
7f99650a04 | ||
|
|
0e8a294400 | ||
|
|
3ae98fd664 | ||
|
|
8c8ba2f3bc | ||
|
|
163ca25907 | ||
|
|
85747f8866 | ||
|
|
d05acc3d4f | ||
|
|
8cbcb0e74f | ||
|
|
d39020038b | ||
|
|
86a3c19547 | ||
|
|
53a5157a2f | ||
|
|
679c6d0229 | ||
|
|
86220622fb | ||
|
|
38360fde7b | ||
|
|
61d0b5a03c | ||
|
|
08364a7b97 | ||
|
|
465ec88371 | ||
|
|
4f2dfccb0f | ||
|
|
43e5aec16e | ||
|
|
59b3afe5aa | ||
|
|
fad53d9134 | ||
|
|
61c4a3dba0 | ||
|
|
8b49572c44 | ||
|
|
78a5654e1f | ||
|
|
2b90cbf59f | ||
|
|
ea289460b0 | ||
|
|
ff3397b6b7 | ||
|
|
a4fe0c924d | ||
|
|
33e49442c6 | ||
|
|
d0ac5cdeae | ||
|
|
23c595a136 | ||
|
|
9916e5bb1c | ||
|
|
25dab7258c | ||
|
|
b7b3e028ab | ||
|
|
88f80799c3 | ||
|
|
5839209d6f | ||
|
|
ff820f730e | ||
|
|
593cc37ea6 | ||
|
|
ebf9c19ad3 | ||
|
|
af08416880 | ||
|
|
3bd2050954 | ||
|
|
351a717795 | ||
|
|
00560cbfba | ||
|
|
b6dc64668e | ||
|
|
e0c4592dc7 | ||
|
|
1fcae16be9 | ||
|
|
212973bd63 | ||
|
|
5cba990940 | ||
|
|
974d3fa5e1 | ||
|
|
2fc621b4f3 | ||
|
|
ff4c281bd9 | ||
|
|
833617e279 | ||
|
|
e539660b14 | ||
|
|
d204b79342 | ||
|
|
54f9360814 | ||
|
|
19cfe9abe6 | ||
|
|
0a2fc12061 | ||
|
|
e1ce1e3188 | ||
|
|
464cc23393 | ||
|
|
338b987ea9 | ||
|
|
04bd381ee3 | ||
|
|
affe295f50 | ||
|
|
bd29c46bd7 | ||
|
|
28a6d6211c | ||
|
|
334a54e6f7 | ||
|
|
a6545bea68 | ||
|
|
7e823af70b | ||
|
|
9f40d630dc | ||
|
|
1cf14952de | ||
|
|
2d119f11ec | ||
|
|
dad138223b | ||
|
|
a23024d80e | ||
|
|
9f57be7410 | ||
|
|
853836a48b | ||
|
|
24a0de1020 | ||
|
|
ebb898f67c | ||
|
|
e2ed5208fe | ||
|
|
e07b828f30 | ||
|
|
e2a245b049 | ||
|
|
57cbe20c12 | ||
|
|
646e6de5df | ||
|
|
191ec072a8 | ||
|
|
1cff386b3a | ||
|
|
71be574c2b | ||
|
|
6e41332ea3 | ||
|
|
3c084c60aa | ||
|
|
3b9b030aad | ||
|
|
d421678d34 | ||
|
|
056d832371 | ||
|
|
4e83814d5a | ||
|
|
8ff2329e22 | ||
|
|
6bf25d700c | ||
|
|
5163b8f5f3 | ||
|
|
2e324fe856 | ||
|
|
8347f83f9c | ||
|
|
e34d266987 | ||
|
|
a6e1713514 | ||
|
|
10ebb5286f | ||
|
|
69fee16eee | ||
|
|
f3fa1122c2 | ||
|
|
0f018988b5 | ||
|
|
4a60d7fe71 | ||
|
|
69250b3260 | ||
|
|
60d9c358b8 | ||
|
|
ef3338ba93 | ||
|
|
99b00ab72f | ||
|
|
56ef5eae14 | ||
|
|
2cb2167765 | ||
|
|
206578bf10 | ||
|
|
36de88f399 | ||
|
|
0bcb3c5839 | ||
|
|
2acc2a84db | ||
|
|
64d16776be | ||
|
|
2d06c2b1a6 | ||
|
|
81f03957d8 | ||
|
|
ecaf3e05d4 | ||
|
|
2d85fe8133 | ||
|
|
0af07b97c5 | ||
|
|
03f44705b3 | ||
|
|
033a73e969 | ||
|
|
1340e18d93 | ||
|
|
43e217120d | ||
|
|
dc53198577 | ||
|
|
95cf050298 | ||
|
|
0bfff2bf88 | ||
|
|
fa32be37d6 | ||
|
|
e4d7bc3896 | ||
|
|
520baf6c50 | ||
|
|
a1d4d44151 | ||
|
|
a3a5b2ca92 | ||
|
|
cb32d2da3e | ||
|
|
4ee7e6f787 | ||
|
|
c2c1fa4d4c | ||
|
|
339aad42a7 | ||
|
|
a2872ee870 | ||
|
|
c6a8d9a150 | ||
|
|
6eec2b0ff8 | ||
|
|
0999e3f048 | ||
|
|
71386fe465 | ||
|
|
f58e4e4862 | ||
|
|
0bebabba94 | ||
|
|
95233fc638 | ||
|
|
277e00c74e | ||
|
|
a25f1cde25 | ||
|
|
2ed37ecbbc | ||
|
|
554961036e | ||
|
|
dbcc7cc09d | ||
|
|
d9dad4c3a8 | ||
|
|
0787345a84 | ||
|
|
9d07ad2761 | ||
|
|
1ab922af12 | ||
|
|
44df9047ae | ||
|
|
17143ca0a8 | ||
|
|
3712093158 | ||
|
|
df524d68fd | ||
|
|
daaea093f0 | ||
|
|
469aa7b303 | ||
|
|
e094eefafb | ||
|
|
4cce6aa123 | ||
|
|
bba4329ab5 | ||
|
|
25ba3f2dc6 | ||
|
|
ecc51d4701 | ||
|
|
32454caaa9 | ||
|
|
0f53886784 | ||
|
|
f598d8b108 | ||
|
|
f273163e58 | ||
|
|
6de1f0cd4d | ||
|
|
c475b4bc4b | ||
|
|
276757315f | ||
|
|
a82d0c3b51 | ||
|
|
4fee1547e3 | ||
|
|
a4215e0442 | ||
|
|
577cf7d1e7 | ||
|
|
09178b5dc4 | ||
|
|
16c4967ee4 | ||
|
|
e526de7f40 | ||
|
|
93a64dad89 | ||
|
|
897cb2c1a9 | ||
|
|
de0c191c47 | ||
|
|
61874e59e0 | ||
|
|
13aeed15f9 | ||
|
|
094860bfea | ||
|
|
44f535dcef | ||
|
|
f5bd888078 | ||
|
|
90d7615432 | ||
|
|
7a32e0eebf | ||
|
|
78043fa782 | ||
|
|
729cd722bd | ||
|
|
8da1fde981 | ||
|
|
1de97712f1 | ||
|
|
83ddcf7b02 | ||
|
|
2e7edf8c1f | ||
|
|
61ecd18d24 | ||
|
|
9e67cf503b | ||
|
|
62fd61def4 | ||
|
|
c120f0ebab | ||
|
|
5bf6a75b50 | ||
|
|
b71a26fcec | ||
|
|
5f9639fc3f | ||
|
|
61bf68f336 | ||
|
|
f581f85eb2 | ||
|
|
b07cd2daa4 | ||
|
|
3b635f6919 | ||
|
|
07817dce70 | ||
|
|
67e0348fa8 | ||
|
|
734c6f933d | ||
|
|
ac213c90cb | ||
|
|
74ca87c252 | ||
|
|
190b5535d7 | ||
|
|
032912e62b | ||
|
|
83f9eba1d1 | ||
|
|
1e79c56240 | ||
| 86f0159e65 | |||
| ae5a64ba81 | |||
|
|
82256ae2de | ||
|
|
1142be45ec | ||
|
|
dcb6d71287 | ||
|
|
881a35b382 | ||
|
|
89d8b402af | ||
|
|
1d351002df | ||
| e3a7ae30cd | |||
| b6f845d99c | |||
|
|
2606f3a0b5 | ||
|
|
1c463aa060 | ||
|
|
7853abe8aa | ||
|
|
1aff418981 | ||
|
|
62e92bb242 | ||
|
|
79151ae5b4 | ||
| a1d6bda63e | |||
| 547d22a4b5 | |||
|
|
c17db2cdd0 | ||
|
|
bbdd70c843 | ||
|
|
4250a54245 | ||
|
|
40fdb8662e | ||
|
|
6ce8b0a4bc | ||
|
|
b30047def6 | ||
|
|
0ffb86262f | ||
|
|
f71eb4b980 | ||
|
|
1faf02e860 | ||
|
|
d700375e55 | ||
|
|
095a67c24e | ||
|
|
86054497d0 | ||
|
|
c4f7dee82b | ||
|
|
22825f6509 | ||
|
|
691e8bcd05 | ||
|
|
e68bab4f4b | ||
|
|
9430a62af4 | ||
| b4c530ac04 | |||
| 5af05d2479 | |||
| 43ab18ffea | |||
| 9f59259a40 | |||
| 82b3015fcc | |||
| 68f92ab57c | |||
| d76d4d9a35 | |||
|
|
bb7417c099 | ||
|
|
066e093987 | ||
|
|
56e0c3e65d | ||
|
|
89d7726903 | ||
|
|
36f1bfef07 | ||
|
|
118f07878a | ||
|
|
e144968893 | ||
|
|
d2ffea41c6 | ||
|
|
a8be9b1381 | ||
|
|
bdac75e542 | ||
|
|
5c2df50714 | ||
|
|
887d280bfa | ||
|
|
42b184f167 | ||
|
|
27737bd4e9 | ||
|
|
84db289779 | ||
|
|
4c0522b795 | ||
|
|
8bb885a0dc | ||
|
|
0b06acb29d | ||
|
|
b129837e57 | ||
|
|
07ea9fe2a4 | ||
|
|
3e221c7f61 | ||
|
|
7106a6a5e5 | ||
|
|
eaf2721f5b | ||
| 490a6fd724 | |||
|
|
59a27dad3d | ||
|
|
4b0017dfea | ||
|
|
f73307876e | ||
|
|
4e4aa44a02 | ||
|
|
d6cd748d2a | ||
| 237e1828f8 | |||
| 3413f722f7 | |||
| 9f779dac03 | |||
| 0727c53cdc | |||
| a57ff24191 | |||
|
|
c23d6b7fd1 | ||
|
|
582ff999aa | ||
|
|
a6c001244f | ||
|
|
a96b024ac5 | ||
|
|
1c10acba76 | ||
|
|
4ae4c700ae | ||
|
|
2be50d917a | ||
|
|
35fdc6f8b9 | ||
|
|
d04029bcc7 | ||
|
|
107098314a | ||
|
|
d1d76a76ba | ||
|
|
fbac5db964 | ||
|
|
5a920d15c1 | ||
|
|
324d088d46 | ||
|
|
1db4b897eb | ||
|
|
8e2230d149 | ||
|
|
8d33c35646 | ||
|
|
c359898a75 | ||
|
|
6343bf7d29 | ||
|
|
b1e27d842b | ||
|
|
28eeb7f743 | ||
|
|
38c3167a9d | ||
|
|
66ebce8c12 | ||
|
|
fed9564b40 | ||
|
|
f595a47059 | ||
|
|
8a9f60df68 | ||
|
|
2d8b1e7152 | ||
|
|
fef8117b5c | ||
|
|
99da986e02 | ||
|
|
1c33291b3f | ||
|
|
c6cc92315c | ||
|
|
12170df80a | ||
|
|
3e4c038a37 | ||
|
|
5d76353ae4 | ||
|
|
0b3ec3f1e1 | ||
|
|
043a1c2793 | ||
|
|
ca8247c667 | ||
|
|
a5ae542502 | ||
|
|
fe5cbc4932 | ||
|
|
0a378e5efd | ||
|
|
2a7e71d7fd | ||
|
|
1d221c1a7a | ||
| bdb3418b67 | |||
|
|
82f4406c79 | ||
|
|
0b4f96efc8 | ||
|
|
92e9a36744 | ||
|
|
c6eba26a67 | ||
|
|
8f927ea7b5 | ||
|
|
a8f058141b | ||
|
|
78c6973298 | ||
|
|
d8d7c80832 | ||
|
|
ae33690632 | ||
|
|
9e2ea63e70 | ||
|
|
6bb25b2abe | ||
|
|
037743e002 | ||
|
|
6244617e5e | ||
|
|
ddfcb4d6da | ||
|
|
2660f4dcb0 | ||
|
|
5a865476ce | ||
|
|
2472c91924 | ||
|
|
db50019f31 | ||
|
|
1e43509e4a | ||
|
|
ded8aaecfd | ||
|
|
75df8e3639 | ||
|
|
0d9a50e839 | ||
|
|
7473c62949 | ||
|
|
8d30e3d852 | ||
|
|
97fdc89fe3 | ||
|
|
f6a6c9f885 | ||
|
|
26c50b874c | ||
|
|
83706b7fb6 | ||
|
|
9e3486d4e6 | ||
|
|
545b13c3fb | ||
|
|
2c9fc32756 | ||
|
|
79bfe7880a | ||
|
|
0786e619f1 | ||
|
|
c968981697 | ||
|
|
45567f19b7 | ||
|
|
f0f4e7c7a5 | ||
|
|
1d353ef637 | ||
|
|
52af905237 | ||
|
|
64668eafb9 | ||
|
|
b0762fc8ec | ||
|
|
d59e9572d2 | ||
|
|
098da946e1 | ||
|
|
510fc506fb | ||
|
|
da09ad9c46 | ||
|
|
aaff7d358f | ||
|
|
a69b2cd803 | ||
|
|
855d5dba3c | ||
|
|
9c981a52f8 | ||
|
|
96de47ac4f | ||
|
|
43834b55f2 | ||
|
|
8fb402665e | ||
|
|
e4975e8d3b | ||
|
|
dbd9f13f2d | ||
|
|
ec890cd459 | ||
|
|
33c8c4d639 | ||
|
|
83ce56b718 | ||
|
|
9d88c761d3 | ||
|
|
49eb013967 | ||
|
|
b6ccc8cae4 | ||
|
|
d0e09e5b5c | ||
|
|
8900c79758 | ||
|
|
fd652982ce | ||
|
|
a2bfb409d2 | ||
| 936640edeb | |||
| 1187d03333 | |||
|
|
26da75ecfb | ||
|
|
9f8554cc13 | ||
|
|
713b6453c0 | ||
|
|
1b3ac49f2a | ||
|
|
d8b71423b0 | ||
|
|
2c40e116e1 | ||
|
|
90e7faf271 | ||
|
|
fc74726d11 | ||
|
|
5d3997152a | ||
|
|
41b56971e5 | ||
|
|
98e7a10e1e | ||
|
|
e99b9984d0 | ||
|
|
38504fed22 | ||
|
|
13dab24d41 | ||
|
|
67530b39cf | ||
|
|
19f5e5ba7c | ||
|
|
56ce955e0c | ||
|
|
73349ab182 | ||
|
|
a6a98fc078 | ||
|
|
a8594f1c08 | ||
|
|
d3860f1630 | ||
|
|
15ee49348d | ||
|
|
908a950cd2 | ||
|
|
df79269e6f | ||
|
|
34146b8bcb | ||
|
|
08ed2844b4 | ||
|
|
871c0ebe3d | ||
|
|
6362cdb675 | ||
|
|
8e78f4dac4 | ||
|
|
fa8d303922 | ||
|
|
d465bee0ab | ||
|
|
721ba8aeba | ||
|
|
1dd026c0f0 | ||
|
|
a873f2be65 | ||
|
|
edf7a126c8 | ||
|
|
f0f33b6df4 | ||
|
|
6052ed790d | ||
|
|
107c481fb9 | ||
|
|
aba567d258 | ||
|
|
094454499c | ||
|
|
c7e1a5770d | ||
|
|
a8ac82aa1f | ||
|
|
47faf774b0 | ||
|
|
be77257ddb | ||
|
|
397041099e | ||
|
|
4b59a4657f | ||
|
|
02090bf6c4 | ||
| 3bd996ee43 | |||
| 37b9f91d42 | |||
|
|
603c77e3e9 | ||
|
|
f284864f96 | ||
| 1a5a5606dc | |||
|
|
fa1bf7bd96 | ||
|
|
ef4408a73e | ||
|
|
6f7f9802bd | ||
| 87ff1051e9 | |||
|
|
277f4268db | ||
|
|
80fbcd5fbd | ||
|
|
9c2319b989 | ||
|
|
a040143825 | ||
|
|
80474565fc | ||
|
|
89f2c7160d | ||
|
|
f0ca079fe6 | ||
|
|
fbd83cb048 | ||
|
|
843c318ec1 | ||
|
|
19b6761697 | ||
|
|
bb017ade64 | ||
|
|
549cc08bfe | ||
|
|
96dd95940f | ||
|
|
a30f08be80 | ||
|
|
0c341c1f3e | ||
|
|
ae5584bd88 | ||
|
|
edf08b176a | ||
|
|
7b952b83bf | ||
|
|
214122f633 | ||
|
|
76c0bd4750 | ||
|
|
4bf3d9397f | ||
|
|
fe56ba2921 | ||
|
|
1ca4c8860b | ||
|
|
1e05613859 | ||
|
|
424ef9237f | ||
|
|
e541e917a4 | ||
|
|
7796394685 | ||
|
|
32900f563c | ||
|
|
e349a597ba | ||
|
|
8b778e8106 | ||
|
|
ce5e54c9d2 | ||
|
|
45e8df7af2 | ||
|
|
1c30cb8371 | ||
|
|
bd4ed49c06 | ||
|
|
1e91dde92e | ||
|
|
a593a40429 | ||
|
|
02b88de76e | ||
|
|
435cd272ea | ||
|
|
b64abbf1f5 | ||
|
|
4265e72180 | ||
|
|
72507b80c7 | ||
|
|
cb9d9734d6 | ||
|
|
5763b7dbe9 | ||
|
|
e1baa03622 | ||
|
|
4f783f8c41 | ||
|
|
4c72a60ee2 | ||
|
|
c56c528824 | ||
|
|
013de9f85d | ||
|
|
cd6c9405fe | ||
|
|
1df640898f | ||
|
|
7b55b9e4f2 | ||
|
|
822cb9e2fb | ||
|
|
680614fbee | ||
|
|
cb8ddc706f | ||
|
|
04d2ce150a | ||
|
|
eaffb89b4c | ||
|
|
650a61539b | ||
|
|
75bc934aa5 | ||
|
|
8d80e2bd2c | ||
|
|
34a3b1ba78 | ||
|
|
b354fa4472 | ||
|
|
1fbe1bd6c9 | ||
|
|
3c215f6574 | ||
|
|
8c28d26130 | ||
|
|
933fbd274d | ||
|
|
55ae7e8bb8 | ||
|
|
4a22ef88ce | ||
|
|
43ca046f9b | ||
|
|
dbefba57ce | ||
|
|
20904de276 | ||
|
|
6a6c7ad3ba | ||
|
|
fb2fe65a77 | ||
|
|
4662c5d678 | ||
|
|
d98cb9ca45 | ||
|
|
a7e4aa8b12 | ||
|
|
78f639d760 | ||
|
|
4ea03d0e07 | ||
|
|
8755a01622 | ||
|
|
901044d690 | ||
|
|
cf0e5edf34 | ||
|
|
a825104688 | ||
|
|
fadcb9882c | ||
|
|
afdebcf188 | ||
|
|
0558f9f2d9 | ||
|
|
90d1725603 | ||
|
|
78eaad13ae | ||
|
|
511921c1f7 | ||
|
|
e2681c4163 | ||
|
|
1f2f86b016 | ||
|
|
fa7bd482d2 | ||
|
|
1ec6735a35 | ||
|
|
c8762762f9 | ||
|
|
9333ef361b | ||
|
|
1cf9c04756 | ||
|
|
67849ca418 | ||
|
|
0777bdbfc5 | ||
|
|
798f6bdcc7 | ||
|
|
f38162c550 | ||
|
|
b663fe17ab | ||
|
|
3c1d45b896 | ||
|
|
259bc53699 | ||
|
|
87834d1693 | ||
|
|
f1539167eb | ||
|
|
ff6f797a3e | ||
|
|
bfa45a23ce | ||
|
|
c80fe7ab82 | ||
|
|
d85c2ee623 | ||
|
|
b4b26e3a1d | ||
|
|
1867aad1a6 | ||
|
|
b1bc5cae87 | ||
|
|
038bf3fdda | ||
|
|
61c3aad537 | ||
|
|
3aad0868af | ||
|
|
973c4c8319 | ||
|
|
ac21f8b960 | ||
|
|
0b3b6468a5 | ||
|
|
7d1c54f045 | ||
|
|
fd504e5641 | ||
|
|
93ed0483b6 | ||
|
|
4dd0672aa5 | ||
|
|
66eff14d2b | ||
|
|
245ade004a | ||
|
|
6cb46106fe | ||
|
|
3666e4c332 |
@@ -21,7 +21,7 @@
|
|||||||
]
|
]
|
||||||
},
|
},
|
||||||
"ppy.localisationanalyser.tools": {
|
"ppy.localisationanalyser.tools": {
|
||||||
"version": "2024.802.0",
|
"version": "2025.1208.0",
|
||||||
"commands": [
|
"commands": [
|
||||||
"localisation"
|
"localisation"
|
||||||
]
|
]
|
||||||
|
|||||||
@@ -1,8 +1,10 @@
|
|||||||
name: Update osu-web mod definitions
|
name: Update osu-web mod definitions (DO NOT USE YET!!!!!)
|
||||||
on:
|
on:
|
||||||
push:
|
workflow_dispatch:
|
||||||
tags:
|
# push:
|
||||||
- '*'
|
# tags:
|
||||||
|
# - '*'
|
||||||
|
|
||||||
|
|
||||||
permissions:
|
permissions:
|
||||||
contents: read # to fetch code (actions/checkout)
|
contents: read # to fetch code (actions/checkout)
|
||||||
10
.github/workflows/ci.yml
vendored
10
.github/workflows/ci.yml
vendored
@@ -1,4 +1,10 @@
|
|||||||
on: [push, pull_request]
|
on:
|
||||||
|
push:
|
||||||
|
tags:
|
||||||
|
- '*'
|
||||||
|
workflow_dispatch:
|
||||||
|
|
||||||
|
|
||||||
name: Continuous Integration
|
name: Continuous Integration
|
||||||
concurrency:
|
concurrency:
|
||||||
group: ${{ github.workflow }}-${{ github.ref }}
|
group: ${{ github.workflow }}-${{ github.ref }}
|
||||||
@@ -33,7 +39,7 @@ jobs:
|
|||||||
key: inspectcode-${{ hashFiles('.config/dotnet-tools.json', '.github/workflows/ci.yml', 'osu.sln*', 'osu*.slnf', '.editorconfig', '.globalconfig', 'CodeAnalysis/*', '**/*.csproj', '**/*.props') }}
|
key: inspectcode-${{ hashFiles('.config/dotnet-tools.json', '.github/workflows/ci.yml', 'osu.sln*', 'osu*.slnf', '.editorconfig', '.globalconfig', 'CodeAnalysis/*', '**/*.csproj', '**/*.props') }}
|
||||||
|
|
||||||
- name: Dotnet code style
|
- name: Dotnet code style
|
||||||
run: dotnet build -c Debug -warnaserror osu.Desktop.slnf -p:EnforceCodeStyleInBuild=true
|
run: dotnet build -c Debug -warnaserror osu.Desktop.slnf
|
||||||
|
|
||||||
- name: CodeFileSanity
|
- name: CodeFileSanity
|
||||||
run: |
|
run: |
|
||||||
|
|||||||
3
.github/workflows/deploy.yml
vendored
3
.github/workflows/deploy.yml
vendored
@@ -4,6 +4,7 @@ on:
|
|||||||
push:
|
push:
|
||||||
tags:
|
tags:
|
||||||
- '*'
|
- '*'
|
||||||
|
workflow_dispatch:
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
notify_pending_production_deploy:
|
notify_pending_production_deploy:
|
||||||
@@ -12,7 +13,7 @@ jobs:
|
|||||||
- name: Submit pending deployment notification
|
- name: Submit pending deployment notification
|
||||||
run: |
|
run: |
|
||||||
export TITLE="Pending osu Production Deployment: $GITHUB_REF_NAME"
|
export TITLE="Pending osu Production Deployment: $GITHUB_REF_NAME"
|
||||||
export URL="https://github.com/ppy/osu/actions/runs/$GITHUB_RUN_ID"
|
export URL="https://github.com/jvnkosu-dev/client/actions/runs/$GITHUB_RUN_ID"
|
||||||
export DESCRIPTION="Awaiting approval for building NuGet packages for tag $GITHUB_REF_NAME:
|
export DESCRIPTION="Awaiting approval for building NuGet packages for tag $GITHUB_REF_NAME:
|
||||||
[View Workflow Run]($URL)"
|
[View Workflow Run]($URL)"
|
||||||
export ACTOR_ICON="https://avatars.githubusercontent.com/u/$GITHUB_ACTOR_ID"
|
export ACTOR_ICON="https://avatars.githubusercontent.com/u/$GITHUB_ACTOR_ID"
|
||||||
|
|||||||
8
.github/workflows/sentry-release.yml
vendored
8
.github/workflows/sentry-release.yml
vendored
@@ -21,9 +21,9 @@ jobs:
|
|||||||
uses: getsentry/action-release@v1
|
uses: getsentry/action-release@v1
|
||||||
env:
|
env:
|
||||||
SENTRY_AUTH_TOKEN: ${{ secrets.SENTRY_AUTH_TOKEN }}
|
SENTRY_AUTH_TOKEN: ${{ secrets.SENTRY_AUTH_TOKEN }}
|
||||||
SENTRY_ORG: ppy
|
SENTRY_ORG: jvnkosu
|
||||||
SENTRY_PROJECT: osu
|
SENTRY_PROJECT: client
|
||||||
SENTRY_URL: https://sentry.ppy.sh/
|
SENTRY_URL: https://satellite.jvnko.boats/
|
||||||
with:
|
with:
|
||||||
environment: production
|
environment: production
|
||||||
version: osu@${{ github.ref_name }}
|
version: jvnkosu@${{ github.ref_name }}
|
||||||
|
|||||||
@@ -55,9 +55,7 @@ When in doubt, it's probably best to start with a discussion first. We will esca
|
|||||||
|
|
||||||
While pull requests from unaffiliated contributors are welcome, please note that due to significant community interest and limited review throughput, the core team's primary focus is on the issues which are currently [on the roadmap](https://github.com/orgs/ppy/projects/7/views/6). Reviewing PRs that fall outside of the scope of the roadmap is done on a best-effort basis, so please be aware that it may take a while before a core maintainer gets around to review your change.
|
While pull requests from unaffiliated contributors are welcome, please note that due to significant community interest and limited review throughput, the core team's primary focus is on the issues which are currently [on the roadmap](https://github.com/orgs/ppy/projects/7/views/6). Reviewing PRs that fall outside of the scope of the roadmap is done on a best-effort basis, so please be aware that it may take a while before a core maintainer gets around to review your change.
|
||||||
|
|
||||||
The [issue tracker](https://github.com/ppy/osu/issues) should provide plenty of issues to start with. We also have a [`good first issue`](https://github.com/ppy/osu/issues?q=is%3Aissue+is%3Aopen+label%3A%22good+first+issue%22) label, although from experience it is not used very often, as it is relatively rare that we can spot an issue that will definitively be a good first issue for a new contributor regardless of their programming experience.
|
The [issue tracker](https://github.com/ppy/osu/issues) should provide plenty of issues to start with. In the case of simple issues, a direct PR is okay. However, if you decide to work on an existing issue which doesn't seem trivial, **please ask us first**. This way we can try to estimate if it is a good fit for you and provide the correct direction on how to address it. In addition, note that while we do not rule out external contributors from working on roadmapped issues, we will generally prefer to handle them ourselves unless they're not very time sensitive.
|
||||||
|
|
||||||
In the case of simple issues, a direct PR is okay. However, if you decide to work on an existing issue which doesn't seem trivial, **please ask us first**. This way we can try to estimate if it is a good fit for you and provide the correct direction on how to address it. In addition, note that while we do not rule out external contributors from working on roadmapped issues, we will generally prefer to handle them ourselves unless they're not very time sensitive.
|
|
||||||
|
|
||||||
If you'd like to propose a subjective change to one of the visual aspects of the game, or there is a bigger task you'd like to work on, but there is no corresponding issue or discussion thread yet for it, **please open a discussion or issue first** to avoid wasted effort. This in particular applies if you want to work on [one of the available designs from the osu! Figma master library](https://www.figma.com/file/VIkXMYNPMtQem2RJg9k2iQ/Master-Library).
|
If you'd like to propose a subjective change to one of the visual aspects of the game, or there is a bigger task you'd like to work on, but there is no corresponding issue or discussion thread yet for it, **please open a discussion or issue first** to avoid wasted effort. This in particular applies if you want to work on [one of the available designs from the osu! Figma master library](https://www.figma.com/file/VIkXMYNPMtQem2RJg9k2iQ/Master-Library).
|
||||||
|
|
||||||
@@ -73,6 +71,9 @@ Aside from the above, below is a brief checklist of things to watch out when you
|
|||||||
After you're done with your changes and you wish to open the PR, please observe the following recommendations:
|
After you're done with your changes and you wish to open the PR, please observe the following recommendations:
|
||||||
|
|
||||||
- Please submit the pull request from a [topic branch](https://git-scm.com/book/en/v2/Git-Branching-Branching-Workflows#_topic_branch) (not `master`), and keep the *Allow edits from maintainers* check box selected, so that we can push fixes to your PR if necessary.
|
- Please submit the pull request from a [topic branch](https://git-scm.com/book/en/v2/Git-Branching-Branching-Workflows#_topic_branch) (not `master`), and keep the *Allow edits from maintainers* check box selected, so that we can push fixes to your PR if necessary.
|
||||||
|
- Please pick the following target branch for your pull request:
|
||||||
|
- `pp-dev`, if the change impacts star rating or performance points calculations for any of the rulesets,
|
||||||
|
- `master`, otherwise.
|
||||||
- Please avoid pushing untested or incomplete code.
|
- Please avoid pushing untested or incomplete code.
|
||||||
- Please do not force-push or rebase unless we ask you to.
|
- Please do not force-push or rebase unless we ask you to.
|
||||||
- Please do not merge `master` continually if there are no conflicts to resolve. We will do this for you when the change is ready for merge.
|
- Please do not merge `master` continually if there are no conflicts to resolve. We will do this for you when the change is ready for merge.
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
<Project Sdk="Microsoft.NET.Sdk">
|
<Project Sdk="Microsoft.NET.Sdk">
|
||||||
<PropertyGroup>
|
<PropertyGroup>
|
||||||
<PackageType>Template</PackageType>
|
<PackageType>Template</PackageType>
|
||||||
<PackageId>ppy.osu.Game.Templates</PackageId>
|
<PackageId>jvnkosu.Client.Templates</PackageId>
|
||||||
<Title>osu! templates</Title>
|
<Title>osu! templates</Title>
|
||||||
<Authors>ppy Pty Ltd</Authors>
|
<Authors>ppy Pty Ltd</Authors>
|
||||||
<PackageLicenseUrl>https://github.com/ppy/osu/blob/master/LICENCE</PackageLicenseUrl>
|
<PackageLicenseUrl>https://github.com/ppy/osu/blob/master/LICENCE</PackageLicenseUrl>
|
||||||
|
|||||||
@@ -10,7 +10,7 @@
|
|||||||
<EmbedAssembliesIntoApk>true</EmbedAssembliesIntoApk>
|
<EmbedAssembliesIntoApk>true</EmbedAssembliesIntoApk>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<PackageReference Include="ppy.osu.Framework.Android" Version="2025.1028.0" />
|
<PackageReference Include="ppy.osu.Framework.Android" Version="2026.303.0" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<PropertyGroup>
|
<PropertyGroup>
|
||||||
<!-- Fody does not handle Android build well, and warns when unchanged.
|
<!-- Fody does not handle Android build well, and warns when unchanged.
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="sh.ppy.osulazer" android:installLocation="auto">
|
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="boats.jvnko.osu.android" android:installLocation="auto">
|
||||||
<uses-sdk android:minSdkVersion="21" android:targetSdkVersion="34" />
|
<uses-sdk android:minSdkVersion="21" android:targetSdkVersion="34" />
|
||||||
<application android:allowBackup="true"
|
<application android:allowBackup="true"
|
||||||
android:supportsRtl="true"
|
android:supportsRtl="true"
|
||||||
|
|||||||
@@ -29,7 +29,7 @@ namespace osu.Desktop
|
|||||||
{
|
{
|
||||||
internal partial class DiscordRichPresence : Component
|
internal partial class DiscordRichPresence : Component
|
||||||
{
|
{
|
||||||
private const string client_id = "1216669957799018608";
|
private const string client_id = "1440647613358800918";
|
||||||
|
|
||||||
private DiscordRpcClient client = null!;
|
private DiscordRpcClient client = null!;
|
||||||
|
|
||||||
|
|||||||
@@ -148,7 +148,13 @@ namespace osu.Desktop
|
|||||||
|
|
||||||
var iconStream = Assembly.GetExecutingAssembly().GetManifestResourceStream(GetType(), "lazer.ico");
|
var iconStream = Assembly.GetExecutingAssembly().GetManifestResourceStream(GetType(), "lazer.ico");
|
||||||
if (iconStream != null)
|
if (iconStream != null)
|
||||||
|
try
|
||||||
|
{
|
||||||
host.Window.SetIconFromStream(iconStream);
|
host.Window.SetIconFromStream(iconStream);
|
||||||
|
}
|
||||||
|
catch
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
host.Window.Title = Name;
|
host.Window.Title = Name;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -7,6 +7,7 @@ using osu.Framework.Allocation;
|
|||||||
using osu.Framework.Graphics;
|
using osu.Framework.Graphics;
|
||||||
using osu.Framework.Graphics.Sprites;
|
using osu.Framework.Graphics.Sprites;
|
||||||
using osu.Game.Graphics;
|
using osu.Game.Graphics;
|
||||||
|
using osu.Game.Localisation;
|
||||||
using osu.Game.Overlays;
|
using osu.Game.Overlays;
|
||||||
using osu.Game.Overlays.Notifications;
|
using osu.Game.Overlays.Notifications;
|
||||||
|
|
||||||
@@ -32,7 +33,7 @@ namespace osu.Desktop.Security
|
|||||||
{
|
{
|
||||||
public ElevatedPrivilegesNotification()
|
public ElevatedPrivilegesNotification()
|
||||||
{
|
{
|
||||||
Text = $"Running osu! as {(RuntimeInfo.IsUnix ? "root" : "administrator")} does not improve performance, may break integrations and poses a security risk. Please run the game as a normal user.";
|
Text = NotificationsStrings.ElevatedPrivileges(RuntimeInfo.IsUnix ? "root" : "Administrator");
|
||||||
}
|
}
|
||||||
|
|
||||||
[BackgroundDependencyLoader]
|
[BackgroundDependencyLoader]
|
||||||
|
|||||||
@@ -53,8 +53,8 @@ namespace osu.Desktop.Windows
|
|||||||
|
|
||||||
private static readonly UriAssociation[] uri_associations =
|
private static readonly UriAssociation[] uri_associations =
|
||||||
{
|
{
|
||||||
new UriAssociation(@"osu", WindowsAssociationManagerStrings.OsuProtocol, Icons.Lazer),
|
new UriAssociation(@"jvnkosu", WindowsAssociationManagerStrings.OsuProtocol, Icons.Lazer),
|
||||||
new UriAssociation(@"osump", WindowsAssociationManagerStrings.OsuMultiplayer, Icons.Lazer),
|
new UriAssociation(@"jvnkosump", WindowsAssociationManagerStrings.OsuMultiplayer, Icons.Lazer),
|
||||||
};
|
};
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ using BenchmarkDotNet.Attributes;
|
|||||||
using osu.Game.Beatmaps;
|
using osu.Game.Beatmaps;
|
||||||
using osu.Game.Rulesets;
|
using osu.Game.Rulesets;
|
||||||
using osu.Game.Screens.Select;
|
using osu.Game.Screens.Select;
|
||||||
using osu.Game.Screens.Select.Carousel;
|
using osu.Game.Tests.NonVisual.Filtering;
|
||||||
|
|
||||||
namespace osu.Game.Benchmarks
|
namespace osu.Game.Benchmarks
|
||||||
{
|
{
|
||||||
@@ -42,7 +42,7 @@ namespace osu.Game.Benchmarks
|
|||||||
Status = BeatmapOnlineStatus.Loved
|
Status = BeatmapOnlineStatus.Loved
|
||||||
};
|
};
|
||||||
|
|
||||||
private CarouselBeatmap carouselBeatmap = null!;
|
private FilterMatchingTest.CarouselBeatmap carouselBeatmap = null!;
|
||||||
private FilterCriteria criteria1 = null!;
|
private FilterCriteria criteria1 = null!;
|
||||||
private FilterCriteria criteria2 = null!;
|
private FilterCriteria criteria2 = null!;
|
||||||
private FilterCriteria criteria3 = null!;
|
private FilterCriteria criteria3 = null!;
|
||||||
@@ -55,7 +55,7 @@ namespace osu.Game.Benchmarks
|
|||||||
var beatmap = getExampleBeatmap();
|
var beatmap = getExampleBeatmap();
|
||||||
beatmap.OnlineID = 20201010;
|
beatmap.OnlineID = 20201010;
|
||||||
beatmap.BeatmapSet = new BeatmapSetInfo { OnlineID = 1535 };
|
beatmap.BeatmapSet = new BeatmapSetInfo { OnlineID = 1535 };
|
||||||
carouselBeatmap = new CarouselBeatmap(beatmap);
|
carouselBeatmap = new FilterMatchingTest.CarouselBeatmap(beatmap);
|
||||||
criteria1 = new FilterCriteria();
|
criteria1 = new FilterCriteria();
|
||||||
criteria2 = new FilterCriteria
|
criteria2 = new FilterCriteria
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -35,8 +35,6 @@
|
|||||||
<string>UIInterfaceOrientationLandscapeRight</string>
|
<string>UIInterfaceOrientationLandscapeRight</string>
|
||||||
<string>UIInterfaceOrientationLandscapeLeft</string>
|
<string>UIInterfaceOrientationLandscapeLeft</string>
|
||||||
</array>
|
</array>
|
||||||
<key>XSAppIconAssets</key>
|
|
||||||
<string>Assets.xcassets/AppIcon.appiconset</string>
|
|
||||||
<key>UIApplicationSupportsIndirectInputEvents</key>
|
<key>UIApplicationSupportsIndirectInputEvents</key>
|
||||||
<true/>
|
<true/>
|
||||||
<key>CADisableMinimumFrameDurationOnPhone</key>
|
<key>CADisableMinimumFrameDurationOnPhone</key>
|
||||||
|
|||||||
@@ -176,15 +176,20 @@ namespace osu.Game.Rulesets.Catch
|
|||||||
|
|
||||||
public override Drawable CreateIcon() => new SpriteIcon { Icon = OsuIcon.RulesetCatch };
|
public override Drawable CreateIcon() => new SpriteIcon { Icon = OsuIcon.RulesetCatch };
|
||||||
|
|
||||||
protected override IEnumerable<HitResult> GetValidHitResults()
|
public override IEnumerable<HitResult> GetValidHitResults()
|
||||||
{
|
{
|
||||||
return new[]
|
return new[]
|
||||||
{
|
{
|
||||||
HitResult.Great,
|
HitResult.Great,
|
||||||
|
HitResult.Miss,
|
||||||
|
|
||||||
HitResult.LargeTickHit,
|
HitResult.LargeTickHit,
|
||||||
|
HitResult.LargeTickMiss,
|
||||||
HitResult.SmallTickHit,
|
HitResult.SmallTickHit,
|
||||||
|
HitResult.SmallTickMiss,
|
||||||
HitResult.LargeBonus,
|
HitResult.LargeBonus,
|
||||||
|
HitResult.IgnoreHit,
|
||||||
|
HitResult.IgnoreMiss,
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -300,7 +305,7 @@ namespace osu.Game.Rulesets.Catch
|
|||||||
Description = "Affects how early fruits fade in on the screen.",
|
Description = "Affects how early fruits fade in on the screen.",
|
||||||
AdditionalMetrics =
|
AdditionalMetrics =
|
||||||
[
|
[
|
||||||
new RulesetBeatmapAttribute.AdditionalMetric("Fade-in time", LocalisableString.Interpolate($@"{IBeatmapDifficultyInfo.DifficultyRange(effectiveDifficulty.ApproachRate, CatchHitObject.PREEMPT_RANGE):#,0.##} ms"))
|
new RulesetBeatmapAttribute.AdditionalMetric("Fade-in time", LocalisableString.Interpolate($@"{IBeatmapDifficultyInfo.DifficultyRangeInt(effectiveDifficulty.ApproachRate, CatchHitObject.PREEMPT_RANGE):#,0.##} ms"))
|
||||||
]
|
]
|
||||||
};
|
};
|
||||||
yield return new RulesetBeatmapAttribute(SongSelectStrings.HPDrain, @"HP", originalDifficulty.DrainRate, effectiveDifficulty.DrainRate, 10)
|
yield return new RulesetBeatmapAttribute(SongSelectStrings.HPDrain, @"HP", originalDifficulty.DrainRate, effectiveDifficulty.DrainRate, 10)
|
||||||
|
|||||||
@@ -19,7 +19,7 @@ namespace osu.Game.Rulesets.Catch.Edit.Blueprints
|
|||||||
private double placementStartTime;
|
private double placementStartTime;
|
||||||
private double placementEndTime;
|
private double placementEndTime;
|
||||||
|
|
||||||
protected override bool IsValidForPlacement => Precision.DefinitelyBigger(HitObject.Duration, 0);
|
protected override bool IsValidForPlacement => base.IsValidForPlacement && (PlacementActive == PlacementState.Waiting || Precision.DefinitelyBigger(HitObject.Duration, 0));
|
||||||
|
|
||||||
public BananaShowerPlacementBlueprint()
|
public BananaShowerPlacementBlueprint()
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -25,7 +25,7 @@ namespace osu.Game.Rulesets.Catch.Edit.Blueprints
|
|||||||
|
|
||||||
private InputManager inputManager = null!;
|
private InputManager inputManager = null!;
|
||||||
|
|
||||||
protected override bool IsValidForPlacement => Precision.DefinitelyBigger(HitObject.Duration, 0);
|
protected override bool IsValidForPlacement => base.IsValidForPlacement && (PlacementActive == PlacementState.Waiting || Precision.DefinitelyBigger(HitObject.Duration, 0));
|
||||||
|
|
||||||
public JuiceStreamPlacementBlueprint()
|
public JuiceStreamPlacementBlueprint()
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -2,6 +2,7 @@
|
|||||||
// See the LICENCE file in the repository root for full licence text.
|
// See the LICENCE file in the repository root for full licence text.
|
||||||
|
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
|
using System.Globalization;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Text.RegularExpressions;
|
using System.Text.RegularExpressions;
|
||||||
using osu.Framework.Allocation;
|
using osu.Framework.Allocation;
|
||||||
@@ -224,7 +225,8 @@ namespace osu.Game.Rulesets.Catch.Edit
|
|||||||
#region Clipboard handling
|
#region Clipboard handling
|
||||||
|
|
||||||
public override string ConvertSelectionToString()
|
public override string ConvertSelectionToString()
|
||||||
=> string.Join(',', EditorBeatmap.SelectedHitObjects.Cast<CatchHitObject>().OrderBy(h => h.StartTime).Select(h => (h.IndexInCurrentCombo + 1).ToString()));
|
=> string.Join(',', EditorBeatmap.SelectedHitObjects.Cast<CatchHitObject>().OrderBy(h => h.StartTime)
|
||||||
|
.Select(h => (h.IndexInCurrentCombo + 1).ToString(CultureInfo.InvariantCulture)));
|
||||||
|
|
||||||
// 1,2,3,4 ...
|
// 1,2,3,4 ...
|
||||||
private static readonly Regex selection_regex = new Regex(@"^\d+(,\d+)*$", RegexOptions.Compiled);
|
private static readonly Regex selection_regex = new Regex(@"^\d+(,\d+)*$", RegexOptions.Compiled);
|
||||||
|
|||||||
@@ -150,7 +150,7 @@ namespace osu.Game.Rulesets.Catch.Objects
|
|||||||
{
|
{
|
||||||
base.ApplyDefaultsToSelf(controlPointInfo, difficulty);
|
base.ApplyDefaultsToSelf(controlPointInfo, difficulty);
|
||||||
|
|
||||||
TimePreempt = (float)IBeatmapDifficultyInfo.DifficultyRange(difficulty.ApproachRate, PREEMPT_RANGE);
|
TimePreempt = IBeatmapDifficultyInfo.DifficultyRangeInt(difficulty.ApproachRate, PREEMPT_RANGE);
|
||||||
|
|
||||||
Scale = LegacyRulesetExtensions.CalculateScaleFromCircleSize(difficulty.CircleSize);
|
Scale = LegacyRulesetExtensions.CalculateScaleFromCircleSize(difficulty.CircleSize);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -72,6 +72,9 @@ namespace osu.Game.Rulesets.Catch.Skinning.Legacy
|
|||||||
leaderboard.Origin = Anchor.CentreLeft;
|
leaderboard.Origin = Anchor.CentreLeft;
|
||||||
leaderboard.X = 10;
|
leaderboard.X = 10;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
foreach (var d in container.OfType<ISerialisableDrawable>())
|
||||||
|
d.UsesFixedAnchor = true;
|
||||||
})
|
})
|
||||||
{
|
{
|
||||||
Children = new Drawable[]
|
Children = new Drawable[]
|
||||||
|
|||||||
@@ -8,7 +8,7 @@
|
|||||||
|
|
||||||
<PropertyGroup Label="Nuget">
|
<PropertyGroup Label="Nuget">
|
||||||
<Title>osu!catch (ruleset)</Title>
|
<Title>osu!catch (ruleset)</Title>
|
||||||
<PackageId>ppy.osu.Game.Rulesets.Catch</PackageId>
|
<PackageId>jvnkosu.Client.Rulesets.Catch</PackageId>
|
||||||
<IsPackable>true</IsPackable>
|
<IsPackable>true</IsPackable>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
|
|||||||
@@ -35,8 +35,6 @@
|
|||||||
<string>UIInterfaceOrientationLandscapeRight</string>
|
<string>UIInterfaceOrientationLandscapeRight</string>
|
||||||
<string>UIInterfaceOrientationLandscapeLeft</string>
|
<string>UIInterfaceOrientationLandscapeLeft</string>
|
||||||
</array>
|
</array>
|
||||||
<key>XSAppIconAssets</key>
|
|
||||||
<string>Assets.xcassets/AppIcon.appiconset</string>
|
|
||||||
<key>UIApplicationSupportsIndirectInputEvents</key>
|
<key>UIApplicationSupportsIndirectInputEvents</key>
|
||||||
<true/>
|
<true/>
|
||||||
<key>CADisableMinimumFrameDurationOnPhone</key>
|
<key>CADisableMinimumFrameDurationOnPhone</key>
|
||||||
|
|||||||
@@ -5,6 +5,7 @@
|
|||||||
|
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using NUnit.Framework;
|
using NUnit.Framework;
|
||||||
|
using osu.Framework.Allocation;
|
||||||
using osu.Framework.Extensions.IEnumerableExtensions;
|
using osu.Framework.Extensions.IEnumerableExtensions;
|
||||||
using osu.Framework.Testing;
|
using osu.Framework.Testing;
|
||||||
using osu.Game.Rulesets.Edit;
|
using osu.Game.Rulesets.Edit;
|
||||||
@@ -16,6 +17,7 @@ using osu.Game.Rulesets.Objects;
|
|||||||
using osu.Game.Rulesets.Objects.Drawables;
|
using osu.Game.Rulesets.Objects.Drawables;
|
||||||
using osu.Game.Rulesets.UI;
|
using osu.Game.Rulesets.UI;
|
||||||
using osu.Game.Rulesets.UI.Scrolling;
|
using osu.Game.Rulesets.UI.Scrolling;
|
||||||
|
using osu.Game.Screens.Edit;
|
||||||
using osu.Game.Tests.Visual;
|
using osu.Game.Tests.Visual;
|
||||||
using osuTK.Input;
|
using osuTK.Input;
|
||||||
|
|
||||||
@@ -36,21 +38,8 @@ namespace osu.Game.Rulesets.Mania.Tests.Editor
|
|||||||
[Test]
|
[Test]
|
||||||
public void TestPlaceBeforeCurrentTimeDownwards()
|
public void TestPlaceBeforeCurrentTimeDownwards()
|
||||||
{
|
{
|
||||||
|
AddStep("seek to 200", () => HitObjectContainer.Dependencies.Get<EditorClock>().Seek(200));
|
||||||
AddStep("move mouse before current time", () =>
|
AddStep("move mouse before current time", () =>
|
||||||
{
|
|
||||||
var column = this.ChildrenOfType<Column>().Single();
|
|
||||||
InputManager.MoveMouseTo(column.ScreenSpacePositionAtTime(-100));
|
|
||||||
});
|
|
||||||
|
|
||||||
AddStep("click", () => InputManager.Click(MouseButton.Left));
|
|
||||||
|
|
||||||
AddAssert("note start time < 0", () => getNote().StartTime < 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
[Test]
|
|
||||||
public void TestPlaceAfterCurrentTimeDownwards()
|
|
||||||
{
|
|
||||||
AddStep("move mouse after current time", () =>
|
|
||||||
{
|
{
|
||||||
var column = this.ChildrenOfType<Column>().Single();
|
var column = this.ChildrenOfType<Column>().Single();
|
||||||
InputManager.MoveMouseTo(column.ScreenSpacePositionAtTime(100));
|
InputManager.MoveMouseTo(column.ScreenSpacePositionAtTime(100));
|
||||||
@@ -58,7 +47,22 @@ namespace osu.Game.Rulesets.Mania.Tests.Editor
|
|||||||
|
|
||||||
AddStep("click", () => InputManager.Click(MouseButton.Left));
|
AddStep("click", () => InputManager.Click(MouseButton.Left));
|
||||||
|
|
||||||
AddAssert("note start time > 0", () => getNote().StartTime > 0);
|
AddAssert("note start time < 200", () => getNote().StartTime < 200);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void TestPlaceAfterCurrentTimeDownwards()
|
||||||
|
{
|
||||||
|
AddStep("seek to 200", () => HitObjectContainer.Dependencies.Get<EditorClock>().Seek(200));
|
||||||
|
AddStep("move mouse after current time", () =>
|
||||||
|
{
|
||||||
|
var column = this.ChildrenOfType<Column>().Single();
|
||||||
|
InputManager.MoveMouseTo(column.ScreenSpacePositionAtTime(300));
|
||||||
|
});
|
||||||
|
|
||||||
|
AddStep("click", () => InputManager.Click(MouseButton.Left));
|
||||||
|
|
||||||
|
AddAssert("note start time > 200", () => getNote().StartTime > 200);
|
||||||
}
|
}
|
||||||
|
|
||||||
private Note getNote() => this.ChildrenOfType<DrawableNote>().FirstOrDefault()?.HitObject;
|
private Note getNote() => this.ChildrenOfType<DrawableNote>().FirstOrDefault()?.HitObject;
|
||||||
|
|||||||
@@ -18,15 +18,11 @@ namespace osu.Game.Rulesets.Mania.Tests.Editor
|
|||||||
public void TestNormalSelection()
|
public void TestNormalSelection()
|
||||||
{
|
{
|
||||||
addStepClickLink("00:05:920 (5920|3,6623|3,6857|2,7326|1)");
|
addStepClickLink("00:05:920 (5920|3,6623|3,6857|2,7326|1)");
|
||||||
AddAssert("selected group", () => checkSnapAndSelectColumn(5_920, new List<(int, int)>
|
AddAssert("selected group", () => checkSnapAndSelectColumn(5_920, [(5_920, 3), (6_623, 3), (6_857, 2), (7_326, 1)]));
|
||||||
{ (5_920, 3), (6_623, 3), (6_857, 2), (7_326, 1) }
|
|
||||||
));
|
|
||||||
|
|
||||||
addReset();
|
addReset();
|
||||||
addStepClickLink("00:42:716 (42716|3,43420|2,44123|0,44357|1,45295|1)");
|
addStepClickLink("00:42:716 (42716|3,43420|2,44123|0,44357|1,45295|1)");
|
||||||
AddAssert("selected ungrouped", () => checkSnapAndSelectColumn(42_716, new List<(int, int)>
|
AddAssert("selected ungrouped", () => checkSnapAndSelectColumn(42_716, [(42_716, 3), (43_420, 2), (44_123, 0), (44_357, 1), (45_295, 1)]));
|
||||||
{ (42_716, 3), (43_420, 2), (44_123, 0), (44_357, 1), (45_295, 1) }
|
|
||||||
));
|
|
||||||
|
|
||||||
addReset();
|
addReset();
|
||||||
AddStep("add notes to row", () =>
|
AddStep("add notes to row", () =>
|
||||||
@@ -41,15 +37,20 @@ namespace osu.Game.Rulesets.Mania.Tests.Editor
|
|||||||
EditorBeatmap.AddRange(new[] { second, third, forth });
|
EditorBeatmap.AddRange(new[] { second, third, forth });
|
||||||
});
|
});
|
||||||
addStepClickLink("00:11:545 (11545|0,11545|1,11545|2,11545|3)");
|
addStepClickLink("00:11:545 (11545|0,11545|1,11545|2,11545|3)");
|
||||||
AddAssert("selected in row", () => checkSnapAndSelectColumn(11_545, new List<(int, int)>
|
AddAssert("selected in row", () => checkSnapAndSelectColumn(11_545, [(11_545, 0), (11_545, 1), (11_545, 2), (11_545, 3)]));
|
||||||
{ (11_545, 0), (11_545, 1), (11_545, 2), (11_545, 3) }
|
|
||||||
));
|
|
||||||
|
|
||||||
addReset();
|
addReset();
|
||||||
addStepClickLink("01:36:623 (96623|1,97560|1,97677|1,97795|1,98966|1)");
|
addStepClickLink("01:36:623 (96623|1,97560|1,97677|1,97795|1,98966|1)");
|
||||||
AddAssert("selected in column", () => checkSnapAndSelectColumn(96_623, new List<(int, int)>
|
AddAssert("selected in column", () => checkSnapAndSelectColumn(96_623, [(96_623, 1), (97_560, 1), (97_677, 1), (97_795, 1), (98_966, 1)]));
|
||||||
{ (96_623, 1), (97_560, 1), (97_677, 1), (97_795, 1), (98_966, 1) }
|
}
|
||||||
));
|
|
||||||
|
[Test]
|
||||||
|
public void TestRoundingToNearestMillisecondApplied()
|
||||||
|
{
|
||||||
|
AddStep("resnap note to have fractional coordinates",
|
||||||
|
() => EditorBeatmap.HitObjects.OfType<ManiaHitObject>().Single(ho => ho.StartTime == 85_373 && ho.Column == 1).StartTime = 85_373.125);
|
||||||
|
addStepClickLink("01:25:373 (85373|1)");
|
||||||
|
AddAssert("selected note", () => checkSnapAndSelectColumn(85_373.125, [(85_373.125, 1)]));
|
||||||
}
|
}
|
||||||
|
|
||||||
[Test]
|
[Test]
|
||||||
@@ -75,7 +76,7 @@ namespace osu.Game.Rulesets.Mania.Tests.Editor
|
|||||||
|
|
||||||
private void addReset() => addStepClickLink("00:00:000", "reset", false);
|
private void addReset() => addStepClickLink("00:00:000", "reset", false);
|
||||||
|
|
||||||
private bool checkSnapAndSelectColumn(double startTime, IReadOnlyCollection<(int, int)>? columnPairs = null)
|
private bool checkSnapAndSelectColumn(double startTime, IReadOnlyCollection<(double, int)>? columnPairs = null)
|
||||||
{
|
{
|
||||||
bool checkColumns = columnPairs != null
|
bool checkColumns = columnPairs != null
|
||||||
? EditorBeatmap.SelectedHitObjects.All(x => columnPairs.Any(col => isNoteAt(x, col.Item1, col.Item2)))
|
? EditorBeatmap.SelectedHitObjects.All(x => columnPairs.Any(col => isNoteAt(x, col.Item1, col.Item2)))
|
||||||
|
|||||||
@@ -24,6 +24,7 @@ namespace osu.Game.Rulesets.Mania.Tests
|
|||||||
[TestCase("mania-samples")]
|
[TestCase("mania-samples")]
|
||||||
[TestCase("mania-slider")] // e.g. second and fourth notes of https://osu.ppy.sh/beatmapsets/73883#mania/216407
|
[TestCase("mania-slider")] // e.g. second and fourth notes of https://osu.ppy.sh/beatmapsets/73883#mania/216407
|
||||||
[TestCase("slider-convert-samples")]
|
[TestCase("slider-convert-samples")]
|
||||||
|
[TestCase("spinner-convert-samples")]
|
||||||
public void Test(string name) => base.Test(name);
|
public void Test(string name) => base.Test(name);
|
||||||
|
|
||||||
protected override IEnumerable<SampleConvertValue> CreateConvertValue(HitObject hitObject)
|
protected override IEnumerable<SampleConvertValue> CreateConvertValue(HitObject hitObject)
|
||||||
|
|||||||
@@ -0,0 +1,10 @@
|
|||||||
|
osu file format v14
|
||||||
|
|
||||||
|
[General]
|
||||||
|
Mode: 0
|
||||||
|
|
||||||
|
[TimingPoints]
|
||||||
|
0,300,4,0,2,100,1,0
|
||||||
|
|
||||||
|
[HitObjects]
|
||||||
|
444,320,1000,5,2,0:0:0:0:
|
||||||
@@ -0,0 +1,16 @@
|
|||||||
|
{
|
||||||
|
"Mappings": [{
|
||||||
|
"StartTime": 1000.0,
|
||||||
|
"Objects": [{
|
||||||
|
"StartTime": 1000.0,
|
||||||
|
"EndTime": 8000.0,
|
||||||
|
"Column": 0,
|
||||||
|
"PlaySlidingSamples": false,
|
||||||
|
"NodeSamples": [
|
||||||
|
["Gameplay/soft-hitnormal"],
|
||||||
|
["Gameplay/soft-hitnormal", "Gameplay/soft-hitfinish"]
|
||||||
|
],
|
||||||
|
"Samples": ["Gameplay/soft-hitnormal", "Gameplay/soft-hitfinish"],
|
||||||
|
}]
|
||||||
|
}]
|
||||||
|
}
|
||||||
@@ -0,0 +1,18 @@
|
|||||||
|
osu file format v14
|
||||||
|
|
||||||
|
[General]
|
||||||
|
Mode: 0
|
||||||
|
|
||||||
|
[Difficulty]
|
||||||
|
HPDrainRate:5
|
||||||
|
CircleSize:5
|
||||||
|
OverallDifficulty:5
|
||||||
|
ApproachRate:5
|
||||||
|
SliderMultiplier:1.4
|
||||||
|
SliderTickRate:1
|
||||||
|
|
||||||
|
[TimingPoints]
|
||||||
|
0,500,4,2,0,100,1,0
|
||||||
|
|
||||||
|
[HitObjects]
|
||||||
|
256,192,1000,8,4,8000,0:2:0:0:
|
||||||
@@ -45,5 +45,19 @@ namespace osu.Game.Rulesets.Mania.Tests
|
|||||||
AssertBeatmapLookup(expected_sample);
|
AssertBeatmapLookup(expected_sample);
|
||||||
AssertNoLookup(unwanted_sample);
|
AssertNoLookup(unwanted_sample);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void TestConvertHitObjectCustomSampleBank()
|
||||||
|
{
|
||||||
|
const string beatmap_sample = "normal-hitwhistle2";
|
||||||
|
const string user_skin_sample = "normal-hitnormal";
|
||||||
|
|
||||||
|
SetupSkins(beatmap_sample, user_skin_sample);
|
||||||
|
|
||||||
|
CreateTestWithBeatmap("convert-beatmap-custom-sample-bank.osu");
|
||||||
|
|
||||||
|
AssertBeatmapLookup(beatmap_sample);
|
||||||
|
AssertUserLookup(user_skin_sample);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -85,7 +85,11 @@ namespace osu.Game.Rulesets.Mania.Beatmaps.Patterns.Legacy
|
|||||||
Duration = endTime - HitObject.StartTime,
|
Duration = endTime - HitObject.StartTime,
|
||||||
Column = column,
|
Column = column,
|
||||||
Samples = HitObject.Samples,
|
Samples = HitObject.Samples,
|
||||||
NodeSamples = (HitObject as IHasRepeats)?.NodeSamples
|
NodeSamples =
|
||||||
|
[
|
||||||
|
HitObject.Samples.Where(s => s.Name == HitSampleInfo.HIT_NORMAL).ToList(),
|
||||||
|
HitObject.Samples
|
||||||
|
]
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
|||||||
@@ -26,7 +26,7 @@ namespace osu.Game.Rulesets.Mania.Edit.Blueprints
|
|||||||
[Resolved]
|
[Resolved]
|
||||||
private IScrollingInfo scrollingInfo { get; set; } = null!;
|
private IScrollingInfo scrollingInfo { get; set; } = null!;
|
||||||
|
|
||||||
protected override bool IsValidForPlacement => Precision.DefinitelyBigger(HitObject.Duration, 0);
|
protected override bool IsValidForPlacement => base.IsValidForPlacement && (PlacementActive == PlacementState.Waiting || Precision.DefinitelyBigger(HitObject.Duration, 0));
|
||||||
|
|
||||||
public HoldNotePlacementBlueprint()
|
public HoldNotePlacementBlueprint()
|
||||||
: base(new HoldNote())
|
: base(new HoldNote())
|
||||||
|
|||||||
@@ -1,10 +1,12 @@
|
|||||||
// Copyright (c) ppy Pty Ltd <contact@ppy.sh>. Licensed under the MIT Licence.
|
// Copyright (c) ppy Pty Ltd <contact@ppy.sh>. Licensed under the MIT Licence.
|
||||||
// See the LICENCE file in the repository root for full licence text.
|
// See the LICENCE file in the repository root for full licence text.
|
||||||
|
|
||||||
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Text.RegularExpressions;
|
using System.Text.RegularExpressions;
|
||||||
using osu.Framework.Allocation;
|
using osu.Framework.Allocation;
|
||||||
|
using osu.Framework.Utils;
|
||||||
using osu.Game.Beatmaps;
|
using osu.Game.Beatmaps;
|
||||||
using osu.Game.Rulesets.Edit;
|
using osu.Game.Rulesets.Edit;
|
||||||
using osu.Game.Rulesets.Edit.Tools;
|
using osu.Game.Rulesets.Edit.Tools;
|
||||||
@@ -54,7 +56,8 @@ namespace osu.Game.Rulesets.Mania.Edit
|
|||||||
};
|
};
|
||||||
|
|
||||||
public override string ConvertSelectionToString()
|
public override string ConvertSelectionToString()
|
||||||
=> string.Join(',', EditorBeatmap.SelectedHitObjects.Cast<ManiaHitObject>().OrderBy(h => h.StartTime).Select(h => $"{h.StartTime}|{h.Column}"));
|
=> string.Join(',', EditorBeatmap.SelectedHitObjects.Cast<ManiaHitObject>().OrderBy(h => h.StartTime)
|
||||||
|
.Select(h => FormattableString.Invariant($"{Math.Round(h.StartTime)}|{h.Column}")));
|
||||||
|
|
||||||
// 123|0,456|1,789|2 ...
|
// 123|0,456|1,789|2 ...
|
||||||
private static readonly Regex selection_regex = new Regex(@"^\d+\|\d+(,\d+\|\d+)*$", RegexOptions.Compiled);
|
private static readonly Regex selection_regex = new Regex(@"^\d+\|\d+(,\d+\|\d+)*$", RegexOptions.Compiled);
|
||||||
@@ -73,10 +76,10 @@ namespace osu.Game.Rulesets.Mania.Edit
|
|||||||
if (split.Length != 2)
|
if (split.Length != 2)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if (!double.TryParse(split[0], out double time) || !int.TryParse(split[1], out int column))
|
if (!int.TryParse(split[0], out int time) || !int.TryParse(split[1], out int column))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
ManiaHitObject? current = remainingHitObjects.FirstOrDefault(h => h.StartTime == time && h.Column == column);
|
ManiaHitObject? current = remainingHitObjects.FirstOrDefault(h => Precision.AlmostEquals(h.StartTime, time, 0.5) && h.Column == column);
|
||||||
|
|
||||||
if (current == null)
|
if (current == null)
|
||||||
continue;
|
continue;
|
||||||
|
|||||||
@@ -383,7 +383,7 @@ namespace osu.Game.Rulesets.Mania
|
|||||||
return (PlayfieldType)Enum.GetValues(typeof(PlayfieldType)).Cast<int>().OrderDescending().First(v => variant >= v);
|
return (PlayfieldType)Enum.GetValues(typeof(PlayfieldType)).Cast<int>().OrderDescending().First(v => variant >= v);
|
||||||
}
|
}
|
||||||
|
|
||||||
protected override IEnumerable<HitResult> GetValidHitResults()
|
public override IEnumerable<HitResult> GetValidHitResults()
|
||||||
{
|
{
|
||||||
return new[]
|
return new[]
|
||||||
{
|
{
|
||||||
@@ -392,9 +392,11 @@ namespace osu.Game.Rulesets.Mania
|
|||||||
HitResult.Good,
|
HitResult.Good,
|
||||||
HitResult.Ok,
|
HitResult.Ok,
|
||||||
HitResult.Meh,
|
HitResult.Meh,
|
||||||
|
HitResult.Miss,
|
||||||
|
|
||||||
// HitResult.SmallBonus is used for awarding perfect bonus score but is not included here as
|
HitResult.IgnoreHit,
|
||||||
// it would be a bit redundant to show this to the user.
|
HitResult.ComboBreak,
|
||||||
|
HitResult.IgnoreMiss,
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -7,7 +7,7 @@ using osu.Framework;
|
|||||||
using osu.Framework.Allocation;
|
using osu.Framework.Allocation;
|
||||||
using osu.Framework.Graphics;
|
using osu.Framework.Graphics;
|
||||||
using osu.Framework.Localisation;
|
using osu.Framework.Localisation;
|
||||||
using osu.Game.Graphics.UserInterface;
|
using osu.Game.Graphics.UserInterfaceV2;
|
||||||
using osu.Game.Localisation;
|
using osu.Game.Localisation;
|
||||||
using osu.Game.Overlays.Settings;
|
using osu.Game.Overlays.Settings;
|
||||||
using osu.Game.Rulesets.Mania.Configuration;
|
using osu.Game.Rulesets.Mania.Configuration;
|
||||||
@@ -31,47 +31,45 @@ namespace osu.Game.Rulesets.Mania
|
|||||||
|
|
||||||
Children = new Drawable[]
|
Children = new Drawable[]
|
||||||
{
|
{
|
||||||
new SettingsEnumDropdown<ManiaScrollingDirection>
|
new SettingsItemV2(new FormEnumDropdown<ManiaScrollingDirection>
|
||||||
{
|
{
|
||||||
LabelText = RulesetSettingsStrings.ScrollingDirection,
|
Caption = RulesetSettingsStrings.ScrollingDirection,
|
||||||
Current = config.GetBindable<ManiaScrollingDirection>(ManiaRulesetSetting.ScrollDirection)
|
Current = config.GetBindable<ManiaScrollingDirection>(ManiaRulesetSetting.ScrollDirection)
|
||||||
},
|
}),
|
||||||
new SettingsSlider<double, ManiaScrollSlider>
|
new SettingsItemV2(new FormSliderBar<double>
|
||||||
{
|
{
|
||||||
LabelText = RulesetSettingsStrings.ScrollSpeed,
|
Caption = RulesetSettingsStrings.ScrollSpeed,
|
||||||
Current = config.GetBindable<double>(ManiaRulesetSetting.ScrollSpeed),
|
Current = config.GetBindable<double>(ManiaRulesetSetting.ScrollSpeed),
|
||||||
KeyboardStep = 1
|
KeyboardStep = 1,
|
||||||
},
|
LabelFormat = v => RulesetSettingsStrings.ScrollSpeedTooltip((int)DrawableManiaRuleset.ComputeScrollTime(v), v),
|
||||||
new SettingsCheckbox
|
}),
|
||||||
|
new SettingsItemV2(new FormCheckBox
|
||||||
|
{
|
||||||
|
Caption = RulesetSettingsStrings.TimingBasedColouring,
|
||||||
|
Current = config.GetBindable<bool>(ManiaRulesetSetting.TimingBasedNoteColouring),
|
||||||
|
})
|
||||||
{
|
{
|
||||||
Keywords = new[] { "color" },
|
Keywords = new[] { "color" },
|
||||||
LabelText = RulesetSettingsStrings.TimingBasedColouring,
|
|
||||||
Current = config.GetBindable<bool>(ManiaRulesetSetting.TimingBasedNoteColouring),
|
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
Add(new SettingsCheckbox
|
Add(new SettingsItemV2(new FormCheckBox
|
||||||
{
|
{
|
||||||
LabelText = RulesetSettingsStrings.TouchOverlay,
|
Caption = RulesetSettingsStrings.TouchOverlay,
|
||||||
Current = config.GetBindable<bool>(ManiaRulesetSetting.TouchOverlay)
|
Current = config.GetBindable<bool>(ManiaRulesetSetting.TouchOverlay)
|
||||||
});
|
}));
|
||||||
|
|
||||||
if (RuntimeInfo.IsMobile)
|
if (RuntimeInfo.IsMobile)
|
||||||
{
|
{
|
||||||
Add(new SettingsEnumDropdown<ManiaMobileLayout>
|
Add(new SettingsItemV2(new FormEnumDropdown<ManiaMobileLayout>
|
||||||
{
|
{
|
||||||
LabelText = RulesetSettingsStrings.MobileLayout,
|
Caption = RulesetSettingsStrings.MobileLayout,
|
||||||
Current = config.GetBindable<ManiaMobileLayout>(ManiaRulesetSetting.MobileLayout),
|
Current = config.GetBindable<ManiaMobileLayout>(ManiaRulesetSetting.MobileLayout),
|
||||||
#pragma warning disable CS0618 // Type or member is obsolete
|
#pragma warning disable CS0618 // Type or member is obsolete
|
||||||
Items = Enum.GetValues<ManiaMobileLayout>().Where(l => l != ManiaMobileLayout.LandscapeWithOverlay),
|
Items = Enum.GetValues<ManiaMobileLayout>().Where(l => l != ManiaMobileLayout.LandscapeWithOverlay),
|
||||||
#pragma warning restore CS0618 // Type or member is obsolete
|
#pragma warning restore CS0618 // Type or member is obsolete
|
||||||
});
|
}));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private partial class ManiaScrollSlider : RoundedSliderBar<double>
|
|
||||||
{
|
|
||||||
public override LocalisableString TooltipText => RulesetSettingsStrings.ScrollSpeedTooltip((int)DrawableManiaRuleset.ComputeScrollTime(Current.Value), Current.Value);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -57,6 +57,9 @@ namespace osu.Game.Rulesets.Mania.Skinning.Argon
|
|||||||
|
|
||||||
if (spectatorList != null)
|
if (spectatorList != null)
|
||||||
spectatorList.Position = new Vector2(36, -66);
|
spectatorList.Position = new Vector2(36, -66);
|
||||||
|
|
||||||
|
foreach (var d in container.OfType<ISerialisableDrawable>())
|
||||||
|
d.UsesFixedAnchor = true;
|
||||||
})
|
})
|
||||||
{
|
{
|
||||||
new DrawableGameplayLeaderboard(),
|
new DrawableGameplayLeaderboard(),
|
||||||
|
|||||||
@@ -64,11 +64,13 @@ namespace osu.Game.Rulesets.Mania.Skinning.Legacy
|
|||||||
private readonly Lazy<bool> hasKeyTexture;
|
private readonly Lazy<bool> hasKeyTexture;
|
||||||
|
|
||||||
private readonly ManiaBeatmap beatmap;
|
private readonly ManiaBeatmap beatmap;
|
||||||
|
private readonly bool isBeatmapConverted;
|
||||||
|
|
||||||
public ManiaLegacySkinTransformer(ISkin skin, IBeatmap beatmap)
|
public ManiaLegacySkinTransformer(ISkin skin, IBeatmap beatmap)
|
||||||
: base(skin)
|
: base(skin)
|
||||||
{
|
{
|
||||||
this.beatmap = (ManiaBeatmap)beatmap;
|
this.beatmap = (ManiaBeatmap)beatmap;
|
||||||
|
isBeatmapConverted = !beatmap.BeatmapInfo.Ruleset.Equals(new ManiaRuleset().RulesetInfo);
|
||||||
|
|
||||||
isLegacySkin = new Lazy<bool>(() => GetConfig<SkinConfiguration.LegacySetting, decimal>(SkinConfiguration.LegacySetting.Version) != null);
|
isLegacySkin = new Lazy<bool>(() => GetConfig<SkinConfiguration.LegacySetting, decimal>(SkinConfiguration.LegacySetting.Version) != null);
|
||||||
hasKeyTexture = new Lazy<bool>(() =>
|
hasKeyTexture = new Lazy<bool>(() =>
|
||||||
@@ -120,6 +122,9 @@ namespace osu.Game.Rulesets.Mania.Skinning.Legacy
|
|||||||
leaderboard.Origin = Anchor.CentreLeft;
|
leaderboard.Origin = Anchor.CentreLeft;
|
||||||
leaderboard.X = 10;
|
leaderboard.X = 10;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
foreach (var d in container.OfType<ISerialisableDrawable>())
|
||||||
|
d.UsesFixedAnchor = true;
|
||||||
})
|
})
|
||||||
{
|
{
|
||||||
new LegacyManiaComboCounter(),
|
new LegacyManiaComboCounter(),
|
||||||
@@ -196,8 +201,8 @@ namespace osu.Game.Rulesets.Mania.Skinning.Legacy
|
|||||||
|
|
||||||
public override ISample GetSample(ISampleInfo sampleInfo)
|
public override ISample GetSample(ISampleInfo sampleInfo)
|
||||||
{
|
{
|
||||||
// layered hit sounds never play in mania
|
// layered hit sounds never play in mania-native beatmaps (but do play on converts)
|
||||||
if (sampleInfo is ConvertHitObjectParser.LegacyHitSampleInfo legacySample && legacySample.IsLayered)
|
if (sampleInfo is ConvertHitObjectParser.LegacyHitSampleInfo legacySample && legacySample.IsLayered && !isBeatmapConverted)
|
||||||
return new SampleVirtual();
|
return new SampleVirtual();
|
||||||
|
|
||||||
return base.GetSample(sampleInfo);
|
return base.GetSample(sampleInfo);
|
||||||
|
|||||||
@@ -154,7 +154,7 @@ namespace osu.Game.Rulesets.Mania.UI
|
|||||||
|
|
||||||
var hitWindows = new ManiaHitWindows();
|
var hitWindows = new ManiaHitWindows();
|
||||||
|
|
||||||
AddInternal(judgementPooler = new JudgementPooler<DrawableManiaJudgement>(Enum.GetValues<HitResult>().Where(r => hitWindows.IsHitResultAllowed(r))));
|
AddInternal(judgementPooler = new JudgementPooler<DrawableManiaJudgement>(Enum.GetValues<HitResult>().Where(hitWindows.IsHitResultAllowed)));
|
||||||
|
|
||||||
RegisterPool<BarLine, DrawableBarLine>(50, 200);
|
RegisterPool<BarLine, DrawableBarLine>(50, 200);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -8,7 +8,7 @@
|
|||||||
|
|
||||||
<PropertyGroup Label="Nuget">
|
<PropertyGroup Label="Nuget">
|
||||||
<Title>osu!mania (ruleset)</Title>
|
<Title>osu!mania (ruleset)</Title>
|
||||||
<PackageId>ppy.osu.Game.Rulesets.Mania</PackageId>
|
<PackageId>jvnkosu.Client.Rulesets.Mania</PackageId>
|
||||||
<IsPackable>true</IsPackable>
|
<IsPackable>true</IsPackable>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
|
|||||||
@@ -35,8 +35,6 @@
|
|||||||
<string>UIInterfaceOrientationLandscapeRight</string>
|
<string>UIInterfaceOrientationLandscapeRight</string>
|
||||||
<string>UIInterfaceOrientationLandscapeLeft</string>
|
<string>UIInterfaceOrientationLandscapeLeft</string>
|
||||||
</array>
|
</array>
|
||||||
<key>XSAppIconAssets</key>
|
|
||||||
<string>Assets.xcassets/AppIcon.appiconset</string>
|
|
||||||
<key>UIApplicationSupportsIndirectInputEvents</key>
|
<key>UIApplicationSupportsIndirectInputEvents</key>
|
||||||
<true/>
|
<true/>
|
||||||
<key>CADisableMinimumFrameDurationOnPhone</key>
|
<key>CADisableMinimumFrameDurationOnPhone</key>
|
||||||
|
|||||||
@@ -245,13 +245,13 @@ namespace osu.Game.Rulesets.Osu.Tests.Editor
|
|||||||
AddAssert("grid spacing is distance to slider tail", () =>
|
AddAssert("grid spacing is distance to slider tail", () =>
|
||||||
{
|
{
|
||||||
var composer = Editor.ChildrenOfType<RectangularPositionSnapGrid>().Single();
|
var composer = Editor.ChildrenOfType<RectangularPositionSnapGrid>().Single();
|
||||||
return Precision.AlmostEquals(composer.Spacing.Value.X, 32.05, 0.01)
|
return Precision.AlmostEquals(composer.Spacing.Value.X, 32.05, 0.1)
|
||||||
&& Precision.AlmostEquals(composer.Spacing.Value.X, composer.Spacing.Value.Y);
|
&& Precision.AlmostEquals(composer.Spacing.Value.X, composer.Spacing.Value.Y);
|
||||||
});
|
});
|
||||||
AddAssert("grid rotation points to slider tail", () =>
|
AddAssert("grid rotation points to slider tail", () =>
|
||||||
{
|
{
|
||||||
var composer = Editor.ChildrenOfType<RectangularPositionSnapGrid>().Single();
|
var composer = Editor.ChildrenOfType<RectangularPositionSnapGrid>().Single();
|
||||||
return Precision.AlmostEquals(composer.GridLineRotation.Value, 0.09, 0.01);
|
return Precision.AlmostEquals(composer.GridLineRotation.Value, 0.09, 0.1);
|
||||||
});
|
});
|
||||||
|
|
||||||
AddStep("start grid placement", () => InputManager.Key(Key.Number5));
|
AddStep("start grid placement", () => InputManager.Key(Key.Number5));
|
||||||
@@ -280,9 +280,9 @@ namespace osu.Game.Rulesets.Osu.Tests.Editor
|
|||||||
AddAssert("grid spacing and rotation unchanged", () =>
|
AddAssert("grid spacing and rotation unchanged", () =>
|
||||||
{
|
{
|
||||||
var composer = Editor.ChildrenOfType<RectangularPositionSnapGrid>().Single();
|
var composer = Editor.ChildrenOfType<RectangularPositionSnapGrid>().Single();
|
||||||
return Precision.AlmostEquals(composer.Spacing.Value.X, 32.05, 0.01)
|
return Precision.AlmostEquals(composer.Spacing.Value.X, 32.05, 0.1)
|
||||||
&& Precision.AlmostEquals(composer.Spacing.Value.X, composer.Spacing.Value.Y)
|
&& Precision.AlmostEquals(composer.Spacing.Value.X, composer.Spacing.Value.Y)
|
||||||
&& Precision.AlmostEquals(composer.GridLineRotation.Value, 0.09, 0.01);
|
&& Precision.AlmostEquals(composer.GridLineRotation.Value, 0.09, 0.1);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -8,6 +8,7 @@ using osu.Framework.Graphics.Containers;
|
|||||||
using osu.Framework.Input;
|
using osu.Framework.Input;
|
||||||
using osu.Framework.Testing;
|
using osu.Framework.Testing;
|
||||||
using osu.Game.Beatmaps;
|
using osu.Game.Beatmaps;
|
||||||
|
using osu.Game.Beatmaps.ControlPoints;
|
||||||
using osu.Game.Rulesets.Osu.Edit.Blueprints.Sliders;
|
using osu.Game.Rulesets.Osu.Edit.Blueprints.Sliders;
|
||||||
using osu.Game.Rulesets.Osu.Objects;
|
using osu.Game.Rulesets.Osu.Objects;
|
||||||
using osu.Game.Rulesets.UI;
|
using osu.Game.Rulesets.UI;
|
||||||
@@ -22,7 +23,12 @@ namespace osu.Game.Rulesets.Osu.Tests.Editor
|
|||||||
[TestFixture]
|
[TestFixture]
|
||||||
public partial class TestSceneSliderDrawing : TestSceneOsuEditor
|
public partial class TestSceneSliderDrawing : TestSceneOsuEditor
|
||||||
{
|
{
|
||||||
protected override IBeatmap CreateBeatmap(RulesetInfo ruleset) => new TestBeatmap(ruleset, false);
|
protected override IBeatmap CreateBeatmap(RulesetInfo ruleset)
|
||||||
|
{
|
||||||
|
var beatmap = new TestBeatmap(ruleset, false);
|
||||||
|
beatmap.ControlPointInfo.Add(0, new TimingControlPoint());
|
||||||
|
return beatmap;
|
||||||
|
}
|
||||||
|
|
||||||
[Test]
|
[Test]
|
||||||
public void TestTouchInputPlaceHitCircleDirectly()
|
public void TestTouchInputPlaceHitCircleDirectly()
|
||||||
|
|||||||
@@ -3,10 +3,13 @@
|
|||||||
|
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using NUnit.Framework;
|
using NUnit.Framework;
|
||||||
|
using osu.Framework.Testing;
|
||||||
using osu.Framework.Utils;
|
using osu.Framework.Utils;
|
||||||
using osu.Game.Beatmaps;
|
using osu.Game.Beatmaps;
|
||||||
using osu.Game.Rulesets.Objects;
|
using osu.Game.Rulesets.Objects;
|
||||||
using osu.Game.Rulesets.Objects.Types;
|
using osu.Game.Rulesets.Objects.Types;
|
||||||
|
using osu.Game.Rulesets.Osu.Edit.Blueprints.Sliders;
|
||||||
|
using osu.Game.Rulesets.Osu.Edit.Blueprints.Sliders.Components;
|
||||||
using osu.Game.Rulesets.Osu.Objects;
|
using osu.Game.Rulesets.Osu.Objects;
|
||||||
using osu.Game.Rulesets.Osu.UI;
|
using osu.Game.Rulesets.Osu.UI;
|
||||||
using osu.Game.Tests.Beatmaps;
|
using osu.Game.Tests.Beatmaps;
|
||||||
@@ -30,6 +33,16 @@ namespace osu.Game.Rulesets.Osu.Tests.Editor
|
|||||||
PathType.LINEAR,
|
PathType.LINEAR,
|
||||||
new Vector2(100, 0),
|
new Vector2(100, 0),
|
||||||
new Vector2(100, 100)
|
new Vector2(100, 100)
|
||||||
|
),
|
||||||
|
createPathSegment(
|
||||||
|
PathType.PERFECT_CURVE,
|
||||||
|
new Vector2(100.009f, -50.0009f),
|
||||||
|
new Vector2(200.0089f, -100)
|
||||||
|
),
|
||||||
|
createPathSegment(
|
||||||
|
PathType.PERFECT_CURVE,
|
||||||
|
new Vector2(25, -50),
|
||||||
|
new Vector2(100, 75)
|
||||||
)
|
)
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -48,9 +61,13 @@ namespace osu.Game.Rulesets.Osu.Tests.Editor
|
|||||||
|
|
||||||
[TestCase(0, 250)]
|
[TestCase(0, 250)]
|
||||||
[TestCase(0, 200)]
|
[TestCase(0, 200)]
|
||||||
[TestCase(1, 120)]
|
[TestCase(1, 120, false, false)]
|
||||||
[TestCase(1, 80)]
|
[TestCase(1, 80, false, false)]
|
||||||
public void TestSliderReversal(int pathIndex, double length)
|
[TestCase(2, 250)]
|
||||||
|
[TestCase(2, 190)]
|
||||||
|
[TestCase(3, 250)]
|
||||||
|
[TestCase(3, 190)]
|
||||||
|
public void TestSliderReversal(int pathIndex, double length, bool assertEqualDistances = true, bool assertSliderReduction = true)
|
||||||
{
|
{
|
||||||
var controlPoints = paths[pathIndex];
|
var controlPoints = paths[pathIndex];
|
||||||
|
|
||||||
@@ -90,6 +107,215 @@ namespace osu.Game.Rulesets.Osu.Tests.Editor
|
|||||||
InputManager.ReleaseKey(Key.LControl);
|
InputManager.ReleaseKey(Key.LControl);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
if (pathIndex == 2)
|
||||||
|
{
|
||||||
|
AddRepeatStep("Reverse slider again", () =>
|
||||||
|
{
|
||||||
|
InputManager.PressKey(Key.LControl);
|
||||||
|
InputManager.Key(Key.G);
|
||||||
|
InputManager.ReleaseKey(Key.LControl);
|
||||||
|
}, 2);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (assertEqualDistances)
|
||||||
|
{
|
||||||
|
AddAssert("Middle control point has the same distance from start to end", () =>
|
||||||
|
{
|
||||||
|
var pathControlPoints = selectedSlider.Path.ControlPoints;
|
||||||
|
float middleToStart = Vector2.Distance(pathControlPoints[^2].Position, pathControlPoints[0].Position);
|
||||||
|
float middleToEnd = Vector2.Distance(pathControlPoints[^2].Position, pathControlPoints[^1].Position);
|
||||||
|
|
||||||
|
return Precision.AlmostEquals(middleToStart, middleToEnd, 1f);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
AddAssert("Middle control point is not at start or end", () =>
|
||||||
|
Vector2.Distance(selectedSlider.Path.ControlPoints[^2].Position, oldStartPos) > 1 &&
|
||||||
|
Vector2.Distance(selectedSlider.Path.ControlPoints[^2].Position, oldEndPos) > 1
|
||||||
|
);
|
||||||
|
|
||||||
|
AddAssert("Slider has correct length", () =>
|
||||||
|
Precision.AlmostEquals(selectedSlider.Path.Distance, oldDistance));
|
||||||
|
|
||||||
|
AddAssert("Slider has correct start position", () =>
|
||||||
|
Vector2.Distance(selectedSlider.Position, oldEndPos) < 1);
|
||||||
|
|
||||||
|
AddAssert("Slider has correct end position", () =>
|
||||||
|
Vector2.Distance(selectedSlider.EndPosition, oldStartPos) < 1);
|
||||||
|
|
||||||
|
AddAssert("Control points have correct types", () =>
|
||||||
|
{
|
||||||
|
var newControlPointTypes = selectedSlider.Path.ControlPoints.Select(p => p.Type).ToArray();
|
||||||
|
|
||||||
|
return oldControlPointTypes.Take(newControlPointTypes.Length).SequenceEqual(newControlPointTypes);
|
||||||
|
});
|
||||||
|
|
||||||
|
if (assertSliderReduction)
|
||||||
|
{
|
||||||
|
AddStep("Move to marker", () =>
|
||||||
|
{
|
||||||
|
var marker = this.ChildrenOfType<SliderEndDragMarker>().Single();
|
||||||
|
var markerPos = (marker.ScreenSpaceDrawQuad.TopRight + marker.ScreenSpaceDrawQuad.BottomRight) / 2;
|
||||||
|
// sometimes the cursor may miss the marker's hitbox so we
|
||||||
|
// add a little offset here to be sure it lands in a clickable position.
|
||||||
|
var position = new Vector2(markerPos.X + 2f, markerPos.Y);
|
||||||
|
InputManager.MoveMouseTo(position);
|
||||||
|
});
|
||||||
|
AddStep("Click", () => InputManager.PressButton(MouseButton.Left));
|
||||||
|
AddStep("Reduce slider", () =>
|
||||||
|
{
|
||||||
|
var middleControlPoint = this.ChildrenOfType<PathControlPointPiece<Slider>>().ToArray()[^2];
|
||||||
|
InputManager.MoveMouseTo(middleControlPoint);
|
||||||
|
});
|
||||||
|
AddStep("Release click", () => InputManager.ReleaseButton(MouseButton.Left));
|
||||||
|
|
||||||
|
AddStep("Save half slider info", () =>
|
||||||
|
{
|
||||||
|
oldStartPos = selectedSlider.Position;
|
||||||
|
oldEndPos = selectedSlider.EndPosition;
|
||||||
|
oldDistance = selectedSlider.Path.Distance;
|
||||||
|
});
|
||||||
|
|
||||||
|
AddStep("Reverse slider", () =>
|
||||||
|
{
|
||||||
|
InputManager.PressKey(Key.LControl);
|
||||||
|
InputManager.Key(Key.G);
|
||||||
|
InputManager.ReleaseKey(Key.LControl);
|
||||||
|
});
|
||||||
|
|
||||||
|
AddAssert("Middle control point has the same distance from start to end", () =>
|
||||||
|
{
|
||||||
|
var pathControlPoints = selectedSlider.Path.ControlPoints;
|
||||||
|
float middleToStart = Vector2.Distance(pathControlPoints[^2].Position, pathControlPoints[0].Position);
|
||||||
|
float middleToEnd = Vector2.Distance(pathControlPoints[^2].Position, pathControlPoints[^1].Position);
|
||||||
|
|
||||||
|
return Precision.AlmostEquals(middleToStart, middleToEnd, 1f);
|
||||||
|
});
|
||||||
|
|
||||||
|
AddAssert("Middle control point is not at start or end", () =>
|
||||||
|
Vector2.Distance(selectedSlider.Path.ControlPoints[^2].Position, oldStartPos) > 1 &&
|
||||||
|
Vector2.Distance(selectedSlider.Path.ControlPoints[^2].Position, oldEndPos) > 1
|
||||||
|
);
|
||||||
|
|
||||||
|
AddAssert("Slider has correct length", () =>
|
||||||
|
Precision.AlmostEquals(selectedSlider.Path.Distance, oldDistance));
|
||||||
|
|
||||||
|
AddAssert("Slider has correct start position", () =>
|
||||||
|
Vector2.Distance(selectedSlider.Position, oldEndPos) < 1);
|
||||||
|
|
||||||
|
AddAssert("Slider has correct end position", () =>
|
||||||
|
Vector2.Distance(selectedSlider.EndPosition, oldStartPos) < 1);
|
||||||
|
|
||||||
|
AddAssert("Control points have correct types", () =>
|
||||||
|
{
|
||||||
|
var newControlPointTypes = selectedSlider.Path.ControlPoints.Select(p => p.Type).ToArray();
|
||||||
|
|
||||||
|
return oldControlPointTypes.Take(newControlPointTypes.Length).SequenceEqual(newControlPointTypes);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void TestSegmentedSliderReversal()
|
||||||
|
{
|
||||||
|
PathControlPoint[] segmentedSliderPath =
|
||||||
|
[
|
||||||
|
new PathControlPoint
|
||||||
|
{
|
||||||
|
Position = new Vector2(0, 0),
|
||||||
|
Type = PathType.PERFECT_CURVE
|
||||||
|
},
|
||||||
|
new PathControlPoint
|
||||||
|
{
|
||||||
|
Position = new Vector2(100, 150),
|
||||||
|
},
|
||||||
|
new PathControlPoint
|
||||||
|
{
|
||||||
|
Position = new Vector2(75, -50),
|
||||||
|
Type = PathType.PERFECT_CURVE
|
||||||
|
},
|
||||||
|
new PathControlPoint
|
||||||
|
{
|
||||||
|
Position = new Vector2(225, -75),
|
||||||
|
},
|
||||||
|
new PathControlPoint
|
||||||
|
{
|
||||||
|
Position = new Vector2(350, 50),
|
||||||
|
Type = PathType.PERFECT_CURVE
|
||||||
|
},
|
||||||
|
new PathControlPoint
|
||||||
|
{
|
||||||
|
Position = new Vector2(500, -75),
|
||||||
|
},
|
||||||
|
new PathControlPoint
|
||||||
|
{
|
||||||
|
Position = new Vector2(350, -120),
|
||||||
|
},
|
||||||
|
];
|
||||||
|
|
||||||
|
Vector2 oldStartPos = default;
|
||||||
|
Vector2 oldEndPos = default;
|
||||||
|
double oldDistance = default;
|
||||||
|
|
||||||
|
var oldControlPointTypes = segmentedSliderPath.Select(p => p.Type);
|
||||||
|
|
||||||
|
AddStep("Add slider", () =>
|
||||||
|
{
|
||||||
|
var slider = new Slider
|
||||||
|
{
|
||||||
|
Position = new Vector2(0, 200),
|
||||||
|
Path = new SliderPath(segmentedSliderPath)
|
||||||
|
{
|
||||||
|
ExpectedDistance = { Value = 1314 }
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
EditorBeatmap.Add(slider);
|
||||||
|
|
||||||
|
oldStartPos = slider.Position;
|
||||||
|
oldEndPos = slider.EndPosition;
|
||||||
|
oldDistance = slider.Path.Distance;
|
||||||
|
});
|
||||||
|
|
||||||
|
AddStep("Select slider", () =>
|
||||||
|
{
|
||||||
|
var slider = (Slider)EditorBeatmap.HitObjects[0];
|
||||||
|
EditorBeatmap.SelectedHitObjects.Add(slider);
|
||||||
|
});
|
||||||
|
|
||||||
|
AddRepeatStep("Reverse slider", () =>
|
||||||
|
{
|
||||||
|
InputManager.PressKey(Key.LControl);
|
||||||
|
InputManager.Key(Key.G);
|
||||||
|
InputManager.ReleaseKey(Key.LControl);
|
||||||
|
}, 3);
|
||||||
|
|
||||||
|
AddAssert("First arc's control is not at the slider's middle", () =>
|
||||||
|
Vector2.Distance(selectedSlider.Path.ControlPoints[^2].Position, selectedSlider.Path.PositionAt(0.5)) > 1
|
||||||
|
);
|
||||||
|
|
||||||
|
AddAssert("Last arc's control is not at the slider's middle", () =>
|
||||||
|
Vector2.Distance(selectedSlider.Path.ControlPoints[1].Position, selectedSlider.Path.PositionAt(0.5)) > 1
|
||||||
|
);
|
||||||
|
|
||||||
|
AddAssert("First arc centered middle control point", () =>
|
||||||
|
{
|
||||||
|
var pathControlPoints = selectedSlider.Path.ControlPoints;
|
||||||
|
float middleToStart = Vector2.Distance(pathControlPoints[1].Position, pathControlPoints[0].Position);
|
||||||
|
float middleToEnd = Vector2.Distance(pathControlPoints[1].Position, pathControlPoints[2].Position);
|
||||||
|
|
||||||
|
return Precision.AlmostEquals(middleToStart, middleToEnd, 1f);
|
||||||
|
});
|
||||||
|
|
||||||
|
AddAssert("Last arc centered middle control point", () =>
|
||||||
|
{
|
||||||
|
var pathControlPoints = selectedSlider.Path.ControlPoints;
|
||||||
|
float middleToStart = Vector2.Distance(pathControlPoints[^2].Position, pathControlPoints[^3].Position);
|
||||||
|
float middleToEnd = Vector2.Distance(pathControlPoints[^2].Position, pathControlPoints[^1].Position);
|
||||||
|
|
||||||
|
return Precision.AlmostEquals(middleToStart, middleToEnd, 1f);
|
||||||
|
});
|
||||||
|
|
||||||
AddAssert("Slider has correct length", () =>
|
AddAssert("Slider has correct length", () =>
|
||||||
Precision.AlmostEquals(selectedSlider.Path.Distance, oldDistance));
|
Precision.AlmostEquals(selectedSlider.Path.Distance, oldDistance));
|
||||||
|
|
||||||
|
|||||||
88
osu.Game.Rulesets.Osu.Tests/Mods/TestSceneOsuModEasy.cs
Normal file
88
osu.Game.Rulesets.Osu.Tests/Mods/TestSceneOsuModEasy.cs
Normal file
@@ -0,0 +1,88 @@
|
|||||||
|
// Copyright (c) ppy Pty Ltd <contact@ppy.sh>. Licensed under the MIT Licence.
|
||||||
|
// See the LICENCE file in the repository root for full licence text.
|
||||||
|
|
||||||
|
using System.Linq;
|
||||||
|
using NUnit.Framework;
|
||||||
|
using osu.Game.Beatmaps;
|
||||||
|
using osu.Game.Rulesets.Mods;
|
||||||
|
using osu.Game.Rulesets.Osu.Mods;
|
||||||
|
using osu.Game.Tests.Beatmaps;
|
||||||
|
using osu.Game.Tests.Visual;
|
||||||
|
|
||||||
|
namespace osu.Game.Rulesets.Osu.Tests.Mods
|
||||||
|
{
|
||||||
|
public partial class TestSceneOsuModEasy : OsuModTestScene
|
||||||
|
{
|
||||||
|
protected override bool AllowFail => true;
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void TestMultipleApplication()
|
||||||
|
{
|
||||||
|
bool reapplied = false;
|
||||||
|
CreateModTest(new ModTestData
|
||||||
|
{
|
||||||
|
Mods = [new OsuModEasy { Retries = { Value = 1 } }],
|
||||||
|
Autoplay = false,
|
||||||
|
CreateBeatmap = () =>
|
||||||
|
{
|
||||||
|
// do stuff to speed up fails
|
||||||
|
var b = new TestBeatmap(new OsuRuleset().RulesetInfo)
|
||||||
|
{
|
||||||
|
Difficulty = { DrainRate = 10 }
|
||||||
|
};
|
||||||
|
|
||||||
|
foreach (var ho in b.HitObjects)
|
||||||
|
ho.StartTime /= 4;
|
||||||
|
|
||||||
|
return b;
|
||||||
|
},
|
||||||
|
PassCondition = () =>
|
||||||
|
{
|
||||||
|
if (((ModEasyTestPlayer)Player).FailuresSuppressed > 0 && !reapplied)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
foreach (var mod in Player.GameplayState.Mods.OfType<IApplicableToDifficulty>())
|
||||||
|
mod.ApplyToDifficulty(new BeatmapDifficulty());
|
||||||
|
|
||||||
|
foreach (var mod in Player.GameplayState.Mods.OfType<IApplicableToPlayer>())
|
||||||
|
mod.ApplyToPlayer(Player);
|
||||||
|
}
|
||||||
|
catch
|
||||||
|
{
|
||||||
|
// don't care if this fails. in fact a failure here is probably better than the alternative.
|
||||||
|
}
|
||||||
|
finally
|
||||||
|
{
|
||||||
|
reapplied = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return Player.GameplayState.HasFailed && ((ModEasyTestPlayer)Player).FailuresSuppressed <= 1;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
protected override TestPlayer CreateModPlayer(Ruleset ruleset) => new ModEasyTestPlayer(CurrentTestData, AllowFail);
|
||||||
|
|
||||||
|
private partial class ModEasyTestPlayer : ModTestPlayer
|
||||||
|
{
|
||||||
|
public int FailuresSuppressed { get; private set; }
|
||||||
|
|
||||||
|
public ModEasyTestPlayer(ModTestData data, bool allowFail)
|
||||||
|
: base(data, allowFail)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
protected override bool CheckModsAllowFailure()
|
||||||
|
{
|
||||||
|
bool failureAllowed = GameplayState.Mods.OfType<IApplicableFailOverride>().All(m => m.PerformFail());
|
||||||
|
|
||||||
|
if (!failureAllowed)
|
||||||
|
FailuresSuppressed++;
|
||||||
|
|
||||||
|
return failureAllowed;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -2,7 +2,10 @@
|
|||||||
// See the LICENCE file in the repository root for full licence text.
|
// See the LICENCE file in the repository root for full licence text.
|
||||||
|
|
||||||
using NUnit.Framework;
|
using NUnit.Framework;
|
||||||
|
using osu.Game.Rulesets.Osu.Beatmaps;
|
||||||
using osu.Game.Rulesets.Osu.Mods;
|
using osu.Game.Rulesets.Osu.Mods;
|
||||||
|
using osu.Game.Rulesets.Osu.Objects;
|
||||||
|
using osu.Game.Rulesets.Osu.UI;
|
||||||
|
|
||||||
namespace osu.Game.Rulesets.Osu.Tests.Mods
|
namespace osu.Game.Rulesets.Osu.Tests.Mods
|
||||||
{
|
{
|
||||||
@@ -18,5 +21,39 @@ namespace osu.Game.Rulesets.Osu.Tests.Mods
|
|||||||
Autoplay = false,
|
Autoplay = false,
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void TestSkipToFirstCircleNotSuppressed()
|
||||||
|
{
|
||||||
|
CreateModTest(new ModTestData
|
||||||
|
{
|
||||||
|
Mod = new OsuModFreezeFrame(),
|
||||||
|
CreateBeatmap = () => new OsuBeatmap
|
||||||
|
{
|
||||||
|
HitObjects =
|
||||||
|
{
|
||||||
|
new HitCircle { StartTime = 5000, Position = OsuPlayfield.BASE_SIZE / 2 }
|
||||||
|
}
|
||||||
|
},
|
||||||
|
PassCondition = () => Player.GameplayClockContainer.GameplayStartTime > 0
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void TestSkipToFirstSpinnerNotSuppressed()
|
||||||
|
{
|
||||||
|
CreateModTest(new ModTestData
|
||||||
|
{
|
||||||
|
Mod = new OsuModFreezeFrame(),
|
||||||
|
CreateBeatmap = () => new OsuBeatmap
|
||||||
|
{
|
||||||
|
HitObjects =
|
||||||
|
{
|
||||||
|
new Spinner { StartTime = 5000, Position = OsuPlayfield.BASE_SIZE / 2 }
|
||||||
|
}
|
||||||
|
},
|
||||||
|
PassCondition = () => Player.GameplayClockContainer.GameplayStartTime > 0
|
||||||
|
});
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -27,6 +27,9 @@ namespace osu.Game.Rulesets.Osu.Tests
|
|||||||
[TestCase("multi-segment-slider")]
|
[TestCase("multi-segment-slider")]
|
||||||
[TestCase("nan-slider")]
|
[TestCase("nan-slider")]
|
||||||
[TestCase("1124896")]
|
[TestCase("1124896")]
|
||||||
|
[TestCase("1341554")]
|
||||||
|
[TestCase("2593923")]
|
||||||
|
[TestCase("801165")]
|
||||||
public void Test(string name) => base.Test(name);
|
public void Test(string name) => base.Test(name);
|
||||||
|
|
||||||
protected override IEnumerable<ConvertValue> CreateConvertValue(HitObject hitObject)
|
protected override IEnumerable<ConvertValue> CreateConvertValue(HitObject hitObject)
|
||||||
|
|||||||
File diff suppressed because one or more lines are too long
@@ -0,0 +1,941 @@
|
|||||||
|
osu file format v14
|
||||||
|
|
||||||
|
[General]
|
||||||
|
AudioLeadIn: 0
|
||||||
|
PreviewTime: 76429
|
||||||
|
Countdown: 0
|
||||||
|
SampleSet: Soft
|
||||||
|
StackLeniency: 0.2
|
||||||
|
Mode: 0
|
||||||
|
LetterboxInBreaks: 0
|
||||||
|
WidescreenStoryboard: 1
|
||||||
|
|
||||||
|
[Difficulty]
|
||||||
|
HPDrainRate:5
|
||||||
|
CircleSize:4.3
|
||||||
|
OverallDifficulty:8
|
||||||
|
ApproachRate:9.3
|
||||||
|
SliderMultiplier:2.99999995231628
|
||||||
|
SliderTickRate:1
|
||||||
|
|
||||||
|
[Events]
|
||||||
|
//Background and Video events
|
||||||
|
//Break Periods
|
||||||
|
//Storyboard Layer 0 (Background)
|
||||||
|
//Storyboard Layer 1 (Fail)
|
||||||
|
//Storyboard Layer 2 (Pass)
|
||||||
|
//Storyboard Layer 3 (Foreground)
|
||||||
|
//Storyboard Sound Samples
|
||||||
|
|
||||||
|
[TimingPoints]
|
||||||
|
763,444.444444444444,4,2,1,60,1,0
|
||||||
|
763,-111.111111111111,4,2,1,60,0,0
|
||||||
|
1929,-100,4,2,1,5,0,0
|
||||||
|
1985,-100,4,2,1,60,0,0
|
||||||
|
2040,-100,4,2,1,5,0,0
|
||||||
|
2096,-153.846153846153,4,2,1,60,0,0
|
||||||
|
2429,-133.333333333333,4,2,1,5,0,0
|
||||||
|
2540,-71.4285714285714,4,2,1,70,0,1
|
||||||
|
2985,-100,4,2,1,70,0,1
|
||||||
|
4485,-100,4,2,1,5,0,1
|
||||||
|
4540,-100,4,2,1,70,0,1
|
||||||
|
4707,-100,4,2,1,5,0,1
|
||||||
|
4762,-100,4,2,1,70,0,1
|
||||||
|
4929,-100,4,2,1,5,0,1
|
||||||
|
4985,-100,4,2,1,70,0,1
|
||||||
|
5096,-83.3333333333333,4,2,1,70,0,1
|
||||||
|
5429,-133.333333333333,4,2,1,70,0,1
|
||||||
|
5596,-133.333333333333,4,2,1,70,0,1
|
||||||
|
5652,-133.333333333333,4,2,1,70,0,1
|
||||||
|
5818,-133.333333333333,4,2,1,70,0,1
|
||||||
|
5874,-133.333333333333,4,2,1,70,0,1
|
||||||
|
6040,-133.333333333333,4,2,1,70,0,1
|
||||||
|
6096,-100,4,2,1,70,0,1
|
||||||
|
6540,-100,4,2,1,70,0,1
|
||||||
|
8040,-100,4,2,1,5,0,1
|
||||||
|
8096,-100,4,2,1,70,0,1
|
||||||
|
8262,-100,4,2,1,5,0,1
|
||||||
|
8318,-100,4,2,1,70,0,1
|
||||||
|
8485,-100,4,2,1,5,0,1
|
||||||
|
8540,-133.333333333333,4,2,1,70,0,1
|
||||||
|
8874,-100,4,2,1,5,0,1
|
||||||
|
8985,-100,4,2,1,70,0,1
|
||||||
|
9651,-100,4,2,1,70,0,1
|
||||||
|
10096,-100,4,2,1,70,0,1
|
||||||
|
11596,-100,4,2,1,5,0,1
|
||||||
|
11651,-100,4,2,1,70,0,1
|
||||||
|
11818,-100,4,2,1,5,0,1
|
||||||
|
11873,-100,4,2,1,70,0,1
|
||||||
|
11874,-80,4,2,1,70,0,1
|
||||||
|
12040,-80,4,2,1,5,0,1
|
||||||
|
12096,-80,4,2,1,70,0,1
|
||||||
|
12207,-133.333333333333,4,2,1,70,0,1
|
||||||
|
12429,-100,4,2,1,5,0,1
|
||||||
|
12540,-100,4,2,1,70,0,1
|
||||||
|
12707,-100,4,2,1,70,0,1
|
||||||
|
12763,-100,4,2,1,70,0,1
|
||||||
|
12929,-100,4,2,1,70,0,1
|
||||||
|
12985,-100,4,2,1,70,0,1
|
||||||
|
13429,-300,4,2,1,70,0,1
|
||||||
|
13651,-83.3333333333333,4,2,1,70,0,1
|
||||||
|
13874,-100,4,2,1,70,0,1
|
||||||
|
15151,-100,4,2,1,5,0,1
|
||||||
|
15207,-100,4,2,1,70,0,1
|
||||||
|
15373,-100,4,2,1,5,0,1
|
||||||
|
15429,-100,4,2,1,70,0,1
|
||||||
|
15596,-100,4,2,1,5,0,1
|
||||||
|
15651,-100,4,2,1,70,0,1
|
||||||
|
15985,-100,4,2,1,5,0,1
|
||||||
|
16096,-100,4,2,1,70,0,1
|
||||||
|
16262,-100,4,2,1,70,0,1
|
||||||
|
16318,-83.3333333333333,4,2,1,70,0,1
|
||||||
|
16651,-100,4,2,1,70,0,1
|
||||||
|
16762,-133.333333333333,4,2,1,60,0,0
|
||||||
|
17096,-133.333333333333,4,2,1,5,0,0
|
||||||
|
17207,-200,4,2,1,60,0,0
|
||||||
|
18096,-66.6666666666667,4,2,1,60,0,0
|
||||||
|
18262,-66.6666666666667,4,2,1,5,0,0
|
||||||
|
18318,-66.6666666666667,4,2,1,60,0,0
|
||||||
|
18540,-100,4,2,1,60,0,0
|
||||||
|
18874,-100,4,2,1,5,0,0
|
||||||
|
18985,-100,4,2,1,60,0,0
|
||||||
|
19985,-100,4,2,1,60,0,0
|
||||||
|
20485,-100,4,2,1,5,0,0
|
||||||
|
20540,-100,4,2,1,60,0,0
|
||||||
|
20707,-100,4,2,1,5,0,0
|
||||||
|
20762,-200,4,2,1,60,0,0
|
||||||
|
20985,-100,4,2,1,60,0,0
|
||||||
|
21095,-100,4,2,1,60,0,0
|
||||||
|
21374,-100,4,2,1,5,0,0
|
||||||
|
21429,-100,4,2,1,60,0,0
|
||||||
|
21596,-100,4,2,1,5,0,0
|
||||||
|
21651,-100,4,2,1,60,0,0
|
||||||
|
21818,-100,4,2,1,5,0,0
|
||||||
|
21874,-66.6666666666667,4,2,1,60,0,0
|
||||||
|
21985,-100,4,2,1,60,0,0
|
||||||
|
22096,-100,4,2,1,60,0,0
|
||||||
|
22985,-200,4,2,1,60,0,0
|
||||||
|
23318,-100,4,2,1,60,0,0
|
||||||
|
23429,-100,4,2,1,60,0,0
|
||||||
|
23540,-100,4,2,1,60,0,0
|
||||||
|
23651,-100,4,2,1,60,0,0
|
||||||
|
23762,-100,4,2,1,60,0,0
|
||||||
|
23874,-133.333333333333,4,2,1,60,0,0
|
||||||
|
24208,-133.333333333333,4,2,1,5,0,0
|
||||||
|
24318,-200,4,2,1,5,0,0
|
||||||
|
24319,-200,4,2,1,60,0,0
|
||||||
|
24540,-100,4,2,1,60,0,0
|
||||||
|
24651,-66.6666666666667,4,2,1,60,0,0
|
||||||
|
24874,-100,4,2,1,60,0,0
|
||||||
|
25374,-100,4,2,1,5,0,0
|
||||||
|
25429,-100,4,2,1,60,0,0
|
||||||
|
27096,-100,4,2,1,60,0,0
|
||||||
|
27596,-100,4,2,1,5,0,0
|
||||||
|
27651,-100,4,2,1,60,0,0
|
||||||
|
27818,-100,4,2,1,5,0,0
|
||||||
|
27873,-133.333333333333,4,2,1,60,0,0
|
||||||
|
28096,-100,4,2,1,60,0,0
|
||||||
|
28206,-100,4,2,1,60,0,0
|
||||||
|
28485,-100,4,2,1,5,0,0
|
||||||
|
28540,-100,4,2,1,60,0,0
|
||||||
|
28707,-100,4,2,1,5,0,0
|
||||||
|
28762,-100,4,2,1,60,0,0
|
||||||
|
28929,-100,4,2,1,5,0,0
|
||||||
|
28985,-66.6666666666667,4,2,1,60,0,0
|
||||||
|
29151,-100,4,2,1,60,0,0
|
||||||
|
29207,-100,4,2,1,60,0,0
|
||||||
|
29651,-100,4,2,1,60,0,0
|
||||||
|
30429,-100,4,2,1,60,0,0
|
||||||
|
30540,-58.8235294117647,4,2,1,60,0,0
|
||||||
|
30874,-58.8235294117647,4,2,1,5,0,0
|
||||||
|
30985,-58.8235294117647,4,2,1,60,0,0
|
||||||
|
31040,-100,4,2,1,5,0,0
|
||||||
|
31429,-100,4,2,1,60,0,0
|
||||||
|
32485,-100,4,2,1,60,0,0
|
||||||
|
32540,-100,4,2,1,60,0,0
|
||||||
|
32707,-100,4,2,1,60,0,0
|
||||||
|
32762,-100,4,2,1,60,0,0
|
||||||
|
32985,-100,4,2,1,60,0,0
|
||||||
|
34318,-50,4,2,1,60,0,0
|
||||||
|
34485,-100,4,2,1,5,0,0
|
||||||
|
34540,-100,4,2,1,60,0,0
|
||||||
|
35151,-100,4,2,1,5,0,0
|
||||||
|
35207,-100,4,2,1,60,0,0
|
||||||
|
35374,-100,4,2,1,5,0,0
|
||||||
|
35430,-100,4,2,1,60,0,0
|
||||||
|
35818,-100,4,2,1,5,0,0
|
||||||
|
35874,-200,4,2,1,60,0,0
|
||||||
|
36429,-100,4,2,1,60,0,0
|
||||||
|
37818,-100,4,2,1,5,0,0
|
||||||
|
37874,-100,4,2,1,60,0,0
|
||||||
|
38040,-100,4,2,1,5,0,0
|
||||||
|
38096,-50,4,2,1,60,0,0
|
||||||
|
38151,-100,4,2,1,5,0,0
|
||||||
|
38540,-100,4,2,1,60,0,0
|
||||||
|
39596,-100,4,2,1,5,0,0
|
||||||
|
39651,-100,4,2,1,60,0,0
|
||||||
|
39818,-100,4,2,1,60,0,0
|
||||||
|
39873,-100,4,2,1,60,0,0
|
||||||
|
40096,-100,4,2,1,60,0,0
|
||||||
|
41429,-50,4,2,1,60,0,0
|
||||||
|
41596,-100,4,2,1,5,0,0
|
||||||
|
41651,-100,4,2,1,60,0,0
|
||||||
|
41818,-100,4,2,1,5,0,0
|
||||||
|
41874,-100,4,2,1,60,0,0
|
||||||
|
42040,-100,4,2,1,5,0,0
|
||||||
|
42096,-100,4,2,1,60,0,0
|
||||||
|
44318,-100,4,2,1,60,0,0
|
||||||
|
44762,-83.3333333333333,4,2,1,60,0,0
|
||||||
|
45207,-66.6666666666667,4,2,1,45,0,0
|
||||||
|
45651,-133.333333333333,4,2,1,45,0,0
|
||||||
|
51540,-133.333333333333,4,2,1,50,0,0
|
||||||
|
51651,-133.333333333333,4,2,1,45,0,0
|
||||||
|
52318,-133.333333333333,4,2,1,45,0,0
|
||||||
|
58540,-76.9230769230769,4,2,1,45,0,0
|
||||||
|
58818,-100,4,2,1,45,0,0
|
||||||
|
58874,-111.111111111111,4,2,1,45,0,0
|
||||||
|
59318,-111.111111111111,4,2,1,45,0,0
|
||||||
|
59429,-83.3333333333333,4,2,1,60,0,0
|
||||||
|
59540,-83.3333333333333,4,2,1,5,0,0
|
||||||
|
59874,-100,4,2,1,60,0,0
|
||||||
|
60096,-100,4,2,1,5,0,0
|
||||||
|
60207,-100,4,2,1,60,0,0
|
||||||
|
60707,-100,4,2,1,5,0,0
|
||||||
|
60763,-100,4,2,1,60,0,0
|
||||||
|
60818,-100,4,2,1,5,0,0
|
||||||
|
60874,-100,4,2,1,60,0,0
|
||||||
|
60929,-100,4,2,1,5,0,0
|
||||||
|
60985,-100,4,2,1,60,0,0
|
||||||
|
61040,-100,4,2,1,5,0,0
|
||||||
|
61096,-100,4,2,1,60,0,0
|
||||||
|
61151,-100,4,2,1,5,0,0
|
||||||
|
61207,-100,4,2,1,60,0,0
|
||||||
|
61596,-100,4,2,1,5,0,0
|
||||||
|
61651,-100,4,2,1,60,0,0
|
||||||
|
61762,-83.3333333333333,4,2,1,60,0,0
|
||||||
|
61985,-100,4,2,1,5,0,0
|
||||||
|
62096,-100,4,2,1,60,0,0
|
||||||
|
62151,-100,4,2,1,5,0,0
|
||||||
|
62207,-100,4,2,1,60,0,0
|
||||||
|
62262,-100,4,2,1,5,0,0
|
||||||
|
62318,-100,4,2,1,60,0,0
|
||||||
|
62374,-100,4,2,1,5,0,0
|
||||||
|
62430,-100,4,2,1,60,0,0
|
||||||
|
62485,-100,4,2,1,5,0,0
|
||||||
|
62540,-100,4,2,1,60,0,0
|
||||||
|
62596,-100,4,2,1,5,0,0
|
||||||
|
62651,-100,4,2,1,60,0,0
|
||||||
|
62707,-100,4,2,1,5,0,0
|
||||||
|
62762,-100,4,2,1,60,0,0
|
||||||
|
62818,-100,4,2,1,5,0,0
|
||||||
|
62874,-100,4,2,1,60,0,0
|
||||||
|
62929,-100,4,2,1,60,0,0
|
||||||
|
62930,-100,4,2,1,5,0,0
|
||||||
|
62985,-100,4,2,1,60,0,0
|
||||||
|
63707,-100,4,2,1,5,0,0
|
||||||
|
63762,-100,4,2,1,60,0,0
|
||||||
|
64262,-100,4,2,1,5,0,0
|
||||||
|
64318,-100,4,2,1,60,0,0
|
||||||
|
64485,-100,4,2,1,5,0,0
|
||||||
|
64540,-100,4,2,1,60,0,0
|
||||||
|
64596,-100,4,2,1,5,0,0
|
||||||
|
64651,-100,4,2,1,60,0,0
|
||||||
|
64707,-100,4,2,1,5,0,0
|
||||||
|
64762,-71.4285714285714,4,2,1,60,0,0
|
||||||
|
64929,-71.4285714285714,4,2,1,5,0,0
|
||||||
|
64984,-133.333333333333,4,2,1,60,0,0
|
||||||
|
65151,-133.333333333333,4,2,1,5,0,0
|
||||||
|
65206,-71.4285714285714,4,2,1,60,0,0
|
||||||
|
65374,-71.4285714285714,4,2,1,5,0,0
|
||||||
|
65429,-133.333333333333,4,2,1,60,0,0
|
||||||
|
65596,-133.333333333333,4,2,1,5,0,0
|
||||||
|
65651,-100,4,2,1,60,0,0
|
||||||
|
66540,-66.6666666666667,4,2,1,60,0,0
|
||||||
|
66596,-66.6666666666667,4,2,1,5,0,0
|
||||||
|
66929,-100,4,2,1,5,0,0
|
||||||
|
66985,-200,4,2,1,60,0,0
|
||||||
|
67207,-200,4,2,1,5,0,0
|
||||||
|
67318,-100,4,2,1,60,0,0
|
||||||
|
67818,-100,4,2,1,5,0,0
|
||||||
|
67874,-100,4,2,1,60,0,0
|
||||||
|
67929,-100,4,2,1,5,0,0
|
||||||
|
67985,-100,4,2,1,60,0,0
|
||||||
|
68040,-100,4,2,1,5,0,0
|
||||||
|
68096,-100,4,2,1,60,0,0
|
||||||
|
68151,-100,4,2,1,5,0,0
|
||||||
|
68207,-100,4,2,1,60,0,0
|
||||||
|
68262,-100,4,2,1,5,0,0
|
||||||
|
68318,-100,4,2,1,60,0,0
|
||||||
|
68874,-83.3333333333333,4,2,1,60,0,0
|
||||||
|
69096,-100,4,2,1,60,0,0
|
||||||
|
69097,-100,4,2,1,5,0,0
|
||||||
|
69207,-100,4,2,1,60,0,0
|
||||||
|
69263,-100,4,2,1,5,0,0
|
||||||
|
69319,-100,4,2,1,60,0,0
|
||||||
|
69374,-100,4,2,1,5,0,0
|
||||||
|
69430,-100,4,2,1,60,0,0
|
||||||
|
69486,-100,4,2,1,5,0,0
|
||||||
|
69542,-100,4,2,1,60,0,0
|
||||||
|
69597,-100,4,2,1,5,0,0
|
||||||
|
69651,-100,4,2,1,60,0,0
|
||||||
|
69707,-100,4,2,1,5,0,0
|
||||||
|
69762,-100,4,2,1,60,0,0
|
||||||
|
69818,-100,4,2,1,5,0,0
|
||||||
|
69874,-100,4,2,1,60,0,0
|
||||||
|
69929,-100,4,2,1,5,0,0
|
||||||
|
69985,-100,4,2,1,60,0,0
|
||||||
|
70040,-100,4,2,1,60,0,0
|
||||||
|
70041,-100,4,2,1,5,0,0
|
||||||
|
70096,-100,4,2,1,60,0,0
|
||||||
|
70818,-100,4,2,1,5,0,0
|
||||||
|
70873,-100,4,2,1,60,0,0
|
||||||
|
71207,-71.4285714285714,4,2,1,60,0,0
|
||||||
|
71429,-100,4,2,1,60,0,0
|
||||||
|
71874,-71.4285714285714,4,2,1,60,0,0
|
||||||
|
72041,-71.4285714285714,4,2,1,5,0,0
|
||||||
|
72096,-133.333333333333,4,2,1,60,0,0
|
||||||
|
72263,-133.333333333333,4,2,1,5,0,0
|
||||||
|
72318,-71.4285714285714,4,2,1,60,0,0
|
||||||
|
72485,-71.4285714285714,4,2,1,5,0,0
|
||||||
|
72540,-133.333333333333,4,2,1,60,0,0
|
||||||
|
72985,-66.6666666666667,4,2,1,60,0,0
|
||||||
|
73207,-100,4,2,1,60,0,0
|
||||||
|
73651,-133.333333333333,4,2,1,45,0,0
|
||||||
|
75318,-133.333333333333,4,2,1,5,0,0
|
||||||
|
75429,-133.333333333333,4,2,1,45,0,0
|
||||||
|
76762,-100,4,2,1,45,0,0
|
||||||
|
77096,-100,4,2,1,5,0,0
|
||||||
|
77207,-100,4,2,1,70,0,1
|
||||||
|
77818,-100,4,2,1,5,0,1
|
||||||
|
77874,-100,4,2,1,70,0,1
|
||||||
|
78262,-100,4,2,1,5,0,1
|
||||||
|
78318,-100,4,2,1,70,0,1
|
||||||
|
78540,-83.3333333333333,4,2,1,70,0,1
|
||||||
|
78985,-100,4,2,1,70,0,1
|
||||||
|
79596,-100,4,2,1,5,0,1
|
||||||
|
79651,-100,4,2,1,70,0,1
|
||||||
|
80040,-100,4,2,1,5,0,1
|
||||||
|
80096,-100,4,2,1,70,0,1
|
||||||
|
80318,-83.3333333333333,4,2,1,70,0,1
|
||||||
|
84318,-100,4,2,1,70,0,1
|
||||||
|
84929,-100,4,2,1,5,0,1
|
||||||
|
84985,-100,4,2,1,70,0,1
|
||||||
|
85207,-100,4,2,1,70,0,1
|
||||||
|
85374,-100,4,2,1,5,0,1
|
||||||
|
85429,-100,4,2,1,70,0,1
|
||||||
|
85651,-83.3333333333333,4,2,1,70,0,1
|
||||||
|
86096,-100,4,2,1,70,0,1
|
||||||
|
86707,-100,4,2,1,5,0,1
|
||||||
|
86762,-100,4,2,1,70,0,1
|
||||||
|
88818,-100,4,2,1,5,0,1
|
||||||
|
88874,-100,4,2,1,70,0,1
|
||||||
|
88929,-100,4,2,1,5,0,1
|
||||||
|
88985,-100,4,2,1,70,0,1
|
||||||
|
89040,-100,4,2,1,5,0,1
|
||||||
|
89096,-100,4,2,1,70,0,1
|
||||||
|
92040,-100,4,2,1,5,0,1
|
||||||
|
92096,-100,4,2,1,70,0,1
|
||||||
|
92485,-100,4,2,1,5,0,1
|
||||||
|
92540,-100,4,2,1,70,0,1
|
||||||
|
97651,-200,4,2,1,70,0,1
|
||||||
|
97818,-200,4,2,1,5,0,1
|
||||||
|
97874,-66.6666666666667,4,2,1,70,0,1
|
||||||
|
97985,-66.6666666666667,4,2,1,70,0,1
|
||||||
|
98040,-66.6666666666667,4,2,1,5,0,1
|
||||||
|
98096,-133.333333333333,4,2,1,70,0,1
|
||||||
|
98262,-133.333333333333,4,2,1,5,0,1
|
||||||
|
98318,-66.6666666666667,4,2,1,70,0,1
|
||||||
|
98540,-100,4,2,1,70,0,1
|
||||||
|
99151,-100,4,2,1,5,0,1
|
||||||
|
99207,-100,4,2,1,70,0,1
|
||||||
|
99596,-100,4,2,1,5,0,1
|
||||||
|
99651,-100,4,2,1,70,0,1
|
||||||
|
103040,-100,4,2,1,5,0,1
|
||||||
|
103096,-100,4,2,1,70,0,1
|
||||||
|
103151,-100,4,2,1,5,0,1
|
||||||
|
103207,-100,4,2,1,70,0,1
|
||||||
|
103262,-100,4,2,1,5,0,1
|
||||||
|
103318,-100,4,2,1,70,0,1
|
||||||
|
105207,-83.3333333333333,4,2,1,70,0,1
|
||||||
|
105540,-83.3333333333333,4,2,1,70,0,1
|
||||||
|
105651,-133.333333333333,4,2,1,60,0,0
|
||||||
|
105985,-133.333333333333,4,2,1,5,0,0
|
||||||
|
106096,-200,4,2,1,60,0,0
|
||||||
|
106985,-66.6666666666667,4,2,1,60,0,0
|
||||||
|
107151,-66.6666666666667,4,2,1,5,0,0
|
||||||
|
107207,-66.6666666666667,4,2,1,60,0,0
|
||||||
|
107429,-100,4,2,1,60,0,0
|
||||||
|
107763,-100,4,2,1,5,0,0
|
||||||
|
107874,-100,4,2,1,60,0,0
|
||||||
|
108874,-100,4,2,1,60,0,0
|
||||||
|
109374,-100,4,2,1,5,0,0
|
||||||
|
109429,-100,4,2,1,60,0,0
|
||||||
|
109596,-100,4,2,1,5,0,0
|
||||||
|
109651,-200,4,2,1,60,0,0
|
||||||
|
109929,-100,4,2,1,60,0,0
|
||||||
|
109984,-100,4,2,1,60,0,0
|
||||||
|
110262,-100,4,2,1,5,0,0
|
||||||
|
110318,-100,4,2,1,60,0,0
|
||||||
|
110485,-100,4,2,1,5,0,0
|
||||||
|
110540,-100,4,2,1,60,0,0
|
||||||
|
110707,-100,4,2,1,5,0,0
|
||||||
|
110762,-66.6666666666667,4,2,1,60,0,0
|
||||||
|
110929,-100,4,2,1,60,0,0
|
||||||
|
110985,-133.333333333333,4,2,1,60,0,0
|
||||||
|
111429,-133.333333333333,4,2,1,60,0,0
|
||||||
|
111596,-133.333333333333,4,2,1,60,0,0
|
||||||
|
111651,-133.333333333333,4,2,1,60,0,0
|
||||||
|
111818,-133.333333333333,4,2,1,60,0,0
|
||||||
|
111874,-100,4,2,1,60,0,1
|
||||||
|
112318,-83.3333333333333,4,2,1,60,0,1
|
||||||
|
112429,-100,4,2,1,5,0,0
|
||||||
|
|
||||||
|
|
||||||
|
[Colours]
|
||||||
|
Combo1 : 112,75,180
|
||||||
|
Combo2 : 0,255,255
|
||||||
|
Combo3 : 255,15,117
|
||||||
|
Combo4 : 255,135,15
|
||||||
|
|
||||||
|
[HitObjects]
|
||||||
|
309,230,763,37,0,3:0:0:0:
|
||||||
|
485,146,985,2,0,L|406:167,1,67.4999968671799,8|0,3:0|0:0,0:0:0:0:
|
||||||
|
374,249,1207,2,0,L|299:227,1,67.4999968671799,8|0,3:0|0:0,0:0:0:0:
|
||||||
|
196,91,1429,2,0,L|191:44,3,33.7499984335899,0|0|0|0,3:0|3:0|3:0|3:0,0:0:0:0:
|
||||||
|
124,173,1651,2,0,L|131:222,2,44.9999979114532,0|0|0,3:0|3:0|3:0,0:0:0:0:
|
||||||
|
221,284,1874,2,0,L|213:208,1,67.4999968671799,0|0,3:0|3:0,0:0:0:0:
|
||||||
|
292,86,2096,38,0,L|310:234,1,146.249990980625,12|0,3:0|0:0,0:0:0:0:
|
||||||
|
314,328,2540,38,0,B|280:359|280:359|230:320|252:242|313:230,1,209.999990253448,0|0,3:0|0:0,0:0:0:0:
|
||||||
|
421,300,2874,1,0,0:0:0:0:
|
||||||
|
421,300,2985,2,0,P|461:288|491:253,1,74.999998807907,8|0,3:0|0:0,0:0:0:0:
|
||||||
|
309,231,3207,2,0,P|297:190|305:153,1,74.999998807907,4|0,0:0|0:0,0:0:0:0:
|
||||||
|
394,22,3429,5,0,3:0:0:0:
|
||||||
|
461,72,3540,2,0,B|477:103|477:103|461:148,1,74.999998807907,0|4,0:0|0:0,0:0:0:0:
|
||||||
|
378,183,3762,2,0,L|206:157,1,149.999997615814,0|0,0:0|0:0,0:0:0:0:
|
||||||
|
229,161,4096,2,0,P|227:202|211:250,1,74.999998807907,4|0,0:0|0:0,0:0:0:0:
|
||||||
|
61,384,4318,38,0,P|101:359|134:322,1,74.999998807907,0|0,3:0|0:0,0:0:0:0:
|
||||||
|
317,310,4540,2,0,P|267:305|226:288,1,74.999998807907,4|0,0:0|0:0,0:0:0:0:
|
||||||
|
141,110,4762,2,0,B|121:175|152:226|152:226|152:202|161:183,1,149.999997615814,8|4,3:0|0:0,0:0:0:0:
|
||||||
|
155,196,5096,6,0,P|67:211|79:286,1,179.999991645813,0|0,0:0|0:0,0:0:0:0:
|
||||||
|
212,366,5429,38,0,P|207:335|174:281,1,56.2500012516975,4|0,0:0|0:0,0:0:0:0:
|
||||||
|
206,286,5651,2,0,P|236:297|299:295,1,56.2500012516975,8|0,3:0|0:0,0:0:0:0:
|
||||||
|
281,321,5874,2,0,P|257:340|227:396,1,56.2500012516975,4|0,0:0|0:0,0:0:0:0:
|
||||||
|
124,246,6096,6,0,P|198:198|277:232,1,149.999997615814,0|0,3:0|0:0,0:0:0:0:
|
||||||
|
253,211,6429,1,0,0:0:0:0:
|
||||||
|
276,99,6540,2,0,P|335:139|369:215,1,149.999997615814,8|4,3:0|0:0,0:0:0:0:
|
||||||
|
368,208,6874,1,0,0:0:0:0:
|
||||||
|
430,96,6985,37,0,3:0:0:0:
|
||||||
|
497,147,7096,2,0,P|507:189|488:244,1,74.999998807907,0|4,0:0|0:0,0:0:0:0:
|
||||||
|
414,379,7318,2,0,B|383:322|421:267|421:267|421:308,1,149.999997615814,0|0,0:0|0:0,0:0:0:0:
|
||||||
|
421,298,7651,2,0,P|378:312|336:304,1,74.999998807907,4|0,0:0|0:0,0:0:0:0:
|
||||||
|
270,170,7874,6,0,P|275:228|236:278,1,74.999998807907,0|0,3:0|0:0,0:0:0:0:
|
||||||
|
94,300,8096,2,0,P|133:263|208:274,1,74.999998807907,4|0,0:0|0:0,0:0:0:0:
|
||||||
|
261,374,8318,2,0,L|176:365,1,74.999998807907,8|0,3:0|0:0,0:0:0:0:
|
||||||
|
38,377,8540,2,0,L|55:197,1,168.750003755093,4|0,0:0|0:0,0:0:0:0:
|
||||||
|
123,25,8985,38,0,L|132:110,1,74.999998807907,4|0,0:0|0:0,0:0:0:0:
|
||||||
|
217,242,9207,2,0,L|237:168,1,74.999998807907,8|0,3:0|0:0,0:0:0:0:
|
||||||
|
48,92,9429,5,4,0:0:0:0:
|
||||||
|
63,176,9540,1,0,0:0:0:0:
|
||||||
|
83,259,9651,38,0,P|167:223|231:255,1,149.999997615814,0|0,3:0|0:0,0:0:0:0:
|
||||||
|
274,312,9985,1,0,0:0:0:0:
|
||||||
|
274,312,10096,2,0,L|354:292,1,74.999998807907,8|0,3:0|0:0,0:0:0:0:
|
||||||
|
459,225,10318,2,0,L|375:204,1,74.999998807907,4|0,0:0|0:0,0:0:0:0:
|
||||||
|
269,107,10540,1,0,3:0:0:0:
|
||||||
|
276,54,10651,1,0,0:0:0:0:
|
||||||
|
313,17,10762,1,4,0:0:0:0:
|
||||||
|
363,9,10874,1,0,0:0:0:0:
|
||||||
|
363,9,11096,5,0,0:0:0:0:
|
||||||
|
432,68,11207,2,0,P|444:107|425:154,1,74.999998807907,4|0,0:0|0:0,0:0:0:0:
|
||||||
|
309,252,11429,38,0,P|297:195|321:158,1,74.999998807907,0|0,3:0|0:0,0:0:0:0:
|
||||||
|
450,316,11651,2,0,L|361:312,1,74.999998807907,4|0,0:0|0:0,0:0:0:0:
|
||||||
|
160,341,11874,2,0,B|187:380|187:380|233:309|177:235,1,187.499997019767,8|4,3:0|0:0,0:0:0:0:
|
||||||
|
116,200,12207,6,0,P|52:224|122:264,1,168.750003755093,0|4,0:0|0:0,0:0:0:0:
|
||||||
|
297,91,12762,37,8,3:0:0:0:
|
||||||
|
276,44,12874,1,0,0:0:0:0:
|
||||||
|
226,27,12985,1,4,0:0:0:0:
|
||||||
|
187,63,13096,1,0,0:0:0:0:
|
||||||
|
196,115,13207,1,0,0:0:0:0:
|
||||||
|
376,144,13429,2,0,L|378:121,2,16.6666664017571,0|0|0,0:0|0:0|0:0,0:0:0:0:
|
||||||
|
436,220,13651,6,0,B|395:211|373:164|373:164|332:208|264:185,1,179.999991645813,8|4,3:0|0:0,0:0:0:0:
|
||||||
|
276,44,13985,1,0,0:0:0:0:
|
||||||
|
196,115,14096,38,0,L|139:124,4,37.4999994039535,0|0|0|0|4,3:0|0:0|0:0|0:0|0:0,0:0:0:0:
|
||||||
|
82,69,14429,1,0,0:0:0:0:
|
||||||
|
106,190,14540,2,0,L|126:276,1,74.999998807907,8|0,3:0|0:0,0:0:0:0:
|
||||||
|
218,383,14762,2,0,L|234:309,1,74.999998807907,4|0,0:0|0:0,0:0:0:0:
|
||||||
|
26,231,14985,5,0,3:0:0:0:
|
||||||
|
253,202,15207,37,0,0:0:0:0:
|
||||||
|
331,271,15318,1,0,0:0:0:0:
|
||||||
|
233,309,15429,1,8,3:0:0:0:
|
||||||
|
389,73,15651,6,0,P|410:22|447:112,1,224.999996423721,4|0,3:0|0:0,0:0:0:0:
|
||||||
|
391,165,16096,1,0,0:0:0:0:
|
||||||
|
377,177,16207,1,0,0:0:0:0:
|
||||||
|
365,187,16318,38,0,B|253:261|221:119|94:192,1,269.999987468719,0|0,0:0|0:0,0:0:0:0:
|
||||||
|
73,319,16762,22,0,P|133:336|116:236,1,168.750003755093,4|0,3:0|0:0,0:0:0:0:
|
||||||
|
139,258,17207,6,0,P|138:315|69:283,1,112.500002503395,8|0,3:0|0:0,0:0:0:0:
|
||||||
|
92,323,17762,37,0,0:0:0:0:
|
||||||
|
43,245,17874,1,4,0:0:0:0:
|
||||||
|
4,322,17985,1,0,0:0:0:0:
|
||||||
|
133,245,18096,1,0,3:0:0:0:
|
||||||
|
29,105,18318,6,0,L|38:40,3,56.2500012516975,4|0|0|0,3:0|0:0|0:0|0:0,0:0:0:0:
|
||||||
|
50,30,18540,38,0,P|111:56|193:25,1,149.999997615814,0|0,3:0|0:0,0:0:0:0:
|
||||||
|
240,120,18985,2,0,P|328:91|394:125,1,149.999997615814,8|4,3:0|0:0,0:0:0:0:
|
||||||
|
409,213,19318,2,0,B|377:226|377:226|243:200,1,149.999997615814,0|0,0:0|0:0,0:0:0:0:
|
||||||
|
119,187,19651,2,0,L|127:286,1,74.999998807907,4|0,0:0|0:0,0:0:0:0:
|
||||||
|
179,338,19874,1,8,3:0:0:0:
|
||||||
|
45,307,19985,6,0,L|3:297,2,37.4999994039535,0|0|4,0:0|0:0|0:0,0:0:0:0:
|
||||||
|
103,380,20207,1,0,3:0:0:0:
|
||||||
|
212,257,20318,38,0,P|233:218|231:171,1,74.999998807907,0|0,3:0|0:0,0:0:0:0:
|
||||||
|
111,118,20540,1,4,0:0:0:0:
|
||||||
|
111,118,20762,6,0,L|197:109,1,74.999998807907,8|4,3:0|0:0,0:0:0:0:
|
||||||
|
256,18,21096,37,0,0:0:0:0:
|
||||||
|
337,121,21207,2,0,P|350:60|403:16,1,112.49999821186,0|0,3:0|0:0,0:0:0:0:
|
||||||
|
384,26,21429,2,0,P|406:86|465:122,1,112.49999821186,0|0,0:0|0:0,0:0:0:0:
|
||||||
|
443,114,21651,2,0,P|377:105|327:131,1,112.49999821186,8|0,3:0|0:0,0:0:0:0:
|
||||||
|
352,223,21874,6,0,B|369:230|369:230|391:228|391:228|416:239|416:239|440:235|440:235|462:244|462:244|489:249,1,112.500002503395,4|0,0:0|0:0,0:0:0:0:
|
||||||
|
322,343,22096,37,0,3:0:0:0:
|
||||||
|
259,270,22207,2,0,P|223:276|182:263,2,74.999998807907,0|4|0,0:0|0:0|0:0,0:0:0:0:
|
||||||
|
86,360,22540,5,8,3:0:0:0:
|
||||||
|
15,295,22651,2,0,L|0:201,2,74.999998807907,0|4|0,0:0|0:0|0:0,0:0:0:0:
|
||||||
|
94,384,22985,38,0,P|118:328|112:277,1,112.49999821186,0|0,3:0|0:0,0:0:0:0:
|
||||||
|
0,211,23429,22,0,L|76:196,1,74.999998807907,12|0,3:0|0:0,0:0:0:0:
|
||||||
|
215,134,23651,2,0,L|114:110,1,74.999998807907,12|0,3:0|0:0,0:0:0:0:
|
||||||
|
33,124,23874,22,0,L|43:2,1,112.49999821186,0|0,3:0|0:0,0:0:0:0:
|
||||||
|
150,269,24318,2,0,L|162:194,1,74.999998807907,0|4,3:0|0:0,0:0:0:0:
|
||||||
|
229,134,24651,6,0,L|386:164,1,112.500002503395,12|0,3:0|0:0,0:0:0:0:
|
||||||
|
486,268,24874,37,0,0:0:0:0:
|
||||||
|
410,119,24985,1,4,0:0:0:0:
|
||||||
|
381,213,25096,1,0,0:0:0:0:
|
||||||
|
512,120,25207,1,0,3:0:0:0:
|
||||||
|
247,36,25429,6,0,L|191:25,3,37.4999994039535,4|0|0|0,3:0|0:0|0:0|0:0,0:0:0:0:
|
||||||
|
185,24,25651,2,0,B|145:72|145:72|174:164,1,149.999997615814,0|0,3:0|0:0,0:0:0:0:
|
||||||
|
253,219,26096,2,0,B|281:311|281:311|228:382,1,149.999997615814,8|4,3:0|0:0,0:0:0:0:
|
||||||
|
100,363,26429,38,0,L|259:354,1,149.999997615814,0|0,0:0|0:0,0:0:0:0:
|
||||||
|
404,262,26762,1,4,0:0:0:0:
|
||||||
|
390,352,26874,1,0,0:0:0:0:
|
||||||
|
314,295,26985,1,8,3:0:0:0:
|
||||||
|
425,256,27096,6,0,L|492:246,2,37.4999994039535,0|0|4,0:0|0:0|0:0,0:0:0:0:
|
||||||
|
329,216,27318,1,0,3:0:0:0:
|
||||||
|
193,177,27429,38,0,L|266:161,1,74.999998807907,0|0,3:0|0:0,0:0:0:0:
|
||||||
|
322,107,27651,1,4,0:0:0:0:
|
||||||
|
322,107,27874,2,0,L|310:238,1,112.500002503395,8|4,3:0|0:0,0:0:0:0:
|
||||||
|
110,299,28207,5,0,0:0:0:0:
|
||||||
|
164,231,28318,2,0,B|168:303|168:303|121:338,1,112.49999821186,0|0,3:0|0:0,0:0:0:0:
|
||||||
|
30,284,28540,2,0,B|90:244|90:244|144:267,1,112.49999821186,0|0,0:0|0:0,0:0:0:0:
|
||||||
|
148,371,28762,2,0,B|83:338|83:338|76:280,1,112.49999821186,8|0,3:0|0:0,0:0:0:0:
|
||||||
|
194,201,28985,38,0,B|207:210|207:210|227:210|227:210|243:217|243:217|265:218|265:218|282:227|282:227|305:225|305:225|325:238,1,112.500002503395,4|0,0:0|0:0,0:0:0:0:
|
||||||
|
492,114,29207,6,0,P|445:136|410:138,1,74.999998807907,0|0,3:0|0:0,0:0:0:0:
|
||||||
|
324,102,29429,2,0,P|291:68|280:29,1,74.999998807907,4|0,0:0|0:0,0:0:0:0:
|
||||||
|
418,17,29651,1,8,3:0:0:0:
|
||||||
|
495,201,29874,1,4,3:2:0:0:
|
||||||
|
221,136,30096,37,0,3:0:0:0:
|
||||||
|
299,188,30207,2,0,B|316:251|316:251|271:352,1,149.999997615814,4|0,3:0|0:0,0:0:0:0:
|
||||||
|
115,334,30540,6,0,P|11:252|167:266,1,382.500001215934,0|0,0:0|0:0,0:0:0:0:
|
||||||
|
216,326,30985,38,0,L|304:331,1,63.7500002026557,4|0,3:0|0:0,0:0:0:0:
|
||||||
|
280,330,31429,6,0,L|293:241,1,74.999998807907,8|0,3:0|0:0,0:0:0:0:
|
||||||
|
426,252,31651,2,0,L|439:163,1,74.999998807907,0|0,0:0|0:0,0:0:0:0:
|
||||||
|
253,158,31874,37,0,3:0:0:0:
|
||||||
|
258,132,31985,1,0,0:0:0:0:
|
||||||
|
337,111,32096,5,4,0:0:0:0:
|
||||||
|
341,85,32207,1,0,0:0:0:0:
|
||||||
|
271,30,32318,38,0,B|212:42|212:42|141:19,1,112.49999821186,8|0,3:0|0:0,0:0:0:0:
|
||||||
|
163,26,32540,2,0,L|144:181,1,149.999997615814,4|0,0:0|3:0,0:0:0:0:
|
||||||
|
445,343,32985,22,0,B|439:234|439:234|384:269,1,149.999997615814,4|8,0:0|3:0,0:0:0:0:
|
||||||
|
240,257,33429,2,0,B|263:148|263:148|291:205,1,149.999997615814,4|0,0:0|3:0,0:0:0:0:
|
||||||
|
68,333,33874,2,0,B|83:233|83:233|41:256,1,149.999997615814,4|8,0:0|3:0,0:0:0:0:
|
||||||
|
344,347,34318,22,0,B|368:372|368:372|455:355|455:355|472:308,1,149.999997615814,4|0,0:0|0:0,0:0:0:0:
|
||||||
|
452,255,34540,2,0,B|389:212|389:212|332:273,1,149.999997615814,0|4,3:0|0:0,0:0:0:0:
|
||||||
|
256,220,34874,5,0,0:0:0:0:
|
||||||
|
256,220,34985,2,0,B|256:128,1,74.999998807907,8|0,3:0|0:0,0:0:0:0:
|
||||||
|
256,70,35207,2,0,B|256:162,1,74.999998807907,4|0,0:0|0:0,0:0:0:0:
|
||||||
|
112,312,35429,37,0,3:0:0:0:
|
||||||
|
60,255,35540,2,0,B|123:212|123:212|180:273,1,149.999997615814,0|0,0:0|0:0,0:0:0:0:
|
||||||
|
169,350,35874,6,0,B|144:375|144:375|57:358|57:358|40:311,1,149.999997615814,8|0,3:0|3:0,0:0:0:0:
|
||||||
|
62,169,36429,6,0,L|76:267,2,74.999998807907,0|4|0,0:0|0:0|0:0,0:0:0:0:
|
||||||
|
134,61,36762,1,8,3:0:0:0:
|
||||||
|
201,113,36874,2,0,L|215:211,2,74.999998807907,0|4|0,0:0|0:0|0:0,0:0:0:0:
|
||||||
|
298,272,37207,6,0,L|315:184,1,74.999998807907,0|0,3:0|0:0,0:0:0:0:
|
||||||
|
330,114,37429,1,4,0:0:0:0:
|
||||||
|
446,176,37540,2,0,B|404:214|404:214|307:197,1,149.999997615814,4|0,3:0|0:0,0:0:0:0:
|
||||||
|
231,240,37874,2,0,P|223:199|231:162,1,74.999998807907,4|0,3:0|0:0,0:0:0:0:
|
||||||
|
325,285,38096,6,0,L|154:300,1,149.999997615814,4|0,3:0|0:0,0:0:0:0:
|
||||||
|
175,298,38540,6,0,L|163:396,1,74.999998807907,8|0,3:0|0:0,0:0:0:0:
|
||||||
|
75,208,38762,2,0,L|63:306,1,74.999998807907,0|0,0:0|0:0,0:0:0:0:
|
||||||
|
233,74,38985,37,0,3:0:0:0:
|
||||||
|
231,98,39096,1,0,0:0:0:0:
|
||||||
|
156,139,39207,5,4,0:0:0:0:
|
||||||
|
155,165,39318,1,0,0:0:0:0:
|
||||||
|
227,215,39429,38,0,P|282:209|352:230,1,112.49999821186,8|0,3:0|0:0,0:0:0:0:
|
||||||
|
336,222,39651,2,0,L|366:67,1,149.999997615814,4|0,0:0|3:0,0:0:0:0:
|
||||||
|
81,35,40096,22,0,B|82:105|82:105|118:136|118:136|132:89,1,149.999997615814,4|8,0:0|3:0,0:0:0:0:
|
||||||
|
272,158,40540,2,0,B|270:228|270:228|234:259|234:259|220:212,1,149.999997615814,4|0,0:0|3:0,0:0:0:0:
|
||||||
|
423,36,40985,2,0,B|400:102|400:102|423:143|423:143|453:104,1,149.999997615814,4|8,0:0|3:0,0:0:0:0:
|
||||||
|
512,278,41429,6,0,P|415:258|361:293,1,149.999997615814,4|0,0:0|0:0,0:0:0:0:
|
||||||
|
359,302,41651,6,0,B|320:264|320:264|310:187,1,112.49999821186,0|0,3:0|0:0,0:0:0:0:
|
||||||
|
322,190,41874,2,0,L|449:171,1,112.49999821186,4|0,0:0|0:0,0:0:0:0:
|
||||||
|
443,159,42096,1,8,3:0:0:0:
|
||||||
|
240,52,42318,6,0,B|255:79|255:79|241:135,1,74.999998807907,4|0,0:0|0:0,0:0:0:0:
|
||||||
|
177,166,42540,1,0,3:0:0:0:
|
||||||
|
163,151,42651,2,0,B|161:207|161:207|192:240|192:240|189:299,1,149.999997615814,0|0,0:0|0:0,0:0:0:0:
|
||||||
|
131,365,42985,2,0,P|198:322|280:345,1,149.999997615814,8|4,3:0|0:0,0:0:0:0:
|
||||||
|
335,377,43318,1,0,0:0:0:0:
|
||||||
|
442,239,43429,38,0,B|456:178|456:178|422:136|422:136|427:68|427:68|449:112,1,224.999996423721,0|0,3:0|0:0,0:0:0:0:
|
||||||
|
444,103,43874,2,0,P|402:118|356:120,1,74.999998807907,0|0,0:0|0:0,0:0:0:0:
|
||||||
|
249,28,44096,2,0,P|295:35|324:48,1,74.999998807907,0|0,0:0|0:0,0:0:0:0:
|
||||||
|
364,201,44318,5,0,0:0:0:0:
|
||||||
|
332,195,44429,1,0,0:0:0:0:
|
||||||
|
251,135,44540,37,0,0:0:0:0:
|
||||||
|
281,123,44651,1,0,0:0:0:0:
|
||||||
|
332,195,44762,6,0,B|356:269|324:333|324:333|303:293,1,179.999991645813,4|0,0:3|0:0,0:0:0:0:
|
||||||
|
61,25,45207,38,0,L|88:158,1,112.500002503395,0|0,3:0|0:0,0:0:0:0:
|
||||||
|
84,136,45651,1,8,3:0:0:0:
|
||||||
|
84,136,46096,1,0,3:0:0:0:
|
||||||
|
176,33,46207,2,0,L|164:103,1,56.2500012516975,0|0,0:0|0:0,0:0:0:0:
|
||||||
|
219,207,46429,2,0,L|232:152,1,56.2500012516975,0|8,0:0|3:0,0:0:0:0:
|
||||||
|
312,65,46651,1,0,0:0:0:0:
|
||||||
|
312,65,46762,2,0,L|398:94,1,56.2500012516975,0|0,0:0|0:0,0:0:0:0:
|
||||||
|
512,176,46985,5,0,3:0:0:0:
|
||||||
|
421,192,47096,1,0,0:0:0:0:
|
||||||
|
421,192,47429,1,8,3:0:0:0:
|
||||||
|
402,357,47651,37,0,0:0:0:0:
|
||||||
|
394,277,47762,1,0,0:0:0:0:
|
||||||
|
328,324,47874,1,0,3:0:0:0:
|
||||||
|
328,324,48318,1,8,3:0:0:0:
|
||||||
|
110,357,48540,5,0,0:0:0:0:
|
||||||
|
118,277,48651,1,0,0:0:0:0:
|
||||||
|
184,324,48763,1,0,3:0:0:0:
|
||||||
|
110,357,48874,1,0,0:0:0:0:
|
||||||
|
110,357,49207,1,8,3:0:0:0:
|
||||||
|
110,357,49651,1,0,3:0:0:0:
|
||||||
|
0,283,49762,38,0,P|41:301|97:295,1,56.2500012516975,0|0,0:0|0:0,0:0:0:0:
|
||||||
|
188,219,49985,2,0,P|168:236|137:246,1,56.2500012516975,0|8,0:0|3:0,0:0:0:0:
|
||||||
|
49,137,50207,1,0,0:0:0:0:
|
||||||
|
49,137,50318,2,0,P|65:184|93:205,1,56.2500012516975,0|0,0:0|0:0,0:0:0:0:
|
||||||
|
107,67,50540,5,0,3:0:0:0:
|
||||||
|
32,15,50651,1,0,0:0:0:0:
|
||||||
|
32,15,50985,1,8,3:0:0:0:
|
||||||
|
265,114,51207,37,0,0:0:0:0:
|
||||||
|
254,196,51318,1,0,0:0:0:0:
|
||||||
|
241,279,51429,1,0,3:0:0:0:
|
||||||
|
241,279,51651,1,0,0:0:0:0:
|
||||||
|
336,207,51762,6,0,P|397:191|371:274,1,168.750003755093,0|0,0:0|0:0,0:0:0:0:
|
||||||
|
83,206,52318,5,0,3:0:0:0:
|
||||||
|
83,206,52429,2,0,L|101:260,1,56.2500012516975,0|0,0:0|0:0,0:0:0:0:
|
||||||
|
40,383,52651,2,0,P|70:355|90:324,1,56.2500012516975,0|8,0:0|3:0,0:0:0:0:
|
||||||
|
214,334,52874,1,0,0:0:0:0:
|
||||||
|
214,334,52985,2,0,P|171:322|140:304,1,56.2500012516975,0|0,0:0|0:0,0:0:0:0:
|
||||||
|
151,160,53207,5,0,3:0:0:0:
|
||||||
|
188,135,53318,1,0,0:0:0:0:
|
||||||
|
232,129,53429,1,0,0:0:0:0:
|
||||||
|
273,146,53540,1,0,0:0:0:0:
|
||||||
|
339,198,53651,37,8,3:0:0:0:
|
||||||
|
383,199,53762,1,0,0:0:0:0:
|
||||||
|
426,185,53874,1,0,0:0:0:0:
|
||||||
|
450,147,53985,1,0,0:0:0:0:
|
||||||
|
444,61,54096,6,0,P|414:28|377:15,1,56.2500012516975,0|0,3:0|0:0,0:0:0:0:
|
||||||
|
301,28,54318,2,0,P|268:48|255:77,1,56.2500012516975,0|0,0:0|0:0,0:0:0:0:
|
||||||
|
189,271,54540,38,0,P|209:222|204:198,1,56.2500012516975,8|0,3:0|0:0,0:0:0:0:
|
||||||
|
186,114,54762,2,0,P|152:74|124:68,1,56.2500012516975,0|0,0:0|0:0,0:0:0:0:
|
||||||
|
27,137,54985,5,0,3:0:0:0:
|
||||||
|
34,167,55096,1,0,0:0:0:0:
|
||||||
|
122,204,55207,37,0,0:0:0:0:
|
||||||
|
116,178,55318,1,0,0:0:0:0:
|
||||||
|
48,249,55429,5,8,3:0:0:0:
|
||||||
|
54,274,55540,1,0,0:0:0:0:
|
||||||
|
124,329,55651,38,0,P|157:326|200:310,1,56.2500012516975,0|0,0:0|0:0,0:0:0:0:
|
||||||
|
320,185,55874,5,0,3:0:0:0:
|
||||||
|
287,175,55985,1,0,0:0:0:0:
|
||||||
|
254,181,56096,2,0,P|258:221|264:241,1,56.2500012516975,0|0,0:0|0:0,0:0:0:0:
|
||||||
|
337,347,56318,2,0,P|348:321|350:293,1,56.2500012516975,8|0,3:0|0:0,0:0:0:0:
|
||||||
|
418,197,56540,37,0,0:0:0:0:
|
||||||
|
418,197,56651,2,0,L|492:180,1,56.2500012516975,0|0,0:0|3:0,0:0:0:0:
|
||||||
|
329,114,56874,2,0,L|262:94,1,56.2500012516975,0|0,0:0|0:0,0:0:0:0:
|
||||||
|
436,59,57096,6,0,L|413:126,1,56.2500012516975,0|8,0:0|3:0,0:0:0:0:
|
||||||
|
332,194,57318,2,0,L|353:259,2,56.2500012516975,0|0|0,0:0|0:0|0:0,0:0:0:0:
|
||||||
|
202,194,57651,37,0,3:0:0:0:
|
||||||
|
224,233,57762,1,0,0:0:0:0:
|
||||||
|
222,279,57874,1,0,0:0:0:0:
|
||||||
|
193,314,57985,1,0,0:0:0:0:
|
||||||
|
144,244,58096,5,0,0:0:0:0:
|
||||||
|
127,214,58207,1,0,0:0:0:0:
|
||||||
|
126,180,58318,1,0,0:0:0:0:
|
||||||
|
139,149,58429,1,0,0:0:0:0:
|
||||||
|
224,113,58540,38,0,B|262:88|235:70|189:83|189:83|224:138|194:193,1,194.999987974167
|
||||||
|
299,319,58874,1,0,0:0:0:0:
|
||||||
|
299,319,58985,2,0,B|316:283|314:237|314:237|278:226|278:226|320:243|359:227,1,202.49999060154,4|0,0:0|0:0,0:0:0:0:
|
||||||
|
428,181,59429,22,0,P|454:129|399:4,1,179.999991645813,0|0,3:0|0:0,0:0:0:0:
|
||||||
|
418,18,59874,2,0,L|373:15,6,24.9999996026357,8|0|0|0|0|0|4,3:0|0:0|0:0|0:0|0:0|0:0|0:0,0:0:0:0:
|
||||||
|
428,181,60207,5,0,0:0:0:0:
|
||||||
|
352,209,60318,1,0,3:0:0:0:
|
||||||
|
278,177,60429,1,0,0:0:0:0:
|
||||||
|
208,225,60540,2,0,L|222:267,2,37.4999994039535,4|0|0,0:0|0:0|0:0,0:0:0:0:
|
||||||
|
71,144,60762,38,0,L|65:109,3,24.9999996026357,8|0|0|0,3:0|0:0|0:0|0:0,0:0:0:0:
|
||||||
|
145,86,60985,1,4,0:0:0:0:
|
||||||
|
163,127,61096,1,0,0:0:0:0:
|
||||||
|
161,171,61207,1,0,3:0:0:0:
|
||||||
|
136,208,61318,1,0,0:0:0:0:
|
||||||
|
99,231,61429,2,0,B|91:279|91:279|117:314,1,74.999998807907,4|0,0:0|0:0,0:0:0:0:
|
||||||
|
177,378,61651,5,8,3:0:0:0:
|
||||||
|
177,378,61762,2,0,B|231:371|231:371|272:326|272:326|345:319,1,179.999991645813
|
||||||
|
417,293,62096,1,0,3:0:0:0:
|
||||||
|
438,263,62207,1,0,0:0:0:0:
|
||||||
|
436,225,62318,1,4,0:0:0:0:
|
||||||
|
412,196,62429,1,0,0:0:0:0:
|
||||||
|
320,172,62540,6,0,P|307:192|291:204,1,37.4999994039535,8|0,3:0|0:0,0:0:0:0:
|
||||||
|
291,147,62651,2,0,P|274:156|245:153,1,37.4999994039535,0|0,0:0|0:0,0:0:0:0:
|
||||||
|
276,114,62762,2,0,P|250:107|234:94,1,37.4999994039535,4|0,0:0|0:0,0:0:0:0:
|
||||||
|
283,81,62874,2,0,P|265:61|260:45,1,37.4999994039535,0|0,0:0|0:0,0:0:0:0:
|
||||||
|
365,31,62985,38,0,P|398:44|442:49,1,74.999998807907,0|0,3:0|0:0,0:0:0:0:
|
||||||
|
512,169,63207,2,0,P|466:163|421:176,1,74.999998807907,4|0,0:0|0:0,0:0:0:0:
|
||||||
|
350,107,63429,1,8,3:0:0:0:
|
||||||
|
293,237,63540,38,0,L|276:158,1,74.999998807907,0|0,0:0|0:0,0:0:0:0:
|
||||||
|
428,269,63762,2,0,B|373:275|373:275|338:249|338:249|267:255,1,149.999997615814,0|0,0:0|0:0,0:0:0:0:
|
||||||
|
191,318,64096,2,0,B|182:355|182:355|212:395,1,74.999998807907,4|0,0:0|0:0,0:0:0:0:
|
||||||
|
192,186,64318,5,8,3:0:0:0:
|
||||||
|
135,253,64429,2,0,L|56:270,2,74.999998807907,0|4|0,0:0|0:0|0:0,0:0:0:0:
|
||||||
|
24,136,64762,38,0,P|69:76|158:75,1,157.499992690086,0|0,3:0|0:0,0:0:0:0:
|
||||||
|
160,80,64985,6,0,P|193:102|255:102,1,84.3750018775463,4|0,0:0|0:0,0:0:0:0:
|
||||||
|
276,34,65207,38,0,L|290:212,1,157.499992690086,8|0,3:0|0:0,0:0:0:0:
|
||||||
|
291,219,65429,6,0,L|311:132,1,84.3750018775463,4|0,0:0|0:0,0:0:0:0:
|
||||||
|
381,111,65651,38,0,B|418:126|418:126|460:126,1,74.999998807907,0|0,3:0|0:0,0:0:0:0:
|
||||||
|
221,163,65874,2,0,B|186:143|186:143|139:153,1,74.999998807907,4|0,0:0|0:0,0:0:0:0:
|
||||||
|
41,231,66096,1,8,3:0:0:0:
|
||||||
|
49,267,66207,1,0,0:0:0:0:
|
||||||
|
56,303,66318,1,4,0:0:0:0:
|
||||||
|
67,288,66429,1,4,0:0:0:0:
|
||||||
|
77,270,66540,6,0,P|171:255|72:350,1,337.500007510185,0|0,0:0|0:0,0:0:0:0:
|
||||||
|
95,356,66985,38,0,L|185:343,1,74.999998807907,8|4,3:0|0:0,0:0:0:0:
|
||||||
|
274,286,67318,6,0,B|289:324|289:324|268:378,1,74.999998807907,0|0,0:0|3:0,0:0:0:0:
|
||||||
|
191,227,67540,1,0,0:0:0:0:
|
||||||
|
255,168,67651,2,0,L|264:116,2,37.4999994039535,4|0|0,0:0|0:0|0:0,0:0:0:0:
|
||||||
|
147,83,67874,2,0,L|154:108,3,24.9999996026357,8|0|0|0,3:0|0:0|0:0|0:0,0:0:0:0:
|
||||||
|
80,148,68096,38,0,L|98:224,1,74.999998807907,4|0,0:0|0:0,0:0:0:0:
|
||||||
|
125,356,68318,1,0,3:0:0:0:
|
||||||
|
0,319,68429,1,0,0:0:0:0:
|
||||||
|
0,319,68540,2,0,L|76:294,1,74.999998807907,4|0,0:0|0:0,0:0:0:0:
|
||||||
|
277,219,68762,5,8,3:0:0:0:
|
||||||
|
277,219,68874,2,0,B|327:199|327:199|293:138|197:173,1,179.999991645813,0|0,0:0|0:0,0:0:0:0:
|
||||||
|
157,273,69207,37,0,3:0:0:0:
|
||||||
|
175,316,69318,1,0,0:0:0:0:
|
||||||
|
212,334,69429,1,4,0:0:0:0:
|
||||||
|
254,333,69540,1,0,0:0:0:0:
|
||||||
|
332,268,69651,38,0,P|333:237|343:213,1,37.4999994039535,8|0,3:0|0:0,0:0:0:0:
|
||||||
|
373,265,69762,2,0,P|386:239|404:232,1,37.4999994039535,0|0,0:0|0:0,0:0:0:0:
|
||||||
|
413,284,69874,2,0,P|430:269|454:269,1,37.4999994039535,4|0,0:0|0:0,0:0:0:0:
|
||||||
|
433,318,69985,2,0,P|452:320|474:337,1,37.4999994039535,4|0,0:0|0:0,0:0:0:0:
|
||||||
|
401,384,70096,6,0,P|353:378|319:346,1,74.999998807907,0|0,3:0|0:0,0:0:0:0:
|
||||||
|
251,251,70318,2,0,P|240:196|260:154,1,74.999998807907,4|0,0:0|0:0,0:0:0:0:
|
||||||
|
401,18,70540,1,8,3:0:0:0:
|
||||||
|
401,18,70651,2,0,P|409:54|398:90,1,74.999998807907,0|0,0:0|0:0,0:0:0:0:
|
||||||
|
327,193,70874,2,0,L|304:45,1,149.999997615814,0|0,0:0|0:0,0:0:0:0:
|
||||||
|
290,26,71207,6,0,L|308:144,1,104.999995126724,0|0,0:0|0:0,0:0:0:0:
|
||||||
|
272,302,71429,2,0,L|187:288,1,74.999998807907,8|0,3:0|0:0,0:0:0:0:
|
||||||
|
33,217,71651,37,4,0:0:0:0:
|
||||||
|
27,187,71762,1,4,0:0:0:0:
|
||||||
|
20,157,71874,2,0,B|103:140|103:140|162:58,1,157.499992690086,0|0,3:0|0:0,0:0:0:0:
|
||||||
|
145,82,72096,6,0,L|218:75,1,56.2500012516975,0|0,0:0|0:0,0:0:0:0:
|
||||||
|
336,136,72318,38,0,P|331:213|231:208,1,157.499992690086
|
||||||
|
263,232,72540,6,0,L|278:300,1,56.2500012516975,0|0,0:0|0:0,0:0:0:0:
|
||||||
|
183,384,72762,2,0,L|172:307,1,56.2500012516975,0|0,0:0|0:0,0:0:0:0:
|
||||||
|
37,140,72985,38,0,B|10:168|10:168|17:204|17:204|54:220|54:220|89:196|89:196|87:157|87:157|57:138,1,225.00000500679
|
||||||
|
275,372,73651,6,0,P|320:352|387:369,1,112.500002503395
|
||||||
|
380,364,74096,2,0,L|436:358,1,56.2500012516975,0|0,0:0|0:0,0:0:0:0:
|
||||||
|
495,271,74318,2,0,L|424:282,1,56.2500012516975,0|0,0:0|0:0,0:0:0:0:
|
||||||
|
339,270,74540,1,0,0:0:0:0:
|
||||||
|
339,270,74651,1,0,0:0:0:0:
|
||||||
|
339,270,74762,2,0,L|329:196,1,56.2500012516975,0|0,0:0|0:0,0:0:0:0:
|
||||||
|
408,46,74985,38,0,L|392:120,1,56.2500012516975
|
||||||
|
220,230,75207,2,0,L|209:156,1,56.2500012516975,0|0,0:0|0:0,0:0:0:0:
|
||||||
|
282,7,75429,37,0,0:0:0:0:
|
||||||
|
300,98,75540,1,0,0:0:0:0:
|
||||||
|
197,25,75651,5,0,0:0:0:0:
|
||||||
|
222,103,75762,1,0,0:0:0:0:
|
||||||
|
126,69,75874,5,0,0:0:0:0:
|
||||||
|
153,134,75985,1,0,0:0:0:0:
|
||||||
|
76,145,76096,5,0,0:0:0:0:
|
||||||
|
116,179,76207,1,0,0:0:0:0:
|
||||||
|
70,222,76318,5,0,0:0:0:0:
|
||||||
|
111,222,76429,1,0,0:0:0:0:
|
||||||
|
134,253,76540,6,0,P|135:298|126:314,1,56.2500012516975,0|0,0:0|0:0,0:0:0:0:
|
||||||
|
21,384,76762,2,0,P|124:354|260:391,1,224.999996423721,0|0,0:0|0:0,0:0:0:0:
|
||||||
|
384,366,77207,22,0,L|394:268,1,74.999998807907,0|0,3:0|0:0,0:0:0:0:
|
||||||
|
499,62,77429,2,0,L|486:135,1,74.999998807907,4|0,0:0|0:0,0:0:0:0:
|
||||||
|
507,237,77651,2,0,P|450:231|388:184,1,112.49999821186,8|0,3:0|0:0,0:0:0:0:
|
||||||
|
404,203,77874,2,0,L|313:217,1,74.999998807907,4|0,0:0|0:0,0:0:0:0:
|
||||||
|
113,212,78096,6,0,P|128:267|111:328,1,112.49999821186,0|0,3:0|0:0,0:0:0:0:
|
||||||
|
115,319,78318,2,0,L|213:340,1,74.999998807907,4|0,0:0|0:0,0:0:0:0:
|
||||||
|
274,371,78540,38,0,L|257:186,1,179.999991645813,8|0,3:0|0:0,0:0:0:0:
|
||||||
|
128,139,78874,1,0,0:0:0:0:
|
||||||
|
128,139,78985,6,0,L|230:128,1,74.999998807907,0|0,3:0|0:0,0:0:0:0:
|
||||||
|
365,34,79207,37,4,0:0:0:0:
|
||||||
|
430,114,79318,1,0,0:0:0:0:
|
||||||
|
361,184,79429,2,0,P|304:170|277:110,1,112.49999821186,8|0,3:0|0:0,0:0:0:0:
|
||||||
|
278,126,79651,2,0,L|189:133,1,74.999998807907,4|0,0:0|0:0,0:0:0:0:
|
||||||
|
64,263,79874,6,0,B|37:230|37:230|50:143,1,112.49999821186,0|0,3:0|0:0,0:0:0:0:
|
||||||
|
66,119,80096,2,0,L|80:210,1,74.999998807907,4|0,0:0|0:0,0:0:0:0:
|
||||||
|
71,361,80318,38,0,B|135:350|135:350|182:305|182:305|243:297,1,179.999991645813,8|0,3:0|0:0,0:0:0:0:
|
||||||
|
302,247,80651,1,0,0:0:0:0:
|
||||||
|
222,211,80762,1,0,3:0:0:0:
|
||||||
|
478,344,80985,5,4,0:0:0:0:
|
||||||
|
491,309,81096,5,0,0:0:0:0:
|
||||||
|
498,265,81207,5,8,3:0:0:0:
|
||||||
|
485,223,81318,5,0,0:0:0:0:
|
||||||
|
458,179,81429,5,4,0:0:0:0:
|
||||||
|
418,147,81540,5,0,0:0:0:0:
|
||||||
|
352,126,81651,5,0,3:0:0:0:
|
||||||
|
281,149,81762,5,0,0:0:0:0:
|
||||||
|
239,221,81874,5,4,0:0:0:0:
|
||||||
|
159,262,81985,5,0,0:0:0:0:
|
||||||
|
66,234,82096,5,8,3:0:0:0:
|
||||||
|
11,145,82207,5,0,0:0:0:0:
|
||||||
|
55,33,82318,5,4,0:0:0:0:
|
||||||
|
273,44,82540,37,0,3:0:0:0:
|
||||||
|
320,103,82651,1,0,0:0:0:0:
|
||||||
|
394,118,82762,1,4,0:0:0:0:
|
||||||
|
468,100,82874,1,0,0:0:0:0:
|
||||||
|
507,36,82985,1,8,3:0:0:0:
|
||||||
|
495,19,83207,5,4,0:0:0:0:
|
||||||
|
335,83,83318,1,0,0:0:0:0:
|
||||||
|
453,81,83429,1,0,3:0:0:0:
|
||||||
|
283,24,83540,2,0,P|196:37|141:120,1,149.999997615814,0|0,0:0|0:0,0:0:0:0:
|
||||||
|
60,238,83874,1,8,3:0:0:0:
|
||||||
|
21,164,83985,2,0,P|59:149|175:193,1,149.999997615814,0|8,0:0|3:0,0:0:0:0:
|
||||||
|
252,206,84318,38,0,P|271:160|264:125,1,74.999998807907,0|0,3:0|0:0,0:0:0:0:
|
||||||
|
139,257,84540,2,0,P|131:302|149:340,1,74.999998807907,4|0,0:0|0:0,0:0:0:0:
|
||||||
|
240,379,84762,2,0,B|330:360|330:360|298:344,1,112.49999821186,8|0,3:0|0:0,0:0:0:0:
|
||||||
|
312,351,84985,2,0,P|279:321|270:287,1,74.999998807907,4|0,0:0|0:0,0:0:0:0:
|
||||||
|
359,165,85207,6,0,B|389:202|389:202|368:282,1,112.49999821186,0|0,3:0|0:0,0:0:0:0:
|
||||||
|
373,265,85429,2,0,L|454:282,1,74.999998807907,4|0,0:0|0:0,0:0:0:0:
|
||||||
|
498,139,85651,38,0,P|446:120|396:0,1,179.999991645813,8|0,3:0|0:0,0:0:0:0:
|
||||||
|
394,13,85985,1,0,0:0:0:0:
|
||||||
|
301,92,86096,6,0,L|214:83,1,74.999998807907,0|0,3:0|0:0,0:0:0:0:
|
||||||
|
66,66,86318,1,4,0:0:0:0:
|
||||||
|
13,136,86429,1,0,0:0:0:0:
|
||||||
|
72,193,86540,2,0,P|120:210|190:178,1,112.49999821186,8|0,3:0|0:0,0:0:0:0:
|
||||||
|
176,192,86762,2,0,P|154:237|160:288,1,74.999998807907,4|0,0:0|0:0,0:0:0:0:
|
||||||
|
309,370,86985,37,0,3:0:0:0:
|
||||||
|
359,310,87096,1,0,0:0:0:0:
|
||||||
|
283,297,87207,2,0,L|203:318,1,74.999998807907,4|0,0:0|0:0,0:0:0:0:
|
||||||
|
4,203,87429,2,0,B|55:211|55:211|82:255|82:255|134:266,1,149.999997615814,8|0,3:0|0:0,0:0:0:0:
|
||||||
|
238,217,87762,1,0,0:0:0:0:
|
||||||
|
183,120,87874,6,0,L|89:111,1,74.999998807907,0|0,3:0|0:0,0:0:0:0:
|
||||||
|
98,33,88096,2,0,L|23:26,1,74.999998807907,4|0,0:0|0:0,0:0:0:0:
|
||||||
|
306,182,88318,38,0,L|400:173,1,74.999998807907,8|0,3:0|0:0,0:0:0:0:
|
||||||
|
391,95,88540,2,0,L|465:88,1,74.999998807907,4|0,0:0|0:0,0:0:0:0:
|
||||||
|
232,28,88762,2,0,L|220:92,1,37.4999994039535,0|0,3:0|0:0,0:0:0:0:
|
||||||
|
243,39,88874,2,0,L|231:103,1,37.4999994039535,0|0,0:0|0:0,0:0:0:0:
|
||||||
|
256,50,88985,2,0,L|251:87,1,37.4999994039535,4|0,0:0|0:0,0:0:0:0:
|
||||||
|
485,87,89207,6,0,L|493:51,3,37.4999994039535,8|0|0|0,3:0|0:0|0:0|0:0,0:0:0:0:
|
||||||
|
396,120,89429,2,0,L|411:197,1,74.999998807907,4|0,0:0|0:0,0:0:0:0:
|
||||||
|
471,317,89651,38,0,P|411:299|320:336,1,149.999997615814,0|4,3:0|0:0,0:0:0:0:
|
||||||
|
61,239,90096,2,0,P|121:221|212:258,1,149.999997615814,8|4,3:0|0:0,0:0:0:0:
|
||||||
|
367,21,90540,6,0,P|336:57|328:104,1,74.999998807907,0|0,3:0|0:0,0:0:0:0:
|
||||||
|
163,96,90762,2,0,P|194:132|202:179,1,74.999998807907,0|0,0:0|0:0,0:0:0:0:
|
||||||
|
190,346,90985,37,8,3:0:0:0:
|
||||||
|
328,272,91096,1,0,0:0:0:0:
|
||||||
|
154,272,91207,5,8,3:0:0:0:
|
||||||
|
365,338,91318,1,0,0:0:0:0:
|
||||||
|
257,382,91429,38,0,B|290:333|224:286|269:219,1,149.999997615814,4|4,3:0|0:0,0:0:0:0:
|
||||||
|
325,196,91762,1,0,0:0:0:0:
|
||||||
|
325,196,91874,2,0,P|365:210|436:184,1,112.49999821186,8|0,3:0|0:0,0:0:0:0:
|
||||||
|
430,190,92096,2,0,B|418:110,1,74.999998807907,4|0,0:0|0:0,0:0:0:0:
|
||||||
|
313,19,92318,2,0,L|190:36,1,112.49999821186,0|0,3:0|0:0,0:0:0:0:
|
||||||
|
201,34,92540,2,0,B|214:117,1,74.999998807907,4|0,0:0|0:0,0:0:0:0:
|
||||||
|
209,252,92762,5,8,3:0:0:0:
|
||||||
|
156,261,92874,1,0,0:0:0:0:
|
||||||
|
112,231,92985,1,4,0:0:0:0:
|
||||||
|
60,222,93096,1,0,0:0:0:0:
|
||||||
|
13,247,93207,38,0,P|4:288|19:328,1,74.999998807907,0|0,3:0|0:0,0:0:0:0:
|
||||||
|
173,186,93429,1,4,0:0:0:0:
|
||||||
|
215,120,93540,1,0,0:0:0:0:
|
||||||
|
162,49,93651,2,0,P|125:39|76:61,1,74.999998807907,8|0,3:0|0:0,0:0:0:0:
|
||||||
|
234,138,93874,2,0,P|273:157|313:148,1,74.999998807907,4|0,0:0|0:0,0:0:0:0:
|
||||||
|
385,39,94096,5,0,3:0:0:0:
|
||||||
|
337,286,94318,2,0,L|322:373,1,74.999998807907,4|0,0:0|0:0,0:0:0:0:
|
||||||
|
409,327,94540,2,0,P|418:277|280:230,1,224.999996423721,8|0,3:0|0:0,0:0:0:0:
|
||||||
|
239,319,94985,2,0,P|218:357|173:373,1,74.999998807907,0|0,3:0|0:0,0:0:0:0:
|
||||||
|
34,344,95207,37,4,0:0:0:0:
|
||||||
|
21,309,95318,5,0,0:0:0:0:
|
||||||
|
14,265,95429,5,8,3:0:0:0:
|
||||||
|
27,223,95540,5,0,0:0:0:0:
|
||||||
|
54,179,95651,5,4,0:0:0:0:
|
||||||
|
94,147,95762,5,0,0:0:0:0:
|
||||||
|
160,126,95873,5,0,3:0:0:0:
|
||||||
|
231,149,95984,5,0,0:0:0:0:
|
||||||
|
273,221,96096,5,4,0:0:0:0:
|
||||||
|
353,262,96207,5,0,0:0:0:0:
|
||||||
|
446,234,96318,5,8,3:0:0:0:
|
||||||
|
501,145,96429,5,0,0:0:0:0:
|
||||||
|
450,36,96540,5,4,0:0:0:0:
|
||||||
|
239,44,96762,5,0,3:0:0:0:
|
||||||
|
192,103,96873,1,0,0:0:0:0:
|
||||||
|
118,118,96984,1,4,0:0:0:0:
|
||||||
|
44,100,97096,1,0,0:0:0:0:
|
||||||
|
5,36,97207,1,8,3:0:0:0:
|
||||||
|
17,19,97429,37,4,0:0:0:0:
|
||||||
|
146,51,97540,1,0,0:0:0:0:
|
||||||
|
29,122,97651,2,0,L|39:193,1,56.2499991059302,0|0,3:0|0:0,0:0:0:0:
|
||||||
|
44,197,97874,6,0,P|100:231|176:201,1,112.500002503395,4|0,0:0|0:0,0:0:0:0:
|
||||||
|
301,160,98096,38,0,P|329:140|382:137,1,84.3750018775463,8|0,3:0|0:0,0:0:0:0:
|
||||||
|
398,147,98318,6,0,B|431:187|431:187|415:279,1,112.500002503395,4|0,0:0|0:0,0:0:0:0:
|
||||||
|
265,371,98540,38,0,L|180:361,1,74.999998807907,0|0,3:0|0:0,0:0:0:0:
|
||||||
|
127,202,98762,2,0,L|141:113,1,74.999998807907,4|0,0:0|0:0,0:0:0:0:
|
||||||
|
193,260,98985,2,0,P|144:291|68:278,1,112.49999821186,8|0,3:0|0:0,0:0:0:0:
|
||||||
|
91,290,99207,2,0,L|79:373,1,74.999998807907,4|0,0:0|0:0,0:0:0:0:
|
||||||
|
20,184,99429,6,0,B|4:141|4:141|27:66,1,112.49999821186,0|0,3:0|0:0,0:0:0:0:
|
||||||
|
23,78,99651,2,0,L|109:91,1,74.999998807907,4|0,0:0|0:0,0:0:0:0:
|
||||||
|
271,74,99874,2,0,P|254:31|222:12,1,74.999998807907,8|0,3:0|0:0,0:0:0:0:
|
||||||
|
186,180,100096,2,0,P|232:175|260:147,1,74.999998807907,4|0,0:0|0:0,0:0:0:0:
|
||||||
|
132,63,100318,37,0,3:0:0:0:
|
||||||
|
253,157,100540,1,4,0:0:0:0:
|
||||||
|
285,167,100651,1,0,0:0:0:0:
|
||||||
|
357,129,100762,5,8,3:0:0:0:
|
||||||
|
389,139,100873,1,0,0:0:0:0:
|
||||||
|
422,148,100985,2,0,P|407:200|416:233,1,74.999998807907,4|0,0:0|0:0,0:0:0:0:
|
||||||
|
459,377,101207,38,0,P|472:333|459:295,1,74.999998807907,0|0,3:0|0:0,0:0:0:0:
|
||||||
|
398,242,101429,2,0,L|314:257,1,74.999998807907,4|0,0:0|0:0,0:0:0:0:
|
||||||
|
165,354,101651,2,0,P|116:332|211:264,1,224.999996423721,8|0,3:0|0:0,0:0:0:0:
|
||||||
|
302,165,102096,6,0,L|292:89,1,74.999998807907,0|0,3:0|0:0,0:0:0:0:
|
||||||
|
392,91,102318,2,0,L|382:14,1,74.999998807907,4|0,0:0|0:0,0:0:0:0:
|
||||||
|
192,229,102540,38,0,L|212:136,1,74.999998807907,8|0,3:0|0:0,0:0:0:0:
|
||||||
|
107,172,102762,2,0,L|127:79,1,74.999998807907,4|0,0:0|0:0,0:0:0:0:
|
||||||
|
314,332,102985,6,0,L|305:278,1,37.4999994039535,0|0,3:0|0:0,0:0:0:0:
|
||||||
|
343,345,103096,2,0,L|334:291,1,37.4999994039535,0|0,0:0|0:0,0:0:0:0:
|
||||||
|
370,358,103207,2,0,L|361:304,1,37.4999994039535,4|0,0:0|0:0,0:0:0:0:
|
||||||
|
380,117,103429,38,0,L|374:75,3,37.4999994039535,8|0|0|0,3:0|0:0|0:0|0:0,0:0:0:0:
|
||||||
|
444,166,103651,2,0,P|417:188|346:191,1,74.999998807907,4|0,0:0|0:0,0:0:0:0:
|
||||||
|
392,2,103874,2,0,P|424:14|462:74,1,74.999998807907,4|0,3:0|0:0,0:0:0:0:
|
||||||
|
271,129,104096,2,0,P|265:94|298:31,1,74.999998807907,4|0,0:0|0:0,0:0:0:0:
|
||||||
|
505,113,104318,5,8,3:0:0:0:
|
||||||
|
269,217,104540,38,0,L|216:216,3,37.4999994039535,0|0|0|0,3:0|3:0|3:0|3:0,0:0:0:0:
|
||||||
|
360,220,104762,1,0,3:0:0:0:
|
||||||
|
296,384,104874,1,4,3:0:0:0:
|
||||||
|
102,307,105096,5,0,0:0:0:0:
|
||||||
|
102,307,105207,2,0,B|206:381|258:244|374:330,1,269.999987468719,12|0,3:0|0:0,0:0:0:0:
|
||||||
|
439,319,105651,6,0,P|379:336|396:236,1,168.750003755093,0|0,3:0|0:0,0:0:0:0:
|
||||||
|
373,258,106096,6,0,P|374:315|443:283,1,112.500002503395,8|0,3:0|0:0,0:0:0:0:
|
||||||
|
420,323,106651,37,0,0:0:0:0:
|
||||||
|
469,245,106763,1,4,0:0:0:0:
|
||||||
|
508,322,106874,1,0,0:0:0:0:
|
||||||
|
379,245,106985,1,8,3:0:0:0:
|
||||||
|
483,105,107207,6,0,L|474:40,3,56.2500012516975,4|0|0|0,3:0|0:0|0:0|0:0,0:0:0:0:
|
||||||
|
462,30,107429,38,0,P|401:56|319:25,1,149.999997615814,0|0,3:0|0:0,0:0:0:0:
|
||||||
|
272,120,107874,2,0,P|184:91|118:125,1,149.999997615814,8|4,3:0|0:0,0:0:0:0:
|
||||||
|
103,213,108207,2,0,B|128:232|128:232|269:200,1,149.999997615814,0|0,0:0|0:0,0:0:0:0:
|
||||||
|
393,187,108540,2,0,L|385:286,1,74.999998807907,4|0,0:0|0:0,0:0:0:0:
|
||||||
|
333,338,108763,1,8,3:0:0:0:
|
||||||
|
467,307,108874,6,0,L|509:297,2,37.4999994039535,0|0|4,0:0|0:0|0:0,0:0:0:0:
|
||||||
|
409,380,109096,1,0,0:0:0:0:
|
||||||
|
300,257,109207,38,0,P|279:218|281:171,1,74.999998807907,0|0,3:0|0:0,0:0:0:0:
|
||||||
|
401,118,109429,1,4,0:0:0:0:
|
||||||
|
401,118,109651,6,0,L|315:109,1,74.999998807907,8|4,3:0|0:0,0:0:0:0:
|
||||||
|
256,15,109985,37,0,0:0:0:0:
|
||||||
|
175,121,110096,2,0,P|162:60|109:16,1,112.49999821186,0|0,3:0|0:0,0:0:0:0:
|
||||||
|
128,26,110318,2,0,P|106:86|47:122,1,112.49999821186,0|0,0:0|0:0,0:0:0:0:
|
||||||
|
69,114,110540,2,0,P|135:105|185:131,1,112.49999821186,8|0,3:0|0:0,0:0:0:0:
|
||||||
|
160,223,110762,6,0,B|142:230|142:230|120:228|120:228|95:239|95:239|71:235|71:235|49:244|49:244|22:249,1,112.500002503395,4|0,0:0|0:0,0:0:0:0:
|
||||||
|
193,334,110985,38,0,P|216:310|242:301,1,56.2500012516975,0|0,3:0|0:0,0:0:0:0:
|
||||||
|
335,325,111207,2,0,P|366:353|378:379,1,56.2500012516975,0|0,0:0|0:0,0:0:0:0:
|
||||||
|
273,383,111429,2,0,L|304:213,1,168.750003755093,0|0,0:0|0:0,0:0:0:0:
|
||||||
|
383,255,111874,22,0,B|422:273|422:273|476:273,1,74.999998807907,8|0,3:0|3:0,0:0:0:0:
|
||||||
|
209,219,112096,2,0,B|169:221|169:221|131:206,1,74.999998807907,0|0,0:0|0:0,0:0:0:0:
|
||||||
|
403,147,112318,2,0,B|352:114|352:114|337:43|337:43|295:109|295:109|234:115,1,269.999987468719,8|0,3:0|0:0,0:0:0:0:
|
||||||
File diff suppressed because one or more lines are too long
1213
osu.Game.Rulesets.Osu.Tests/Resources/Testing/Beatmaps/2593923.osu
Normal file
1213
osu.Game.Rulesets.Osu.Tests/Resources/Testing/Beatmaps/2593923.osu
Normal file
File diff suppressed because it is too large
Load Diff
File diff suppressed because one or more lines are too long
1768
osu.Game.Rulesets.Osu.Tests/Resources/Testing/Beatmaps/801165.osu
Normal file
1768
osu.Game.Rulesets.Osu.Tests/Resources/Testing/Beatmaps/801165.osu
Normal file
File diff suppressed because it is too large
Load Diff
@@ -4,7 +4,6 @@
|
|||||||
using System;
|
using System;
|
||||||
using System.IO;
|
using System.IO;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Text;
|
|
||||||
using NUnit.Framework;
|
using NUnit.Framework;
|
||||||
using osu.Game.Beatmaps;
|
using osu.Game.Beatmaps;
|
||||||
using osu.Game.IO;
|
using osu.Game.IO;
|
||||||
@@ -19,23 +18,9 @@ namespace osu.Game.Rulesets.Osu.Tests
|
|||||||
public class StackingTest
|
public class StackingTest
|
||||||
{
|
{
|
||||||
[Test]
|
[Test]
|
||||||
public void TestStacking()
|
public void TestStackingEdgeCaseOne()
|
||||||
{
|
{
|
||||||
using (var stream = new MemoryStream(Encoding.UTF8.GetBytes(beatmap_data)))
|
using (var stream = new MemoryStream(@"
|
||||||
using (var reader = new LineBufferedReader(stream))
|
|
||||||
{
|
|
||||||
var beatmap = Decoder.GetDecoder<Beatmap>(reader).Decode(reader);
|
|
||||||
var converted = new TestWorkingBeatmap(beatmap).GetPlayableBeatmap(new OsuRuleset().RulesetInfo, Array.Empty<Mod>());
|
|
||||||
|
|
||||||
var objects = converted.HitObjects.ToList();
|
|
||||||
|
|
||||||
// The last hitobject triggers the stacking
|
|
||||||
for (int i = 0; i < objects.Count - 1; i++)
|
|
||||||
Assert.AreEqual(0, ((OsuHitObject)objects[i]).StackHeight);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private const string beatmap_data = @"
|
|
||||||
osu file format v14
|
osu file format v14
|
||||||
|
|
||||||
[General]
|
[General]
|
||||||
@@ -62,6 +47,65 @@ SliderTickRate:0.5
|
|||||||
311,185,218471,2,0,L|325:209,1,25
|
311,185,218471,2,0,L|325:209,1,25
|
||||||
311,185,218671,2,0,L|304:212,1,25
|
311,185,218671,2,0,L|304:212,1,25
|
||||||
311,185,240271,5,0,0:0:0:0:
|
311,185,240271,5,0,0:0:0:0:
|
||||||
";
|
"u8.ToArray()))
|
||||||
|
using (var reader = new LineBufferedReader(stream))
|
||||||
|
{
|
||||||
|
var beatmap = Decoder.GetDecoder<Beatmap>(reader).Decode(reader);
|
||||||
|
var converted = new TestWorkingBeatmap(beatmap).GetPlayableBeatmap(new OsuRuleset().RulesetInfo, Array.Empty<Mod>());
|
||||||
|
|
||||||
|
var objects = converted.HitObjects.ToList();
|
||||||
|
|
||||||
|
// The last hitobject triggers the stacking
|
||||||
|
for (int i = 0; i < objects.Count - 1; i++)
|
||||||
|
Assert.AreEqual(0, ((OsuHitObject)objects[i]).StackHeight);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void TestStackingEdgeCaseTwo()
|
||||||
|
{
|
||||||
|
using (var stream = new MemoryStream(@"
|
||||||
|
osu file format v14
|
||||||
|
// extracted from https://osu.ppy.sh/beatmapsets/365006#osu/801165
|
||||||
|
|
||||||
|
[General]
|
||||||
|
StackLeniency: 0.2
|
||||||
|
|
||||||
|
[Difficulty]
|
||||||
|
HPDrainRate:6
|
||||||
|
CircleSize:4
|
||||||
|
OverallDifficulty:8
|
||||||
|
ApproachRate:9.3
|
||||||
|
SliderMultiplier:2
|
||||||
|
SliderTickRate:1
|
||||||
|
|
||||||
|
[TimingPoints]
|
||||||
|
5338,444.444444444444,4,2,0,50,1,0
|
||||||
|
82893,-76.9230769230769,4,2,8,50,0,0
|
||||||
|
85115,-76.9230769230769,4,2,0,50,0,0
|
||||||
|
85337,-100,4,2,8,60,0,0
|
||||||
|
85893,-100,4,2,7,60,0,0
|
||||||
|
86226,-100,4,2,8,60,0,0
|
||||||
|
88893,-58.8235294117647,4,1,8,70,0,1
|
||||||
|
|
||||||
|
[HitObjects]
|
||||||
|
427,124,84226,1,0,3:0:0:0:
|
||||||
|
427,124,84337,1,0,3:0:0:0:
|
||||||
|
427,124,84449,1,8,0:0:0:0:
|
||||||
|
"u8.ToArray()))
|
||||||
|
using (var reader = new LineBufferedReader(stream))
|
||||||
|
{
|
||||||
|
var beatmap = Decoder.GetDecoder<Beatmap>(reader).Decode(reader);
|
||||||
|
var converted = new TestWorkingBeatmap(beatmap).GetPlayableBeatmap(new OsuRuleset().RulesetInfo, Array.Empty<Mod>());
|
||||||
|
|
||||||
|
var objects = converted.HitObjects.ToList();
|
||||||
|
|
||||||
|
Assert.That(objects, Has.Count.EqualTo(3));
|
||||||
|
|
||||||
|
// The last hitobject triggers the stacking
|
||||||
|
for (int i = 0; i < objects.Count - 1; i++)
|
||||||
|
Assert.AreEqual(0, ((OsuHitObject)objects[i]).StackHeight);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
63
osu.Game.Rulesets.Osu.Tests/TestSceneAutoGeneration.cs
Normal file
63
osu.Game.Rulesets.Osu.Tests/TestSceneAutoGeneration.cs
Normal file
@@ -0,0 +1,63 @@
|
|||||||
|
// Copyright (c) ppy Pty Ltd <contact@ppy.sh>. Licensed under the MIT Licence.
|
||||||
|
// See the LICENCE file in the repository root for full licence text.
|
||||||
|
|
||||||
|
using System.Linq;
|
||||||
|
using NUnit.Framework;
|
||||||
|
using osu.Framework.Testing;
|
||||||
|
using osu.Game.Rulesets.Osu.Beatmaps;
|
||||||
|
using osu.Game.Rulesets.Osu.Objects;
|
||||||
|
using osu.Game.Rulesets.Osu.Replays;
|
||||||
|
using osu.Game.Rulesets.Replays;
|
||||||
|
using osu.Game.Tests.Visual;
|
||||||
|
|
||||||
|
namespace osu.Game.Rulesets.Osu.Tests
|
||||||
|
{
|
||||||
|
[TestFixture]
|
||||||
|
[HeadlessTest]
|
||||||
|
public partial class TestSceneAutoGeneration : OsuTestScene
|
||||||
|
{
|
||||||
|
[TestCase(-1, true)]
|
||||||
|
[TestCase(0, false)]
|
||||||
|
[TestCase(1, false)]
|
||||||
|
public void TestAlternating(double offset, bool shouldAlternate)
|
||||||
|
{
|
||||||
|
const double first_object_time = 1000;
|
||||||
|
double secondObjectTime = first_object_time + AutoGenerator.KEY_UP_DELAY + OsuAutoGenerator.MIN_FRAME_SEPARATION_FOR_ALTERNATING + offset;
|
||||||
|
|
||||||
|
var beatmap = new OsuBeatmap();
|
||||||
|
beatmap.HitObjects.Add(new HitCircle { StartTime = first_object_time });
|
||||||
|
beatmap.HitObjects.Add(new HitCircle { StartTime = secondObjectTime });
|
||||||
|
|
||||||
|
var generated = new OsuAutoGenerator(beatmap, []).Generate();
|
||||||
|
var frames = generated.Frames.OfType<OsuReplayFrame>().ToList();
|
||||||
|
|
||||||
|
Assert.That(frames.Exists(f => f.Time == first_object_time && f.Actions.SingleOrDefault() == OsuAction.LeftButton));
|
||||||
|
Assert.That(frames.Exists(f => f.Time == first_object_time + AutoGenerator.KEY_UP_DELAY && !f.Actions.Any()));
|
||||||
|
|
||||||
|
Assert.That(frames.Exists(f => f.Time == secondObjectTime && f.Actions.SingleOrDefault() == (shouldAlternate ? OsuAction.RightButton : OsuAction.LeftButton)));
|
||||||
|
Assert.That(frames.Exists(f => f.Time == secondObjectTime + AutoGenerator.KEY_UP_DELAY && !f.Actions.Any()));
|
||||||
|
}
|
||||||
|
|
||||||
|
[TestCase(300)]
|
||||||
|
[TestCase(600)]
|
||||||
|
[TestCase(1200)]
|
||||||
|
public void TestAlternatingSpecificBPM(double bpm)
|
||||||
|
{
|
||||||
|
const double first_object_time = 1000;
|
||||||
|
double secondObjectTime = first_object_time + 60000 / bpm;
|
||||||
|
|
||||||
|
var beatmap = new OsuBeatmap();
|
||||||
|
beatmap.HitObjects.Add(new HitCircle { StartTime = first_object_time });
|
||||||
|
beatmap.HitObjects.Add(new HitCircle { StartTime = secondObjectTime });
|
||||||
|
|
||||||
|
var generated = new OsuAutoGenerator(beatmap, []).Generate();
|
||||||
|
var frames = generated.Frames.OfType<OsuReplayFrame>().ToList();
|
||||||
|
|
||||||
|
Assert.That(frames.Exists(f => f.Time == first_object_time && f.Actions.SingleOrDefault() == OsuAction.LeftButton));
|
||||||
|
Assert.That(frames.Exists(f => f.Time == first_object_time + AutoGenerator.KEY_UP_DELAY && !f.Actions.Any()));
|
||||||
|
|
||||||
|
Assert.That(frames.Exists(f => f.Time == secondObjectTime && f.Actions.SingleOrDefault() == OsuAction.RightButton));
|
||||||
|
Assert.That(frames.Exists(f => f.Time == secondObjectTime + AutoGenerator.KEY_UP_DELAY && !f.Actions.Any()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,52 @@
|
|||||||
|
// Copyright (c) ppy Pty Ltd <contact@ppy.sh>. Licensed under the MIT Licence.
|
||||||
|
// See the LICENCE file in the repository root for full licence text.
|
||||||
|
|
||||||
|
using NUnit.Framework;
|
||||||
|
using osu.Framework.Allocation;
|
||||||
|
using osu.Framework.Testing;
|
||||||
|
using osu.Game.Configuration;
|
||||||
|
using osu.Game.Skinning;
|
||||||
|
using osu.Game.Tests.Visual;
|
||||||
|
using osuTK.Input;
|
||||||
|
|
||||||
|
namespace osu.Game.Rulesets.Osu.Tests
|
||||||
|
{
|
||||||
|
public partial class TestSceneGameplayCursorSizeChange : PlayerTestScene
|
||||||
|
{
|
||||||
|
private const float initial_cursor_size = 1f;
|
||||||
|
protected override Ruleset CreatePlayerRuleset() => new OsuRuleset();
|
||||||
|
|
||||||
|
[Resolved]
|
||||||
|
private SkinManager? skins { get; set; }
|
||||||
|
|
||||||
|
[BackgroundDependencyLoader]
|
||||||
|
private void load()
|
||||||
|
{
|
||||||
|
if (skins != null) skins.CurrentSkinInfo.Value = skins.DefaultClassicSkin.SkinInfo;
|
||||||
|
}
|
||||||
|
|
||||||
|
[SetUpSteps]
|
||||||
|
public override void SetUpSteps()
|
||||||
|
{
|
||||||
|
base.SetUpSteps();
|
||||||
|
|
||||||
|
AddStep("Set gameplay cursor size: 1", () => LocalConfig.SetValue(OsuSetting.GameplayCursorSize, initial_cursor_size));
|
||||||
|
AddStep("resume player", () => Player.GameplayClockContainer.Start());
|
||||||
|
AddUntilStep("clock running", () => Player.GameplayClockContainer.IsRunning);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void TestPausedChangeCursorSize()
|
||||||
|
{
|
||||||
|
AddStep("move cursor to center", () => InputManager.MoveMouseTo(Player.ScreenSpaceDrawQuad.Centre));
|
||||||
|
AddStep("move cursor to top left", () => InputManager.MoveMouseTo(Player.ScreenSpaceDrawQuad.TopLeft));
|
||||||
|
AddStep("move cursor to center", () => InputManager.MoveMouseTo(Player.ScreenSpaceDrawQuad.Centre));
|
||||||
|
AddStep("move cursor to top right", () => InputManager.MoveMouseTo(Player.ScreenSpaceDrawQuad.TopRight));
|
||||||
|
AddStep("press escape", () => InputManager.Key(Key.Escape));
|
||||||
|
|
||||||
|
AddSliderStep("cursor size", 0.1f, 2f, 1f, v => LocalConfig.SetValue(OsuSetting.GameplayCursorSize, v));
|
||||||
|
}
|
||||||
|
|
||||||
|
protected override TestPlayer CreatePlayer(Ruleset ruleset) => new TestPlayer(true, false);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -33,7 +33,7 @@ namespace osu.Game.Rulesets.Osu.Tests
|
|||||||
Debug.Assert(drawableHitObject.HitObject.HitWindows != null);
|
Debug.Assert(drawableHitObject.HitObject.HitWindows != null);
|
||||||
|
|
||||||
double delay = drawableHitObject.HitObject.StartTime - (drawableHitObject.HitObject.HitWindows.WindowFor(HitResult.Miss) + RNG.Next(0, 300)) - Time.Current;
|
double delay = drawableHitObject.HitObject.StartTime - (drawableHitObject.HitObject.HitWindows.WindowFor(HitResult.Miss) + RNG.Next(0, 300)) - Time.Current;
|
||||||
scheduledTasks.Add(Scheduler.AddDelayed(() => drawableHitObject.TriggerJudgement(), delay));
|
scheduledTasks.Add(Scheduler.AddDelayed(drawableHitObject.TriggerJudgement, delay));
|
||||||
|
|
||||||
return drawableHitObject;
|
return drawableHitObject;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,6 +3,7 @@
|
|||||||
|
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
using NUnit.Framework;
|
using NUnit.Framework;
|
||||||
using osu.Framework.Graphics;
|
using osu.Framework.Graphics;
|
||||||
using osu.Framework.Input.Events;
|
using osu.Framework.Input.Events;
|
||||||
@@ -10,6 +11,7 @@ using osu.Framework.Input.States;
|
|||||||
using osu.Framework.Logging;
|
using osu.Framework.Logging;
|
||||||
using osu.Framework.Testing.Input;
|
using osu.Framework.Testing.Input;
|
||||||
using osu.Game.Rulesets.Osu.UI;
|
using osu.Game.Rulesets.Osu.UI;
|
||||||
|
using osu.Game.Skinning;
|
||||||
using osuTK;
|
using osuTK;
|
||||||
|
|
||||||
namespace osu.Game.Rulesets.Osu.Tests
|
namespace osu.Game.Rulesets.Osu.Tests
|
||||||
@@ -58,7 +60,7 @@ namespace osu.Game.Rulesets.Osu.Tests
|
|||||||
|
|
||||||
foreach (var smokeContainer in smokeContainers)
|
foreach (var smokeContainer in smokeContainers)
|
||||||
{
|
{
|
||||||
if (smokeContainer.Children.Count != 0)
|
if (smokeContainer.Children.OfType<SkinnableDrawable>().Any())
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -91,7 +91,7 @@ namespace osu.Game.Rulesets.Osu.Beatmaps
|
|||||||
continue;
|
continue;
|
||||||
|
|
||||||
double endTime = stackBaseObject.GetEndTime();
|
double endTime = stackBaseObject.GetEndTime();
|
||||||
double stackThreshold = objectN.TimePreempt * beatmap.StackLeniency;
|
float stackThreshold = calculateStackThreshold(beatmap, objectN);
|
||||||
|
|
||||||
if (objectN.StartTime - endTime > stackThreshold)
|
if (objectN.StartTime - endTime > stackThreshold)
|
||||||
// We are no longer within stacking range of the next object.
|
// We are no longer within stacking range of the next object.
|
||||||
@@ -136,7 +136,7 @@ namespace osu.Game.Rulesets.Osu.Beatmaps
|
|||||||
OsuHitObject objectI = hitObjects[i];
|
OsuHitObject objectI = hitObjects[i];
|
||||||
if (objectI.StackHeight != 0 || objectI is Spinner) continue;
|
if (objectI.StackHeight != 0 || objectI is Spinner) continue;
|
||||||
|
|
||||||
double stackThreshold = objectI.TimePreempt * beatmap.StackLeniency;
|
float stackThreshold = calculateStackThreshold(beatmap, objectI);
|
||||||
|
|
||||||
/* If this object is a hitcircle, then we enter this "special" case.
|
/* If this object is a hitcircle, then we enter this "special" case.
|
||||||
* It either ends with a stack of hitcircles only, or a stack of hitcircles that are underneath a slider.
|
* It either ends with a stack of hitcircles only, or a stack of hitcircles that are underneath a slider.
|
||||||
@@ -151,7 +151,10 @@ namespace osu.Game.Rulesets.Osu.Beatmaps
|
|||||||
|
|
||||||
double endTime = objectN.GetEndTime();
|
double endTime = objectN.GetEndTime();
|
||||||
|
|
||||||
if (objectI.StartTime - endTime > stackThreshold)
|
// truncation to integer is required to match stable
|
||||||
|
// compare https://github.com/peppy/osu-stable-reference/blob/08e3dafd525934cf48880b08e91c24ce4ad8b761/osu!/GameplayElements/HitObjectManager.cs#L1725
|
||||||
|
// - both quantities being subtracted there are integers
|
||||||
|
if ((int)objectI.StartTime - (int)endTime > stackThreshold)
|
||||||
// We are no longer within stacking range of the previous object.
|
// We are no longer within stacking range of the previous object.
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@@ -232,7 +235,7 @@ namespace osu.Game.Rulesets.Osu.Beatmaps
|
|||||||
|
|
||||||
for (int j = i + 1; j < hitObjects.Count; j++)
|
for (int j = i + 1; j < hitObjects.Count; j++)
|
||||||
{
|
{
|
||||||
double stackThreshold = hitObjects[i].TimePreempt * beatmap.StackLeniency;
|
float stackThreshold = calculateStackThreshold(beatmap, hitObjects[i]);
|
||||||
|
|
||||||
if (hitObjects[j].StartTime - stackThreshold > startTime)
|
if (hitObjects[j].StartTime - stackThreshold > startTime)
|
||||||
break;
|
break;
|
||||||
@@ -264,5 +267,17 @@ namespace osu.Game.Rulesets.Osu.Beatmaps
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <remarks>
|
||||||
|
/// Truncation of <see cref="OsuHitObject.TimePreempt"/> to <see cref="int"/>, as well as keeping the result as <see cref="float"/>, are both done
|
||||||
|
/// <a href="https://github.com/peppy/osu-stable-reference/blob/08e3dafd525934cf48880b08e91c24ce4ad8b761/osu!/GameplayElements/HitObjectManager.cs#L1652">
|
||||||
|
/// for the purposes of stable compatibility
|
||||||
|
/// </a>.
|
||||||
|
/// Note that for top-level objects <see cref="OsuHitObject.TimePreempt"/> is supposed to be integral anyway;
|
||||||
|
/// see <see cref="OsuHitObject.ApplyDefaultsToSelf"/> using <see cref="IBeatmapDifficultyInfo.DifficultyRangeInt"/> when calculating it.
|
||||||
|
/// Slider ticks and end circles are the exception to that, but they do not matter for stacking.
|
||||||
|
/// </remarks>
|
||||||
|
private static float calculateStackThreshold(IBeatmap beatmap, OsuHitObject hitObject)
|
||||||
|
=> (int)hitObject.TimePreempt * beatmap.StackLeniency;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -25,7 +25,7 @@ namespace osu.Game.Rulesets.Osu.Edit.Blueprints
|
|||||||
{
|
{
|
||||||
this.gridToolboxGroup = gridToolboxGroup;
|
this.gridToolboxGroup = gridToolboxGroup;
|
||||||
originalOrigin = gridToolboxGroup.StartPosition.Value;
|
originalOrigin = gridToolboxGroup.StartPosition.Value;
|
||||||
originalSpacing = gridToolboxGroup.Spacing.Value;
|
originalSpacing = gridToolboxGroup.GridLineSpacing.Value;
|
||||||
originalRotation = gridToolboxGroup.GridLinesRotation.Value;
|
originalRotation = gridToolboxGroup.GridLinesRotation.Value;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -67,7 +67,7 @@ namespace osu.Game.Rulesets.Osu.Edit.Blueprints
|
|||||||
{
|
{
|
||||||
// Reset the grid to the default values.
|
// Reset the grid to the default values.
|
||||||
gridToolboxGroup.StartPosition.Value = gridToolboxGroup.StartPosition.Default;
|
gridToolboxGroup.StartPosition.Value = gridToolboxGroup.StartPosition.Default;
|
||||||
gridToolboxGroup.Spacing.Value = gridToolboxGroup.Spacing.Default;
|
gridToolboxGroup.GridLineSpacing.Value = gridToolboxGroup.GridLineSpacing.Default;
|
||||||
if (!gridToolboxGroup.GridLinesRotation.Disabled)
|
if (!gridToolboxGroup.GridLinesRotation.Disabled)
|
||||||
gridToolboxGroup.GridLinesRotation.Value = gridToolboxGroup.GridLinesRotation.Default;
|
gridToolboxGroup.GridLinesRotation.Value = gridToolboxGroup.GridLinesRotation.Default;
|
||||||
EndPlacement(true);
|
EndPlacement(true);
|
||||||
@@ -112,7 +112,7 @@ namespace osu.Game.Rulesets.Osu.Edit.Blueprints
|
|||||||
// Default to the original spacing and rotation if the distance is too small.
|
// Default to the original spacing and rotation if the distance is too small.
|
||||||
if (Vector2.Distance(gridToolboxGroup.StartPosition.Value, pos) < 2)
|
if (Vector2.Distance(gridToolboxGroup.StartPosition.Value, pos) < 2)
|
||||||
{
|
{
|
||||||
gridToolboxGroup.Spacing.Value = originalSpacing;
|
gridToolboxGroup.GridLineSpacing.Value = originalSpacing;
|
||||||
if (!gridToolboxGroup.GridLinesRotation.Disabled)
|
if (!gridToolboxGroup.GridLinesRotation.Disabled)
|
||||||
gridToolboxGroup.GridLinesRotation.Value = originalRotation;
|
gridToolboxGroup.GridLinesRotation.Value = originalRotation;
|
||||||
}
|
}
|
||||||
@@ -134,7 +134,7 @@ namespace osu.Game.Rulesets.Osu.Edit.Blueprints
|
|||||||
private void resetGridState()
|
private void resetGridState()
|
||||||
{
|
{
|
||||||
gridToolboxGroup.StartPosition.Value = originalOrigin;
|
gridToolboxGroup.StartPosition.Value = originalOrigin;
|
||||||
gridToolboxGroup.Spacing.Value = originalSpacing;
|
gridToolboxGroup.GridLineSpacing.Value = originalSpacing;
|
||||||
if (!gridToolboxGroup.GridLinesRotation.Disabled)
|
if (!gridToolboxGroup.GridLinesRotation.Disabled)
|
||||||
gridToolboxGroup.GridLinesRotation.Value = originalRotation;
|
gridToolboxGroup.GridLinesRotation.Value = originalRotation;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -58,7 +58,7 @@ namespace osu.Game.Rulesets.Osu.Edit.Blueprints.Sliders
|
|||||||
|
|
||||||
private readonly IncrementalBSplineBuilder bSplineBuilder = new IncrementalBSplineBuilder { Degree = 4 };
|
private readonly IncrementalBSplineBuilder bSplineBuilder = new IncrementalBSplineBuilder { Degree = 4 };
|
||||||
|
|
||||||
protected override bool IsValidForPlacement => HitObject.Path.HasValidLengthForPlacement;
|
protected override bool IsValidForPlacement => base.IsValidForPlacement && (PlacementActive == PlacementState.Waiting || HitObject.Path.HasValidLengthForPlacement);
|
||||||
|
|
||||||
public SliderPlacementBlueprint()
|
public SliderPlacementBlueprint()
|
||||||
: base(new Slider())
|
: base(new Slider())
|
||||||
|
|||||||
@@ -5,8 +5,10 @@ using System;
|
|||||||
using osu.Framework.Allocation;
|
using osu.Framework.Allocation;
|
||||||
using osu.Framework.Bindables;
|
using osu.Framework.Bindables;
|
||||||
using osu.Framework.Graphics;
|
using osu.Framework.Graphics;
|
||||||
|
using osu.Game.Graphics.Containers;
|
||||||
using osu.Game.Graphics.UserInterface;
|
using osu.Game.Graphics.UserInterface;
|
||||||
using osu.Game.Rulesets.Edit;
|
using osu.Game.Rulesets.Edit;
|
||||||
|
using osuTK;
|
||||||
|
|
||||||
namespace osu.Game.Rulesets.Osu.Edit
|
namespace osu.Game.Rulesets.Osu.Edit
|
||||||
{
|
{
|
||||||
@@ -42,25 +44,31 @@ namespace osu.Game.Rulesets.Osu.Edit
|
|||||||
private readonly BindableInt displayTolerance = new BindableInt(90)
|
private readonly BindableInt displayTolerance = new BindableInt(90)
|
||||||
{
|
{
|
||||||
MinValue = 5,
|
MinValue = 5,
|
||||||
MaxValue = 100
|
MaxValue = 100,
|
||||||
|
Precision = 1,
|
||||||
};
|
};
|
||||||
|
|
||||||
private readonly BindableInt displayCornerThreshold = new BindableInt(40)
|
private readonly BindableInt displayCornerThreshold = new BindableInt(40)
|
||||||
{
|
{
|
||||||
MinValue = 5,
|
MinValue = 5,
|
||||||
MaxValue = 100
|
MaxValue = 100,
|
||||||
|
Precision = 1,
|
||||||
};
|
};
|
||||||
|
|
||||||
private readonly BindableInt displayCircleThreshold = new BindableInt(30)
|
private readonly BindableInt displayCircleThreshold = new BindableInt(30)
|
||||||
{
|
{
|
||||||
MinValue = 0,
|
MinValue = 0,
|
||||||
MaxValue = 100
|
MaxValue = 100,
|
||||||
|
Precision = 1,
|
||||||
};
|
};
|
||||||
|
|
||||||
private ExpandableSlider<int> toleranceSlider = null!;
|
private ExpandableSlider<int> toleranceSlider = null!;
|
||||||
private ExpandableSlider<int> cornerThresholdSlider = null!;
|
private ExpandableSlider<int> cornerThresholdSlider = null!;
|
||||||
private ExpandableSlider<int> circleThresholdSlider = null!;
|
private ExpandableSlider<int> circleThresholdSlider = null!;
|
||||||
|
|
||||||
|
[Resolved]
|
||||||
|
private IExpandingContainer? expandingContainer { get; set; }
|
||||||
|
|
||||||
[BackgroundDependencyLoader]
|
[BackgroundDependencyLoader]
|
||||||
private void load()
|
private void load()
|
||||||
{
|
{
|
||||||
@@ -68,15 +76,18 @@ namespace osu.Game.Rulesets.Osu.Edit
|
|||||||
{
|
{
|
||||||
toleranceSlider = new ExpandableSlider<int>
|
toleranceSlider = new ExpandableSlider<int>
|
||||||
{
|
{
|
||||||
Current = displayTolerance
|
Current = displayTolerance,
|
||||||
|
ExpandedLabelText = "Control point spacing",
|
||||||
},
|
},
|
||||||
cornerThresholdSlider = new ExpandableSlider<int>
|
cornerThresholdSlider = new ExpandableSlider<int>
|
||||||
{
|
{
|
||||||
Current = displayCornerThreshold
|
Current = displayCornerThreshold,
|
||||||
|
ExpandedLabelText = "Corner bias",
|
||||||
},
|
},
|
||||||
circleThresholdSlider = new ExpandableSlider<int>
|
circleThresholdSlider = new ExpandableSlider<int>
|
||||||
{
|
{
|
||||||
Current = displayCircleThreshold
|
Current = displayCircleThreshold,
|
||||||
|
ExpandedLabelText = "Perfect curve bias"
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
@@ -88,24 +99,18 @@ namespace osu.Game.Rulesets.Osu.Edit
|
|||||||
displayTolerance.BindValueChanged(tolerance =>
|
displayTolerance.BindValueChanged(tolerance =>
|
||||||
{
|
{
|
||||||
toleranceSlider.ContractedLabelText = $"C. P. S.: {tolerance.NewValue:N0}";
|
toleranceSlider.ContractedLabelText = $"C. P. S.: {tolerance.NewValue:N0}";
|
||||||
toleranceSlider.ExpandedLabelText = $"Control Point Spacing: {tolerance.NewValue:N0}";
|
|
||||||
|
|
||||||
Tolerance.Value = displayToInternalTolerance(tolerance.NewValue);
|
Tolerance.Value = displayToInternalTolerance(tolerance.NewValue);
|
||||||
}, true);
|
}, true);
|
||||||
|
|
||||||
displayCornerThreshold.BindValueChanged(threshold =>
|
displayCornerThreshold.BindValueChanged(threshold =>
|
||||||
{
|
{
|
||||||
cornerThresholdSlider.ContractedLabelText = $"C. T.: {threshold.NewValue:N0}";
|
cornerThresholdSlider.ContractedLabelText = $"C. B.: {threshold.NewValue:N0}";
|
||||||
cornerThresholdSlider.ExpandedLabelText = $"Corner Threshold: {threshold.NewValue:N0}";
|
|
||||||
|
|
||||||
CornerThreshold.Value = displayToInternalCornerThreshold(threshold.NewValue);
|
CornerThreshold.Value = displayToInternalCornerThreshold(threshold.NewValue);
|
||||||
}, true);
|
}, true);
|
||||||
|
|
||||||
displayCircleThreshold.BindValueChanged(threshold =>
|
displayCircleThreshold.BindValueChanged(threshold =>
|
||||||
{
|
{
|
||||||
circleThresholdSlider.ContractedLabelText = $"P. C. T.: {threshold.NewValue:N0}";
|
circleThresholdSlider.ContractedLabelText = $"P. C. B.: {threshold.NewValue:N0}";
|
||||||
circleThresholdSlider.ExpandedLabelText = $"Perfect Curve Threshold: {threshold.NewValue:N0}";
|
|
||||||
|
|
||||||
CircleThreshold.Value = displayToInternalCircleThreshold(threshold.NewValue);
|
CircleThreshold.Value = displayToInternalCircleThreshold(threshold.NewValue);
|
||||||
}, true);
|
}, true);
|
||||||
|
|
||||||
@@ -119,6 +124,11 @@ namespace osu.Game.Rulesets.Osu.Edit
|
|||||||
displayCircleThreshold.Value = internalToDisplayCircleThreshold(threshold.NewValue)
|
displayCircleThreshold.Value = internalToDisplayCircleThreshold(threshold.NewValue)
|
||||||
);
|
);
|
||||||
|
|
||||||
|
expandingContainer?.Expanded.BindValueChanged(v =>
|
||||||
|
{
|
||||||
|
Spacing = v.NewValue ? new Vector2(5) : new Vector2(15);
|
||||||
|
}, true);
|
||||||
|
|
||||||
float displayToInternalTolerance(float v) => v / 50f;
|
float displayToInternalTolerance(float v) => v / 50f;
|
||||||
int internalToDisplayTolerance(float v) => (int)Math.Round(v * 50f);
|
int internalToDisplayTolerance(float v) => (int)Math.Round(v * 50f);
|
||||||
|
|
||||||
|
|||||||
@@ -38,7 +38,7 @@ namespace osu.Game.Rulesets.Osu.Edit
|
|||||||
{
|
{
|
||||||
MinValue = 0f,
|
MinValue = 0f,
|
||||||
MaxValue = OsuPlayfield.BASE_SIZE.X,
|
MaxValue = OsuPlayfield.BASE_SIZE.X,
|
||||||
Precision = 0.01f,
|
Precision = 0.1f,
|
||||||
};
|
};
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@@ -48,17 +48,17 @@ namespace osu.Game.Rulesets.Osu.Edit
|
|||||||
{
|
{
|
||||||
MinValue = 0f,
|
MinValue = 0f,
|
||||||
MaxValue = OsuPlayfield.BASE_SIZE.Y,
|
MaxValue = OsuPlayfield.BASE_SIZE.Y,
|
||||||
Precision = 0.01f,
|
Precision = 0.1f,
|
||||||
};
|
};
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// The spacing between grid lines.
|
/// The spacing between grid lines.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public BindableFloat Spacing { get; } = new BindableFloat(4f)
|
public BindableFloat GridLineSpacing { get; } = new BindableFloat(4f)
|
||||||
{
|
{
|
||||||
MinValue = 4f,
|
MinValue = 4f,
|
||||||
MaxValue = 256f,
|
MaxValue = 256f,
|
||||||
Precision = 0.01f,
|
Precision = 0.1f,
|
||||||
};
|
};
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@@ -68,7 +68,7 @@ namespace osu.Game.Rulesets.Osu.Edit
|
|||||||
{
|
{
|
||||||
MinValue = -180f,
|
MinValue = -180f,
|
||||||
MaxValue = 180f,
|
MaxValue = 180f,
|
||||||
Precision = 0.01f,
|
Precision = 0.1f,
|
||||||
};
|
};
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@@ -115,7 +115,7 @@ namespace osu.Game.Rulesets.Osu.Edit
|
|||||||
float dist = Vector2.Distance(point1, point2);
|
float dist = Vector2.Distance(point1, point2);
|
||||||
while (dist >= max_automatic_spacing)
|
while (dist >= max_automatic_spacing)
|
||||||
dist /= 2;
|
dist /= 2;
|
||||||
Spacing.Value = dist;
|
GridLineSpacing.Value = dist;
|
||||||
}
|
}
|
||||||
|
|
||||||
[BackgroundDependencyLoader]
|
[BackgroundDependencyLoader]
|
||||||
@@ -127,21 +127,25 @@ namespace osu.Game.Rulesets.Osu.Edit
|
|||||||
{
|
{
|
||||||
Current = StartPositionX,
|
Current = StartPositionX,
|
||||||
KeyboardStep = 1,
|
KeyboardStep = 1,
|
||||||
|
ExpandedLabelText = "X offset",
|
||||||
},
|
},
|
||||||
startPositionYSlider = new ExpandableSlider<float>
|
startPositionYSlider = new ExpandableSlider<float>
|
||||||
{
|
{
|
||||||
Current = StartPositionY,
|
Current = StartPositionY,
|
||||||
KeyboardStep = 1,
|
KeyboardStep = 1,
|
||||||
|
ExpandedLabelText = "Y offset",
|
||||||
},
|
},
|
||||||
spacingSlider = new ExpandableSlider<float>
|
spacingSlider = new ExpandableSlider<float>
|
||||||
{
|
{
|
||||||
Current = Spacing,
|
Current = GridLineSpacing,
|
||||||
KeyboardStep = 1,
|
KeyboardStep = 1,
|
||||||
|
ExpandedLabelText = "Spacing",
|
||||||
},
|
},
|
||||||
gridLinesRotationSlider = new ExpandableSlider<float>
|
gridLinesRotationSlider = new ExpandableSlider<float>
|
||||||
{
|
{
|
||||||
Current = GridLinesRotation,
|
Current = GridLinesRotation,
|
||||||
KeyboardStep = 1,
|
KeyboardStep = 1,
|
||||||
|
ExpandedLabelText = "Rotation",
|
||||||
},
|
},
|
||||||
new FillFlowContainer
|
new FillFlowContainer
|
||||||
{
|
{
|
||||||
@@ -170,7 +174,7 @@ namespace osu.Game.Rulesets.Osu.Edit
|
|||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
Spacing.Value = editorBeatmap.GridSize;
|
GridLineSpacing.Value = editorBeatmap.GridSize;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected override void LoadComplete()
|
protected override void LoadComplete()
|
||||||
@@ -182,14 +186,12 @@ namespace osu.Game.Rulesets.Osu.Edit
|
|||||||
StartPositionX.BindValueChanged(x =>
|
StartPositionX.BindValueChanged(x =>
|
||||||
{
|
{
|
||||||
startPositionXSlider.ContractedLabelText = $"X: {x.NewValue:#,0.##}";
|
startPositionXSlider.ContractedLabelText = $"X: {x.NewValue:#,0.##}";
|
||||||
startPositionXSlider.ExpandedLabelText = $"X Offset: {x.NewValue:#,0.##}";
|
|
||||||
StartPosition.Value = new Vector2(x.NewValue, StartPosition.Value.Y);
|
StartPosition.Value = new Vector2(x.NewValue, StartPosition.Value.Y);
|
||||||
}, true);
|
}, true);
|
||||||
|
|
||||||
StartPositionY.BindValueChanged(y =>
|
StartPositionY.BindValueChanged(y =>
|
||||||
{
|
{
|
||||||
startPositionYSlider.ContractedLabelText = $"Y: {y.NewValue:#,0.##}";
|
startPositionYSlider.ContractedLabelText = $"Y: {y.NewValue:#,0.##}";
|
||||||
startPositionYSlider.ExpandedLabelText = $"Y Offset: {y.NewValue:#,0.##}";
|
|
||||||
StartPosition.Value = new Vector2(StartPosition.Value.X, y.NewValue);
|
StartPosition.Value = new Vector2(StartPosition.Value.X, y.NewValue);
|
||||||
}, true);
|
}, true);
|
||||||
|
|
||||||
@@ -199,10 +201,9 @@ namespace osu.Game.Rulesets.Osu.Edit
|
|||||||
StartPositionY.Value = pos.NewValue.Y;
|
StartPositionY.Value = pos.NewValue.Y;
|
||||||
});
|
});
|
||||||
|
|
||||||
Spacing.BindValueChanged(spacing =>
|
GridLineSpacing.BindValueChanged(spacing =>
|
||||||
{
|
{
|
||||||
spacingSlider.ContractedLabelText = $"S: {spacing.NewValue:#,0.##}";
|
spacingSlider.ContractedLabelText = $"S: {spacing.NewValue:#,0.##}";
|
||||||
spacingSlider.ExpandedLabelText = $"Spacing: {spacing.NewValue:#,0.##}";
|
|
||||||
SpacingVector.Value = new Vector2(spacing.NewValue);
|
SpacingVector.Value = new Vector2(spacing.NewValue);
|
||||||
editorBeatmap.GridSize = (int)spacing.NewValue;
|
editorBeatmap.GridSize = (int)spacing.NewValue;
|
||||||
}, true);
|
}, true);
|
||||||
@@ -210,7 +211,6 @@ namespace osu.Game.Rulesets.Osu.Edit
|
|||||||
GridLinesRotation.BindValueChanged(rotation =>
|
GridLinesRotation.BindValueChanged(rotation =>
|
||||||
{
|
{
|
||||||
gridLinesRotationSlider.ContractedLabelText = $"R: {rotation.NewValue:#,0.##}";
|
gridLinesRotationSlider.ContractedLabelText = $"R: {rotation.NewValue:#,0.##}";
|
||||||
gridLinesRotationSlider.ExpandedLabelText = $"Rotation: {rotation.NewValue:#,0.##}";
|
|
||||||
}, true);
|
}, true);
|
||||||
|
|
||||||
GridType.BindValueChanged(v =>
|
GridType.BindValueChanged(v =>
|
||||||
@@ -239,6 +239,8 @@ namespace osu.Game.Rulesets.Osu.Edit
|
|||||||
{
|
{
|
||||||
gridTypeButtons.FadeTo(v.NewValue ? 1f : 0f, 500, Easing.OutQuint);
|
gridTypeButtons.FadeTo(v.NewValue ? 1f : 0f, 500, Easing.OutQuint);
|
||||||
gridTypeButtons.BypassAutoSizeAxes = !v.NewValue ? Axes.Y : Axes.None;
|
gridTypeButtons.BypassAutoSizeAxes = !v.NewValue ? Axes.Y : Axes.None;
|
||||||
|
|
||||||
|
Spacing = v.NewValue ? new Vector2(5) : new Vector2(15);
|
||||||
}, true);
|
}, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -252,7 +254,7 @@ namespace osu.Game.Rulesets.Osu.Edit
|
|||||||
switch (e.Action)
|
switch (e.Action)
|
||||||
{
|
{
|
||||||
case GlobalAction.EditorCycleGridSpacing:
|
case GlobalAction.EditorCycleGridSpacing:
|
||||||
Spacing.Value = Spacing.Value * 2 >= max_automatic_spacing ? Spacing.Value / 8 : Spacing.Value * 2;
|
GridLineSpacing.Value = GridLineSpacing.Value * 2 >= max_automatic_spacing ? GridLineSpacing.Value / 8 : GridLineSpacing.Value * 2;
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
case GlobalAction.EditorCycleGridType:
|
case GlobalAction.EditorCycleGridType:
|
||||||
|
|||||||
@@ -5,6 +5,7 @@
|
|||||||
|
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
|
using System.Globalization;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Text.RegularExpressions;
|
using System.Text.RegularExpressions;
|
||||||
using JetBrains.Annotations;
|
using JetBrains.Annotations;
|
||||||
@@ -142,7 +143,7 @@ namespace osu.Game.Rulesets.Osu.Edit
|
|||||||
case PositionSnapGridType.Triangle:
|
case PositionSnapGridType.Triangle:
|
||||||
var triangularPositionSnapGrid = new TriangularPositionSnapGrid();
|
var triangularPositionSnapGrid = new TriangularPositionSnapGrid();
|
||||||
|
|
||||||
triangularPositionSnapGrid.Spacing.BindTo(OsuGridToolboxGroup.Spacing);
|
triangularPositionSnapGrid.Spacing.BindTo(OsuGridToolboxGroup.GridLineSpacing);
|
||||||
triangularPositionSnapGrid.GridLineRotation.BindTo(OsuGridToolboxGroup.GridLinesRotation);
|
triangularPositionSnapGrid.GridLineRotation.BindTo(OsuGridToolboxGroup.GridLinesRotation);
|
||||||
|
|
||||||
positionSnapGrid = triangularPositionSnapGrid;
|
positionSnapGrid = triangularPositionSnapGrid;
|
||||||
@@ -151,7 +152,7 @@ namespace osu.Game.Rulesets.Osu.Edit
|
|||||||
case PositionSnapGridType.Circle:
|
case PositionSnapGridType.Circle:
|
||||||
var circularPositionSnapGrid = new CircularPositionSnapGrid();
|
var circularPositionSnapGrid = new CircularPositionSnapGrid();
|
||||||
|
|
||||||
circularPositionSnapGrid.Spacing.BindTo(OsuGridToolboxGroup.Spacing);
|
circularPositionSnapGrid.Spacing.BindTo(OsuGridToolboxGroup.GridLineSpacing);
|
||||||
|
|
||||||
positionSnapGrid = circularPositionSnapGrid;
|
positionSnapGrid = circularPositionSnapGrid;
|
||||||
break;
|
break;
|
||||||
@@ -171,7 +172,8 @@ namespace osu.Game.Rulesets.Osu.Edit
|
|||||||
=> new OsuBlueprintContainer(this);
|
=> new OsuBlueprintContainer(this);
|
||||||
|
|
||||||
public override string ConvertSelectionToString()
|
public override string ConvertSelectionToString()
|
||||||
=> string.Join(',', selectedHitObjects.Cast<OsuHitObject>().OrderBy(h => h.StartTime).Select(h => (h.IndexInCurrentCombo + 1).ToString()));
|
=> string.Join(',', selectedHitObjects.Cast<OsuHitObject>().OrderBy(h => h.StartTime)
|
||||||
|
.Select(h => (h.IndexInCurrentCombo + 1).ToString(CultureInfo.InvariantCulture)));
|
||||||
|
|
||||||
// 1,2,3,4 ...
|
// 1,2,3,4 ...
|
||||||
private static readonly Regex selection_regex = new Regex(@"^\d+(,\d+)*$", RegexOptions.Compiled);
|
private static readonly Regex selection_regex = new Regex(@"^\d+(,\d+)*$", RegexOptions.Compiled);
|
||||||
|
|||||||
@@ -7,6 +7,7 @@ using System.Diagnostics;
|
|||||||
using System.Linq;
|
using System.Linq;
|
||||||
using osu.Framework.Allocation;
|
using osu.Framework.Allocation;
|
||||||
using osu.Framework.Bindables;
|
using osu.Framework.Bindables;
|
||||||
|
using osu.Framework.Extensions.ObjectExtensions;
|
||||||
using osu.Framework.Graphics;
|
using osu.Framework.Graphics;
|
||||||
using osu.Framework.Graphics.Primitives;
|
using osu.Framework.Graphics.Primitives;
|
||||||
using osu.Framework.Utils;
|
using osu.Framework.Utils;
|
||||||
@@ -37,13 +38,16 @@ namespace osu.Game.Rulesets.Osu.Edit
|
|||||||
[Resolved]
|
[Resolved]
|
||||||
private IEditorChangeHandler? changeHandler { get; set; }
|
private IEditorChangeHandler? changeHandler { get; set; }
|
||||||
|
|
||||||
|
[Resolved]
|
||||||
|
private EditorBeatmap editorBeatmap { get; set; } = null!;
|
||||||
|
|
||||||
[Resolved(CanBeNull = true)]
|
[Resolved(CanBeNull = true)]
|
||||||
private IDistanceSnapProvider? snapProvider { get; set; }
|
private IDistanceSnapProvider? snapProvider { get; set; }
|
||||||
|
|
||||||
private BindableList<HitObject> selectedItems { get; } = new BindableList<HitObject>();
|
private BindableList<HitObject> selectedItems { get; } = new BindableList<HitObject>();
|
||||||
|
|
||||||
[BackgroundDependencyLoader]
|
[BackgroundDependencyLoader]
|
||||||
private void load(EditorBeatmap editorBeatmap)
|
private void load()
|
||||||
{
|
{
|
||||||
selectedItems.BindTo(editorBeatmap.SelectedHitObjects);
|
selectedItems.BindTo(editorBeatmap.SelectedHitObjects);
|
||||||
}
|
}
|
||||||
@@ -53,6 +57,13 @@ namespace osu.Game.Rulesets.Osu.Edit
|
|||||||
base.LoadComplete();
|
base.LoadComplete();
|
||||||
|
|
||||||
selectedItems.CollectionChanged += (_, __) => updateState();
|
selectedItems.CollectionChanged += (_, __) => updateState();
|
||||||
|
editorBeatmap.HitObjectUpdated += hitObjectUpdated;
|
||||||
|
updateState();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void hitObjectUpdated(HitObject hitObject)
|
||||||
|
{
|
||||||
|
if (selectedMovableObjects.Contains(hitObject))
|
||||||
updateState();
|
updateState();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -60,8 +71,8 @@ namespace osu.Game.Rulesets.Osu.Edit
|
|||||||
{
|
{
|
||||||
var quad = GeometryUtils.GetSurroundingQuad(selectedMovableObjects);
|
var quad = GeometryUtils.GetSurroundingQuad(selectedMovableObjects);
|
||||||
|
|
||||||
CanScaleX.Value = quad.Width > 0;
|
CanScaleX.Value = Precision.DefinitelyBigger(quad.Width, 0);
|
||||||
CanScaleY.Value = quad.Height > 0;
|
CanScaleY.Value = Precision.DefinitelyBigger(quad.Height, 0);
|
||||||
CanScaleDiagonally.Value = CanScaleX.Value && CanScaleY.Value;
|
CanScaleDiagonally.Value = CanScaleX.Value && CanScaleY.Value;
|
||||||
CanScaleFromPlayfieldOrigin.Value = selectedMovableObjects.Any();
|
CanScaleFromPlayfieldOrigin.Value = selectedMovableObjects.Any();
|
||||||
IsScalingSlider.Value = selectedMovableObjects.Count() == 1 && selectedMovableObjects.First() is Slider;
|
IsScalingSlider.Value = selectedMovableObjects.Count() == 1 && selectedMovableObjects.First() is Slider;
|
||||||
@@ -339,5 +350,13 @@ namespace osu.Game.Rulesets.Osu.Edit
|
|||||||
PathControlPointTypes = (hitObject as IHasPath)?.Path.ControlPoints.Select(p => p.Type).ToArray();
|
PathControlPointTypes = (hitObject as IHasPath)?.Path.ControlPoints.Select(p => p.Type).ToArray();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected override void Dispose(bool isDisposing)
|
||||||
|
{
|
||||||
|
base.Dispose(isDisposing);
|
||||||
|
|
||||||
|
if (editorBeatmap.IsNotNull())
|
||||||
|
editorBeatmap.HitObjectUpdated -= hitObjectUpdated;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -25,10 +25,10 @@ namespace osu.Game.Rulesets.Osu.Edit
|
|||||||
{
|
{
|
||||||
public partial class PolygonGenerationPopover : OsuPopover
|
public partial class PolygonGenerationPopover : OsuPopover
|
||||||
{
|
{
|
||||||
private SliderWithTextBoxInput<double> distanceSnapInput = null!;
|
private FormSliderBar<double> distanceSnapInput { get; set; } = null!;
|
||||||
private SliderWithTextBoxInput<int> offsetAngleInput = null!;
|
private FormSliderBar<int> offsetAngleInput { get; set; } = null!;
|
||||||
private SliderWithTextBoxInput<int> repeatCountInput = null!;
|
private FormSliderBar<int> repeatCountInput { get; set; } = null!;
|
||||||
private SliderWithTextBoxInput<int> pointInput = null!;
|
private FormSliderBar<int> pointInput { get; set; } = null!;
|
||||||
private RoundedButton commitButton = null!;
|
private RoundedButton commitButton = null!;
|
||||||
|
|
||||||
private readonly List<HitCircle> insertedCircles = new List<HitCircle>();
|
private readonly List<HitCircle> insertedCircles = new List<HitCircle>();
|
||||||
@@ -64,11 +64,12 @@ namespace osu.Game.Rulesets.Osu.Edit
|
|||||||
{
|
{
|
||||||
Width = 220,
|
Width = 220,
|
||||||
AutoSizeAxes = Axes.Y,
|
AutoSizeAxes = Axes.Y,
|
||||||
Spacing = new Vector2(20),
|
Spacing = new Vector2(5),
|
||||||
Children = new Drawable[]
|
Children = new Drawable[]
|
||||||
{
|
{
|
||||||
distanceSnapInput = new SliderWithTextBoxInput<double>("Distance snap:")
|
distanceSnapInput = new FormSliderBar<double>
|
||||||
{
|
{
|
||||||
|
Caption = "Distance snap",
|
||||||
Current = new BindableNumber<double>(1)
|
Current = new BindableNumber<double>(1)
|
||||||
{
|
{
|
||||||
MinValue = 0.1,
|
MinValue = 0.1,
|
||||||
@@ -76,37 +77,40 @@ namespace osu.Game.Rulesets.Osu.Edit
|
|||||||
Precision = 0.1,
|
Precision = 0.1,
|
||||||
Value = ((OsuHitObjectComposer)composer).DistanceSnapProvider.DistanceSpacingMultiplier.Value,
|
Value = ((OsuHitObjectComposer)composer).DistanceSnapProvider.DistanceSpacingMultiplier.Value,
|
||||||
},
|
},
|
||||||
Instantaneous = true
|
TabbableContentContainer = this
|
||||||
},
|
},
|
||||||
offsetAngleInput = new SliderWithTextBoxInput<int>("Offset angle:")
|
offsetAngleInput = new FormSliderBar<int>
|
||||||
{
|
{
|
||||||
|
Caption = "Offset angle",
|
||||||
Current = new BindableNumber<int>
|
Current = new BindableNumber<int>
|
||||||
{
|
{
|
||||||
MinValue = 0,
|
MinValue = 0,
|
||||||
MaxValue = 180,
|
MaxValue = 180,
|
||||||
Precision = 1
|
Precision = 1
|
||||||
},
|
},
|
||||||
Instantaneous = true
|
TabbableContentContainer = this
|
||||||
},
|
},
|
||||||
repeatCountInput = new SliderWithTextBoxInput<int>("Repeats:")
|
repeatCountInput = new FormSliderBar<int>
|
||||||
{
|
{
|
||||||
|
Caption = "Repeats",
|
||||||
Current = new BindableNumber<int>(1)
|
Current = new BindableNumber<int>(1)
|
||||||
{
|
{
|
||||||
MinValue = 1,
|
MinValue = 1,
|
||||||
MaxValue = 10,
|
MaxValue = 10,
|
||||||
Precision = 1
|
Precision = 1
|
||||||
},
|
},
|
||||||
Instantaneous = true
|
TabbableContentContainer = this
|
||||||
},
|
},
|
||||||
pointInput = new SliderWithTextBoxInput<int>("Vertices:")
|
pointInput = new FormSliderBar<int>
|
||||||
{
|
{
|
||||||
|
Caption = "Vertices",
|
||||||
Current = new BindableNumber<int>(3)
|
Current = new BindableNumber<int>(3)
|
||||||
{
|
{
|
||||||
MinValue = 3,
|
MinValue = 3,
|
||||||
MaxValue = 32,
|
MaxValue = 32,
|
||||||
Precision = 1,
|
Precision = 1,
|
||||||
},
|
},
|
||||||
Instantaneous = true
|
TabbableContentContainer = this
|
||||||
},
|
},
|
||||||
commitButton = new RoundedButton
|
commitButton = new RoundedButton
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -37,7 +37,7 @@ namespace osu.Game.Rulesets.Osu.Edit
|
|||||||
private BindableNumber<float> xBindable = null!;
|
private BindableNumber<float> xBindable = null!;
|
||||||
private BindableNumber<float> yBindable = null!;
|
private BindableNumber<float> yBindable = null!;
|
||||||
|
|
||||||
private SliderWithTextBoxInput<float> xInput = null!;
|
private FormSliderBar<float> xInput { get; set; } = null!;
|
||||||
private OsuCheckbox relativeCheckbox = null!;
|
private OsuCheckbox relativeCheckbox = null!;
|
||||||
|
|
||||||
public PreciseMovementPopover()
|
public PreciseMovementPopover()
|
||||||
@@ -52,31 +52,31 @@ namespace osu.Game.Rulesets.Osu.Edit
|
|||||||
{
|
{
|
||||||
Width = 220,
|
Width = 220,
|
||||||
AutoSizeAxes = Axes.Y,
|
AutoSizeAxes = Axes.Y,
|
||||||
Spacing = new Vector2(20),
|
Spacing = new Vector2(5),
|
||||||
Children = new Drawable[]
|
Children = new Drawable[]
|
||||||
{
|
{
|
||||||
xInput = new SliderWithTextBoxInput<float>("X:")
|
xInput = new FormSliderBar<float>
|
||||||
{
|
{
|
||||||
|
Caption = "X",
|
||||||
Current = xBindable = new BindableNumber<float>
|
Current = xBindable = new BindableNumber<float>
|
||||||
{
|
{
|
||||||
Precision = 1,
|
Precision = 1,
|
||||||
},
|
},
|
||||||
Instantaneous = true,
|
TabbableContentContainer = this
|
||||||
TabbableContentContainer = this,
|
|
||||||
},
|
},
|
||||||
new SliderWithTextBoxInput<float>("Y:")
|
new FormSliderBar<float>
|
||||||
{
|
{
|
||||||
|
Caption = "Y",
|
||||||
Current = yBindable = new BindableNumber<float>
|
Current = yBindable = new BindableNumber<float>
|
||||||
{
|
{
|
||||||
Precision = 1,
|
Precision = 1,
|
||||||
},
|
},
|
||||||
Instantaneous = true,
|
TabbableContentContainer = this
|
||||||
TabbableContentContainer = this,
|
|
||||||
},
|
},
|
||||||
relativeCheckbox = new OsuCheckbox(false)
|
relativeCheckbox = new OsuCheckbox(false)
|
||||||
{
|
{
|
||||||
RelativeSizeAxes = Axes.X,
|
RelativeSizeAxes = Axes.X,
|
||||||
LabelText = "Relative movement",
|
LabelText = "Relative movement"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -28,7 +28,7 @@ namespace osu.Game.Rulesets.Osu.Edit
|
|||||||
|
|
||||||
private readonly Bindable<PreciseRotationInfo> rotationInfo = new Bindable<PreciseRotationInfo>(new PreciseRotationInfo(0, EditorOrigin.GridCentre));
|
private readonly Bindable<PreciseRotationInfo> rotationInfo = new Bindable<PreciseRotationInfo>(new PreciseRotationInfo(0, EditorOrigin.GridCentre));
|
||||||
|
|
||||||
private SliderWithTextBoxInput<float> angleInput = null!;
|
private FormSliderBar<float> angleInput { get; set; } = null!;
|
||||||
private EditorRadioButtonCollection rotationOrigin = null!;
|
private EditorRadioButtonCollection rotationOrigin = null!;
|
||||||
|
|
||||||
private RadioButton gridCentreButton = null!;
|
private RadioButton gridCentreButton = null!;
|
||||||
@@ -54,11 +54,12 @@ namespace osu.Game.Rulesets.Osu.Edit
|
|||||||
{
|
{
|
||||||
Width = 220,
|
Width = 220,
|
||||||
AutoSizeAxes = Axes.Y,
|
AutoSizeAxes = Axes.Y,
|
||||||
Spacing = new Vector2(20),
|
Spacing = new Vector2(5),
|
||||||
Children = new Drawable[]
|
Children = new Drawable[]
|
||||||
{
|
{
|
||||||
angleInput = new SliderWithTextBoxInput<float>("Angle (degrees):")
|
angleInput = new FormSliderBar<float>
|
||||||
{
|
{
|
||||||
|
Caption = "Angle (degrees)",
|
||||||
Current = new BindableNumber<float>
|
Current = new BindableNumber<float>
|
||||||
{
|
{
|
||||||
MinValue = -360,
|
MinValue = -360,
|
||||||
@@ -66,7 +67,7 @@ namespace osu.Game.Rulesets.Osu.Edit
|
|||||||
Precision = 1
|
Precision = 1
|
||||||
},
|
},
|
||||||
KeyboardStep = 1f,
|
KeyboardStep = 1f,
|
||||||
Instantaneous = true
|
TabbableContentContainer = this
|
||||||
},
|
},
|
||||||
rotationOrigin = new EditorRadioButtonCollection
|
rotationOrigin = new EditorRadioButtonCollection
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -32,7 +32,7 @@ namespace osu.Game.Rulesets.Osu.Edit
|
|||||||
|
|
||||||
private readonly Bindable<PreciseScaleInfo> scaleInfo = new Bindable<PreciseScaleInfo>(new PreciseScaleInfo(1, EditorOrigin.GridCentre, true, true));
|
private readonly Bindable<PreciseScaleInfo> scaleInfo = new Bindable<PreciseScaleInfo>(new PreciseScaleInfo(1, EditorOrigin.GridCentre, true, true));
|
||||||
|
|
||||||
private SliderWithTextBoxInput<float> scaleInput = null!;
|
private FormSliderBar<float> scaleInput { get; set; } = null!;
|
||||||
private BindableNumber<float> scaleInputBindable = null!;
|
private BindableNumber<float> scaleInputBindable = null!;
|
||||||
private EditorRadioButtonCollection scaleOrigin = null!;
|
private EditorRadioButtonCollection scaleOrigin = null!;
|
||||||
|
|
||||||
@@ -66,11 +66,12 @@ namespace osu.Game.Rulesets.Osu.Edit
|
|||||||
{
|
{
|
||||||
Width = 220,
|
Width = 220,
|
||||||
AutoSizeAxes = Axes.Y,
|
AutoSizeAxes = Axes.Y,
|
||||||
Spacing = new Vector2(20),
|
Spacing = new Vector2(5),
|
||||||
Children = new Drawable[]
|
Children = new Drawable[]
|
||||||
{
|
{
|
||||||
scaleInput = new SliderWithTextBoxInput<float>("Scale:")
|
scaleInput = new FormSliderBar<float>
|
||||||
{
|
{
|
||||||
|
Caption = "Scale",
|
||||||
Current = scaleInputBindable = new BindableNumber<float>
|
Current = scaleInputBindable = new BindableNumber<float>
|
||||||
{
|
{
|
||||||
MinValue = 0.05f,
|
MinValue = 0.05f,
|
||||||
@@ -80,7 +81,7 @@ namespace osu.Game.Rulesets.Osu.Edit
|
|||||||
Default = 1,
|
Default = 1,
|
||||||
},
|
},
|
||||||
KeyboardStep = 0.01f,
|
KeyboardStep = 0.01f,
|
||||||
Instantaneous = true
|
TabbableContentContainer = this
|
||||||
},
|
},
|
||||||
scaleOrigin = new EditorRadioButtonCollection
|
scaleOrigin = new EditorRadioButtonCollection
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -67,6 +67,9 @@ namespace osu.Game.Rulesets.Osu.Mods
|
|||||||
{
|
{
|
||||||
if (LastAcceptedAction != null && nonGameplayPeriods.IsInAny(gameplayClock.CurrentTime))
|
if (LastAcceptedAction != null && nonGameplayPeriods.IsInAny(gameplayClock.CurrentTime))
|
||||||
LastAcceptedAction = null;
|
LastAcceptedAction = null;
|
||||||
|
|
||||||
|
if (LastAcceptedAction != null && gameplayClock.IsRewinding)
|
||||||
|
LastAcceptedAction = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected abstract bool CheckValidNewAction(OsuAction action);
|
protected abstract bool CheckValidNewAction(OsuAction action);
|
||||||
|
|||||||
@@ -16,6 +16,7 @@ namespace osu.Game.Rulesets.Osu.Mods
|
|||||||
public override LocalisableString Description => @"Don't use the same key twice in a row!";
|
public override LocalisableString Description => @"Don't use the same key twice in a row!";
|
||||||
public override IconUsage? Icon => OsuIcon.ModAlternate;
|
public override IconUsage? Icon => OsuIcon.ModAlternate;
|
||||||
public override Type[] IncompatibleMods => base.IncompatibleMods.Concat(new[] { typeof(OsuModSingleTap) }).ToArray();
|
public override Type[] IncompatibleMods => base.IncompatibleMods.Concat(new[] { typeof(OsuModSingleTap) }).ToArray();
|
||||||
|
public override bool Ranked => true;
|
||||||
|
|
||||||
protected override bool CheckValidNewAction(OsuAction action) => LastAcceptedAction != action;
|
protected override bool CheckValidNewAction(OsuAction action) => LastAcceptedAction != action;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -39,7 +39,7 @@ namespace osu.Game.Rulesets.Osu.Mods
|
|||||||
[SettingSource(
|
[SettingSource(
|
||||||
"Max size at combo",
|
"Max size at combo",
|
||||||
"The combo count at which the cursor reaches its maximum size",
|
"The combo count at which the cursor reaches its maximum size",
|
||||||
SettingControlType = typeof(SettingsSlider<int, RoundedSliderBar<int>>)
|
SettingControlType = typeof(SettingsSlider<int, MaxSizeComboSlider>)
|
||||||
)]
|
)]
|
||||||
public BindableInt MaxSizeComboCount { get; } = new BindableInt(50)
|
public BindableInt MaxSizeComboCount { get; } = new BindableInt(50)
|
||||||
{
|
{
|
||||||
@@ -85,4 +85,12 @@ namespace osu.Game.Rulesets.Osu.Mods
|
|||||||
cursor.ModScaleAdjust.Value = (float)Interpolation.Lerp(cursor.ModScaleAdjust.Value, currentSize, Math.Clamp(cursor.Time.Elapsed / TRANSITION_DURATION, 0, 1));
|
cursor.ModScaleAdjust.Value = (float)Interpolation.Lerp(cursor.ModScaleAdjust.Value, currentSize, Math.Clamp(cursor.Time.Elapsed / TRANSITION_DURATION, 0, 1));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public partial class MaxSizeComboSlider : RoundedSliderBar<int>
|
||||||
|
{
|
||||||
|
public MaxSizeComboSlider()
|
||||||
|
{
|
||||||
|
KeyboardStep = 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,7 +1,9 @@
|
|||||||
// Copyright (c) ppy Pty Ltd <contact@ppy.sh>. Licensed under the MIT Licence.
|
// Copyright (c) ppy Pty Ltd <contact@ppy.sh>. Licensed under the MIT Licence.
|
||||||
// See the LICENCE file in the repository root for full licence text.
|
// See the LICENCE file in the repository root for full licence text.
|
||||||
|
|
||||||
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
using osu.Framework.Bindables;
|
using osu.Framework.Bindables;
|
||||||
using osu.Framework.Localisation;
|
using osu.Framework.Localisation;
|
||||||
using osu.Game.Beatmaps;
|
using osu.Game.Beatmaps;
|
||||||
@@ -82,6 +84,8 @@ namespace osu.Game.Rulesets.Osu.Mods
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public override Type[] IncompatibleMods => base.IncompatibleMods.Append(typeof(OsuModTargetPractice)).ToArray();
|
||||||
|
|
||||||
protected override void ApplySettings(BeatmapDifficulty difficulty)
|
protected override void ApplySettings(BeatmapDifficulty difficulty)
|
||||||
{
|
{
|
||||||
base.ApplySettings(difficulty);
|
base.ApplySettings(difficulty);
|
||||||
|
|||||||
@@ -27,8 +27,10 @@ namespace osu.Game.Rulesets.Osu.Mods
|
|||||||
|
|
||||||
public override LocalisableString Description => "Burn the notes into your memory.";
|
public override LocalisableString Description => "Burn the notes into your memory.";
|
||||||
|
|
||||||
//Alters the transforms of the approach circles, breaking the effects of these mods.
|
/// <remarks>
|
||||||
public override Type[] IncompatibleMods => base.IncompatibleMods.Concat(new[] { typeof(OsuModApproachDifferent), typeof(OsuModTransform), typeof(OsuModDepth) }).ToArray();
|
/// Incompatible with all mods that directly modify or indirectly depend on <see cref="OsuHitObject.TimePreempt"/>, or alter the behaviour of approach circles.
|
||||||
|
/// </remarks>
|
||||||
|
public override Type[] IncompatibleMods => base.IncompatibleMods.Concat(new[] { typeof(OsuModApproachDifferent), typeof(OsuModTransform), typeof(OsuModDepth), typeof(OsuModHidden) }).ToArray();
|
||||||
|
|
||||||
public override ModType Type => ModType.Fun;
|
public override ModType Type => ModType.Fun;
|
||||||
|
|
||||||
@@ -57,16 +59,25 @@ namespace osu.Game.Rulesets.Osu.Mods
|
|||||||
|
|
||||||
void applyFadeInAdjustment(OsuHitObject osuObject)
|
void applyFadeInAdjustment(OsuHitObject osuObject)
|
||||||
{
|
{
|
||||||
|
if (osuObject is not Spinner)
|
||||||
osuObject.TimePreempt += osuObject.StartTime - lastNewComboTime;
|
osuObject.TimePreempt += osuObject.StartTime - lastNewComboTime;
|
||||||
|
|
||||||
|
int repeatCount = 0;
|
||||||
|
|
||||||
foreach (var nested in osuObject.NestedHitObjects.OfType<OsuHitObject>())
|
foreach (var nested in osuObject.NestedHitObjects.OfType<OsuHitObject>())
|
||||||
{
|
{
|
||||||
switch (nested)
|
switch (nested)
|
||||||
{
|
{
|
||||||
//Freezing the SliderTicks doesnt play well with snaking sliders
|
// Freezing the SliderTicks doesnt play well with snaking sliders
|
||||||
case SliderTick:
|
case SliderTick:
|
||||||
//SliderRepeat wont layer correctly if preempt is changed.
|
break;
|
||||||
|
|
||||||
case SliderRepeat:
|
case SliderRepeat:
|
||||||
|
if (repeatCount > 2)
|
||||||
|
break;
|
||||||
|
|
||||||
|
applyFadeInAdjustment(nested);
|
||||||
|
repeatCount++;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
|
|||||||
@@ -26,7 +26,7 @@ namespace osu.Game.Rulesets.Osu.Mods
|
|||||||
public override LocalisableString Description => @"Play with no approach circles and fading circles/sliders.";
|
public override LocalisableString Description => @"Play with no approach circles and fading circles/sliders.";
|
||||||
public override double ScoreMultiplier => UsesDefaultConfiguration ? 1.06 : 1;
|
public override double ScoreMultiplier => UsesDefaultConfiguration ? 1.06 : 1;
|
||||||
|
|
||||||
public override Type[] IncompatibleMods => new[] { typeof(IRequiresApproachCircles), typeof(OsuModSpinIn), typeof(OsuModDepth) };
|
public override Type[] IncompatibleMods => new[] { typeof(IRequiresApproachCircles), typeof(OsuModSpinIn), typeof(OsuModDepth), typeof(OsuModFreezeFrame) };
|
||||||
|
|
||||||
public const double FADE_IN_DURATION_MULTIPLIER = 0.4;
|
public const double FADE_IN_DURATION_MULTIPLIER = 0.4;
|
||||||
public const double FADE_OUT_DURATION_MULTIPLIER = 0.3;
|
public const double FADE_OUT_DURATION_MULTIPLIER = 0.3;
|
||||||
|
|||||||
@@ -1,16 +0,0 @@
|
|||||||
// Copyright (c) ppy Pty Ltd <contact@ppy.sh>. Licensed under the MIT Licence.
|
|
||||||
// See the LICENCE file in the repository root for full licence text.
|
|
||||||
|
|
||||||
using osu.Framework.Audio;
|
|
||||||
using osu.Framework.Bindables;
|
|
||||||
using osu.Game.Configuration;
|
|
||||||
using osu.Game.Overlays.Settings;
|
|
||||||
using osu.Game.Rulesets.Mods;
|
|
||||||
|
|
||||||
namespace osu.Game.Rulesets.Osu.Mods
|
|
||||||
{
|
|
||||||
public class OsuModRateAdjustConcrete : ModRateAdjustConcrete
|
|
||||||
{
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -16,6 +16,7 @@ namespace osu.Game.Rulesets.Osu.Mods
|
|||||||
public override IconUsage? Icon => OsuIcon.ModSingleTap;
|
public override IconUsage? Icon => OsuIcon.ModSingleTap;
|
||||||
public override LocalisableString Description => @"You must only use one key!";
|
public override LocalisableString Description => @"You must only use one key!";
|
||||||
public override Type[] IncompatibleMods => base.IncompatibleMods.Concat(new[] { typeof(OsuModAlternate) }).ToArray();
|
public override Type[] IncompatibleMods => base.IncompatibleMods.Concat(new[] { typeof(OsuModAlternate) }).ToArray();
|
||||||
|
public override bool Ranked => true;
|
||||||
|
|
||||||
protected override bool CheckValidNewAction(OsuAction action) => LastAcceptedAction == null || LastAcceptedAction == action;
|
protected override bool CheckValidNewAction(OsuAction action) => LastAcceptedAction == null || LastAcceptedAction == action;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -48,7 +48,8 @@ namespace osu.Game.Rulesets.Osu.Mods
|
|||||||
typeof(OsuModSpunOut),
|
typeof(OsuModSpunOut),
|
||||||
typeof(OsuModStrictTracking),
|
typeof(OsuModStrictTracking),
|
||||||
typeof(OsuModSuddenDeath),
|
typeof(OsuModSuddenDeath),
|
||||||
typeof(OsuModDepth)
|
typeof(OsuModDepth),
|
||||||
|
typeof(OsuModDifficultyAdjust),
|
||||||
}).ToArray();
|
}).ToArray();
|
||||||
|
|
||||||
[SettingSource("Seed", "Use a custom seed instead of a random one", SettingControlType = typeof(SettingsNumberBox))]
|
[SettingSource("Seed", "Use a custom seed instead of a random one", SettingControlType = typeof(SettingsNumberBox))]
|
||||||
|
|||||||
@@ -21,7 +21,7 @@ namespace osu.Game.Rulesets.Osu.Mods
|
|||||||
public override string Name => "Traceable";
|
public override string Name => "Traceable";
|
||||||
public override string Acronym => "TC";
|
public override string Acronym => "TC";
|
||||||
public override IconUsage? Icon => OsuIcon.ModTraceable;
|
public override IconUsage? Icon => OsuIcon.ModTraceable;
|
||||||
public override ModType Type => ModType.Fun;
|
public override ModType Type => ModType.DifficultyIncrease;
|
||||||
public override LocalisableString Description => "Put your faith in the approach circles...";
|
public override LocalisableString Description => "Put your faith in the approach circles...";
|
||||||
public override double ScoreMultiplier => 1;
|
public override double ScoreMultiplier => 1;
|
||||||
public override bool Ranked => true;
|
public override bool Ranked => true;
|
||||||
|
|||||||
@@ -171,7 +171,7 @@ namespace osu.Game.Rulesets.Osu.Objects
|
|||||||
{
|
{
|
||||||
base.ApplyDefaultsToSelf(controlPointInfo, difficulty);
|
base.ApplyDefaultsToSelf(controlPointInfo, difficulty);
|
||||||
|
|
||||||
TimePreempt = (float)IBeatmapDifficultyInfo.DifficultyRange(difficulty.ApproachRate, PREEMPT_RANGE);
|
TimePreempt = IBeatmapDifficultyInfo.DifficultyRangeInt(difficulty.ApproachRate, PREEMPT_RANGE);
|
||||||
|
|
||||||
// Preempt time can go below 450ms. Normally, this is achieved via the DT mod which uniformly speeds up all animations game wide regardless of AR.
|
// Preempt time can go below 450ms. Normally, this is achieved via the DT mod which uniformly speeds up all animations game wide regardless of AR.
|
||||||
// This uniform speedup is hard to match 1:1, however we can at least make AR>10 (via mods) feel good by extending the upper linear function above.
|
// This uniform speedup is hard to match 1:1, however we can at least make AR>10 (via mods) feel good by extending the upper linear function above.
|
||||||
|
|||||||
@@ -175,7 +175,7 @@ namespace osu.Game.Rulesets.Osu
|
|||||||
new OsuModHardRock(),
|
new OsuModHardRock(),
|
||||||
new MultiMod(new OsuModSuddenDeath(), new OsuModPerfect()),
|
new MultiMod(new OsuModSuddenDeath(), new OsuModPerfect()),
|
||||||
new MultiMod(new OsuModDoubleTime(), new OsuModNightcore()),
|
new MultiMod(new OsuModDoubleTime(), new OsuModNightcore()),
|
||||||
new OsuModHidden(),
|
new MultiMod(new OsuModHidden(), new OsuModTraceable()),
|
||||||
new MultiMod(new OsuModFlashlight(), new OsuModBlinds()),
|
new MultiMod(new OsuModFlashlight(), new OsuModBlinds()),
|
||||||
new OsuModStrictTracking(),
|
new OsuModStrictTracking(),
|
||||||
new OsuModAccuracyChallenge(),
|
new OsuModAccuracyChallenge(),
|
||||||
@@ -209,7 +209,6 @@ namespace osu.Game.Rulesets.Osu
|
|||||||
new OsuModSpinIn(),
|
new OsuModSpinIn(),
|
||||||
new MultiMod(new OsuModGrow(), new OsuModDeflate()),
|
new MultiMod(new OsuModGrow(), new OsuModDeflate()),
|
||||||
new MultiMod(new ModWindUp(), new ModWindDown()),
|
new MultiMod(new ModWindUp(), new ModWindDown()),
|
||||||
new OsuModTraceable(),
|
|
||||||
new OsuModBarrelRoll(),
|
new OsuModBarrelRoll(),
|
||||||
new OsuModApproachDifferent(),
|
new OsuModApproachDifferent(),
|
||||||
new OsuModMuted(),
|
new OsuModMuted(),
|
||||||
@@ -232,10 +231,7 @@ namespace osu.Game.Rulesets.Osu
|
|||||||
|
|
||||||
case ModType.Special:
|
case ModType.Special:
|
||||||
#if DEBUG
|
#if DEBUG
|
||||||
return new Mod[]
|
return Array.Empty<Mod>();
|
||||||
{
|
|
||||||
new OsuModRateAdjustConcrete(),
|
|
||||||
};
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
default:
|
default:
|
||||||
@@ -257,7 +253,11 @@ namespace osu.Game.Rulesets.Osu
|
|||||||
|
|
||||||
public override string ShortName => SHORT_NAME;
|
public override string ShortName => SHORT_NAME;
|
||||||
|
|
||||||
|
#if !DEBUG
|
||||||
public override string PlayingVerb => "Clicking circles";
|
public override string PlayingVerb => "Clicking circles";
|
||||||
|
#else
|
||||||
|
public override string PlayingVerb => "Debugging circles";
|
||||||
|
#endif
|
||||||
|
|
||||||
public override RulesetSettingsSubsection CreateSettings() => new OsuSettingsSubsection(this);
|
public override RulesetSettingsSubsection CreateSettings() => new OsuSettingsSubsection(this);
|
||||||
|
|
||||||
@@ -286,19 +286,24 @@ namespace osu.Game.Rulesets.Osu
|
|||||||
|
|
||||||
public override IRulesetConfigManager CreateConfig(SettingsStore? settings) => new OsuRulesetConfigManager(settings, RulesetInfo);
|
public override IRulesetConfigManager CreateConfig(SettingsStore? settings) => new OsuRulesetConfigManager(settings, RulesetInfo);
|
||||||
|
|
||||||
protected override IEnumerable<HitResult> GetValidHitResults()
|
public override IEnumerable<HitResult> GetValidHitResults()
|
||||||
{
|
{
|
||||||
return new[]
|
return new[]
|
||||||
{
|
{
|
||||||
HitResult.Great,
|
HitResult.Great,
|
||||||
HitResult.Ok,
|
HitResult.Ok,
|
||||||
HitResult.Meh,
|
HitResult.Meh,
|
||||||
|
HitResult.Miss,
|
||||||
|
|
||||||
HitResult.LargeTickHit,
|
HitResult.LargeTickHit,
|
||||||
|
HitResult.LargeTickMiss,
|
||||||
HitResult.SmallTickHit,
|
HitResult.SmallTickHit,
|
||||||
|
HitResult.SmallTickMiss,
|
||||||
HitResult.SliderTailHit,
|
HitResult.SliderTailHit,
|
||||||
HitResult.SmallBonus,
|
HitResult.SmallBonus,
|
||||||
HitResult.LargeBonus,
|
HitResult.LargeBonus,
|
||||||
|
HitResult.IgnoreHit,
|
||||||
|
HitResult.IgnoreMiss,
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -420,7 +425,8 @@ namespace osu.Game.Rulesets.Osu
|
|||||||
Description = "Affects how early objects appear on screen relative to their hit time.",
|
Description = "Affects how early objects appear on screen relative to their hit time.",
|
||||||
AdditionalMetrics =
|
AdditionalMetrics =
|
||||||
[
|
[
|
||||||
new RulesetBeatmapAttribute.AdditionalMetric("Approach time", LocalisableString.Interpolate($@"{IBeatmapDifficultyInfo.DifficultyRange(effectiveDifficulty.ApproachRate, OsuHitObject.PREEMPT_RANGE):#,0.##} ms"))
|
new RulesetBeatmapAttribute.AdditionalMetric("Approach time",
|
||||||
|
LocalisableString.Interpolate($@"{IBeatmapDifficultyInfo.DifficultyRangeInt(effectiveDifficulty.ApproachRate, OsuHitObject.PREEMPT_RANGE):#,0.##} ms"))
|
||||||
]
|
]
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -21,6 +21,8 @@ namespace osu.Game.Rulesets.Osu.Replays
|
|||||||
{
|
{
|
||||||
public class OsuAutoGenerator : OsuAutoGeneratorBase
|
public class OsuAutoGenerator : OsuAutoGeneratorBase
|
||||||
{
|
{
|
||||||
|
public const double MIN_FRAME_SEPARATION_FOR_ALTERNATING = 266;
|
||||||
|
|
||||||
public new OsuBeatmap Beatmap => (OsuBeatmap)base.Beatmap;
|
public new OsuBeatmap Beatmap => (OsuBeatmap)base.Beatmap;
|
||||||
|
|
||||||
#region Parameters
|
#region Parameters
|
||||||
@@ -245,7 +247,7 @@ namespace osu.Game.Rulesets.Osu.Replays
|
|||||||
double timeDifference = ApplyModsToTimeDelta(lastFrame.Time, h.StartTime);
|
double timeDifference = ApplyModsToTimeDelta(lastFrame.Time, h.StartTime);
|
||||||
OsuReplayFrame? lastLastFrame = Frames.Count >= 2 ? (OsuReplayFrame)Frames[^2] : null;
|
OsuReplayFrame? lastLastFrame = Frames.Count >= 2 ? (OsuReplayFrame)Frames[^2] : null;
|
||||||
|
|
||||||
if (timeDifference > 0)
|
if (timeDifference >= 0)
|
||||||
{
|
{
|
||||||
// If the last frame is a key-up frame and there has been no wait period, adjust the last frame's position such that it begins eased movement instantaneously.
|
// If the last frame is a key-up frame and there has been no wait period, adjust the last frame's position such that it begins eased movement instantaneously.
|
||||||
if (lastLastFrame != null && lastFrame is OsuKeyUpReplayFrame && !hasWaited)
|
if (lastLastFrame != null && lastFrame is OsuKeyUpReplayFrame && !hasWaited)
|
||||||
@@ -266,7 +268,7 @@ namespace osu.Game.Rulesets.Osu.Replays
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Start alternating once the time separation is too small (faster than ~225BPM).
|
// Start alternating once the time separation is too small (faster than ~225BPM).
|
||||||
if (timeDifference > 0 && timeDifference < 266)
|
if (timeDifference >= 0 && timeDifference < MIN_FRAME_SEPARATION_FOR_ALTERNATING)
|
||||||
buttonIndex++;
|
buttonIndex++;
|
||||||
else
|
else
|
||||||
buttonIndex = 0;
|
buttonIndex = 0;
|
||||||
|
|||||||
@@ -103,6 +103,9 @@ namespace osu.Game.Rulesets.Osu.Skinning.Legacy
|
|||||||
leaderboard.Origin = Anchor.BottomLeft;
|
leaderboard.Origin = Anchor.BottomLeft;
|
||||||
leaderboard.Position = pos;
|
leaderboard.Position = pos;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
foreach (var d in container.OfType<ISerialisableDrawable>())
|
||||||
|
d.UsesFixedAnchor = true;
|
||||||
})
|
})
|
||||||
{
|
{
|
||||||
Children = new Drawable[]
|
Children = new Drawable[]
|
||||||
|
|||||||
@@ -77,9 +77,14 @@ namespace osu.Game.Rulesets.Osu.Skinning
|
|||||||
base.LoadComplete();
|
base.LoadComplete();
|
||||||
|
|
||||||
RelativeSizeAxes = Axes.Both;
|
RelativeSizeAxes = Axes.Both;
|
||||||
|
}
|
||||||
|
|
||||||
LifetimeStart = smokeStartTime = Time.Current;
|
public void StartDrawing(double time)
|
||||||
|
{
|
||||||
|
LifetimeStart = smokeStartTime = time;
|
||||||
|
LifetimeEnd = smokeEndTime = double.MaxValue;
|
||||||
|
SmokePoints.Clear();
|
||||||
|
lastPosition = null;
|
||||||
totalDistance = pointInterval;
|
totalDistance = pointInterval;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -49,6 +49,18 @@ namespace osu.Game.Rulesets.Osu.UI.Cursor
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
protected bool AllowPartRotation { get; set; }
|
protected bool AllowPartRotation { get; set; }
|
||||||
|
|
||||||
|
private Vector2 cursorScale = Vector2.One;
|
||||||
|
|
||||||
|
public Vector2 CursorScale
|
||||||
|
{
|
||||||
|
get => cursorScale;
|
||||||
|
set
|
||||||
|
{
|
||||||
|
cursorScale = value;
|
||||||
|
Invalidate(Invalidation.DrawNode);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// The trail part texture origin.
|
/// The trail part texture origin.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@@ -186,7 +198,7 @@ namespace osu.Game.Rulesets.Osu.UI.Cursor
|
|||||||
float distance = diff.Length;
|
float distance = diff.Length;
|
||||||
Vector2 direction = diff / distance;
|
Vector2 direction = diff / distance;
|
||||||
|
|
||||||
float interval = Texture.DisplayWidth / 2.5f * IntervalMultiplier;
|
float interval = Texture.DisplayWidth * CursorScale.X / 2.5f * IntervalMultiplier;
|
||||||
float stopAt = distance - (AvoidDrawingNearCursor ? interval : 0);
|
float stopAt = distance - (AvoidDrawingNearCursor ? interval : 0);
|
||||||
|
|
||||||
for (float d = interval; d < stopAt; d += interval)
|
for (float d = interval; d < stopAt; d += interval)
|
||||||
@@ -233,6 +245,7 @@ namespace osu.Game.Rulesets.Osu.UI.Cursor
|
|||||||
private float time;
|
private float time;
|
||||||
private float fadeExponent;
|
private float fadeExponent;
|
||||||
private float angle;
|
private float angle;
|
||||||
|
private Vector2 cursorScale;
|
||||||
|
|
||||||
private readonly TrailPart[] parts = new TrailPart[max_sprites];
|
private readonly TrailPart[] parts = new TrailPart[max_sprites];
|
||||||
private Vector2 originPosition;
|
private Vector2 originPosition;
|
||||||
@@ -253,6 +266,7 @@ namespace osu.Game.Rulesets.Osu.UI.Cursor
|
|||||||
time = Source.time;
|
time = Source.time;
|
||||||
fadeExponent = Source.FadeExponent;
|
fadeExponent = Source.FadeExponent;
|
||||||
angle = Source.AllowPartRotation ? float.DegreesToRadians(Source.PartRotation) : 0;
|
angle = Source.AllowPartRotation ? float.DegreesToRadians(Source.PartRotation) : 0;
|
||||||
|
cursorScale = Source.cursorScale;
|
||||||
|
|
||||||
originPosition = Vector2.Zero;
|
originPosition = Vector2.Zero;
|
||||||
|
|
||||||
@@ -307,7 +321,9 @@ namespace osu.Game.Rulesets.Osu.UI.Cursor
|
|||||||
vertexBatch.Add(new TexturedTrailVertex
|
vertexBatch.Add(new TexturedTrailVertex
|
||||||
{
|
{
|
||||||
Position = rotateAround(
|
Position = rotateAround(
|
||||||
new Vector2(part.Position.X - texture.DisplayWidth * originPosition.X * part.Scale.X, part.Position.Y + texture.DisplayHeight * (1 - originPosition.Y) * part.Scale.Y),
|
new Vector2(
|
||||||
|
part.Position.X - texture.DisplayWidth * originPosition.X * part.Scale.X * cursorScale.X,
|
||||||
|
part.Position.Y + texture.DisplayHeight * (1 - originPosition.Y) * part.Scale.Y * cursorScale.Y),
|
||||||
part.Position, sin, cos),
|
part.Position, sin, cos),
|
||||||
TexturePosition = textureRect.BottomLeft,
|
TexturePosition = textureRect.BottomLeft,
|
||||||
TextureRect = new Vector4(0, 0, 1, 1),
|
TextureRect = new Vector4(0, 0, 1, 1),
|
||||||
@@ -318,8 +334,10 @@ namespace osu.Game.Rulesets.Osu.UI.Cursor
|
|||||||
vertexBatch.Add(new TexturedTrailVertex
|
vertexBatch.Add(new TexturedTrailVertex
|
||||||
{
|
{
|
||||||
Position = rotateAround(
|
Position = rotateAround(
|
||||||
new Vector2(part.Position.X + texture.DisplayWidth * (1 - originPosition.X) * part.Scale.X,
|
new Vector2(
|
||||||
part.Position.Y + texture.DisplayHeight * (1 - originPosition.Y) * part.Scale.Y), part.Position, sin, cos),
|
part.Position.X + texture.DisplayWidth * (1 - originPosition.X) * part.Scale.X * cursorScale.X,
|
||||||
|
part.Position.Y + texture.DisplayHeight * (1 - originPosition.Y) * part.Scale.Y * cursorScale.Y),
|
||||||
|
part.Position, sin, cos),
|
||||||
TexturePosition = textureRect.BottomRight,
|
TexturePosition = textureRect.BottomRight,
|
||||||
TextureRect = new Vector4(0, 0, 1, 1),
|
TextureRect = new Vector4(0, 0, 1, 1),
|
||||||
Colour = DrawColourInfo.Colour.BottomRight.Linear,
|
Colour = DrawColourInfo.Colour.BottomRight.Linear,
|
||||||
@@ -329,7 +347,9 @@ namespace osu.Game.Rulesets.Osu.UI.Cursor
|
|||||||
vertexBatch.Add(new TexturedTrailVertex
|
vertexBatch.Add(new TexturedTrailVertex
|
||||||
{
|
{
|
||||||
Position = rotateAround(
|
Position = rotateAround(
|
||||||
new Vector2(part.Position.X + texture.DisplayWidth * (1 - originPosition.X) * part.Scale.X, part.Position.Y - texture.DisplayHeight * originPosition.Y * part.Scale.Y),
|
new Vector2(
|
||||||
|
part.Position.X + texture.DisplayWidth * (1 - originPosition.X) * part.Scale.X * cursorScale.X,
|
||||||
|
part.Position.Y - texture.DisplayHeight * originPosition.Y * part.Scale.Y * cursorScale.Y),
|
||||||
part.Position, sin, cos),
|
part.Position, sin, cos),
|
||||||
TexturePosition = textureRect.TopRight,
|
TexturePosition = textureRect.TopRight,
|
||||||
TextureRect = new Vector4(0, 0, 1, 1),
|
TextureRect = new Vector4(0, 0, 1, 1),
|
||||||
@@ -340,7 +360,9 @@ namespace osu.Game.Rulesets.Osu.UI.Cursor
|
|||||||
vertexBatch.Add(new TexturedTrailVertex
|
vertexBatch.Add(new TexturedTrailVertex
|
||||||
{
|
{
|
||||||
Position = rotateAround(
|
Position = rotateAround(
|
||||||
new Vector2(part.Position.X - texture.DisplayWidth * originPosition.X * part.Scale.X, part.Position.Y - texture.DisplayHeight * originPosition.Y * part.Scale.Y),
|
new Vector2(
|
||||||
|
part.Position.X - texture.DisplayWidth * originPosition.X * part.Scale.X * cursorScale.X,
|
||||||
|
part.Position.Y - texture.DisplayHeight * originPosition.Y * part.Scale.Y * cursorScale.Y),
|
||||||
part.Position, sin, cos),
|
part.Position, sin, cos),
|
||||||
TexturePosition = textureRect.TopLeft,
|
TexturePosition = textureRect.TopLeft,
|
||||||
TextureRect = new Vector4(0, 0, 1, 1),
|
TextureRect = new Vector4(0, 0, 1, 1),
|
||||||
|
|||||||
@@ -64,8 +64,14 @@ namespace osu.Game.Rulesets.Osu.UI.Cursor
|
|||||||
var newScale = new Vector2(e.NewValue);
|
var newScale = new Vector2(e.NewValue);
|
||||||
|
|
||||||
rippleVisualiser.CursorScale = newScale;
|
rippleVisualiser.CursorScale = newScale;
|
||||||
cursorTrail.Scale = newScale;
|
updateTrailScale();
|
||||||
}, true);
|
}, true);
|
||||||
|
cursorTrail.OnSkinChanged += updateTrailScale;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void updateTrailScale()
|
||||||
|
{
|
||||||
|
if (cursorTrail.Drawable is CursorTrail trail) trail.CursorScale = new Vector2(ActiveCursor.CursorScale.Value);
|
||||||
}
|
}
|
||||||
|
|
||||||
private int downCount;
|
private int downCount;
|
||||||
|
|||||||
@@ -3,7 +3,9 @@
|
|||||||
|
|
||||||
using osu.Framework.Allocation;
|
using osu.Framework.Allocation;
|
||||||
using osu.Framework.Graphics;
|
using osu.Framework.Graphics;
|
||||||
|
using osu.Framework.Graphics.UserInterface;
|
||||||
using osu.Framework.Localisation;
|
using osu.Framework.Localisation;
|
||||||
|
using osu.Game.Graphics.UserInterfaceV2;
|
||||||
using osu.Game.Localisation;
|
using osu.Game.Localisation;
|
||||||
using osu.Game.Overlays.Settings;
|
using osu.Game.Overlays.Settings;
|
||||||
using osu.Game.Rulesets.Osu.Configuration;
|
using osu.Game.Rulesets.Osu.Configuration;
|
||||||
@@ -27,32 +29,34 @@ namespace osu.Game.Rulesets.Osu.UI
|
|||||||
|
|
||||||
Children = new Drawable[]
|
Children = new Drawable[]
|
||||||
{
|
{
|
||||||
new SettingsCheckbox
|
new SettingsItemV2(new FormCheckBox
|
||||||
{
|
{
|
||||||
LabelText = RulesetSettingsStrings.SnakingInSliders,
|
Caption = RulesetSettingsStrings.SnakingInSliders,
|
||||||
Current = config.GetBindable<bool>(OsuRulesetSetting.SnakingInSliders)
|
Current = config.GetBindable<bool>(OsuRulesetSetting.SnakingInSliders)
|
||||||
},
|
}),
|
||||||
new SettingsCheckbox
|
new SettingsItemV2(new FormCheckBox
|
||||||
{
|
{
|
||||||
ClassicDefault = false,
|
Caption = RulesetSettingsStrings.SnakingOutSliders,
|
||||||
LabelText = RulesetSettingsStrings.SnakingOutSliders,
|
|
||||||
Current = config.GetBindable<bool>(OsuRulesetSetting.SnakingOutSliders)
|
Current = config.GetBindable<bool>(OsuRulesetSetting.SnakingOutSliders)
|
||||||
},
|
})
|
||||||
new SettingsCheckbox
|
|
||||||
{
|
{
|
||||||
LabelText = RulesetSettingsStrings.CursorTrail,
|
ApplyClassicDefault = c => ((IHasCurrentValue<bool>)c).Current.Value = false,
|
||||||
|
},
|
||||||
|
new SettingsItemV2(new FormCheckBox
|
||||||
|
{
|
||||||
|
Caption = RulesetSettingsStrings.CursorTrail,
|
||||||
Current = config.GetBindable<bool>(OsuRulesetSetting.ShowCursorTrail)
|
Current = config.GetBindable<bool>(OsuRulesetSetting.ShowCursorTrail)
|
||||||
},
|
}),
|
||||||
new SettingsCheckbox
|
new SettingsItemV2(new FormCheckBox
|
||||||
{
|
{
|
||||||
LabelText = RulesetSettingsStrings.CursorRipples,
|
Caption = RulesetSettingsStrings.CursorRipples,
|
||||||
Current = config.GetBindable<bool>(OsuRulesetSetting.ShowCursorRipples)
|
Current = config.GetBindable<bool>(OsuRulesetSetting.ShowCursorRipples)
|
||||||
},
|
}),
|
||||||
new SettingsEnumDropdown<PlayfieldBorderStyle>
|
new SettingsItemV2(new FormEnumDropdown<PlayfieldBorderStyle>
|
||||||
{
|
{
|
||||||
LabelText = RulesetSettingsStrings.PlayfieldBorderStyle,
|
Caption = RulesetSettingsStrings.PlayfieldBorderStyle,
|
||||||
Current = config.GetBindable<PlayfieldBorderStyle>(OsuRulesetSetting.PlayfieldBorderStyle),
|
Current = config.GetBindable<PlayfieldBorderStyle>(OsuRulesetSetting.PlayfieldBorderStyle),
|
||||||
},
|
}),
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -4,7 +4,6 @@
|
|||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using osu.Framework.Allocation;
|
using osu.Framework.Allocation;
|
||||||
using osu.Framework.Extensions.Color4Extensions;
|
|
||||||
using osu.Framework.Graphics.Lines;
|
using osu.Framework.Graphics.Lines;
|
||||||
using osu.Framework.Graphics.Performance;
|
using osu.Framework.Graphics.Performance;
|
||||||
using osu.Game.Graphics;
|
using osu.Game.Graphics;
|
||||||
@@ -12,7 +11,7 @@ using osuTK;
|
|||||||
|
|
||||||
namespace osu.Game.Rulesets.Osu.UI.ReplayAnalysis
|
namespace osu.Game.Rulesets.Osu.UI.ReplayAnalysis
|
||||||
{
|
{
|
||||||
public partial class CursorPathContainer : Path
|
public partial class CursorPathContainer : SmoothPath
|
||||||
{
|
{
|
||||||
private readonly LifetimeEntryManager lifetimeManager = new LifetimeEntryManager();
|
private readonly LifetimeEntryManager lifetimeManager = new LifetimeEntryManager();
|
||||||
private readonly SortedSet<AnalysisFrameEntry> aliveEntries = new SortedSet<AnalysisFrameEntry>(new AimLinePointComparator());
|
private readonly SortedSet<AnalysisFrameEntry> aliveEntries = new SortedSet<AnalysisFrameEntry>(new AimLinePointComparator());
|
||||||
@@ -22,14 +21,13 @@ namespace osu.Game.Rulesets.Osu.UI.ReplayAnalysis
|
|||||||
lifetimeManager.EntryBecameAlive += entryBecameAlive;
|
lifetimeManager.EntryBecameAlive += entryBecameAlive;
|
||||||
lifetimeManager.EntryBecameDead += entryBecameDead;
|
lifetimeManager.EntryBecameDead += entryBecameDead;
|
||||||
|
|
||||||
PathRadius = 0.5f;
|
PathRadius = 1f;
|
||||||
}
|
}
|
||||||
|
|
||||||
[BackgroundDependencyLoader]
|
[BackgroundDependencyLoader]
|
||||||
private void load(OsuColour colours)
|
private void load(OsuColour colours)
|
||||||
{
|
{
|
||||||
Colour = colours.Pink2;
|
Colour = colours.Pink2;
|
||||||
BackgroundColour = colours.Pink2.Opacity(0);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
protected override void Update()
|
protected override void Update()
|
||||||
|
|||||||
@@ -1,9 +1,9 @@
|
|||||||
// Copyright (c) ppy Pty Ltd <contact@ppy.sh>. Licensed under the MIT Licence.
|
// Copyright (c) ppy Pty Ltd <contact@ppy.sh>. Licensed under the MIT Licence.
|
||||||
// See the LICENCE file in the repository root for full licence text.
|
// See the LICENCE file in the repository root for full licence text.
|
||||||
|
|
||||||
using System;
|
using osu.Framework.Allocation;
|
||||||
using osu.Framework.Graphics;
|
|
||||||
using osu.Framework.Graphics.Containers;
|
using osu.Framework.Graphics.Containers;
|
||||||
|
using osu.Framework.Graphics.Pooling;
|
||||||
using osu.Framework.Input;
|
using osu.Framework.Input;
|
||||||
using osu.Framework.Input.Bindings;
|
using osu.Framework.Input.Bindings;
|
||||||
using osu.Framework.Input.Events;
|
using osu.Framework.Input.Events;
|
||||||
@@ -19,17 +19,24 @@ namespace osu.Game.Rulesets.Osu.UI
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public partial class SmokeContainer : Container, IRequireHighFrequencyMousePosition, IKeyBindingHandler<OsuAction>
|
public partial class SmokeContainer : Container, IRequireHighFrequencyMousePosition, IKeyBindingHandler<OsuAction>
|
||||||
{
|
{
|
||||||
|
private DrawablePool<SmokeSkinnableDrawable> segmentPool = null!;
|
||||||
private SmokeSkinnableDrawable? currentSegmentSkinnable;
|
private SmokeSkinnableDrawable? currentSegmentSkinnable;
|
||||||
|
|
||||||
private Vector2 lastMousePosition;
|
private Vector2 lastMousePosition;
|
||||||
|
|
||||||
public override bool ReceivePositionalInputAt(Vector2 _) => true;
|
public override bool ReceivePositionalInputAt(Vector2 _) => true;
|
||||||
|
|
||||||
|
[BackgroundDependencyLoader]
|
||||||
|
private void load()
|
||||||
|
{
|
||||||
|
AddInternal(segmentPool = new DrawablePool<SmokeSkinnableDrawable>(10));
|
||||||
|
}
|
||||||
|
|
||||||
public bool OnPressed(KeyBindingPressEvent<OsuAction> e)
|
public bool OnPressed(KeyBindingPressEvent<OsuAction> e)
|
||||||
{
|
{
|
||||||
if (e.Action == OsuAction.Smoke)
|
if (e.Action == OsuAction.Smoke)
|
||||||
{
|
{
|
||||||
AddInternal(currentSegmentSkinnable = new SmokeSkinnableDrawable(new OsuSkinComponentLookup(OsuSkinComponents.CursorSmoke), _ => new DefaultSmokeSegment()));
|
AddInternal(currentSegmentSkinnable = segmentPool.Get(segment => segment.Segment?.StartDrawing(Time.Current)));
|
||||||
|
|
||||||
// Add initial position immediately.
|
// Add initial position immediately.
|
||||||
addPosition();
|
addPosition();
|
||||||
@@ -59,17 +66,19 @@ namespace osu.Game.Rulesets.Osu.UI
|
|||||||
return base.OnMouseMove(e);
|
return base.OnMouseMove(e);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void addPosition() => (currentSegmentSkinnable?.Drawable as SmokeSegment)?.AddPosition(lastMousePosition, Time.Current);
|
private void addPosition() => currentSegmentSkinnable?.Segment?.AddPosition(lastMousePosition, Time.Current);
|
||||||
|
|
||||||
private partial class SmokeSkinnableDrawable : SkinnableDrawable
|
private partial class SmokeSkinnableDrawable : SkinnableDrawable
|
||||||
{
|
{
|
||||||
|
public SmokeSegment? Segment => Drawable as SmokeSegment;
|
||||||
|
|
||||||
public override bool RemoveWhenNotAlive => true;
|
public override bool RemoveWhenNotAlive => true;
|
||||||
|
|
||||||
public override double LifetimeStart => Drawable.LifetimeStart;
|
public override double LifetimeStart => Drawable.LifetimeStart;
|
||||||
public override double LifetimeEnd => Drawable.LifetimeEnd;
|
public override double LifetimeEnd => Drawable.LifetimeEnd;
|
||||||
|
|
||||||
public SmokeSkinnableDrawable(ISkinComponentLookup lookup, Func<ISkinComponentLookup, Drawable>? defaultImplementation = null, ConfineMode confineMode = ConfineMode.NoScaling)
|
public SmokeSkinnableDrawable()
|
||||||
: base(lookup, defaultImplementation, confineMode)
|
: base(new OsuSkinComponentLookup(OsuSkinComponents.CursorSmoke), _ => new DefaultSmokeSegment())
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -8,7 +8,7 @@
|
|||||||
|
|
||||||
<PropertyGroup Label="Nuget">
|
<PropertyGroup Label="Nuget">
|
||||||
<Title>osu! (ruleset)</Title>
|
<Title>osu! (ruleset)</Title>
|
||||||
<PackageId>ppy.osu.Game.Rulesets.Osu</PackageId>
|
<PackageId>jvnkosu.Client.Rulesets.Osu</PackageId>
|
||||||
<IsPackable>true</IsPackable>
|
<IsPackable>true</IsPackable>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
|
|||||||
@@ -35,8 +35,6 @@
|
|||||||
<string>UIInterfaceOrientationLandscapeRight</string>
|
<string>UIInterfaceOrientationLandscapeRight</string>
|
||||||
<string>UIInterfaceOrientationLandscapeLeft</string>
|
<string>UIInterfaceOrientationLandscapeLeft</string>
|
||||||
</array>
|
</array>
|
||||||
<key>XSAppIconAssets</key>
|
|
||||||
<string>Assets.xcassets/AppIcon.appiconset</string>
|
|
||||||
<key>UIApplicationSupportsIndirectInputEvents</key>
|
<key>UIApplicationSupportsIndirectInputEvents</key>
|
||||||
<true/>
|
<true/>
|
||||||
<key>CADisableMinimumFrameDurationOnPhone</key>
|
<key>CADisableMinimumFrameDurationOnPhone</key>
|
||||||
|
|||||||
@@ -28,7 +28,7 @@ namespace osu.Game.Rulesets.Taiko.Edit.Blueprints
|
|||||||
[Resolved]
|
[Resolved]
|
||||||
private TaikoHitObjectComposer? composer { get; set; }
|
private TaikoHitObjectComposer? composer { get; set; }
|
||||||
|
|
||||||
protected override bool IsValidForPlacement => Precision.DefinitelyBigger(spanPlacementObject.Duration, 0);
|
protected override bool IsValidForPlacement => base.IsValidForPlacement && (PlacementActive == PlacementState.Waiting || Precision.DefinitelyBigger(spanPlacementObject.Duration, 0));
|
||||||
|
|
||||||
public TaikoSpanPlacementBlueprint(HitObject hitObject)
|
public TaikoSpanPlacementBlueprint(HitObject hitObject)
|
||||||
: base(hitObject)
|
: base(hitObject)
|
||||||
|
|||||||
@@ -13,9 +13,9 @@ namespace osu.Game.Rulesets.Taiko.Edit.Checks
|
|||||||
protected override IEnumerable<(DifficultyRating rating, double thresholdMs, string name)> GetThresholds()
|
protected override IEnumerable<(DifficultyRating rating, double thresholdMs, string name)> GetThresholds()
|
||||||
{
|
{
|
||||||
// See lowest difficulty requirements in https://osu.ppy.sh/wiki/en/Ranking_criteria/osu%21taiko#general
|
// See lowest difficulty requirements in https://osu.ppy.sh/wiki/en/Ranking_criteria/osu%21taiko#general
|
||||||
yield return (DifficultyRating.Hard, new TimeSpan(0, 3, 30).TotalMilliseconds, "Muzukashii");
|
yield return (DifficultyRating.Hard, new TimeSpan(0, 2, 30).TotalMilliseconds, "Muzukashii");
|
||||||
yield return (DifficultyRating.Insane, new TimeSpan(0, 4, 15).TotalMilliseconds, "Oni");
|
yield return (DifficultyRating.Insane, new TimeSpan(0, 3, 15).TotalMilliseconds, "Oni");
|
||||||
yield return (DifficultyRating.Expert, new TimeSpan(0, 5, 0).TotalMilliseconds, "Inner Oni");
|
yield return (DifficultyRating.Expert, new TimeSpan(0, 4, 0).TotalMilliseconds, "Inner Oni");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -29,6 +29,7 @@ namespace osu.Game.Rulesets.Taiko.Mods
|
|||||||
public override IconUsage? Icon => OsuIcon.ModSingleTap;
|
public override IconUsage? Icon => OsuIcon.ModSingleTap;
|
||||||
public override LocalisableString Description => @"One key for dons, one key for kats.";
|
public override LocalisableString Description => @"One key for dons, one key for kats.";
|
||||||
|
|
||||||
|
public override bool Ranked => true;
|
||||||
public override double ScoreMultiplier => 1.0;
|
public override double ScoreMultiplier => 1.0;
|
||||||
public override Type[] IncompatibleMods => new[] { typeof(ModAutoplay), typeof(ModRelax), typeof(TaikoModCinema) };
|
public override Type[] IncompatibleMods => new[] { typeof(ModAutoplay), typeof(ModRelax), typeof(TaikoModCinema) };
|
||||||
public override ModType Type => ModType.Conversion;
|
public override ModType Type => ModType.Conversion;
|
||||||
|
|||||||
@@ -22,6 +22,7 @@ namespace osu.Game.Rulesets.Taiko.Mods
|
|||||||
public override ModType Type => ModType.Conversion;
|
public override ModType Type => ModType.Conversion;
|
||||||
public override double ScoreMultiplier => 1;
|
public override double ScoreMultiplier => 1;
|
||||||
public override Type[] IncompatibleMods => base.IncompatibleMods.Append(typeof(ModRandom)).ToArray();
|
public override Type[] IncompatibleMods => base.IncompatibleMods.Append(typeof(ModRandom)).ToArray();
|
||||||
|
public override bool Ranked => true;
|
||||||
|
|
||||||
public void ApplyToBeatmap(IBeatmap beatmap)
|
public void ApplyToBeatmap(IBeatmap beatmap)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -40,6 +40,7 @@ namespace osu.Game.Rulesets.Taiko.Objects.Drawables
|
|||||||
private int rollingHits;
|
private int rollingHits;
|
||||||
|
|
||||||
private readonly Container tickContainer;
|
private readonly Container tickContainer;
|
||||||
|
private SkinnableDrawable headPiece;
|
||||||
|
|
||||||
private Color4 colourIdle;
|
private Color4 colourIdle;
|
||||||
private Color4 colourEngaged;
|
private Color4 colourEngaged;
|
||||||
@@ -59,7 +60,7 @@ namespace osu.Game.Rulesets.Taiko.Objects.Drawables
|
|||||||
Content.Add(tickContainer = new Container
|
Content.Add(tickContainer = new Container
|
||||||
{
|
{
|
||||||
RelativeSizeAxes = Axes.Both,
|
RelativeSizeAxes = Axes.Both,
|
||||||
Depth = float.MinValue
|
Depth = -1,
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -79,7 +80,13 @@ namespace osu.Game.Rulesets.Taiko.Objects.Drawables
|
|||||||
|
|
||||||
protected override void RecreatePieces()
|
protected override void RecreatePieces()
|
||||||
{
|
{
|
||||||
|
if (headPiece != null)
|
||||||
|
Content.Remove(headPiece, true);
|
||||||
|
|
||||||
base.RecreatePieces();
|
base.RecreatePieces();
|
||||||
|
|
||||||
|
Content.Add(headPiece = createHeadPiece());
|
||||||
|
|
||||||
updateColour();
|
updateColour();
|
||||||
Height = HitObject.IsStrong ? TaikoStrongableHitObject.DEFAULT_STRONG_SIZE : TaikoHitObject.DEFAULT_SIZE;
|
Height = HitObject.IsStrong ? TaikoStrongableHitObject.DEFAULT_STRONG_SIZE : TaikoHitObject.DEFAULT_SIZE;
|
||||||
}
|
}
|
||||||
@@ -122,6 +129,12 @@ namespace osu.Game.Rulesets.Taiko.Objects.Drawables
|
|||||||
protected override SkinnableDrawable CreateMainPiece() => new SkinnableDrawable(new TaikoSkinComponentLookup(TaikoSkinComponents.DrumRollBody),
|
protected override SkinnableDrawable CreateMainPiece() => new SkinnableDrawable(new TaikoSkinComponentLookup(TaikoSkinComponents.DrumRollBody),
|
||||||
_ => new ElongatedCirclePiece());
|
_ => new ElongatedCirclePiece());
|
||||||
|
|
||||||
|
private SkinnableDrawable createHeadPiece() => new SkinnableDrawable(new TaikoSkinComponentLookup(TaikoSkinComponents.DrumRollHead), _ => Empty())
|
||||||
|
{
|
||||||
|
RelativeSizeAxes = Axes.Y,
|
||||||
|
Depth = -2,
|
||||||
|
};
|
||||||
|
|
||||||
public override bool OnPressed(KeyBindingPressEvent<TaikoAction> e) => false;
|
public override bool OnPressed(KeyBindingPressEvent<TaikoAction> e) => false;
|
||||||
|
|
||||||
private void onNewResult(DrawableHitObject obj, JudgementResult result)
|
private void onNewResult(DrawableHitObject obj, JudgementResult result)
|
||||||
@@ -174,7 +187,23 @@ namespace osu.Game.Rulesets.Taiko.Objects.Drawables
|
|||||||
private void updateColour(double fadeDuration = 0)
|
private void updateColour(double fadeDuration = 0)
|
||||||
{
|
{
|
||||||
Color4 newColour = Interpolation.ValueAt((float)rollingHits / rolling_hits_for_engaged_colour, colourIdle, colourEngaged, 0, 1);
|
Color4 newColour = Interpolation.ValueAt((float)rollingHits / rolling_hits_for_engaged_colour, colourIdle, colourEngaged, 0, 1);
|
||||||
|
|
||||||
|
if (fadeDuration == 0)
|
||||||
|
{
|
||||||
|
// fade duration is 0 when calling via `RecreatePieces()`.
|
||||||
|
// in this case we want to apply the colour *without* using transforms.
|
||||||
|
// using transforms may result in the application of colour being undone via `DrawableHitObject.UpdateState()` clearing transforms.
|
||||||
|
if (MainPiece.Drawable is IHasAccentColour mainPieceWithAccentColour)
|
||||||
|
mainPieceWithAccentColour.AccentColour = newColour;
|
||||||
|
|
||||||
|
if (headPiece.Drawable is IHasAccentColour headPieceWithAccentColour)
|
||||||
|
headPieceWithAccentColour.AccentColour = newColour;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
(MainPiece.Drawable as IHasAccentColour)?.FadeAccent(newColour, fadeDuration);
|
(MainPiece.Drawable as IHasAccentColour)?.FadeAccent(newColour, fadeDuration);
|
||||||
|
(headPiece.Drawable as IHasAccentColour)?.FadeAccent(newColour, fadeDuration);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public partial class StrongNestedHit : DrawableStrongNestedHit
|
public partial class StrongNestedHit : DrawableStrongNestedHit
|
||||||
|
|||||||
@@ -51,6 +51,9 @@ namespace osu.Game.Rulesets.Taiko.Skinning.Argon
|
|||||||
spectatorList.Anchor = Anchor.BottomLeft;
|
spectatorList.Anchor = Anchor.BottomLeft;
|
||||||
spectatorList.Origin = Anchor.TopLeft;
|
spectatorList.Origin = Anchor.TopLeft;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
foreach (var d in container.OfType<ISerialisableDrawable>())
|
||||||
|
d.UsesFixedAnchor = true;
|
||||||
})
|
})
|
||||||
{
|
{
|
||||||
RelativeSizeAxes = Axes.Both,
|
RelativeSizeAxes = Axes.Both,
|
||||||
|
|||||||
@@ -51,6 +51,9 @@ namespace osu.Game.Rulesets.Taiko.Skinning.Default
|
|||||||
spectatorList.Origin = Anchor.TopLeft;
|
spectatorList.Origin = Anchor.TopLeft;
|
||||||
spectatorList.Position = new Vector2(320, -280);
|
spectatorList.Position = new Vector2(320, -280);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
foreach (var d in container.OfType<ISerialisableDrawable>())
|
||||||
|
d.UsesFixedAnchor = true;
|
||||||
})
|
})
|
||||||
{
|
{
|
||||||
RelativeSizeAxes = Axes.Both,
|
RelativeSizeAxes = Axes.Both,
|
||||||
|
|||||||
@@ -1,7 +1,6 @@
|
|||||||
// Copyright (c) ppy Pty Ltd <contact@ppy.sh>. Licensed under the MIT Licence.
|
// Copyright (c) ppy Pty Ltd <contact@ppy.sh>. Licensed under the MIT Licence.
|
||||||
// See the LICENCE file in the repository root for full licence text.
|
// See the LICENCE file in the repository root for full licence text.
|
||||||
|
|
||||||
using System;
|
|
||||||
using osu.Framework.Allocation;
|
using osu.Framework.Allocation;
|
||||||
using osu.Framework.Graphics;
|
using osu.Framework.Graphics;
|
||||||
using osu.Framework.Graphics.Containers;
|
using osu.Framework.Graphics.Containers;
|
||||||
@@ -21,14 +20,10 @@ namespace osu.Game.Rulesets.Taiko.Skinning.Legacy
|
|||||||
{
|
{
|
||||||
get
|
get
|
||||||
{
|
{
|
||||||
// the reason why this calculation is so involved is that the head & tail sprites have different sizes/radii.
|
var headCentre = (body.ScreenSpaceDrawQuad.TopLeft + body.ScreenSpaceDrawQuad.BottomLeft) / 2;
|
||||||
// therefore naively taking the SSDQs of them and making a quad out of them results in a trapezoid shape and not a box.
|
|
||||||
var headCentre = headCircle.ScreenSpaceDrawQuad.Centre;
|
|
||||||
var tailCentre = (tailCircle.ScreenSpaceDrawQuad.TopLeft + tailCircle.ScreenSpaceDrawQuad.BottomLeft) / 2;
|
var tailCentre = (tailCircle.ScreenSpaceDrawQuad.TopLeft + tailCircle.ScreenSpaceDrawQuad.BottomLeft) / 2;
|
||||||
|
|
||||||
float headRadius = headCircle.ScreenSpaceDrawQuad.Height / 2;
|
float radius = body.ScreenSpaceDrawQuad.Height / 2;
|
||||||
float tailRadius = tailCircle.ScreenSpaceDrawQuad.Height / 2;
|
|
||||||
float radius = Math.Max(headRadius, tailRadius);
|
|
||||||
|
|
||||||
var rectangle = new RectangleF(headCentre.X, headCentre.Y, tailCentre.X - headCentre.X, 0).Inflate(radius);
|
var rectangle = new RectangleF(headCentre.X, headCentre.Y, tailCentre.X - headCentre.X, 0).Inflate(radius);
|
||||||
return new Quad(rectangle.TopLeft, rectangle.TopRight, rectangle.BottomLeft, rectangle.BottomRight);
|
return new Quad(rectangle.TopLeft, rectangle.TopRight, rectangle.BottomLeft, rectangle.BottomRight);
|
||||||
@@ -37,8 +32,6 @@ namespace osu.Game.Rulesets.Taiko.Skinning.Legacy
|
|||||||
|
|
||||||
public override bool ReceivePositionalInputAt(Vector2 screenSpacePos) => ScreenSpaceDrawQuad.Contains(screenSpacePos);
|
public override bool ReceivePositionalInputAt(Vector2 screenSpacePos) => ScreenSpaceDrawQuad.Contains(screenSpacePos);
|
||||||
|
|
||||||
private LegacyCirclePiece headCircle = null!;
|
|
||||||
|
|
||||||
private Sprite body = null!;
|
private Sprite body = null!;
|
||||||
|
|
||||||
private Sprite tailCircle = null!;
|
private Sprite tailCircle = null!;
|
||||||
@@ -66,10 +59,6 @@ namespace osu.Game.Rulesets.Taiko.Skinning.Legacy
|
|||||||
RelativeSizeAxes = Axes.Both,
|
RelativeSizeAxes = Axes.Both,
|
||||||
Texture = skin.GetTexture("taiko-roll-middle", WrapMode.ClampToEdge, WrapMode.ClampToEdge),
|
Texture = skin.GetTexture("taiko-roll-middle", WrapMode.ClampToEdge, WrapMode.ClampToEdge),
|
||||||
},
|
},
|
||||||
headCircle = new LegacyCirclePiece
|
|
||||||
{
|
|
||||||
RelativeSizeAxes = Axes.Y,
|
|
||||||
},
|
|
||||||
};
|
};
|
||||||
|
|
||||||
AccentColour = colours.YellowDark;
|
AccentColour = colours.YellowDark;
|
||||||
@@ -101,7 +90,6 @@ namespace osu.Game.Rulesets.Taiko.Skinning.Legacy
|
|||||||
{
|
{
|
||||||
var colour = LegacyColourCompatibility.DisallowZeroAlpha(accentColour);
|
var colour = LegacyColourCompatibility.DisallowZeroAlpha(accentColour);
|
||||||
|
|
||||||
headCircle.AccentColour = colour;
|
|
||||||
body.Colour = colour;
|
body.Colour = colour;
|
||||||
tailCircle.Colour = colour;
|
tailCircle.Colour = colour;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -79,6 +79,9 @@ namespace osu.Game.Rulesets.Taiko.Skinning.Legacy
|
|||||||
spectatorList.Origin = Anchor.TopLeft;
|
spectatorList.Origin = Anchor.TopLeft;
|
||||||
spectatorList.Position = pos;
|
spectatorList.Position = pos;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
foreach (var d in container.OfType<ISerialisableDrawable>())
|
||||||
|
d.UsesFixedAnchor = true;
|
||||||
})
|
})
|
||||||
{
|
{
|
||||||
new LegacyDefaultComboCounter(),
|
new LegacyDefaultComboCounter(),
|
||||||
@@ -103,6 +106,12 @@ namespace osu.Game.Rulesets.Taiko.Skinning.Legacy
|
|||||||
{
|
{
|
||||||
switch (taikoComponent.Component)
|
switch (taikoComponent.Component)
|
||||||
{
|
{
|
||||||
|
case TaikoSkinComponents.DrumRollHead:
|
||||||
|
if (GetTexture("taiko-roll-middle") != null)
|
||||||
|
return new LegacyCirclePiece();
|
||||||
|
|
||||||
|
return null;
|
||||||
|
|
||||||
case TaikoSkinComponents.DrumRollBody:
|
case TaikoSkinComponents.DrumRollBody:
|
||||||
if (GetTexture("taiko-roll-middle") != null)
|
if (GetTexture("taiko-roll-middle") != null)
|
||||||
return new LegacyDrumRoll();
|
return new LegacyDrumRoll();
|
||||||
|
|||||||
@@ -222,15 +222,18 @@ namespace osu.Game.Rulesets.Taiko
|
|||||||
|
|
||||||
public override RulesetSettingsSubsection CreateSettings() => new TaikoSettingsSubsection(this);
|
public override RulesetSettingsSubsection CreateSettings() => new TaikoSettingsSubsection(this);
|
||||||
|
|
||||||
protected override IEnumerable<HitResult> GetValidHitResults()
|
public override IEnumerable<HitResult> GetValidHitResults()
|
||||||
{
|
{
|
||||||
return new[]
|
return new[]
|
||||||
{
|
{
|
||||||
HitResult.Great,
|
HitResult.Great,
|
||||||
HitResult.Ok,
|
HitResult.Ok,
|
||||||
|
HitResult.Miss,
|
||||||
|
|
||||||
HitResult.SmallBonus,
|
HitResult.SmallBonus,
|
||||||
HitResult.LargeBonus,
|
HitResult.LargeBonus,
|
||||||
|
HitResult.IgnoreHit,
|
||||||
|
HitResult.IgnoreMiss,
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user