OBLIVION MOD作成支援/相談スレPart3
プログラムに強い方に意見を聞きたいのですが
今まで私は、極力、GameMode ブロックを使うのを避け、
可能な限り、少々メンドクサイ処理になっても、OnActivate やOnLoad などの
「機会」処理を使うようにしてきました。その方が負荷が少ないと考えての事です。
でも、もしかすると例えば
Begin OnActivate というのは、仮想的には
Begin GameMode
If Activate == 1
endif
end
という処理と同じなんじゃないかと。(もちろん、If Activate なんてのはアリマセンが)
先頭の条件文でほとんどの処理を必要な時まで飛ばしてしまえるならば
別にGameMode ブロックでも負荷は同じなんじゃないでしょうか。
その辺、どう思われますか?
>>941 どうなんでしょうね。
確かに構文自体はイベントのコールバックを記述する、みたいな体裁になってますが、実際は
毎フレーム中間コードを頭から辿って例えばGameModeブロックの「beginコード」があったら
次に「end」が来るまでその処理内容を実行する、「OnActivate」の場合も同様に頭から順番に
ブロックを探す、みたいな事をひょっとしたらやっているかもしれません。
でもその場合はブロックを探してコードを辿るだけで該当ブロック以外の処理は実際には
実行されないと思うので、例えばActivateブロックを探すオーバーヘッドはGameModeでの
毎フレームの実判定処理と比べるとそれほど大きくは無い気もします。
また、「if-else-endif」でインタープリタのプログラムカウンタがジャンプするのか、それとも
「else」か「endif」が見つかるまでやっぱり中間コードを一つずつ辿るのか、とかの内部動作に
よっても負荷具合が変わってくるでしょう。
その辺の話はCSWikiのどこかにあった気がします。
確か「とりあえずGameModeを使うのは可能なら避けろ、インタープリタは中間コードを一つ
ずつ辿るからスクリプトはとにかく全体を短くしろ」、みたいな結論だった様な気もします。
詳しくはちょっと思い出せないのですが。
おお、ありがとうございます。
ん〜、なるほど。やっぱGameModeは出来るだけ避けるのが無難か…。
実際はGameModeをついつい使ってしまいますけどね。
On〜だけでは対応を網羅し切れずに、ひとつだけ例外的にGameModeで毎フレーム状態を監視
して何かをする、みたいなコードを書いてしまうと、例外はキモチ悪いからいっその事全部
GameModeで処理しちゃえ、みたいな方向につい流れてしまいます。
処理はイベント単位で独立させた方が後々メンテが楽な事は分かってるんですけど。
つい目先の誘惑に負けて集中管理的なコードを書いて泥沼になってしまう、というのはよく
ある話です。というかよくやります。
On〜だとコンパニオンでは動作しないのもあるしね…。
なるべくなら避けたいところではあるが、難しい。
クエストmod作ってるとgamemode使いまくりなんだけど
だめか・・やっぱだめか
全部やり直しかコレはもうだめだ。。。
>>946 いやいや、可能なら避けろという話だが、避けて通れるものでもないw
Blocktypesがもうちょっと豊富だったら良かったんだけどね
確かに。
GameModeを避ける、と言うのはとりあえずのガイドラインなんで、問題無く動きさえすれば
内部の作り方はもう好き勝手で全然OKだと思いますよ。
スクリプトでNPC等をイベント後に消そうとした時
reference Editor IDを設定して
Persistent Referenceにチェックして
後は○○.disableとしても
スクリプトエラーで
Script command"○○.disable" not found と出てしまうのですが
一体何がいけないのでしょうか?
refじゃなくObject IDを指定してるとか。
>>949 そのエラーはその行全体がスクリプトの構文として全く解釈不能な場合に出ます。
普通は半角の「.(ピリオド)」があれば解釈されて別のエラーになるので、それすら解釈されて
いない場合は全角や謎文字が混ざっていたりするかもです。
とりあえずその行を完全に消して一旦Save、エラーが出ない事を確認してからもう一度その
行をタイプし直してみたり。
スクリプトに使う文字はコメント部以外は半角英数字限定で。
行頭行末以外はTABも使わない方が安全です。
シールドに使用されているMeshオブジェクトを、鎧などに移植するとゲーム中は表示されないのですが、
これってNifScopeでどこいらへんいじればよろしいでしょうか?
シールドにはウェイト設定がされてないから、鎧などに組み込む場合は
blenderでウェイト設定しなければいけないのではなかろうか
>>952 移植って何を何のツールでどうしたのか書かんと意味がわからんのだけど。
エスパースキル低いから間違ってるかもだけど、移植って言ってるのは
CSでシールドのNifファイルをupperだのamuletだのの属性の装備に割り当てたってことか?
結論だけ言うとシールドなんかのNifファイルのメッシュを鎧とかの着る物にするのは
Blender等の3Dアプリ上で編集しないと無理。
鼻に変なテカリが出ると言ってた者ですが、
NiTristrips→NiTrishapeに変更したところ出なくなりました(ここまで長かった・・・)。
参考まで。
>>953,954
わかりました。ちょっとBlenderいじってくるyo.
ありがとー
>>955 肌のテカリに悩んでるので身体に応用できるかも知れないからもう少し詳しくやり方を
教えていただくとありがたいんだが?
>>955 NifskopeでNiTriStripsのMESHをTriangulate処理した
と考えて良いですか?
正に958さんが言われてることをやってみた次第です。
部分的なテカリって気になりますよね;;
私も装備着たときに首に菱形が浮かぶのが気になって質問しようと思ったけど
>>911これで直ったよ。
>>893-895 この流れから出来ないのかと思ったけど。
CSで地形をいじっているとたまにズーム量が大きくなってしまって
作業に支障がでたりするのですがどなたか原因に心あたりはないでしょうか
あぁ、Cellの名称がBashed Patchできると名詞日本語化が簡単なのに…
964 :
961:2009/03/03(火) 22:40:25 ID:ZNsnizzA
オブジェクトを選択している間はズーム量が2倍か3倍くらいに
なる仕様のようでこの状態のままだとLandScapeEditingに入っても
ズーム量が多いままな為だったようです
965 :
881:2009/03/04(水) 11:41:26 ID:G81Scocp
質問!
スクリプト内でアクティブになっているクエストの目的地を取得したいな、と
アクティブクエストのIDが取得できればいいのだろうけど、そんな関数ある?
>>963 それ毎回思う…
TIEとTEC直すのがめんどい
しとしん版からNamesをインポートするとバニラクエストの説明文が英語に戻るし
余分なのを切ったNamesをインポートするとSaveでCSが落ちるしOrz
クエストもインポートすれば両立できるけど本来含まれてないバニラのクエスト情報までespに入っちゃうのが…
ただの愚痴になってしまったOrz
>>966 Bashed Patch作成時にインポートする名前データをまとめた
csvファイルを作るのではだめだろうか。
そう思って試したいとは思うものの、
CSでエクスポートしたnames.txtから必要な箇所を抜き出すまではできても
帰宅するまで本格的な作業ができないw
csvファイルの書式そのものは
Data\Bashed Patch\Rational_Names.csvなんかが参考にできると考えているのだが。
>>967 Cell名は〜_Names.csvに出ないけど、インポート時にBash君が理解できるだろうか?
>クエストもインポートすれば両立できるけど本来含まれてないバニラのクエスト情報までespに入っちゃうのが…
不要なテキストを除けばちゃんと作れるよ。
Cellは諦め。
そもそもCellってCSで1個1個改名してくしかないよね?
エクスポートは出来るのにインポートできない・・・。
一応スクリプトでCell名を変えるっつー強引な技もあるにはあるんだが、
セーブに残るのでesp外しても戻らないと言う欠点が。
そもそも
>>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付けるだけでもいけるはずだ。
>>969 残念ですね。
cell名だけ変えるespが作れればなぁ
今は新作MOD入れるたびに日本語化ですよ。トホホ
>>969 > そもそもCellってCSで1個1個改名してくしかないよね?
原因はわからないが、インポートできるのもあればできないものもある
Modによって違うっぽい
>>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
訂正
>不要な部分を除いたNamesをインポートすると落ちます。
不要な部分を除いたNamesをインポートしたあとSaveで落ちます。
まあ結果変わらないですが…
>>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)が機能しないのか
登録した魔法ではなく、あらかじめ選択していた魔法をそのままキャストしてしまいました。
長文になってしまったうえうまく説明できないのですが
どうかお手伝いお願いします。
>>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
HotkeyCastingを使ってみては
>>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を手に入れることができませんでした…
>>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使え。
983 :
982: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流し読みって気にならず
適当にやり始めたのですが
どんな命令があるか、どこまでできるのかってことが全然わかっていないことが実感できました…
解決したみたいですが。
TapKeyの直後にSelectPlayerSpellしたらその魔法が詠唱されると思いますよ。
魔法の動作はそのスクリプトが終了してから始まるのでTapKeyの前後に関わらず最後に
SelectPlayerSpellされた魔法が唱えられる気がします。多分。
恐らく1フレーム待ってから元の魔法に復元すればOKな気が。
でも魔法グラフィック読み込みの遅延もありそうなので、ゲーム開始後初めて唱える魔法の
場合はウエイトが1フレームでは足りないかもしれません。
988 :
982: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
すげえ