Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- --[[
- Castlevania Harmony of Dissonance
- Showing Judgement of enemies/weapons/player Script
- Created by Robert_Ordis
- 自機座標、
- 自機のスピード、
- 自機ダメージ判定、
- 自機攻撃判定、
- グリッド、
- 敵機のダメージ判定
- 敵機の攻撃判定
- HP持ちの敵機の無敵時間を2つとHP
- を表示します。
- ---更新履歴---
- Created in 2012/09/11(TUE) ver 0.01
- ->作成。敵機の攻撃判定は無し
- Updated in 2012/09/12(WED) ver.0.02
- ->敵機攻撃判定実装。
- Updated in 2012/09/12(WED) ver.0.03
- ->自機の被ダメージ/接触判定の表示見直し。壁との接触判定との区別をつけるようにした。
- Updated in 2012/09/13(THU) ver.0.035
- ->スプライト?の判定表示方法を変更。グリッドに座標の値をつけるようにした。
- Updated in 2012/09/13(WED) ver.0.04
- ->自機被接触判定と敵機の攻撃/接触判定とのすり合わせ終わり。
- ->敵の無敵時間表示の機能を付けた。最大2つまでであり、3種類の攻撃を
- 前2つの無敵時間が終わらないうちに当てると最後の3つ目は無敵時間が続く限り連続ヒットする。
- これが連続ヒットバグの正体である。
- ちなみに、なぜだか知らないが地上の基本攻撃と空中の基本攻撃は別攻撃扱いらしい。…なぜ。
- ]]--
- while (true) do
- if(movie.active()==true) then
- --カメラのXとYを読み込んでグリッド表示
- CameraX=memory.readwordsigned(0x03072b2c)
- CameraY=memory.readwordsigned(0x03072B2E)
- gridx=memory.readbyte(0x03072b2C)%16
- gridy=memory.readbyte(0x03072B2E)%16
- for line=0,255,16 do
- gui.text(line-gridx,153,CameraX-gridx+line)
- gui.text(0,line-gridy-3,CameraY-gridy+line)
- gui.line(0,line-gridy,255,line-gridy,0x00FFFF88)
- gui.line(line-gridx,0,line-gridx,255,0x00FFFF88)
- gui.line(0,line-gridy+8,255,line-gridy+8,0x00FFFF33)
- gui.line(line-gridx+8,0,line-gridx+8,255,0x00FFFF33)
- end
- --自機の各種ステータス
- --自機のHPを読み込みます。最大HPもついでです。
- currentHP=memory.readword(0x0201854E)
- MaxHP=memory.readword(0x02018786)
- --自機のMPを読み込みます。最大MPもついでです。
- currentMP=memory.readword(0x02018550)
- MaxMP=memory.readword(0x02018788)
- --自機のハート数を表示します。最大数もついでです。
- currentHeart=memory.readword(0x02018794)
- MaxHeart=memory.readword(0x0201878A)
- --自機の向き
- RightLeft=memory.readbyte(0x02000478) --0x40以上がLeft
- --自機のスピードを表示。
- myspeedx=memory.readwordsigned(0x0200046A)
- myspeedy=memory.readwordsigned(0x0200046E)
- myspeeddotx=(memory.readword(0x02000468))/65536
- myspeeddoty=(memory.readword(0x0200046C))/65536
- --自機の基本攻撃判定の元
- mt1=memory.readbytesigned(0x03001A28)
- mt2=memory.readbytesigned(0x03001A29)
- mt3=memory.readbytesigned(0x03001A2A)
- mt4=memory.readbytesigned(0x03001A2B)
- --自機の壁、被ダメージ判定の元
- MyJudgeLeftEdge=memory.readwordsigned(0x03001A20)
- MyJudgeRightEdge=memory.readwordsigned(0x03001A24)
- MyJudgeUpEdge=memory.readwordsigned(0x03001A22)
- MyJudgeDownEdge=memory.readwordsigned(0x03001A26)
- --HP表示のための整列用変数
- j=0
- k=0
- --敵・・・のつもりだったんだけど各種スプライト?オブジェクト?の意味が強くなりました。
- for i=10,247,1 do
- --+78→左右どっちを向いている?
- --03001A20+0x00000008*(ObjNumber+1)でとりあえずは当たり判定の位置が求められるか
- ObjNumber=memory.readbyte(0x02000028+(i*0x00000080))
- --if(ObjNumber>0) then
- --敵の無敵時間
- eneInvis1=memory.readbytesigned(0x0200008E+i*0x00000080)
- eneInvis2=memory.readbytesigned(0x0200008F+i*0x00000080)
- --画面上の座標を求めます。
- enedispx=memory.readwordsigned(0x02000062+(i*0x00000080))
- enedispsubx=memory.readword(0x02000060+(i*0x00000080))/65536
- enedispsuby=memory.readword(0x02000060+4+(i*0x00000080))/65536
- enedispy=memory.readwordsigned(0x02000062+4+(i*0x00000080))
- --残りHPです。
- enehp=memory.readwordsigned(0x02000054+(i*0x00000080))
- --攻撃できるかとかの判定があればいいなって。
- ifAtackable=memory.readbytesigned(0x02000022+(i*0x00000080))
- ifdefeatable=0
- --敵機の攻撃判定です。自分で発射したサブウェポンの攻撃判定も表示できます。
- eneAJudgeStartX=memory.readbytesigned(0x030019E8+i*0x00000008)
- eneAJudgeStartY=memory.readbytesigned(0x030019E9+i*0x00000008)
- eneAJudgeRangeX=memory.readbytesigned(0x030019EA+i*0x00000008)
- eneAJudgeRangeY=memory.readbytesigned(0x030019EB+i*0x00000008)
- --敵機の被ダメージ判定です。
- eneJudgeStartX=memory.readbytesigned(0x030019EC+i*0x00000008)
- eneJudgeStartY=memory.readbytesigned(0x030019ED+i*0x00000008)
- eneJudgeRangeX=memory.readbytesigned(0x030019EE+i*0x00000008)
- eneJudgeRangeY=memory.readbytesigned(0x030019EF+i*0x00000008)
- --オブジェクト?のアドレスから特定できるのが一番よかったんだけどなぁ…
- --[[
- eneAJudgeStartX=memory.readbytesigned(0x03001A20+0x00000008*(ObjNumber+1)+0)
- eneAJudgeStartY=memory.readbytesigned(0x03001A20+0x00000008*(ObjNumber+1)+1)
- eneAJudgeRangeX=memory.readbytesigned(0x03001A20+0x00000008*(ObjNumber+1)+2)
- eneAJudgeRangeY=memory.readbytesigned(0x03001A20+0x00000008*(ObjNumber+1)+3)
- eneJudgeStartX=memory.readbytesigned(0x03001A20+0x00000008*(ObjNumber+1)+4)
- eneJudgeStartY=memory.readbytesigned(0x03001A20+0x00000008*(ObjNumber+1)+5)
- eneJudgeRangeX=memory.readbytesigned(0x03001A20+0x00000008*(ObjNumber+1)+6)
- eneJudgeRangeY=memory.readbytesigned(0x03001A20+0x00000008*(ObjNumber+1)+7)
- ]]--
- --gui.text(enedispx,enedispy,"Address\n" .. string.format("0x%08x\n0x%08x\n%x",0x02000000+i*0x00000080,0x030019E8+i*0x00000008,ObjNumber))
- --gui.text(enedispx,enedispy,string.format("%d",ObjNumber))
- --例によって右か左かで処理が変わります。
- eneRightLeft=memory.readbyte(0x02000078+(i*0x00000080))
- if(eneRightLeft<0x40) then
- --被ダメージ判定を四角形で表示したいのでその四隅を作る
- eneAJudgeX1=enedispx+eneAJudgeStartX-1
- eneAJudgeX2=eneAJudgeX1+eneAJudgeRangeX
- eneAJudgeY1=enedispy+eneAJudgeStartY
- eneAJudgeY2=eneAJudgeY1+eneAJudgeRangeY
- --攻撃判定を四角形で表示したいのでその四隅を作る
- eneJudgeX1=enedispx+eneJudgeStartX-1
- eneJudgeX2=eneJudgeX1+eneJudgeRangeX
- eneJudgeY1=enedispy+eneJudgeStartY
- eneJudgeY2=eneJudgeY1+eneJudgeRangeY
- gui.fillbox(eneJudgeX1+1,eneJudgeY1+1,eneJudgeX2-1,eneJudgeY2-1,0xff000066)
- gui.box(eneJudgeX1+1,eneJudgeY1+1,eneJudgeX2-1,eneJudgeY2-1,0xff0000aa)
- else
- --↑と同じ
- eneAJudgeX1=enedispx-eneAJudgeStartX
- eneAJudgeX2=eneAJudgeX1-eneAJudgeRangeX
- eneAJudgeY1=enedispy+eneAJudgeStartY
- eneAJudgeY2=eneAJudgeY1+eneAJudgeRangeY
- eneJudgeX1=enedispx-eneJudgeStartX
- eneJudgeX2=eneJudgeX1-eneJudgeRangeX
- eneJudgeY1=enedispy+eneJudgeStartY
- eneJudgeY2=eneJudgeY1+eneJudgeRangeY
- --gui.text(eneJudgeX1,eneJudgeY1,"R")
- --gui.text(eneJudgeX2,eneJudgeY1,"L")
- gui.fillbox(eneJudgeX1-1,eneJudgeY1+1,eneJudgeX2+1,eneJudgeY2-1,0xff000066)
- gui.box(eneJudgeX1-1,eneJudgeY1+1,eneJudgeX2+1,eneJudgeY2-1,0xff0000aa)
- end
- gui.fillbox(eneAJudgeX1,eneAJudgeY1,eneAJudgeX2,eneAJudgeY2,0x00ff0044)
- gui.box(eneAJudgeX1,eneAJudgeY1,eneAJudgeX2,eneAJudgeY2,0x00ff00aa)
- --敵機の被ダメージ判定や攻撃判定を表示してみるテスト。
- --半透明のfillboxの外にもうちょっと色の濃いboxで縁どりするイメージ
- if(ifAtackable-ifAtackable%8<=0) then
- --この判定が出来上がったらここに判定描画を入れる
- end
- if( enehp>0 ) then
- if( j>16 ) then
- k=k+1
- end
- --HPが残っている敵機がいたら順次表示します。
- gui.text(30+k*48,16+j*8,string.format("%d,%d,%d",enehp,eneInvis1,eneInvis2))
- --gui.text(enedispx,enedispy,enehp,0x00ffffff)
- j=j+1
- end
- --gui.box(enedispx,enedispy,enedispx+16,enedispy+16,0xff00ffff)
- --end
- end
- --自機の情報開示。
- --右向きか左向きかで処理は変わりますよっと
- if( RightLeft>=64 ) then
- --左向き
- --自機のダメージ判定を白枠で表示します。
- gui.box(MyJudgeRightEdge-1,MyJudgeUpEdge+1,MyJudgeLeftEdge,MyJudgeDownEdge,0xffffffff)
- --自機の壁との接触判定をピンク枠で表示します。
- gui.box(MyJudgeRightEdge-1,MyJudgeUpEdge+3,MyJudgeLeftEdge+2,MyJudgeDownEdge,0xff00ffff)
- --自機の基本攻撃判定を緑枠で表示します。
- hanteir=MyJudgeRightEdge-mt1-6-1
- hanteiu=MyJudgeDownEdge+(mt2)+1
- hanteil=hanteir-mt3+1
- hanteid=hanteiu+(mt4)-1
- gui.box(hanteil-1,hanteiu-1,hanteir+1,hanteid+1,0x00ff00ff)
- else
- --右向き
- --以下左向きと同じ
- gui.box(MyJudgeLeftEdge,MyJudgeUpEdge+1,MyJudgeRightEdge-1,MyJudgeDownEdge,0xffffffff)
- gui.box(MyJudgeLeftEdge+2,MyJudgeUpEdge+3,MyJudgeRightEdge-1,MyJudgeDownEdge,0xff00ffff)
- hanteil=MyJudgeLeftEdge+mt1+6
- hanteiu=MyJudgeDownEdge+(mt2)+1
- hanteir=hanteil+mt3-1
- hanteid=hanteiu+(mt4)-1
- gui.box(hanteil-1,hanteiu-1,hanteir+1,hanteid+1,0x00ff00ff)
- end
- gui.text(16,0,"X Speed:" .. myspeedx+myspeeddotx)
- gui.text(16,8,"Y Speed:" .. myspeedy+myspeeddoty)
- gui.text(110,0,"HP : " .. currentHP .. "/" .. MaxHP)
- gui.text(110,8,"MP : " .. currentMP .. "/" .. MaxMP)
- gui.text(110,16,"Heart: " .. currentHeart .. "/" .. MaxHeart)
- --フレーム等の情報も自分で開いちゃいました。
- if (vba.lagged()==true) then
- gui.text(22,138,"Frames:" .. vba.framecount() .. ":*" .. vba.lagcount(),0xff0000ff)
- else
- gui.text(22,138,"Frames:" .. vba.framecount() .. ":" .. vba.lagcount())
- end
- else
- --ムービーがロードされていないとこうです。
- gui.fillbox(0,0,500,500,0x00000088)
- gui.text(50,50,"Movie is NOT ACTIVE!!")
- end
- vba.frameadvance()
- end
- --[[
- 現行の問題点
- ・本来攻撃判定を持たない物(燭台)にも攻撃判定が灯っている。:原因として、判定処理の掃除を全くしていないからか
- ・当たり判定が表示されない?敵もいる(スカルナイトロード):別のアドレスに当たり判定がある可能性??
- ------------------------------------------------------------------
- 今後の予定
- ・一個の攻撃に対して敵機の無敵時間があるか、あればどこかの調査。:GoLみたいな多段ヒットの仕組みに起因する可能性も…?まさかね
- ・撃破/攻撃可能かどうかの判定を行うものがあれば…。 :それがあれば多分上記の一段目の問題にもふたをできる…?
- ]]--
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement