diff --git a/src/main.rs b/src/main.rs index 07e3ce7..68a90bf 100644 --- a/src/main.rs +++ b/src/main.rs @@ -123,8 +123,8 @@ fn main() { 6 if favorite_pending => println!("Warning: level index {} is of type 'pick your favorite' after another 'pick your favorite' level. Game will crash.", idx), 7 if !favorite_pending => println!("Warning: level index {} is of type 'find your favorite' without a preceeding 'pick your favorite' level. Game will crash.", idx), 7 if favorite_pending => favorite_pending = false, - 9 | 10 | 11 if level.behavior != 1 && level.behavior != 4 => - println!("Warning: level index {} has an objective that requires mii behaviors 1 or 4 to function properly, but is set to {}", idx, level.behavior), + 9 | 10 | 11 if level.behavior != 1 && level.behavior != 3 => + println!("Warning: level index {} has an objective that requires mii behaviors 1 or 3 to function properly, but is set to {}", idx, level.behavior), 17 | 18 | 19 if level.behavior != 0 => println!("Warning: level index {} has an objective that requires mii behavior 0 to function properly, but is set to {}", idx, level.behavior), _ => {} @@ -205,25 +205,544 @@ fn main() { 4 => 40, _ => 90 }; - - level.num_miis = rng.sample(Uniform::new_inclusive(4, max_miis)); + +// This is where the magic happens! + + level.num_miis = rng.sample(Uniform::new_inclusive(6, max_miis)); //The Minimum is actually 6 because of the "Find 5 look alikes" Objective + + level.unk12 = 0.0; + level.unk13 = 0.0; + level.unk14 = 0.0; + level.unk15 = 0.0; + level.unk16 = 0.0; level.behavior = match level.level_type { - 9 | 10 | 11 => if rng.gen_ratio(1, 2) { 1 } else { 4 } - 17 | 18 | 19 => 0, + 9 | 10 | 5 | 11 | 20 => if rng.gen_ratio(1, 2) { 1 } else { 3 } //Find The Odd Mii(s) out + 17 | 18 | 19 => 0, // Find The Insomniac + 14 | 15 | 16 => 0, // Find The Sleepyhead + 12 | 13 => if rng.gen_ratio(1, 2) { 4 } else { 2 } _ => rng.sample(Uniform::new_inclusive(0, 6)), }; + level.map = rng.sample(Uniform::new_inclusive(0, 4)); + if level.map == 4 { + level.behavior = rng.sample(Uniform::new_inclusive(0, 1)); +} + + if level.map == 1 { + level.behavior = match level.map { + 1 => if rng.gen_ratio(1, 4) { 0 } else if rng.gen_ratio(1, 2) { 1 } else { 4 } + 4 => if rng.gen_ratio(1, 2) { 0 } else { 1 } //Elevator Behavior Softlock Fix + 3 => if rng.gen_ratio(1, 2) { 0 } else { 1 } //Tennis Stands Behavior Softlock Fix + _ => rng.sample(Uniform::new_inclusive(4, 5)), + }; + } level.zoom_out_max = rng.sample(Uniform::new_inclusive(-406.0, -135.0)); level.zoom_in_max = rng.sample(Uniform::new_inclusive(-135.0, -22.0)); level.darkness = if rng.gen_ratio(1, 2) { 0.0 // 50% chance for no darkness } else { - rng.sample(Uniform::new_inclusive(38.0, 90.0)) + rng.sample(Uniform::new_inclusive(84.0, 110.0)) }; level.head_size = rng.sample(Uniform::new_inclusive(1.35, 3.5)); - } + if level.darkness > 1.0 { + level.unk12 = 3.0; + level.unk13 = 10.0; + level.unk14 = 1.0; + level.unk15 = 0.0; + level.unk16 = 6.0; +} + + if level.map == 3 { + level.zoom_out_max = if rng.gen_ratio(1, 2) { -279.60767 } else { -187.60767 }; + level.zoom_in_max = -279.60767; + } + + if level.map == 3 { + level.horiz_dist = 4.7; + level.vert_dist = 22.4; + } + + if level.map == 4 { + level.unk7 = 35.0; + + } + + if level.map == 2 { + level.unk7 = 0.0; + + + } + if level.map == 3 { + level.unk7 = -60.0; + + } + //Street Mii Bounding Fixes + if level.map == 0 { + level.zoom_out_max = if rng.gen_ratio(3, 4) { -199.0 } else { -205.0 }; + level.zoom_in_max = if rng.gen_ratio(3, 4) { -199.0 } else { -205.0 }; + level.horiz_dist = 35.0; + level.vert_dist = 97.0; + } + //Ocean Mii Bounding Fixes + if level.map == 1 { + level.zoom_out_max = if rng.gen_ratio(3, 4) { -180.0 } else { -240.0 }; + level.zoom_in_max = if rng.gen_ratio(3, 4) { -180.0 } else { -240.0 }; + level.horiz_dist = if rng.gen_ratio(3, 4) { 30.0 } else { 40.0 }; + level.vert_dist = if rng.gen_ratio(3, 4) { 90.0 } else { 113.0 }; + + } + //Better safe than sorry + // If you have too many miis on the Escalator the game will crash + if level.map == 4 { // If Escalator Stage + level.num_miis = rng.sample(Uniform::new_inclusive( 8, 40)); // Nothing more then 40 miis + + } + if level.level_type == 5 { + + level.behavior = 1; + } + + if level.level_type == 9 { + level.behavior = 1; + + } + + if level.level_type == 10 { + level.behavior = 1; + + } + + if level.level_type == 11 { + level.behavior = 1; + + } + + if level.level_type == 20 { + level.behavior = 1; + + } + + if level.map == 3 && (level.level_type == 17 || level.level_type == 18 || level.level_type == 19) { + level.darkness = 0.0; // Darkness doesn't work on Find The Insomniac Stages on the Tennis Stands + + } + + if level.map == 3 && (level.level_type == 12 || level.level_type == 13) { //Fastest Mii Fix on Tennis Stands + level.behavior = 3; + level.level_type == 2; + + } + + if level.level_type == 14 { + level.behavior = if rng.gen_ratio(1, 2) { 1 } else { 0 } + + } + + if level.level_type == 15 { + level.behavior = if rng.gen_ratio(1, 2) { 1 } else { 0 } + + } + + if level.level_type == 16 { + level.behavior = if rng.gen_ratio(1, 2) { 1 } else { 0 } + + } + + + if level.map == 0 && (level.level_type == 14 || level.level_type == 15 || level.level_type == 16) { + level.darkness = 0.0; // Darkness doesn't work on Find the Sleepyhead Stages on the Street. Even though its in the original game levels.... + + } + + if level.map == 0 && (level.zoom_out_max > -199.0) { // Street Non Zoom Fixes + level.zoom_out_max = -222.0; + level.zoom_in_max = -222.0; + level.horiz_dist = 4.5; + level.vert_dist = 35.4; + + + + } + + if level.map == 0 && (level.behavior == 2 || level.behavior == 4 || level.behavior == 6 || level.level_type == 14 || level.level_type == 15 || level.level_type == 16) { + level.zoom_out_max = -222.0; + level.zoom_in_max = -222.0; + level.horiz_dist = if rng.gen_ratio(1, 2) { 33.4 } else { 57.0 }; + level.vert_dist = 57.4; + + + + } + + + if level.map == 1 { + level.darkness = 0.0; // Darkness doesn't work on Ocean Stages + + + + } + + + if level.map == 3 && (level.behavior == 3 || level.behavior == 4 || level.behavior == 6) { + level.behavior = 1; + + + } + + if level.map == 2 { // If It's the Space Stage. + level.num_miis = rng.sample(Uniform::new_inclusive( 20, 30)); // More than 30 Miis makes the stage unplayable. Due to the game's settings in this environment, 30 > x > 20 Miis works the best without any camera zoom edits. + level.zoom_out_max = -180.0; + level.zoom_in_max = if rng.gen_ratio(1, 2) { -180.0 } else { -297.4774 }; + + + + } + + + // Unfortunately, I could not come up with a better fix. This is how it has to be until I can figure out the exteremely complicated settings for Cameras and Mii Placement this stage uses + if level.map == 2 && (level.behavior == 5) { + level.num_miis = rng.sample(Uniform::new_inclusive( 8, 12)); + level.zoom_out_max = -222.0; + level.zoom_in_max = -222.0; + level.horiz_dist = if rng.gen_ratio(70, 100) { 30.0 } else { 35.0 }; + level.vert_dist = 21.0; + + } + // Yet..... another.... find the sleepyhead fix for the escalator stage. + if level.map == 4 && (level.level_type == 14 || level.level_type == 15 || level.level_type == 16) { + level.level_type = rng.sample(Uniform::new_inclusive( 1, 5)); + + + } + + if level.map == 2 && (level.behavior == 0 || level.behavior == 1) { + level.zoom_out_max = -180.0; + level.zoom_in_max = -297.4774; + level.horiz_dist = 26.9; + level.vert_dist = 21.9; + level.num_miis = rng.sample(Uniform::new_inclusive( 8, 10)); + + + } + + if level.map == 2 && (level.level_type == 9 || level.level_type == 10 || level.level_type == 10) { //S I G H. Yet another level fix for the space stage. + level.behavior = 1; + + } + + //Ocean Fix for Fixated Screen with "Find The Fastest Mii" + if level.map == 1 && (level.behavior == 6) { + level.behavior = 4; //YET... .ABOTHER.... BOUNDING.... FIX... THAT... I... MIGHT... HAVE... ALREADY... MADE... BEFORE.. BUT... STILL.. DIDNT... WORK... + + + } + // I don't think that the escalator stages even have a "Find The Odd Mii Out" Objective in the original game. + if level.map == 4 && (level.level_type == 9 || level.level_type == 10 || level.level_type == 11) { + level.level_type = if rng.gen_ratio(2, 4) { 3 } else if rng.gen_ratio(2, 4) { 9 } else { 21 } + + + } + + if level.map == 2 && (level.level_type == 12 || level.level_type == 13) { // YET ANOTHER FIX FOR THIS LEVEL TYPE + level.level_type = 1; + + + } + + if level.map == 2 && (level.zoom_out_max == -180.0 || level.zoom_in_max == -180.0) { // space camera randomizer param 1 + level.horiz_dist = 29.9; + level.vert_dist = 16.9; + + } + + if level.map == 2 && (level.zoom_out_max == -180.0 || level.zoom_in_max == -297.4774) { // space camera randomizer param 2 + level.horiz_dist = 29.9; + level.vert_dist = 16.9; + + + } + + if level.map == 2 { + level.behavior = if rng.gen_ratio(1, 2) { 5 } else { 1 }; + + } + + if level.map == 2 && (level.behavior == 5 || level.zoom_out_max == -180.0 || level.zoom_in_max == -180.0) { // space camera randomizer param 2 + level.horiz_dist = 26.9; + level.vert_dist = 21.9; + + } + + if level.map == 2 && (level.behavior == 1) { // SPACE CAMERA ODD MII OUT PARAM + level.horiz_dist = 26.9; + level.vert_dist = 21.9; + level.zoom_out_max = -180.0; // You absolutely need this + level.zoom_in_max = -297.4774; // You absolutely need this + + + } + + if level.map == 0 && (level.zoom_out_max == -205.0 || level.zoom_in_max == -199.0) { + level.horiz_dist = 22.4; + level.vert_dist = 64.0; + + } + + if level.map == 1 && (level.zoom_out_max == -240.0) { + level.zoom_in_max = -180.0; + level.horiz_dist = 15.0; + level.vert_dist = 72.0; + + } + //Find the Sleepyhead Tennis Stands Fix + if level.map == 3 && (level.level_type == 14 || level.level_type == 15 || level.level_type == 16) { + level.level_type = 21; + level.behavior = 1; + + + } + //Fastest Mii Tennis Stands + if level.map == 3 && (level.level_type == 12 || level.level_type == 13) { + level.level_type = 21; + level.behavior = 0; + + + + } + //Odd Mii Out Fix Tennis Stands Fix + if level.map == 3 && (level.level_type == 9 || level.level_type == 10 || level.level_type == 11 || level.level_type == 20) { + level.behavior = 1; + + + } + + if level.map == 2 { + level.darkness = if rng.gen_ratio(2, 4) { + 0.0 // 50% chance for no darkness + } else { + rng.sample(Uniform::new_inclusive(94.9, 135.0)) + + + }; + + + } + //Insomniac Fix Tennis Stands + if level.map == 3 && (level.level_type == 17 || level.level_type == 18 || level.level_type == 19) { + level.level_type = 10; + level.behavior = 1; + + + } + //Street Non Zoom Level Fix for Miis + if level.map == 0 && (level.zoom_out_max == -205.0 || level.zoom_in_max == -205.0) { + level.horiz_dist = 4.7; + level.vert_dist = 24.0; + + } + + if level.map == 1 && (level.zoom_out_max == -180.0 || level.zoom_in_max == -180.0) { + level.horiz_dist = 10.2; + level.vert_dist = 17.4; + + } + + if level.map == 0 && (level.behavior == 5) { + level.behavior = 1; + + } + + if level.map == 0 && (level.zoom_out_max == -199.0 || level.zoom_in_max == -199.0) { + level.horiz_dist = 4.0; + level.vert_dist = 11.0; + + } + + if level.map == 0 && (level.horiz_dist == 10.2 || level.vert_dist == 17.4) { + level.horiz_dist = 22.4; + level.vert_dist = 64.0; + level.zoom_in_max = -205.0; + + } + + if level.map == 2 && (level.level_type == 12 || level.level_type == 13) { + level.horiz_dist = 16.3; + level.vert_dist = 12.8; + } + //Darkness Find The Odd Mii Out fix on Space Stages. Which doesnt work for some reason + if level.map == 2 && (level.level_type == 9 || level.level_type == 10 || level.level_type == 11) { + level.darkness = 0.0; + + + } + //Yet Another Find the Fastest Mii Escalator Fix + if level.map == 4 && (level.level_type == 13) { + level.level_type = if rng.gen_ratio(2, 4) { 10 } else { 2 }; + level.behavior = 1; + + } + + + //Yet Another Find the Fastest Mii Escalator Fix For Type 12 + if level.map == 4 && (level.level_type == 12) { + level.level_type = if rng.gen_ratio(2, 4) { 10 } else { 2 }; + level.behavior = 1; + + } + + if level.level_type == 17 { + + level.behavior = 0; + } + + if level.level_type == 18 { + level.behavior = 0; + + } + + if level.level_type == 19 { + level.behavior = 0; + + } + // "Find 3 odd miis out" doesnt work with Darkness on this stage for some reason + if level.map == 0 && (level.level_type == 11 || level.darkness > 0.1) { // Set to greater than 0.1, Just in case + level.level_type = 10; + + } + + //Street Mii Bounding Fix for Odd Mii out at + if level.map == 0 && (level.level_type == 9 || level.level_type == 10) { + level.behavior = 1; + + } + + //Ocean Behavior Fix for Fastest Mii Levels + if level.map == 1 && (level.level_type == 12 || level.level_type == 13) { + level.behavior = if rng.gen_ratio(3, 5) { 4 } else { 6 } + + } + + if level.map == 0 && (level.zoom_out_max == -222.0 || level.zoom_in_max == -222.0 || level.behavior == 0 || level.behavior == 1 || level.behavior == 3 || level.behavior == 5 ) { + level.horiz_dist = 11.4; + level.vert_dist = 12.9; + + } + + if level.map == 3 && (level.behavior == 5) { + level.behavior = 1; + level.level_type = 10; + } + + if level.map == 1 && (level.zoom_out_max == -180.0 || level.zoom_out_max == -180.0) { + level.horiz_dist = 8.2; + level.vert_dist = 12.4; + + + } + //Fix for "Find The Insomniac" levels on the Escalator stage. Which don't function. + if level.map == 1 && (level.level_type == 17 || level.level_type == 18 || level.level_type == 19) { + level.behavior = 1; + level.level_type = 21; + + } + //Ocean Mii Behavior 4 Fix + if level.map == 1 && (level.zoom_out_max == -240.0 || level.zoom_out_max == -240.0 || level.behavior == 4 || level.behavior == 2 || level.behavior == 6) { + level.horiz_dist = 38.2; + level.vert_dist = 26.4; + + } + //Yet another Mii Behavior Type 3 fix for the tennis stands stages + if level.map == 3 && (level.behavior == 3) { + level.behavior = 1; + + } + //Find 3 look alikes doesn't work on Tennis Stands with darkness for some reason + if level.map == 3 && (level.level_type == 2 || level.level_type == 4 || level.darkness > 0.1) { // Set to greater than 0.1, Just in case + level.level_type = 10; + level.behavior = 1; + + + } + if level.map == 1 && (level.zoom_out_max == -240.0 || level.zoom_out_max == -240.0 || level.behavior == 2 || level.behavior == 4 || level.behavior == 6 ) { // Yet Another Ocean Mii Position Fix + level.horiz_dist = 40.6; + level.vert_dist = 60.4; + + } + + //Find 3 - 5 look alikes doesn't work on Street Stagess with darkness for some reason + if level.map == 0 && (level.level_type == 2 || level.level_type == 3 || level.level_type == 4 || level.darkness > 0.1) { // Set to greater than 0.1, Just in case + level.level_type = 8; + level.behavior = 4; + + + } + if level.map == 3 && (level.zoom_out_max == -279.60767 || level.zoom_out_max == -279.60767) { //Hopefully the last Tennis Mii Pos Fix + level.horiz_dist = 5.4; + level.vert_dist = 8.2; + + } + //I don't even know anymore.... + if level.map == 0 && (level.behavior == 4 || level.zoom_out_max == -222.0 || level.zoom_out_max == -222.0) { //Screen Bounding Fix for Street Levels with walking Miis + level.unk7 = 17.0; // This is way to complicated to explain currently. TLDR: Screen Position on Map + Respawn Point Area + level.horiz_dist = rng.sample(Uniform::new_inclusive(30.0, 38.3)); + level.vert_dist = 117.0; + level.zoom_in_max = -200.0; + level.zoom_out_max = -200.0; + level.num_miis = rng.sample(Uniform::new_inclusive( 8, 45)); //Anything higher than 45 causes half the original amount of miis to spawn. + + + + } + + if level.map == 1 && (level.zoom_out_max == -240.0 || level.zoom_out_max == -240.0 || level.behavior == 0 || level.behavior == 1 || level.behavior == 3) { // Yet Again, Another Ocean Mii Position Fix + level.zoom_out_max = -255.0; + level.zoom_in_max = -255.0; + level.horiz_dist = 6.4; + level.vert_dist = 17.1; + + } + + if level.map == 1 && (level.zoom_out_max == -255.0) { + //You can have up to 99 miis on the ocean stage but I have to add this because Mii Bounding wont work without it (Offscreen Miis Fix) + level.num_miis = rng.sample(Uniform::new_inclusive( 8, 64)); + + + } + + if level.map == 4 && (level.level_type == 3 || level.level_type == 4 || level.darkness > 0.1) {//Find 5 Lookalikes darkness fix + level.level_type = 21; + + } + //I really really hope this is the last bounding fix + if level.map == 1 && (level.zoom_out_max == -255.0 || level.zoom_in_max == -255.0 || level.behavior == 2 || level.behavior == 4 || level.behavior == 6) { + level.horiz_dist = 40.6; + level.vert_dist = 60.4; + level.unk7 = 0.0; + + + } + + // Nope. + if level.map == 1 && (level.zoom_out_max == -255.0 || level.zoom_in_max == -255.0 || level.behavior == 0 || level.behavior == 1 || level.behavior == 3) { + level.horiz_dist = 6.4; + level.vert_dist = 17.1; + level.unk7 = 0.0; + + } + + if level.map == 4 && (level.level_type == 17 || level.level_type == 18 || level.level_type == 18) { + level.behavior = 1; + level.level_type = 2; + + } + + + + + + } let output = File::create(output).unwrap(); Level::to_file(output, levels);