Advertisement
Robert_Ordis

Untitled

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