Advertisement
Robert_Ordis

CVHodLua ver4

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