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