Level traversal works, but it's very immediate. Next is a little 'confirm level' modal and a transition screen.

master
Zed A. Shaw 2 weeks ago
parent 1886c99920
commit 29e6d45dc6
  1. 5
      combat_ui.cpp
  2. 2
      combat_ui.hpp
  3. 38
      gui_fsm.cpp
  4. 4
      gui_fsm.hpp
  5. 1
      inventory.cpp
  6. 8
      levelmanager.hpp
  7. 19
      main_ui.cpp
  8. 4
      main_ui.hpp
  9. 11
      raycaster.cpp
  10. 5
      raycaster.hpp
  11. 7
      status_ui.cpp
  12. 2
      status_ui.hpp
  13. 9
      systems.cpp
  14. 4
      worldbuilder.cpp

@ -50,4 +50,9 @@ namespace gui {
auto& meter = $gui.world().get<Meter>($meter);
meter.percent = percent;
}
void CombatUI::update_level(GameLevel &level) {
$level = level;
render();
}
}

@ -15,7 +15,7 @@ namespace gui {
void render();
void draw(sf::RenderWindow& window);
void update_level(GameLevel &level) { $level = level; }
void update_level(GameLevel &level);
void set_damage(float percent);
};
}

@ -14,7 +14,7 @@ namespace gui {
FSM::FSM() :
$window(sf::VideoMode({SCREEN_WIDTH, SCREEN_HEIGHT}), "Zed's Raycaster Thing"),
$main_ui($window, $levels.current()),
$main_ui($window),
$renderer($window),
$level($levels.current()),
$map_ui($level),
@ -34,12 +34,13 @@ namespace gui {
FSM_STATE(State, IDLE, ev);
FSM_STATE(State, IN_COMBAT, ev);
FSM_STATE(State, COMBAT_ROTATE, ev);
FSM_STATE(State, NEXT_LEVEL, ev);
FSM_STATE(State, END, ev);
}
}
void FSM::START(Event ) {
$main_ui.generate_map();
$main_ui.update_level($level);
$level.world->set_the<Debug>({});
$main_ui.init();
@ -160,6 +161,9 @@ namespace gui {
case CLOSE:
dbc::log("Nothing to close.");
break;
case STAIRS_DOWN:
state(State::NEXT_LEVEL);
break;
case STOP_COMBAT:
case TICK:
// do nothing
@ -169,6 +173,18 @@ namespace gui {
}
}
void FSM::NEXT_LEVEL(Event ev) {
using enum Event;
switch(ev) {
case TICK:
next_level();
state(State::IDLE);
default:
break; // do nothing for now
}
}
void FSM::IN_COMBAT(Event ev) {
using enum Event;
@ -342,11 +358,13 @@ namespace gui {
// std::string(item.data["name"])));
$status_ui.log("You picked up an item.");
$status_ui.update();
}
break;
} break;
case eGUI::ATTACK:
event(Event::ATTACK);
break;
case eGUI::STAIRS_DOWN:
event(Event::STAIRS_DOWN);
break;
case eGUI::DEATH: {
$status_ui.update();
if(entity != player.entity) {
@ -366,4 +384,16 @@ namespace gui {
}
}
}
void FSM::next_level() {
$levels.create_level($level.world);
$level = $levels.next();
$status_ui.update_level($level);
$combat_ui.update_level($level);
$map_ui.update_level($level);
$main_ui.update_level($level);
run_systems();
}
}

@ -19,6 +19,7 @@ namespace gui {
ATTACKING,
MAPPING,
ROTATING,
NEXT_LEVEL,
IDLE,
END
};
@ -37,6 +38,7 @@ namespace gui {
ATTACK,
START_COMBAT,
STOP_COMBAT,
STAIRS_DOWN,
QUIT
};
@ -65,6 +67,7 @@ namespace gui {
void IDLE(Event ev);
void IN_COMBAT(Event ev);
void COMBAT_ROTATE(Event ev);
void NEXT_LEVEL(Event ev);
void END(Event ev);
void try_move(int dir, bool strafe);
@ -74,5 +77,6 @@ namespace gui {
bool active();
void run_systems();
void handle_world_events();
void next_level();
};
}

@ -15,6 +15,7 @@ namespace components {
}
bool Inventory::has_item(size_t at) {
fmt::println(">>> INVENTORY: requesting item at {}, have {} items in stock", at, items.size());
return at < items.size();
}

@ -13,10 +13,10 @@ using std::shared_ptr;
struct GameLevel {
size_t index;
DinkyECS::Entity player;
shared_ptr<Map> map;
shared_ptr<DinkyECS::World> world;
shared_ptr<lighting::LightRender> lights;
shared_ptr<SpatialMap> collision;
shared_ptr<Map> map = nullptr;
shared_ptr<DinkyECS::World> world = nullptr;
shared_ptr<lighting::LightRender> lights = nullptr;
shared_ptr<SpatialMap> collision = nullptr;
};
struct LevelScaling {

@ -4,9 +4,8 @@
namespace gui {
using namespace components;
MainUI::MainUI(sf::RenderWindow& window, GameLevel level) :
MainUI::MainUI(sf::RenderWindow& window) :
$window(window),
$level(level),
$overlay_ui($level),
$rayview(RAY_VIEW_WIDTH, RAY_VIEW_HEIGHT)
{
@ -121,18 +120,20 @@ namespace gui {
$camera.abort_plan($rayview);
}
void MainUI::generate_map() {
auto& player = $level.world->get_the<Player>();
auto& player_position = $level.world->get<Position>(player.entity);
$player = player_position.location;
$rayview.set_level($level);
}
void MainUI::dead_entity(DinkyECS::Entity entity) {
auto &sprite = $level.world->get<Sprite>(entity);
$rayview.update_sprite(entity, sprite);
}
void MainUI::update_level(GameLevel level) {
$level = level;
auto& player_position = $level.world->get<Position>($level.player);
$player = player_position.location;
$rayview.update_level($level);
$rayview.position_camera($player.x + 0.5, $player.y + 0.5);
dirty();
}
void MainUI::mouse(int x, int y) {
$overlay_ui.$gui.mouse(x, y);
}

@ -20,7 +20,7 @@ namespace gui {
Raycaster $rayview;
CameraLOL $camera;
MainUI(sf::RenderWindow& window, GameLevel level);
MainUI(sf::RenderWindow& window);
void mouse(int x, int y);
void debug();
@ -32,12 +32,12 @@ namespace gui {
std::optional<Point> play_move();
Point plan_move(int dir, bool strafe);
void abort_plan();
void update_level(GameLevel level);
void init();
void draw();
void dirty();
void generate_map();
void dead_entity(DinkyECS::Entity entity);
};
}

@ -368,19 +368,18 @@ void Raycaster::update_sprite(DinkyECS::Entity ent, components::Sprite& sprite)
$sprites.insert_or_assign(ent, sprite_txt);
}
void Raycaster::set_level(GameLevel level) {
void Raycaster::update_level(GameLevel level) {
$level = level;
auto& tiles = $level.map->tiles();
auto world = $level.world;
auto& player = world->get_the<components::Player>();
$map = textures::convert_char_to_texture(tiles.$tile_ids);
world->query<components::Sprite>([&](const auto ent, auto& sprite) {
$level.world->query<components::Sprite>([&](const auto ent, auto& sprite) {
// player doesn't need a sprite
if(player.entity == ent) return;
if($level.player == ent) return;
fmt::println("entity {} will have sprite named {}", ent, sprite.name);
auto sprite_txt = textures::get(sprite.name);
$sprites.try_emplace(ent, sprite_txt);
$sprites.insert_or_assign(ent, sprite_txt);
});
}

@ -34,9 +34,10 @@ struct Raycaster {
int $height;
int $screen_pos_x = RAY_VIEW_X;
int $screen_pos_y = RAY_VIEW_Y;
std::unordered_map<DinkyECS::Entity, textures::SpriteTexture> $sprites;
GameLevel $level;
Matrix $map;
std::unordered_map<DinkyECS::Entity, textures::SpriteTexture> $sprites;
std::vector<double> $zbuffer; // width
Raycaster(int width, int height);
@ -57,7 +58,7 @@ struct Raycaster {
return ((y) * $width) + (x);
}
void set_level(GameLevel level);
void update_level(GameLevel level);
void update_sprite(DinkyECS::Entity ent, components::Sprite& sprite);
void init_shaders();
};

@ -59,6 +59,7 @@ namespace gui {
auto& inventory = world->get<components::Inventory>($level.player);
size_t inv_id = $slots[any_cast<string>(slot_name)];
if(inventory.has_item(inv_id)) {
auto [used, name] = inventory.use($level, inv_id);
if(used) {
@ -70,6 +71,7 @@ namespace gui {
update();
}
}
}
/* WARNING: This is really not the greatest way to do this. */
void StatusUI::update() {
@ -118,4 +120,9 @@ namespace gui {
$messages.pop_back();
}
}
void StatusUI::update_level(GameLevel &level) {
$level = level;
render();
}
}

@ -16,7 +16,7 @@ namespace gui {
StatusUI(GameLevel level);
void select_slot(DinkyECS::Entity ent, std::any data);
void update_level(GameLevel &level) { $level = level; }
void update_level(GameLevel &level);
void log(std::string msg);
void render();
void draw(sf::RenderWindow &window);

@ -254,8 +254,13 @@ void System::device(DinkyECS::World &world, DinkyECS::Entity actor, DinkyECS::En
auto& device = world.get<Device>(item);
for(auto event : device.events) {
// world.send<Events::GUI>((Events::GUI)event, actor, device);
fmt::println("BROKEN can't sent device event {}", event);
fmt::println("Device event received {}", event);
if(event == "Events::GUI::STAIRS_DOWN") {
world.send<Events::GUI>(Events::GUI::STAIRS_DOWN, actor, device);
} else {
dbc::log(fmt::format("EVENT IGNORED {}", event));
}
}
println("entity {} INTERACTED WITH DEVICE {}", actor, item);

@ -244,11 +244,13 @@ void WorldBuilder::randomize_entities(DinkyECS::World &world, GameConfig &config
}
void WorldBuilder::place_stairs(DinkyECS::World& world, GameConfig& config) {
for(size_t i = 1; i < $map.room_count() - 1; i++) {
auto& device_config = config.devices.json();
auto entity_data = device_config["STAIRS_DOWN"];
int last_room = $map.room_count() - 1;
int last_room = i;
auto entity = configure_entity_in_map(world, entity_data, last_room);
check_player(world, entity);
}
}
void WorldBuilder::place_entities(DinkyECS::World &world) {

Loading…
Cancel
Save