2013年6月26日水曜日

Lock-On 0.2.2


Lock-On 0.2.2
 http://skyrim.nexusmods.com/mods/33791/





なにこれ?


Skyrimに、ロックオン機能を追加するMODです。

個人的感想ですが、箱コンでの操作がむっちゃ楽になると思います。

操作方法


(キーボード)
ロックオン/解除 左[SHIFT]
右/左のターゲットを選択 左[SHIFT]+[A][D] または 右[SHIFT]+マウス左右移動
一番近いターゲットを選択 左[SHIFT}+[S]

(箱コン)
ロックオン/解除 [LB]
右/左のターゲットを選択 [LB]+アナログスティックを右/左
一番近いターゲットを選択 [LB]+アナログスティックを下

箱コンを使っている場合のみ、右スティックでクロスヘアの位置を微調整できます。
これで動いてるターゲットに弓や魔法を当てやすくなったはず。


MCMメニューで、「ダブルタップでのターゲット切り替え」にチェックを入れると
移動キーダブルタップや、アナログスティックを素早く2回入れることで
ターゲット切り替えが出来るようになります。

1.8からの更新点


  • カメラのレスポンスが大幅に良くなりました。
  • カメラスピードの選択で、50ms~2000msまで選択できるようにしました。
  • 箱コン使用時に、右スティックでクロスヘアの位置が微調整できるようになりました。
  • 「ロックオンキー+↓で一番近いターゲットを選択」の操作を追加しました。
  • ウサギ・鹿・キツネなどの動物を選択しないオプションを追加しました。
  • ターゲットが死亡したときに、ロック継続/ロック解除/一番近い敵をロックオン を選べるようにしました。
  • ロックオン時に、選択音がなるようにしました。
  • NMMインストーラーを改善しました。Skyrimのバージョンを自動認識するようにしました。
  • その他、細かいバグの修正。

2.1からの更新点


  • ごくまれに、ロックしたまま解除できなくなる不具合を修正しました。
    (エフェクトが消えてるのにロックされたまま解除できなくなり、MCMも動作しなくなります)
  • Mod Organizerで正しくインストールできない不具合を修正しました。

(もし可能なら)やりたいこと


  • 紫のエフェクトではなく、ゼルダのZ注目みたいにしたい
  • HUD MenuのEnemyHealthMeterに、ロックオン対象の名前とライフが表示されるようにしたい
  • MCMとかの英語がむちゃくちゃなのは、、、、だれか助けて

2013年5月31日金曜日

hmkArrow 0.4

2013/05/31 更新

v0.4をアップしました。
http://himika.com/stuff/hmkArrow_0_4.7z
Dawnguard追加ダンジョンで、クロスボウのトラップを踏むとCTDしていた問題を修正しました。

作ってるうちに飽きてしまったMODシリーズ 第一弾

私は、ゲームバランスとか、利便性とか、そういうの一切考えずに
ほとんどその場の思いつきと勢いだけでMOD作成してるんで、飽きるのが早いです。

あと、勢いだけで「第一弾」とか言ってるので、第二弾に続くかどうか分かりません。

hmkArrow.esp

特殊効果をもった矢を4種類追加します。
どの矢もチート気味の矢ばかりですので、ご利用は計画的に。

http://himika.com/stuff/hmkArrow_0_4.7z
  • Teleport Arrow 着弾地点にテレポートできる矢
  • Knee Breaker  膝に当てると大ダメージを与えられる矢
  • Time Bomb Arrow しばらくしてから大爆発する矢。人も物も吹き飛ぶ。
  • Dwarven Thresher Arrow ドワーフ遺跡のアレが生えてくる矢


このMODの画期的な点は
「SKSEプラグインの力によって、矢のProjectileが当たった座標を拾える 」ことです。
矢の飛んでいった先にテレポートしたり、矢があたった場所にオブジェクト生成したり
いままで出来なかったことが出来ます。


矢は、ゲーム開始/MOD初導入で10本ずつ渡されます。



再入手は、ホワイトランのジョルバスクル裏手の藁人形(いちばん左)を弓でピスピスしてください。
うまく的にあたると、変な音が鳴って矢が貰えます。

近すぎると貰えません。遠くから当てるといっぱい貰えます。

(おまけ) hmkArrow.dllのソースファイル http://himika.com/stuff/hmkArrow_0_3_src.7z

2013年5月12日日曜日

個人的メモ

Skyrim 1.9.32用

パピルス関数のアドレス一覧
http://www.himika.com/stuff/PapyrusFunctionAddr_1_9_32.txt

コンソール関数のアドレス一覧
http://www.himika.com/stuff/ConsoleAddr_1_9_32.txt

仮想関数(TESObjectREFR、Actor、Character、PlayerCharacter)のアドレス一覧
http://www.himika.com/stuff/VFuncAddr_1_9_32.txt

2013年4月22日月曜日

Lock-On 0.1.8

Nexusで公開中の Lock-On - adds a lock-on system の0.1.8です。

[beta1]   http://www.himika.com/stuff/LockOn_0_1_8beta.7z

(追記: 2013/04/22) beta2をアップしました
[beta2]   http://www.himika.com/stuff/LockOn_0_1_8beta2.7z

(追記: 2013/04/25) beta3をアップしました
[beta3]   http://www.himika.com/stuff/LockOn_0_1_8beta3.7z

(追記: 2013/04/26) Nexusにアップしました
   http://skyrim.nexusmods.com/mods/33791

更新点


  • 箱コンでターゲット切り替えができない問題に対処しました
  • 箱コン使用時は、右スティックでターゲット切り替えできるようにしました (beta3)
  • ダブルタップでターゲット切り替えできる機能をつけました(キーボード操作のみ)
  • 敵に発見されたときに自動でターゲットするオプションをつけました
  • カメラのスピードを高速化。200msecまで設定できるようにしました。
箱コンで切り替えできない問題なのですが、、、作者が箱コンを持ってないので
完璧に対処できているのか、ちょっと自信がないです・・・

もし動かなかった場合は、報告していただけると助かります。

2013年4月12日金曜日

やりかけの仕事リスト

どこかに書いておかないと、忘れそうなので。


調査中
  • SKSEプラグインでToggleFlyCamを呼び出すと、カメラがどっかに飛んでいく件
  • ObjectReference.RemoveItem関数で、LeveledItemだったオブジェクトが消せない件
  • ModifyFaceGen周りのコード解析 
  • XBOX360コントローラのアナログスティック入力解析

余裕があればやりたい
  • プレイヤー以外のアクターにAddPerkできない理由の特定 (済)

挫折寸前
  • Eagle Eyeで、実際に画面を拡大しているコードの特定

たぶん忘れてるのがいっぱいあるはず。思い出したら追加。


(おまけ)
Papyrus関数のTESV.exeアドレス一覧 (1.9.32)
http://himika.com/stuff/PapyrusFunctionAddr_1_9_32.txt




(追記: 2013/04/12)
プレイヤー以外のNPCにPerkを追加できないのは、バグではなく完全に仕様でした。
プレイヤーにしかPerk Pointが存在しないのと同じ理由で、追加のPerkスロットが
プレイヤーにしか存在しませんでした。

既存のパークを保存してる場所に無理やり書き込むこともできそうだけど
たぶん、おかしなことになりそう(まだ試してない)

(追記: 2013/04/22)
箱コンのアナログスティックの傾きが取れたので、どう実装したらいいものか考え中。
できればSKSEチームにフィードバック送りたい。

2013年4月1日月曜日

へ スカイリム

英語版exeの「へ スカイリム」、簡単に直せそう。
CPU Disasm
Address   Hex dump          Command                                  Comments
0085FE4E  |.  50            PUSH EAX                                 ; /<%s> => [Arg2]
0085FE4F  |.  51            PUSH ECX                                 ; |<%s> => [1B17FF4] = "へ"
0085FE50  |.  68 AC4C0801   PUSH OFFSET 01084CAC                     ; |Format = "%s %s"
0085FE55  |.  8D5424 18     LEA EDX,[ESP+18]                         ; |
0085FE59  |.  68 04010000   PUSH 104                                 ; |Arg2 = 104
0085FE5E  |.  52            PUSH EDX                                 ; |Arg1 => OFFSET LOCAL.64
0085FE5F  |.  E8 3C04BCFF   CALL 004202A0                            ; \TESV.004202A0
PUSH EAXとPUSH ECXの順番を入れ替えるだけの簡単な作業です。

ためしに修正パッチつくってみようと思うんだけど、
→ 作りました http://skup.dip.jp/up/up04444.7z
へ スカイリムの他に、日本語特有の問題ってあったかなぁ。
セーブファイル名の日本語が空白になるのしか思いつかない。


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) が作れるんじゃないかな!!