diff options
Diffstat (limited to 'src/candy_gear/core.cpp')
-rw-r--r-- | src/candy_gear/core.cpp | 129 |
1 files changed, 129 insertions, 0 deletions
diff --git a/src/candy_gear/core.cpp b/src/candy_gear/core.cpp new file mode 100644 index 0000000..0f5330c --- /dev/null +++ b/src/candy_gear/core.cpp @@ -0,0 +1,129 @@ +/* + * Copyright 2022-2025 Frederico de Oliveira Linhares + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "core.hpp" + +#include "candy_gear.hpp" +#include "font.hpp" +#include "graphic.hpp" +#include "key.hpp" +#include "orientation_3d.hpp" +#include "skeletal_model.hpp" +#include "skeletal_mesh.hpp" +#include "static_model.hpp" +#include "static_mesh.hpp" +#include "sound.hpp" +#include "sprite.hpp" +#include "sprite_3d.hpp" +#include "texture.hpp" +#include "vector_3d.hpp" +#include "vector_4d.hpp" +#include "view.hpp" + +#ifdef DEBUG +#include <sstream> +#endif + +namespace +{ + +void +load_mruby_symbols(void *obj) +{ + cg_core.sym_config = mrb_intern_cstr(cg_core.mrb, "config"); + cg_core.sym_debug = mrb_intern_cstr(cg_core.mrb, "debug"); + cg_core.sym_error = mrb_intern_cstr(cg_core.mrb, "error"); + cg_core.sym_fatal = mrb_intern_cstr(cg_core.mrb, "fatal"); + cg_core.sym_information = mrb_intern_cstr(cg_core.mrb, "information"); + cg_core.sym_init = mrb_intern_cstr(cg_core.mrb, "init"); + cg_core.sym_key_down = mrb_intern_cstr(cg_core.mrb, "key_down"); + cg_core.sym_key_up = mrb_intern_cstr(cg_core.mrb, "key_up"); + cg_core.sym_quit = mrb_intern_cstr(cg_core.mrb, "quit"); + cg_core.sym_tick = mrb_intern_cstr(cg_core.mrb, "tick"); + cg_core.sym_trace = mrb_intern_cstr(cg_core.mrb, "trace"); + cg_core.sym_warning = mrb_intern_cstr(cg_core.mrb, "warning"); +} + +void +load_game(void *obj) +{ + FILE *fp; + mrb_value main_obj{mrb_top_self(cg_core.mrb)}; + + mrb_define_module(cg_core.mrb, "CandyGear"); + cg_candy_gear_init_config(cg_core.mrb); + cg_graphic_init_config(cg_core.mrb); + + fp = fopen(cg_core.game_file.c_str(), "rb"); + mrb_load_irep_file(cg_core.mrb, fp); + fclose(fp); + if (cg_core.mrb->exc) + { + mrb_print_error(cg_core.mrb); + throw CommandError{"Error loading game."}; + } + + mrb_funcall_id(cg_core.mrb, main_obj, cg_core.sym_config, 0); + if (cg_core.mrb->exc) + { + mrb_print_error(cg_core.mrb); + throw CommandError{"Error configuring game."}; + } + + cg_candy_gear_finish_config(cg_core.mrb); + cg_graphic_finish_config(cg_core.mrb); +} + +void +load_blucat(void *obj) +{ + BluCat::INT::core.loader.execute(nullptr); +} + +void +unload_blucat(void *obj) +{ + BluCat::INT::core.loader.revert(nullptr); +} + +void +load_mruby_interface(void *obj) +{ + cg_candy_gear_init(cg_core.mrb); + cg_font_init(cg_core.mrb); + cg_key_init(cg_core.mrb); + cg_orientation_3d_init(cg_core.mrb); + cg_skeletal_model_init(cg_core.mrb); + cg_skeletal_mesh_init(cg_core.mrb); + cg_static_model_init(cg_core.mrb); + cg_static_mesh_init(cg_core.mrb); + cg_sound_init(cg_core.mrb); + cg_sprite_init(cg_core.mrb); + cg_sprite_3d_init(cg_core.mrb); + cg_texture_init(cg_core.mrb); + cg_vector_3d_init(cg_core.mrb); + cg_vector_4d_init(cg_core.mrb); + cg_view_init(cg_core.mrb); +} + +} + +const CommandChain cg_sCore::loader{ + {&load_mruby_symbols, nullptr}, + {&load_game, nullptr}, + {&load_blucat, &unload_blucat}, + {&load_mruby_interface, nullptr} +}; |