Prep for the actually making ritual crafting work.

master
Zed A. Shaw 1 week ago
parent ad1d08ca96
commit 292711f91f
  1. 28
      assets/rituals.json
  2. 1
      autowalker.cpp
  3. 2
      events.hpp
  4. 2
      gui_fsm.cpp
  5. 26
      levelmanager.cpp
  6. 2
      levelmanager.hpp
  7. 19
      ritual_ui.cpp
  8. 18
      rituals.cpp
  9. 16
      rituals.hpp
  10. 16
      tests/rituals.cpp

@ -169,5 +169,31 @@
"damage": 16, "damage": 16,
"probability": 1.0 "probability": 1.0
} }
} },
"junk": [
{
"name": "chess_pawn",
"provides": ["cursed_item"]
},
{
"name": "dirty_kerchief",
"provides": ["has_magick"]
},
{
"name": "mushroom",
"provides": ["has_magick"]
},
{
"name": "pocket_watch",
"provides": ["shiny_bauble"]
},
{
"name": "rusty_nails",
"provides": ["has_spikes"]
},
{
"name": "severed_finger",
"provides": ["cursed_item"]
}
]
} }

@ -259,7 +259,6 @@ void Autowalker::handle_player_walk(ai::State& start, ai::State& goal) {
} }
void Autowalker::autowalk() { void Autowalker::autowalk() {
handle_window_events(); handle_window_events();
if(!fsm.autowalking) { if(!fsm.autowalking) {

@ -4,7 +4,7 @@ namespace Events {
enum GUI { enum GUI {
START, COMBAT, LOOT, DEATH, STAIRS_UP, STAIRS_DOWN, TRAP, START, COMBAT, LOOT, DEATH, STAIRS_UP, STAIRS_DOWN, TRAP,
COMBAT_START, NO_NEIGHBORS, HP_STATUS, COMBAT_START, NO_NEIGHBORS, HP_STATUS,
ATTACK, BLOCK, EVADE, HEAL, ATTACK, BLOCK, EVADE,
UPDATE_SPRITE, ENEMY_SPAWN, NOOP UPDATE_SPRITE, ENEMY_SPAWN, NOOP
}; };

@ -24,7 +24,6 @@ namespace gui {
$mini_map($level), $mini_map($level),
$font{FONT_FILE_NAME} $font{FONT_FILE_NAME}
{ {
$levels.temp_create_player_rituals();
} }
void FSM::event(Event ev) { void FSM::event(Event ev) {
@ -401,7 +400,6 @@ namespace gui {
} break; } break;
case eGUI::EVADE: case eGUI::EVADE:
case eGUI::BLOCK: case eGUI::BLOCK:
case eGUI::HEAL:
dbc::log("YOU NEED TO IMPLEMENT THIS!!!!!"); dbc::log("YOU NEED TO IMPLEMENT THIS!!!!!");
break; break;
case eGUI::ATTACK: case eGUI::ATTACK:

@ -22,32 +22,6 @@ LevelScaling LevelManager::scale_level() {
}; };
} }
void LevelManager::temp_create_player_rituals() {
auto& level = current();
auto player = level.player;
auto& the_belt = level.world->get<combat::RitualBelt>(player);
Config config("assets/config.json");
combat::RitualEngine re("assets/rituals.json");
int slot = 0;
for(auto& settings : config["test_rituals"]) {
if(settings["active"]) {
auto blanket = re.start();
settings.erase("active");
for(auto& el : settings.items()) {
re.set_state(blanket, el.key(), el.value());
}
re.plan(blanket);
auto ritual = re.finalize(blanket);
the_belt.equip(slot, ritual);
slot++;
}
}
}
inline shared_ptr<DinkyECS::World> clone_load_world(shared_ptr<DinkyECS::World> prev_world) inline shared_ptr<DinkyECS::World> clone_load_world(shared_ptr<DinkyECS::World> prev_world)
{ {

@ -42,7 +42,5 @@ class LevelManager {
GameLevel &get(size_t index); GameLevel &get(size_t index);
LevelScaling scale_level(); LevelScaling scale_level();
void temp_create_player_rituals();
DinkyECS::Entity spawn_enemy(std::string named); DinkyECS::Entity spawn_enemy(std::string named);
}; };

@ -29,13 +29,12 @@ namespace gui {
} }
void RitualUI::init() { void RitualUI::init() {
std::vector<std::string> junk_list{ Config config("assets/rituals.json");
{"chess_pawn"}, std::vector<std::string> junk_list;
{"dirty_kerchief"},
{"mushroom"}, for(auto& el : config["junk"]) {
{"pocket_watch"}, std::string name = el["name"];
{"rusty_nails"}, junk_list.push_back(name);
{"severed_finger"}
}; };
for(auto& [name, cell] : $gui.cells()) { for(auto& [name, cell] : $gui.cells()) {
@ -70,7 +69,6 @@ namespace gui {
$ritual_anim = animation::load("ritual_blanket"); $ritual_anim = animation::load("ritual_blanket");
$gui.init(); $gui.init();
} }
bool RitualUI::is_open() { bool RitualUI::is_open() {
@ -91,6 +89,8 @@ namespace gui {
float y = Random::uniform(inner_y, inner_y + ritual_cell.h / 2); float y = Random::uniform(inner_y, inner_y + ritual_cell.h / 2);
bs.sprite->setPosition({float(x), float(y)}); bs.sprite->setPosition({float(x), float(y)});
} }
// this is where we add the junk to the engine
} }
void RitualUI::reset_inv_positions() { void RitualUI::reset_inv_positions() {
@ -113,6 +113,9 @@ namespace gui {
bs.sprite->setColor({200, 0, 0}); bs.sprite->setColor({200, 0, 0});
animation::center(*bs.sprite, {(float)cell.x, (float)cell.y}); animation::center(*bs.sprite, {(float)cell.x, (float)cell.y});
animation::rotate(*bs.sprite, 20.0); animation::rotate(*bs.sprite, 20.0);
// finalize here ritual here
// add it to the belt
} }
bool RitualUI::mouse(float x, float y, bool hover) { bool RitualUI::mouse(float x, float y, bool hover) {

@ -39,13 +39,13 @@ namespace combat {
return $actions.at(name); return $actions.at(name);
} }
RitualAI RitualEngine::start() { RitualBlanket RitualEngine::start() {
auto start = load_state("initial"); auto start = load_state("initial");
auto goal = load_state("final"); auto goal = load_state("final");
return {"actions", start, goal}; return {"actions", start, goal};
} }
void RitualEngine::set_state(RitualAI& ritual, std::string name, bool setting) { void RitualEngine::set_state(RitualBlanket& ritual, std::string name, bool setting) {
dbc::check($profile.contains(name), dbc::check($profile.contains(name),
fmt::format("ritual action named {} is not in profile, look in {} config", fmt::format("ritual action named {} is not in profile, look in {} config",
name, $config.$src_path)); name, $config.$src_path));
@ -53,38 +53,38 @@ namespace combat {
ritual.start.set($profile.at(name), setting); ritual.start.set($profile.at(name), setting);
} }
void RitualEngine::reset(RitualAI& ritual) { void RitualEngine::reset(RitualBlanket& ritual) {
ritual.start = ritual.original; ritual.start = ritual.original;
} }
void RitualEngine::plan(RitualAI& ritual) { void RitualEngine::plan(RitualBlanket& ritual) {
ritual.plan = ai::plan_actions($scripts.at(ritual.script), ritual.start, ritual.goal); ritual.plan = ai::plan_actions($scripts.at(ritual.script), ritual.start, ritual.goal);
} }
bool RitualAI::will_do(std::string name) { bool RitualBlanket::will_do(std::string name) {
if(plan.script.size() == 0) return false; if(plan.script.size() == 0) return false;
return plan.script[0].name == name; return plan.script[0].name == name;
} }
ai::Action RitualAI::pop() { ai::Action RitualBlanket::pop() {
auto result = plan.script.front(); auto result = plan.script.front();
plan.script.pop_front(); plan.script.pop_front();
return result; return result;
} }
// BUG: maybe this should be called RitualBlanket instead? // BUG: maybe this should be called RitualBlanket instead?
void RitualAI::dump() { void RitualBlanket::dump() {
ai::dump_script(script, start, plan.script); ai::dump_script(script, start, plan.script);
} }
bool RitualAI::is_combined() { bool RitualBlanket::is_combined() {
dbc::check(!plan.script.empty(), "you are attempting to check an empty plan"); dbc::check(!plan.script.empty(), "you are attempting to check an empty plan");
auto& last = plan.script.back(); auto& last = plan.script.back();
return plan.script.size() > 1 && last.name == "combined"; return plan.script.size() > 1 && last.name == "combined";
} }
RitualAction RitualEngine::finalize(RitualAI& ritual) { RitualAction RitualEngine::finalize(RitualBlanket& ritual) {
(void)ritual; (void)ritual;
RitualAction result; RitualAction result;

@ -6,19 +6,19 @@
#include "components.hpp" #include "components.hpp"
namespace combat { namespace combat {
struct RitualAI { struct RitualBlanket {
std::string script; std::string script;
ai::State start; ai::State start;
ai::State original; ai::State original;
ai::State goal; ai::State goal;
ai::ActionPlan plan; ai::ActionPlan plan;
RitualAI(std::string script, ai::State start, ai::State goal) : RitualBlanket(std::string script, ai::State start, ai::State goal) :
script(script), start(start), original(start), goal(goal) script(script), start(start), original(start), goal(goal)
{ {
} }
RitualAI() {}; RitualBlanket() {};
bool will_do(std::string name); bool will_do(std::string name);
void dump(); void dump();
@ -55,11 +55,11 @@ namespace combat {
ai::State load_state(std::string name); ai::State load_state(std::string name);
ai::Action load_action(std::string name); ai::Action load_action(std::string name);
RitualAI start(); RitualBlanket start();
void reset(RitualAI& ritual); void reset(RitualBlanket& ritual);
void set_state(RitualAI& ritual, std::string name, bool setting); void set_state(RitualBlanket& ritual, std::string name, bool setting);
void plan(RitualAI& ritual); void plan(RitualBlanket& ritual);
RitualAction finalize(RitualAI& ritual); RitualAction finalize(RitualBlanket& ritual);
}; };
struct RitualBelt { struct RitualBelt {

@ -96,19 +96,3 @@ TEST_CASE("the ritual belt works", "[rituals-belt]") {
REQUIRE(!the_belt.has(0)); REQUIRE(!the_belt.has(0));
} }
} }
TEST_CASE("LevelManager makes a temp belt", "[rituals-belt]") {
LevelManager lm;
lm.temp_create_player_rituals();
auto& level = lm.current();
auto& the_belt = level.world->get<RitualBelt>(level.player);
REQUIRE(the_belt.has(0));
auto& ritual = the_belt.get(0);
REQUIRE(ritual.damage > 0);
REQUIRE(the_belt.has(1));
ritual = the_belt.get(1);
REQUIRE(ritual.damage > 1);
}

Loading…
Cancel
Save