View difference between Paste ID: sL4dD6N6 and MBNk9Gip
SHOW: | | - or go back to the newest paste.
1
--[[
2
Castlevania Harmony of Dissonance
3
Showing Judgement of enemies/weapons/player Script
4
Created by Robert_Ordis
5
6
実演動画
7
https://docs.google.com/file/d/0B6HA1btZX_0abDF4TVJsb0huUGs/edit
8
9
自機座標、
10
自機のスピード、
11
自機ダメージ判定、
12
自機攻撃判定、
13
グリッド、
14
敵機のダメージ判定
15
敵機の攻撃判定
16
を表示します。
17
18
---更新履歴---
19
Created in 2012/09/11(TUE) ver 0.01
20
->作成。敵機の攻撃判定は無し
21
Updated in 2012/09/12(WED) ver.0.02
22
->敵機攻撃判定実装。
23
Updated in 2012/09/12(WED) ver.0.03
24
->自機の被ダメージ/接触判定の表示見直し。壁との接触判定との区別をつけるようにした。
25
Updated in 2012/09/13(THU) ver.0.035
26
->スプライト?の判定表示方法を変更。グリッドに座標の値をつけるようにした。
27
28
]]--
29
30
while (true) do
31-
			gui.line(0,line-gridy,255,line-gridy,0x00FFFF55)
31+
32-
			gui.line(line-gridx,0,line-gridx,255,0x00FFFF55)
32+
33
		--カメラのXとYを読み込んでグリッド表示
34
		CameraX=memory.readwordsigned(0x03072b2c)
35
		CameraY=memory.readwordsigned(0x03072B2E)
36
		gridx=memory.readbyte(0x03072b2C)%16
37
		gridy=memory.readbyte(0x03072B2E)%16
38
		for line=0,255,16 do
39
			gui.text(line-gridx,153,CameraX-gridx+line)
40
			gui.text(0,line-gridy-3,CameraY-gridy+line)
41
			gui.line(0,line-gridy,255,line-gridy,0x00FFFF88)
42
			gui.line(line-gridx,0,line-gridx,255,0x00FFFF88)
43
			gui.line(0,line-gridy+8,255,line-gridy+8,0x00FFFF33)
44
			gui.line(line-gridx+8,0,line-gridx+8,255,0x00FFFF33)
45
		end
46
47
		--自機の各種ステータス
48
49
		--自機のHPを読み込みます。最大HPもついでです。
50
		currentHP=memory.readword(0x0201854E)
51
		MaxHP=memory.readword(0x02018786)
52
53
		--自機のMPを読み込みます。最大MPもついでです。
54
		currentMP=memory.readword(0x02018550)
55
		MaxMP=memory.readword(0x02018788)
56
57
		--自機のハート数を表示します。最大数もついでです。
58
		currentHeart=memory.readword(0x02018794)
59
		MaxHeart=memory.readword(0x0201878A)
60
61
		--自機の向き
62
		RightLeft=memory.readbyte(0x02000478) --0x40以上がLeft
63
64
		--自機のスピードを表示。
65
		myspeedx=memory.readwordsigned(0x0200046A)
66
		myspeedy=memory.readwordsigned(0x0200046E)
67
		myspeeddotx=(memory.readword(0x02000468))/65536
68
		myspeeddoty=(memory.readword(0x0200046C))/65536
69
70
		--自機の基本攻撃判定の元
71
		mt1=memory.readbytesigned(0x03001A28)
72
		mt2=memory.readbytesigned(0x03001A29)
73
		mt3=memory.readbytesigned(0x03001A2A)
74
		mt4=memory.readbytesigned(0x03001A2B)
75
76
		--自機の壁、被ダメージ判定の元
77
		MyJudgeLeftEdge=memory.readwordsigned(0x03001A20)
78
		MyJudgeRightEdge=memory.readwordsigned(0x03001A24)
79
		MyJudgeUpEdge=memory.readwordsigned(0x03001A22)
80
		MyJudgeDownEdge=memory.readwordsigned(0x03001A26)
81
82
		--右向きか左向きかで処理は変わりますよっと
83
		if( RightLeft>=64 ) then
84
			--左向き
85
			--自機のダメージ判定を白枠で表示します。
86
			gui.box(MyJudgeRightEdge-1,MyJudgeUpEdge,MyJudgeLeftEdge,MyJudgeDownEdge,0xffffffff)
87
			--自機の壁との接触判定をピンク枠で表示します。
88
			gui.box(MyJudgeRightEdge-1,MyJudgeUpEdge+3,MyJudgeLeftEdge+2,MyJudgeDownEdge,0xff00ffff)
89
90
			--自機の基本攻撃判定を緑枠で表示します。
91
			hanteir=MyJudgeRightEdge-mt1-6-1
92
			hanteiu=MyJudgeDownEdge+(mt2)+1
93
			hanteil=hanteir-mt3+1
94
			hanteid=hanteiu+(mt4)-1
95
96
			gui.box(hanteil,hanteiu,hanteir,hanteid,0x00ff00ff)
97
     
98
		else
99
			--右向き
100
			--以下左向きと同じ
101
			gui.box(MyJudgeLeftEdge,MyJudgeUpEdge,MyJudgeRightEdge-1,MyJudgeDownEdge,0xffffffff)
102
			gui.box(MyJudgeLeftEdge+2,MyJudgeUpEdge+3,MyJudgeRightEdge-1,MyJudgeDownEdge,0xff00ffff)
103
104
			hanteil=MyJudgeLeftEdge+mt1+6
105
			hanteiu=MyJudgeDownEdge+(mt2)+1
106
			hanteir=hanteil+mt3-1
107
			hanteid=hanteiu+(mt4)-1
108
			gui.box(hanteil,hanteiu,hanteir,hanteid,0x00ff00ff)
109
		end
110
111
		--HP表示のための整列用変数
112
		j=0
113
		k=0
114
		--敵・・・のつもりだったんだけど各種スプライト?オブジェクト?の意味が強くなりました。
115
		for i=10,247,1 do
116
			--+78→左右どっちを向いている?
117
			--03001A20+0x00000008*(ObjNumber+1)でとりあえずは当たり判定の位置が求められるか
118
			ObjNumber=memory.readbyte(0x02000028+(i*0x00000080))
119
			if(ObjNumber>0) then
120
121
				--画面上の座標を求めます。
122
				enedispx=memory.readwordsigned(0x02000062+(i*0x00000080))
123
				enedispsubx=memory.readword(0x02000060+(i*0x00000080))/65536
124
				enedispsuby=memory.readword(0x02000060+4+(i*0x00000080))/65536
125
				enedispy=memory.readwordsigned(0x02000062+4+(i*0x00000080))
126
127
				--残りHPです。
128
				enehp=memory.readwordsigned(0x02000054+(i*0x00000080))
129
				--攻撃できるかとかの判定があればいいなって。
130
				ifAtackable=memory.readbytesigned(0x02000022+(i*0x00000080))
131
				ifdefeatable=0
132
133
				--敵機の攻撃判定です。自分で発射したサブウェポンの攻撃判定も表示できます。 
134
				eneAJudgeStartX=memory.readbytesigned(0x030019E8+i*0x00000008)
135
				eneAJudgeStartY=memory.readbytesigned(0x030019E9+i*0x00000008)
136
				eneAJudgeRangeX=memory.readbytesigned(0x030019EA+i*0x00000008)
137
				eneAJudgeRangeY=memory.readbytesigned(0x030019EB+i*0x00000008)
138
139
				--敵機の被ダメージ判定です。
140
				eneJudgeStartX=memory.readbytesigned(0x030019EC+i*0x00000008)
141
				eneJudgeStartY=memory.readbytesigned(0x030019ED+i*0x00000008)
142
				eneJudgeRangeX=memory.readbytesigned(0x030019EE+i*0x00000008)
143
				eneJudgeRangeY=memory.readbytesigned(0x030019EF+i*0x00000008)
144
145
				--オブジェクト?のアドレスから特定できるのが一番よかったんだけどなぁ…
146
				--[[
147
				eneAJudgeStartX=memory.readbytesigned(0x03001A20+0x00000008*(ObjNumber+1)+0)
148
				eneAJudgeStartY=memory.readbytesigned(0x03001A20+0x00000008*(ObjNumber+1)+1)
149
				eneAJudgeRangeX=memory.readbytesigned(0x03001A20+0x00000008*(ObjNumber+1)+2)
150
				eneAJudgeRangeY=memory.readbytesigned(0x03001A20+0x00000008*(ObjNumber+1)+3)
151
152
				eneJudgeStartX=memory.readbytesigned(0x03001A20+0x00000008*(ObjNumber+1)+4)
153
				eneJudgeStartY=memory.readbytesigned(0x03001A20+0x00000008*(ObjNumber+1)+5)
154
				eneJudgeRangeX=memory.readbytesigned(0x03001A20+0x00000008*(ObjNumber+1)+6)
155
				eneJudgeRangeY=memory.readbytesigned(0x03001A20+0x00000008*(ObjNumber+1)+7)
156
				]]--
157
158
				--例によって右か左かで処理が変わります。
159
				eneRightLeft=memory.readbyte(0x02000078+(i*0x00000080))                        
160
 
161
				if(eneRightLeft<0x40) then
162
163
					--被ダメージ判定を四角形で表示したいのでその四隅を作る
164
					eneAJudgeX1=enedispx+eneAJudgeStartX-1
165
					eneAJudgeX2=eneAJudgeX1+eneAJudgeRangeX
166
					eneAJudgeY1=enedispy+eneAJudgeStartY
167
					eneAJudgeY2=eneAJudgeY1+eneAJudgeRangeY
168
169
					--攻撃判定を四角形で表示したいのでその四隅を作る
170
					eneJudgeX1=enedispx+eneJudgeStartX-1
171
					eneJudgeX2=eneJudgeX1+eneJudgeRangeX
172
					eneJudgeY1=enedispy+eneJudgeStartY
173
					eneJudgeY2=eneJudgeY1+eneJudgeRangeY
174
				else
175
					--↑と同じ
176
					eneAJudgeX1=enedispx-eneAJudgeStartX
177
					eneAJudgeX2=eneAJudgeX1-eneAJudgeRangeX
178
					eneAJudgeY1=enedispy+eneAJudgeStartY
179
					eneAJudgeY2=eneAJudgeY1+eneAJudgeRangeY
180
181
					eneJudgeX1=enedispx-eneJudgeStartX
182
					eneJudgeX2=eneJudgeX1-eneJudgeRangeX
183
					eneJudgeY1=enedispy+eneJudgeStartY
184
					eneJudgeY2=eneJudgeY1+eneJudgeRangeY
185
				end
186
187
				--敵機の被ダメージ判定や攻撃判定を表示してみるテスト。
188
				--半透明のfillboxの外にもうちょっと色の濃いboxで縁どりするイメージ
189
				gui.fillbox(eneJudgeX1,eneJudgeY1,eneJudgeX2,eneJudgeY2,0xff000066)
190
				gui.fillbox(eneAJudgeX1,eneAJudgeY1,eneAJudgeX2,eneAJudgeY2,0x00ff0044)
191
				gui.box(eneJudgeX1,eneJudgeY1,eneJudgeX2,eneJudgeY2,0xff0000aa)
192
				gui.box(eneAJudgeX1,eneAJudgeY1,eneAJudgeX2,eneAJudgeY2,0x00ff00aa)
193
194
				if(ifAtackable-ifAtackable%8<=0) then
195
					--この判定が出来上がったらここに判定描画を入れる
196
				end
197
				--わからないことがあったらここを解禁してアドレスをたどります。
198
				--gui.text(enedispx,enedispy,"Address\n" .. string.format("0x%08x\n0x%08x\n%x",0x02000000+i*0x00000080,0x030019E8+i*0x00000008,ObjNumber))
199
				--gui.text(enedispx,enedispy,string.format("%d",ObjNumber))
200
 
201
				if( enehp>0 ) then
202
                                           
203
					if( j>16 ) then
204-
		gui.text(8,0,"X Speed:" .. myspeedx+myspeeddotx)
204+
205-
		gui.text(8,8,"Y Speed:" .. myspeedy+myspeeddoty)
205+
206
					--HPが残っている敵機がいたら順次表示します。
207
					gui.text(30+k*48,16+j*8,enehp)
208
					--gui.text(enedispx,enedispy,enehp,0x00ffffff)
209
					j=j+1
210
				end
211-
			gui.text(5,125,"Frames:" .. vba.framecount() .. ":*" .. vba.lagcount(),0xff0000ff)
211+
212
			end
213-
			gui.text(5,125,"Frames:" .. vba.framecount() .. ":" .. vba.lagcount())
213+
214
		--自機の情報開示。
215
		gui.text(16,0,"X Speed:" .. myspeedx+myspeeddotx)
216
		gui.text(16,8,"Y Speed:" .. myspeedy+myspeeddoty)
217
		gui.text(110,0,"HP   : " .. currentHP .. "/" .. MaxHP)
218
		gui.text(110,8,"MP   : " .. currentMP .. "/" .. MaxMP)
219
		gui.text(110,16,"Heart: " .. currentHeart .. "/" .. MaxHeart)
220
		--フレーム等の情報も自分で開いちゃいました。
221
		if (vba.lagged()==true) then
222
			gui.text(22,138,"Frames:" .. vba.framecount() .. ":*" .. vba.lagcount(),0xff0000ff)
223
		else
224
			gui.text(22,138,"Frames:" .. vba.framecount() .. ":" .. vba.lagcount())
225
		end
226
	else
227
		--ムービーがロードされていないとこうです。
228
		gui.fillbox(0,0,500,500,0x00000088)
229
		gui.text(50,50,"Movie is NOT ACTIVE!!")
230
	end
231
	vba.frameadvance()
232
end
233
     
234
--[[
235
現行の問題点
236
・本来攻撃判定を持たない物(燭台)にも攻撃判定が灯っている。:原因として、判定処理の掃除を全くしていないからか
237
・当たり判定が表示されない?敵もいる(スカルナイトロード):別のアドレスに当たり判定がある可能性??
238
     
239
------------------------------------------------------------------
240
     
241
今後の予定
242
・一個の攻撃に対して敵機の無敵時間があるか、あればどこかの調査。:GoLみたいな多段ヒットの仕組みに起因する可能性も…?まさかね
243
・撃破/攻撃可能かどうかの判定を行うものがあれば…。		:それがあれば多分上記の一段目の問題にもふたをできる…?
244
     
245
]]--