Skyrim AEでModを導入してみました②「SPELLFORGECUSTOM」の紹介
相変わらず、小説を書きかけて完成させずにPCゲームで遊んでいる中島です。
今やっているSkyrimは、Modと呼ばれる改造プログラムを組み込むことで、まったく新しい体験をさせてくれるオープンワールドのダークファンタジーARPGです。
無数にあるModですが、今ハマっているModは、SpellforgeというModです。このSpellforgeは、呪文書を食べて新しい魔法を覚えるというSkyrimの世界に、魔法の炉スペルフォージを設置して好みの魔法を生み出すというModです。導入も比較的簡単で、Modなどで追加される新呪文にも対応している素晴らしいModです。なんですが、少しだけ物足りない点があります。
このModは、スペルフォージに錬金素材を入れてResinと呼ばれる魔法習得用のアイテムを取得し、このResinを消費して呪文を覚えます。しかし、百を超える(Modを導入すると何百!)錬金素材のうち18種類しかResinにできません。それに、呪文習得に魔法研究しなければならないSpell Researchと違い、取得に厳しい条件は課されません。もっとも、Spell Researchは、Modなどの対応していない新呪文追加が結構難しいので、導入に二の足を踏んでしまいましたが。
Spellforgeの作者様は、このModの改良をOKしていらっしゃるようなので、個人的にScriptを改良することにしました。改良したポイントは3点です。
一つ目は、魔法の炉に入れて反応する錬金素材をformlistに変更して、全ての錬金素材に対応できるようにしたこと。
二つ目は、アルケイン樹脂取得方法の見直して、全ての錬金素材の合計が1を超えれば、アルケイン樹脂を取得できるようにしたこと。
三つ目は、魔法の炉に入れた錬金素材を記憶して、入れた錬金素材の種類の割合に応じて、高レベルの呪文を取得できるようにしたこと。
四つ目は、錬金素材を入れた結果、錬金術スキルの経験値を取得できるようにしたことです。
ファイルは、AEで追加されたCreation Clubコンテンツ用のpatch付きのModで、18のカテゴリに分かれています。ちなみに、動画ではObilivionの単語が間違っていたり、一部錬金素材が正しく反応していないものもありますが、アップロードしたファイルでは修正されています。
あと、Mod作成者向けに改造した場所部分のSourceコードを載せておきます。SpellforgeはSKSEを使っていないので、わたしもSKSEで追加された関数を使わないようにScriptを記載しました。while関数を二重にかけているので、起動テスト時CTDするか心配でしたがわたしのpc環境(錬金素材300超え)では問題なく動作しました。多分、バニラの錬金素材ならXboxでも稼働すると思います。
scriptを書き替えたので、SKSEが必須となりました。
if ingredientCount > 0
forge.PlaceAtMe(BurnExplosionBase)
while i < BurnIngredients.Length
i2 = 0
while i2 < (BurnIngredients[i] as formlist).getsize()
Form ingredent = (BurnIngredients[i] as formlist).getat(i2)
int ingredients = GetItemCount(ingredent)
if ingredients > 0
partialSuccess = true
if StudyContainer.GetItemCount(ingredent) == 0
StudyContainer.AddItem(ingredent as Ingredient)
debug.Notification(ingredent.GetName() + "is new element.")
if discovered[i] == None
discovered[i] = Reactions[i]
(GlobalStorage as sfm_storage).DiscoveredReactions = discovered ; update storage (needed?)
newDiscoveries = newDiscoveries + 1
endif
endif
float ingredientvalue = ingredients * ResinPerReaction.GetValue() / BurnIngredientCountPerResin[i].getvalue()
if ingredientvalue == 0
debug.Notification(ingredent.GetName() + "is not sufficient.")
Else
count = count + ingredientvalue
endif
endif
i2 = i2 + 1
endwhile
formcount = formcount + (BurnIngredients[i] as formlist).getsize()
i = i + 1
endwhile
endif
経験値取得ですが、Resin1に対して25倍の経験値にしました。単位あたりのResinは25セプティムを想定したからです。
if count > 0
forge.PlaceAtMe(BurnExplosionFull)
player.AddItem(Resin,count as int)
Game.AdvanceSkill("Alchemy",count * 25)
endif
続いて、錬金素材を何種類入れれば高位呪文が解放されるかですが、次のとおりです。
初心者は条件なし、見習いは全体の15%、精鋭は30%、熟練者は50%、達人は80%にしました。これは、クエストアイテムも含めての割合なので、ドヴァキンは達人呪文取得のために世界中に旅をしなければならないはずです。
string studymesg
StudyPercent = StudyContainer.GetNumItems() * 100 / formcount
StudyIngredientsPercent.setvalue(StudyPercent)
if StudyPercent >= 80
studymesg = "Master " + StudyIngredientsPercent.getvalueint() as string + "% " + StudyContainer.GetNumItems() as string + "/" + formcount as string
elseif StudyPercent >= 50 && StudyPercent < 80
studymesg = "Expert " + StudyIngredientsPercent.getvalueint() as string + "% " + StudyContainer.GetNumItems() as string + "/" + formcount as string
elseif StudyPercent >= 30 && StudyPercent < 50
studymesg = "Adept " + StudyIngredientsPercent.getvalueint() as string + "% " + StudyContainer.GetNumItems() as string + "/" + formcount as string
elseif StudyPercent >= 15 && StudyPercent < 30
studymesg = "Apparentice " + StudyIngredientsPercent.getvalueint() as string + "% " + StudyContainer.GetNumItems() as string + "/" + formcount as string
else
studymesg = "Novice " + StudyIngredientsPercent.getvalueint() as string + "% " + StudyContainer.GetNumItems() as string + "/" + formcount as string
Modの基本的な動作確認をしましたが、錬金素材のカテゴリ分けとか間違っているかもしれません。例えばAE追加素材のアンブロシアは神の食べ物と言われる食べ物ですから、異世界のアイテムと考えてカテゴリをOblivion(地獄)としています。
拙いModですが楽しんでもらえると嬉しいです。ちなみに、ESPFEなのでModの圧迫は少ないと思います。
追伸 スペールフォージに錬金素材を入れた時のメッセージを修正しました。また、錬金素材の有効判定数量をglobal変数に変更しました。導入する時はスペルフォージと一緒に変更してください。以上訂正版をアップしました。2023.3.6 ver1.01
ESPFEだと正常に動作しないのでESPにしました。2023.3.13 ver1.02
SKSEが必須となりました。
2023.3.18ver1.03
わたしのskyrimのVERは1597ですが、このmodはSKSEを使っていますが全てのバージョンが動くと思います。ただ、他のバージョンでの起動テストをしていません。