Skip to main content

pinch_points/sim/
campaign.rs

1//! The Tide Pool campaign: embedded levels, in play order.
2//!
3//! Every level carries a `solution:` line that `tests/campaign.rs` replays
4//! against the sim: a level that ships is a level that is provably solvable
5//! within its signpost inventory.
6
7use crate::sim::level::Level;
8
9pub const CAMPAIGN: &[&str] = &[
10    include_str!("../../levels/01_welcome_ashore.txt"),
11    include_str!("../../levels/02_first_turn.txt"),
12    include_str!("../../levels/03_follow_the_claw.txt"),
13    include_str!("../../levels/04_corner_pocket.txt"),
14    include_str!("../../levels/05_two_minds.txt"),
15    include_str!("../../levels/06_signpost_splitter.txt"),
16    include_str!("../../levels/07_family_outing.txt"),
17    include_str!("../../levels/08_detour.txt"),
18    include_str!("../../levels/09_both_lanes.txt"),
19    include_str!("../../levels/10_confluence.txt"),
20    include_str!("../../levels/11_break_the_loop.txt"),
21    include_str!("../../levels/12_merry_go_round.txt"),
22    include_str!("../../levels/13_crossroads.txt"),
23    include_str!("../../levels/14_right_of_way.txt"),
24    include_str!("../../levels/15_trust_the_claw.txt"),
25    include_str!("../../levels/16_island_keep.txt"),
26    include_str!("../../levels/17_two_doors.txt"),
27    include_str!("../../levels/18_rush_hour.txt"),
28    include_str!("../../levels/19_odd_couple.txt"),
29    include_str!("../../levels/20_pinch_point.txt"),
30    include_str!("../../levels/21_log_ride.txt"),
31    include_str!("../../levels/22_second_serving.txt"),
32    include_str!("../../levels/23_into_the_weeds.txt"),
33    include_str!("../../levels/24_dry_feet.txt"),
34    include_str!("../../levels/25_the_old_mill.txt"),
35    include_str!("../../levels/26_open_ocean.txt"),
36    include_str!("../../levels/27_follow_the_molt.txt"),
37    include_str!("../../levels/28_twin_logs.txt"),
38    include_str!("../../levels/29_golden_hour.txt"),
39    include_str!("../../levels/30_hunker_down.txt"),
40    include_str!("../../levels/31_crossfall.txt"),
41    include_str!("../../levels/32_mill_race.txt"),
42    include_str!("../../levels/33_rock_pool.txt"),
43    include_str!("../../levels/34_misroute.txt"),
44    include_str!("../../levels/35_pool_party.txt"),
45    include_str!("../../levels/36_gull_gauntlet.txt"),
46    include_str!("../../levels/37_half_measure.txt"),
47    include_str!("../../levels/38_kelp_keep.txt"),
48    include_str!("../../levels/39_toll_road.txt"),
49    include_str!("../../levels/40_molt_gather.txt"),
50    include_str!("../../levels/41_gold_rush.txt"),
51    include_str!("../../levels/42_long_way_round.txt"),
52    include_str!("../../levels/43_down_the_steps.txt"),
53    include_str!("../../levels/44_zigzag.txt"),
54    include_str!("../../levels/45_two_ladders.txt"),
55    include_str!("../../levels/46_cold_feet.txt"),
56    include_str!("../../levels/47_two_tides.txt"),
57    include_str!("../../levels/48_the_long_stair.txt"),
58    include_str!("../../levels/49_the_back_stair.txt"),
59    include_str!("../../levels/50_gold_ladder.txt"),
60    include_str!("../../levels/51_kelp_and_cross.txt"),
61    include_str!("../../levels/52_two_giants.txt"),
62    include_str!("../../levels/53_down_the_middle.txt"),
63    include_str!("../../levels/54_left_behind.txt"),
64    include_str!("../../levels/55_pincer.txt"),
65    include_str!("../../levels/56_weed_between.txt"),
66    include_str!("../../levels/57_slow_and_sure.txt"),
67    include_str!("../../levels/58_the_long_shelf.txt"),
68    include_str!("../../levels/59_quick_feet.txt"),
69    include_str!("../../levels/60_rock_row.txt"),
70    include_str!("../../levels/61_two_logs.txt"),
71    include_str!("../../levels/62_over_the_pool.txt"),
72    include_str!("../../levels/63_round_the_log.txt"),
73    include_str!("../../levels/64_deep_water.txt"),
74    include_str!("../../levels/65_two_giants_again.txt"),
75    include_str!("../../levels/66_castle_on_high.txt"),
76    include_str!("../../levels/67_three_ways_in.txt"),
77    include_str!("../../levels/68_the_far_corner.txt"),
78    include_str!("../../levels/69_weed_gate.txt"),
79    include_str!("../../levels/70_last_of_the_tide.txt"),
80    include_str!("../../levels/71_the_four_doors.txt"),
81    include_str!("../../levels/72_four_doors_up.txt"),
82    include_str!("../../levels/73_both_ways_home.txt"),
83    include_str!("../../levels/74_the_left_turn.txt"),
84    include_str!("../../levels/75_the_right_turn.txt"),
85    include_str!("../../levels/76_the_ragged_lanes.txt"),
86    include_str!("../../levels/77_one_down_three_up.txt"),
87    include_str!("../../levels/78_three_up_and_a_sidestep.txt"),
88    include_str!("../../levels/79_the_left_shoulder.txt"),
89    include_str!("../../levels/80_the_right_shoulder.txt"),
90    include_str!("../../levels/81_the_long_and_short.txt"),
91    include_str!("../../levels/82_the_last_lane.txt"),
92];
93
94/// Beach Day (spec ยง5.2): goal-based 30-second challenge stages, the
95/// original's Stage Challenge re-themed. Versus arrow rules (cap 3, evict,
96/// posts fade), each validated by tests via its authored solution.
97pub const CHALLENGES: &[&str] = &[
98    include_str!("../../challenges/01_first_flood.txt"),
99    include_str!("../../challenges/02_fork_the_flow.txt"),
100    include_str!("../../challenges/03_hold_the_line.txt"),
101    include_str!("../../challenges/04_golden_ticket.txt"),
102    include_str!("../../challenges/05_torrent.txt"),
103    include_str!("../../challenges/06_gull_storm.txt"),
104    include_str!("../../challenges/07_double_gold.txt"),
105    include_str!("../../challenges/08_feeding_frenzy.txt"),
106];
107
108pub fn challenge_levels() -> Vec<Level> {
109    CHALLENGES
110        .iter()
111        .enumerate()
112        .map(|(i, text)| {
113            Level::parse(text).unwrap_or_else(|e| panic!("challenge stage {}: {e}", i + 1))
114        })
115        .collect()
116}
117
118/// Parse the whole campaign. Panics on a malformed level; the validation
119/// test fails first, so a shipped binary never hits this.
120pub fn campaign_levels() -> Vec<Level> {
121    CAMPAIGN
122        .iter()
123        .enumerate()
124        .map(|(i, text)| {
125            Level::parse(text).unwrap_or_else(|e| panic!("campaign level {}: {e}", i + 1))
126        })
127        .collect()
128}