制作日記

こういうの作った方が、逃げにくいじゃない

親ID判定

このへんがステート処理の関数の頭ぐらいで呼ばれてる
ステート移動後に再度ステート処理開始するときも呼ばれる


00424EF0 /$ 8B5424 04 MOV EDX,DWORD PTR SS:[ESP+4]
00424EF4 |. 837A 1C 01 CMP DWORD PTR DS:[EDX+1C],1
00424EF8 |. 74 03 JE SHORT winmugen.00424EFD
00424EFA |. 33C0 XOR EAX,EAX
00424EFC |. C3 RETN
00424EFD |> 8B8A 20260000 MOV ECX,DWORD PTR DS:[EDX+2620]
00424F03 |. 56 PUSH ESI
00424F04 |. 8BB2 1C260000 MOV ESI,DWORD PTR DS:[EDX+261C]
00424F0A |. 8B41 04 MOV EAX,DWORD PTR DS:[ECX+4]
00424F0D |. 2BC6 SUB EAX,ESI
00424F0F |. 5E POP ESI
00424F10 |. F7D8 NEG EAX
00424F12 |. 1BC0 SBB EAX,EAX
00424F14 |. F7D0 NOT EAX
00424F16 |. 23C1 AND EAX,ECX
00424F18 \. C3 RETN


判定処理はここ

00424F04 |. 8BB2 1C260000 MOV ESI,DWORD PTR DS:[EDX+261C]
00424F0A |. 8B41 04 MOV EAX,DWORD PTR DS:[ECX+4]
00424F0D |. 2BC6 SUB EAX,ESI
00424F0F |. 5E POP ESI
00424F10 |. F7D8 NEG EAX
00424F12 |. 1BC0 SBB EAX,EAX
00424F14 |. F7D0 NOT EAX
00424F16 |. 23C1 AND EAX,ECX

上から、
所謂影のIDを取得
parent,idを取得
2つを引き算
使わないレジスタを戻す
引き算の結果の正負反転(元の値が0ならCFが0、それ以外なら1になる)
同じ値同士で引き算、CFが1なら更に1引く(上の引き算結果が0なら0、それ以外なら-1になる)
引き算結果を反転(0なら0xFFFFFFFF、-1なら0になる)
反転結果とparent,idで論理積を取る

要は、parent,idと影のIDが一致してたらparent,id
一致してなければ0になる

ちゃんとは見てないけど、この演算結果が使いまわされてるっぽい

このへんが、parentvarsetのステコン固有処理の入り口で

0047106E |> 8BAC24 A010000>MOV EBP,DWORD PTR SS:[ESP+10A0] ; Case 130 of switch 0046E830
00471075 |. 837D 1C 01 CMP DWORD PTR SS:[EBP+1C],1
00471079 |. 0F85 01050000 JNZ winmugen.00471580
0047107F |. 85DB TEST EBX,EBX
00471081 |. 75 1B JNZ SHORT winmugen.0047109E
00471083 |. 68 74C24A00 PUSH winmugen.004AC274 ; ASCII "no parent for parentvarset"
00471088 |. 55 PUSH EBP
00471089 |. E8 6245FAFF CALL winmugen.004155F0



0047106E |> 8BAC24 A010000>MOV EBP,DWORD PTR SS:[ESP+10A0] ; Case 130 of switch 0046E830
00471075 |. 837D 1C 01 CMP DWORD PTR SS:[EBP+1C],1

ここでishelperが1か否かを見てて


0047107F |. 85DB TEST EBX,EBX

ここでさっきの演算結果が0か否かを見てる
ここで0に流れるってことはヘルパーだけど親がいない
つまり、parentvarsetの相手がいない警告を出す対象で


00471083 |. 68 74C24A00 PUSH winmugen.004AC274 ; ASCII "no parent for parentvarset"
00471088 |. 55 PUSH EBP
00471089 |. E8 6245FAFF CALL winmugen.004155F0

これで警告出してる

常時監視ステートの処理とかステート移動でのループとかの制御は004414EEのあたり
常時監視ステートは0047F7D0、個別ステートは047F3E0で処理してる
どっちも上の処理は呼び出してるから、何かしらのステート処理開始時には呼ばれる
詳しい実行条件まで見てないから、無理やり何とかすればスキップできるのかもしれんが、そこまでは知らん

コメントの投稿

非公開コメント

プロフィール

Author:drab
霊夢改変キャラ
「12 3 ! {V} [_]」
公開中
L霊夢でもl_reimuでも好きなように読んでください

最新記事
最新コメント
月別アーカイブ
カテゴリ
検索フォーム
RSSリンクの表示
リンク