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