OBLIVION MOD作成支援/相談スレPart3

このエントリーをはてなブックマークに追加
941名無しさんの野望:2009/02/27(金) 20:15:18 ID:7bjIxgTv
プログラムに強い方に意見を聞きたいのですが
今まで私は、極力、GameMode ブロックを使うのを避け、
可能な限り、少々メンドクサイ処理になっても、OnActivate やOnLoad などの
「機会」処理を使うようにしてきました。その方が負荷が少ないと考えての事です。

でも、もしかすると例えば
Begin OnActivate というのは、仮想的には
Begin GameMode
If Activate == 1
endif
end
という処理と同じなんじゃないかと。(もちろん、If Activate なんてのはアリマセンが)
先頭の条件文でほとんどの処理を必要な時まで飛ばしてしまえるならば
別にGameMode ブロックでも負荷は同じなんじゃないでしょうか。
その辺、どう思われますか?
942名無しさんの野望:2009/02/27(金) 21:38:53 ID:gh5hVo8G
>>941
どうなんでしょうね。
確かに構文自体はイベントのコールバックを記述する、みたいな体裁になってますが、実際は
毎フレーム中間コードを頭から辿って例えばGameModeブロックの「beginコード」があったら
次に「end」が来るまでその処理内容を実行する、「OnActivate」の場合も同様に頭から順番に
ブロックを探す、みたいな事をひょっとしたらやっているかもしれません。

でもその場合はブロックを探してコードを辿るだけで該当ブロック以外の処理は実際には
実行されないと思うので、例えばActivateブロックを探すオーバーヘッドはGameModeでの
毎フレームの実判定処理と比べるとそれほど大きくは無い気もします。

また、「if-else-endif」でインタープリタのプログラムカウンタがジャンプするのか、それとも
「else」か「endif」が見つかるまでやっぱり中間コードを一つずつ辿るのか、とかの内部動作に
よっても負荷具合が変わってくるでしょう。

その辺の話はCSWikiのどこかにあった気がします。
確か「とりあえずGameModeを使うのは可能なら避けろ、インタープリタは中間コードを一つ
ずつ辿るからスクリプトはとにかく全体を短くしろ」、みたいな結論だった様な気もします。
詳しくはちょっと思い出せないのですが。
943名無しさんの野望:2009/02/27(金) 21:43:57 ID:7bjIxgTv
おお、ありがとうございます。
ん〜、なるほど。やっぱGameModeは出来るだけ避けるのが無難か…。
944名無しさんの野望:2009/02/27(金) 22:11:03 ID:gh5hVo8G
実際はGameModeをついつい使ってしまいますけどね。
On〜だけでは対応を網羅し切れずに、ひとつだけ例外的にGameModeで毎フレーム状態を監視
して何かをする、みたいなコードを書いてしまうと、例外はキモチ悪いからいっその事全部
GameModeで処理しちゃえ、みたいな方向につい流れてしまいます。

処理はイベント単位で独立させた方が後々メンテが楽な事は分かってるんですけど。
つい目先の誘惑に負けて集中管理的なコードを書いて泥沼になってしまう、というのはよく
ある話です。というかよくやります。
945名無しさんの野望:2009/02/27(金) 22:24:44 ID:CJR29O/R
On〜だとコンパニオンでは動作しないのもあるしね…。
なるべくなら避けたいところではあるが、難しい。
946名無しさんの野望:2009/02/27(金) 22:29:31 ID:ZPXVKHnV
クエストmod作ってるとgamemode使いまくりなんだけど
だめか・・やっぱだめか
全部やり直しかコレはもうだめだ。。。
947名無しさんの野望:2009/02/27(金) 22:31:40 ID:CJR29O/R
>>946
いやいや、可能なら避けろという話だが、避けて通れるものでもないw
Blocktypesがもうちょっと豊富だったら良かったんだけどね
948名無しさんの野望:2009/02/27(金) 22:41:32 ID:gh5hVo8G
確かに。
GameModeを避ける、と言うのはとりあえずのガイドラインなんで、問題無く動きさえすれば
内部の作り方はもう好き勝手で全然OKだと思いますよ。
949名無しさんの野望:2009/02/28(土) 01:28:04 ID:BQPRJQT7
スクリプトでNPC等をイベント後に消そうとした時
reference Editor IDを設定して
Persistent Referenceにチェックして
後は○○.disableとしても
スクリプトエラーで
Script command"○○.disable" not found と出てしまうのですが
一体何がいけないのでしょうか?
950名無しさんの野望:2009/02/28(土) 04:55:04 ID:26XrHUUw
refじゃなくObject IDを指定してるとか。
951名無しさんの野望:2009/02/28(土) 11:11:17 ID:nXFNC5yS
>>949
そのエラーはその行全体がスクリプトの構文として全く解釈不能な場合に出ます。
普通は半角の「.(ピリオド)」があれば解釈されて別のエラーになるので、それすら解釈されて
いない場合は全角や謎文字が混ざっていたりするかもです。

とりあえずその行を完全に消して一旦Save、エラーが出ない事を確認してからもう一度その
行をタイプし直してみたり。
スクリプトに使う文字はコメント部以外は半角英数字限定で。
行頭行末以外はTABも使わない方が安全です。
952名無しさんの野望:2009/03/01(日) 22:10:28 ID:d83vUFAF
シールドに使用されているMeshオブジェクトを、鎧などに移植するとゲーム中は表示されないのですが、
これってNifScopeでどこいらへんいじればよろしいでしょうか?
953名無しさんの野望:2009/03/02(月) 01:45:47 ID:MR+vxFrJ
シールドにはウェイト設定がされてないから、鎧などに組み込む場合は
blenderでウェイト設定しなければいけないのではなかろうか
954名無しさんの野望:2009/03/02(月) 01:47:34 ID:9PX0OOPv
>>952
移植って何を何のツールでどうしたのか書かんと意味がわからんのだけど。
エスパースキル低いから間違ってるかもだけど、移植って言ってるのは
CSでシールドのNifファイルをupperだのamuletだのの属性の装備に割り当てたってことか?

結論だけ言うとシールドなんかのNifファイルのメッシュを鎧とかの着る物にするのは
Blender等の3Dアプリ上で編集しないと無理。
955名無しさんの野望:2009/03/02(月) 12:51:27 ID:p2LXy4ZZ
鼻に変なテカリが出ると言ってた者ですが、
NiTristrips→NiTrishapeに変更したところ出なくなりました(ここまで長かった・・・)。
参考まで。
956名無しさんの野望:2009/03/02(月) 13:54:28 ID:DS5b//IS
>>953,954
わかりました。ちょっとBlenderいじってくるyo.
ありがとー
957名無しさんの野望:2009/03/02(月) 15:21:09 ID:81mcvYvT
>>955
肌のテカリに悩んでるので身体に応用できるかも知れないからもう少し詳しくやり方を
教えていただくとありがたいんだが?
958名無しさんの野望:2009/03/02(月) 15:27:27 ID:FW9D7fD1
>>955
NifskopeでNiTriStripsのMESHをTriangulate処理した
と考えて良いですか?
959名無しさんの野望:2009/03/02(月) 15:33:15 ID:p2LXy4ZZ
正に958さんが言われてることをやってみた次第です。
部分的なテカリって気になりますよね;;
960名無しさんの野望:2009/03/02(月) 15:40:54 ID:7tgMGe4t
私も装備着たときに首に菱形が浮かぶのが気になって質問しようと思ったけど
>>911これで直ったよ。

>>893-895
この流れから出来ないのかと思ったけど。
961名無しさんの野望:2009/03/02(月) 22:06:01 ID:fd29VQvQ
CSで地形をいじっているとたまにズーム量が大きくなってしまって
作業に支障がでたりするのですがどなたか原因に心あたりはないでしょうか
962名無しさんの野望:2009/03/03(火) 00:35:28 ID:DGMzOiEz
胴体メッシュをBlenderでインポートエクスポートしただけで
腰のつなぎ目が目立つんだけど、つなぎ目の点を融合していいのかな?
試行錯誤の結果できた試作品.7z
ttp://up-load.ddo.jp/upload/data/up25451.jpg
963名無しさんの野望:2009/03/03(火) 20:29:50 ID:vl6HTiaZ
あぁ、Cellの名称がBashed Patchできると名詞日本語化が簡単なのに…
964961:2009/03/03(火) 22:40:25 ID:ZNsnizzA
オブジェクトを選択している間はズーム量が2倍か3倍くらいに
なる仕様のようでこの状態のままだとLandScapeEditingに入っても
ズーム量が多いままな為だったようです
965881:2009/03/04(水) 11:41:26 ID:G81Scocp
質問!

スクリプト内でアクティブになっているクエストの目的地を取得したいな、と

アクティブクエストのIDが取得できればいいのだろうけど、そんな関数ある?
966名無しさんの野望:2009/03/04(水) 12:04:03 ID:IUxj+coC
>>963
それ毎回思う…
TIEとTEC直すのがめんどい

しとしん版からNamesをインポートするとバニラクエストの説明文が英語に戻るし
余分なのを切ったNamesをインポートするとSaveでCSが落ちるしOrz

クエストもインポートすれば両立できるけど本来含まれてないバニラのクエスト情報までespに入っちゃうのが…

ただの愚痴になってしまったOrz
967名無しさんの野望:2009/03/05(木) 12:45:05 ID:M6y9/wy4
>>966
Bashed Patch作成時にインポートする名前データをまとめた
csvファイルを作るのではだめだろうか。
そう思って試したいとは思うものの、
CSでエクスポートしたnames.txtから必要な箇所を抜き出すまではできても
帰宅するまで本格的な作業ができないw

csvファイルの書式そのものは
Data\Bashed Patch\Rational_Names.csvなんかが参考にできると考えているのだが。
968名無しさんの野望:2009/03/05(木) 13:19:45 ID:MPI0HLoz
>>967
Cell名は〜_Names.csvに出ないけど、インポート時にBash君が理解できるだろうか?
969名無しさんの野望:2009/03/05(木) 13:21:39 ID:Gw6AzibC
>クエストもインポートすれば両立できるけど本来含まれてないバニラのクエスト情報までespに入っちゃうのが…
不要なテキストを除けばちゃんと作れるよ。

Cellは諦め。
そもそもCellってCSで1個1個改名してくしかないよね?
エクスポートは出来るのにインポートできない・・・。
一応スクリプトでCell名を変えるっつー強引な技もあるにはあるんだが、
セーブに残るのでesp外しても戻らないと言う欠点が。
970名無しさんの野望:2009/03/05(木) 13:32:41 ID:Gw6AzibC
そもそも>>963>>966の話がかみ合ってないから混乱するなw

963「Wrye BashでCellインポートできなくて大変」
966「CSでnamesをインポートすると(ry」


>>969書いてから気付いたけど
>余分なのを切ったNamesをインポートするとSaveでCSが落ちるしOrz
環境依存だな。俺のところでは動く。
でも代わりにespをmaster指定になってる差分PatchをセーブでCTD。
以前は何度インストールしても起動さえしない場合も。
CSは本体以上に不安定すぎw

そういやnames入れたいだけならそれこそbashで事足りるぞ。
エクスポート・インポートも出来るし(しかもそのMOD中に存在するIDの部分だけ)、
日本語modにtag付けるだけでもいけるはずだ。
971名無しさんの野望:2009/03/05(木) 13:34:26 ID:MPI0HLoz
>>969
残念ですね。
cell名だけ変えるespが作れればなぁ

今は新作MOD入れるたびに日本語化ですよ。トホホ
972名無しさんの野望:2009/03/05(木) 14:39:28 ID:y+4OySGL
>>969
> そもそもCellってCSで1個1個改名してくしかないよね?

原因はわからないが、インポートできるのもあればできないものもある
Modによって違うっぽい
973名無しさんの野望:2009/03/05(木) 16:50:15 ID:xH7sqKpm
>>970
判りにくくてすいません。

Wrye BashでCellインポートできないのでCSで編集をしているのですが…
ということだったのです。

CSは動きがよく判らんです。
TIEを読んでインポートせずにそのままSaveでも不正終了します。
でも英語交じりのNamesをインポートするとSave出来ます。
不要な部分を除いたNamesをインポートすると落ちます。

あれ、CS壊れてるのかなと再インストールしましたが変わらない。
でもデータが少ないespは何もせずSaveしても落ちません…

ちょっとしたデータは今までTES4Editで1つずつ直してたのですがこの2つは変更点が多すぎて厳しいという愚痴だったんです(・・`)

それはそうとTES4Editで役立つ情報が
http://oblivionclarity.blog21.fc2.com/blog-entry-82.html
974名無しさんの野望:2009/03/05(木) 16:55:11 ID:xH7sqKpm
訂正

>不要な部分を除いたNamesをインポートすると落ちます。
不要な部分を除いたNamesをインポートしたあとSaveで落ちます。

まあ結果変わらないですが…
975名無しさんの野望:2009/03/05(木) 18:24:54 ID:y+4OySGL
>>973
ちょうど、TES4Editを使って綺麗にできないものかと試行錯誤してたところだった
情報ありがとう
976名無しさんの野望:2009/03/06(金) 16:26:38 ID:HxiyR9cB
普段Hovs HotkeysとMouse castを併用してるんですけど
Hovs HotkeysでもMouse castみたいにショートカット使ったあとは元の魔法に戻したいんです。
自分で改造しようと思ったのですが、なかなかうまくいかないんで知恵を貸してください。

このMOD使ってない人にうまく説明できないのですが…
Hovs Hotkeysはテンキー(1〜9)に登録した魔法を自動キャストしてくれるMODで例えばテンキー1にDispelを登録しておくと、1を押すだけでMODがDispelを選択→キャストキー押下してくれるんです。
で、Mouse castはまた別のホットキーMODなんですが
その機能の中で、Mouse castに登録した魔法を使ったあとは、使う前の魔法を選択し直すって機能があるんです
例えば、攻撃魔法を使用中に、Mouse castでDispelを使うと、自動で初めの攻撃魔法を選択しなおすって感じです。

Hovs Hotkeysのスクリプトをみたところ
1.テンキーが押される→
2.テンキーに指定されていた魔法をリファレンスchoosedspellに代入→
3.SelectPlayerSpellでchoosedspellを選択→
4.Castキーを押す
といった風な処理をしていました。

そこで、魔法を選択する直前に自分で追加したリファレンスにGetPlayerSpellで保存し
Hovs Hotkeysがキャストした後に保存した魔法にSelectPlayerSpellで戻そうと思ったのですが実際に実装したところ
直前にGetPlayerSpellをすると
Hovs Hotkeys本来のSelectPlayerSpell(上記3)が機能しないのか
登録した魔法ではなく、あらかじめ選択していた魔法をそのままキャストしてしまいました。

長文になってしまったうえうまく説明できないのですが
どうかお手伝いお願いします。
977名無しさんの野望:2009/03/06(金) 20:30:19 ID:dWKgI6IN
>>976
Mouse castの仕様を参考にはできんのだろうか?
あとはSuper Hotkeysとか。
978名無しさんの野望:2009/03/06(金) 20:54:15 ID:HxiyR9cB
ありがとうございます。
MouseCastは自動キャストはせず
登録キーを押している間アクティブな魔法を切り替え左/右クリックで発動するものなので
厳密には同じではないのですが、だいたいはの仕様は>>976のものと同じでした。

Hovs Hotkeysのスクリプトを一部抜き出します。
;@と書いた行が私の追加したものです。
略した部分は騎乗詠唱に関わる部分です。

; <<< sixflavors
<略>
elseif player.isridinghorse == 0
Set spellBackup to GetPlayerSpell ; @
selectplayerspell choosedspell
tapkey castkey
set choosedspell to 0
SelectPlayerSpell spellBackup ; @
return
endif
979名無しさんの野望:2009/03/06(金) 21:21:39 ID:oTPoGETe
HotkeyCastingを使ってみては
980名無しさんの野望:2009/03/06(金) 21:45:32 ID:dWKgI6IN
>>978
追加したものをそれぞれ片方ずつコメントアウトするとどうなる?
spellBackupには初期値として適当な呪文を入れておくとして。

tapkeyが遅延してるんじゃないか、とか、疑ってみるけれども。
いつキーが押されるか不定なので、Hovs Hotkeysはそんな仕様なのだ、的な。
981名無しさんの野望:2009/03/06(金) 22:26:24 ID:HxiyR9cB
>>980
Set spellBackup to GetPlayerSpellの代わりに
Set spellBackup to spell9と書きました。
spell9とは他でテンキー9に設定している魔法のことです。
この場合、どのキーを押してもテンキー9に設定した魔法が発動します。

Set spellBackup to spell9もコメントアウトした場合は
従来通りのHovs Hotkeysの動作をします。
この場合、spellBackupは0なので当たり前といえば当たり前です…。

また、SelectPlayerSpell spellBackupをコメントアウトした場合も
従来通りのHovs Hotkeysの動作をします。


初めは、GetPlayerSpellが遅延していて
selectplayerspellが間に合っていないのにtapkeyしてしまっているのかと思っていたのですが
SelectPlayerSpell spellBackupを消すことで動作してしまったのでもう訳がわからないです…。

このスクリプトってループ処理できませんよね…?

>>979
Hovsの代わりに使うという意味でよろしいでしょうか?
ググってみたのですがHotkey Castingを手に入れることができませんでした…
982名無しさんの野望:2009/03/06(金) 23:03:51 ID:dWKgI6IN
>>981
SelectPlayerSpell spellBackupを消すとHovs HotkeysのSpellが発動するということは、
やはり予想通りtapkeyが遅延(キー押しのメッセージを発行するだけして、
ほったらかしなのかもしれん)していて、
SelectPlayerSpell spellBackupの実行後にようやく詠唱キーが押されたことになってる、
と読めるのだけど、
Set spellBackup to GetPlayerSpellのあるなしでも変わるってことは、
そう単純でもないのか、あるいはSelectPlayerSpellに0を渡したときはなにもしないのか。

980でも言ったとおり、spellBackupに初期値を入れて、
(わかりやすいようにcastkeyでもHovs Hotkeysでも発動しないはずのもの)、
その上でSelectPlayerSpell spellBackupを消してみてくれ。
でないとわかんないよ(´・ω・`)

まあ、自力でなくても悔しくないなら、977でも言ったが、Super Hotkeys使え。
983982:2009/03/06(金) 23:07:10 ID:dWKgI6IN
間違えた。SelectPlayerSpell spellBackup消してどーする。

spellBackupに初期値を入れておいて、
Set spellBackup to GetPlayerSpellを消してね。
あるいは、Set spellBackup to [なんか他の呪文] でも可か。
984名無しさんの野望:2009/03/06(金) 23:33:48 ID:HxiyR9cB
>>982
無事に目的の動作を実装できました!

どうやら詠唱関係のコードはなんらかの方法で(再起?)ループ?しているよう
でした。確認不足です。ごめんなさい。
そのために、追加したコードが何度も実行されバグに繋がっていたようですが
>>978ではシーケンシャルに書いていたので綺麗に全体がループしているのであれば狙い通りの動作すると思われますし
具体的になにがどういう風に動作していておかしかったのかわからずじまいです
…。
ブレークポイントを置くこともできませんし
初めてスクリプト弄った私では調べようもないですから、とりあえずは良しとし
ます。

具体的な実装としましては、
GetMagicItemTypeが0であるのを条件にすることで
「元の魔法を待避する」動作(>>478でいう最初の@行)を一度だけしか実行されな
いようにする。

キャスティングされた時点で建てるフラグ作成し
それを条件に「元の魔法を選択しなおす」動作(二つめの@行)を別の位置で行う。

といった風にしました。
もし、需要があれば、つまらないものですが詳しくコードを書きます。


最後になりましたが皆様こんな説明不足な質問に優しいアドバイスをくださりあ
りがとうございました。
985名無しさんの野望:2009/03/06(金) 23:43:30 ID:HxiyR9cB
>>982
書き忘れました…


コードの全体を把握していなかったので
どのタイミングで代入すればデバッグに役立つ範囲で代入できるかわからなかったので>>981のようにしたのですが

宣言と同時に代入するということも可能なのですか?


英語なのでWiki流し読みって気にならず
適当にやり始めたのですが
どんな命令があるか、どこまでできるのかってことが全然わかっていないことが実感できました…
986名無しさんの野望:2009/03/07(土) 00:06:40 ID:UBOL9iPl
解決したみたいですが。
TapKeyの直後にSelectPlayerSpellしたらその魔法が詠唱されると思いますよ。
魔法の動作はそのスクリプトが終了してから始まるのでTapKeyの前後に関わらず最後に
SelectPlayerSpellされた魔法が唱えられる気がします。多分。

恐らく1フレーム待ってから元の魔法に復元すればOKな気が。
でも魔法グラフィック読み込みの遅延もありそうなので、ゲーム開始後初めて唱える魔法の
場合はウエイトが1フレームでは足りないかもしれません。
987名無しさんの野望:2009/03/07(土) 02:07:00 ID:zA26x2AO
HotkeyCastingはMod名です。わかりにくかったようで申し訳ない。
http://www.tesnexus.com/downloads/file.php?id=12244
挙動がまんまだったので参考になれば。
988982:2009/03/07(土) 10:59:11 ID:YUWw60QR
>>984
えーっと、再起やループは気のせいだと思われ。
少なくとも、elseif〜endifの間ではないわ。あったらこのスクリプトいじるの諦めるw

986も言ってるとおり、982で説明したのと似た動作のようだよ?
(呪文の詠唱解決がSelectPlayerSpell spellBackupの後に起こる)
983で出した代案のようにすれば、確かめられると思うんだけどな?

>>985
代入に有効なタイミングがないことも考えて、983で代案出しておいたのだが……
宣言と同時に代入できる言語などざらにあるので、可能性はあるっしょ。
あとは自分で試すが吉。
989名無しさんの野望:2009/03/07(土) 12:45:49 ID:cwh+wzyc
すげえ
990名無しさんの野望
番号キーで特定の魔法を唱えてその後元の魔法に戻す超単純なサンプルです。
http://up-load.ddo.jp/upload/data/up25660.jpg (zip)

WaterfrontにFTして「1」キーを押してみて下さい。現在の魔法とは関係無くフレアを撃ちます。
スクリプトはFTした近くにある巨大リンゴに付けてあります。やっつけです。
件のMODと構造が同じかは謎なのですが多分似たような事をやっている気が。
何かのご参考に。