「hsp天道の解説」の編集履歴(バックアップ)一覧に戻る

hsp天道の解説 - (2010/03/04 (木) 18:29:07) の編集履歴(バックアップ)


hsp天道

使用ゲーム 信長の野望・天道
シナリオ・担当勢力 -
シナリオの設定 -
動画形態 -
登録武将 -
史実武将の扱い -
縛り -
投稿時期 -
投稿者名 tamura
マイリスト hsp天道
関連タグ 【hsp天道】
ニコニコ大百科
関連サイト -
ニコ証 -
関連動画 その時幻想郷が動いた
備考 -



簡単な解説

一人の動画製作者が、謎の技術に挑む!!

ひなやぼでおなじみ、『覚醒システム』を、
全く関係のないうp主が天道で作ろうとするが果たして?

うp主はプログラミングには疎いので、ここはこうしたら?、とかあったら御遠慮なく。

注意事項

①信仲の野望・天道の、シナリオ『群雄割拠』でないと使えません。
②蠣崎季広の統率・武勇・知略・政治を変更しないでください!
どうしてもという方は中華ツールで蠣崎さんを死亡の状態にしておき、
登録武将として第二の蠣崎季広さんを作っておくといいと思います。
③蠣崎さんの統率のアドレスはPC環境によって変わります。
使用者が独自にプロセスメモリエディタで調べないといけません。
シナリオ開始日時も同様です。
しかも、シナリオ開始日時は、下4ケタも変動する事が分かってきました。
今のところ、この現象が起きたら、35F0を変更しないといけません。
④使用言語はHSPです。HSPのホームページなどから入手してください。
⑤NoDVD化していないと使用できません。
⑥使用は自己責任で! 問題が起こってもこちらでは責任を負えません。

使い方
天道を起動中して、シナリオを選ぶか、セーブデータをロードしてから、スクリプトを起動してください。

追記
  • アドレスが一時的に大きく変動して、日付がサーチできないときがあるようです。その時はPCを再起動してみてください。

ソースコード

対応するregion、endregionプラグインが不足しています。対になるようプラグインを配置してください。
#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

インクルードファイル huuzinnroku.hsp

対応するregion、endregionプラグインが不足しています。対になるようプラグインを配置してください。
stop
 
*main_system_huuzinnroku
;雛の撃破兵数を知る。
ReadProcessMemory hGameWndProc,int(k+$91500),HinaKill,4,0;ヒナキルの呼び出し。
ReadProcessMemory hGameWndProc,int(k+$91500-$F0),HinaLV_pre,4,0;雛レベルの呼び出し。
ReadProcessMemory hGameWndProc,int(k+$5D0-$40),hina_syozai_adr,4,0
ReadProcessMemory hGameWndProc,int(hina_syozai_adr),hina_syozai_value,4,0
if hina_syozai_value==$D32FE0 {;雛が出陣中。
	hina_mokuhyou_pre=hina_mokuhyou_now
	hina_mokuhyou_heiryoku_pre=hina_mokuhyou_heiryoku_now
	hina_syouhei_pre=hina_syouhei_now
	ReadProcessMemory hGameWndProc,int(hina_syozai_adr+$10),hina_mokuhyou_now,4,0;攻撃目標
	ReadProcessMemory hGameWndProc,int(hina_mokuhyou_now),hina_mokuhyou_value,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 hina_mokuhyou_value==$D32FE0||hina_mokuhyou_value==$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
			hina_syouhei_hanntei=gennsyou*0.3
			if gennsyou>=0&&zouka_syouhei>hina_syouhei_hanntei {;兵力が減少しており、傷兵がそれに見合うだけ増えている。
				HinaKill=HinaKill+gennsyou
				WriteProcessMemory hGameWndProc,int(k+$91500),HinaKill,4,0;ヒナキルの保管。
			}
		}
	}
 
}
;雛のレベルアップ
HinaLV_now=HinaKill/10000
if HinaLV_now>HinaLV_pre {;レベルがさっきまでと違う
	ReadProcessMemory hGameWndProc,int(k+$5D0),hina_write,4,0
	hina_write=hina_write+1
	WriteProcessMemory hGameWndProc,int(k+$5D0),hina_write,4,0
	ReadProcessMemory hGameWndProc,int(k+$5D0+$8),hina_write,4,0
	hina_write=hina_write+1
	WriteProcessMemory hGameWndProc,int(k+$5D0+$8),hina_write,4,0
	HinaLV_pre=HinaLV_pre+1
	WriteProcessMemory hGameWndProc,int(k+$91500-$F0),HinaLV_pre,4,0;雛レベルの保管。
	mes "LVUP"
}
mes "ヒナキル"+HinaKill+""
mes "雛レベル"+HinaLV_now+""
 
;にとり(No247)が岩付城東の匠ノ町3を支配していれば、そこの技術を三段構えに変える。
;変数修正・動作確認済み。
ReadProcessMemory hGameWndProc,int(adr_today+$8),nitori_today,4,0
if nitori_today>1&&nitori_today<10 {;2~9日の間で、以下の判定がまだ。
	if nitori_gizyutu_hantei==0 {
		for i,1,364,1;全国の町並みを調べ、三段構えを研究している場所が無いか調査。
			nitori_matinami=k-$AE684+i*$8C
			ReadProcessMemory hGameWndProc,int(nitori_matinami),nitori_matinami_gizyutu,4,0
			sanndanngamae=k-$116BB4
			if nitori_matinami_gizyutu==sanndanngamae {;三段構えが研究済み
				nitori_gizyutu_kakikae=20;書き換え実行せず。
			}
		next
		nitori_gizyutu_hantei=1;判定済み
		if nitori_gizyutu_kakikae==0 {
			ReadProcessMemory hGameWndProc,int(k+$1DE90-$74),nitori_gunndan,4,0;にとりの勢力
			ReadProcessMemory hGameWndProc,int(k-$AB3A8-$10),nitori_takumi_sihai_kyotenn,4,0;該当匠ノ町3の支配拠点
			ReadProcessMemory hGameWndProc,int(nitori_takumi_sihai_kyotenn+$108),nitori_takumi_sihai_gunndann,4,0;その拠点の勢力
			if nitori_gunndan==nitori_takumi_sihai_gunndann {;該当匠ノ町3をにとりの勢力が支配
				ReadProcessMemory hGameWndProc,int(k-$AB3A8),nitori_takumi_gizyutu,4,0;技術を取得
				if nitori_takumi_gizyutu!=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
	nitori_count=10-nitori_gizyutu_kakikae
	mes ""+nitori_count+"秒以内に岩付城を画面外に!!"
}
if nitori_gizyutu_kakikae==10 {
	ValueWA=1
	WriteProcessMemory hGameWndProc,int(k-$116BB4+$58),ValueWA,4,0
	ValueWA=k-$116BB4
	WriteProcessMemory hGameWndProc,int(k-$AB3A8),ValueWA,4,0
	nitori_gizyutu_kakikae=0
}
 
 
;早苗の部隊の兵力が1000以下の時、兵力を+1000~5000。代償として、士気-10。
;変数変更・動作確認済み。
ReadProcessMemory hGameWndProc,int(k+$67E60-$40),sanae_syozai_Adr,4,0
ReadProcessMemory hGameWndProc,int(sanae_syozai_Adr),sanae_gennzaiti_Value,4,0;早苗の現在地を取得
if sanae_gennzaiti_Value==$D32FE0 {;早苗が出陣している
	ReadProcessMemory hGameWndProc,int(sanae_syozai_Adr+$28),sanae_heiryoku,4,0;早苗部隊の兵力。
	if sanae_heiryoku<=1000&&sanae_heiryoku==0 {
		rand_value=rnd(5)+1;1~5
		ValueWA=ValueWA+rand_value*1000;兵力を1000~5000補給。
		WriteProcessMemory hGameWndProc,int(sanae_syozai_Adr+$28),ValueWA,4,0
		;ValueWA=0;インチキ出来ないよう、傷兵0、と思ったが、別にいいかな?
		;WriteProcessMemory hGameWndProc,int(sanae_syozai_Adr+$2C),ValueWA,4,0
		ReadProcessMemory hGameWndProc,int(sanae_syozai_Adr+$48),ValueWA,4,0;代償として士気-10
		ValueWA=ValueWA-10
		WriteProcessMemory hGameWndProc,int(sanae_syozai_Adr+$48),ValueWA,4,0
	}
}
 
 
 
;【毎秒】神奈子が攻撃中の相手に、毎秒特定の打撃を与える。
;変数変更・動作確認済み。
ReadProcessMemory hGameWndProc,int(k+$63A90-$40),kanako_syozai_adr,4,0
ReadProcessMemory hGameWndProc,int(kanako_syozai_adr),kanako_syozai_adr_value,4,0;神奈子の現在地を調べる。
if kanako_syozai_adr_value==$D32FE0{;出陣中
	ReadProcessMemory hGameWndProc,int(kanako_syozai_adr+$10),kanako_kougeki,4,0
	ReadProcessMemory hGameWndProc,int(kanako_kougeki),kanako_kougeki_value,4,0
	if kanako_kougeki_value==$D32FE0||kanako_kougeki_value==$D30120 {;目標は敵部隊、もしくは拠点
		ReadProcessMemory hGameWndProc,int(kanako_kougeki+$28),kanako_write_A,4,0
		kanako_write_A=kanako_write_A-100
		ReadProcessMemory hGameWndProc,int(kanako_kougeki+$2C),kanako_write_B,4,0
		kanako_write_B=kanako_write_B+100
		if kanako_write_A<0 {
			kanako_write_B=kanako_write_B+kanako_write_A
			kanako_write_A=0
		}
		WriteProcessMemory hGameWndProc,int(kanako_kougeki+$28),kanako_write_A,4,0
		WriteProcessMemory hGameWndProc,int(kanako_kougeki+$2C),kanako_write_B,4,0
	}
	if kanako_kougeki_value==$D2FDC8 {;目標は敵施設。
		ReadProcessMemory hGameWndProc,int(kanako_kougeki+$C),kanako_write_A,4,0
		kanako_write_A=kanako_write_A-100
		if kanako_write_A<0 {
			kanako_write_A=0
		}
		WriteProcessMemory hGameWndProc,int(kanako_kougeki+$C),kanako_write_A,4,0
	}
}
 
  
;【毎秒・戦法発動後10秒持続】諏訪子の戦法が発動した瞬間のみ、備え系戦法効果時間を5倍にする。
;変数変更・動作確認済み。
suwako_tousi_pre=suwako_tousi_now
ReadProcessMemory hGameWndProc,int(k+$51DC0-$40),suwako_syozai_adr,4,0
ReadProcessMemory hGameWndProc,int(suwako_syozai_adr),suwako_syozai_adr_value,4,0
if suwako_syozai_adr_value==$D32FE0 {;出陣中
	ReadProcessMemory hGameWndProc,int(suwako_syozai_adr+$78),suwako_gunzei,4,0;Value=軍勢のポインタ。
	if suwako_gunzei==$0 {;諏訪子の部隊が単独である。
		ReadProcessMemory hGameWndProc,int(suwako_syozai_adr+$4C),suwako_tousi_now,4,0;部隊の闘志取得
	} else {;諏訪子の部隊が軍勢に含まれる。
		ReadProcessMemory hGameWndProc,int(suwako_gunzei+$4C),suwako_tousi_now,4,0;軍勢の闘志
	}
	if suwako_tousi_now<suwako_tousi_pre {;闘志の減少を確認。
		suwako_write=100
		WriteProcessMemory hGameWndProc,int($E90E08),suwako_write,4,0
		swako_sennpou_kyouka=1
		mes "書き込み実施"
	}
	if swako_sennpou_kyouka>=1&&swako_sennpou_kyouka<=9 {
		swako_sennpou_kyouka=swako_sennpou_kyouka+1
	}
	if swako_sennpou_kyouka>=10 {
		suwako_write=20
		WriteProcessMemory hGameWndProc,int($E90E08),suwako_write,4,0
		swako_sennpou_kyouka=0
	}
} else {;出陣中に非ず
	ReadProcessMemory hGameWndProc,int($E90E08),suwako_senpou_zizokuzikann,4,0
	if suwako_senpou_zizokuzikann>20 {
		suwako_write=20
		WriteProcessMemory hGameWndProc,int($E90E08),suwako_write,4,0;パラメータを元に戻す。
	}
	swako_sennpou_kyouka=0
}
 
return 0

インクルードファイル month.hsp

対応するregion、endregionプラグインが不足しています。対になるようプラグインを配置してください。
;ここは、ゲーム内の毎月2日に1回だけ呼ばれるサブルーチン。

stop

*main_system_month
;施設関係の能力
ReadProcessMemory hGameWndProc,int(k+$13220-$74),misutelia_gunndann,4,0;ミスチーの軍団
ReadProcessMemory hGameWndProc,int(k+$16C40-$74),udonge_gunndann,4,0;うどんげの軍団
ReadProcessMemory hGameWndProc,int(k+$3A9C0-$74),sizuha_gunndann,4,0;静葉の軍団
ReadProcessMemory hGameWndProc,int(k+$41640-$74),minoriko_gunndann,4,0;穣子の軍団
ReadProcessMemory hGameWndProc,int(k+$18D30-$74),momizi_gunndann,4,0;椛の軍団
ReadProcessMemory hGameWndProc,int(k+$749D0-$74),unzan_gunndann,4,0;雲山の軍団
ReadProcessMemory hGameWndProc,int(k+$71960-$74),nue_gunndann,4,0;ぬえの軍団
i=0
unzan_norosidai=0
nue_sisetu_ten_count=0
;ReadProcessMemory hGameWndProc,int(k+$91500-$180+$1C),adr_sisetu_top,4,0
;adr_sisetu_topが0の時がある。調査中。
mes adr_sisetu_top
repeat 10000
	ReadProcessMemory hGameWndProc,int(adr_sisetu_top+36*i),month_sisetu_adr_value,4,0
	if month_sisetu_adr_value==$D2FDC8 {;施設でなければ以下を実行しない。
		ReadProcessMemory hGameWndProc,int(adr_sisetu_top+36*i+4),month_sisetu_syurui,4,0
		ReadProcessMemory hGameWndProc,int(month_sisetu_syurui+4),month_sisetu_name,4,0
		ReadProcessMemory hGameWndProc,int(adr_sisetu_top+36*i+8),month_sisetu_matinami,4,0;所属町並
		ReadProcessMemory hGameWndProc,int(month_sisetu_matinami+4),month_sisetu_kyoten,4,0;町並みが所属する拠点
		ReadProcessMemory hGameWndProc,int(month_sisetu_kyoten+$108),month_sisetu_gundan,4,0;拠点が所属する軍団

		;季節ごと
		if now_month==3||now_month==6||now_month==9||now_month==12{
			if month_sisetu_name==$C98EBA95||month_sisetu_name==$EA8FB993{;施設が兵舎もしくは道場
    			if month_sisetu_gundan==udonge_gunndann {;うどんげの軍団が持つ兵舎・道場1つにつき兵士+300
    				ReadProcessMemory hGameWndProc,int(month_sisetu_kyoten+$28),udonge_write,4,0
    				udonge_write=udonge_write+300
		 	  			WriteProcessMemory hGameWndProc,int(month_sisetu_kyoten+$28),udonge_write,4,0
 	 	  		}
			}
			if month_sisetu_name==$738E||month_sisetu_name==$D98AA48F{;施設が市もしくは商館
 			  		if month_sisetu_gundan==misutelia_gunndann {;ミスチーの軍団が持つ金銭施設1つにつき金銭+500
   					ReadProcessMemory hGameWndProc,int(misutelia_gunndann+$48),misutelia_write,4,0
   					misutelia_write=misutelia_write+500
   					WriteProcessMemory hGameWndProc,int(misutelia_gunndann+$48),misutelia_write,4,0
   				}
			}
			if now_month==9 {;9月のみ発動。
				if month_sisetu_name==$A894 {;施設が畑
					if month_sisetu_gundan==minoriko_gunndann {;穣子の軍団に、畑1つにつき兵糧+500
	 	 	 			ReadProcessMemory hGameWndProc,int(minoriko_gunndann+$4C),minoriko_write,4,0
 			   			minoriko_write=minoriko_write+500
   			 			WriteProcessMemory hGameWndProc,int(minoriko_gunndann+$4C),minoriko_write,4,0
   			 		}
    				if month_sisetu_gundan==sizuha_gunndann {;静葉の畑は、1つにつき兵力+500
    					ReadProcessMemory hGameWndProc,int(month_sisetu_kyoten+$28),sizuha_write,4,0
    					sizuha_write=sizuha_write+500
    					WriteProcessMemory hGameWndProc,int(month_sisetu_kyoten+$28),sizuha_write,4,0
    				}
				}
				if month_sisetu_name==$63938590{;施設が水田
					if month_sisetu_gundan==minoriko_gunndann {;穣子の軍団に、水田1つにつき兵糧+2000
	   						ReadProcessMemory hGameWndProc,int(minoriko_gunndann+$4C),minoriko_write,4,0
	   						minoriko_write=minoriko_write+2000
    					WriteProcessMemory hGameWndProc,int(minoriko_gunndann+$4C),minoriko_write,4,0
					}
    				if month_sisetu_gundan==sizuha_gunndann {;静葉の水田は、1つにつき兵力+500
    					ReadProcessMemory hGameWndProc,int(month_sisetu_kyoten+$28),sizuha_write,4,0
    					sizuha_write=sizuha_write+500
    					WriteProcessMemory hGameWndProc,int(month_sisetu_kyoten+$28),sizuha_write,4,0
    				}
				}
			}
			if month_sisetu_name==$CC824594{;施設が忍の里
   				if month_sisetu_gundan==momizi_gunndann {
   					ReadProcessMemory hGameWndProc,int(month_sisetu_kyoten+$28),momizi_write,4,0;兵士+300
   					momizi_write=momizi_write+300
   					WriteProcessMemory hGameWndProc,int(month_sisetu_kyoten+$28),momizi_write,4,0
   					ReadProcessMemory hGameWndProc,int(momizi_gunndann+$48),momizi_write,4,0;金銭+500
   					momizi_write=momizi_write+500
   					WriteProcessMemory hGameWndProc,int(momizi_gunndann+$48),momizi_write,4,0
   					ReadProcessMemory hGameWndProc,int(momizi_gunndann+$4C),momizi_write,4,0;兵糧+500
   					momizi_write=momizi_write+500
   					WriteProcessMemory hGameWndProc,int(momizi_gunndann+$4C),momizi_write,4,0
   				}
			}
		}

		;1月のみ発動。
		if now_month==1 {
			if month_sisetu_name==$EF89B38B||month_sisetu_name==$C689F68C||month_sisetu_name==$BA8E8392||month_sisetu_name==$9B8E{;施設が教会、公家館、茶室、寺
				if month_sisetu_gundan==nue_gunndann{
					nue_sisetu_ten_count=nue_sisetu_ten_count+1
					if nue_sisetu_ten_count>=10 {;施設数が10ごとに、名声+1
						ReadProcessMemory hGameWndProc,int(nue_gunndann+$8),nue_seiryoku,4,0;勢力データ
						ReadProcessMemory hGameWndProc,int(nue_seiryoku+$D0),nue_write,4,0;名声値
						nue_write+1
						WriteProcessMemory hGameWndProc,int(nue_seiryoku+$D0),nue_write,4,0
						ReadProcessMemory hGameWndProc,int(nue_seiryoku+$D4),nue_write,4,0;名声値
						nue_write+1
						WriteProcessMemory hGameWndProc,int(nue_seiryoku+$D4),nue_write,4,0
						nue_sisetu_ten_count=0
					}
				}
			}

		}
		
		;毎月
		if month_sisetu_name==$8C895498 {;施設が狼煙台
   			if month_sisetu_gundan==unzan_gunndann {;雲山の軍団が所有。
    			unzan_norosidai=unzan_norosidai+1
   			}
		}
		i=i+1
	}	
   loop
 
;官位関係の能力(きもけーね)
if now_month==1 {;1月のみ発動
	ReadProcessMemory hGameWndProc,int(k+$8E2A0-$74),kimokeene_syozai_adr,4,0;きもけーねの軍団
	ReadProcessMemory hGameWndProc,int(kimokeene_syozai_adr+$8),kimokeene_seiryoku,4,0;きもけーねの勢力
	ReadProcessMemory hGameWndProc,int(kimokeene_seiryoku+$BC),kimokeene_daimyou,4,0;きもけーねの大名
	i=0
	kimokeene_kani_suu=0
	repeat 400
		kimokeene_kani_seiryoku=0;現在調査中の官位の勢力
		ReadProcessMemory hGameWndProc,int(k-$121780+i*60),kimokeene_kani_value,4,0
		if kimokeene_kani_value!=$D31DC8 : break ;官位でなければループ終わり
		ReadProcessMemory hGameWndProc,int(k-$121780+$30+i*60),kimokeene_kani_seiryoku_buf,4,0;官位の勢力
		if kimokeene_kani_seiryoku_buf!=0 {;家宝が授与されていない			
			kimokeene_kani_seiryoku=kimokeene_kani_seiryoku_buf;家宝の所有勢力
		} else {
			ReadProcessMemory hGameWndProc,int(k-$121780+$34+i*60),kimokeene_kani_zyuyosya,4,0;官位の授与者
			if kimokeene_kani_zyuyosya!=0 {;官位が授与済み
				if kimokeene_daimyou==kimokeene_kani_zyuyosya {;調査中の武将が大名ならば、この段階で等級+2
					ReadProcessMemory hGameWndProc,int(k-$121780+$38+i*60),kimokeene_write,4,0
					kimokeene_write=kimokeene_write+2
					WriteProcessMemory hGameWndProc,int(k-$121780+$38+i*60),kimokeene_write,4,0
				}
				ReadProcessMemory hGameWndProc,int(kimokeene_kani_zyuyosya+$144),kimokeene_kani_gundan,4,0;所有軍団
				ReadProcessMemory hGameWndProc,int(kimokeene_kani_gundan+$8),kimokeene_kani_seiryoku,4,0;所有勢力
			}
		}
		if kimokeene_seiryoku==kimokeene_kani_seiryoku {;所有勢力が一致
			kimokeene_kani_toukyuu.kimokeene_kani_suu=k-$121780+$38+i*60;配列に、等級のアドレスを入力する。
			kimokeene_kani_suu=kimokeene_kani_suu+1;勢力の総官位数を調べる
		}
		i=i+1
	loop
	kimokeene_rand=rnd(kimokeene_kani_suu)-1;ランダムに、0~官位数の乱数を作成
	if kimokeene_rand<0 : kimokeene_rand=0
	kimokeene_kani_select=kimokeene_kani_toukyuu.kimokeene_rand
	ReadProcessMemory hGameWndProc,int(kimokeene_kani_select),kimokeene_write,4,0;乱数が示す官位の等級を+2
	kimokeene_write=kimokeene_write+2
	WriteProcessMemory hGameWndProc,int(kimokeene_kani_select),kimokeene_write,4,0
}
  
;役職関係の能力(火焔猫燐)
if now_month==1 {
	ReadProcessMemory hGameWndProc,int(k+$F040-$74),rin_gundan,4,0;おりんの軍団
	ReadProcessMemory hGameWndProc,int(rin_gundan+$8),orin_seiryoku,4,0;おりんの勢力
	i=0
	orin_yakusyoku_suu=0
	repeat 400
		orin_yakusyoku_seiryoku=0;現在調査中の官位の勢力
		ReadProcessMemory hGameWndProc,int(adr_yakusyoku_top+i*64),rin_yakusyoku_value,4,0
		if rin_yakusyoku_value!=$D33600 : break ;役職でなければループ終わり
		ReadProcessMemory hGameWndProc,int(adr_yakusyoku_top+$28+i*64),rin_yakusyoku_seiryoku_buf,4,0;役職の勢力
		if rin_yakusyoku_seiryoku_buf!=0 {;役職が授与されていない			
			orin_yakusyoku_seiryoku=rin_yakusyoku_seiryoku_buf;役職の所有勢力
		} else {
			ReadProcessMemory hGameWndProc,int(adr_yakusyoku_top+$2C+i*64),rin_yakusyoku_zyuyosya,4,0;役職の授与者
			if rin_yakusyoku_zyuyosya!=0 {;役職が授与済み
				ReadProcessMemory hGameWndProc,int(rin_yakusyoku_zyuyosya+$144),rin_yakusyoku_gundan,4,0;所有軍団
				ReadProcessMemory hGameWndProc,int(rin_yakusyoku_gundan+$8),orin_yakusyoku_seiryoku,4,0;所有勢力
			}
		}
		if orin_seiryoku==orin_yakusyoku_seiryoku {;所有勢力が一致
			orin_yakusyoku_toukyuu.orin_yakusyoku_suu=adr_yakusyoku_top+$30+i*64;配列に、等級のアドレスを入力する。
			orin_yakusyoku_suu=orin_yakusyoku_suu+1;勢力の総役職数を調べる
		}
		i=i+1
	loop
	rin_rand=rnd(orin_yakusyoku_suu)-1;ランダムに、0~役職数の乱数を作成
	if rin_rand<0 : rin_rand=0
	rin_yakusyoku_serect=orin_yakusyoku_toukyuu.rin_rand
	ReadProcessMemory hGameWndProc,int(rin_yakusyoku_serect),rin_write,4,0;乱数が示す役職の等級を+2
	rin_write=rin_write+2
	WriteProcessMemory hGameWndProc,int(rin_yakusyoku_serect),rin_write,4,0
}
 
;家宝関係の能力(寅丸星)
;全ての家宝を調べ、星の勢力の持つ家宝、その等級のアドレス、そのなかでも一等級以上の数を算出。
ReadProcessMemory hGameWndProc,int(k+$26060-$74),syou_gundan,4,0;星の軍団
ReadProcessMemory hGameWndProc,int(syou_gundan+$8),syou_seiryoku,4,0;星の勢力
i=0
syou_kahou_suu=0
syou_ittoukyuu_kahou_suu=0
repeat 400
	syou_kahou_seiryoku=0
	ReadProcessMemory hGameWndProc,int(k-$128058+i*76),syou_kahou_value,4,0
	if syou_kahou_value!=$D31D7C : break ;家宝でなければループ終わり
	ReadProcessMemory hGameWndProc,int(k-$128058+$34+i*76),syou_kahou_seiryoku_buf,4,0;家宝の勢力
	if syou_kahou_seiryoku_buf!=0 {;家宝が授与されていない			
		syou_kahou_seiryoku=syou_kahou_seiryoku_buf;家宝の所有勢力
	} else {
		ReadProcessMemory hGameWndProc,int(k-$128058+$38+i*76),syou_kahou_zyuyosya,4,0;家宝の授与者
		if syou_kahou_zyuyosya!=0 {;家宝が授与済み
			ReadProcessMemory hGameWndProc,int(syou_kahou_zyuyosya+$144),syou_kahou_gundan,4,0;所有軍団
			ReadProcessMemory hGameWndProc,int(syou_kahou_gundan+$8),syou_kahou_seiryoku,4,0
		}
	}
	if syou_seiryoku==syou_kahou_seiryoku {;所有軍団が一致
		syou_kahou_toukyuu.syou_kahou_suu=k-$128058+$40+i*76;配列に、等級のアドレスを入力する。
		syou_kahou_suu=syou_kahou_suu+1;家宝数を調べる
		ReadProcessMemory hGameWndProc,int(k-$128058+$40+i*76),syou_kahou_toukyuu_buf,4,0
		if syou_kahou_toukyuu_buf>=10{
			syou_ittoukyuu_kahou_suu=syou_ittoukyuu_kahou_suu+1
		}
	}
	i=i+1
loop
if now_month==1 {
	syou_rand=rnd(syou_kahou_suu)-1;ランダムに、1~家宝数の乱数を作成
	if syou_rand<0 : syou_rand=0;家宝を一つも持っていない勢力の場合
	syou_kahou_select=syou_kahou_toukyuu.syou_rand
	ReadProcessMemory hGameWndProc,int(syou_kahou_select),syou_kahou_write,4,0;乱数が示す家宝の等級を+2
	syou_kahou_write=syou_kahou_write+2
	WriteProcessMemory hGameWndProc,int(syou_kahou_select),syou_kahou_write,4,0
}
mes "星一等級"+syou_ittoukyuu_kahou_suu+""

 
;全町並検索。
;十六夜咲夜の能力。毎月2日に、自軍団にいる紅魔館メンバーの数だけ民忠を回復。100を超える。
ReadProcessMemory hGameWndProc,int(k+$32DC0-$74),sakuya_gunndann,4,0
ReadProcessMemory hGameWndProc,int(k+$91500-$180+$C),sakuya_member,4,0
i=0
repeat 364;全国の町並みを調べ、そこが咲夜の軍団に所属するか調べる。
	sakuya_matinami_adr=k-$AE588+i*140;計算で出したアドレスと違う……?
	ReadProcessMemory hGameWndProc,int(sakuya_matinami_adr+$8),sakuya_matinami_kyoten,4,0;町並みの所属拠点
	ReadProcessMemory hGameWndProc,int(sakuya_matinami_kyoten+$108),sakuya_matinami_gundan,4,0;拠点の所属軍団
	if sakuya_matinami_gundan==sakuya_gunndann {
		ReadProcessMemory hGameWndProc,int(sakuya_matinami_adr+$3C),sakuya_write,4,0
		sakuya_write=sakuya_write+sakuya_member
		if sakuya_write>100 {
			sakuya_write=100
		}
		WriteProcessMemory hGameWndProc,int(sakuya_matinami_adr+$3C),sakuya_write,4,0
	}
	i=i+1
loop

 
;全部将検索
;ナズーリン・上白沢彗音・魅魔の能力で使用。
ReadProcessMemory hGameWndProc,int(k+$64630-$74),nazuurin_gunndan,4,0
ReadProcessMemory hGameWndProc,int(k+$65D70-$74),keene_gundan,4,0
ReadProcessMemory hGameWndProc,int(k+$49810-$74),mima_gundan,4,0
i=0
mima_ninzuu=0
keene_tiryaku_ninzuu=0
keene_seizi_ninzuu=0
repeat 2500
	ReadProcessMemory hGameWndProc,int(k-$1B8+i*496),busyou_value,4,0
	if busyou_value==$D2FDF4 {;武将データである。
		ReadProcessMemory hGameWndProc,int(k-$74+i*496),busyou_gundan,4,0;調査中武将の所属軍団
		;ナズーリンの能力。同じ所属軍団所属する、政治70以上の武将1人につき、毎月金銭+500。
		;官位や家宝による修正値は除く。
		if busyou_gundan==nazuurin_gunndan {;ナズーリンの軍団に所属
			ReadProcessMemory hGameWndProc,int(k+$C+i*496),busyou_seizi,4,0
			if busyou_seizi>=70{
				ReadProcessMemory hGameWndProc,int(busyou_gundan+$48),nazuurin_write,4,0
				nazuurin_write=nazuurin_write+500
				WriteProcessMemory hGameWndProc,int(busyou_gundan+$48),nazuurin_write,4,0
			}
		}
		if now_month==1 {;以下の能力は1月のみ発動。
			;上白沢彗音と同じ軍団で、知略70以下か、政治70以下の武将のリスト、人数を調べる。
			if busyou_gundan==keene_gundan{
				ReadProcessMemory hGameWndProc,int(k+$8+i*496),keene_tiryaku_buf,4,0
				if keene_tiryaku_buf<=70 {
					keine_tiryaku.keene_tiryaku_ninzuu=k+$8+i*496
					keene_tiryaku_ninzuu=keene_tiryaku_ninzuu+1
				}
				ReadProcessMemory hGameWndProc,int(k+$C+i*496),keene_seizi_buf,4,0
				if keene_seizi_buf<=70 {
					keine_seizi.keene_seizi_ninzuu=k+$C+i*496
					keene_seizi_ninzuu=keene_seizi_ninzuu+1
				}
			}
			;まず、魅魔と同じ軍団で、鉄砲適正値がA以下の武将のリストと、その武将の人数を取得。
			if busyou_gundan==mima_gundan {;魅魔と同軍団
				ReadProcessMemory hGameWndProc,int(k-$5C+i*496),mima_tekisei_buf,4,0
				if mima_tekisei_buf<=3{
					mima_teppou_tekisei.mima_ninzuu=k-$5C+i*496;実際は、鉄砲適正値のアドレスのリスト。
					mima_ninzuu=mima_ninzuu+1;該当人数を数える。
				}
			}
		}
	} else {
		break
	}
	i=i+1
loop
if now_month==1{
	;毎月1月初め、魅魔と同軍団にいる武将誰か一人の鉄砲適正値をSにする。すでにSの者は除外。
	if mima_ninzuu!=0 {
		mima_rand=rnd(mima_ninzuu);だれの適正値を書き換えるかをランダムで決定。
		mima_write=4
		WriteProcessMemory hGameWndProc,int(mima_teppou_tekisei.mima_rand),mima_write,4,0
	}
	;毎月1月初め、上白沢彗音と同軍団にいる、知略70以下の武将を一人選び、知略+1。
	;家宝や官位による修正値は除く。
	if keene_tiryaku_ninzuu!=0{
		keene_rand=rnd(keene_tiryaku_ninzuu)
		ReadProcessMemory hGameWndProc,int(keine_tiryaku.keene_rand),keene_write,4,0
		keene_write=keene_write+1
		WriteProcessMemory hGameWndProc,int(keine_tiryaku.keene_rand),keene_write,4,0
	}
	;毎月1月初め、上白沢彗音と同軍団にいる、政治70以下の武将を一人選び、政治+1。
	;家宝や官位による修正値は除く。
	if keene_seizi_ninzuu!=0 {
		keene_rand=rnd(keene_seizi_ninzuu)
		ReadProcessMemory hGameWndProc,int(keine_seizi.keene_rand),keene_write,4,0
		keene_write=keene_write+1
		WriteProcessMemory hGameWndProc,int(keine_seizi.keene_rand),keene_write,4,0
	}
}
 	
return 0




コメント欄

  • 修正してくれた方、ありがとうございました! -- tamura (2010-01-16 23:24:54)
  • メインのソースコードをUPしました。 -- tamura (2010-03-01 14:22:55)
名前:
コメント: