X-Git-Url: http://git.localhorst.tv/?a=blobdiff_plain;f=src%2Fstandalone%2FMasterState.cpp;h=ced107d1a85573c2462defb16c48e7d2eaf47aba;hb=9da6ac5e93d79e79658a95d5f6efe42146873583;hp=30925a971db74b41ea39cc419bcfb1b5acac70f2;hpb=e1209ec25c4cc91e13889876106f56bd51aa96e2;p=blank.git diff --git a/src/standalone/MasterState.cpp b/src/standalone/MasterState.cpp index 30925a9..ced107d 100644 --- a/src/standalone/MasterState.cpp +++ b/src/standalone/MasterState.cpp @@ -1,8 +1,10 @@ #include "MasterState.hpp" +#include "../app/Config.hpp" #include "../app/Environment.hpp" #include "../app/init.hpp" #include "../app/TextureIndex.hpp" +#include "../io/WorldSave.hpp" #include @@ -12,31 +14,47 @@ namespace standalone { MasterState::MasterState( Environment &env, + Config &config, const Generator::Config &gc, - const Interface::Config &ic, const World::Config &wc, const WorldSave &save ) -: env(env) +: config(config) +, env(env) , block_types() +, save(save) , world(block_types, wc) -, interface(ic, env, world, world.AddPlayer(ic.player_name)) +, spawn_index(world.Chunks().MakeIndex(wc.spawn, 3)) +, player(*world.AddPlayer(config.player.name)) +, hud(env, config, player) +, manip(env, player.GetEntity()) +, input(world, player, manip) +, interface(config, env.keymap, input, *this) , generator(gc) , chunk_loader(world.Chunks(), generator, save) -, chunk_renderer(*interface.GetPlayer().chunks) +, chunk_renderer(player.GetChunks()) , skeletons() -, spawner(world, skeletons, gc.seed) +, spawner(world, skeletons, env.rng) , sky(env.loader.LoadCubeMap("skybox")) , preload(env, chunk_loader, chunk_renderer) , unload(env, world.Chunks(), save) { TextureIndex tex_index; env.loader.LoadBlockTypes("default", block_types, tex_index); + interface.SetInventorySlots(block_types.size() - 1); + generator.LoadTypes(block_types); chunk_renderer.LoadTextures(env.loader, tex_index); chunk_renderer.FogDensity(wc.fog_density); skeletons.Load(); - spawner.LimitSkeletons(0, skeletons.Size()); - // TODO: better solution for initializing HUD - interface.SelectNext(); + spawner.LimitSkeletons(0, skeletons.size()); + if (save.Exists(player)) { + save.Read(player); + } else { + // TODO: spawn + } +} + +MasterState::~MasterState() { + world.Chunks().UnregisterIndex(spawn_index); } @@ -67,7 +85,7 @@ void MasterState::Handle(const SDL_Event &event) { interface.Handle(event.wheel); break; case SDL_QUIT: - env.state.Switch(&unload); + Exit(); break; default: break; @@ -75,30 +93,79 @@ void MasterState::Handle(const SDL_Event &event) { } void MasterState::Update(int dt) { - interface.Update(dt); + input.Update(dt); + if (input.BlockFocus()) { + hud.FocusBlock(input.BlockFocus().GetChunk(), input.BlockFocus().block); + } else if (input.EntityFocus()) { + hud.FocusEntity(*input.EntityFocus().entity); + } else { + hud.FocusNone(); + } + hud.Display(block_types[player.GetInventorySlot() + 1]); + hud.Update(dt); spawner.Update(dt); world.Update(dt); chunk_loader.Update(dt); chunk_renderer.Update(dt); - Entity &player = *interface.GetPlayer().entity; - - glm::mat4 trans = player.Transform(player.ChunkCoords()); + glm::mat4 trans = player.GetEntity().Transform(player.GetEntity().ChunkCoords()); glm::vec3 dir(trans * glm::vec4(0.0f, 0.0f, -1.0f, 0.0f)); glm::vec3 up(trans * glm::vec4(0.0f, 1.0f, 0.0f, 0.0f)); - env.audio.Position(player.Position()); - env.audio.Velocity(player.Velocity()); + env.audio.Position(player.GetEntity().Position()); + env.audio.Velocity(player.GetEntity().Velocity()); env.audio.Orientation(dir, up); } void MasterState::Render(Viewport &viewport) { - Entity &player = *interface.GetPlayer().entity; - viewport.WorldPosition(player.Transform(player.ChunkCoords())); - chunk_renderer.Render(viewport); - world.Render(viewport); - sky.Render(viewport); + viewport.WorldPosition(player.GetEntity().Transform(player.GetEntity().ChunkCoords())); + if (config.video.world) { + chunk_renderer.Render(viewport); + world.Render(viewport); + sky.Render(viewport); + } + hud.Render(viewport); +} + + +void MasterState::SetAudio(bool b) { + config.audio.enabled = b; + if (b) { + hud.PostMessage("Audio enabled"); + } else { + hud.PostMessage("Audio disabled"); + } +} + +void MasterState::SetVideo(bool b) { + config.video.world = b; + if (b) { + hud.PostMessage("World rendering enabled"); + } else { + hud.PostMessage("World rendering disabled"); + } +} + +void MasterState::SetHUD(bool b) { + config.video.hud = b; + if (b) { + hud.PostMessage("HUD rendering enabled"); + } else { + hud.PostMessage("HUD rendering disabled"); + } +} + +void MasterState::SetDebug(bool b) { + config.video.debug = b; + if (b) { + hud.PostMessage("Debug rendering enabled"); + } else { + hud.PostMessage("Debug rendering disabled"); + } +} - interface.Render(viewport); +void MasterState::Exit() { + save.Write(player); + env.state.Switch(&unload); } }