#include "../app/Config.hpp"
#include "../app/Environment.hpp"
#include "../app/init.hpp"
-#include "../app/TextureIndex.hpp"
#include "../io/WorldSave.hpp"
#include <SDL.h>
)
: config(config)
, env(env)
-, shapes()
-, block_types()
+, res()
+, sounds()
, save(save)
-, world(block_types, wc)
+, world(res.block_types, wc)
, spawn_index(world.Chunks().MakeIndex(wc.spawn, 3))
, player(*world.AddPlayer(config.player.name))
, spawn_player(false)
, hud(env, config, player)
-, manip(env, player.GetEntity())
+, manip(env.audio, sounds, player.GetEntity())
, input(world, player, manip)
, interface(config, env.keymap, input, *this)
, generator(gc)
, chunk_loader(world.Chunks(), generator, save)
, chunk_renderer(player.GetChunks())
-, skeletons()
-, spawner(world, skeletons, env.rng)
+, spawner(world, res.models, env.rng)
, sky(env.loader.LoadCubeMap("skybox"))
+, cli(world)
, preload(env, chunk_loader, chunk_renderer)
-, unload(env, world.Chunks(), save) {
- TextureIndex tex_index;
- env.loader.LoadShapes("default", shapes);
- env.loader.LoadBlockTypes("default", block_types, tex_index, shapes);
- skeletons.Load(shapes);
- spawner.LimitSkeletons(0, skeletons.size());
- spawner.LoadTextures(tex_index);
- interface.SetInventorySlots(block_types.size() - 1);
- generator.LoadTypes(block_types);
- chunk_renderer.LoadTextures(env.loader, tex_index);
+, unload(env, world.Chunks(), save)
+, chat(env, *this, *this) {
+ res.Load(env.loader, "default");
+ if (res.models.size() < 2) {
+ throw std::runtime_error("need at least two models to run");
+ }
+ res.models[0].Instantiate(player.GetEntity().GetModel());
+ sounds.Load(env.loader, res.snd_index);
+ spawner.LimitModels(1, res.models.size());
+ interface.SetInventorySlots(res.block_types.size() - 1);
+ generator.LoadTypes(res.block_types);
+ chunk_renderer.LoadTextures(env.loader, res.tex_index);
chunk_renderer.FogDensity(wc.fog_density);
if (save.Exists(player)) {
save.Read(player);
void MasterState::OnResume() {
if (spawn_index.MissingChunks() > 0) {
env.state.Push(&preload);
- }
- if (config.input.mouse) {
- env.window.GrabMouse();
+ return;
}
if (spawn_player) {
// TODO: spawn
spawn_player = false;
}
+ hud.KeepMessages(false);
+ OnFocus();
}
void MasterState::OnPause() {
+ OnBlur();
+}
+
+void MasterState::OnFocus() {
+ if (config.input.mouse) {
+ env.window.GrabMouse();
+ }
+ interface.Unlock();
+}
+
+void MasterState::OnBlur() {
env.window.ReleaseMouse();
+ interface.Lock();
}
void MasterState::Handle(const SDL_Event &event) {
switch (event.type) {
case SDL_KEYDOWN:
- interface.HandlePress(event.key);
+ // TODO: move to interface
+ if (event.key.keysym.sym == SDLK_RETURN) {
+ chat.Clear();
+ env.state.Push(&chat);
+ hud.KeepMessages(true);
+ } else if (event.key.keysym.sym == SDLK_SLASH) {
+ chat.Preset("/");
+ env.state.Push(&chat);
+ hud.KeepMessages(true);
+ } else {
+ interface.HandlePress(event.key);
+ }
break;
case SDL_KEYUP:
interface.HandleRelease(event.key);
}
void MasterState::Update(int dt) {
- input.Update(dt);
+ spawner.Update(dt);
+ world.Update(dt);
if (input.BlockFocus()) {
hud.FocusBlock(input.BlockFocus().GetChunk(), input.BlockFocus().block);
} else if (input.EntityFocus()) {
} else {
hud.FocusNone();
}
- hud.Display(block_types[player.GetInventorySlot() + 1]);
+ hud.Display(res.block_types[player.GetInventorySlot() + 1]);
hud.Update(dt);
- spawner.Update(dt);
- world.Update(dt);
chunk_loader.Update(dt);
chunk_renderer.Update(dt);
}
void MasterState::Render(Viewport &viewport) {
- viewport.WorldPosition(player.GetEntity().Transform(player.GetEntity().ChunkCoords()));
+ viewport.WorldPosition(player.GetEntity().ViewTransform(player.GetEntity().ChunkCoords()));
if (config.video.world) {
chunk_renderer.Render(viewport);
world.Render(viewport);
+ if (config.video.debug) {
+ world.RenderDebug(viewport);
+ }
sky.Render(viewport);
}
hud.Render(viewport);
env.state.Switch(&unload);
}
+void MasterState::OnLineSubmit(const std::string &line) {
+ if (line.empty()) {
+ return;
+ }
+ if (line[0] == '/' && line.size() > 1 && line[1] != '/') {
+ cli.Execute(player, line.substr(1));
+ } else {
+ hud.PostMessage(line);
+ }
+}
+
}
}