「hsp天道の解説」の編集履歴(バックアップ)一覧はこちら
hsp天道の解説 - (2010/03/01 (月) 14:13:11) の1つ前との変更点
追加された行は緑色になります。
削除された行は赤色になります。
#areaedit()
|>|>|CENTER:BGCOLOR(pink):&font(b,180%,white){hsp天道}|
|&nicovideo(sm9225202){320}&br()&nicovideo2(sm9225202,320,240)|CENTER:BGCOLOR(#F0F8FF):使用ゲーム|信長の野望・天道|
|~|CENTER:BGCOLOR(#F0F8FF):シナリオ・担当勢力|-|
|~|CENTER:BGCOLOR(#F0F8FF):シナリオの設定|-|
|~|CENTER:BGCOLOR(#F0F8FF):動画形態|-|
|~|CENTER:BGCOLOR(#F0F8FF):登録武将|-|
|~|CENTER:BGCOLOR(#F0F8FF):史実武将の扱い|-|
|~|CENTER:BGCOLOR(#F0F8FF):縛り|-|
|~|CENTER:BGCOLOR(#F0F8FF):投稿時期|-|
|~|CENTER:BGCOLOR(#F0F8FF):投稿者名|tamura|
|~|CENTER:BGCOLOR(#F0F8FF):マイリスト|[[hsp天道>>http://www.nicovideo.jp/mylist/16100594]]|
|~|CENTER:BGCOLOR(#F0F8FF):関連タグ|[[【hsp天道】>http://www.nicovideo.jp/tag/hsp%E5%A4%A9%E9%81%93]]|
|~|CENTER:BGCOLOR(#F0F8FF):ニコニコ大百科||
|~|CENTER:BGCOLOR(#F0F8FF):関連サイト|-|
|~|CENTER:BGCOLOR(#F0F8FF):ニコ証|-|
|~|CENTER:BGCOLOR(#F0F8FF):関連動画|[[その時幻想郷が動いた>>その時幻想郷が動いた解説]]|
|~|CENTER:BGCOLOR(#F0F8FF):備考|-|
#areaedit(end)
#areaedit()
*簡単な解説
一人の動画製作者が、謎の技術に挑む!!
ひなやぼでおなじみ、『覚醒システム』を、
全く関係のないうp主が天道で作ろうとするが果たして?
うp主はプログラミングには疎いので、ここはこうしたら?、とかあったら御遠慮なく。
#areaedit(end)
#areaedit()
*注意事項
①信仲の野望・天道の、シナリオ『群雄割拠』でないと使えません。
②蠣崎季広の統率・武勇・知略・政治を変更しないでください!
どうしてもという方は中華ツールで蠣崎さんを死亡の状態にしておき、
登録武将として第二の蠣崎季広さんを作っておくといいと思います。
③蠣崎さんの統率のアドレスはPC環境によって変わります。
使用者が独自にプロセスメモリエディタで調べないといけません。
シナリオ開始日時も同様です。
しかも、シナリオ開始日時は、下4ケタも変動する事が分かってきました。
今のところ、この現象が起きたら、35F0を変更しないといけません。
④使用言語はHSPです。HSPのホームページなどから入手してください。
⑤NoDVD化していないと使用できません。
⑥使用は自己責任で! 問題が起こってもこちらでは責任を負えません。
使い方
天道を起動中して、シナリオを選ぶか、セーブデータをロードしてから、スクリプトを起動してください。
追記
・アドレスが一時的に大きく変動して、日付がサーチできないときがあるようです。その時はPCを再起動してみてください。
#areaedit(end)
#areaedit()
*ソースコード
/*以下をコピーして、HSPのエディタに貼り付ければ使えることを確認しました。
「シナリオ開始日付」・「蠣崎季広の統率」のアドレスを調べて、下4桁をメモしておき、
下記ソースの該当箇所を、そのソースで書き換えてください*/
#region(close,長いので閉じられるようにしました。)
#uselib "user32.dll"
#func SetTimer "SetTimer" int,int,int,int
#func KillTimer "KillTimer" int,int
#uselib "kernel32.dll"
#cfunc CreateToolhelp32Snapshot "CreateToolhelp32Snapshot" int,int
#cfunc Process32First "Process32First" int,sptr
#cfunc Process32Next "Process32Next" int,sptr
#func CloseHandle "CloseHandle" int
#cfunc OpenProcess "OpenProcess" int,int,int
#func ReadProcessMemory "ReadProcessMemory" int,int,var,int,int
#func WriteProcessMemory "WriteProcessMemory" int,int,var,int,int
#define WM_TIMER 0x0113
#define TIMER_ID 1 ; タイマーID
sdim strBuf,25000;あとで使う変数。
gsel 0,-1;起動時に現れるなんとかというウィンドウを消す。
;ウィンドウの表示、およびあれこれ設定。
screen 2,300,100,4
hMainWnd=hwnd
onexit goto *exit
title "test"
button goto "システム実行!",*main_system
; メッセージ処理の登録、タイマーメッセージが来たら*OnTimerラベルへ飛ぶ。
oncmd gosub *OnTimer,WM_TIMER
; タイマーを設定(1秒間隔)
SetTimer hwnd,TIMER_ID,1000,0
if stat==0 {
dialog "タイマーの設定に失敗しました。", 1, "エラー"
end
}
;ハンドル取得に使う変数を準備。
sdim ProcName,260
dim PROCESSENTRY32,74
ProcName="NOBU13.exe"
;スナップショットを調べて、天道のハンドルという情報を探す。
*GetProc
GameWndPID=0
hSnap=CreateToolhelp32Snapshot($F,0)
if hSnap==-1:dialog "CreateToolhelp32Snapshot error",1,"スナップショットなし":stop
PROCESSENTRY32.0=296
if Process32First(hSnap,varptr(PROCESSENTRY32)){
do
getstr strBuf,PROCESSENTRY32,36,'\0'
if strBuf==ProcName:GameWndPID=PROCESSENTRY32.2:_break
until Process32Next(hSnap,varptr(PROCESSENTRY32))==0
if GameWndPID==0{
CloseHandle hSnap
error="天道は起動していますか?\nEXEはNOBU13.exeですか?"
switch MessageBoxA(hMainWnd,error,"エラー",$15)
case 2
end
case 4
goto *GetProc
swend
}
}else{
CloseHandle hSnap
dialog "Process32First error",1,"想定外のエラー"
end
}
CloseHandle hSnap
hGameWndProc=OpenProcess($1F0FFF,0,GameWndPID)
;サーチ用変数。
NowSearchA=0
NowSearchB=0
NowSearchC=0
NowSearchD=0
/*以下の2つの数値の下4桁はPC環境によって変わるので、使用者が独自に調べて下さい。*/
adr_today=$110035F0;シナリオ開始日時のアドレス。35F0の部分を調べてください。
k=$200001DC;蠣崎季広の統率のアドレス。01DCの部分を調べてください。
;ゲーム内の日付を検索する。
*Search_today
ReadProcessMemory hGameWndProc,int(adr_today),NowSearchA,4,0
ReadProcessMemory hGameWndProc,int(adr_today+4),NowSearchB,4,0
ReadProcessMemory hGameWndProc,int(adr_today+16),NowSearchC,4,0
ReadProcessMemory hGameWndProc,int(adr_today+20),NowSearchD,4,0
if NowSearchA==$61D&NowSearchB==$3 {;群雄割拠の開始日付を探す。
if NowSearchA<=NowSearchC{
dialog "日付を発見しました!"
mes NowSearchC;現在の年号を表示
adr_today=adr_today+16;現在の年号のアドレスを入力しておく。
goto *Search_kaki
} else {
adr_today=adr_today+$10000
goto *Search_today
}
} else {
if adr_today>$14000000 {
dialog "日付が見つかりません。\n天道を再起動してみてください。"
end
} else {
adr_today=adr_today+$10000
goto *Search_today
}
}
stop
;蠣崎季広のデータを検索する。
*Search_kaki
ReadProcessMemory hGameWndProc,int(k),NowSearchA,4,0
ReadProcessMemory hGameWndProc,int(k)+4,NowSearchB,4,0
ReadProcessMemory hGameWndProc,int(k)+8,NowSearchC,4,0
ReadProcessMemory hGameWndProc,int(k)+12,NowSearchD,4,0
;NowSearchXは、はじめに4バイトで使ったので、後はずっと4バイトで使用する。
if NowSearchA=$44&NowSearchB=$31&NowSearchC=$4C&NowSearchD=$4F {
dialog "蠣崎季広のデータを見つけました!"
} else {
if k>$220001DC {
dialog "季広のデータが見つかりません\n天道を再起動してみてください。"
stop
}
k=k+$10000
goto *Search_kaki
}
;ここでmain_systemで使う変数の準備。
kaguya_kyotenn_taikyuu=0
Value=0
ValueB=0
ValueC=0
ValueWA=0
AdrBuf=0
yuuka_tousi_now=0
stop ;OnTimerに行く前にstopで止めないとエラー。
*OnTimer
;タイマーメッセージの処理
if wparam==TIMER_ID : gosub *main_system
return 0;gosubで呼びだしたラベルの最後はreturnでないとスタック領域がオーバーフローしましたというエラーがでる。
;覚醒システム本体
*main_system
;幽香(武将No.464)の戦法が発動した瞬間のみ、幽香の武勇を倍にする。
yuuka_tousi_pre=yuuka_tousi_now
ReadProcessMemory hGameWndProc,int(k+$38300-$40),Value,4,0
AdrBuf=Value;AdrBuf=現在地のポインタ
ReadProcessMemory hGameWndProc,int(AdrBuf),Value,4,0
if Value==$D32FE0 {
ReadProcessMemory hGameWndProc,int(AdrBuf+$78),Value,4,0;Value=軍勢のポインタ。
if Value==$0 {;幽香の部隊が単独である。
ReadProcessMemory hGameWndProc,int(AdrBuf+$4C),yuuka_tousi_now,4,0
} else {;幽香の部隊が軍勢に含まれる。
ReadProcessMemory hGameWndProc,int(Value+$4C),yuuka_tousi_now,4,0
}
}
if yuuka_tousi_now!=0&&yuuka_tousi_now<=yuuka_tousi_pre {;闘志の減少を確認。
ValueWA=230
WriteProcessMemory hGameWndProc,int(k+$38300+$4),ValueWA,4,0
}
vs_heiryoku_pre=vs_heiryoku_now
ReadProcessMemory hGameWndProc,int(k+$38300-$40),Value,4,0
AdrBuf=Value;AdrBuf=現在地のポインタ
ReadProcessMemory hGameWndProc,int(AdrBuf+$10),Value,4,0
AdrBuf=Value;攻撃目標のポインタ
ReadProcessMemory hGameWndProc,int(AdrBuf),Value,4,0
if Value==$D30120 {;攻撃目標が拠点である。
ReadProcessMemory hGameWndProc,int(AdrBuf+$28),vs_heiryoku_now,4,0
}
if vs_heiryoku_now<vs_heiryoku_pre||vs_heiryoku_now==0 {;兵数が減少したら、武勇を元に戻す。
ValueWA=115
WriteProcessMemory hGameWndProc,int(k+$38300+$4),ValueWA,4,0
}
;輝夜(武将No.499)の所属拠点の耐久値を回復する。
AdrBuf=k+$3C6D0-$40;輝夜の現在地のポインタのアドレス
ReadProcessMemory hGameWndProc,int(AdrBuf),Value,4,0;Value=現在地データ始まりのアドレス
AdrBuf=Value
ReadProcessMemory hGameWndProc,int(AdrBuf),ValueB,4,0
if ValueB==$D30120 {;現在地が拠点である
AdrBuf=k+$3C6D0-$40;輝夜の現在地のポインタのアドレス
ReadProcessMemory hGameWndProc,int(AdrBuf),Value,4,0;Value=拠点データ始まりのアドレス
AdrBuf=Value+$110
ReadProcessMemory hGameWndProc,int(AdrBuf),Value,4,0;Value=耐久値のアドレス
AdrBuf=Value+$C
ReadProcessMemory hGameWndProc,int(AdrBuf),kaguya_kyotenn_taikyuu,4,0
if kaguya_kyotenn_taikyuu<6000{
Value=6000
WriteProcessMemory hGameWndProc,int(AdrBuf),Value,4,0
}
}
;衣玖(武将No.90)の部隊の士気を回復する。
AdrBuf=k+$AE60-$40;イクサンの現在地ポインタ
ReadProcessMemory hGameWndProc,int(AdrBuf),Value,4,0
AdrBuf=Value
ReadProcessMemory hGameWndProc,int(AdrBuf),Value,4,0
if Value==$D32FE0 {
AdrBuf=AdrBuf+$48
ValueWA=$64
WriteProcessMemory hGameWndProc,int(AdrBuf),ValueWA,4,0
}
;衣玖の覚醒条件 武将No.93と94が同じ勢力。
ReadProcessMemory hGameWndProc,int(k+$AE60),Value,4,0
if Value<99 {;衣玖が未覚醒
ReadProcessMemory hGameWndProc,int(k+$AE60-$74),Value,4,0
ReadProcessMemory hGameWndProc,int(k+$B430-$74),ValueB,4,0
ReadProcessMemory hGameWndProc,int(k+$B620-$74),ValueC,4,0
if Value==ValueB&&Value==ValueC{;二人とも同じ勢力
ValueWA=100
WriteProcessMemory hGameWndProc,int(k+$AE60),ValueWA,4,0
WriteProcessMemory hGameWndProc,int(k+$B430),ValueWA,4,0
WriteProcessMemory hGameWndProc,int(k+$B620),ValueWA,4,0
}
}
return 0
*exit
KillTimer hwnd,TIMER_ID ;タイマーを破棄
CloseHandle hGameWndProc
end
#endregion
#areaedit(end)
#areaedit()
*追加コード
以下はすべて、*main_systemからreturn0の間に追加すれば使えます。
#region(close,06回 早苗)
※早苗が拠点を落としたとき、拠点兵力が減らないバグが発生しています。近々対応します。
;早苗の軍勢が出陣しても、拠点の兵力が減らない。
ReadProcessMemory hGameWndProc,int(k+$67E60-$40),sanae_gennzaiti_Adr,4,0
ReadProcessMemory hGameWndProc,int(sanae_gennzaiti_Adr),Value,4,0;早苗の現在地を取得
if sanae_syutuzinn==0 {;フラグOFF
if Value==$D30120 {;早苗が拠点にいる。
ReadProcessMemory hGameWndProc,int(sanae_gennzaiti_Adr+$28),sanae_kyotenn_heiryoku,4,0;拠点兵力を取得。
sanae_kyotenn_heiryoku_Adr=sanae_gennzaiti_Adr+$28
}
if Value==$D32FE0 {;早苗が出陣している
ReadProcessMemory hGameWndProc,int(sanae_gennzaiti_Adr+$70),ValueC,4,0;さっきまでいた拠点の兵力を減らす。
ReadProcessMemory hGameWndProc,int(ValueC+$28),ValueD,4,0
ReadProcessMemory hGameWndProc,int(sanae_gennzaiti_Adr+$28),ValueB,4,0
ValueWA=ValueD+ValueB
WriteProcessMemory hGameWndProc,int(sanae_kyotenn_heiryoku_Adr),ValueWA,4,0
ReadProcessMemory hGameWndProc,int(adr_today),sanae_syutuzinn_year,4,0;日付を取得
ReadProcessMemory hGameWndProc,int(adr_today+$4),sanae_syutuzinn_month,4,0
ReadProcessMemory hGameWndProc,int(adr_today+$8),sanae_syutuzinn_day,4,0
ReadProcessMemory hGameWndProc,int(sanae_gennzaiti_Adr+$70),ValueB,4,0;出陣拠点の兵力を取得。
sanae_kyotenn_heiryoku_Adr=ValueB+$28
ReadProcessMemory hGameWndProc,int(sanae_kyotenn_heiryoku_Adr),sanae_kyotenn_heiryoku,4,0
sanae_syutuzinn=1;フラグON
ValueWA=30000;兵力を30000に。
WriteProcessMemory hGameWndProc,int(sanae_gennzaiti_Adr+$28),ValueWA,4,0
}
}
if sanae_syutuzinn==1 {;フラグON
if Value==$D30120 {;早苗が拠点にいる(拠点に帰還した)。
ReadProcessMemory hGameWndProc,int(sanae_gennzaiti_Adr+$28),sanae_kyotenn_heiryoku,4,0;拠点兵力
sanae_kyotenn_heiryoku=sanae_kyotenn_heiryoku-sanae_heiryoku;拠点兵力から現在兵力を減らす。
WriteProcessMemory hGameWndProc,int(sanae_gennzaiti_Adr+$28),sanae_kyotenn_heiryoku,4,0
sanae_syutuzinn=0
}
if Value==$D32FE0 {;早苗が出陣している
ReadProcessMemory hGameWndProc,int(sanae_gennzaiti_Adr+$28),sanae_heiryoku,4,0;現在兵力取得。
ReadProcessMemory hGameWndProc,int(sanae_gennzaiti_Adr+$78),ValueB,4,0
;兵糧を補給する。
ReadProcessMemory hGameWndProc,int(adr_today),sanae_now_year,4,0;日付を取得
ReadProcessMemory hGameWndProc,int(adr_today+$4),sanae_now_month,4,0
ReadProcessMemory hGameWndProc,int(adr_today+$8),sanae_now_day,4,0
sanae_keikanissuu=(sanae_now_year-sanae_syutuzinn_year)*360+(sanae_now_month-sanae_syutuzinn_month)*30+(sanae_now_day-sanae_syutuzinn_day)
ReadProcessMemory hGameWndProc,int(sanae_gennzaiti_Adr+$28),ValueB,4,0
sanae_hokyuu_hyourou=ValueB*sanae_keikanissuu/90
if sanae_hokyuu_hyourou>0 {;季節始めに兵糧が激減するバグの防止。
ReadProcessMemory hGameWndProc,int(k+$67E60-$74),ValueC,4,0
ReadProcessMemory hGameWndProc,int(ValueC+$4C),ValueD,4,0
ValueD=ValueD+sanae_hokyuu_hyourou
WriteProcessMemory hGameWndProc,int(ValueC+$4C),ValueD,4,0
}
ReadProcessMemory hGameWndProc,int(adr_today),sanae_syutuzinn_year,4,0;多重に補給しないよう、出陣日数を書き換えておく。
ReadProcessMemory hGameWndProc,int(adr_today+$4),sanae_syutuzinn_month,4,0
ReadProcessMemory hGameWndProc,int(adr_today+$8),sanae_syutuzinn_day,4,0
ValueWA=0
WriteProcessMemory hGameWndProc,int(sanae_gennzaiti_Adr+$2C),ValueWA,4,0;傷兵を消す。
}
}
#endregion
#region(close,06回 神奈子)
;神奈子が攻撃中の相手に、毎秒特定の打撃を与える。
ReadProcessMemory hGameWndProc,int(k+$63A90-$40),AdrBuf,4,0
ReadProcessMemory hGameWndProc,int(AdrBuf),Value,4,0;神奈子の現在地を調べる。
if Value==$D32FE0{;出陣中
ReadProcessMemory hGameWndProc,int(AdrBuf+$10),ValueB,4,0
ReadProcessMemory hGameWndProc,int(ValueB),ValueC,4,0
if ValueC==$D32FE0||ValueC==$D30120 {;目標は敵部隊、もしくは拠点
ReadProcessMemory hGameWndProc,int(ValueB+$28),ValueWA,4,0
ValueWA=ValueWA-100
ReadProcessMemory hGameWndProc,int(ValueB+$2C),ValueWB,4,0
ValueWB=ValueWB+100
if ValueWA<0 {
ValueWB=ValueWB+ValueWA
ValueWA=0
}
WriteProcessMemory hGameWndProc,int(ValueB+$28),ValueWA,4,0
WriteProcessMemory hGameWndProc,int(ValueB+$2C),ValueWB,4,0
}
if ValueC==$D2FDC8 {;目標は敵施設。
ReadProcessMemory hGameWndProc,int(ValueB+$C),ValueWA,4,0
ValueWA=ValueWA-100
if ValueWA<0 {
ValueWA=0
}
WriteProcessMemory hGameWndProc,int(ValueB+$C),ValueWA,4,0
}
}
#endregion
#region(close,06回 諏訪子)
;諏訪子の戦法が発動した瞬間のみ、備え系戦法効果時間を5倍にする。
suwako_tousi_pre=suwako_tousi_now
ReadProcessMemory hGameWndProc,int(k+$51DC0-$40),Value,4,0
AdrBuf=Value;AdrBuf=現在地のポインタ
ReadProcessMemory hGameWndProc,int(AdrBuf),Value,4,0
if Value==$D32FE0 {;出陣中
ReadProcessMemory hGameWndProc,int(AdrBuf+$78),Value,4,0;Value=軍勢のポインタ。
if Value==$0 {;諏訪子の部隊が単独である。
ReadProcessMemory hGameWndProc,int(AdrBuf+$4C),suwako_tousi_now,4,0;部隊の闘志取得
ReadProcessMemory hGameWndProc,int(AdrBuf+$10),ValueB,4,0
ReadProcessMemory hGameWndProc,int(ValueB+$28),suwako_vs_heiryoku_now,4,0;対戦相手の兵力
} else {;諏訪子の部隊が軍勢に含まれる。
ReadProcessMemory hGameWndProc,int(Value+$4C),suwako_tousi_now,4,0;軍勢の闘志
ReadProcessMemory hGameWndProc,int(Value+$10),ValueB,4,0
ReadProcessMemory hGameWndProc,int(ValueB+$28),suwako_vs_heiryoku_now,4,0;対戦相手の兵力
}
if suwako_tousi_now!=0&&suwako_tousi_now<suwako_tousi_pre {;闘志の減少を確認。
ValueWA=100
WriteProcessMemory hGameWndProc,int($E90E08),ValueWA,4,0
}
if suwako_tousi_now>suwako_tousi_pre||suwako_tousi_now==0 {;闘志が減少したら、値を元に戻す。
ValueWA=20
WriteProcessMemory hGameWndProc,int($E90E08),ValueWA,4,0
}
} else {;出陣中に非ず
ReadProcessMemory hGameWndProc,int($E90E08),Value,4,0
if Value>20 {
ValueWA=20
WriteProcessMemory hGameWndProc,int($E90E08),ValueWA,4,0;パラメータを元に戻す。
}
}
#endregion
#region(close,08回 雛)
;雛(武将No3)の撃破兵数を知る。
ReadProcessMemory hGameWndProc,int(k+$91500),HinaKill,4,0;ヒナキルの呼び出し。
ReadProcessMemory hGameWndProc,int(k+$91500-$F0),HinaLV_pre,4,0;雛レベルの呼び出し。
ReadProcessMemory hGameWndProc,int(k+$5D0-$40),Value,4,0
ReadProcessMemory hGameWndProc,int(Value),ValueB,4,0
if ValueB==$D32FE0 {;雛が出陣中。
hina_mokuhyou_pre=hina_mokuhyou_now
hina_mokuhyou_heiryoku_pre=hina_mokuhyou_heiryoku_now
hina_syouhei_pre=hina_syouhei_now
ReadProcessMemory hGameWndProc,int(Value+$10),hina_mokuhyou_now,4,0;攻撃目標
ReadProcessMemory hGameWndProc,int(hina_mokuhyou_now),ValueB,4,0;目標の種類取得
ReadProcessMemory hGameWndProc,int(hina_mokuhyou_now+$28),hina_mokuhyou_heiryoku_now,4,0;目標兵数
ReadProcessMemory hGameWndProc,int(hina_mokuhyou_now+$2C),hina_syouhei_now,4,0;目標兵数
if ValueB==$D32FE0||ValueB==$D30120 {
if hina_mokuhyou_pre==hina_mokuhyou_now{;目標が健在。
gennsyou=hina_mokuhyou_heiryoku_pre-hina_mokuhyou_heiryoku_now;兵数減少。
zouka_syouhei=hina_syouhei_now-hina_syouhei_pre
ValueD=gennsyou*0.3
if gennsyou>=0&&zouka_syouhei>ValueD {;兵力が減少しており、傷兵がそれに見合うだけ増えている。
HinaKill=HinaKill+gennsyou
WriteProcessMemory hGameWndProc,int(k+$91500),HinaKill,4,0;ヒナキルの保管。
}
}
}
}
cls
;雛のレベルアップ
HinaLV_now=HinaKill/10000
if HinaLV_now>HinaLV_pre {;レベルがさっきまでと違う
ReadProcessMemory hGameWndProc,int(k+$5D0),ValueWA,4,0
ValueWA=ValueWA+1
WriteProcessMemory hGameWndProc,int(k+$5D0),ValueWA,4,0
ReadProcessMemory hGameWndProc,int(k+$5D0+$8),ValueWA,4,0
ValueWA=ValueWA+1
WriteProcessMemory hGameWndProc,int(k+$5D0+$8),ValueWA,4,0
HinaLV_pre=HinaLV_pre+1
WriteProcessMemory hGameWndProc,int(k+$91500-$F0),HinaLV_pre,4,0
mes "LVUP"
}
mes "目標前"+hina_mokuhyou_pre+""
mes "目標今"+hina_mokuhyou_now+""
mes "兵力前"+hina_mokuhyou_heiryoku_pre+""
mes "兵力今"+hina_mokuhyou_heiryoku_now+""
mes "減少値"+gennsyou+""
mes "ヒナキル"+HinaKill+""
mes "雛レベル"+HinaLV_pre+""
mes "雛レベル"+HinaLV_now+""
#endregion
#region(close,9回 にとり)
;にとり(No247)が岩付城東の匠ノ町3を支配していれば、そこの技術を三段構えに変える。
ReadProcessMemory hGameWndProc,int(adr_today+$8),Value,4,0
if Value>1&&Value<10 {;2~9日の間で、以下の判定がまだ。
if nitori_gizyutu_hantei==0 {
for i,1,364,1;全国の町並みを調べ、三段構えを研究している場所が無いか調査。
AdrBuf=k-$AE684+i*$8C
ReadProcessMemory hGameWndProc,int(AdrBuf),Value,4,0
ValueB=k-$116BB4
if Value==ValueB {;三段構えが研究済み
nitori_gizyutu_kakikae=20;書き換え実行せず。
}
next
nitori_gizyutu_hantei=1;判定済み
if nitori_gizyutu_kakikae==0 {
ReadProcessMemory hGameWndProc,int(k+$1DE90-$74),ValueC,4,0;にとりの勢力
ReadProcessMemory hGameWndProc,int(k-$AB3A8-$10),Value,4,0;該当匠ノ町3の支配拠点
ReadProcessMemory hGameWndProc,int(Value+$108),ValueB,4,0;その拠点の勢力
if ValueC==ValueB {;該当匠ノ町3をにとりの勢力が支配
ReadProcessMemory hGameWndProc,int(k-$AB3A8),Value,4,0;技術を取得
if Value!=0 {;なんらかの技術が研究されている。
nitori_gizyutu_kakikae=1;書き換え開始
}
}
}
}
} else {
nitori_gizyutu_hantei=0
}
if nitori_gizyutu_kakikae>=1&&nitori_gizyutu_kakikae<10 {
nitori_gizyutu_kakikae=nitori_gizyutu_kakikae+1
Value=10-nitori_gizyutu_kakikae
mes ""+Value+"秒以内に岩付城を画面外に!!"
}
if nitori_gizyutu_kakikae==10 {
ValueWA=01
WriteProcessMemory hGameWndProc,int(k-$116BB4+$58),ValueWA,4,0
ValueWA=k-$116BB4
WriteProcessMemory hGameWndProc,int(k-$AB3A8),ValueWA,4,0
nitori_gizyutu_kakikae=0
}
#endregion
#region(close,10回 聖)
;聖白蓮(武将No623)
;【戦法強化】:なし。
;【拠点防衛】:なし。
;【特殊能力】:お抱え衆の戦力を3万、出動日数を200。
ReadProcessMemory hGameWndProc,int(k+$4B710-$74),Value,4,0;軍団
ReadProcessMemory hGameWndProc,int(Value+$8),ValueB,4,0;勢力
ReadProcessMemory hGameWndProc,int(ValueB+$114),AdrBuf,4,0;お抱え衆
if hiziri_okakae_now!=AdrBuf {;お抱え衆が変更された。
if AdrBuf!=0 {;お抱え衆が存在。
ReadProcessMemory hGameWndProc,int(AdrBuf+$6C),Value,4,0
if Value<=9000 {
ValueWA=30000
WriteProcessMemory hGameWndProc,int(AdrBuf+$6C),ValueWA,4,0
hiziri_okakae_now=AdrBuf
}
}
ReadProcessMemory hGameWndProc,int(hiziri_okakae_now+$6C),Value,4,0;過去のお抱え衆を元に戻す。
if Value==30000 {
ValueWA=9000
WriteProcessMemory hGameWndProc,int(hiziri_okakae_now+$6C),ValueWA,4,0
}
}
if AdrBuf!=0 {;お抱え衆が存在。
ReadProcessMemory hGameWndProc,int(AdrBuf+$70),Value,4,0
if Value>0&&Value<80&&hiziri_okakae_nissuu==0 {;出動中、日数が書き換えられていない。
ValueWA=200
WriteProcessMemory hGameWndProc,int(AdrBuf+$70),ValueWA,4,0
hiziri_okakae_nissuu=1;書き換え終了。
}
if Value==0&&hiziri_okakae_nissuu==1 {
hiziri_okakae_nissuu=0
}
}
mes hiziri_okakae_nissuu
ReadProcessMemory hGameWndProc,int(AdrBuf+$70),Value,4,0
mes Value
#endregion
#areaedit(end)
*コメント欄
- 修正してくれた方、ありがとうございました! -- tamura (2010-01-16 23:24:54)
#comment
#areaedit()
|>|>|CENTER:BGCOLOR(pink):&font(b,180%,white){hsp天道}|
|&nicovideo(sm9225202){320}&br()&nicovideo2(sm9225202,320,240)|CENTER:BGCOLOR(#F0F8FF):使用ゲーム|信長の野望・天道|
|~|CENTER:BGCOLOR(#F0F8FF):シナリオ・担当勢力|-|
|~|CENTER:BGCOLOR(#F0F8FF):シナリオの設定|-|
|~|CENTER:BGCOLOR(#F0F8FF):動画形態|-|
|~|CENTER:BGCOLOR(#F0F8FF):登録武将|-|
|~|CENTER:BGCOLOR(#F0F8FF):史実武将の扱い|-|
|~|CENTER:BGCOLOR(#F0F8FF):縛り|-|
|~|CENTER:BGCOLOR(#F0F8FF):投稿時期|-|
|~|CENTER:BGCOLOR(#F0F8FF):投稿者名|tamura|
|~|CENTER:BGCOLOR(#F0F8FF):マイリスト|[[hsp天道>>http://www.nicovideo.jp/mylist/16100594]]|
|~|CENTER:BGCOLOR(#F0F8FF):関連タグ|[[【hsp天道】>http://www.nicovideo.jp/tag/hsp%E5%A4%A9%E9%81%93]]|
|~|CENTER:BGCOLOR(#F0F8FF):ニコニコ大百科||
|~|CENTER:BGCOLOR(#F0F8FF):関連サイト|-|
|~|CENTER:BGCOLOR(#F0F8FF):ニコ証|-|
|~|CENTER:BGCOLOR(#F0F8FF):関連動画|[[その時幻想郷が動いた>>その時幻想郷が動いた解説]]|
|~|CENTER:BGCOLOR(#F0F8FF):備考|-|
#areaedit(end)
#areaedit()
*簡単な解説
一人の動画製作者が、謎の技術に挑む!!
ひなやぼでおなじみ、『覚醒システム』を、
全く関係のないうp主が天道で作ろうとするが果たして?
うp主はプログラミングには疎いので、ここはこうしたら?、とかあったら御遠慮なく。
#areaedit(end)
#areaedit()
*注意事項
①信仲の野望・天道の、シナリオ『群雄割拠』でないと使えません。
②蠣崎季広の統率・武勇・知略・政治を変更しないでください!
どうしてもという方は中華ツールで蠣崎さんを死亡の状態にしておき、
登録武将として第二の蠣崎季広さんを作っておくといいと思います。
③蠣崎さんの統率のアドレスはPC環境によって変わります。
使用者が独自にプロセスメモリエディタで調べないといけません。
シナリオ開始日時も同様です。
しかも、シナリオ開始日時は、下4ケタも変動する事が分かってきました。
今のところ、この現象が起きたら、35F0を変更しないといけません。
④使用言語はHSPです。HSPのホームページなどから入手してください。
⑤NoDVD化していないと使用できません。
⑥使用は自己責任で! 問題が起こってもこちらでは責任を負えません。
使い方
天道を起動中して、シナリオを選ぶか、セーブデータをロードしてから、スクリプトを起動してください。
追記
・アドレスが一時的に大きく変動して、日付がサーチできないときがあるようです。その時はPCを再起動してみてください。
#areaedit(end)
#areaedit()
*ソースコード
/*以下をコピーして、HSPのエディタに貼り付ければ使えることを確認しました。
「シナリオ開始日付」・「蠣崎季広の統率」のアドレスを調べて、下4桁をメモしておき、
下記ソースの該当箇所を、そのソースで書き換えてください*/
#region(close,長いので閉じられるようにしました。)
#uselib "user32.dll"
#func SetTimer "SetTimer" int,int,int,int
#func KillTimer "KillTimer" int,int
#uselib "kernel32.dll"
#cfunc CreateToolhelp32Snapshot "CreateToolhelp32Snapshot" int,int
#cfunc Process32First "Process32First" int,sptr
#cfunc Process32Next "Process32Next" int,sptr
#func CloseHandle "CloseHandle" int
#cfunc OpenProcess "OpenProcess" int,int,int
#func ReadProcessMemory "ReadProcessMemory" int,int,var,int,int
#func WriteProcessMemory "WriteProcessMemory" int,int,var,int,int
#define WM_TIMER 0x0113
#define TIMER_ID 1 ; タイマーID
sdim strBuf,25000;あとで使う変数。
gsel 0,-1;起動時に現れるなんとかというウィンドウを消す。
;ウィンドウの表示、およびあれこれ設定。
screen 2,300,400,4
hMainWnd=hwnd
onexit goto *exit
title "test"
button gosub "戦法+$90",*test_kakizaki_sennpou_hennkou
; メッセージ処理の登録、タイマーメッセージが来たら*OnTimerラベルへ飛ぶ。
oncmd gosub *OnTimer,WM_TIMER
; タイマーを設定(1秒間隔)
SetTimer hwnd,TIMER_ID,1000,0
if stat==0 {
dialog "タイマーの設定に失敗しました。", 1, "エラー"
end
}
;乱数の準備
randomize
;ハンドル取得に使う変数を準備。
sdim ProcName,260
dim PROCESSENTRY32,74
ProcName="NOBU13.exe"
;スナップショットを調べて、天道のハンドルという情報を探す。
*GetProc
GameWndPID=0
hSnap=CreateToolhelp32Snapshot($F,0)
if hSnap==-1:dialog "CreateToolhelp32Snapshot error",1,"スナップショットなし":stop
PROCESSENTRY32.0=296
if Process32First(hSnap,varptr(PROCESSENTRY32)){
do
getstr strBuf,PROCESSENTRY32,36,'\0'
if strBuf==ProcName:GameWndPID=PROCESSENTRY32.2:_break
until Process32Next(hSnap,varptr(PROCESSENTRY32))==0
if GameWndPID==0{
CloseHandle hSnap
error="天道は起動していますか?\nEXEはNOBU13.exeですか?"
switch MessageBoxA(hMainWnd,error,"エラー",$15)
case 2
end
case 4
goto *GetProc
swend
}
}else{
CloseHandle hSnap
dialog "Process32First error",1,"想定外のエラー"
end
}
CloseHandle hSnap
hGameWndProc=OpenProcess($1F0FFF,0,GameWndPID)
;サーチ用変数。
NowSearchA=0
NowSearchB=0
NowSearchC=0
NowSearchD=0
adr_today=$110036A8;35F0;36A8
k=$200001DC
adr_ootutu_jump=$12004BB0
adr_sisetu_top=$2000004C
adr_yakusyoku_top=$1200EF34
adr_kakizaki_sennpou=$12005800
;ゲーム内の日付を検索する。
*Search_today
ReadProcessMemory hGameWndProc,int(adr_today),NowSearchA,4,0
ReadProcessMemory hGameWndProc,int(adr_today+4),NowSearchB,4,0
ReadProcessMemory hGameWndProc,int(adr_today+16),NowSearchC,4,0
ReadProcessMemory hGameWndProc,int(adr_today+20),NowSearchD,4,0
if NowSearchA==$61D&NowSearchB==$3 {;群雄割拠の開始日付を探す。
;if NowSearchA==$62E&NowSearchB==$1 {;夢幻の如くの開始日付を探す。
if NowSearchA<=NowSearchC{
mes "日付を発見しました!"
adr_today=adr_today+16;現在の年号のアドレスを入力しておく。
goto *Search_kaki
} else {
adr_today=adr_today+$10000
goto *Search_today
}
} else {
if adr_today>$14000000 {
if adr_today==$140036A8{
adr_today=$110035F0
goto *Search_today
} else {
dialog "日付が見つかりません。\n天道を再起動してみてください。"
end
}
} else {
adr_today=adr_today+$10000
goto *Search_today
}
}
stop
;蠣崎季広のデータを検索する。
*Search_kaki
ReadProcessMemory hGameWndProc,int(k),NowSearchA,4,0
ReadProcessMemory hGameWndProc,int(k)+4,NowSearchB,4,0
ReadProcessMemory hGameWndProc,int(k)+8,NowSearchC,4,0
ReadProcessMemory hGameWndProc,int(k)+12,NowSearchD,4,0
;NowSearchXは、はじめに4バイトで使ったので、後はずっと4バイトで使用する。
if NowSearchA=$44&NowSearchB=$31&NowSearchC=$4C&NowSearchD=$4F {
mes "蠣崎季広のデータを見つけました!"
goto *Search_ootutu_taiA
} else {
if k>$220001DC {
dialog "季広のデータが見つかりません\n天道を再起動してみてください。"
stop
}
k=k+$10000
goto *Search_kaki
}
stop
;大筒隊のアドレスを取得する。
*Search_ootutu_taiA
ReadProcessMemory hGameWndProc,int(adr_ootutu_jump),NowSearchA,4,0
ReadProcessMemory hGameWndProc,int(NowSearchA),NowSearchB,4,0
if NowSearchB==$D31D5C {
mes "大筒隊のデータを発見しました!"
goto *Search_sisetu_top
ReadProcessMemory hGameWndProc,int(adr_ootutu_jump),adr_ootutu,4,0
} else {
if adr_ootutu_jump>$13000000 {
adr_ootutu_jump=$12003CC0
goto *Search_ootutu_taiB
} else {
adr_ootutu_jump=adr_ootutu_jump+$10000
goto *Search_ootutu_taiA
}
}
stop
*Search_ootutu_taiB
ReadProcessMemory hGameWndProc,int(adr_ootutu_jump),NowSearchA,4,0
ReadProcessMemory hGameWndProc,int(NowSearchA),NowSearchB,4,0
if NowSearchB==$D31D5C {
mes "大筒隊のデータを発見しました!"
ReadProcessMemory hGameWndProc,int(adr_ootutu_jump),adr_ootutu,4,0
goto *Search_sisetu_top
} else {
if adr_ootutu_jump>$13000000 {
dialog "大筒のデータが見つかりません\n天道を再起動してみてください。"
} else {
adr_ootutu_jump=adr_ootutu_jump+$10000
goto *Search_ootutu_taiB
}
}
stop
;施設データの先頭を検索する。よくよく調べたらkから特定可能だった。
*Search_sisetu_top
ReadProcessMemory hGameWndProc,int(adr_sisetu_top),NowSearchA,4,0
if NowSearchA==$D2FDC8 {
mes "施設データの先頭を発見しました!"
goto *Search_yakusyoku_top
} else {
adr_sisetu_top=adr_sisetu_top+$10000
if adr_sisetu_top>$22000000 {
dialog "施設データが見つかりません。\n天道を再起動してみてください。"
end
}
goto *Search_sisetu_top
}
stop
;役職データの先頭を検索する。征夷大将軍のデータの先頭を探す。
*Search_yakusyoku_top
ReadProcessMemory hGameWndProc,int(adr_yakusyoku_top),NowSearchA,4,0
if NowSearchA==$D33600 {
mes "役職データの先頭を発見しました!"
goto *Search_kakizaki_sennpou
} else {
adr_yakusyoku_top=adr_yakusyoku_top+$10000
if adr_yakusyoku_top>$13000000 {
dialog "役職データが見つかりません。\n天道を再起動してみてください。"
end
}
goto *Search_yakusyoku_top
}
stop
;蠣崎季広の戦法を検索する。
*Search_kakizaki_sennpou
ReadProcessMemory hGameWndProc,int(adr_kakizaki_sennpou),NowSearchA,4,0
ReadProcessMemory hGameWndProc,int(NowSearchA+$8),NowSearchB,4,0
NowSearchC=k-$11BE68
if NowSearchB==NowSearchC {
mes "蠣崎季広の戦法を発見しました!"
adr_kakizaki_sennpou=NowSearchA+$8;adr_kakizaki_sennpouに蠣崎季広の戦法のアドレスを入力。
dialog "準備よし。"
goto *main_system_ready
} else {
adr_kakizaki_sennpou=adr_kakizaki_sennpou+$10000
if adr_yakusyoku_top>$13000000 {
dialog "蠣崎季広の戦法が見つかりません。\n天道を再起動してみてください。"
end
}
goto *Search_kakizaki_sennpou
}
stop
*main_system_ready
;ここでmain_systemで使う変数の準備。
kaguya_kyotenn_taikyuu=0
sanae_syutuzinn=0;早苗が出陣しているかどうかのフラグ
kanako_syutuzinn=0;神奈子が出陣しているかどうかのフラグ
dim kimokeene_kani_toukyuu,300
dim orin_yakusyoku_toukyuu,300
dim syou_kahou_toukyuu,400
dim daityan_zuikou_izyou_zizoku,5;大ちゃんの能力で使用。
dim iku_zuikou_siki,5;永江衣玖の能力で使用。
#include "gennsoukyou.hsp"
#include "koumakyou.hsp"
#include "koumakann.hsp"
#include "youyoumu.hsp"
#include "eiyasyou.hsp"
#include "huuzinnroku.hsp"
#include "kaeizuka.hsp"
#include "hisoutennsoku.hsp"
#include "seirensen.hsp"
#include "month.hsp"
#include "ten_day.hsp"
#include "koumakann_member_count.hsp"
#include "koumakann_syuppon.hsp"
stop ;OnTimerに行く前にstopで止めないとエラー。
*OnTimer
;タイマーメッセージの処理
if wparam==TIMER_ID : gosub *main_system
return 0;gosubで呼びだしたラベルの最後はreturnでないとスタック領域がオーバーフローしましたというエラーがでる。
*main_system
cls
ReadProcessMemory hGameWndProc,int(adr_today+8),day_now,4,0
mes "今"+day_now+"日"
ReadProcessMemory hGameWndProc,int(adr_today+4),now_month,4,0
mes "今月は"+now_month+""
;毎月2~5日の間に一回だけ呼び出すサブルーチン。
if day_now>1&day_now<=5&month_system_still_done==0 {
gosub *koumakann_member_count
gosub *main_system_month
month_system_still_done=1;フラグをONにし、今月はこれ以上実行しない。
}
if day_now>6&month_system_still_done==1 {;フラグをOFFにする。
month_system_still_done=0
}
;毎月5~10、15~20、25~30の間に呼びだすサブルーチン。
;毎月5~10日
if day_now>=5&day_now<=10&ten_day_system_still_doneA==0 {
gosub *main_system_ten_day
gosub *koumakann_syuppon
ten_day_system_still_doneA=1;フラグをONにし、今月はこれ以上実行しない。
}
if day_now>10&ten_day_system_still_doneA==1 {;フラグをOFFにする。
ten_day_system_still_doneA=0
}
;毎月15~20日
if day_now>=15&day_now<=20&ten_day_system_still_doneB==0 {
gosub *main_system_ten_day
gosub *koumakann_syuppon
ten_day_system_still_doneB=1;フラグをONにし、今月はこれ以上実行しない。
}
if day_now>20|day_now<15 {;フラグをOFFにする。
if ten_day_system_still_doneB==1 {
ten_day_system_still_doneB=0
}
}
;毎月25~30日
if day_now>25&day_now<=30&ten_day_system_still_doneC==0 {
gosub *main_system_ten_day
gosub *koumakann_syuppon
ten_day_system_still_doneC=1;フラグをONにし、今月はこれ以上実行しない。
}
if day_now<25&ten_day_system_still_doneC==1 {;フラグをOFFにする。
ten_day_system_still_doneC=0
}
;毎秒呼び出すサブルーチン。
gosub *main_system_gensoukyou
gosub *main_system_koumakyou
gosub *main_system_koumakann
gosub *main_system_youyoumu
gosub *main_system_eiyasyou
gosub *main_system_huuzinnroku
gosub *main_system_hisoutennsoku
gosub *main_system_seirensen
return 0
*test_kakizaki_sennpou_hennkou
ReadProcessMemory hGameWndProc,int(adr_kakizaki_sennpou),ValueWA,4,0
ValueWA=ValueWA+$90
WriteProcessMemory hGameWndProc,int(adr_kakizaki_sennpou),ValueWA,4,0
mes "蠣崎季広の戦法変更"
return 0
*exit
KillTimer hwnd,TIMER_ID ;タイマーを破棄
CloseHandle hGameWndProc
end
#endregion
#areaedit(end)
#areaedit()
*追加コード
以下はすべて、*main_systemからreturn0の間に追加すれば使えます。
#region(close,06回 早苗)
※早苗が拠点を落としたとき、拠点兵力が減らないバグが発生しています。近々対応します。
;早苗の軍勢が出陣しても、拠点の兵力が減らない。
ReadProcessMemory hGameWndProc,int(k+$67E60-$40),sanae_gennzaiti_Adr,4,0
ReadProcessMemory hGameWndProc,int(sanae_gennzaiti_Adr),Value,4,0;早苗の現在地を取得
if sanae_syutuzinn==0 {;フラグOFF
if Value==$D30120 {;早苗が拠点にいる。
ReadProcessMemory hGameWndProc,int(sanae_gennzaiti_Adr+$28),sanae_kyotenn_heiryoku,4,0;拠点兵力を取得。
sanae_kyotenn_heiryoku_Adr=sanae_gennzaiti_Adr+$28
}
if Value==$D32FE0 {;早苗が出陣している
ReadProcessMemory hGameWndProc,int(sanae_gennzaiti_Adr+$70),ValueC,4,0;さっきまでいた拠点の兵力を減らす。
ReadProcessMemory hGameWndProc,int(ValueC+$28),ValueD,4,0
ReadProcessMemory hGameWndProc,int(sanae_gennzaiti_Adr+$28),ValueB,4,0
ValueWA=ValueD+ValueB
WriteProcessMemory hGameWndProc,int(sanae_kyotenn_heiryoku_Adr),ValueWA,4,0
ReadProcessMemory hGameWndProc,int(adr_today),sanae_syutuzinn_year,4,0;日付を取得
ReadProcessMemory hGameWndProc,int(adr_today+$4),sanae_syutuzinn_month,4,0
ReadProcessMemory hGameWndProc,int(adr_today+$8),sanae_syutuzinn_day,4,0
ReadProcessMemory hGameWndProc,int(sanae_gennzaiti_Adr+$70),ValueB,4,0;出陣拠点の兵力を取得。
sanae_kyotenn_heiryoku_Adr=ValueB+$28
ReadProcessMemory hGameWndProc,int(sanae_kyotenn_heiryoku_Adr),sanae_kyotenn_heiryoku,4,0
sanae_syutuzinn=1;フラグON
ValueWA=30000;兵力を30000に。
WriteProcessMemory hGameWndProc,int(sanae_gennzaiti_Adr+$28),ValueWA,4,0
}
}
if sanae_syutuzinn==1 {;フラグON
if Value==$D30120 {;早苗が拠点にいる(拠点に帰還した)。
ReadProcessMemory hGameWndProc,int(sanae_gennzaiti_Adr+$28),sanae_kyotenn_heiryoku,4,0;拠点兵力
sanae_kyotenn_heiryoku=sanae_kyotenn_heiryoku-sanae_heiryoku;拠点兵力から現在兵力を減らす。
WriteProcessMemory hGameWndProc,int(sanae_gennzaiti_Adr+$28),sanae_kyotenn_heiryoku,4,0
sanae_syutuzinn=0
}
if Value==$D32FE0 {;早苗が出陣している
ReadProcessMemory hGameWndProc,int(sanae_gennzaiti_Adr+$28),sanae_heiryoku,4,0;現在兵力取得。
ReadProcessMemory hGameWndProc,int(sanae_gennzaiti_Adr+$78),ValueB,4,0
;兵糧を補給する。
ReadProcessMemory hGameWndProc,int(adr_today),sanae_now_year,4,0;日付を取得
ReadProcessMemory hGameWndProc,int(adr_today+$4),sanae_now_month,4,0
ReadProcessMemory hGameWndProc,int(adr_today+$8),sanae_now_day,4,0
sanae_keikanissuu=(sanae_now_year-sanae_syutuzinn_year)*360+(sanae_now_month-sanae_syutuzinn_month)*30+(sanae_now_day-sanae_syutuzinn_day)
ReadProcessMemory hGameWndProc,int(sanae_gennzaiti_Adr+$28),ValueB,4,0
sanae_hokyuu_hyourou=ValueB*sanae_keikanissuu/90
if sanae_hokyuu_hyourou>0 {;季節始めに兵糧が激減するバグの防止。
ReadProcessMemory hGameWndProc,int(k+$67E60-$74),ValueC,4,0
ReadProcessMemory hGameWndProc,int(ValueC+$4C),ValueD,4,0
ValueD=ValueD+sanae_hokyuu_hyourou
WriteProcessMemory hGameWndProc,int(ValueC+$4C),ValueD,4,0
}
ReadProcessMemory hGameWndProc,int(adr_today),sanae_syutuzinn_year,4,0;多重に補給しないよう、出陣日数を書き換えておく。
ReadProcessMemory hGameWndProc,int(adr_today+$4),sanae_syutuzinn_month,4,0
ReadProcessMemory hGameWndProc,int(adr_today+$8),sanae_syutuzinn_day,4,0
ValueWA=0
WriteProcessMemory hGameWndProc,int(sanae_gennzaiti_Adr+$2C),ValueWA,4,0;傷兵を消す。
}
}
#endregion
#region(close,06回 神奈子)
;神奈子が攻撃中の相手に、毎秒特定の打撃を与える。
ReadProcessMemory hGameWndProc,int(k+$63A90-$40),AdrBuf,4,0
ReadProcessMemory hGameWndProc,int(AdrBuf),Value,4,0;神奈子の現在地を調べる。
if Value==$D32FE0{;出陣中
ReadProcessMemory hGameWndProc,int(AdrBuf+$10),ValueB,4,0
ReadProcessMemory hGameWndProc,int(ValueB),ValueC,4,0
if ValueC==$D32FE0||ValueC==$D30120 {;目標は敵部隊、もしくは拠点
ReadProcessMemory hGameWndProc,int(ValueB+$28),ValueWA,4,0
ValueWA=ValueWA-100
ReadProcessMemory hGameWndProc,int(ValueB+$2C),ValueWB,4,0
ValueWB=ValueWB+100
if ValueWA<0 {
ValueWB=ValueWB+ValueWA
ValueWA=0
}
WriteProcessMemory hGameWndProc,int(ValueB+$28),ValueWA,4,0
WriteProcessMemory hGameWndProc,int(ValueB+$2C),ValueWB,4,0
}
if ValueC==$D2FDC8 {;目標は敵施設。
ReadProcessMemory hGameWndProc,int(ValueB+$C),ValueWA,4,0
ValueWA=ValueWA-100
if ValueWA<0 {
ValueWA=0
}
WriteProcessMemory hGameWndProc,int(ValueB+$C),ValueWA,4,0
}
}
#endregion
#region(close,06回 諏訪子)
;諏訪子の戦法が発動した瞬間のみ、備え系戦法効果時間を5倍にする。
suwako_tousi_pre=suwako_tousi_now
ReadProcessMemory hGameWndProc,int(k+$51DC0-$40),Value,4,0
AdrBuf=Value;AdrBuf=現在地のポインタ
ReadProcessMemory hGameWndProc,int(AdrBuf),Value,4,0
if Value==$D32FE0 {;出陣中
ReadProcessMemory hGameWndProc,int(AdrBuf+$78),Value,4,0;Value=軍勢のポインタ。
if Value==$0 {;諏訪子の部隊が単独である。
ReadProcessMemory hGameWndProc,int(AdrBuf+$4C),suwako_tousi_now,4,0;部隊の闘志取得
ReadProcessMemory hGameWndProc,int(AdrBuf+$10),ValueB,4,0
ReadProcessMemory hGameWndProc,int(ValueB+$28),suwako_vs_heiryoku_now,4,0;対戦相手の兵力
} else {;諏訪子の部隊が軍勢に含まれる。
ReadProcessMemory hGameWndProc,int(Value+$4C),suwako_tousi_now,4,0;軍勢の闘志
ReadProcessMemory hGameWndProc,int(Value+$10),ValueB,4,0
ReadProcessMemory hGameWndProc,int(ValueB+$28),suwako_vs_heiryoku_now,4,0;対戦相手の兵力
}
if suwako_tousi_now!=0&&suwako_tousi_now<suwako_tousi_pre {;闘志の減少を確認。
ValueWA=100
WriteProcessMemory hGameWndProc,int($E90E08),ValueWA,4,0
}
if suwako_tousi_now>suwako_tousi_pre||suwako_tousi_now==0 {;闘志が減少したら、値を元に戻す。
ValueWA=20
WriteProcessMemory hGameWndProc,int($E90E08),ValueWA,4,0
}
} else {;出陣中に非ず
ReadProcessMemory hGameWndProc,int($E90E08),Value,4,0
if Value>20 {
ValueWA=20
WriteProcessMemory hGameWndProc,int($E90E08),ValueWA,4,0;パラメータを元に戻す。
}
}
#endregion
#region(close,08回 雛)
;雛(武将No3)の撃破兵数を知る。
ReadProcessMemory hGameWndProc,int(k+$91500),HinaKill,4,0;ヒナキルの呼び出し。
ReadProcessMemory hGameWndProc,int(k+$91500-$F0),HinaLV_pre,4,0;雛レベルの呼び出し。
ReadProcessMemory hGameWndProc,int(k+$5D0-$40),Value,4,0
ReadProcessMemory hGameWndProc,int(Value),ValueB,4,0
if ValueB==$D32FE0 {;雛が出陣中。
hina_mokuhyou_pre=hina_mokuhyou_now
hina_mokuhyou_heiryoku_pre=hina_mokuhyou_heiryoku_now
hina_syouhei_pre=hina_syouhei_now
ReadProcessMemory hGameWndProc,int(Value+$10),hina_mokuhyou_now,4,0;攻撃目標
ReadProcessMemory hGameWndProc,int(hina_mokuhyou_now),ValueB,4,0;目標の種類取得
ReadProcessMemory hGameWndProc,int(hina_mokuhyou_now+$28),hina_mokuhyou_heiryoku_now,4,0;目標兵数
ReadProcessMemory hGameWndProc,int(hina_mokuhyou_now+$2C),hina_syouhei_now,4,0;目標兵数
if ValueB==$D32FE0||ValueB==$D30120 {
if hina_mokuhyou_pre==hina_mokuhyou_now{;目標が健在。
gennsyou=hina_mokuhyou_heiryoku_pre-hina_mokuhyou_heiryoku_now;兵数減少。
zouka_syouhei=hina_syouhei_now-hina_syouhei_pre
ValueD=gennsyou*0.3
if gennsyou>=0&&zouka_syouhei>ValueD {;兵力が減少しており、傷兵がそれに見合うだけ増えている。
HinaKill=HinaKill+gennsyou
WriteProcessMemory hGameWndProc,int(k+$91500),HinaKill,4,0;ヒナキルの保管。
}
}
}
}
cls
;雛のレベルアップ
HinaLV_now=HinaKill/10000
if HinaLV_now>HinaLV_pre {;レベルがさっきまでと違う
ReadProcessMemory hGameWndProc,int(k+$5D0),ValueWA,4,0
ValueWA=ValueWA+1
WriteProcessMemory hGameWndProc,int(k+$5D0),ValueWA,4,0
ReadProcessMemory hGameWndProc,int(k+$5D0+$8),ValueWA,4,0
ValueWA=ValueWA+1
WriteProcessMemory hGameWndProc,int(k+$5D0+$8),ValueWA,4,0
HinaLV_pre=HinaLV_pre+1
WriteProcessMemory hGameWndProc,int(k+$91500-$F0),HinaLV_pre,4,0
mes "LVUP"
}
mes "目標前"+hina_mokuhyou_pre+""
mes "目標今"+hina_mokuhyou_now+""
mes "兵力前"+hina_mokuhyou_heiryoku_pre+""
mes "兵力今"+hina_mokuhyou_heiryoku_now+""
mes "減少値"+gennsyou+""
mes "ヒナキル"+HinaKill+""
mes "雛レベル"+HinaLV_pre+""
mes "雛レベル"+HinaLV_now+""
#endregion
#region(close,9回 にとり)
;にとり(No247)が岩付城東の匠ノ町3を支配していれば、そこの技術を三段構えに変える。
ReadProcessMemory hGameWndProc,int(adr_today+$8),Value,4,0
if Value>1&&Value<10 {;2~9日の間で、以下の判定がまだ。
if nitori_gizyutu_hantei==0 {
for i,1,364,1;全国の町並みを調べ、三段構えを研究している場所が無いか調査。
AdrBuf=k-$AE684+i*$8C
ReadProcessMemory hGameWndProc,int(AdrBuf),Value,4,0
ValueB=k-$116BB4
if Value==ValueB {;三段構えが研究済み
nitori_gizyutu_kakikae=20;書き換え実行せず。
}
next
nitori_gizyutu_hantei=1;判定済み
if nitori_gizyutu_kakikae==0 {
ReadProcessMemory hGameWndProc,int(k+$1DE90-$74),ValueC,4,0;にとりの勢力
ReadProcessMemory hGameWndProc,int(k-$AB3A8-$10),Value,4,0;該当匠ノ町3の支配拠点
ReadProcessMemory hGameWndProc,int(Value+$108),ValueB,4,0;その拠点の勢力
if ValueC==ValueB {;該当匠ノ町3をにとりの勢力が支配
ReadProcessMemory hGameWndProc,int(k-$AB3A8),Value,4,0;技術を取得
if Value!=0 {;なんらかの技術が研究されている。
nitori_gizyutu_kakikae=1;書き換え開始
}
}
}
}
} else {
nitori_gizyutu_hantei=0
}
if nitori_gizyutu_kakikae>=1&&nitori_gizyutu_kakikae<10 {
nitori_gizyutu_kakikae=nitori_gizyutu_kakikae+1
Value=10-nitori_gizyutu_kakikae
mes ""+Value+"秒以内に岩付城を画面外に!!"
}
if nitori_gizyutu_kakikae==10 {
ValueWA=01
WriteProcessMemory hGameWndProc,int(k-$116BB4+$58),ValueWA,4,0
ValueWA=k-$116BB4
WriteProcessMemory hGameWndProc,int(k-$AB3A8),ValueWA,4,0
nitori_gizyutu_kakikae=0
}
#endregion
#region(close,10回 聖)
;聖白蓮(武将No623)
;【戦法強化】:なし。
;【拠点防衛】:なし。
;【特殊能力】:お抱え衆の戦力を3万、出動日数を200。
ReadProcessMemory hGameWndProc,int(k+$4B710-$74),Value,4,0;軍団
ReadProcessMemory hGameWndProc,int(Value+$8),ValueB,4,0;勢力
ReadProcessMemory hGameWndProc,int(ValueB+$114),AdrBuf,4,0;お抱え衆
if hiziri_okakae_now!=AdrBuf {;お抱え衆が変更された。
if AdrBuf!=0 {;お抱え衆が存在。
ReadProcessMemory hGameWndProc,int(AdrBuf+$6C),Value,4,0
if Value<=9000 {
ValueWA=30000
WriteProcessMemory hGameWndProc,int(AdrBuf+$6C),ValueWA,4,0
hiziri_okakae_now=AdrBuf
}
}
ReadProcessMemory hGameWndProc,int(hiziri_okakae_now+$6C),Value,4,0;過去のお抱え衆を元に戻す。
if Value==30000 {
ValueWA=9000
WriteProcessMemory hGameWndProc,int(hiziri_okakae_now+$6C),ValueWA,4,0
}
}
if AdrBuf!=0 {;お抱え衆が存在。
ReadProcessMemory hGameWndProc,int(AdrBuf+$70),Value,4,0
if Value>0&&Value<80&&hiziri_okakae_nissuu==0 {;出動中、日数が書き換えられていない。
ValueWA=200
WriteProcessMemory hGameWndProc,int(AdrBuf+$70),ValueWA,4,0
hiziri_okakae_nissuu=1;書き換え終了。
}
if Value==0&&hiziri_okakae_nissuu==1 {
hiziri_okakae_nissuu=0
}
}
mes hiziri_okakae_nissuu
ReadProcessMemory hGameWndProc,int(AdrBuf+$70),Value,4,0
mes Value
#endregion
#areaedit(end)
*コメント欄
- 修正してくれた方、ありがとうございました! -- tamura (2010-01-16 23:24:54)
#comment