2013年3月30日土曜日

メモ書き - TESObjectREFR::IsPlayable


TESV.exeをボーっと見てたら、こんなコードがあった。

CPU Disasm
Address   Hex dump          Command                                  Comments
0047A5D2  |.  0FB641 12     |MOVZX EAX,BYTE PTR DS:[ECX+12]          ; Switch (cases 1F..2A, 4 exits)
0047A5D6  |.  83E8 1F       |SUB EAX,1F
0047A5D9  |.  74 33         |JZ SHORT 0047A60E
0047A5DB  |.  83E8 0A       |SUB EAX,0A
0047A5DE  |.  74 1E         |JZ SHORT 0047A5FE
0047A5E0  |.  83E8 01       |SUB EAX,1
0047A5E3  |.  74 0B         |JZ SHORT 0047A5F0
0047A5E5  |.  8B01          |MOV EAX,DWORD PTR DS:[ECX]              ; Default case of switch TESV.47A5D2
0047A5E7  |.  8B50 64       |MOV EDX,DWORD PTR DS:[EAX+64]
0047A5EA  |.  FFD2          |CALL EDX
0047A5EC  |.  84C0          |TEST AL,AL
0047A5EE  |.  EB 29         |JMP SHORT 0047A619
0047A5F0  |>  8A81 90000000 |MOV AL,BYTE PTR DS:[ECX+90]             ; Case 2A of switch TESV.47A5D2
0047A5F6  |.  D0E8          |SHR AL,1
0047A5F8  |.  F6D0          |NOT AL
0047A5FA  |.  A8 01         |TEST AL,01
0047A5FC  |.  EB 1B         |JMP SHORT 0047A619
0047A5FE  |>  8A89 F2000000 |MOV CL,BYTE PTR DS:[ECX+0F2]            ; Case 29 of switch TESV.47A5D2
0047A604  |.  C0E9 07       |SHR CL,7
0047A607  |.  F6D1          |NOT CL
0047A609  |.  F6C1 01       |TEST CL,01
0047A60C  |.  EB 0B         |JMP SHORT 0047A619
0047A60E  |>  8B91 84000000 |MOV EDX,DWORD PTR DS:[ECX+84]           ; Case 1F of switch TESV.47A5D2
0047A614  |.  D1EA          |SHR EDX,1
0047A616  |.  F6C2 01       |TEST DL,01
0047A619  |>  0F84 8A000000 |JZ 0047A6A9

分かりやすいようにC++で書くと、こんな感じ

TESForm* thisForm;
bool IsPlayable;
if (thisForm->formType == kFormType_Ammo)
{
    TESAmmo* ammo = (TESAmmo*)thisForm;
    IsPlayable = (ammo->settings.flags & 2) == 0;
}
else if (thisForm->formType == kFormType_Weapon)
{
    TESObjectWeap* weap = (TESObjectWEAP*)thisForm;
    IsPlayable = (weap->gameData.flags2 & weap->gameData.kFlags_NotPlayable) == 0;
}
else if (thisForm->formType == kFormType_Light)
{
    TESObjectLIGH* ligh = (TESObjectLIGH*)thisForm;
    IsPlayable = (ligh->unk78.unk0C & 2) != 0;
}
else
{
    IsPlayable = thisForm->GetFlag00020000();
}
これでやっと、bool TESObjectREFR::IsPlayable(void) が作れるんじゃないかな!!

2013年3月29日金曜日

LockOn 0.1 beta7

Nexusで公開中の Lock-On - adds a lock-on system を更新しました。

LockOn beta7 - Skyrim Nexus


更新点


  • マップマーカーをつけました。
  • ロックオン中のエフェクトを選択できるようにしました。
  • ロックオンできる距離を8192unitsまで伸ばせるようにしました。

なにこれ?


ターゲットをロックオンできるようにするMODです。
ロックオンした対象にカメラが追尾するようになります。

必要なもの


  • Skyrim - 1.8.151 または 1.9.32
  • SKSE - 1.6.3以降
  • SkyUI - 3.1以降 (Optional)
  • 酔い止め - (Optional)
SkyUIは無くても動きますが、設定が一切できなくなるので入れたほうが良いです。

操作方法


ロックオンしたい対象にクロスヘアを向けて、ロックオン・キーを押してください。
デフォルトのロックオン・キーは、左[SHIFT] です。

[ロックオン・キー]+[A] で、左のターゲットに切り替え
[ロックオン・キー]+[D] で、右のターゲットに切り替えができます。
ロックオンした状態で 再度 [ロックオン・キー] を押すと、ロックオンが解除されます。

[ロックオン・キー] の割り当てはMCMで変更できます。

自動ロックオン


誰にもロックオンしてない状態で誰かに殴られた/誰かを殴った場合は、自動でロックオンします。

オート・ロックオンの設定も、MCMで変更できます。

アドオン


追加アドオンを入れることで、機能を拡張できます。

追加アドオンの作り方

今後の予定


【済】 移動キーダブルタップで次のターゲット
【-】 多数の敵に囲まれてるときはオートターゲットしない
【済】 敵に発見された時にオートターゲット

ロックオンしてる敵のライフを、HUD上部にずっと表示させっぱなしにしたいんだけど
どうやってScaleformとやりとりしてるのか分からない。現在調査中。
GFXMovieView::Invoke とか GFXMovieView::GetVariable を監視してみたけど、ここじゃなかった。

2013年3月25日月曜日

Lock-On用アドオンのアイデアメモ

のんびり散歩アドオン

「ソリチュード行き」「リフテン行き」の透明なアクターを召喚して、追尾。
あとは目的地に着くまでのんびり眺めるだけのアドオン。(誰得? 主に自分得)

追尾は、ロックオンした状態で前進させれば可能。
ただし問題はロックオンのエフェクトをどうするか。

ロックオンの操作拡張系

↑↑ (↑ダブルタップ)でロックオン
↓↓ でロックオン解除
←← で、左のターゲットに切り替え
→→ で、右のターゲットに切り替え
ダブルタップ操作はTK Dodgeの操作とかぶるので、本体では搭載しなかった。
箱コンで遊んでいる人はダブルタップのほうが良いかも?

フォロワー補助

ターゲットした相手にヒールする魔法、ワード(魔法の盾)をかける魔法、みたいな
補助系魔法を充実させれば、フォロワー補助プレイが捗るかも。
(それってLock-Onじゃなくても出来るでしょう?というツッコミは置いておく)

2013年3月24日日曜日

Racial Compatibility Improved 1.6a

 [2013/03/24 追記] 
Racial Compatibility1-7や、RaceCompatibility for Dawnguardに上書きすると
クエストの一部が欠損する問題があるようです。
(欠損が発生すると、スクリプトが競合している旨のメッセージが表示されるようになります)
欠損が発生した場合に、自動で修復するスクリプトを作りましたので
競合メッセージが表示されるようになった方は、このpexファイルを入れてみてください。
http://www.himika.com/stuff/YARC_InitQuestScript.zip

修復に成功すると、競合メッセージは表示されなくなります。
その後、pexファイルは削除してかまいません。

なお、この問題はバージョン1.6aで対策済みです。


 [2013/03/19 追記] 
NEXUSに1.6正式版をアップロードしました。


 [2013/03/06 追記] 
Character Making Extender 3.9bに対応し、β2になりました。




ダウンロードはこちらから
http://skyrim.nexusmods.com/mods/24898/


◯必要要件

Skyrim 1.8 以降

◯更新点

  • Character Making Extender 3.9bに対応しました。
  • 英語のReadmeがカタコトすぎてあまりに酷いので、日本語のReadmeを入れました。
  • ShowRaceMenu後にバンパイアが解除されておかしくなる問題が修正されます。 (SKSE 1.6.6以降が入っているときのみ)

◯このMODは何?

Expiredさん作のRacial Compatibilityの改良バージョンです。
いままでRacial Compatibilityと同時に使うことができなかったMODと、共存できるようになります。
(Dawnguard、UFO、Better Vampire、Vampiric Thirstなど)

(例)
追加種族 + UFO
追加種族 + Better Vampires (+ UFO)
追加種族 + Vampiric Thirst (+ UFO)
追加種族 + Dawnguard (+ UFO)
追加種族 + Dawnguard + Better Vampire Dawnguard Compatible (+ UFO)
追加種族 + Dawnguard + Vampiric Thirst Dawnguard Edition (+ UFO)


◯インストール方法

アーカイブのDataフォルダの中身を skyrim\Data フォルダに上書きしてください。

(旧Racial Compatibilityを上書きする場合)
旧Racial Compatibilityで使っていた以下の3つのPEXスクリプトは、もはや使いません。
ファイルサイズを確認して、合致する場合のみ削除してください。
  Data\Scripts\CompanionsHouseKeepingScript.pex (28,504バイト)  CRC32: BB8F5900
  Data\Scripts\PlayerVampireQuestScript.pex     (12,622バイト)  CRC32: A7DA00B5
  Data\Scripts\PlayerWerewolfChangeScript.pex   (12,475バイト)  CRC32: A7BF0A01
ファイルサイズが違う場合は、他のMODが使用してる可能性が高いので削除しないでください。

良く分からない場合は、とりあえず上の3つのスクリプトを削除して
Better Vampiresなどの競合MODを全部入れなおせば問題ないと思います。


◯似たようなMOD(RaceCompatibility for Dawnguard)との違い

ぶっちゃけ、どっちも同じなので好きな方を選んで良いです。
コンセプトが違うだけです。

RaceCompatibility for Dawnguardは
「競合の原因になっているスクリプトを、競合MODとRaceCompatibility双方が動くよう、書き換えよう」
というコンセプトです。
オプションでUFOやBetter Vampire用に書き換えたスクリプトを追加することで対応します。
(長所) ターゲットを絞ってきっちり書き換えているので、対応しているMODは間違いなく完璧に動きます。
(短所) 反面、対応していないMODは動きません。対応MODもバージョンアップで動かなくなる可能性があります。

 私の改良バージョンは
「競合の原因になっているスクリプトをつかわないことで、競合の原因自体をなくそう」
というコンセプトです。
(長所) ほとんどの競合MODが動くはずです。
将来競合するかもしれない未知のMODにも強いとおもいます。
(短所) ただ、若干トリッキーな方法を使って競合スクリプトを排除しているため
MODによっては競合してしまうものもあるかもしれません。

RaceCompatibility for Dawnguardで正式に対応しているMODを使うのでしたら、きっちりスクリプト修正をしてあるぶん、for Dawnguardを使ったほうが安全確実です。
Dawnguardを入れていない人や、他にも競合しそうなMODを入れている人は
拙作の改良バージョンを使うと良いかと思います。

2013年3月19日火曜日

LockOn - beta6

2013/03/23追記:
beta6になりました。このバージョンからNEXUSで公開することにしました。

なにこれ?


ターゲットをロックオンできるようにするMODです。
ロックオンした対象にカメラが追尾するようになります。

必要なもの


  • Skyrim - 1.8.151 または 1.9.32
  • SKSE - 1.6.3以降
  • SkyUI - 3.1以降 (Optional)
  • 酔い止め - (Optional)
SkyUIは無くても動きますが、設定が一切できなくなるので入れたほうが良いです。

操作方法


ロックオンしたい対象にクロスヘアを向けて、ロックオン・キーを押してください。
デフォルトのロックオン・キーは、左[SHIFT] です。

[ロックオン・キー]+[A] で、左のターゲットに切り替え
[ロックオン・キー]+[D] で、右のターゲットに切り替えができます。
ロックオンした状態で 再度 [ロックオン・キー] を押すと、ロックオンが解除されます。

[ロックオン・キー] の割り当てはMCMで変更できます。

自動ロックオン


誰にもロックオンしてない状態で誰かに殴られた/誰かを殴った場合は、自動でロックオンします。

オート・ロックオンの設定も、MCMで変更できます。

アドオン


追加アドオンを入れることで、機能を拡張できます。

追加アドオンの作り方