Elin(エリン)、「再構築の巻物」の挙動について、ゲームコードの解析ベースで解説しています。
主に装備品の再構築に主眼を置いています。
最終更新:2025/12/21
目次
再構築の巻物の処理
ActEffect.csに各種効果の処理が記載してあります。
case EffectId.Reconstruction:
{
if (!tc.isThing)
{
LayerDragGrid.CreateReconstruction(CC, state);
return;
}
if (tc.Num > 1)
{
tc = tc.Split(1);
}
cc.PlaySound("mutation");
cc.PlayEffect("identify");
cc.Say("reconstruct", cc, tc);
EClass.game.cards.uidNext += EClass.rnd(30);
int num6 = Mathf.Max(tc.genLv, tc.LV, EClass.player.stats.deepest);
CardBlueprint.Set(new CardBlueprint
{
blesstedState = state
});
Thing thing3 = ThingGen.Create(tc.id, -1, (int)((long)num6 * (long)power / 400));
thing3.genLv = num6;
tc.Destroy();
CC.Pick(thing3, msg: false);
if (!CC.IsPC)
{
CC.TryEquip(thing3);
}
break;
}
再構築されたアイテムの生成処理は以下です。
int num6 = Mathf.Max(tc.genLv, tc.LV, EClass.player.stats.deepest);
CardBlueprint.Set(new CardBlueprint
{
blesstedState = state
});
Thing thing3 = ThingGen.Create(tc.id, -1, (int)((long)num6 * (long)power / 400));
- num6に、”対象アイテムの生成Lv”、”アイテムLv(?)”、”プレイヤーの最深到達階層”のうちから、もっとも高いものを代入します。
- tc.LV(アイテムLv?)はどこを参照しているのかイマイチ不明です。
- 大抵の場合はgenLv、あるいは最深到達階層で決定されるはずなので、tc.LVについては深掘りしません。
- genLv = アイテム生成時にドロップ元のLvかshopLvで決定される。1億敵からは1億Lv、1億店からは1億Lv
- アイテム生成時、num6 * power/400が渡され、これが付与されるエンチャント強度の計算に使われます。
- 未祝福はpower200、祝福/呪いはpower400
- power400なので、祝福/呪いではgenLvや最深到達階層の等倍でアイテムが生成される
再構築の巻物使用時の処理
- 8288(再構築効果)の巻物を読む
- TraitScrollStatic.OnRead → ActEffect.ProcAt
- Reconstruction は LayerDragGrid を要求
- LayerDragGrid.CreateReconstruction が呼ばれる
- InvOwnerReconstruction が実行される
- 最終的な Proc は power=100 固定
通常の巻物であればpowerは200固定ですが、再構築の巻物はUI側からpower100で上書きされて呼び出されています。
以下は通常巻物の処理です。(power200の確認用)
巻物のパワーについて
ショップによって巻物が生成される際、以下のような処理を経由して巻物が生成されます。(長くなるので個別の解説はナシ)
- trait.Onbarter で品揃えの更新処理。createStockを呼ぶ。(品物1個1個の生成処理)
- createStock で ThingGen.Create(“scroll_random”) 処理
- ThingGen.CreateFromFilter(string id, int lv = -1)
- 処理内容はreturn _Create(SpawnList.Get(id).Select(lv).id, -1, lv);
- ThingGen._Create
- thing = new Thing();
- thing.Create(id, idMat, lv);
- Card.Create
- OnCreate
- _CreateRenderer
- trait.OnCreate
- TraitScrollRandom.OnCreate(genLv)
TraitScrollRandom.OnCreateの内容は以下です。
public class TraitScrollRandom : TraitScrollStatic
{
public static ElementSelecter selector = new ElementSelecter
{
type = "S",
lvMod = 20
};
public override EffectId idEffect => source.proc[0].ToEnum<EffectId>();
public override int Power => 200;
public override string AliasEle => source.aliasRef;
public override string N1 => source.proc.TryGet(1, returnNull: true);
public override SourceElement.Row source => EClass.sources.elements.map[owner.refVal];
public override string GetName()
{
return Lang.TryGet("scroll_" + source.alias) ?? "scroll_".lang(source.GetName().ToLower());
}
public override void OnCreate(int lv)
{
owner.refVal = selector.Select(lv);
}
}
巻物が生成される際、巻物のパワーは200として設定されています。
追記:ミラルショップは別処理
通常のショップはcreateStockしていますが、ミラルショップの場合はonbarterで以下のような処理で書かれています。(createStock経由でなく、onBarterで直接アイテムを生成)
case ShopType.Medal:
NoRestockId("sword_dragon");
Add("sword_dragon", 1, 0).SetReplica(on: true);
NoRestockId("point_stick");
Add("point_stick", 1, 0).SetReplica(on: true);
NoRestockId("blunt_bonehammer");
Add("blunt_bonehammer", 1, 0).SetReplica(on: true);
NoRestockId("pole_gunlance");
Add("pole_gunlance", 1, 0).SetReplica(on: true);
NoRestockId("sword_muramasa");
Add("sword_muramasa", 1, 0).SetReplica(on: true);
NoRestockId("sword_forgetmenot");
Add("sword_forgetmenot", 1, 0).SetReplica(on: true);
NoRestockId("dagger_fish");
Add("dagger_fish", 1, 0).SetReplica(on: true);
NoRestockId("sword_zephir");
Add("sword_zephir", 1, 0).SetReplica(on: true);
Add("ribbon", 1, 0);
Add("helm_sage", 1, 0);
Add("diary_sister", 1, 0);
Add("diary_catsister", 1, 0);
Add("diary_lady", 1, 0);
Add("1165", 1, 0).SetNum(5);
AddThing(ThingGen.CreateScroll(9160).SetNum(5));
Add("1282", 1, 0).SetNum(5);
Add("monsterball", 1, 0).SetNum(3).SetLv(20);
Add("monsterball", 1, 0).SetNum(3).SetLv(40);
Add("bill_tax", 1, 0).c_bill = 1;
Add("bill_tax", 1, 0).c_bill = 1;
Add("bill_tax", 1, 0).c_bill = 1;
AddThing(ThingGen.CreateScroll(8288).SetNum(5));
Add("container_magic", 1, 0);
Add("container_magic", 1, 0).ChangeMaterial("iron").idSkin = 1;
Add("container_magic", 1, 0).ChangeMaterial("bamboo").idSkin = 2;
Add("container_magic", 1, 0).ChangeMaterial("feywood").idSkin = 3;
Add("wrench_tent_elec", 1, 0);
Add("wrench_tent_soil", 1, 0);
Add("wrench_tent_seabed", 1, 0);
Add("wrench_bed", 1, 0).SetNum(20);
Add("wrench_storage", 1, 0).SetNum(10);
Add("wrench_fridge", 1, 0).SetNum(1);
Add("wrench_extend_v", 1, 0).SetNum(2);
Add("wrench_extend_h", 1, 0).SetNum(2);
AddThing(ThingGen.CreateSpellbook(9155, 1, 3));
break;
祝福、呪い巻物は2倍
ActEffect.csのproc関数では、再構築の巻物の処理前に、以下の処理があります。
Chara TC = tc.Chara;
Chara CC = cc.Chara;
bool blessed = state >= BlessedState.Blessed;
bool flag = state <= BlessedState.Cursed;
int orgPower = power;
if (blessed || flag)
{
power *= 2;
}
つまり、祝福か呪いの場合、パワーは2倍になります。
祝福、呪いでのパワーは200です。
まとめ
今回の調査範囲では、以下のような事が明らかになりました。
- 再構築の巻物はgenLv、アイテムLv、プレイヤーの最深到達階層でエンチャ強度を計算
- genLv = アイテム生成時に渡される値。モンスタードロップならモンスターLv、店売りならshopLv
- アイテムLvについては不明
- 通常、巻物のpowerは200だが、再構築の巻物はUI側で強度が上書きされ、power100で呼び出し
- 祝福、呪い再構築では、power2倍
- (genLv、アイテムLv、プレイヤーの最深到達階層) * power / 400がエンチャント生成強度に使われる値
- 現状では、祝福再構築の巻物するとエンチャント強度は本来の半分に落ちてしまう
エンチャント生成強度の計算については以下に記載しています。
power100になっている点については仕様かバグか怪しいため、フィードバッグ済みです。(2025/12/21)
2日かけてpower100の原因について突き止めてきたので、もし修正されたら褒めてください

コメント