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 | ]]-- |