diff --git a/Docs/Changelog_SSCformat.txt b/Docs/Changelog_SSCformat.txt index 45901aaabb..721673f31d 100644 --- a/Docs/Changelog_SSCformat.txt +++ b/Docs/Changelog_SSCformat.txt @@ -9,6 +9,14 @@ change to JSON, but it is unsure if this will be done. Implement .ssc at your own risk. ________________________________________________________________________________ +[v0.76] - Wolfman2000 +* Expand the #COMBOS tag to allow for Miss Combos. Anyone that is crazy enough + to put in a 51 miss combo in their tags should be...oh wait: it's already + been done. + +[v0.75] - Wolfman2000 +* Add Step based #DISPLAYBPM for those songs that have...very varied syncing. + [v0.74] - Wolfman2000 * Add #CHARTNAME tag for the title of the chart. * Older files will have their #DESCRIPTION tag content copied to #CHARTNAME diff --git a/Docs/Changelog_sm5.txt b/Docs/Changelog_sm5.txt index a0b6007429..73015cca56 100644 --- a/Docs/Changelog_sm5.txt +++ b/Docs/Changelog_sm5.txt @@ -8,6 +8,17 @@ ________________________________________________________________________________ StepMania 5.0 ????????? | 20110??? -------------------------------------------------------------------------------- +2011/07/09 +---------- +* [NotesTheUsual] Update the #COMBOS tag to allow for a Miss Combo attribute. + Any files that only use the Combo attribute will have that value copied to + miss combo on next launch. [Wolfman2000] +* [ScoreKeeperNormal] Better match #COMBOS with eval. Scoring formulas should + not be affected, but it may require more testing. [Wolfman2000] +* [Metrics] Have Pump mode lump the checkpoint judgments with Flawless and + Miss judgments on eval. Of course, this goes down to Perfect and Miss if + that is disabled. [Wolfman2000] + 2011/07/07 ---------- * [ScreenEdit] Fix the NoMines transformation bug, issue 363. [Wolfman2000] diff --git a/Songs/StepMania 5/MechaTribe Assault/Mecha-Tribe Assault.ssc b/Songs/StepMania 5/MechaTribe Assault/Mecha-Tribe Assault.ssc index 6e799ec8de..2731a8a654 100644 --- a/Songs/StepMania 5/MechaTribe Assault/Mecha-Tribe Assault.ssc +++ b/Songs/StepMania 5/MechaTribe Assault/Mecha-Tribe Assault.ssc @@ -1,4 +1,4 @@ -#VERSION:0.73; +#VERSION:0.76; #TITLE:Mecha-Tribe Assault; #SUBTITLE:; #ARTIST:Kommisar; @@ -57,10 +57,11 @@ #KEYSOUNDS:; #ATTACKS:; -//---------------dance-single - Wyde---------------- +//---------------dance-single - ---------------- #NOTEDATA:; +#CHARTNAME:Wyde: #STEPSTYPE:dance-single; -#DESCRIPTION:Wyde; +#DESCRIPTION:; #CHARTSTYLE:; #DIFFICULTY:Challenge; #METER:11; @@ -1012,10 +1013,11 @@ M000 0000 ; -//---------------dance-single - Wyde---------------- +//---------------dance-single - ---------------- #NOTEDATA:; +#CHARTNAME:Wyde: #STEPSTYPE:dance-single; -#DESCRIPTION:Wyde; +#DESCRIPTION:; #CHARTSTYLE:; #DIFFICULTY:Hard; #METER:10; @@ -1859,10 +1861,11 @@ M100 0000 ; -//---------------dance-single - Wyde---------------- +//---------------dance-single - ---------------- #NOTEDATA:; +#CHARTNAME:Wyde: #STEPSTYPE:dance-single; -#DESCRIPTION:Wyde; +#DESCRIPTION:; #CHARTSTYLE:; #DIFFICULTY:Medium; #METER:8; @@ -2530,10 +2533,11 @@ M100 0000 ; -//---------------dance-single - Wyde---------------- +//---------------dance-single - ---------------- #NOTEDATA:; +#CHARTNAME:Wyde: #STEPSTYPE:dance-single; -#DESCRIPTION:Wyde; +#DESCRIPTION:; #CHARTSTYLE:; #DIFFICULTY:Easy; #METER:6; @@ -3113,10 +3117,11 @@ M100 0000 ; -//---------------dance-single - Wyde---------------- +//---------------dance-single - ---------------- #NOTEDATA:; +#CHARTNAME:Wyde: #STEPSTYPE:dance-single; -#DESCRIPTION:Wyde; +#DESCRIPTION:; #CHARTSTYLE:; #DIFFICULTY:Beginner; #METER:2; @@ -3548,10 +3553,11 @@ M100 M00M ; -//---------------dance-solo - Hard---------------- +//---------------dance-solo - ---------------- #NOTEDATA:; +#CHARTNAME:Hard: #STEPSTYPE:dance-solo; -#DESCRIPTION:Hard; +#DESCRIPTION:; #CHARTSTYLE:Pad; #DIFFICULTY:Hard; #METER:10; @@ -4416,10 +4422,11 @@ MMMMMM 000000 ; -//---------------pump-single - Vin.il---------------- +//---------------pump-single - ---------------- #NOTEDATA:; +#CHARTNAME:Vin.il: #STEPSTYPE:pump-single; -#DESCRIPTION:Vin.il; +#DESCRIPTION:; #CHARTSTYLE:Pad; #DIFFICULTY:Hard; #METER:19; @@ -4436,7 +4443,7 @@ MMMMMM #TICKCOUNTS:0.000000=4 ,303.500000=16 ; -#COMBOS:0.000000=1 +#COMBOS:0.000000=2 ; #SPEEDS:0.000000=1.000000=0.000000=0 ,76.000000=0.500000=0.375000=0 @@ -5470,10 +5477,11 @@ M0000 00000 ; -//---------------pump-single - Vin.il---------------- +//---------------pump-single - ---------------- #NOTEDATA:; +#CHARTNAME:Vin.il: #STEPSTYPE:pump-single; -#DESCRIPTION:Vin.il; +#DESCRIPTION:; #CHARTSTYLE:Pad; #DIFFICULTY:Medium; #METER:13; @@ -5529,27 +5537,26 @@ M0000 #ATTACKS: ; #NOTES: -// measure 0 00000 00000 00000 00000 -, // measure 1 +, 00000 00000 00000 00000 -, // measure 2 +, 00000 00000 00000 00000 -, // measure 3 +, 00000 00000 00000 00000 -, // measure 4 +, 00110 00000 00010 @@ -5558,7 +5565,7 @@ M0000 00000 10000 10001 -, // measure 5 +, 00000 10001 00000 @@ -5567,7 +5574,7 @@ M0000 01001 00000 00000 -, // measure 6 +, 01100 00000 01000 @@ -5576,7 +5583,7 @@ M0000 00000 00001 10001 -, // measure 7 +, 00000 10001 00000 @@ -5585,7 +5592,7 @@ M0000 10010 00000 00000 -, // measure 8 +, 10100 00000 10000 @@ -5594,7 +5601,7 @@ M0000 00000 00010 01010 -, // measure 9 +, 00000 01010 00000 @@ -5603,7 +5610,7 @@ M0000 01001 00000 00000 -, // measure 10 +, 00101 00000 00001 @@ -5612,7 +5619,7 @@ M0000 00000 01000 01010 -, // measure 11 +, 00000 01010 00000 @@ -5621,7 +5628,7 @@ M0000 10010 00000 00000 -, // measure 12 +, 10100 10000 00001 @@ -5630,7 +5637,7 @@ M0000 00001 01000 01100 -, // measure 13 +, 00000 00000 01010 @@ -5647,7 +5654,7 @@ M0000 00000 00100 00001 -, // measure 14 +, 01000 01000 00010 @@ -5656,7 +5663,7 @@ M0000 00010 10000 10100 -, // measure 15 +, 00000 00000 10001 @@ -5673,7 +5680,7 @@ M0000 00000 00100 00010 -, // measure 16 +, 10000 00100 10000 @@ -5682,7 +5689,7 @@ M0000 00001 00100 01001 -, // measure 17 +, 00100 00000 01001 @@ -5699,7 +5706,7 @@ M0000 00000 00100 00001 -, // measure 18 +, 01000 00100 01000 @@ -5708,7 +5715,7 @@ M0000 00010 00100 10010 -, // measure 19 +, 01001 00000 00000 @@ -5725,7 +5732,7 @@ M0000 00000 00100 00000 -, // measure 20 +, 10001 00001 00000 @@ -5734,7 +5741,7 @@ M0000 00010 00100 00001 -, // measure 21 +, 10001 00000 10000 @@ -5751,7 +5758,7 @@ M0000 10000 00010 00000 -, // measure 22 +, 01010 00000 01000 @@ -5768,7 +5775,7 @@ M0000 00000 00010 00000 -, // measure 23 +, 01010 00000 00010 @@ -5785,7 +5792,7 @@ M0000 00010 01000 00000 -, // measure 24 +, 01010 01000 00000 @@ -5794,7 +5801,7 @@ M0000 10000 00100 01000 -, // measure 25 +, 01010 00000 00010 @@ -5811,7 +5818,7 @@ M0000 00010 10000 00000 -, // measure 26 +, 10001 00000 00001 @@ -5828,7 +5835,7 @@ M0000 00000 10000 00000 -, // measure 27 +, 10001 00000 00000 @@ -5845,7 +5852,7 @@ M0000 00000 00100 00000 -, // measure 28 +, 10010 10000 10001 @@ -5854,7 +5861,7 @@ M0000 00000 00100 00000 -, // measure 29 +, 10010 10000 10001 @@ -5863,7 +5870,7 @@ M0000 00000 00100 00000 -, // measure 30 +, 01001 01000 01010 @@ -5872,7 +5879,7 @@ M0000 00000 00100 00000 -, // measure 31 +, 01001 00100 01010 @@ -5881,7 +5888,7 @@ M0000 10100 10001 00101 -, // measure 32 +, 10001 00001 01001 @@ -5890,7 +5897,7 @@ M0000 00000 00100 00000 -, // measure 33 +, 10001 00001 01001 @@ -5899,7 +5906,7 @@ M0000 00000 00100 00000 -, // measure 34 +, 01010 00010 10010 @@ -5908,7 +5915,7 @@ M0000 00000 00100 00000 -, // measure 35 +, 01010 00100 10010 @@ -5917,7 +5924,7 @@ M0000 01001 01010 10010 -, // measure 36 +, 20001 00100 30100 @@ -5926,7 +5933,7 @@ M0000 30100 20001 00100 -, // measure 37 +, 30100 20001 00100 @@ -5935,7 +5942,7 @@ M0000 30100 20001 30100 -, // measure 38 +, 10002 00100 00103 @@ -5944,7 +5951,7 @@ M0000 00103 10002 00100 -, // measure 39 +, 00103 00000 00001 @@ -5961,7 +5968,7 @@ M0000 01000 00010 00000 -, // measure 40 +, 01020 00100 00130 @@ -5970,7 +5977,7 @@ M0000 00130 01020 00100 -, // measure 41 +, 00130 01020 00100 @@ -5979,7 +5986,7 @@ M0000 00130 01020 00130 -, // measure 42 +, 02010 00100 03100 @@ -5988,7 +5995,7 @@ M0000 03100 02010 00100 -, // measure 43 +, 03100 00000 01000 @@ -6005,7 +6012,7 @@ M0000 00001 10000 00000 -, // measure 44 +, 00001 00100 00001 @@ -6022,7 +6029,7 @@ M0000 00000 10000 00000 -, // measure 45 +, 00010 00100 00010 @@ -6039,7 +6046,7 @@ M0000 00000 10000 00000 -, // measure 46 +, 00010 01000 00010 @@ -6056,7 +6063,7 @@ M0000 00000 10000 00000 -, // measure 47 +, 10001 00001 00101 @@ -6065,7 +6072,7 @@ M0000 00010 00110 01010 -, // measure 48 +, 01000 00100 01000 @@ -6082,7 +6089,7 @@ M0000 00000 00010 00000 -, // measure 49 +, 10000 00100 10000 @@ -6099,7 +6106,7 @@ M0000 00000 00010 00000 -, // measure 50 +, 10000 00001 10000 @@ -6116,7 +6123,7 @@ M0000 00000 00010 00000 -, // measure 51 +, 01010 01000 01100 @@ -6125,12 +6132,12 @@ M0000 10000 10100 10001 -, // measure 52 +, 00102 00103 20100 30020 -, // measure 53 +, 02030 00000 03100 @@ -6139,7 +6146,7 @@ M0000 00000 10030 10001 -, // measure 54 +, 20001 30000 10001 @@ -6148,12 +6155,12 @@ M0000 00003 02000 03000 -, // measure 55 +, 00020 00130 02000 03100 -, // measure 56 +, 02010 00100 03100 @@ -6162,7 +6169,7 @@ M0000 00100 00130 10010 -, // measure 57 +, 20010 00100 30100 @@ -6171,7 +6178,7 @@ M0000 00100 00130 10001 -, // measure 58 +, 10002 00100 00103 @@ -6180,7 +6187,7 @@ M0000 00100 30100 01001 -, // measure 59 +, 01002 00000 00100 @@ -6197,12 +6204,12 @@ M0000 00000 00010 01000 -, // measure 60 +, 00100 10100 10001 00101 -, // measure 61 +, 20002 00000 00000 @@ -6211,7 +6218,7 @@ M0000 00000 01010 00000 -, // measure 62 +, 02001 03000 02001 @@ -6220,7 +6227,7 @@ M0000 03000 01020 00030 -, // measure 63 +, 20010 30000 20010 @@ -6229,7 +6236,7 @@ M0000 00003 01002 00003 -, // measure 64 +, 00200 00310 00200 @@ -6238,7 +6245,7 @@ M0000 01300 00200 10300 -, // measure 65 +, 00020 00130 02000 @@ -6247,7 +6254,7 @@ M0000 00103 20000 30100 -, // measure 66 +, 01002 00103 00102 @@ -6256,7 +6263,7 @@ M0000 30100 20100 30010 -, // measure 67 +, 10020 00130 00120 @@ -6265,17 +6272,17 @@ M0000 03001 01002 00100 -, // measure 68 +, 20000 00000 00000 00000 -, // measure 69 +, 00000 00000 00000 00003 -, // measure 70 +, 00200 00000 00000 @@ -6284,27 +6291,27 @@ M0000 00000 02000 00300 -, // measure 71 +, 00002 03000 20000 00003 -, // measure 72 +, 00002 00000 00000 00000 -, // measure 73 +, 00000 00000 00000 00000 -, // measure 74 +, 00000 00000 00000 00000 -, // measure 75 +, 00000 00000 00000 @@ -6321,32 +6328,33 @@ M0000 30003 20002 00000 -, // measure 76 +, 00000 00000 00000 00000 -, // measure 77 +, 00000 00000 00000 00000 -, // measure 78 +, 00000 00000 00000 00000 -, // measure 79 +, 30003 00000 00000 00000 ; -//---------------pump-single - Vin.il---------------- +//---------------pump-single - ---------------- #NOTEDATA:; +#CHARTNAME:Vin.il: #STEPSTYPE:pump-single; -#DESCRIPTION:Vin.il; +#DESCRIPTION:; #CHARTSTYLE:Pad; #DIFFICULTY:Easy; #METER:6; @@ -6448,29 +6456,29 @@ M0000 ,288.000000=Verse 9B ,304.000000=Fin ; -#ATTACKS:; +#ATTACKS: +; #NOTES: -// measure 0 00000 00000 00000 00000 -, // measure 1 +, 00000 00000 00000 00000 -, // measure 2 +, 00000 00000 00000 00000 -, // measure 3 +, 00000 00000 00000 00000 -, // measure 4 +, 10000 00000 00000 @@ -6479,7 +6487,7 @@ M0000 00000 00000 01000 -, // measure 5 +, 00000 01001 00000 @@ -6488,7 +6496,7 @@ M0000 00001 00000 00000 -, // measure 6 +, 10000 00000 00000 @@ -6497,7 +6505,7 @@ M0000 00000 00000 01000 -, // measure 7 +, 00000 01001 00000 @@ -6506,7 +6514,7 @@ M0000 00001 00000 00000 -, // measure 8 +, 10000 00000 00000 @@ -6515,7 +6523,7 @@ M0000 00000 00000 00001 -, // measure 9 +, 00000 01001 00000 @@ -6524,7 +6532,7 @@ M0000 00100 00000 00000 -, // measure 10 +, 00001 00000 00000 @@ -6533,7 +6541,7 @@ M0000 00000 00000 10000 -, // measure 11 +, 00000 10010 00000 @@ -6542,7 +6550,7 @@ M0000 00100 00000 00000 -, // measure 12 +, 00001 00100 00000 @@ -6551,7 +6559,7 @@ M0000 10000 00000 00001 -, // measure 13 +, 00000 00101 00000 @@ -6560,7 +6568,7 @@ M0000 01001 00000 00000 -, // measure 14 +, 10000 00100 00000 @@ -6569,7 +6577,7 @@ M0000 00001 00000 10000 -, // measure 15 +, 00000 10100 00000 @@ -6578,7 +6586,7 @@ M0000 10010 00000 00000 -, // measure 16 +, 00010 00100 00000 @@ -6587,7 +6595,7 @@ M0000 01000 00000 00010 -, // measure 17 +, 00000 00110 00000 @@ -6596,7 +6604,7 @@ M0000 10010 00000 00000 -, // measure 18 +, 01000 00100 00000 @@ -6605,7 +6613,7 @@ M0000 00010 00000 01000 -, // measure 19 +, 00001 00000 00000 @@ -6614,7 +6622,7 @@ M0000 00000 10000 00010 -, // measure 20 +, 01000 00001 00000 @@ -6623,7 +6631,7 @@ M0000 00010 00000 10000 -, // measure 21 +, 00001 01000 00000 @@ -6632,7 +6640,7 @@ M0000 10000 00000 00010 -, // measure 22 +, 00100 00001 00000 @@ -6641,7 +6649,7 @@ M0000 00010 00000 10000 -, // measure 23 +, 00100 01000 00000 @@ -6650,7 +6658,7 @@ M0000 10000 00000 00010 -, // measure 24 +, 10000 00010 00000 @@ -6659,7 +6667,7 @@ M0000 00001 00000 01000 -, // measure 25 +, 00010 10000 00000 @@ -6668,7 +6676,7 @@ M0000 01000 00000 00001 -, // measure 26 +, 00100 00010 00000 @@ -6677,7 +6685,7 @@ M0000 00001 00000 01000 -, // measure 27 +, 00010 00000 00000 @@ -6686,47 +6694,47 @@ M0000 00000 01000 00001 -, // measure 28 +, 10000 10100 10000 00001 -, // measure 29 +, 10000 10100 10000 00001 -, // measure 30 +, 01000 01100 01000 00001 -, // measure 31 +, 01000 01100 00010 00110 -, // measure 32 +, 10000 10100 10000 00001 -, // measure 33 +, 10000 10100 10000 00001 -, // measure 34 +, 01000 01100 01000 00001 -, // measure 35 +, 01000 01100 00010 00110 -, // measure 36 +, 10000 00100 00000 @@ -6735,7 +6743,7 @@ M0000 00000 10000 00100 -, // measure 37 +, 00000 10000 00100 @@ -6744,7 +6752,7 @@ M0000 00001 00100 00000 -, // measure 38 +, 00001 00100 00000 @@ -6753,12 +6761,12 @@ M0000 00000 00001 00100 -, // measure 39 +, 00001 01001 10000 10010 -, // measure 40 +, 00010 00100 00000 @@ -6767,7 +6775,7 @@ M0000 00000 00010 00100 -, // measure 41 +, 00000 00010 00100 @@ -6776,7 +6784,7 @@ M0000 01000 00100 00000 -, // measure 42 +, 01000 00100 00000 @@ -6785,12 +6793,12 @@ M0000 00000 01000 00100 -, // measure 43 +, 01000 01001 00010 10010 -, // measure 44 +, 10000 00001 00100 @@ -6799,7 +6807,7 @@ M0000 10000 00100 00000 -, // measure 45 +, 10000 00001 00100 @@ -6808,7 +6816,7 @@ M0000 10000 00100 00000 -, // measure 46 +, 01000 00010 00100 @@ -6817,12 +6825,12 @@ M0000 01000 00100 00000 -, // measure 47 +, 01010 00001 10000 00001 -, // measure 48 +, 01000 00010 00100 @@ -6831,7 +6839,7 @@ M0000 01000 00100 00000 -, // measure 49 +, 01000 00010 00100 @@ -6840,7 +6848,7 @@ M0000 01000 00100 00000 -, // measure 50 +, 10000 00001 00100 @@ -6849,7 +6857,7 @@ M0000 10000 00100 00000 -, // measure 51 +, 20002 00000 00000 @@ -6858,122 +6866,122 @@ M0000 00000 00000 30003 -, // measure 52 +, 10001 00101 10001 10100 -, // measure 53 +, 10001 01001 10001 10010 -, // measure 54 +, 01010 01010 10001 10001 -, // measure 55 +, 01010 01010 10001 10001 -, // measure 56 +, 01010 01100 01010 00110 -, // measure 57 +, 01010 01001 01010 10010 -, // measure 58 +, 10001 10001 01010 01010 -, // measure 59 +, 10001 10001 01010 01010 -, // measure 60 +, 20001 00000 30002 00000 -, // measure 61 +, 20003 00000 30020 00000 -, // measure 62 +, 02030 00000 00000 00000 -, // measure 63 +, 03020 00000 00000 00000 -, // measure 64 +, 20030 00000 00000 00000 -, // measure 65 +, 30002 00000 00000 00000 -, // measure 66 +, 02003 00000 00000 00000 -, // measure 67 +, 03020 00000 00000 00000 -, // measure 68 +, 20030 00000 00000 00000 -, // measure 69 +, 00000 00000 00000 00000 -, // measure 70 +, 30002 00000 00000 02003 -, // measure 71 +, 03020 00000 00230 00000 -, // measure 72 +, 00302 00000 00000 00000 -, // measure 73 +, 00000 00000 00000 00000 -, // measure 74 +, 00000 00000 00000 00000 -, // measure 75 +, 00000 00000 00000 @@ -6982,22 +6990,22 @@ M0000 00000 00000 20000 -, // measure 76 +, 00000 00000 00000 00000 -, // measure 77 +, 00000 00000 00000 00000 -, // measure 78 +, 00000 00000 00000 00000 -, // measure 79 +, 30003 00000 00000 diff --git a/Themes/_fallback/Fonts/frutiger 24px [polish-stroke] 8x2.png b/Themes/_fallback/Fonts/frutiger 24px [polish-stroke] 8x2.png new file mode 100644 index 0000000000..fae305f37f Binary files /dev/null and b/Themes/_fallback/Fonts/frutiger 24px [polish-stroke] 8x2.png differ diff --git a/Themes/_fallback/Fonts/frutiger 24px [polish] 8x2.png b/Themes/_fallback/Fonts/frutiger 24px [polish] 8x2.png new file mode 100644 index 0000000000..0ed3c843c3 Binary files /dev/null and b/Themes/_fallback/Fonts/frutiger 24px [polish] 8x2.png differ diff --git a/Themes/_fallback/Fonts/frutiger 24px.ini b/Themes/_fallback/Fonts/frutiger 24px.ini index 702c8cd9cd..988bc39672 100644 --- a/Themes/_fallback/Fonts/frutiger 24px.ini +++ b/Themes/_fallback/Fonts/frutiger 24px.ini @@ -261,6 +261,7 @@ AdvanceExtraPixels=0 253=12 254=15 255=12 + [alt] 0=10 1=10 @@ -390,3 +391,28 @@ AdvanceExtraPixels=0 125=12 126=6 127=7 + +[polish] +Baseline=23 +Top=6 + +line 0=ĄĆĘŁŃŚŹŻ +line 1=ąćęłńśźż + +0=15 +1=10 +2=12 +3=12 +4=12 +5=12 +6=13 +7=13 + +8=11 +9=11 +10=11 +11=6 +12=11 +13=10 +14=10 +15=10 \ No newline at end of file diff --git a/Themes/_fallback/Languages/en.ini b/Themes/_fallback/Languages/en.ini index 4c4ce22126..834ce4d93c 100644 --- a/Themes/_fallback/Languages/en.ini +++ b/Themes/_fallback/Languages/en.ini @@ -1236,6 +1236,7 @@ Write Profiles=Write Profiles off=off on=on or=or +Zoom In Camera=Zoom In Camera [ScreenEdit] %s notes=%s notes @@ -1248,7 +1249,7 @@ Enter a new Stop value.=Enter a new Stop value.\n\nType "0" to remove. Enter a new Delay value.=Enter a new Delay value.\n\nType "0" to remove. Enter a new Time Signature.=Enter a new time signature.\nUse the format "x/y".\nEnter the previous value to remove. Enter a new Tickcount value.=Enter a new Tickcount value.\n\nEnter the previous value to remove. -Enter a new Combo value.=Enter a new Combo value.\n\nEnter the previous value to remove. +Enter a new Combo value.=Enter a new Combo value.\nUse the format "x/y".\nEnter the previous value to remove. Enter a new Label value.=Enter a name for this section of the chart.\n\nEnter a previously used label to remove. Enter a new Warp value.=Enter the number of beats you will warp over.\n\nType "0" to remove this segment. Enter a new Speed percent value.=Enter the ratio for speed scrolling.\nEnter the previous value to remove.\n1 is the default scroll. diff --git a/Themes/_fallback/Scripts/03 Gameplay.lua b/Themes/_fallback/Scripts/03 Gameplay.lua index 90dcc7c88a..3fd0d83e4b 100644 --- a/Themes/_fallback/Scripts/03 Gameplay.lua +++ b/Themes/_fallback/Scripts/03 Gameplay.lua @@ -105,6 +105,10 @@ function ComboPerRow() end end +function EvalUsesCheckpointsWithJudgments() + return (GAMESTATE:GetCurrentGame():GetName() == "pump") and true or false +end + -- these need cleanup really. function HitCombo() sGame = GAMESTATE:GetCurrentGame():GetName() diff --git a/Themes/_fallback/metrics.ini b/Themes/_fallback/metrics.ini index 3a9db0d6ab..ad995db105 100644 --- a/Themes/_fallback/metrics.ini +++ b/Themes/_fallback/metrics.ini @@ -3226,7 +3226,7 @@ PrevScreen=Branch.AfterEvaluation() LightsMode="LightsMode_MenuStartOnly" # Summary=false -CheckpointsWithJudgments=false +CheckpointsWithJudgments=EvalUsesCheckpointsWithJudgments() # TimerSeconds=20 # diff --git a/Themes/default/metrics.ini b/Themes/default/metrics.ini index dc1c427c1e..5b83cf0ef7 100644 --- a/Themes/default/metrics.ini +++ b/Themes/default/metrics.ini @@ -70,8 +70,6 @@ NumberOnCommand=y,240-216-1.5;shadowlength,1;horizalign,right;vertalign,bottom;s LabelOnCommand=x,6;y,22.5;shadowlength,1;zoom,0.75;diffusebottomedge,color("0.75,0.75,0.75,1");horizalign,left;vertalign,bottom [HoldJudgment] -HoldJudgmentLetGoCommand=finishtweening;shadowlength,0;diffusealpha,1;zoom,1;y,-10;linear,0.8;y,10;sleep,0.5;linear,0.1;zoomy,0.5;zoomx,2;diffusealpha,0 -HoldJudgmentHeldCommand=finishtweening;shadowlength,0;diffusealpha,1;zoom,1.25;linear,0.3;zoomx,1;zoomy,1;sleep,0.5;linear,0.1;zoomy,0.5;zoomx,2;diffusealpha,0 [HelpDisplay] TipShowTime=7 @@ -1512,7 +1510,7 @@ ShowJudgmentLineW2=true ShowJudgmentLineW3=true ShowJudgmentLineW4=true ShowJudgmentLineW5=true -ShowJudgmentLineHeld=true +ShowJudgmentLineHeld=(GAMESTATE:GetCurrentGame():GetName() ~= "pump") ShowJudgmentLineMiss=true ShowJudgmentLineMaxCombo=true ShowGradeArea=true diff --git a/Xcode/scripts/mkrelease.pl b/Xcode/scripts/mkrelease.pl index c3580425e9..210cf52fdf 100644 --- a/Xcode/scripts/mkrelease.pl +++ b/Xcode/scripts/mkrelease.pl @@ -9,7 +9,9 @@ use Cwd; my @docs = ( "Licenses.txt", + "Changelog_sm5.txt", "Changelog_sm-ssc.txt", + "Changelog_SSCformat.txt", "CommandLineArgs.txt", "credits.txt", "Themerdocs/" diff --git a/Xcode/stepmania.xcodeproj/project.pbxproj b/Xcode/stepmania.xcodeproj/project.pbxproj index a3bdafb716..94d0a52ab5 100644 --- a/Xcode/stepmania.xcodeproj/project.pbxproj +++ b/Xcode/stepmania.xcodeproj/project.pbxproj @@ -7896,6 +7896,7 @@ buildSettings = { CONFIGURATION_BUILD_DIR = "$(SYMROOT)"; FULL_NAME = "$(PRODUCT_NAME).$(WRAPPER_EXTENSION)"; + GCC_AUTO_VECTORIZATION = NO; GCC_ENABLE_SSE3_EXTENSIONS = NO; GCC_INLINES_ARE_PRIVATE_EXTERN = NO; GCC_PREFIX_HEADER = "$(SRCROOT)/../src/archutils/Darwin/StepMania.pch"; @@ -8605,6 +8606,7 @@ COPY_PHASE_STRIP = NO; DEBUG_INFORMATION_FORMAT = stabs; FULL_NAME = "$(PRODUCT_NAME).$(WRAPPER_EXTENSION)"; + GCC_AUTO_VECTORIZATION = NO; GCC_ENABLE_SSE3_EXTENSIONS = NO; GCC_GENERATE_DEBUGGING_SYMBOLS = YES; GCC_INLINES_ARE_PRIVATE_EXTERN = NO; @@ -8853,7 +8855,9 @@ buildSettings = { CONFIGURATION_BUILD_DIR = "$(SYMROOT)"; FULL_NAME = "$(PRODUCT_NAME).$(WRAPPER_EXTENSION)"; - GCC_ENABLE_SSE3_EXTENSIONS = NO; + GCC_AUTO_VECTORIZATION = YES; + GCC_ENABLE_SSE3_EXTENSIONS = YES; + GCC_ENABLE_SUPPLEMENTAL_SSE3_INSTRUCTIONS = YES; GCC_PREFIX_HEADER = "$(SRCROOT)/../src/archutils/Darwin/StepMania.pch"; GCC_SYMBOLS_PRIVATE_EXTERN = NO; GCC_VERSION = com.apple.compilers.llvm.clang.1_0; @@ -8982,7 +8986,9 @@ buildSettings = { CONFIGURATION_BUILD_DIR = "$(SYMROOT)"; FULL_NAME = "$(PRODUCT_NAME).$(WRAPPER_EXTENSION)"; + GCC_AUTO_VECTORIZATION = NO; GCC_ENABLE_OBJC_EXCEPTIONS = NO; + GCC_ENABLE_SSE3_EXTENSIONS = NO; GCC_PREFIX_HEADER = "$(SRCROOT)/../src/archutils/Darwin/StepMania.pch"; GCC_SYMBOLS_PRIVATE_EXTERN = NO; GCC_VERSION = com.apple.compilers.llvm.clang.1_0; diff --git a/_assets/fonts/frutiger 24px [polish-stroke] 8x2.psd b/_assets/fonts/frutiger 24px [polish-stroke] 8x2.psd new file mode 100644 index 0000000000..da93af035a Binary files /dev/null and b/_assets/fonts/frutiger 24px [polish-stroke] 8x2.psd differ diff --git a/_assets/fonts/frutiger 24px [polish] 8x2.psd b/_assets/fonts/frutiger 24px [polish] 8x2.psd new file mode 100644 index 0000000000..7d8c554687 Binary files /dev/null and b/_assets/fonts/frutiger 24px [polish] 8x2.psd differ diff --git a/src/ModIconRow.cpp b/src/ModIconRow.cpp index d77bed655b..7ecf1ce320 100644 --- a/src/ModIconRow.cpp +++ b/src/ModIconRow.cpp @@ -68,18 +68,13 @@ void ModIconRow::HandleMessage( const Message &msg ) struct OptionColumnEntry { - char *szString; + const char *szString; int iSlotIndex; //void FromStack( lua_State *L, int iPos ); }; // todo: metric these? -aj -/* - * May be a good idea to do so at some point. GCC gives plenty of warnings - * About the code below, something about turning string constants into - * char * items. Gotta love the many compilers we use. -Wolfman2000 - */ static const OptionColumnEntry g_OptionColumnEntries[] = { {"Boost", 0}, diff --git a/src/MusicWheelItem.cpp b/src/MusicWheelItem.cpp index c7ad0fb3c3..5bde9a78a1 100644 --- a/src/MusicWheelItem.cpp +++ b/src/MusicWheelItem.cpp @@ -170,6 +170,10 @@ MusicWheelItem::MusicWheelItem( const MusicWheelItem &cpy ): MusicWheelItem::~MusicWheelItem() { + FOREACH_ENUM( MusicWheelItemType, i ) + { + SAFE_DELETE(m_pText[i]); + } delete m_pTextSectionCount; } diff --git a/src/NoteField.cpp b/src/NoteField.cpp index 3acfb3ea5e..952f6466c4 100644 --- a/src/NoteField.cpp +++ b/src/NoteField.cpp @@ -577,7 +577,7 @@ void NoteField::DrawTickcountText( const float fBeat, int iTicks ) m_textMeasureNumber.Draw(); } -void NoteField::DrawComboText( const float fBeat, int iCombo ) +void NoteField::DrawComboText( const float fBeat, int iCombo, int iMiss ) { const float fYOffset = ArrowEffects::GetYOffset( m_pPlayerState, 0, fBeat ); const float fYPos = ArrowEffects::GetYPos( m_pPlayerState, 0, fYOffset, m_fYReverseOffsetPixels ); @@ -589,7 +589,7 @@ void NoteField::DrawComboText( const float fBeat, int iCombo ) m_textMeasureNumber.SetHorizAlign( COMBO_IS_LEFT_SIDE ? align_right : align_left ); m_textMeasureNumber.SetDiffuse( COMBO_COLOR ); m_textMeasureNumber.SetGlow( RageColor(1,1,1,RageFastCos(RageTimer::GetTimeSinceStartFast()*2)/2+0.5f) ); - m_textMeasureNumber.SetText( ssprintf("%d", iCombo) ); + m_textMeasureNumber.SetText( ssprintf("%d/%d", iCombo, iMiss) ); m_textMeasureNumber.SetXY( (COMBO_IS_LEFT_SIDE ? -xBase - xOffset : xBase + xOffset), fYPos ); m_textMeasureNumber.Draw(); } @@ -981,7 +981,7 @@ void NoteField::DrawPrimitives() { float fBeat = seg->GetBeat(); if( IS_ON_SCREEN(fBeat) ) - DrawComboText( fBeat, seg->GetCombo() ); + DrawComboText( fBeat, seg->GetCombo(), seg->GetMissCombo() ); } } } diff --git a/src/NoteField.h b/src/NoteField.h index 3357eff284..2deb044350 100644 --- a/src/NoteField.h +++ b/src/NoteField.h @@ -62,7 +62,7 @@ protected: void DrawWarpText( const float fBeat, const float fNewBeat ); void DrawTimeSignatureText( const float fBeat, int iNumerator, int iDenominator ); void DrawTickcountText( const float fBeat, int iTicks ); - void DrawComboText( const float fBeat, int iCombo ); + void DrawComboText( const float fBeat, int iCombo, int iMiss ); void DrawLabelText( const float fBeat, RString sLabel ); void DrawSpeedText( const float fBeat, float fPercent, float fWait, unsigned short usMode ); void DrawScrollText( const float fBeat, float fPercent ); diff --git a/src/NotesLoaderKSF.cpp b/src/NotesLoaderKSF.cpp index 3ad22bfbc4..32971b9774 100644 --- a/src/NotesLoaderKSF.cpp +++ b/src/NotesLoaderKSF.cpp @@ -378,7 +378,7 @@ static bool LoadFromKSFFile( const RString &sPath, Steps &out, const Song &song, else if (BeginsWith(sRowString, "|M") || BeginsWith(sRowString, "|C")) { // multipliers/combo - stepsTiming.SetComboAtBeat( fCurBeat, static_cast(numTemp) ); + stepsTiming.SetHitComboAtBeat( fCurBeat, static_cast(numTemp) ); } else if (BeginsWith(sRowString, "|S")) { diff --git a/src/NotesLoaderSMA.cpp b/src/NotesLoaderSMA.cpp index 05db8d42b0..a47b639350 100644 --- a/src/NotesLoaderSMA.cpp +++ b/src/NotesLoaderSMA.cpp @@ -23,17 +23,22 @@ void SMALoader::ProcessMultipliers( TimingData &out, const int iRowsPerBeat, con { vector arrayMultiplierValues; split( arrayMultiplierExpressions[f], "=", arrayMultiplierValues ); - if( arrayMultiplierValues.size() != 2 ) + unsigned size = arrayMultiplierValues.size(); + if( size < 2 ) { LOG->UserLog("Song file", this->GetSongTitle(), - "has an invalid #MULTIPLIER value \"%s\" (must have exactly one '='), ignored.", + "has an invalid #MULTIPLIER value \"%s\" (must have at least one '='), ignored.", arrayMultiplierExpressions[f].c_str() ); continue; } const float fComboBeat = RowToBeat( arrayMultiplierValues[0], iRowsPerBeat ); - const int iCombos = StringToInt( arrayMultiplierValues[1] ); - ComboSegment new_seg( fComboBeat, iCombos ); + const int iCombos = StringToInt( arrayMultiplierValues[1] ); // always true. + // hoping I'm right here: SMA files can use 6 values after the row/beat. + const int iMisses = (size == 2 || size == 4 ? + iCombos : + StringToInt(arrayMultiplierValues[2])); + ComboSegment new_seg( fComboBeat, iCombos, iMisses ); out.AddComboSegment( new_seg ); } } diff --git a/src/NotesLoaderSSC.cpp b/src/NotesLoaderSSC.cpp index 0073198195..83c249d579 100644 --- a/src/NotesLoaderSSC.cpp +++ b/src/NotesLoaderSSC.cpp @@ -94,17 +94,19 @@ void SSCLoader::ProcessCombos( TimingData &out, const RString line, const int ro { vector arrayComboValues; split( arrayComboExpressions[f], "=", arrayComboValues ); - if( arrayComboValues.size() != 2 ) + unsigned size = arrayComboValues.size(); + if( size < 2 ) { LOG->UserLog("Song file", this->GetSongTitle(), - "has an invalid #COMBOS value \"%s\" (must have exactly one '='), ignored.", + "has an invalid #COMBOS value \"%s\" (must have at least one '='), ignored.", arrayComboExpressions[f].c_str() ); continue; } const float fComboBeat = StringToFloat( arrayComboValues[0] ); const int iCombos = StringToInt( arrayComboValues[1] ); - ComboSegment new_seg( fComboBeat, iCombos ); + const int iMisses = (size == 2 ? iCombos : StringToInt(arrayComboValues[2])); + ComboSegment new_seg( fComboBeat, iCombos, iMisses ); out.AddComboSegment( new_seg ); } } diff --git a/src/NotesWriterSSC.cpp b/src/NotesWriterSSC.cpp index 70578ee0dd..d9edfb1946 100644 --- a/src/NotesWriterSSC.cpp +++ b/src/NotesWriterSSC.cpp @@ -128,7 +128,12 @@ static void GetTimingTags( vector &lines, TimingData timing, bool bIsSo ASSERT( !timing.m_ComboSegments.empty() ); w.Init( "COMBOS" ); FOREACH_CONST( ComboSegment, timing.m_ComboSegments, cs ) - w.Write( cs->GetRow(), cs->GetCombo() ); + { + if (cs->GetCombo() == cs->GetMissCombo()) + w.Write( cs->GetRow(), cs->GetCombo() ); + else + w.Write( cs->GetRow(), cs->GetCombo(), cs->GetMissCombo() ); + } w.Finish(); // Song Timing should only have the initial value. diff --git a/src/RageLog.cpp b/src/RageLog.cpp index 5c517f209e..8e619766a8 100644 --- a/src/RageLog.cpp +++ b/src/RageLog.cpp @@ -262,7 +262,7 @@ void RageLog::Write( int where, const RString &sLine ) sStr.insert( 0, sWarning ); if( m_bShowLogOutput || (where&WRITE_TO_INFO) ) - puts( sStr ); + puts(sStr); //fputws( (const wchar_t *)sStr.c_str(), stdout ); if( where & WRITE_TO_INFO ) AddToInfo( sStr ); if( m_bLogToDisk && (where&WRITE_TO_INFO) && g_fileInfo->IsOpen() ) diff --git a/src/RageTexture.cpp b/src/RageTexture.cpp index b049ba159d..0d9e17fd90 100644 --- a/src/RageTexture.cpp +++ b/src/RageTexture.cpp @@ -7,7 +7,7 @@ RageTexture::RageTexture( RageTextureID name ): - m_ID(name), m_iRefCount(1), m_bWasUsed(false), + m_iRefCount(1), m_bWasUsed(false), m_ID(name), m_iSourceWidth(0), m_iSourceHeight(0), m_iTextureWidth(0), m_iTextureHeight(0), m_iImageWidth(0), m_iImageHeight(0), diff --git a/src/ScoreKeeperNormal.cpp b/src/ScoreKeeperNormal.cpp index d5b3494a5f..07b2cbd213 100644 --- a/src/ScoreKeeperNormal.cpp +++ b/src/ScoreKeeperNormal.cpp @@ -416,18 +416,32 @@ void ScoreKeeperNormal::HandleTapScore( const TapNote &tn ) void ScoreKeeperNormal::HandleHoldCheckpointScore( const NoteData &nd, int iRow, int iNumHoldsHeldThisRow, int iNumHoldsMissedThisRow ) { - HandleTapNoteScoreInternal( iNumHoldsMissedThisRow == 0? TNS_CheckpointHit:TNS_CheckpointMiss, TNS_CheckpointHit ); + HandleTapNoteScoreInternal(iNumHoldsMissedThisRow == 0 ? TNS_CheckpointHit:TNS_CheckpointMiss, + TNS_CheckpointHit, iRow); HandleComboInternal( iNumHoldsHeldThisRow, 0, iNumHoldsMissedThisRow, iRow ); } -void ScoreKeeperNormal::HandleTapNoteScoreInternal( TapNoteScore tns, TapNoteScore maximum ) +void ScoreKeeperNormal::HandleTapNoteScoreInternal( TapNoteScore tns, TapNoteScore maximum, int row ) { // Update dance points. if( !m_pPlayerStageStats->m_bFailed ) m_pPlayerStageStats->m_iActualDancePoints += TapNoteScoreToDancePoints( tns ); - // update judged row totals - m_pPlayerStageStats->m_iTapNoteScores[tns] += 1; + // update judged row totals. Respect Combo segments here. + TimingData &td = GAMESTATE->m_pCurSteps[m_pPlayerState->m_PlayerNumber]->m_Timing; + ComboSegment &cs = td.GetComboSegmentAtRow(row); + if (tns == TNS_CheckpointHit || tns >= m_MinScoreToContinueCombo) + { + m_pPlayerStageStats->m_iTapNoteScores[tns] += cs.GetCombo(); + } + else if (tns == TNS_CheckpointMiss || tns < m_MinScoreToMaintainCombo) + { + m_pPlayerStageStats->m_iTapNoteScores[tns] += cs.GetMissCombo(); + } + else + { + m_pPlayerStageStats->m_iTapNoteScores[tns] += 1; + } // increment the current total possible dance score m_pPlayerStageStats->m_iCurPossibleDancePoints += TapNoteScoreToDancePoints( maximum ); @@ -447,17 +461,17 @@ void ScoreKeeperNormal::HandleComboInternal( int iNumHitContinueCombo, int iNumH { m_pPlayerStageStats->m_iCurMissCombo = 0; } - + TimingData td = GAMESTATE->m_pCurSteps[m_pPlayerState->m_PlayerNumber]->m_Timing; if( iNumBreakCombo == 0 ) { - TimingData td = GAMESTATE->m_pCurSteps[m_pPlayerState->m_PlayerNumber]->m_Timing; int multiplier = ( iRow == -1 ? 1 : td.GetComboSegmentAtRow( iRow ).GetCombo() ); m_pPlayerStageStats->m_iCurCombo += iNumHitContinueCombo * multiplier; } else { m_pPlayerStageStats->m_iCurCombo = 0; - m_pPlayerStageStats->m_iCurMissCombo += ( m_MissComboIsPerRow ? 1 : iNumBreakCombo ); + int multiplier = ( iRow == -1 ? 1 : td.GetComboSegmentAtRow(iRow).GetMissCombo()); + m_pPlayerStageStats->m_iCurMissCombo += ( m_MissComboIsPerRow ? 1 : iNumBreakCombo ) * multiplier; } } @@ -467,10 +481,10 @@ void ScoreKeeperNormal::HandleRowComboInternal( TapNoteScore tns, int iNumTapsIn { iNumTapsInRow = min( iNumTapsInRow, 1); } + TimingData td = GAMESTATE->m_pCurSteps[m_pPlayerState->m_PlayerNumber]->m_Timing; if ( tns >= m_MinScoreToContinueCombo ) { m_pPlayerStageStats->m_iCurMissCombo = 0; - TimingData td = GAMESTATE->m_pCurSteps[m_pPlayerState->m_PlayerNumber]->m_Timing; int multiplier = ( iRow == -1 ? 1 : td.GetComboSegmentAtRow( iRow ).GetCombo() ); m_pPlayerStageStats->m_iCurCombo += iNumTapsInRow * multiplier; } @@ -479,7 +493,10 @@ void ScoreKeeperNormal::HandleRowComboInternal( TapNoteScore tns, int iNumTapsIn m_pPlayerStageStats->m_iCurCombo = 0; if( tns <= m_MaxScoreToIncrementMissCombo ) - m_pPlayerStageStats->m_iCurMissCombo += ( m_MissComboIsPerRow ? 1 : iNumTapsInRow ); + { + int multiplier = ( iRow == -1 ? 1 : td.GetComboSegmentAtRow(iRow).GetMissCombo()); + m_pPlayerStageStats->m_iCurMissCombo += ( m_MissComboIsPerRow ? 1 : iNumTapsInRow ) * multiplier; + } } } @@ -516,7 +533,7 @@ void ScoreKeeperNormal::HandleTapRowScore( const NoteData &nd, int iRow ) m_iNumNotesHitThisRow = iNumTapsInRow; TapNoteScore scoreOfLastTap = NoteDataWithScoring::LastTapNoteWithResult( nd, iRow ).result.tns; - HandleTapNoteScoreInternal( scoreOfLastTap, TNS_W1 ); + HandleTapNoteScoreInternal( scoreOfLastTap, TNS_W1, iRow ); if ( GAMESTATE->GetCurrentGame()->m_bCountNotesSeparately ) { diff --git a/src/ScoreKeeperNormal.h b/src/ScoreKeeperNormal.h index 9c9ab104bc..81a314a499 100644 --- a/src/ScoreKeeperNormal.h +++ b/src/ScoreKeeperNormal.h @@ -90,7 +90,12 @@ public: static int HoldNoteScoreToGradePoints( HoldNoteScore hns, bool bBeginner ); private: - void HandleTapNoteScoreInternal( TapNoteScore tns, TapNoteScore maximum ); + /** + * @brief Take care of some internal work with our scoring systems. + * @param tns the Tap Note score earned. + * @param maximum the best tap note score possible. + * @param row the row the score was earned. Mainly for ComboSegment stuff. */ + void HandleTapNoteScoreInternal( TapNoteScore tns, TapNoteScore maximum, int row ); void HandleComboInternal( int iNumHitContinueCombo, int iNumHitMaintainCombo, int iNumBreakCombo, int iRow = -1 ); void HandleRowComboInternal( TapNoteScore tns, int iNumTapsInRow, int iRow = -1 ); void GetRowCounts( const NoteData &nd, int iRow, int &iNumHitContinueCombo, int &iNumHitMaintainCombo, int &iNumBreakCombo ); diff --git a/src/ScreenDebugOverlay.cpp b/src/ScreenDebugOverlay.cpp index dd8a50b27b..e6c731fa2c 100644 --- a/src/ScreenDebugOverlay.cpp +++ b/src/ScreenDebugOverlay.cpp @@ -196,8 +196,8 @@ void ScreenDebugOverlay::Init() g_Mappings.debugButton[i++] = DeviceInput(DEVICE_KEYBOARD, KEY_Cq); g_Mappings.debugButton[i++] = DeviceInput(DEVICE_KEYBOARD, KEY_Cw); g_Mappings.debugButton[i++] = DeviceInput(DEVICE_KEYBOARD, KEY_Ce); - g_Mappings.debugButton[i++] = DeviceInput(DEVICE_KEYBOARD, KEY_Ct); g_Mappings.debugButton[i++] = DeviceInput(DEVICE_KEYBOARD, KEY_Cr); + g_Mappings.debugButton[i++] = DeviceInput(DEVICE_KEYBOARD, KEY_Ct); g_Mappings.debugButton[i++] = DeviceInput(DEVICE_KEYBOARD, KEY_Cy); g_Mappings.debugButton[i++] = DeviceInput(DEVICE_KEYBOARD, KEY_Cu); g_Mappings.debugButton[i++] = DeviceInput(DEVICE_KEYBOARD, KEY_Ci); @@ -1226,10 +1226,10 @@ DECLARE_ONE( DebugLineWritePreferences ); DECLARE_ONE( DebugLineMenuTimer ); DECLARE_ONE( DebugLineFlushLog ); DECLARE_ONE( DebugLinePullBackCamera ); -DECLARE_ONE( DebugLineVolumeUp ); DECLARE_ONE( DebugLineVolumeDown ); -DECLARE_ONE( DebugLineVisualDelayUp ); +DECLARE_ONE( DebugLineVolumeUp ); DECLARE_ONE( DebugLineVisualDelayDown ); +DECLARE_ONE( DebugLineVisualDelayUp ); DECLARE_ONE( DebugLineForceCrash ); DECLARE_ONE( DebugLineUptime ); diff --git a/src/ScreenEdit.cpp b/src/ScreenEdit.cpp index c9f872448a..6009c77d02 100644 --- a/src/ScreenEdit.cpp +++ b/src/ScreenEdit.cpp @@ -3006,10 +3006,10 @@ void ScreenEdit::HandleScreenMessage( const ScreenMessage SM ) } else if ( SM == SM_BackFromComboChange && !ScreenTextEntry::s_bCancelledLast ) { - int iCombo = StringToInt( ScreenTextEntry::s_sLastAnswer ); - if ( iCombo >= 0 ) + int iCombo, iMiss; + if (sscanf(ScreenTextEntry::s_sLastAnswer.c_str(), " %d / %d ", &iCombo, &iMiss) == 2) { - GetAppropriateTiming().SetComboAtBeat( GetBeat(), iCombo ); + GetAppropriateTiming().SetComboAtBeat( GetBeat(), iCombo, iMiss ); } SetDirty( true ); } @@ -3587,10 +3587,14 @@ void ScreenEdit::DisplayTimingMenu() g_TimingDataInformation.rows[bpm].SetOneUnthemedChoice( ssprintf("%.6f", pTime.GetBPMAtBeat( fBeat ) ) ); g_TimingDataInformation.rows[stop].SetOneUnthemedChoice( ssprintf("%.6f", pTime.GetStopAtBeat( fBeat ) ) ) ; g_TimingDataInformation.rows[delay].SetOneUnthemedChoice( ssprintf("%.6f", pTime.GetDelayAtBeat( fBeat ) ) ); - g_TimingDataInformation.rows[time_signature].SetOneUnthemedChoice( ssprintf("%d / %d", pTime.GetTimeSignatureNumeratorAtBeat( fBeat ), pTime.GetTimeSignatureDenominatorAtBeat( fBeat ) ) ); + g_TimingDataInformation.rows[time_signature].SetOneUnthemedChoice(ssprintf("%d / %d", + pTime.GetTimeSignatureNumeratorAtBeat( fBeat ), + pTime.GetTimeSignatureDenominatorAtBeat( fBeat ) ) ); g_TimingDataInformation.rows[label].SetOneUnthemedChoice( pTime.GetLabelAtBeat( fBeat ).c_str() ); g_TimingDataInformation.rows[tickcount].SetOneUnthemedChoice( ssprintf("%d", pTime.GetTickcountAtBeat( fBeat ) ) ); - g_TimingDataInformation.rows[combo].SetOneUnthemedChoice( ssprintf("%d", pTime.GetComboAtBeat( fBeat ) ) ); + g_TimingDataInformation.rows[combo].SetOneUnthemedChoice( ssprintf("%d / %d", + pTime.GetComboAtBeat( fBeat ), + pTime.GetMissComboAtBeat( fBeat ) ) ); g_TimingDataInformation.rows[warp].SetOneUnthemedChoice( ssprintf("%.6f", pTime.GetWarpAtBeat( fBeat ) ) ); g_TimingDataInformation.rows[speed_percent].SetOneUnthemedChoice( bHasSpeedOnThisRow ? ssprintf("%.6f", pTime.GetSpeedPercentAtBeat( fBeat ) ) : "---" ); g_TimingDataInformation.rows[speed_wait].SetOneUnthemedChoice( bHasSpeedOnThisRow ? ssprintf("%.6f", pTime.GetSpeedWaitAtBeat( fBeat ) ) : "---" ); @@ -4566,13 +4570,16 @@ void ScreenEdit::HandleTimingDataInformationChoice( TimingDataInformationChoice ); break; case combo: - ScreenTextEntry::TextEntry( - SM_BackFromComboChange, - ENTER_COMBO_VALUE, - ssprintf( "%d", GetAppropriateTiming().GetComboAtBeat( GetBeat() ) ), - 4 - ); - break; + { + ComboSegment &cs = GetAppropriateTiming().GetComboSegmentAtBeat(GetBeat()); + ScreenTextEntry::TextEntry(SM_BackFromComboChange, + ENTER_COMBO_VALUE, + ssprintf( "%d/%d", + cs.GetCombo(), + cs.GetMissCombo()), + 7); + break; + } case label: ScreenTextEntry::TextEntry( SM_BackFromLabelChange, diff --git a/src/Song.cpp b/src/Song.cpp index 04e7f1fdff..7ec55849c0 100644 --- a/src/Song.cpp +++ b/src/Song.cpp @@ -41,7 +41,7 @@ * @brief The internal version of the cache for StepMania. * * Increment this value to invalidate the current cache. */ -const int FILE_CACHE_VERSION = 189; +const int FILE_CACHE_VERSION = 190; /** @brief How long does a song sample last by default? */ const float DEFAULT_MUSIC_SAMPLE_LENGTH = 12.f; diff --git a/src/Song.h b/src/Song.h index 1a920b1968..a75b740dcd 100644 --- a/src/Song.h +++ b/src/Song.h @@ -20,7 +20,7 @@ void FixupPath( RString &path, const RString &sSongPath ); RString GetSongAssetPath( RString sPath, const RString &sSongPath ); /** @brief The version of the .ssc file format. */ -const static float STEPFILE_VERSION_NUMBER = 0.75f; +const static float STEPFILE_VERSION_NUMBER = 0.76f; /** @brief How many edits for this song can each profile have? */ const int MAX_EDITS_PER_SONG_PER_PROFILE = 15; diff --git a/src/TimingData.cpp b/src/TimingData.cpp index 2c75c60614..29d8d1ada0 100644 --- a/src/TimingData.cpp +++ b/src/TimingData.cpp @@ -166,12 +166,16 @@ void TimingData::SetTimeSignatureAtRow( int iRow, int iNumerator, int iDenominat void TimingData::SetTimeSignatureNumeratorAtRow( int iRow, int iNumerator ) { - SetTimeSignatureAtRow( iRow, iNumerator, GetTimeSignatureSegmentAtBeat( NoteRowToBeat( iRow ) ).GetDen() ); + this->SetTimeSignatureAtRow(iRow, + iNumerator, + GetTimeSignatureSegmentAtRow(iRow).GetDen()); } void TimingData::SetTimeSignatureDenominatorAtRow( int iRow, int iDenominator ) { - SetTimeSignatureAtRow( iRow, GetTimeSignatureSegmentAtBeat( NoteRowToBeat( iRow ) ).GetNum(), iDenominator ); + this->SetTimeSignatureAtRow(iRow, + GetTimeSignatureSegmentAtRow(iRow).GetNum(), + iDenominator); } void TimingData::SetWarpAtRow( int iRow, float fNew ) @@ -222,7 +226,7 @@ void TimingData::SetTickcountAtRow( int iRow, int iTicks ) } } -void TimingData::SetComboAtRow( int iRow, int iCombo ) +void TimingData::SetComboAtRow( int iRow, int iCombo, int iMiss ) { unsigned i; for( i=0; i 0 && m_ComboSegments[i-1].GetCombo() == iCombo ) + if(i > 0 && m_ComboSegments[i-1].GetCombo() == iCombo && + m_ComboSegments[i-1].GetMissCombo() == iMiss) m_ComboSegments.erase( m_ComboSegments.begin()+i, m_ComboSegments.begin()+i+1 ); else + { m_ComboSegments[i].SetCombo(iCombo); + m_ComboSegments[i].SetMissCombo(iMiss); + } } } +void TimingData::SetHitComboAtRow(int iRow, int iCombo) +{ + this->SetComboAtRow(iRow, + iCombo, + this->GetComboSegmentAtRow(iRow).GetMissCombo()); +} + +void TimingData::SetMissComboAtRow(int iRow, int iMiss) +{ + this->SetComboAtRow(iRow, + this->GetComboSegmentAtRow(iRow).GetCombo(), + iMiss); +} + void TimingData::SetLabelAtRow( int iRow, const RString sLabel ) { unsigned i; @@ -398,7 +421,12 @@ float TimingData::GetDelayAtRow( int iRow ) const int TimingData::GetComboAtRow( int iNoteRow ) const { - return m_ComboSegments[GetComboSegmentIndexAtRow( iNoteRow )].GetCombo(); + return m_ComboSegments[this->GetComboSegmentIndexAtRow(iNoteRow)].GetCombo(); +} + +int TimingData::GetMissComboAtRow(int iNoteRow) const +{ + return m_ComboSegments[this->GetComboSegmentIndexAtRow(iNoteRow)].GetMissCombo(); } RString TimingData::GetLabelAtRow( int iRow ) const @@ -1735,7 +1763,7 @@ void TimingData::TidyUpData() // Have a default combo segment of one just in case. if( m_ComboSegments.empty() ) { - ComboSegment seg(0, 1); + ComboSegment seg(0, 1, 1); m_ComboSegments.push_back( seg ); } @@ -1913,8 +1941,9 @@ public: FOREACH_CONST( ComboSegment, p->m_ComboSegments, seg ) { const int combo = seg->GetCombo(); + const int miss = seg->GetMissCombo(); const float beat = seg->GetBeat(); - vCombos.push_back( ssprintf("%f=%d", beat, combo) ); + vCombos.push_back( ssprintf("%f=%d=%d", beat, combo, miss) ); } LuaHelpers::CreateTableFromArray(vCombos, L); return 1; diff --git a/src/TimingData.h b/src/TimingData.h index a4b490e4cb..37b273f71c 100644 --- a/src/TimingData.h +++ b/src/TimingData.h @@ -668,6 +668,18 @@ public: * @return the Combo. */ int GetComboAtBeat( float fBeat ) const { return GetComboAtRow( BeatToNoteRow(fBeat) ); } + /** + * @brief Retrieve the Miss Combo at the given row. + * @param iNoteRow the row in question. + * @return the Miss Combo. + */ + int GetMissComboAtRow( int iNoteRow ) const; + /** + * @brief Retrieve the Miss Combo at the given beat. + * @param fBeat the beat in question. + * @return the Miss Combo. + */ + int GetMissComboAtBeat( float fBeat ) const { return GetMissComboAtRow( BeatToNoteRow(fBeat) ); } /** * @brief Set the row to have the new Combo. * @param iNoteRow the row to have the new Combo. @@ -680,6 +692,44 @@ public: * @param iCombo the Combo. */ void SetComboAtBeat( float fBeat, int iCombo ) { SetComboAtRow( BeatToNoteRow( fBeat ), iCombo ); } + /** + * @brief Set the row to have the new Combo and Miss Combo. + * @param iNoteRow the row to have the new Combo and Miss Combo. + * @param iCombo the Combo. + * @param iMiss the Miss Combo. + */ + void SetComboAtRow( int iNoteRow, int iCombo, int iMiss ); + /** + * @brief Set the beat to have the new Combo and Miss Combo. + * @param fBeat the beat to have the new Combo and Miss Combo. + * @param iCombo the Combo. + * @param iMiss the Miss Combo. + */ + void SetComboAtBeat( float fBeat, int iCombo, int iMiss ) { SetComboAtRow( BeatToNoteRow( fBeat ), iCombo, iMiss ); } + /** + * @brief Set the row to have the new Combo. + * @param iNoteRow the row to have the new Combo. + * @param iCombo the Combo. + */ + void SetHitComboAtRow( int iNoteRow, int iCombo ); + /** + * @brief Set the beat to have the new Combo. + * @param fBeat the beat to have the new Combo. + * @param iCombo the Combo. + */ + void SetHitComboAtBeat( float fBeat, int iCombo ) { SetHitComboAtRow( BeatToNoteRow( fBeat ), iCombo ); } + /** + * @brief Set the row to have the new Miss Combo. + * @param iNoteRow the row to have the new Miss Combo. + * @param iCombo the Miss Combo. + */ + void SetMissComboAtRow( int iNoteRow, int iCombo ); + /** + * @brief Set the beat to have the new Miss Combo. + * @param fBeat the beat to have the new Miss Combo. + * @param iCombo the Miss Combo. + */ + void SetMissComboAtBeat( float fBeat, int iCombo ) { SetMissComboAtRow( BeatToNoteRow( fBeat ), iCombo ); } /** * @brief Retrieve the ComboSegment at the specified row. * @param iNoteRow the row that has a ComboSegment. diff --git a/src/TimingSegments.cpp b/src/TimingSegments.cpp index 304623c285..c208672e01 100644 --- a/src/TimingSegments.cpp +++ b/src/TimingSegments.cpp @@ -125,10 +125,21 @@ void ComboSegment::SetCombo(const int i) this->combo = i; } +int ComboSegment::GetMissCombo() const +{ + return this->missCombo; +} + +void ComboSegment::SetMissCombo(const int i) +{ + this->missCombo = i; +} + bool ComboSegment::operator<( const ComboSegment &other ) const { LTCOMPARE(GetRow()); LTCOMPARE(GetCombo()); + LTCOMPARE(GetMissCombo()); return false; } diff --git a/src/TimingSegments.h b/src/TimingSegments.h index e18e881886..5e59daed90 100644 --- a/src/TimingSegments.h +++ b/src/TimingSegments.h @@ -344,7 +344,8 @@ struct ComboSegment : public TimingSegment ComboSegment(const ComboSegment &other) : TimingSegment(other), - combo(other.GetCombo()) {}; + combo(other.GetCombo()), + missCombo(other.GetMissCombo()) {}; /** * @brief Creates a Combo Segment with the specified values. @@ -354,18 +355,39 @@ struct ComboSegment : public TimingSegment template ComboSegment( StartType s, int t ): TimingSegment(max((StartType)0, s)), - combo(max(0,t)) {} + combo(max(0,t)), missCombo(max(0,t)) {} + + /** + * @brief Creates a Combo Segment with the specified values. + * @param s the starting row / beat of this segment. + * @param t the amount the combo increases on a succesful hit. + * @param m the amount the miss combo increases on missing. + */ + template + ComboSegment(StartType s, int t, int m): + TimingSegment(max((StartType)0, s)), + combo(max(0,t)), missCombo(max(0,m)) {} /** * @brief Get the combo in this ComboSegment. * @return the combo. */ int GetCombo() const; + /** + * @brief Get the miss combo in this ComboSegment. + * @return the miss combo. */ + int GetMissCombo() const; + /** * @brief Set the combo in this ComboSegment. * @param i the combo. */ void SetCombo(const int i); + /** + * @brief Set the miss combo in this ComboSegment. + * @param i the miss combo. */ + void SetMissCombo(const int i); + /** * @brief Compares two ComboSegments to see if one is less than the other. * @param other the other ComboSegment to compare to. @@ -377,6 +399,8 @@ private: * @brief The amount the combo increases at this point. */ int combo; + /** @brief The amount of miss combos given at this point. */ + int missCombo; };