static bool writeBindings(const BDescVec &d, const std::string &dir, uint32_t rgssVersion) { if (dir.empty()) return false; char path[1024]; buildPath(dir, rgssVersion, path, sizeof(path)); FILE *f = fopen(path, "wb"); if (!f) return false; Header hd; hd.formVer = FORMAT_VER; hd.rgssVer = rgssVersion; hd.count = d.size(); if (fwrite(&hd, sizeof(hd), 1, f) < 1) { fclose(f); return false; } if (fwrite(&d[0], sizeof(d[0]), hd.count, f) < hd.count) { fclose(f); return false; } fclose(f); return true; }
void setupBindingData(const BDescVec &d) { size_t slotI[vButtonsN] = { 0 }; for (size_t i = 0; i < bWidgets.size(); ++i) for (size_t j = 0; j < 4; ++j) bWidgets[i].src[j].type = Invalid; for (size_t i = 0; i < d.size(); ++i) { const BindingDesc &desc = d[i]; const Input::ButtonCode trg = desc.target; size_t j; for (j = 0; j < vButtonsN; ++j) if (bWidgets[j].vb.code == trg) break; assert(j < vButtonsN); size_t &slot = slotI[j]; BindingWidget &w = bWidgets[j]; if (slot == 4) continue; w.src[slot++] = desc.src; } }
void add(BDescVec &d) const { SourceDesc src; src.type = JButton; src.d.jb = source; BindingDesc desc; desc.src = src; desc.target = target; d.push_back(desc); }
void add(BDescVec &d) const { SourceDesc src; src.type = Key; src.d.scan = source; BindingDesc desc; desc.src = src; desc.target = target; d.push_back(desc); }
static void addAxisBinding(BDescVec &d, uint8_t axis, AxisDir dir, Input::ButtonCode target) { SourceDesc src; src.type = JAxis; src.d.ja.axis = axis; src.d.ja.dir = dir; BindingDesc desc; desc.src = src; desc.target = target; d.push_back(desc); }
void BindingWidget::appendBindings(BDescVec &d) const { for (size_t i = 0; i < 4; ++i) { if (src[i].type == Invalid) continue; BindingDesc desc; desc.src = src[i]; desc.target = vb.code; d.push_back(desc); } }
static bool readBindings(BDescVec &out, const std::string &dir, uint32_t rgssVersion) { if (dir.empty()) return false; char path[1024]; buildPath(dir, rgssVersion, path, sizeof(path)); FILE *f = fopen(path, "rb"); if (!f) return false; Header hd; if (fread(&hd, sizeof(hd), 1, f) < 1) { fclose(f); return false; } if (hd.formVer != FORMAT_VER) return false; if (hd.rgssVer != rgssVersion) return false; /* Arbitrary max value */ if (hd.count > 1024) return false; out.resize(hd.count); if (fread(&out[0], sizeof(out[0]), hd.count, f) < hd.count) { fclose(f); return false; } for (size_t i = 0; i < hd.count; ++i) if (!verifyDesc(out[i])) return false; return true; }
void applyBindingDesc(const BDescVec &d) { kbBindings.clear(); jsABindings.clear(); jsHBindings.clear(); jsBBindings.clear(); for (size_t i = 0; i < d.size(); ++i) { const BindingDesc &desc = d[i]; const SourceDesc &src = desc.src; if (desc.target == Input::None) continue; switch (desc.src.type) { case Invalid : break; case Key : { KbBinding bind; bind.source = src.d.scan; bind.target = desc.target; kbBindings.push_back(bind); break; } case JAxis : { JsAxisBinding bind; bind.source = src.d.ja.axis; bind.dir = src.d.ja.dir; bind.target = desc.target; jsABindings.push_back(bind); break; } case JHat : { JsHatBinding bind; bind.source = src.d.jh.hat; bind.pos = src.d.jh.pos; bind.target = desc.target; jsHBindings.push_back(bind); break; } case JButton : { JsButtonBinding bind; bind.source = src.d.jb; bind.target = desc.target; jsBBindings.push_back(bind); break; } default : assert(!"unreachable"); } } bindings.clear(); appendBindings(kbStatBindings); appendBindings(msBindings); appendBindings(kbBindings); appendBindings(jsABindings); appendBindings(jsHBindings); appendBindings(jsBBindings); }