huge refactor of overmap-local map travel

This commit is contained in:
Llywelwyn 2023-08-27 16:21:15 +01:00
parent 02be487334
commit 8e3ed5cead
9 changed files with 103 additions and 145 deletions

View file

@ -70,9 +70,7 @@ pub enum RunState {
},
SaveGame,
GameOver,
PreviousLevel,
NextLevel,
GoToLevel(i32, Option<TileType>),
GoToLevel(i32, TileType),
HelpScreen,
MagicMapReveal {
row: i32,
@ -90,12 +88,12 @@ pub struct State {
}
impl State {
fn generate_world_map(&mut self, new_id: i32, offset: i32, from_tile: Option<TileType>) {
fn generate_world_map(&mut self, new_id: i32, dest_tile: TileType) {
// Visualisation stuff
self.mapgen_index = 0;
self.mapgen_timer = 0.0;
self.mapgen_history.clear();
let map_building_info = map::level_transition(&mut self.ecs, new_id, offset, from_tile);
let map_building_info = map::level_transition(&mut self.ecs, new_id, dest_tile);
if let Some(history) = map_building_info {
self.mapgen_history = history;
} else {
@ -172,35 +170,18 @@ impl State {
default_move_ai.run_now(&self.ecs);
}
fn goto_id(&mut self, id: i32, from_tile: Option<TileType>) {
fn goto_id(&mut self, id: i32, dest_tile: TileType) {
let current_id;
{
let worldmap_resource = self.ecs.fetch::<Map>();
current_id = worldmap_resource.id;
}
let offset = id - current_id;
self.goto_level(offset, from_tile);
}
fn goto_level(&mut self, offset: i32, from_tile: Option<TileType>) {
// Build new map + place player
let current_id;
{
let worldmap_resource = self.ecs.fetch::<Map>();
current_id = worldmap_resource.id;
}
// Record the correct type of event
if offset < 0 && current_id == 1 {
gamelog::Logger::new().append("CHEAT MENU: YOU CAN'T DO THAT.").colour((255, 0, 0)).log();
return;
} else {
gamelog::record_event(EVENT::CHANGED_FLOOR(current_id + offset));
}
// Freeze the current level
// Freeze curr level
map::dungeon::freeze_entities(&mut self.ecs);
self.generate_world_map(current_id + offset, offset, from_tile);
self.generate_world_map(id, dest_tile);
let mapname = self.ecs.fetch::<Map>().name.clone();
gamelog::Logger::new().append("You head to").npc_name_n(mapname).period().log();
gamelog::record_event(EVENT::CHANGED_FLOOR(id));
}
fn game_over_cleanup(&mut self) {
@ -221,7 +202,7 @@ impl State {
}
// Replace map list
self.ecs.insert(map::dungeon::MasterDungeonMap::new());
self.generate_world_map(1, 0, None);
self.generate_world_map(1, TileType::Floor);
gamelog::setup_log();
gamelog::record_event(EVENT::LEVEL(1));
@ -310,12 +291,14 @@ impl GameState for State {
}
gui::CheatMenuResult::NoResponse => {}
gui::CheatMenuResult::Ascend => {
self.goto_level(-1, Some(TileType::UpStair));
let id = self.ecs.fetch::<Map>().id - 1;
self.goto_id(id, TileType::DownStair);
self.mapgen_next_state = Some(RunState::PreRun);
new_runstate = RunState::MapGeneration;
}
gui::CheatMenuResult::Descend => {
self.goto_level(1, Some(TileType::DownStair));
let id = self.ecs.fetch::<Map>().id + 1;
self.goto_id(id, TileType::UpStair);
self.mapgen_next_state = Some(RunState::PreRun);
new_runstate = RunState::MapGeneration;
}
@ -534,18 +517,8 @@ impl GameState for State {
});
}
}
RunState::NextLevel => {
self.goto_level(1, Some(TileType::DownStair));
self.mapgen_next_state = Some(RunState::PreRun);
new_runstate = RunState::MapGeneration;
}
RunState::PreviousLevel => {
self.goto_level(-1, Some(TileType::UpStair));
self.mapgen_next_state = Some(RunState::PreRun);
new_runstate = RunState::MapGeneration;
}
RunState::GoToLevel(id, from_tile) => {
self.goto_id(id, from_tile);
RunState::GoToLevel(id, dest_tile) => {
self.goto_id(id, dest_tile);
self.mapgen_next_state = Some(RunState::PreRun);
new_runstate = RunState::MapGeneration;
}
@ -750,7 +723,7 @@ fn main() -> rltk::BError {
gamelog::setup_log();
gamelog::record_event(EVENT::LEVEL(1));
gs.generate_world_map(1, 0, None);
gs.generate_world_map(1, TileType::Floor);
rltk::main_loop(context, gs)
}