Advertisement
Guest User

CVHodLua ver0.2

a guest
Sep 14th, 2012
124
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 16.94 KB | None | 0 0
  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. 「白夜の協奏曲TASをやるならこれを標準装備としよう」となることを目標に作成しましたが、
  16. ちょっとごちゃごちゃしすぎたのかもしれません。
  17.  
  18. ---更新履歴---
  19. Created date was forgotten ver 0.001
  20. ->グリッドと敵の画面上座標、自機の各種情報及び攻撃判定もどきを表示。多分2年とちょっとぐらい前に作成。
  21. ただし、Aria of Sorrowのものにうっかり上書きしてしまったためにコードの大半は失われることに。
  22.  
  23. Created in 2012/09/11(TUE) ver 0.01
  24. ->やる気を起こしてとりあえず2年前の物とある程度同じになるよう復元。敵機の攻撃判定はまだ無し。
  25.  
  26. Updated in 2012/09/12(WED) ver 0.02
  27. ->敵機攻撃判定実装。
  28.  
  29. Updated in 2012/09/12(WED) ver 0.03
  30. ->自機の被接触判定の表示見直し。壁との被接触判定とスプライトの攻撃/接触判定に対する非接触判定の区別をつけるようにした。
  31.  
  32. Updated in 2012/09/13(THU) ver 0.035
  33. ->スプライト?の判定表示方法を変更。グリッドに座標の値をつけるようにした。
  34.  
  35. Updated in 2012/09/13(THU) ver 0.04
  36. ->敵の無敵時間表示の機能を付けた。最大2つまでであり、3種類の攻撃を
  37. 前2つの無敵時間が終わらないうちに当てると最後の3つ目は無敵時間が続く限り連続ヒットする。
  38. これが連続ヒットバグの正体である。
  39. ちなみに、なぜだか知らないが地上の基本攻撃と空中の基本攻撃は別攻撃扱いらしい。…なぜ。
  40.  
  41. Updated in 2012/09/14(FRI) ver 0.1
  42. ->とりあえず実践で使える出来になったのでRC版とします。
  43. ->不要な判定は表示しない仕組みの実装。例えばハートに対して攻撃受理判定とかろうそくに対して攻撃/接触判定とか。
  44. 同時に、被接触判定において、「攻撃を素直に受ける場合」は赤で、「攻撃をはじく場合」は青で表示するようにした。
  45. ->これでもまだちょっとだけ不満はあったりするので解決策を見つけ次第何とかする予定です。
  46. でもこれで一応満足するだけの出来にはなりましたので、このスクリプトの開発は一段落したものとします。
  47.  
  48. Updated in 2012/09/14(FRI) ver 0.15
  49. ->スプライトの当たり判定の範囲を示す数値の扱いが符号ありだったのを符号なしに変更。
  50. これにより、ドラキュラファントム2のゲロビの攻撃/接触判定が表示されるように。
  51. ->不要な敵のHP表示を抑えた。
  52.  
  53. Updated in 2012/09/14(FRI) ver 0.16
  54. ->マイナーアップデート。持ってるサブウェポンとあと何回使えるかの表示を追加。
  55. スペースの都合上、ステラソード投げはShurikenと表記しました。
  56.  
  57. Updated in 2012/09/15(SAT) ver 0.2
  58. ->他機との干渉属性を示すアドレス(byte)のうち、下位ビットしかわかっていなかったのが上位ビットまで
  59. その役割が分かったため、その辺の事実装しました。
  60.  
  61.  
  62. ]]--
  63.  
  64. while (true) do
  65.    
  66.  
  67.     --カメラのXとYを読み込んでグリッド表示
  68.     --どっちでもいいんだろうけど今回はgocha先生が特定したアドレスを使わせてもらいました。
  69.     --CameraX=memory.readwordsigned(0x03072B2C)
  70.     --CameraY=memory.readwordsigned(0x03072B2E)
  71.     CameraX=memory.readwordsigned(0x0200A446)
  72.     CameraY=memory.readwordsigned(0x0200A44A)
  73.     gridx=CameraX%16
  74.     gridy=CameraY%16
  75.     for line=0,255,16 do
  76.         gui.text(line-gridx,153,CameraX-gridx+line)
  77.         gui.text(0,line-gridy-3,CameraY-gridy+line)
  78.         gui.line(0,line-gridy,255,line-gridy,0x00FFFF88)
  79.         gui.line(line-gridx,0,line-gridx,255,0x00FFFF88)
  80.         gui.line(0,line-gridy+8,255,line-gridy+8,0x00FFFF33)
  81.         gui.line(line-gridx+8,0,line-gridx+8,255,0x00FFFF33)
  82.     end
  83.  
  84.     --自機の各種ステータス
  85.  
  86.     --自機のHPを読み込みます。最大HPもついでです。
  87.     currentHP=memory.readword(0x0201854E)
  88.     MaxHP=memory.readword(0x02018786)
  89.  
  90.     --自機のMPを読み込みます。最大MPもついでです。
  91.     currentMP=memory.readword(0x02018550)
  92.     MaxMP=memory.readword(0x02018788)
  93.  
  94.     --自機のハート数を表示します。最大数もついでです。
  95.     currentHeart=memory.readword(0x02018794)
  96.     MaxHeart=memory.readword(0x0201878A)
  97.    
  98.     --自機のサブウェポンを読み取ります。
  99.     currentSubWeapon=memory.readbyte(0x0201877E)
  100.  
  101.     --自機の向き
  102.     RightLeft=memory.readbyte(0x02000478) --0x40以上がLeft
  103.  
  104.     --自機のスピードを表示。
  105.     myspeedx=memory.readwordsigned(0x0200046A)
  106.     myspeedy=memory.readwordsigned(0x0200046E)
  107.     myspeeddotx=(memory.readword(0x02000468))/65536
  108.     myspeeddoty=(memory.readword(0x0200046C))/65536
  109.  
  110.     --自機の基本攻撃判定の元
  111.     mt1=memory.readbytesigned(0x03001A28)
  112.     mt2=memory.readbytesigned(0x03001A29)
  113.     mt3=memory.readbytesigned(0x03001A2A)
  114.     mt4=memory.readbytesigned(0x03001A2B)
  115.  
  116.     --自機の被接触判定の元
  117.     MyJudgeLeftEdge=memory.readwordsigned(0x03001A20)
  118.     MyJudgeRightEdge=memory.readwordsigned(0x03001A24)
  119.     MyJudgeUpEdge=memory.readwordsigned(0x03001A22)
  120.     MyJudgeDownEdge=memory.readwordsigned(0x03001A26)
  121.  
  122.  
  123.  
  124.     --HP表示のための整列用変数
  125.     j=0
  126.     k=0
  127.     --敵・・・のつもりだったんだけど各種スプライト?オブジェクト?の意味が強くなりました。
  128.     for i=10,247,1 do
  129.         hpflag=0
  130.         --+78→左右どっちを向いている?
  131.         --03001A20+0x00000008*(ObjNumber+1)でとりあえずは当たり判定のアドレスが求められればよかった…。けどそんなことなかった
  132.         ObjNumber=memory.readbyte(0x0200008B+(i*0x00000080))
  133.  
  134.         --スプライトの外部干渉に関するステータス。詳しくは資料の方を見てください。
  135.         eneStatus=memory.readbyte(0x0200008A+i*0x00000080)
  136.  
  137.         --敵の無敵時間
  138.         eneInvis1=memory.readbytesigned(0x0200008E+i*0x00000080)
  139.         eneInvis2=memory.readbytesigned(0x0200008F+i*0x00000080)
  140.  
  141.         --画面上の座標を求めます。
  142.         enedispx=memory.readwordsigned(0x02000062+(i*0x00000080))
  143.         enedispsubx=memory.readword(0x02000060+(i*0x00000080))/65536
  144.         enedispsuby=memory.readword(0x02000060+4+(i*0x00000080))/65536
  145.         enedispy=memory.readwordsigned(0x02000062+4+(i*0x00000080))
  146.  
  147.         --何でもいいからオブジェクトだかスプライトだかの位置を知らせます。邪魔にならない程度に。
  148.         gui.fillbox(enedispx-1,enedispy-1,enedispx+1,enedispy+1,0xffff0066)
  149.  
  150.         --残りHPです。
  151.         enehp=memory.readwordsigned(0x02000054+(i*0x00000080))
  152.  
  153.         --敵機の攻撃/接触判定です。自分で発射した飛び道具の攻撃判定も表示できます。
  154.         eneAJudgeStartX=memory.readbytesigned(0x030019E8+i*0x00000008)
  155.         eneAJudgeStartY=memory.readbytesigned(0x030019E9+i*0x00000008)
  156.         eneAJudgeRangeX=memory.readbyte(0x030019EA+i*0x00000008)
  157.         eneAJudgeRangeY=memory.readbyte(0x030019EB+i*0x00000008)
  158.  
  159.         --敵機の被接触判定です。
  160.         eneJudgeStartX=memory.readbytesigned(0x030019EC+i*0x00000008)
  161.         eneJudgeStartY=memory.readbytesigned(0x030019ED+i*0x00000008)
  162.         eneJudgeRangeX=memory.readbyte(0x030019EE+i*0x00000008)
  163.         eneJudgeRangeY=memory.readbyte(0x030019EF+i*0x00000008)
  164.  
  165.         --構造体チックなもののメンバから判定を格納したアドレス特定できるのが一番よかったんだけどなぁ…
  166.         --[[
  167.         eneAJudgeStartX=memory.readbytesigned(0x03001A20+0x00000008*(ObjNumber+1)+0)
  168.         eneAJudgeStartY=memory.readbytesigned(0x03001A20+0x00000008*(ObjNumber+1)+1)
  169.         eneAJudgeRangeX=memory.readbytesigned(0x03001A20+0x00000008*(ObjNumber+1)+2)
  170.         eneAJudgeRangeY=memory.readbytesigned(0x03001A20+0x00000008*(ObjNumber+1)+3)
  171.         eneJudgeStartX=memory.readbytesigned(0x03001A20+0x00000008*(ObjNumber+1)+4)
  172.         eneJudgeStartY=memory.readbytesigned(0x03001A20+0x00000008*(ObjNumber+1)+5)
  173.         eneJudgeRangeX=memory.readbytesigned(0x03001A20+0x00000008*(ObjNumber+1)+6)
  174.         eneJudgeRangeY=memory.readbytesigned(0x03001A20+0x00000008*(ObjNumber+1)+7)
  175.         ]]--
  176.  
  177.         --例によって右か左かで処理が変わります。
  178.         eneRightLeft=memory.readbyte(0x02000078+(i*0x00000080))  
  179.    
  180.         --最下位ビットが1であればこの時点で自機と何かしら関わることが出来ると判断します。
  181.         --最下位ビットが0だった場合はただの見せ物で、自機とは何も関わらないと判断します。
  182.         if(eneStatus%2==1) then
  183.             hpflag=1
  184.  
  185.             GuardColor=0x0000ff00
  186.            
  187.             --最上位ビットの判定。よく分からない。
  188.             if(eneStatus>0x00000080) then
  189.                 --紫色で表示する。
  190.                 GuardColor=0xff00ff00
  191.                 eneStatus=eneStatus-0x00000080
  192.             end
  193.             --7ビット目の判定。およそすべての攻撃が弾かれるはず
  194.             if(eneStatus>0x00000040) then
  195.                 --黒で表示する
  196.                 GuardColor=0x00000000
  197.                 eneStatus=eneStatus-0x00000040
  198.  
  199.             end
  200.             --6ビット目の判定。溜め打ちのみ通す
  201.             if(eneStatus>0x00000020) then
  202.                 --白で表示する
  203.                 GuardColor=0xffffff00
  204.                 eneStatus=eneStatus-0x00000020
  205.             end
  206.             --5ビット目の判定。溜め打ちと基本攻撃のみ通す
  207.             if(eneStatus>0x00000010) then
  208.                 --水色で表示する
  209.                 GuardColor=0x00ffff00
  210.                 eneStatus=eneStatus-0x00000010
  211.             end
  212.             --敵の被接触判定表示カラー。ダメージ通る時は赤、弾かれるときは青、その他もろもろ…
  213.             --4ビット目が1だった場合には攻撃をはじくと判断します。0なら素直に攻撃を受けます。
  214.             if(eneStatus>=8) then
  215.                 eneStatus=eneStatus-8
  216.                 eneRecvCol=GuardColor
  217.             else
  218.                 eneRecvCol=0xff000000
  219.             end
  220.             if(eneRightLeft<0x40) then
  221.  
  222.                 --攻撃/接触判定を四角形で表示したいのでその四隅を作る
  223.                 eneAJudgeX1=enedispx+eneAJudgeStartX-1
  224.                 eneAJudgeX2=eneAJudgeX1+eneAJudgeRangeX
  225.                 eneAJudgeY1=enedispy+eneAJudgeStartY
  226.                 eneAJudgeY2=eneAJudgeY1+eneAJudgeRangeY
  227.  
  228.                 --被接触判定を四角形で表示したいのでその四隅を作る
  229.                 eneJudgeX1=enedispx+eneJudgeStartX-1
  230.                 eneJudgeX2=eneJudgeX1+eneJudgeRangeX
  231.                 eneJudgeY1=enedispy+eneJudgeStartY
  232.                 eneJudgeY2=eneJudgeY1+eneJudgeRangeY
  233.  
  234.                 --eneStatusを2進にしたときに3ケタ目が1だった場合は被接触判定は表示しません。
  235.                 --その際のカラーはeneRecvColとして4ビット目読み込み処理で決めています。
  236.                 if(eneStatus<4) then
  237.                     --被接触判定表示
  238.                     gui.fillbox(eneJudgeX1+1,eneJudgeY1+1,eneJudgeX2-1,eneJudgeY2-1,eneRecvCol+0x00000066)
  239.                     gui.box(eneJudgeX1+1,eneJudgeY1+1,eneJudgeX2-1,eneJudgeY2-1,eneRecvCol+0x000000aa)
  240.                     hpflag=1
  241.                 else
  242.                     --表示せず、次の下位ビットの判定のために引き算しておきます。
  243.                     eneStatus=eneStatus-4
  244.                 end
  245.  
  246.                 --eneStatusを2進にしたときに2ケタ目が1だった場合は、攻撃/接触判定を表示しません。
  247.                 if(eneStatus>=2) then
  248.                     --何も表示しない上にこれ以下のビットはもう見ないので何も書かない。
  249.                 else
  250.                     --攻撃/接触判定表示
  251.                     gui.fillbox(eneAJudgeX1,eneAJudgeY1,eneAJudgeX2,eneAJudgeY2,0x00ff0044)
  252.                     gui.box(eneAJudgeX1,eneAJudgeY1,eneAJudgeX2,eneAJudgeY2,0x00ff00aa)
  253.                 end
  254.  
  255.             else
  256.                 --↑と同じなのでコメントは省略します。
  257.                 eneAJudgeX1=enedispx-eneAJudgeStartX
  258.                 eneAJudgeX2=eneAJudgeX1-eneAJudgeRangeX
  259.                 eneAJudgeY1=enedispy+eneAJudgeStartY
  260.                 eneAJudgeY2=eneAJudgeY1+eneAJudgeRangeY
  261.  
  262.                 eneJudgeX1=enedispx-eneJudgeStartX
  263.                 eneJudgeX2=eneJudgeX1-eneJudgeRangeX
  264.                 eneJudgeY1=enedispy+eneJudgeStartY
  265.                 eneJudgeY2=eneJudgeY1+eneJudgeRangeY
  266.                 if(eneStatus<4) then
  267.                     gui.fillbox(eneJudgeX1-1,eneJudgeY1+1,eneJudgeX2+1,eneJudgeY2-1,eneRecvCol+0x00000066)
  268.                     gui.box(eneJudgeX1-1,eneJudgeY1+1,eneJudgeX2+1,eneJudgeY2-1,eneRecvCol+0x000000aa)
  269.                    
  270.                 else
  271.                     eneStatus=eneStatus-4
  272.                 end                    
  273.                 if(eneStatus<2) then
  274.                     gui.fillbox(eneAJudgeX1,eneAJudgeY1,eneAJudgeX2,eneAJudgeY2,0x00ff0044)
  275.                     gui.box(eneAJudgeX1,eneAJudgeY1,eneAJudgeX2,eneAJudgeY2,0x00ff00aa)
  276.                 end
  277.             end
  278.         end
  279.  
  280.         --HP及び無敵時間表示部分。自機と何かしら関わることが出来てかつHPを持つ者のみを敵と認識する感じです。ただしシャドウはモニタリング不可
  281.         if( enehp>0 and hpflag==1) then
  282.                                          
  283.             if( j>16 ) then
  284.                 k=k+1
  285.             end
  286.  
  287.             --HPが残っている敵機がいたら順次表示します。
  288.             gui.text(30+k*48,16+j*8,string.format("%d,%d,%d",enehp,eneInvis1,eneInvis2))
  289.             --gui.text(enedispx,enedispy,enehp,0x00ffffff)
  290.             j=j+1
  291.         end
  292.     end
  293.  
  294.     --自機の情報開示。
  295.  
  296.     --右向きか左向きかで処理は変わりますよっと
  297.     if( RightLeft>=64 ) then
  298.         --左向き
  299.  
  300.         --自機のスプライトに対する被接触判定を白枠で表示します。
  301.         gui.box(MyJudgeRightEdge-1,MyJudgeUpEdge+1,MyJudgeLeftEdge,MyJudgeDownEdge,0xffffffff)
  302.  
  303.         --自機の壁との接触判定をピンク枠で表示します。ただし、右端と下端は白いのとかぶってます。
  304.         gui.box(MyJudgeRightEdge-1,MyJudgeUpEdge+3,MyJudgeLeftEdge+2,MyJudgeDownEdge,0xff00ffff)
  305.  
  306.         --自機の基本攻撃判定を緑枠で表示します。
  307.         hanteir=MyJudgeRightEdge-mt1-6-1
  308.         hanteiu=MyJudgeDownEdge+(mt2)+1
  309.         hanteil=hanteir-mt3+1
  310.         hanteid=hanteiu+(mt4)-1
  311.         gui.box(hanteil-1,hanteiu-1,hanteir+1,hanteid+1,0x00ff00ff)
  312.    
  313.     else
  314.         --右向き
  315.         --以下左向きと同じ
  316.         gui.box(MyJudgeLeftEdge,MyJudgeUpEdge+1,MyJudgeRightEdge-1,MyJudgeDownEdge,0xffffffff)
  317.         gui.box(MyJudgeLeftEdge+2,MyJudgeUpEdge+3,MyJudgeRightEdge-1,MyJudgeDownEdge,0xff00ffff)
  318.  
  319.         hanteil=MyJudgeLeftEdge+mt1+6
  320.         hanteiu=MyJudgeDownEdge+(mt2)+1
  321.         hanteir=hanteil+mt3-1
  322.         hanteid=hanteiu+(mt4)-1
  323.         gui.box(hanteil-1,hanteiu-1,hanteir+1,hanteid+1,0x00ff00ff)
  324.     end
  325.  
  326.  
  327.     gui.text(16,0,"X Speed:" .. myspeedx+myspeeddotx)
  328.     gui.text(16,8,"Y Speed:" .. myspeedy+myspeeddoty)
  329.     gui.text(126,0,"HP    : " .. currentHP .. "/" .. MaxHP)
  330.     gui.text(126,8,"MP    : " .. currentMP .. "/" .. MaxMP)
  331.     gui.text(126,16,"Heart : " .. currentHeart .. "/" .. MaxHeart)
  332.     if(currentSubWeapon==1) then
  333.         WeaponStr=string.format("Weapon: %d knives remain",currentHeart/1)
  334.     elseif(currentSubWeapon==2) then
  335.         WeaponStr=string.format("Weapon: %d axes remain",currentHeart/4)
  336.     elseif(currentSubWeapon==3) then
  337.         WeaponStr=string.format("Weapon: %d crosses remain",currentHeart/5)
  338.     elseif(currentSubWeapon==4) then
  339.         WeaponStr=string.format("Weapon: %d Water remain",currentHeart/3)
  340.     elseif(currentSubWeapon==5) then
  341.         WeaponStr=string.format("Weapon: %d Bible remain",currentHeart/3)
  342.     elseif(currentSubWeapon==6) then
  343.         WeaponStr=string.format("Weapon: %d knackles remain",currentHeart/8)
  344.     elseif(currentSubWeapon==7) then
  345.         WeaponStr=string.format("Weapon: %d Shuriken remain",currentHeart/5)
  346.     else
  347.         WeaponStr=string.format("Weapon: No Weapons")
  348.     end
  349.     gui.text(126,24,WeaponStr)
  350.    
  351.     --フレーム等の情報も自分で開いちゃいました。
  352.     if (vba.lagged()==true) then
  353.         gui.text(22,138,"Frames:" .. vba.framecount() .. ":*" .. vba.lagcount(),0xff0000ff)
  354.     else
  355.         gui.text(22,138,"Frames:" .. vba.framecount() .. ":" .. vba.lagcount())
  356.     end
  357.  
  358.     if(movie.active()==false) then
  359.         --ムービーがロードされていないとこうです。
  360.         gui.fillbox(0,0,500,500,0x00000088)
  361.         gui.text(50,50,"Movie is NOT LOADED!!")
  362.     end
  363.     vba.frameadvance()
  364. end
  365.      
  366. --[[
  367.  
  368. 現行の問題点
  369. ・デビルのゲロビが表示されない。
  370. ->仕組みがいまだに分かっておらず、お手上げ状態
  371.  
  372. ・きょだいはんぎょじんの回転時の謎の判定が消えない。
  373. ->残しても別にいいんだけどなんか気持ち悪い
  374.  
  375. ・マクシームのくるくる回転やライダーキックの判定が、別のアクションをするまで消えない。
  376. ->残すべきだった。マジで残すべき。理由は現行最速TASを見ると分かる。
  377. くるくる判定が残ってる状態でライダーキックやると一瞬だけくるくるの判定でキックが行われるので、
  378. その状態を見るためにも残すべき。というか「その発想はなかった」
  379. (追記)のりおサン曰く、ただの偶然らしいです…。
  380.  
  381. ・ゴーレムの落石攻撃で被接触判定なんて必要ないはずなのに表示される問題。
  382. ->ちゃんと被接触判定がありました。何でこうなってんの
  383.  
  384. ・シャドウのHP表示ができない。
  385. ->これは以前からの謎。余裕があれば原因を探っていきたいところ。
  386.      
  387. 今後やってみたいこと
  388. ・クリティカルヒットってどういう条件でおこるもの?
  389.  
  390. ]]--
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement