static mrb_int getButtonArg(mrb_state *mrb) { mrb_int num; mrb_value arg; mrb_get_args(mrb, "o", &arg); if (mrb_fixnum_p(arg)) { num = mrb_fixnum(arg); } else if (mrb_symbol_p(arg) && rgssVer >= 3) { mrb_value symHash = getMrbData(mrb)->buttoncodeHash; mrb_value numVal = mrb_hash_fetch(mrb, symHash, arg, mrb_fixnum_value(Input::None)); num = mrb_fixnum(numVal); } else { // FIXME: RMXP allows only few more types that // don't make sense (symbols in pre 3, floats) num = 0; } return num; }
void raiseMrbExc(mrb_state *mrb, const Exception &exc) { MrbData *data = getMrbData(mrb); RClass *excClass = data->exc[excToMrbExc[exc.type]]; static char buffer[512]; exc.snprintf(buffer, sizeof(buffer)); mrb_raise(mrb, excClass, buffer); }
void inputBindingInit(mrb_state *mrb) { RClass *module = mrb_define_module(mrb, "Input"); mrb_define_module_function(mrb, module, "update", inputUpdate, MRB_ARGS_NONE()); mrb_define_module_function(mrb, module, "press?", inputPress, MRB_ARGS_REQ(1)); mrb_define_module_function(mrb, module, "trigger?", inputTrigger, MRB_ARGS_REQ(1)); mrb_define_module_function(mrb, module, "repeat?", inputRepeat, MRB_ARGS_REQ(1)); mrb_define_module_function(mrb, module, "dir4", inputDir4, MRB_ARGS_NONE()); mrb_define_module_function(mrb, module, "dir8", inputDir8, MRB_ARGS_NONE()); mrb_define_module_function(mrb, module, "mouse_x", inputMouseX, MRB_ARGS_NONE()); mrb_define_module_function(mrb, module, "mouse_y", inputMouseY, MRB_ARGS_NONE()); mrb_value modVal = mrb_obj_value(module); if (rgssVer >= 3) { mrb_value symHash = mrb_hash_new_capa(mrb, buttonCodesN); for (size_t i = 0; i < buttonCodesN; ++i) { const char *str = buttonCodes[i].str; mrb_sym sym = mrb_intern_static(mrb, str, strlen(str)); mrb_value symVal = mrb_symbol_value(sym); mrb_value val = mrb_fixnum_value(buttonCodes[i].val); /* In RGSS3 all Input::XYZ constants are equal to :XYZ symbols, * to be compatible with the previous convention */ mrb_const_set(mrb, modVal, sym, symVal); mrb_hash_set(mrb, symHash, symVal, val); } mrb_iv_set(mrb, modVal, mrb_intern_lit(mrb, "buttoncodes"), symHash); getMrbData(mrb)->buttoncodeHash = symHash; } else { for (size_t i = 0; i < buttonCodesN; ++i) { const char *str = buttonCodes[i].str; mrb_sym sym = mrb_intern_static(mrb, str, strlen(str)); mrb_value val = mrb_fixnum_value(buttonCodes[i].val); mrb_const_set(mrb, modVal, sym, val); } } }