Animator won't crash anymore when there's an error, and instead displays an error message.

This commit is contained in:
Zed A. Shaw 2026-02-07 13:05:24 -05:00
parent 46f34828e4
commit 0d481a5ab7
6 changed files with 76 additions and 18 deletions

View file

@ -104,10 +104,13 @@ namespace animator {
}
void FSM::change_form(int direction) {
dbc::check($anim.forms.size() > 0, "you can't use an empty animation.forms idiot.");
if($anim.forms.size() == 0) {
$ui.show_error("NO FORMS!");
return;
}
$cur_form_i = std::clamp($cur_form_i + direction, 0, int($anim.forms.size()) - 1);
dbc::check($cur_form_i >= 0, "you fucked up, Zed");
dbc::check($cur_form_i >= 0, "CATASTROPHE! cur_form_i went below 0. How?");
// this is the dumbest shit ever
auto key_view = std::views::keys($anim.forms);
@ -157,12 +160,34 @@ namespace animator {
}
void FSM::reload() {
$anim = animate2::load("assets/animate2.json", $anim_name);
animate2::Animate2 new_anim;
// BUG: this will throw the index off after reloads, oh well
$anim.set_form($cur_form);
$last_mod_time = std::filesystem::last_write_time("assets/animate2.json");
try {
new_anim = animate2::load("assets/animate2.json", $anim_name);
} catch(...) {
$ui.show_error("Failed to load JSON");
return;
}
if(!new_anim.has_form($cur_form)) {
$ui.show_error(fmt::format("No form {}", $cur_form));
$cur_form = "idle";
$cur_form_i = 0;
}
new_anim.set_form($cur_form);
try {
$last_mod_time = std::filesystem::last_write_time("assets/animate2.json");
} catch(...) {
$ui.show_error("Filesystem error");
}
if($anim.form_name == new_anim.form_name) {
$ui.clear_error();
}
$anim = new_anim;
$anim.play();
}
@ -233,6 +258,8 @@ namespace animator {
"[error]");
$overlay.init();
$initialized_this_sucks_ass = true;
}
void UI::render(sf::RenderWindow& window, bool debug) {
@ -255,13 +282,27 @@ namespace animator {
$overlay.show_text("transform", guecs::to_wstring(anim.transform_name));
}
void UI::show_error(const std::string& message) {
if($initialized_this_sucks_ass) {
$overlay.show_text("error", guecs::to_wstring(message));
} else {
dbc::log(message);
}
}
void UI::clear_error() {
if($initialized_this_sucks_ass) {
$overlay.show_text("error", L"");
}
}
std::shared_ptr<sf::Sprite> UI::get_sprite() {
auto viewer = $ui.entity("viewer");
return $ui.get<guecs::Sprite>(viewer).sprite;
}
}
int error() {
int error_usage() {
fmt::println("USAGE: animator -h -b <background> -s <sprite> -a <animation>");
return 1;
}
@ -291,21 +332,21 @@ int main(int argc, char* argv[]) {
anim_name = optarg;
break;
case 'h': // fallthrough
error();
error_usage();
break;
default:
return error();
return error_usage();
break;
}
}
if(sprite_name == "") {
return error();
return error_usage();
} else if(anim_name == "") {
anim_name = sprite_name; // default to the same
}
sound::mute(false);
sound::mute(true);
animator::FSM main;
main.init(sprite_name, anim_name, background);