use gdlib::{
cclocallevels::{
gdlevel::GDLevel,
gdobj::{
GDObject,
ids::{objects::TRIGGER_ADVANCED_RANDOM, properties::RANDOM_PROBABILITIES_LIST},
structs::Group,
},
},
core::rand::{check_seed_advanced_random, next_seed_mut},
};
fn main() {
let level = GDLevel::from_gmd("test_gmds/Chompstep.gmd").unwrap();
let mut objects = level.get_decrypted_data().unwrap().objects;
objects.retain(|o| o.id == TRIGGER_ADVANCED_RANDOM && o.config.pos.0 > 0.0);
objects.sort_by(|a, b| a.config.pos.0.total_cmp(&b.config.pos.0));
let expected = vec![
2, -1, 2, -1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, -1, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
];
let mut seed = 0;
while !crack_seed(seed, &expected[..25], &objects) {
seed += 1;
if seed % 1000000 == 0 {
println!("checked seeds until {seed}");
}
}
println!("got seed: {seed}");
}
fn crack_seed(seed: u64, expected: &[i16], objects: &Vec<GDObject>) -> bool {
let mut seed_clone = seed;
for (idx, obj) in objects.iter().enumerate() {
if idx == expected.len() {
return true; }
if expected[idx] == -1 {
continue; }
if !check_object(seed_clone, obj, expected[idx]) {
return false;
}
next_seed_mut(&mut seed_clone);
}
true
}
fn check_object(seed: u64, object: &GDObject, expected_group: i16) -> bool {
let probabilities = object.get_property(RANDOM_PROBABILITIES_LIST).unwrap();
match check_seed_advanced_random(seed, &probabilities) {
Some(Group::Regular(g)) => g == expected_group,
_ => false, }
}