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
- を表示します。
- 「白夜の協奏曲TASをやるならこれを標準装備としよう」となることを目標に作成しましたが、
- ちょっとごちゃごちゃしすぎたのかもしれません。
- ---更新履歴---
- Created date was forgotten ver 0.001
- ->グリッドと敵の画面上座標、自機の各種情報及び攻撃判定もどきを表示。多分2年とちょっとぐらい前に作成。
- ただし、Aria of Sorrowのものにうっかり上書きしてしまったためにコードの大半は失われることに。
- Created in 2012/09/11(TUE) ver 0.01
- ->やる気を起こしてとりあえず2年前の物とある程度同じになるよう復元。敵機の攻撃判定はまだ無し。
- 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(THU) ver 0.04
- ->敵の無敵時間表示の機能を付けた。最大2つまでであり、3種類の攻撃を
- 前2つの無敵時間が終わらないうちに当てると最後の3つ目は無敵時間が続く限り連続ヒットする。
- これが連続ヒットバグの正体である。
- ちなみに、なぜだか知らないが地上の基本攻撃と空中の基本攻撃は別攻撃扱いらしい。…なぜ。
- Updated in 2012/09/14(FRI) ver 0.1
- ->とりあえず実践で使える出来になったのでRC版とします。
- ->不要な判定は表示しない仕組みの実装。例えばハートに対して攻撃受理判定とかろうそくに対して攻撃/接触判定とか。
- 同時に、被接触判定において、「攻撃を素直に受ける場合」は赤で、「攻撃をはじく場合」は青で表示するようにした。
- ->これでもまだちょっとだけ不満はあったりするので解決策を見つけ次第何とかする予定です。
- でもこれで一応満足するだけの出来にはなりましたので、このスクリプトの開発は一段落したものとします。
- Updated in 2012/09/14(FRI) ver 0.15
- ->スプライトの当たり判定の範囲を示す数値の扱いが符号ありだったのを符号なしに変更。
- これにより、ドラキュラファントム2のゲロビの攻撃/接触判定が表示されるように。
- ->不要な敵のHP表示を抑えた。
- Updated in 2012/09/14(FRI) ver 0.16
- ->マイナーアップデート。持ってるサブウェポンとあと何回使えるかの表示を追加。
- スペースの都合上、ステラソード投げはShurikenと表記しました。
- ]]--
- while (true) do
- --カメラのXとYを読み込んでグリッド表示
- --どっちでもいいんだろうけど今回はgocha先生が特定したアドレスを使わせてもらいました。
- --CameraX=memory.readwordsigned(0x03072B2C)
- --CameraY=memory.readwordsigned(0x03072B2E)
- CameraX=memory.readwordsigned(0x0200A446)
- CameraY=memory.readwordsigned(0x0200A44A)
- gridx=CameraX%16
- gridy=CameraY%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)
- --自機のサブウェポンを読み取ります。
- currentSubWeapon=memory.readbyte(0x0201877E)
- --自機の向き
- 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
- hpflag=0
- --+78→左右どっちを向いている?
- --03001A20+0x00000008*(ObjNumber+1)でとりあえずは当たり判定のアドレスが求められればよかった…。けどそんなことなかった
- ObjNumber=memory.readbyte(0x02000028+(i*0x00000080))
- --スプライトの外部干渉に関するステータス。詳しくは資料の方を見てください。
- eneStatus=memory.readbyte(0x0200008A+i*0x00000080)
- --敵の無敵時間
- 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))
- --何でもいいからオブジェクトだかスプライトだかの位置を知らせます。邪魔にならない程度に。
- gui.fillbox(enedispx-1,enedispy-1,enedispx+1,enedispy+1,0xffff0066)
- --残りHPです。
- enehp=memory.readwordsigned(0x02000054+(i*0x00000080))
- --敵機の攻撃/接触判定です。自分で発射した飛び道具の攻撃判定も表示できます。
- eneAJudgeStartX=memory.readbytesigned(0x030019E8+i*0x00000008)
- eneAJudgeStartY=memory.readbytesigned(0x030019E9+i*0x00000008)
- eneAJudgeRangeX=memory.readbyte(0x030019EA+i*0x00000008)
- eneAJudgeRangeY=memory.readbyte(0x030019EB+i*0x00000008)
- --敵機の被接触判定です。
- eneJudgeStartX=memory.readbytesigned(0x030019EC+i*0x00000008)
- eneJudgeStartY=memory.readbytesigned(0x030019ED+i*0x00000008)
- eneJudgeRangeX=memory.readbyte(0x030019EE+i*0x00000008)
- eneJudgeRangeY=memory.readbyte(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)
- ]]--
- --例によって右か左かで処理が変わります。
- eneRightLeft=memory.readbyte(0x02000078+(i*0x00000080))
- --最下位ビットが1であればこの時点で自機と何かしら関わることが出来ると判断します。
- --最下位ビットが0だった場合はただの見せ物で、自機とは何も関わらないと判断します。
- if(eneStatus%2==1) then
- hpflag=1
- --敵の被接触判定表示カラー。ダメージ通る時は赤、通らず弾かれるときは青です。
- --4ビット目が1だった場合には攻撃をはじくと判断します。0なら素直に攻撃を受けます。
- if(eneStatus>=8) then
- eneStatus=eneStatus-8
- eneRecvCol=0x0000ff00
- else
- eneRecvCol=0xff000000
- end
- 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
- --eneStatusを2進にしたときに3ケタ目が1だった場合は被接触判定は表示しません。
- --その際のカラーはeneRecvColとして4ビット目読み込み処理で決めています。
- if(eneStatus<4) then
- --被接触判定表示
- gui.fillbox(eneJudgeX1+1,eneJudgeY1+1,eneJudgeX2-1,eneJudgeY2-1,eneRecvCol+0x00000066)
- gui.box(eneJudgeX1+1,eneJudgeY1+1,eneJudgeX2-1,eneJudgeY2-1,eneRecvCol+0x000000aa)
- hpflag=1
- else
- --表示せず、次の下位ビットの判定のために引き算しておきます。
- eneStatus=eneStatus-4
- end
- --eneStatusを2進にしたときに2ケタ目が1だった場合は、攻撃/接触判定を表示しません。
- if(eneStatus>=2) then
- --何も表示しない上にこれ以下のビットはもう見ないので何も書かない。
- else
- --攻撃/接触判定表示
- gui.fillbox(eneAJudgeX1,eneAJudgeY1,eneAJudgeX2,eneAJudgeY2,0x00ff0044)
- gui.box(eneAJudgeX1,eneAJudgeY1,eneAJudgeX2,eneAJudgeY2,0x00ff00aa)
- end
- 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
- if(eneStatus<4) then
- gui.fillbox(eneJudgeX1-1,eneJudgeY1+1,eneJudgeX2+1,eneJudgeY2-1,eneRecvCol+0x00000066)
- gui.box(eneJudgeX1-1,eneJudgeY1+1,eneJudgeX2+1,eneJudgeY2-1,eneRecvCol+0x000000aa)
- else
- eneStatus=eneStatus-4
- end
- if(eneStatus<2) then
- gui.fillbox(eneAJudgeX1,eneAJudgeY1,eneAJudgeX2,eneAJudgeY2,0x00ff0044)
- gui.box(eneAJudgeX1,eneAJudgeY1,eneAJudgeX2,eneAJudgeY2,0x00ff00aa)
- end
- end
- end
- --HP及び無敵時間表示部分。自機と何かしら関わることが出来てかつHPを持つ者のみを敵と認識する感じです。ただしシャドウはモニタリング不可
- if( enehp>0 and hpflag==1) 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
- 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(126,0,"HP : " .. currentHP .. "/" .. MaxHP)
- gui.text(126,8,"MP : " .. currentMP .. "/" .. MaxMP)
- gui.text(126,16,"Heart : " .. currentHeart .. "/" .. MaxHeart)
- if(currentSubWeapon==1) then
- WeaponStr=string.format("Weapon: %d knives remain",currentHeart/1)
- elseif(currentSubWeapon==2) then
- WeaponStr=string.format("Weapon: %d axes remain",currentHeart/4)
- elseif(currentSubWeapon==3) then
- WeaponStr=string.format("Weapon: %d crosses remain",currentHeart/5)
- elseif(currentSubWeapon==4) then
- WeaponStr=string.format("Weapon: %d Water remain",currentHeart/3)
- elseif(currentSubWeapon==5) then
- WeaponStr=string.format("Weapon: %d Bible remain",currentHeart/3)
- elseif(currentSubWeapon==6) then
- WeaponStr=string.format("Weapon: %d knackles remain",currentHeart/8)
- elseif(currentSubWeapon==7) then
- WeaponStr=string.format("Weapon: %d Shuriken remain",currentHeart/5)
- else
- WeaponStr=string.format("Weapon: No Weapons")
- end
- gui.text(126,24,WeaponStr)
- --フレーム等の情報も自分で開いちゃいました。
- 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
- if(movie.active()==false) then
- --ムービーがロードされていないとこうです。
- gui.fillbox(0,0,500,500,0x00000088)
- gui.text(50,50,"Movie is NOT LOADED!!")
- end
- vba.frameadvance()
- end
- --[[
- 現行の問題点
- ・デビルのゲロビが表示されない。
- ->仕組みがいまだに分かっておらず、お手上げ状態
- ・きょだいはんぎょじんの回転時の謎の判定が消えない。
- ->残しても別にいいんだけどなんか気持ち悪い
- ・マクシームのくるくる回転やライダーキックの判定が、別のアクションをするまで消えない。
- ->残すべきだった。マジで残すべき。理由は現行最速TASを見ると分かる。
- くるくる判定が残ってる状態でライダーキックやると一瞬だけくるくるの判定でキックが行われるので、
- その状態を見るためにも残すべき。というか「その発想はなかった」
- (追記)のりおサン曰く、ただの偶然らしいです…。
- ・ゴーレムの落石攻撃で被接触判定なんて必要ないはずなのに表示される問題。
- ->以前と比べれば量はそんなないので無視したいとこだけど…
- ・シャドウのHP表示ができない。
- ->これは以前からの謎。余裕があれば原因を探っていきたいところ。
- 今後やってみたいこと
- ・クリティカルヒットってどういう条件でおこるもの?
- ]]--
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement