Prep for the actually making ritual crafting work.
This commit is contained in:
parent
ad1d08ca96
commit
292711f91f
10 changed files with 56 additions and 74 deletions
|
@ -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) {
|
||||||
|
|
18
rituals.cpp
18
rituals.cpp
|
@ -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;
|
||||||
|
|
16
rituals.hpp
16
rituals.hpp
|
@ -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…
Add table
Add a link
Reference in a new issue