Skip to content

Commit 56ffa62

Browse files
committed
replace Inventory with UberState interactions
1 parent a8bc0ca commit 56ffa62

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

56 files changed

+5902
-4555
lines changed

wotw_seedgen/benches/bench.rs

Lines changed: 88 additions & 89 deletions
Original file line numberDiff line numberDiff line change
@@ -2,16 +2,15 @@ use std::time::Duration;
22

33
use criterion::{criterion_group, criterion_main, BenchmarkId, Criterion, Throughput};
44
use lazy_static::lazy_static;
5-
use rustc_hash::FxHashSet;
5+
use rand_pcg::Pcg64Mcg;
66
use smallvec::smallvec;
7-
use wotw_seedgen::{item_pool::ItemPool, Player, UberStates, World};
7+
use wotw_seedgen::{item_pool::ItemPool, UberStates, World};
88
use wotw_seedgen_assets::{PresetAccess, WorldPreset, WorldPresetSettings};
99
use wotw_seedgen_data::Skill;
1010
use wotw_seedgen_logic_language::{
1111
ast::{parse, Areas},
1212
output::{Enemy, Graph, Requirement},
1313
};
14-
use wotw_seedgen_seed_language::output::IntermediateOutput;
1514
use wotw_seedgen_settings::{Difficulty, Spawn, UniverseSettings, WorldSettings, DEFAULT_SPAWN};
1615
use wotw_seedgen_static_assets::{
1716
LOC_DATA, PRESET_ACCESS, SNIPPET_ACCESS, STATE_DATA, UBER_STATE_DATA,
@@ -45,101 +44,111 @@ fn requirements(c: &mut Criterion) {
4544
difficulty: Difficulty::Unsafe,
4645
..WorldSettings::default()
4746
};
48-
let mut player = Player::new(&world_settings);
49-
let states = FxHashSet::default();
47+
let graph = compile_graph(&[]);
48+
let spawn = graph.find_node(DEFAULT_SPAWN).unwrap();
49+
let uber_states = UberStates::new(&*UBER_STATE_DATA);
50+
let mut world = World::new(&graph, spawn, &world_settings, uber_states);
5051

5152
let req_a = Requirement::EnergySkill(Skill::Blaze, 2.0);
5253
let req_b = Requirement::Damage(20.0);
5354
let req_c = Requirement::EnergySkill(Skill::Blaze, 1.0);
5455
let req_d = Requirement::Damage(10.0);
55-
player.inventory.skills.insert(Skill::Blaze);
56-
player.inventory.health += 20;
57-
player.inventory.energy += 2.;
56+
world.set_skill(Skill::Blaze, true, &[]);
57+
world.modify_max_health(20, &[]);
58+
world.modify_max_energy((2.).into(), &[]);
5859
let requirement = Requirement::And(vec![
5960
Requirement::Or(vec![req_a.clone(), req_d.clone()]),
6061
Requirement::Or(vec![req_b.clone(), req_c.clone()]),
6162
Requirement::Or(vec![req_a.clone(), req_d.clone()]),
6263
Requirement::Or(vec![req_b.clone(), req_c.clone()]),
6364
]);
6465
group.bench_function("nesting", |b| {
65-
b.iter(|| player.is_met(&requirement, &states, smallvec![player.max_orbs()]))
66+
b.iter(|| world.is_met(&requirement, &mut smallvec![world.max_orbs()]))
6667
});
6768

68-
player.inventory.skills.insert(Skill::Bow);
69-
player.inventory.energy += 10.;
69+
world.set_skill(Skill::Bow, true, &[]);
70+
world.modify_max_energy((10.).into(), &[]);
7071
let requirement = Requirement::Combat(smallvec![(Enemy::Lizard, 3),]);
7172
group.bench_function("short_combat", |b| {
72-
b.iter(|| player.is_met(&requirement, &states, smallvec![player.max_orbs()]))
73-
});
74-
let requirement = Requirement::And(vec![
75-
Requirement::Combat(smallvec![
76-
(Enemy::Mantis, 2),
77-
(Enemy::Lizard, 2),
78-
(Enemy::EnergyRefill, 4),
79-
(Enemy::SneezeSlug, 2),
80-
(Enemy::Mantis, 1),
81-
(Enemy::Skeeto, 1),
82-
(Enemy::EnergyRefill, 4),
83-
(Enemy::SmallSkeeto, 7),
84-
(Enemy::Skeeto, 2),
85-
(Enemy::EnergyRefill, 4),
86-
(Enemy::Lizard, 2),
87-
(Enemy::Mantis, 2),
88-
]),
89-
Requirement::Damage(50.0),
90-
]);
91-
player.inventory.clear();
92-
group.bench_function("long_combat_progression", |b| {
93-
b.iter(|| {
94-
player.solutions(
95-
&requirement,
96-
&states,
97-
smallvec![player.max_orbs()],
98-
1000,
99-
1000,
100-
)
101-
})
73+
b.iter(|| world.is_met(&requirement, &mut smallvec![world.max_orbs()]))
10274
});
10375

76+
// TODO reenable if this concept is added again
77+
// let requirement = Requirement::And(vec![
78+
// Requirement::Combat(smallvec![
79+
// (Enemy::Mantis, 2),
80+
// (Enemy::Lizard, 2),
81+
// (Enemy::EnergyRefill, 4),
82+
// (Enemy::SneezeSlug, 2),
83+
// (Enemy::Mantis, 1),
84+
// (Enemy::Skeeto, 1),
85+
// (Enemy::EnergyRefill, 4),
86+
// (Enemy::SmallSkeeto, 7),
87+
// (Enemy::Skeeto, 2),
88+
// (Enemy::EnergyRefill, 4),
89+
// (Enemy::Lizard, 2),
90+
// (Enemy::Mantis, 2),
91+
// ]),
92+
// Requirement::Damage(50.0),
93+
// ]);
94+
// player.inventory.clear();
95+
// group.bench_function("long_combat_progression", |b| {
96+
// b.iter(|| {
97+
// player.solutions(
98+
// &requirement,
99+
// &states,
100+
// smallvec![player.max_orbs()],
101+
// 1000,
102+
// 1000,
103+
// )
104+
// })
105+
// });
106+
104107
group.finish();
105108
}
106109

107110
fn reach_checking(c: &mut Criterion) {
108111
let mut group = c.benchmark_group("reach_check");
109112

110-
let graph = Graph::compile(AREAS.clone(), LOC_DATA.clone(), STATE_DATA.clone(), &[])
111-
.into_result()
112-
.unwrap();
113+
let graph = compile_graph(&[]);
113114
let uber_states = UberStates::new(&UBER_STATE_DATA);
115+
let world_settings = WorldSettings::default();
116+
let spawn = graph.find_node(DEFAULT_SPAWN).unwrap();
117+
let world = World::new(&graph, spawn, &world_settings, uber_states.clone());
114118

115119
group.bench_function("short", |b| {
116120
b.iter(|| {
117-
let output = IntermediateOutput::default();
118-
let world_settings = WorldSettings::default();
119-
let spawn = graph.find_node(DEFAULT_SPAWN).unwrap();
120-
let mut world = World::new(&graph, spawn, &world_settings, uber_states.clone());
121-
world.set_spirit_light(10000, &output);
122-
world.set_max_health(200, &output);
123-
world.set_max_energy(20.0.into(), &output);
124-
world.set_keystones(34, &output);
125-
world.set_gorlek_ore(40, &output);
126-
world.set_shard_slots(8, &output);
127-
world.set_skill(Skill::Sword, true, &output);
128-
world.set_skill(Skill::DoubleJump, true, &output);
129-
world.set_skill(Skill::Dash, true, &output);
130-
world.reached()
121+
let mut world = world.clone();
122+
world.traverse_spawn(&[]);
123+
world.set_spirit_light(10000, &[]);
124+
world.set_max_health(200, &[]);
125+
world.set_max_energy(20.0.into(), &[]);
126+
world.set_keystones(34, &[]);
127+
world.set_gorlek_ore(40, &[]);
128+
world.set_shard_slots(8, &[]);
129+
world.set_skill(Skill::Sword, true, &[]);
130+
world.set_skill(Skill::DoubleJump, true, &[]);
131+
world.set_skill(Skill::Dash, true, &[]);
132+
world.reached_nodes().for_each(drop);
131133
})
132134
});
133-
let output = IntermediateOutput::default();
135+
134136
let world_settings = WorldSettings::default();
135137
let spawn = graph.find_node(DEFAULT_SPAWN).unwrap();
136138
let uber_states = UberStates::new(&UBER_STATE_DATA);
137-
let mut world = World::new_spawn(&graph, spawn, &world_settings, uber_states);
138-
let mut pool = ItemPool::default();
139-
for item in pool.drain() {
140-
world.simulate(&item, &output);
141-
}
142-
group.bench_function("long", |b| b.iter(|| world.reached()));
139+
let world = World::new(&graph, spawn, &world_settings, uber_states);
140+
let mut pool = ItemPool::new(&mut Pcg64Mcg::new(0));
141+
142+
group.bench_function("long", |b| {
143+
b.iter(|| {
144+
let mut world = world.clone();
145+
world.traverse_spawn(&[]);
146+
for item in pool.drain(..) {
147+
world.simulate(&item, &[]);
148+
}
149+
world.reached_nodes().for_each(drop);
150+
})
151+
});
143152
}
144153

145154
fn generation(c: &mut Criterion) {
@@ -148,14 +157,7 @@ fn generation(c: &mut Criterion) {
148157

149158
let mut universe_settings = UniverseSettings::new(String::default());
150159
let mut seed = 0..;
151-
let graph = Graph::compile(
152-
AREAS.clone(),
153-
LOC_DATA.clone(),
154-
STATE_DATA.clone(),
155-
&universe_settings.world_settings,
156-
)
157-
.into_result()
158-
.unwrap();
160+
let graph = compile_graph(&universe_settings.world_settings);
159161
let snippet_access = &*SNIPPET_ACCESS;
160162
let uber_state_data = &*UBER_STATE_DATA;
161163

@@ -212,14 +214,7 @@ fn generation(c: &mut Criterion) {
212214
preset
213215
.apply(&mut universe_settings.world_settings[0], &*PRESET_ACCESS)
214216
.unwrap();
215-
let graph = Graph::compile(
216-
AREAS.clone(),
217-
LOC_DATA.clone(),
218-
STATE_DATA.clone(),
219-
&universe_settings.world_settings,
220-
)
221-
.into_result()
222-
.unwrap();
217+
let graph = compile_graph(&universe_settings.world_settings);
223218
group.bench_function("unsafe", |b| {
224219
b.iter(|| {
225220
universe_settings.seed = seed.next().unwrap().to_string();
@@ -245,14 +240,7 @@ fn multiworld(c: &mut Criterion) {
245240
preset
246241
.apply(&mut universe_settings.world_settings[0], &*PRESET_ACCESS)
247242
.unwrap();
248-
let graph = Graph::compile(
249-
AREAS.clone(),
250-
LOC_DATA.clone(),
251-
STATE_DATA.clone(),
252-
&universe_settings.world_settings,
253-
)
254-
.into_result()
255-
.unwrap();
243+
let graph = compile_graph(&universe_settings.world_settings);
256244

257245
let snippet_access = &*SNIPPET_ACCESS;
258246
let uber_state_data = &*UBER_STATE_DATA;
@@ -281,6 +269,17 @@ fn multiworld(c: &mut Criterion) {
281269
group.finish();
282270
}
283271

272+
fn compile_graph(settings: &[WorldSettings]) -> Graph {
273+
Graph::compile(
274+
AREAS.clone(),
275+
LOC_DATA.clone(),
276+
STATE_DATA.clone(),
277+
settings,
278+
)
279+
.into_result()
280+
.unwrap()
281+
}
282+
284283
criterion_group!(
285284
all,
286285
logic_parsing,

0 commit comments

Comments
 (0)