-- PSXjin用スクリプト -- 初代アーマード・コアシリーズ用(初代・PP・MA) -- 戦闘補助GUI表示スクリプト(アリーナ用) -- 通常版限定(ベスト版、PSone版、海外版ではメモリのアドレスが異なるため恐らく使えない) -- Last Update 2016/05/12 -- ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■ -- 変数の初期設定 AC = 0 -- 何作目のACか判断し、以後は配列の何個目の要素かを表す mode = 0 -- 不明値確認用。メニュー(ガレージ)では24(0x0018)になっている。 ingame_timer = 0 -- 内部タイマー。フレーム更新時のみ変化。ポーズ中は停止 tr = 1 -- GUIの透過度の設定。透過度は小数点が使用可能。4以上で見えなくなるっぽい -- 座標表示用(旋回速度差分用) turn_LR_1P = 0 -- 1Pの左右角度(前フレームとの差分確認用) turn_UD_1P = 0 -- 1Pの左右角度(前フレームとの差分確認用) turn_LR_diff_1P = 0 -- 1Pの左右角度の差分(前フレームとの差分確認用) turn_UD_diff_1P = 0 -- 1Pの左右角度の差分(前フレームとの差分確認用) -- 上下角度計描画用座標 gonime_base_X = 25 -- 基準点X。角度計の縦線中央部分の横座標。ここから長さの分だけ右に伸ばす gonime_base_Y = 178 -- 基準点Y。角度計の縦線中央部分の縦座標。ここから長さの分だけ上下に伸ばす。A:178、M:188 gonime_line_LG = 25 -- 線の長さ。中心点から上下、右、現在の向きの線で使用。基準点Xと同じ値なのはたまたま -- 以下の座標は↑3つの値を基に自動算出 gonime_top_Y = gonime_base_Y - gonime_line_LG -- 縦線上Y:153 Xはgonime_base_X gonime_btm_Y = gonime_base_Y + gonime_line_LG -- 縦線下Y:203 Xはgonime_base_X gonime_mdl_X = gonime_base_X + gonime_line_LG -- 横線右端X:50 Yはgonime_base_Y gonime_u_675_X = gonime_base_X + gonime_line_LG * math.cos(-67.5 * math.pi / 180) -- 上67.50度X gonime_u_675_Y = gonime_base_Y + gonime_line_LG * math.sin(-67.5 * math.pi / 180) -- 上67.50度Y gonime_u_45_X = gonime_base_X + gonime_line_LG * math.cos( -45 * math.pi / 180) -- 上45度X gonime_u_45_Y = gonime_base_Y + gonime_line_LG * math.sin( -45 * math.pi / 180) -- 上45度Y gonime_u_225_X = gonime_base_X + gonime_line_LG * math.cos(-22.5 * math.pi / 180) -- 上22.5度X gonime_u_225_Y = gonime_base_Y + gonime_line_LG * math.sin(-22.5 * math.pi / 180) -- 上22.5度Y gonime_d_225_X = gonime_base_X + gonime_line_LG * math.cos( 22.5 * math.pi / 180) -- 下22.5度X gonime_d_225_Y = gonime_base_Y + gonime_line_LG * math.sin( 22.5 * math.pi / 180) -- 下22.5度Y gonime_d_45_X = gonime_base_X + gonime_line_LG * math.cos( 45 * math.pi / 180) -- 下45度X gonime_d_45_Y = gonime_base_Y + gonime_line_LG * math.sin( 45 * math.pi / 180) -- 下45度Y gonime_d_675_X = gonime_base_X + gonime_line_LG * math.cos( 67.5 * math.pi / 180) -- 下67.50度X gonime_d_675_Y = gonime_base_Y + gonime_line_LG * math.sin( 67.5 * math.pi / 180) -- 下67.50度Y -- ジェネ残量 EN_1P = 0 -- 1PのEN残量(前フレームとの差分確認用) EN_diff_1P = 0 -- 1PのEN残量の差分(前フレームとの差分確認用) -- 累計ダメージ表示用 AP_1P = 0 -- 1PのAP(前フレームとの差分確認用) AP_2P = 0 -- 2PのAP(前フレームとの差分確認用) count_TD_1P = 0 -- 累計被ダメージ用カウンタ count_TD_2P = 0 -- 累計与ダメージ用カウンタ total_damege_1P = 0 -- 1Pの類型ダメージ total_damege_2P = 0 -- 1Pの類型ダメージ tr_D_1P = 4 -- 累計被ダメージの透明度 tr_D_2P = 4 -- 累計被ダメージの透明度 -- 被ロック警告灯表示用 locked_tr = 0 -- 被ロック警告灯の透過度 locked_count = 0 -- 被ロック警告灯点滅用カウンタ -- レーダー周囲の方位計用 compass_cen_X = 282 -- 方位計の中心の横座標(レーダーの中心点の横座標) compass_cen_Y = 80 -- 方位計の中心の縦座標(レーダーの中心点の縦座標) compass_LG = 27 -- 方位計の中心から文字への距離 -- エリアオーバーライン描画用(エミュ側の解像度がどうであれ、縦320×横240の範囲に準拠するみたい) arealine_z_p1 = 36 -- 一番上の点の縦の位置:一番上と一番下の値を変えると線の高さ(幅)を変えられます arealine_z_p2 = 0 -- 上限界の点の縦の位置 arealine_z_p3 = 0 -- 上警告の点の縦の位置 arealine_z_p4 = 0 -- 下警告の点の縦の位置 arealine_z_p5 = 0 -- 下限界の点の縦の位置 arealine_z_p6 = 196 -- 一番下の点の縦の位置:一番上と一番下の値を変えると線の高さ(幅)を変えられます arealine_x = 5 -- 描画する横座標(横線の基準値も兼ねる):値を変えると線の横の位置を変えられます arealine_per = arealine_z_p6 - arealine_z_p1 -- エリアオーバーライン全体の高さ(最大:縦240) arealine_half = (arealine_z_p1 + arealine_z_p6) / 2 -- 1Pの高度表示用 --[[ ■エリアオーバーラインは丁度良い位置やサイズがわからないので、  デフォルトの設定が気に入らない人は適当にいじってみてください。 例)画面左端でENゲージの外枠っぽくなるような位置に表示(デフォルト) arealine_z_p1 = 36 arealine_z_p6 = 196 arealine_x = 5 例)画面左端(レーダーの左) arealine_z_p1 = 48 arealine_z_p6 = 108 arealine_x = 255 -- 310でレーダーの右 ]] -- リロードバー表示 reload_max = 0 -- リロードの最大値 reload_curt = 0 -- 前フレームのリロード reload_zero = 0 -- 残りリロード0表示用 --[[ -- 個別の透過度 -- ★めんどい XYZ_tr = 0 -- XYZ座標・実速度・速度値の透過度 turn_tr = 0 -- 左右旋回速度の透過度 gonime_tr = 0 -- 上下角度計の透過度 locked_tr = 0 -- 被ロック警告の透過度 total_D_tr = 0 -- 累計ダメージの透過度 arealine_tr = 0 -- 上下エリアオーバーラインの透過度 ]] --[[ ■GUIの色設定(キャプからカラーピッカーで調べた色)★気が向いたらこの値で検索してみること! 明緑:#10F810 R: 16,G:248,B: 16 -- ポーズ表示 黄緑:#38D038 R: 56,G:208,G: 56 -- AP、エネルギーゲージの枠、ヒットマーク、サイト(ロック前)  緑:#409038 R: 64,G:144,G: 56 -- エネルギーゲージ。計器の緑とは別の色 深緑:#28C028 R: 40,G:192,B: 40 -- 方位計。黄緑だったのが暗く半透明にされただけ?  黄:#F8F800 R:248,G:248,G: 0 -- 弾数  赤:#E84820 R:132,G:130,B: 32 -- サイト(ロック中) 暗赤:#A05030 R:160,G: 80,B: 48 -- レッドゾーン 水色:#38F8F8 R: 56,G:248,B:248 -- 僚機 ]] -- ■■■■■■■■■■ -- 何作目のACであるかを確認 -- ゲームの型番を確認。初代:SLPS-00900、PP:SLPS-01130、MA:SLPS-01855〜6 -- 3作共通のアドレスからSLPS_0の後の2桁の数字の確認する。初代:09(0x3930)、PP:11(0x3131)、MA:18(0x3831) AC = memory.readword(0x9292) -- SLPS_0の後の2桁の数字を取得 -- 型番から何作目かを確認。この番号を配列で使用する。初代:1、PP:2、MA:3 if AC == 0x3930 -- 初代か確認 then AC = 1 -- 1作目とする print("ARMORED CORE") -- コンソールにARMORED COREと表示 print("not available") -- 非対応なのでコンソールに警告を表示 elseif AC == 0x3131 -- PPか確認 then AC = 2 -- 2作目とする print("PROJECT PHANTASMA") -- コンソールにPROJECT PHANTASMAと表示 elseif AC == 0x3831 -- MAか確認 then AC = 3 -- 3作目とする print("MASTER OF ARENA") -- コンソールにMASTER OF ARENAと表示 else AC = 4 print("not available!!") -- ACではないのでコンソールに警告を表示 end -- ■■■■■■■■■■ -- 各メモリアドレスを配列化 -- 配列の初期化と各アドレスの入力 -- 配列は最初に初期化してそれから値を代入する必要があるらしい。あと、入れてない要素を指定するとエラー -- アドレス用変数名 = {初代用 , PP用 , MA用 , AC以外のダミー用} -- モード add_mode = {} add_mode = {0x5AAB0 , 0x73194 , 0x76C2C , 0} -- メニューか戦闘中の確認用アドレス -- ポーズ状態 add_pause = {} add_pause = {0x0 , 0x3A464 , 0x3E744 , 0} -- ポーズ状態のアドレス -- タイマー add_ingame_timer = {} add_event_timer = {} add_ingame_timer = {0x0 , 0x19C94C , 0x1AC4C4 , 0} -- アリーナのゲーム内タイマーのアドレス add_event_timer = {0x0 , 0x1A367A , 0x9EFFA , 0} -- アリーナのイベントタイマーのアドレス -- 座標(アドレスの順番に注意すること!) add_x_1P = {} add_y_1P = {} add_z_1P = {} add_x_1P = {0x0 , 0x1A3744 , 0x1D8434 , 0} -- 1Pのx座標のアドレス add_y_1P = {0x0 , 0x1A3740 , 0x1D8430 , 0} -- 1Pのy座標のアドレス add_z_1P = {0x0 , 0x1A3742 , 0x1D8432 , 0} -- 1Pのz座標のアドレス -- 前フレームの座標 add_x_pre_1P = {} add_y_pre_1P = {} add_z_pre_1P = {} add_x_pre_1P = {0x0 , 0x1A375C , 0x1D844C , 0} -- 1Pの前フレームのx座標のアドレス add_y_pre_1P = {0x0 , 0x1A3758 , 0x1D8448 , 0} -- 1Pの前フレームのy座標のアドレス add_z_pre_1P = {0x0 , 0x1A375A , 0x1D844A , 0} -- 1Pの前フレームのz座標のアドレス -- 速度 add_x_spd_1P = {} add_y_spd_1P = {} add_z_spd_1P = {} add_x_spd_1P = {0x0 , 0x1A3808 , 0x1D8500 , 0} -- 1Pのx軸速度のアドレス add_y_spd_1P = {0x0 , 0x1A3804 , 0x1D84FC , 0} -- 1Pのy軸速度のアドレス add_z_spd_1P = {0x0 , 0x1A3806 , 0x1D84FE , 0} -- 1Pのz軸速度のアドレス -- 旋回 add_turn_LR_1P = {} add_turn_UD_1P = {} add_turn_LR_1P = {0x0 , 0x1A374A ,0x1D843A , 0} -- 1Pの左右角度のアドレス add_turn_UD_1P = {0x0 , 0x41C28 , 0x453D0 , 0} -- 1Pの上下角度のアドレス -- ジェネ add_EN_curt_1P = {} add_EN_MAX_1P = {} add_EN_curt_1P = {0x41016 , 0x41A26 , 0x451CE , 0} -- 1Pのエネルギー現在残量のアドレス add_EN_MAX_1P = {0x4125C , 0x41C72 , 0x4541A , 0} -- 1Pのエネルギー最大値のアドレス -- 距離計 add_range_meter = {} add_range_meter = {0x0 , 0x41A90 , 0x45238 , 0} -- 1Pの距離計の値のアドレス -- ロック状態 add_lockon_1P = {} add_lockon_2P = {} add_lockon_1P = {0x0 , 0x41A8E , 0x45236 , 0} -- 1Pのロック状態のアドレス add_lockon_2P = {0x0 , 0x41E34 , 0x455D6 , 0} -- 2Pのロック状態のアドレス -- エリアオーバーライン add_z_U_over = {} add_z_U_warn = {} add_z_D_warn = {} add_z_D_over = {} add_z_U_over = {0x0 , 0x41C40 , 0x453E8 , 0} -- 上限界の点 add_z_U_warn = {0x0 , 0x41C30 , 0x453D8 , 0} -- 上警告の点 add_z_D_warn = {0x0 , 0x41C38 , 0x453E0 , 0} -- 下警告の点 add_z_D_over = {0x0 , 0x41C48 , 0x453F0 , 0} -- 下限界の点 -- AP -- 最大APは現状必要無し? add_AP_curt_1P = {} add_AP_curt_2P = {} add_AP_curt_1P = {0x0 , 0x1A3898 , 0x1D8590 , 0} -- 1Pの現在のAPのアドレス add_AP_curt_2P = {0x0 , 0x1A3A08 , 0x1D8708 , 0} -- 2Pの現在のAPのアドレス -- 残りリロード add_reload_left = {} add_reload_left = {0x0 , 0x1A3777 , 0x1D8470 , 0} -- 1Pの残りリロード時間のアドレス -- add_ = {0x0 , 0x , 0x , 0} -- ■■■■■■■■■■■■■■■■■■■■ -- ↑ここまで初期設定で、最初に一度だけ実行される -- ■■■■■■■■■■ -- メイン処理部分 -- 以降は↓の部分を毎フレーム描画後に繰り返す emu.registerafter(function() -- 毎フレーム処理完了後に実行 -- ■■■■■■■■■■ -- ■テスト表示確認用 -- 座標に小数点を使っても四捨五入されるっぽい -- gui.drawbox(98.55 , 99 , 123.75 , 108 , "#E84820" , "#E84C24") -- 塗りつぶし四角形 -- gui.text(100,100,string.format("%02d",memory.readbyte(0x453D8))) -- テキスト表示 -- gui.drawbox(250 , 147 , 310 , 152 , "#E84820" , "#E84C24") -- gui.text(100,100,string.format("%02X",AC)) -- テキスト表示 -- ■■■■■■■■■■■■■■■■■■■■ -- 戦闘中のみ実行 -- ★各種表示系のように常時実行するものとタイマー更新時のみ実行するものと、 -- それぞれまとめた方が無駄が減らせるんだろうけど…めんどい! -- ■■■■■■■■■■ -- GUIを戦闘中のみ表示させる -- ★勝ち負けの表示やコンテニュー表示の時は非表示にした方が良いかなぁ? mode = memory.readword(add_mode[AC]) -- 不明値の読み込み if mode > 24 and memory.readword(add_event_timer[AC]) > 0 then -- 不明値とタイマーから戦闘中と判断したら処理開始 -- 以降、不明値がガレージ以外の値、イベントタイマーが0より大きいなら戦闘中と判断して処理開始 -- ■■■■■■■■■■ -- 座標表示:座標(移動距離),速度値 -- メモリ上ではY・Z・Xの順番だけど、上からX・Y・Zの順番で表示 gui.text(236,224,string.format("Y:%06d(%03d),%06d", -- Y軸の座標、移動距離、速度を表示 memory.readwordsigned(add_y_1P[AC]), -- Y座標 math.abs(memory.readwordsigned(add_y_1P[AC]) - -- 前フレームと現在座標の差分を移動距離とする memory.readwordsigned(add_y_pre_1P[AC])) , memory.readwordsigned(add_y_spd_1P[AC]))) -- Y軸速度 gui.text(236,232,string.format("Z:%06d(%03d),%06d", -- Z memory.readwordsigned(add_z_1P[AC]), -- Z座標 math.abs(memory.readwordsigned(add_z_1P[AC]) - -- 移動距離 memory.readwordsigned(add_z_pre_1P[AC])) , memory.readwordsigned(add_z_spd_1P[AC]))) -- Z軸速度 gui.text(236,216,string.format("X:%06d(%03d),%06d", -- X memory.readwordsigned(add_x_1P[AC]), -- X座標 math.abs(memory.readwordsigned(add_x_1P[AC]) - -- 移動距離 memory.readwordsigned(add_x_pre_1P[AC])) , memory.readwordsigned(add_x_spd_1P[AC]))) -- X軸速度 -- ■■■■■■■■■■ -- 機体角度表示:左右/上下(方位計の上に表示)ここもなんか見辛い。 -- 左右角度 -- フレーム更新確認用 if ingame_timer ~= memory.readdword(add_ingame_timer[AC]) -- 内部カウンタが変化したか確認 then -- タイマー更新時の処理 if turn_LR_1P ~= memory.readwordsigned(add_turn_LR_1P[AC]) then -- 左右角度が変化したか確認 turn_LR_diff_1P = -- 差分を求める math.abs(turn_LR_1P - memory.readwordsigned(add_turn_LR_1P[AC])) elseif memory.readbyte(add_pause[AC]) == 01 -- ポーズ状態か確認 then turn_LR_diff_1P = 0 -- ポーズではないので角度は変化無し。差分を0にする else -- ポーズ中なので何もしない end turn_LR_1P = memory.readwordsigned(add_turn_LR_1P[AC]) -- 処理後に現在の値を読み込む(タイマー更新時のみ更新) else -- タイマーが更新されなかった場合の処理(何もしない場合は削除) end -- 上下角度 -- フレーム更新確認用 if ingame_timer ~= memory.readdword(add_ingame_timer[AC]) -- 内部カウンタが変化したか確認 then -- タイマー更新時の処理 if turn_UD_1P ~= memory.readwordsigned(add_turn_UD_1P[AC]) then -- 上下角度確認 turn_UD_diff_1P = -- 差分を求める math.abs(turn_UD_1P - memory.readwordsigned(add_turn_UD_1P[AC])) else turn_UD_diff_1P = 0 -- タイマーは更新したけど角度は変化せず。差分を0にする end turn_UD_1P = memory.readwordsigned(add_turn_UD_1P[AC]) -- 処理後に現在の値を読み込む(タイマー更新時のみ更新) else -- タイマーが更新されなかった場合の処理(何もしない場合は削除) end -- 表示 -- 画面左下に2列で表示 gui.text(2 , 224 , string.format("ANG_LR:%06d(%04d)" , -- 機体左右角度と差分を表示 memory.readwordsigned(add_turn_LR_1P[AC]) , turn_LR_diff_1P)) gui.text(2 , 232 , string.format("ANG_UD:%04d(%06.2f)" , -- 機体上下角度と実角度を表示。こっちの差分なんて不要か memory.readwordsigned(add_turn_UD_1P[AC]) , memory.readwordsigned(add_turn_UD_1P[AC]) * 0.087890625)) --[[(没)画面上部中央に1列で表示 gui.text(128,5,string.format("ANG:%06d(%04d),%04d(%06.2f)", memory.readwordsigned(add_turn_LR_1P[AC]) , turn_LR_diff_1P , memory.readwordsigned(add_turn_UD_1P[AC]) , memory.readwordsigned(add_turn_UD_1P[AC]) * 0.087890625)) ]] --[[■(没)画面右上に2列で表示 gui.text(240,1,string.format("ANG_LR:%06d(%04d)" , memory.readwordsigned(add_turn_LR_1P[AC]) , turn_LR_diff_1P)) gui.text(240,9,string.format("ANG_UD:%04d(%06.2f)", memory.readwordsigned(add_turn_UD_1P[AC]) , memory.readwordsigned(add_turn_UD_1P[AC]) * 0.087890625)) ]] -- 上下角度計描画 -- 何色で表示したものか -- gui.drawcircle(25, 178 , 25 , "#FFFFFF") -- 未実装なのか何か間違えているのかわからんけど、円描画はエラーが出て使えんね… gui.drawline(gonime_base_X , gonime_top_Y , gonime_base_X , gonime_btm_Y , "#E84820") -- 縦線 gui.drawline(gonime_base_X , gonime_base_Y , gonime_u_675_X , gonime_u_675_Y , "#F8F800") -- 上限界 gui.drawline(gonime_base_X , gonime_base_Y , gonime_d_675_X , gonime_d_675_Y , "#F8F800") -- 下限界 gui.drawline(gonime_base_X , gonime_base_Y , gonime_mdl_X , gonime_base_Y , "#38D038") -- 横線 gui.drawline(gonime_base_X , gonime_top_Y , gonime_u_675_X , gonime_u_675_Y , "#E84820") -- 上90度〜67.50度 gui.drawline(gonime_base_X , gonime_btm_Y , gonime_d_675_X , gonime_d_675_Y , "#E84820") -- 下90度〜67.50度 gui.drawline(gonime_u_675_X , gonime_u_675_Y , gonime_u_45_X , gonime_u_45_Y , "#F8F800") -- 上67.50度〜45度 gui.drawline(gonime_d_675_X , gonime_d_675_Y , gonime_d_45_X , gonime_d_45_Y , "#F8F800") -- 下67.50度〜45度 gui.drawline(gonime_u_45_X , gonime_u_45_Y , gonime_u_225_X , gonime_u_225_Y , "#F8F800") -- 上45度〜22.5度 gui.drawline(gonime_d_45_X , gonime_d_45_Y , gonime_d_225_X , gonime_d_225_Y , "#F8F800") -- 下45度〜22.5度 gui.drawline(gonime_u_225_X , gonime_u_225_Y , gonime_mdl_X , gonime_base_Y , "#F8F800") -- 上22.5度〜0度 gui.drawline(gonime_d_225_X , gonime_d_225_Y , gonime_mdl_X , gonime_base_Y , "#F8F800") -- 下22.5度〜0度 gui.drawline(gonime_base_X , gonime_base_Y , -- 上下角度によって回転する線を描画。長さ+1 gonime_base_X + (gonime_line_LG + 1) * math.cos((memory.readwordsigned(add_turn_UD_1P[AC]) * 0.087890625) * math.pi / 180) , gonime_base_Y + (gonime_line_LG + 1) * math.sin((memory.readwordsigned(add_turn_UD_1P[AC]) * 0.087890625) * math.pi / 180) , "#FFFFFF") gui.text(53 , gonime_base_Y - 3 , string.format("%06.2f" , -- 横線の横に角度表示 memory.readwordsigned(add_turn_UD_1P[AC]) * 0.087890625)) -- gui.text(25 , 144 , string.format("%06.2f" , -- 角度計の上に角度表示 -- memory.readwordsigned(add_turn_UD_1P[AC]) * 0.087890625)) -- ■メモ --[[ 線の座標と線の長さと角度がわかっている状態で線を回転させる場合、 線の固定したい点の座標から、線を回転させるために動かす点の座標を求めて線を引く。 動かす点の座標の求め方は X座標(横):"線の長さ * cos(角度)" Y座標(縦):"線の長さ * sin(角度)"、となる。 角度は度ではなく、ラジアン。度をラジアンに変換するには、 "度 * 円周率 / 180"となるため、 X座標(横):"線の長さ * cos(度 * 円周率 / 180)" Y座標(縦):"線の長さ * sin(度 * 円周率 / 180)"、となる。 ってラジアンもmath.rad()って関数を使えば良かったのね…面倒だしもうこれで良いや〜 ]] -- ■■■■■■■■■■ -- ジェネ残量:数値 gui.text(8 , 204 , string.format("%05d" , memory.readword(add_EN_curt_1P[AC]))) -- 数値だけ表示 --[[ 没にしたもの色々]] --[[ -- gui.text(8 , 204 , string.format("%06.2f" , memory.readword(add_EN_curt_1P[AC]) / -- (没)パーセントだけ表示 -- memory.readword(0x4541A)*100)) -- gui.text(8 , 204 , string.format("%05d/%06.2f" , memory.readword(add_EN_curt_1P[AC]) , -- (没)数値とパーセントを表示 -- memory.readword(add_EN_curt_1P[AC]) / memory.readword(add_EN_MAX_1P[AC]) * 100)) -- ■(没)ジェネ残量:数値/パーセント表示(ENゲージの右下辺りに表示) gui.text(24 , 190 , string.format("%05d" , memory.readword(add_EN_curt_1P[AC]))) gui.text(24 , 198 , string.format("%06.2f" , memory.readword(add_EN_curt_1P[AC]) / memory.readword(add_EN_MAX_1P[AC]) * 100)) ]] --[[ -- 前フレームからの差分を計算 -- なんか時々おかしくなるね…。ジェネ回復とブースター消費くらいしかまともに視認出来ないし、別にいらんかなぁ if ingame_timer ~= memory.readdword(add_ingame_timer[AC]) -- 内部カウンタが変化したか確認 then -- タイマー更新時の処理 if EN_1P ~= memory.readword(add_EN_curt_1P[AC]) then -- ジェネ残量が変化したか確認 EN_diff_1P = EN_1P - memory.readword(add_EN_curt_1P[AC]) -- 差分を求める elseif memory.readbyte(add_pause[AC]) == 01 -- ポーズ状態か確認 then EN_diff_1P = 0 -- ポーズではないので角度は変化無し。差分を0にする else -- ポーズ中、または変化無しなので何もしない end EN_1P = memory.readword(add_EN_curt_1P[AC]) -- 処理後に現在の値を読み込む(タイマー更新時のみ更新) else -- タイマーが更新されなかった場合の処理(何もしない場合は削除) end gui.text(8 , 204 , string.format("%05d(%04d)" , -- 数値と差分を表示 memory.readword(add_EN_curt_1P[AC]) , EN_diff_1P * -1)) ]] -- ■■■■■■■■■■ -- ロックオン中のみ距離計の値を表示 gui.transparency(tr) -- 透過度を元に戻す lockon_1P = memory.readword(add_lockon_1P[AC]) -- 不明値の値を読み込む if lockon_1P > 0 then -- 不明値が0以上ならロックオンしたと判断 gui.text(152 , 221 , string.format("%05d" , -- ロック距離を表示 memory.readword(add_range_meter[AC]))) end -- ■■■■■■■■■■ -- 被ロック警告灯表示処理 -- 被ロック警告灯点滅用カウンタ制御 if locked_count == 44 then -- 44フレーム(2秒)でカウンタをリセット。0〜43で2秒 locked_count = 0 -- カウンタをリセット end -- 点滅処理(透過度の変化のみ) -- フレーム更新確認用 if ingame_timer < memory.readdword(add_ingame_timer[AC]) -- 内部カウンタが変化したか確認 then -- タイマー更新時の処理 -- 透明度の変化処理 if locked_count <= 22 -- カウンタによって透過度の変化を変える then locked_tr =locked_count / 11 -- 透過度を上げていく else locked_tr = 4 - locked_count / 11 -- 透過度を下げていく end -- locked_tr = (math.cos(math.rad(locked_count * 360 / 44))) * 3 -- (没)コサインカーブを使って点滅。三角波を使いたかったけどよくわからん end --[[ -- (没)アホみたいな条件判定。これをズラズラ書いても処理速度的には問題無かったけど、もっとゆっくり綺麗に点滅させたかったので没 if -- 点滅用カウンタの値を基に透過率を変更 locked_count == 0 or locked_count == 1 or locked_count == 2 or locked_count == 3 then locked_tr = 0 elseif locked_count == 4 or locked_count == 5 or locked_count == 21 or locked_count == 22 then locked_tr = 0.5 -- (以下、カウンタが取り得る値を全部書くところまで省略) end ]] -- ↑ここまで被ロック警告灯点滅用 -- 被ロックオン警告表示 locked_1P = memory.readword(add_lockon_2P[AC]) -- 不明値を読み込む if locked_1P > 0 then -- 不明値が0以上ならロックオンされたと判断 gui.transparency(locked_tr) -- GUI透過度にロックオン警告用の透過度を適用 gui.drawbox(140 , 230 , 181 , 238 , "#E84820" , "#E84C24") -- 赤い四角を描画 gui.transparency(tr) -- GUI透過度を通常の値に戻す gui.text(146 , 231 , string.format("!LOCKED!")) -- !LOCKED!と表示 end locked_count = locked_count + 1 -- ■■■■■■■■■■ -- レーダーの周囲に方位計を表示 -- 中心点の座標から文字との距離と角度を使って縦横の座標を求めて、ズレを直した座標に文字を描画する -- 北 gui.text((compass_cen_X + compass_LG * math.cos((memory.readword(add_turn_LR_1P[AC]) % 4096 * 0.087890625 - 90) * math.pi / 180) - 1) , (compass_cen_Y + compass_LG * math.sin((memory.readword(add_turn_LR_1P[AC]) % 4096 * 0.087890625 - 90) * math.pi / 180) - 3) , string.format("N")) -- 東 gui.text((compass_cen_X + compass_LG * math.cos((memory.readword(add_turn_LR_1P[AC]) % 4096 * 0.087890625 - 0) * math.pi / 180) - 1) , (compass_cen_Y + compass_LG * math.sin((memory.readword(add_turn_LR_1P[AC]) % 4096 * 0.087890625 - 0) * math.pi / 180) - 3) , string.format("E")) -- 南 gui.text((compass_cen_X + compass_LG * math.cos((memory.readword(add_turn_LR_1P[AC]) % 4096 * 0.087890625 + 90) * math.pi / 180) - 1) , (compass_cen_Y + compass_LG * math.sin((memory.readword(add_turn_LR_1P[AC]) % 4096 * 0.087890625 + 90) * math.pi / 180) - 3) , string.format("S")) -- 西 gui.text((compass_cen_X + compass_LG * math.cos((memory.readword(add_turn_LR_1P[AC]) % 4096 * 0.087890625 + 180) * math.pi / 180) - 1) , (compass_cen_Y + compass_LG * math.sin((memory.readword(add_turn_LR_1P[AC]) % 4096 * 0.087890625 + 180) * math.pi / 180) - 3) , string.format("W")) --[[ レーダーの中心点:X:283,Y:80 中心と文字の距離:27 -- これより長いと現在選択中の武器の文字と被ってしまう。 角度:4096(0x1000)で1回転するため、%を使って4096で割った余りを使う ■文字に関して 文字は指定した座標が文字の左上部分となる。 文字の大きさ:幅:5,高さ:7 2文字以上続く場合、文字の最後の1ドットと次の文字の1ドット目が重なる 四角で背景を描画する場合、周囲1ドット分のスペースを設けるので幅7、高さ9となる 3文字以上の奇数文字の場合、小数点を使った座標になってしまって左右どちらか1ドットずらすしかなくなる? 方位計のように文字を動かす場合、文字の描画は指定した座標から右下へとズレたように表示されるので、 左上に位置を調整する必要がある。文字のサイズの半分だけズレせば良いと思っていたんだけど、 横に関してはなんとなく左へ2〜3ドットより1ドットだけ動かす方がそれっぽく見えるような…? 小数点が使えないので若干のズレに関しては妥協するしか無さそう。 ]] -- ■■■■■■■■■■ -- 上下エリアオーバーライン描画 -- 描画用座標計算 -- arealine_z_p1 = 46 -- 一番上の点 p1〜p2が上空オーバー arealine_z_p2 = memory.readwordsigned(add_z_U_over[AC]) + 32767 -- 上限界の点 p2〜p3が上警告ライン arealine_z_p3 = memory.readwordsigned(add_z_U_warn[AC]) + 32767 -- 上警告の点 p3〜p4が通常ライン arealine_z_p4 = memory.readwordsigned(add_z_D_warn[AC]) - 32767 -- 下警告の点 p4〜p5が下警告ライン arealine_z_p5 = memory.readwordsigned(add_z_D_over[AC]) - 32767 -- 下限界の点 p5〜p6が下方オーバー -- arealine_z_p6 = 206 -- 一番下の点 p1:p6/p2:p3/p4:p5/p3:p4 4本描画する -- 全体に対する割合を求め、描画用の高さに当てはめる arealine_z_p2 = arealine_z_p2 / 65536 * arealine_per arealine_z_p3 = arealine_z_p3 / 65536 * arealine_per arealine_z_p4 = arealine_z_p4 / 65536 * arealine_per arealine_z_p5 = arealine_z_p5 / 65536 * arealine_per -- 上下の端からの高さを求める -- arealine_z_p1 = 46 -- 上端 arealine_z_p2 = arealine_z_p2 + arealine_z_p1 arealine_z_p3 = arealine_z_p3 + arealine_z_p1 arealine_z_p4 = arealine_z_p6 + arealine_z_p4 arealine_z_p5 = arealine_z_p6 + arealine_z_p5 -- arealine_z_p6 = 206 -- 下端 -- 1Pの現在高度から描画用の高さを求める arealine_z_1P = memory.readwordsigned(add_z_1P[AC]) / 65536 * arealine_per -- 描画 -- 描画は後に描画したもので上書きされるので上書きされても良いものから順番に描画する -- gui.transparency(tr + 1) -- 透明度変更(他と合わせるので不使用) if memory.readwordsigned(add_z_U_warn[AC]) == 0 -- 上空警告ラインが0の場合 then gui.drawline(arealine_x , arealine_z_p1 , -- 全域を通常エリアとして描画 arealine_x , arealine_z_p6 , "#38D038") gui.drawline(arealine_x - 1 , arealine_z_p1 , arealine_x + 1 , arealine_z_p1 , "#38D038") gui.drawline(arealine_x - 1 , arealine_z_p6 , arealine_x + 1 , arealine_z_p6 , "#38D038") else gui.drawline(arealine_x , arealine_z_p1 -- 上下エリアオーバーライン全体描画(赤) , arealine_x , arealine_z_p6 , "#E84820") gui.drawline(arealine_x - 1 , arealine_z_p1 , arealine_x + 1 , arealine_z_p1 , "#E84820") gui.drawline(arealine_x - 1 , arealine_z_p6 , arealine_x + 1 , arealine_z_p6 , "#E84820") gui.drawline(arealine_x , arealine_z_p3 , -- 通常エリア描画(緑) arealine_x , arealine_z_p4 , "#38D038") gui.drawline(arealine_x - 1 , arealine_z_p3 , arealine_x + 1 , arealine_z_p3 , "#38D038") gui.drawline(arealine_x - 1 , arealine_z_p4 , arealine_x + 1 , arealine_z_p4 , "#38D038") gui.drawline(arealine_x , arealine_z_p2 , -- 上警告ライン描画(黄) arealine_x , arealine_z_p3 , "#F8F800") gui.drawline(arealine_x - 1 , arealine_z_p2 , arealine_x + 1 , arealine_z_p2 , "#F8F800") gui.drawline(arealine_x - 1 , arealine_z_p3 , arealine_x + 1 , arealine_z_p3 , "#F8F800") if memory.readwordsigned(add_z_D_warn[AC]) == 0 -- 下側警告ラインが0の場合 then gui.drawline(arealine_x , arealine_z_p5 , -- 下側を通常ラインとして描画(緑) arealine_x , arealine_z_p6 , "#38D038") gui.drawline(arealine_x - 1 , arealine_z_p6 , arealine_x + 1 , arealine_z_p6 , "#38D038") else gui.drawline(arealine_x , arealine_z_p5 , -- 下警告ライン描画(黄) arealine_x , arealine_z_p4 , "#F8F800") gui.drawline(arealine_x - 1 , arealine_z_p5 , arealine_x + 1 , arealine_z_p5 , "#F8F800") gui.drawline(arealine_x - 1 , arealine_z_p4 , arealine_x + 1 , arealine_z_p4 , "#F8F800") end end gui.drawline(arealine_x - 1 , (arealine_z_p1 + arealine_z_p6) / 2 , -- 高度0に横線を描画 arealine_x + 1 , (arealine_z_p1 + arealine_z_p6) / 2 , "#FFFFFF") gui.drawline(arealine_x - 1, arealine_z_1P + arealine_half , -- 1Pの現在高度描画(横線) arealine_x , arealine_z_1P + arealine_half , "#FFFFFF") gui.drawline(arealine_x - 2, arealine_z_1P + arealine_half - 1, -- 矢印っぽく表示 arealine_x - 2, arealine_z_1P + arealine_half + 1 , "#FFFFFF") gui.drawline(arealine_x - 3, arealine_z_1P + arealine_half - 2, -- 矢印っぽく表示 arealine_x - 3, arealine_z_1P + arealine_half + 2 , "#FFFFFF") -- gui.transparency(tr) -- 透明度を元に戻す(不使用) -- エリアオーバーラインと描画座標の確認用(非表示) --[[ -- 描画用の高さを表示 gui.text(100 , 100 , string.format("%06.5f" , arealine_z_1P)) gui.text(0 , 0 , string.format("P1:%06.5f P2:%06.5f P3:%06.5f" , arealine_z_p1 , arealine_z_p2 , arealine_z_p3)) gui.text(0 , 8 , string.format("P4:%06.5f P5:%06.5f P6:%06.5f" , arealine_z_p4 , arealine_z_p5 , arealine_z_p6)) -- エリアオーバーラインと警告ラインの高さを表示 gui.text(160 , 0 , string.format("P1:%06d P2:%06d P3:%06d" , -32767 , memory.readwordsigned(add_z_U_over[AC]) , memory.readwordsigned(add_z_U_warn[AC]))) gui.text(160 , 8 , string.format("P4:%06d P5:%06d P6:%06d" , memory.readwordsigned(add_z_D_warn[AC]) , memory.readwordsigned(add_z_D_over[AC]) , 32767)) ]] -- ↑ここまで上下エリアオーバーライン描画 -- ■■■■■■■■■■ -- 累計ダメージ表示処理 -- 累計被ダメージ表示処理 -- ↓ここからタイマー更新時のみ処理を行う if ingame_timer ~= memory.readdword(add_ingame_timer[AC]) -- 内部タイマーの更新を確認 then -- タイマー更新時の処理 -- ↓累計被ダメージ表示処理 if AP_1P ~= memory.readword(add_AP_curt_1P[AC]) -- 1PのAPが減ったか確認 then count_TD_1P = 22 -- APが減ったのでカウンタを最大化 total_damege_1P = math.abs(total_damege_1P + AP_1P - memory.readword(add_AP_curt_1P[AC])) -- 累計ダメージに現在のダメージを足す else -- APが減らなかった場合 count_TD_1P = count_TD_1P - 1 -- カウンタを1減らす end -- ↑累計被ダメージ表示処理完了 -- 累計与ダメージ表示処理 if AP_2P ~= memory.readword(add_AP_curt_2P[AC]) -- 2PのAPが減ったか確認 then count_TD_2P = 22 -- APが減ったのでカウンタを最大化 total_damege_2P = math.abs(total_damege_2P + AP_2P - memory.readword(add_AP_curt_2P[AC])) -- 累計ダメージに現在のダメージを足す else -- APが減らなかった場合 count_TD_2P = count_TD_2P - 1 -- カウンタを1減らす end -- ↑累計与ダメージ表示処理完了 -- AP確認用の変数を現在のAPに更新。タイマー更新時のみ更新しないとダメージ抜けが出る。APチェック後に更新すること AP_1P = memory.readword(add_AP_curt_1P[AC]) -- 1PのAPを現在のAPに更新 AP_2P = memory.readword(add_AP_curt_2P[AC]) -- 2PのAPを現在のAPに更新 -- タイマーが更新されなかった場合の処理(基本的に何もしない) -- else -- ■■何もエラーが出なかったら消してもOK end -- ↑ここまで内部タイマー更新時のみ処理 -- 開幕時の処理(戦闘中以外のAPの変化で累計ダメージを表示させないため) if memory.readword(add_event_timer[AC]) < 10 -- イベントタイマーを確認 then count_TD_1P = 0 -- 累計被ダメージを0にする count_TD_2P = 0 -- 累計与えるダメージを0にする end -- カウンタ確認&透明度変更&累計ダメージを表示 -- 累計被ダメージ表示 if count_TD_1P > 0 -- カウンタが残っているか確認 then tr_D_1P = 0 -- 累計被ダメージ透過度の変数を0にする gui.transparency(4 - count_TD_1P / 5.5) -- カウンタによって透過度を変化(ゆっくり消えていく) -- gui.drawbox(10 , 18 , 32 , 26 , "#E84820" , "#E84C24") -- 背景描画(ダメージなので赤) -- gui.drawbox(239 , 184 , 257 , 190 , "#E84820" , "#E84C24") -- 背景描画(相手ダメージなので緑)。DAMAGEDと被せる gui.drawbox(25 , 67 , 43 , 75 , "#E84820" , "#E84C24") -- 背景描画(ダメージなので赤) -- gui.transparency(tr_D_1P) -- 透過度に累計被ダメージ透過度を適用(表示する) -- gui.text(12,19,string.format("%04d", total_damege_1P/4)) -- 累計ダメージを表示。 -- gui.text(241,184,string.format("%04d", total_damege_1P/4)) -- 累計ダメージを表示。DAMAGEDと被せる gui.text(27,68,string.format("%04d", total_damege_1P/4)) -- 累計ダメージを表示。 else -- カウンタが無い場合 total_damege_1P = 0 -- 累計ダメージを0にする end --[[ -- ■ENゲージの右上辺りに表示 gui.drawbox(25 , 67 , 43 , 75 , "#E84820" , "#E84C24") -- 背景描画(ダメージなので赤) gui.text(27,68,string.format("%04d", total_damege_1P/4)) -- 累計ダメージを表示。 ]] -- 累計与ダメージ表示 if count_TD_2P > 0 -- カウンタが残っているか確認 then tr_D_2P = 0 -- 累計被ダメージ透過度の変数を0にする gui.transparency(4 - count_TD_2P / 5.5) -- カウンタによって透過度を変化(ゆっくり消えていく) -- gui.drawbox(39 , 56 , 61 , 64 , "#38D038" , "#38D43C") -- 背景描画(相手ダメージなので緑) -- gui.drawbox(239 , 176 , 257 , 182 , "#38D038" , "#38D43C") -- 背景描画(相手ダメージなので緑)。HITと被せる gui.drawbox(25 , 56 , 43 , 64 , "#38D038" , "#38D43C") -- 背景描画(相手ダメージなので緑) -- gui.transparency(tr_D_2P) -- 透過度に累計被ダメージ透過度を適用(表示する) -- gui.text(41,57,string.format("%04d", total_damege_2P/4)) -- 累計ダメージを表示。 -- gui.text(241,176,string.format("%04d", total_damege_2P/4)) -- 累計ダメージを表示。HITと被せる gui.text(27,57,string.format("%04d", total_damege_2P/4)) -- 累計ダメージを表示。 else -- カウンタが無い場合 total_damege_2P = 0 -- 累計ダメージを0にする end --[[ -- ■ENゲージの右上辺りに表示 gui.drawbox(25 , 56 , 43 , 64 , "#38D038" , "#38D43C") -- 背景描画(相手ダメージなので緑) gui.text(27,57,string.format("%04d", total_damege_2P/4)) -- 累計ダメージを表示。APを1/4してゲーム内表示値と合わせる ]] gui.transparency(tr) -- GUIの透過度を元に戻す -- ↑ここまでが累計ダメージ表示処理 -- ■■■■■■■■■■ -- リロードバー表示 -- フレーム更新確認用 if ingame_timer < memory.readdword(add_ingame_timer[AC]) -- 内部カウンタが変化したか確認 then -- タイマー更新時の処理 if reload_curt < memory.readbyte(add_reload_left[AC]) -- 残りリロードが前フレームより大きいか確認 then reload_max = memory.readbyte(add_reload_left[AC]) -- 現在の残りリロードをリロード最大値とする end reload_curt = memory.readbyte(add_reload_left[AC]) -- 現在の残りリロードの値を取得 end -- 表示 if memory.readbyte(add_reload_left[AC]) > 0 -- 残りリロードが0より大きいか確認(常時実行) then -- 残りリロードが0より大きい場合の処理 reload_zero = 0 -- 残りリロード0用の変数を初期化 gui.text(241 , 146 , string.format("%02d" , -- 残りリロード時間を表示 memory.readbyte(add_reload_left[AC]))) gui.transparency(tr + 0.75) -- 透過度を変更 gui.drawbox(250 , 147 , -- 残りリロード時間に応じたバーを表示 250 + 60 * memory.readbyte(add_reload_left[AC]) / reload_max , 152 , "#E84820" , "#E84C24") end -- 残りリロードが0なので表示しない -- リロードが0まで減った時の処理(少しだけ表示させる) if memory.readbyte(add_reload_left[AC]) == 0 -- 残りリロードが0か確認 then -- 残りリロードが0の場合の処理 if memory.readbyte(add_pause[AC]) ~= 00 then -- ポーズ中でないか確認 reload_zero = reload_zero + 1 -- リロード0用の変数に+1 else end if reload_zero < 11 -- リロード0用変数が11未満か確認 then -- リロード0用変数が11未満の場合の処理 gui.text(241 , 146 , -- 残りリロード時間を表示 string.format("%02d" , memory.readbyte(add_reload_left[AC]))) gui.drawbox(250 , 147 , 250.5 , 152 , -- 残りリロード時間に応じたバーを表示 "#E84820" , "#E84C24") else -- リロード0用変数が11以上 reload_zero = 11 -- リロード0用変数を11で固定 end end gui.transparency(tr) -- 透過度を元に戻す -- 残りリロードはブレード以外の全ての武器で共通のため、武器のリロードの値を取得して最大値にすると -- リロード中の切り替えで表示がおかしくなってしまうので残りリロードの値を使用。 -- 残りリロードの値が大きくなるのはリロードが完了して次に射撃した場合のみ。 -- また実際のリロードの最大値を取得するため、大半のキャノンの正確なリロードを最大値とすることができる。 -- ただし、実リロードの値の方が長くなる実グレとIRに関しては数フレームだけ残りリロードの値が -- 変化しないため、これだけは発射直後だけバーが止まってしまう -- 残りリロード0の処理で同じような処理を繰り返してるのが無駄っぽいなぁ… --[[ --確認用 gui.text(100 , 100 , string.format("%02d" , reload_curt)) gui.text(100 , 110 , string.format("%02d" , reload_max)) gui.text(100 , 120 , string.format("%02d" , memory.readbyte(add_reload_left[AC]))) ]] -- ■■■■■■■■■■■■■■■■■■■■ -- ↑ここまで戦闘中の処理 -- ■■■■■■■■■■ -- 戦闘中でなければGUIを削除 else gui.clearuncommitted() -- 全GUIを削除 end -- ■■■■■■■■■■ -- ループ前の処理(戦闘中、戦闘中以外でも実施) ingame_timer = memory.readdword(add_ingame_timer[AC]) -- 内部タイマー更新 -- ■■■■■■■■■■ --[[ -- フレーム更新確認用 if ingame_timer < memory.readdword(add_ingame_timer[AC]) -- 内部カウンタが変化したか確認 then -- タイマー更新時の処理 else -- タイマーが更新されなかった場合の処理(何もしない場合は削除) end -- 内部タイマーが動いた時(フレーム更新時)だけ処理をする -- 表示部分で使うと表示がチラつくのでそれ以外で使用すること! ]] -- ■■■■■■■■■■ --[[ 配列テスト --変数 reload_address = {} -- 配列を使う場合はまずこのように初期設定が必要らしい current_weapon = 0 -- --処理 reload_address = {0x454B3,0x454F1,0x4552F} current_weapon = memory.readbyte(0x451C9) + 1 gui.text(100,100,string.format("%02d",memory.readbyte(reload_address[current_weapon]))) ]] -- ■(作成中)■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■ -- ■(編集中)■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■ end)