精錬値に関する定義 - roratorio-hub/ratorio GitHub Wiki
2024/03時点では超越段階が異なるアイテムには別のアイテムIDをアサインして計算しています。
しかしこの仕様では将来的にメンテナンスのコストが大きくなりすぎることが予想されますので、精錬値と同じような仕様で精錬段階を管理したいと思います。
このページはその前準備として、精錬値がどのように処理されているのかを調査した結果をまとめる場所です。
roro/m/js/item.h.js の定義
精錬値はItemSPの一種として定義されています。
値域は 100,000 から 900,000 および 1,000,000 から 10,000,000 です。
なお100,000,000以降は別のItemSPが定義されていますが10,000,001 から 99,999,999 までの値は未定義です。
ItemSPの解釈はビット演算に近いので実際に使える値は少ない(例えば後述の通り10,100,010は使えない)ですが、工夫すれば未定義領域に新たなItemSPを定義出来る可能性があります。
CGlobalConstManager.DefinePseudoEnum(
"EnumItemSpId",
[
// 精錬値が○上がる度に
"ITEM_SP_REFINE_BY_1_OFFSET",
"ITEM_SP_REFINE_BY_2_OFFSET",
"ITEM_SP_REFINE_BY_3_OFFSET",
"ITEM_SP_REFINE_BY_4_OFFSET",
"ITEM_SP_REFINE_BY_5_OFFSET",
"ITEM_SP_REFINE_BY_6_OFFSET",
"ITEM_SP_REFINE_BY_7_OFFSET",
"ITEM_SP_REFINE_BY_8_OFFSET",
"ITEM_SP_REFINE_BY_9_OFFSET",
],
100000,
100000
);
CGlobalConstManager.DefinePseudoEnum(
"EnumItemSpId",
[
// 精錬値が○以上の時
"ITEM_SP_REFINE_OVER_1_OFFSET",
"ITEM_SP_REFINE_OVER_2_OFFSET",
"ITEM_SP_REFINE_OVER_3_OFFSET",
"ITEM_SP_REFINE_OVER_4_OFFSET",
"ITEM_SP_REFINE_OVER_5_OFFSET",
"ITEM_SP_REFINE_OVER_6_OFFSET",
"ITEM_SP_REFINE_OVER_7_OFFSET",
"ITEM_SP_REFINE_OVER_8_OFFSET",
"ITEM_SP_REFINE_OVER_9_OFFSET",
"ITEM_SP_REFINE_OVER_10_OFFSET",
],
1000000,
1000000
);
加算されたItemSPから精錬値に関するItemSPだけを抽出し、その他のItemSPを次の処理に渡すコードは以下の通りです。
// 『精錬値が○以上の時』条件
var refineOver = Math.floor(spId / ITEM_SP_REFINE_OVER_1_OFFSET);
var refineOverEffect = spId % ITEM_SP_REFINE_OVER_1_OFFSET;
if (refineOver > 0) {
condTextRefineOver = "精錬値が" + refineOver + "以上の時、";
}
spId = refineOverEffect;
// 『精錬値が○上がる度に』条件
var refineBy = Math.floor(spId / ITEM_SP_REFINE_BY_1_OFFSET);
var refineByEffecct = spId % ITEM_SP_REFINE_BY_1_OFFSET;
if (refineBy > 0) {
condTextRefineBy = "精錬値が" + refineBy + "上がる度に追加で";
}
spId = refineByEffecct;
ItemSP の基本
ItemSP IDを加算することで複数のItemSPを同時に発動させることができます。
例えば 10100010 は「精錬値が10以上の時、精錬値が1上がる度にCRIが固定値で増加する」効果になります
10100010 =
10000000, ITEM_SP_REFINE_OVER_1_OFFSET, 精錬値が10以上の時
+ 100000, ITEM_SP_REFINE_BY_1_OFFSET, 精錬値が1上がる度に
+ 10, ITEM_SP_CRI_PLUS, CRI固定値上昇
roro/m/js/foot.js の定義
ステータスやダメージの計算では精錬値のドロップダウンリストから取得されたn_A_Weapon_ATKplusが参照されています。
これはHTMLからeval(A_Weapon_ATKplus.value)で取得された値です。
もし超越段階を示すドロップダウンリストを追加するならば、ここに処理を追加することが考えられます。
function GetEquippedSPSubEquip(spid, invalidItemIdArray, bListUp, bExact) {
...
var spDefRefineOver = 0; // 精錬値以上条件
var spDefRefineBy = 0; // 精錬値が上がる度に条件
...
// 装備箇所ごとに、精錬値を特定する
switch (eqpRegionId) {
case EQUIP_REGION_ID_ARMS:
eqpRefined = n_A_Weapon_ATKplus;
break;
...
}
// アイテムのSP定義をループ検索
for (spDefIdx = 0; itemData[ ITEM_DATA_INDEX_SPBEGIN + spDefIdx ] != ITEM_SP_END; spDefIdx += 2) {
...
// 精錬値以上条件を満たさない場合は、次へ
spDefRemain = CheckSpDefRefineOver(spDefRemain, eqpRefined);
if (spDefRemain < 0) {
continue;
}
// 精錬値が上がる度に条件を取得
spDefRefineBy = Math.floor(spDefRemain / ITEM_SP_REFINE_BY_1_OFFSET);
spDefRemain = spDefRemain % ITEM_SP_REFINE_BY_1_OFFSET;
// 追加すべきSP定義値を計算
spValToCorrect = itemData[ ITEM_DATA_INDEX_SPBEGIN + spDefIdx + 1 ];
// 精錬値が上がる度に条件が設定されている場合
if (spDefRefineBy > 0) {
spValToCorrect *= Math.floor(eqpRefined / spDefRefineBy);
}
...
}
foot.jsの以下の関数部分では精錬値とItemSPの定義を紐づけるためにitem.h.jsの定義が一部参照されています。
function CheckSpDefRefineOver(spDefRemain, eqpRefined) {
var spDefCondition = 0;
var spDefBase = ITEM_SP_REFINE_OVER_1_OFFSET;
// 条件を取得
spDefCondition = Math.floor(spDefRemain / spDefBase);
// 条件を検査し、満たさない場合は -1 を返す
if (eqpRefined < spDefCondition) {
return -1;
}
// 条件を満たす場合は、残りのSP定義値を返す
return (spDefRemain % spDefBase);
}
roro/m/js/saveload.js
精錬値はSaveDataのindex15に収められています。
セーブデータに超越段階の領域を確保しようとすると工数がかかりますので出来れば避けたいところです。
このindex15に精錬値と超越段階値から成る合成値を格納できないでしょうか。
いえ、精錬値に超越段階を合成して管理するのはやめたほうが良いかもしれません。
例えば将来的に精錬値が11以上に拡張された場合に問題が生じる可能性があります。
他にもコードが直感的に分かりにくくなる恐れもあります
SaveData = MallocArray(CSaveDataMappingManager.GetMappingArray(CURRENT_VERSION).length, 0);
...
function DecodeUrl(loadDataUrl){
...
//----------------------------------------------------------------
// 右手武器の読み込み
//----------------------------------------------------------------
A_Weapon_zokusei.value = SaveData[14];
A_Weapon_ATKplus.value = SaveData[15];
ro4/m/js/CSaveDataUnit.js の定義
propNameDataKind と propNameParseCtrlFlag の合計長さが 14 なので SaveData[14] から右手の定義が始まっている?
/**
* セーブデータユニットクラス:装備位置.
* (将来的な持ち替え機能等を見据え、装備位置とアイテム等との対応付けを管理する)
*/
const SAVE_DATA_UNIT_TYPE_EQUIP_REGIONS = CSaveDataUnitTypeManager.register(
class CSaveDataUnitEquipRegions extends CSaveDataUnitBase {
...
// プロパティ定義情報の登録
this.registerPropInfo(CSaveDataConst.propNameDataKind, 2);
this.registerPropInfo(CSaveDataConst.propNameParseCtrlFlag, 12);
this.registerPropInfo(CSaveDataConst.propNameEqpRgnArmsRight, 6);