Skip to content

Instantly share code, notes, and snippets.

@AltimorTASDK
Created August 23, 2022 22:22
Show Gist options
  • Save AltimorTASDK/4359b63e92da6de86596f0e4f73fef25 to your computer and use it in GitHub Desktop.
Save AltimorTASDK/4359b63e92da6de86596f0e4f73fef25 to your computer and use it in GitHub Desktop.
_dp("\n[chr019_mv_0.txt]");
// 行動リストテーブル
// Param2 : 1 前転振り向き処理をやらない
local t = {};
const def_ObjID_chat = 1; // チャット欄のコメントに割り振るオブジェクトID
local pat_num_NecoFukitobi = BMvEff.GetPatternNum( { datatype=0, pat="NecoFukitobi" } ); // パターン文字列のパターン番号を事前取得 よく使うので最初に定義
//-----------------------------------------------------------------------------
// 固有関数
//-----------------------------------------------------------------------------
/*
幸運の仕様
・EX,A~Eの6段階(5~0)
・初期値0
・EXはリストの先頭を返す
・採用するものが無かった場合ランクを一つ下げて再抽選、ランク0で見つからなかったらエラーとしてとりあえずインデックス0を返す。
・リストの持ち方は[抽選項目,必要幸運値]
[["FGO_S"],4],
[["Vtuber"],4],
[["Tmitter"],3],
[["FGO_C"],2],
[["Necocan"],2],
[["SOS"],1],
[["Light"],0],
[["Train"],0],
・リストには最低でも1つは必要幸運値0のものを入れる
・現在の幸運値と必要幸運値を比較し、3段階以上離れた値は不採用とする。一段階離れるごとに当選率が減る。
・幸運値の増減(PPで記憶)
同値以下が当選 :+1(最大+3まで)
同値より上が当選 :-1(0以下にはならない)
・幸運値の固定増加
体力一定量低下ごとに+1(5割以下で+1、3割以下で+2)
強制開放中+1
MD中+1
*/
local gachaPick = function( _moveList )
{
if( _moveList )
{
local now_gachaLuck = BMvTbl.GetPP(defc_PP_Chr019_GachaLuck); // 現在の幸運値
local use_gachaLuck = now_gachaLuck*50/100; // 計算に使用する幸運値(そのままだと増減の影響が大きいのでPPの半分の値を使う)
// 幸運値の固定増加
// 体力低下or強制開放中orムーンドライブ中だとガチャ運アップ
local hpval = BMvEff.SetHpGauge( { value=0 } );
if( hpval <= 3000 )
{
use_gachaLuck += 2; // 体力3000以下
}
else if( hpval <= 4500 )
{
use_gachaLuck += 1; // 体力4500以下
}
local gauge_status = BMvEff.Liberate_Get();
if( gauge_status == _SpGaugeMode_Liberate || gauge_status == _SpGaugeMode_OverLiberate ) use_gachaLuck += 2; // 強制開放中
if( tDDC.Moon_GetType() ) use_gachaLuck += 1; // ムーンドライブ中
// トレモ設定の幸運補正値の固定化処理
local fixedLuck = BMvEff.TM_GetCharaGauge(defcg_Chr019_Luck)
if( fixedLuck !=0 )
{
use_gachaLuck = fixedLuck - 1; // IDのデフォルトが0で1~6なので1引く
}
_dp("\n use_gachaLuck:"+use_gachaLuck);
// 幸運EX以上はリストの先頭を返す
if( use_gachaLuck >= 5 ) return 0;
// 幸運値が同じなら重み100として重み付き抽選。幸運値が一段階離れるごとに重み減少
local weightList = [100,50,20]; // 幸運値の差で重みが変わる
local weightsum = 0; // 抽選の重みの和
local loopflag = true; // ループフラグ
while( loopflag )
{
foreach( val in _moveList )
{
local luckLv = val[1]; // 必要幸運値
local luckDiff = abs(use_gachaLuck - luckLv); // 現在の幸運値との差の絶対値
if( luckDiff < weightList.len() )
{
weightsum += weightList[luckDiff]; // 基準を100として差があれば重み軽減
}
}
// 何も抽選されていないなら幸運値を1下げて再計算
if( weightsum == 0 && use_gachaLuck > 0 )
{
use_gachaLuck -= 1;
}
else if( weightsum > 0 )
{
loopflag = false; // 見つかったのでループ抜け
}
else
{
_dp("\n 抽選できるリストが無い");
return 0;
}
}
// 重みの和から乱数生成
local rand = BMvEff.Random_Limit(weightsum); // 乱数
local retIndex = 0; // 抽選結果
for( local ii = 0; ii < _moveList.len(); ii++ )
{
local luckLv = _moveList[ii][1]; // 必要幸運値
local luckDiff = abs(use_gachaLuck - luckLv); // 現在の幸運値との差の絶対値
// luckDiffが3未満なら採用
if( luckDiff < 3 )
{
// 乱数が重みの値未満なら当選(一般的な重み付き抽選処理)
local omomi = weightList[luckDiff];
if( omomi > rand )
{
retIndex = ii;
// 幸運値を変動する
local luckval = 0;
if( luckLv == 4 )
{
// 大当たり枠が出たら大きく減らす
luckval = BMvTbl.AddPP(defc_PP_Chr019_GachaLuck,-4);
}
else if( now_gachaLuck >= luckLv*2 ) // 現在値と比較(now_gachaLuckは1/2するので比較側を2倍)
{
// 同値以下が当選 :+1(最大+6まで)
luckval = BMvTbl.AddPP(defc_PP_Chr019_GachaLuck,1);
}
else
{
// 同値より上が当選 :-1(0以下にはならない)
luckval = BMvTbl.AddPP(defc_PP_Chr019_GachaLuck,-1);
}
if( luckval > 6 ) BMvTbl.SetPP(defc_PP_Chr019_GachaLuck,6);
if( luckval < 0 ) BMvTbl.SetPP(defc_PP_Chr019_GachaLuck,0);
break;
}
rand -= omomi; // 抽選対象外になったやつの重みを引く
}
}
// _dp("\n retIndex:"+retIndex);
return retIndex;
}
else
{
return 0;
}
}
// 超技級の技を出してるかどうか
local checkCallCharaSPAction = function()
{
local isCallCharaSPAction = BMvTbl.GetPP(defc_PP_Chr019_IsUseSPAction);
if( !isCallCharaSPAction )
{
// 相手プレイヤーのチェック
local enemy = BMvCore.GetNearEnemyCharaData();
if( enemy.push() )
{
if( BMvCore.GetCharaNo() == Def_ChrNo_Chr019 )
{
if( BMvTbl.GetPP(defc_PP_Chr019_IsUseSPAction)==1 ) isCallCharaSPAction = 1; // 相手が発動してても使用済み扱い
}
enemy.pop();
}
}
return isCallCharaSPAction;
}
//-----------------------------------------------------------------------------
// 挑発
//-----------------------------------------------------------------------------
// ネコシリーズは専用の挑発モーションへ
t.Mv_Neutral_Appeal <-
{
function Init_After()
{
local color = BMvTbl.GetPP(defc_PP_Chr019_NecoColor);
switch( color )
{
case 30:
case 31:
// ネコシエル
BMvTbl.JumpFrameID(513);
break;
case 32:
case 33:
// ネコアキハ
BMvTbl.JumpFrameID(514);
break;
case 34:
case 35:
// ネコヒスイ
BMvTbl.JumpFrameID(515);
break;
case 36:
case 37:
// ネココハク
BMvTbl.JumpFrameID(516);
break;
}
}
}
//-----------------------------------------------------------------------------
// しゃがみ歩き
//-----------------------------------------------------------------------------
t.Mv_Crouch_Wait <-
{
function FrameUpdate_After()
{
// しゃがみ歩き中にふりむくと変なので旧作と同様に振り向かないようにするため、専用のMvに飛ばす
local stick = BMvTbl.GetStickHold();
if( BMvTbl.CheckStickHold((1<<1)|(1<<3)) )
{
// しゃがみ歩きにFinalize
BMvTbl.SetFinalize(1024);
}
}
function Finalize() //
{
//MEMO:256と512はFrameUpdate_Stdから飛ばしているので番号変えたらダメ
Battle_Std.SwitchNextMoveTable("Mv_Crouch_toN", [256,"Mv_Furimuki_C"], [512,"Mv_Crouch_Appeal"],[1024,"Mv_Crouch_Walk"] ); //デフォ,[code,mv]...
}
}
t.Mv_Crouch_Walk <-
{
// パターンはMv_Crouch_Waitから引き継ぎ
fgp = Def_FGP_MoveAction, // 移動だけ
function Init_Std()
{
// スティックの向きで分岐
local stick = BMvTbl.GetStickHold();
if( stick == 1 )
{
BMvTbl.JumpFrameID(100);
}
else if( stick ==3 )
{
BMvTbl.JumpFrameID(300);
}
else
{
BMvTbl.SetFinalize(256); // コード256でFinalize
}
}
function FrameUpdate_Std()
{
// レバーが1か3じゃなかったら終わり
if( !( BMvTbl.CheckStickHold((1<<1)|(1<<2)|(1<<3)) ) )
{
BMvTbl.SetFinalize(0); // 立ち上がり
}
else if( BMvTbl.CheckStickHold((1<<2) ) )
{
BMvTbl.SetFinalize(256); // しゃがみ
}
}
function Finalize() //
{
Battle_Std.SwitchNextMoveTable("Mv_Crouch_toN", [256,"Mv_Crouch_Wait"] ); //デフォ,[code,mv]...
}
}
//-----------------------------------------------------------------------------
// 通常投げ
//-----------------------------------------------------------------------------
t.Mv_Throw_F <-
{
function FrameUpdate_After()
{
Battle_Std.JumpFrameID_NotHoldButton( { mask=(1<<0)|(1<<3), checkid=50, jumpid=51, } );
switch( Battle_Std.GetUpdateFrameID() )
{
case 60:
// 投げスカりからぶっぱへ進む
BMvTbl.SetFinalize(1024); // ネコアルク専用Finalize先(処理はStd側)
break;
}
}
}
//投げスカりからぶっぱ
t.Mv_Atk_ThrowMiss <-
{
atkflags = def_AtkTmplFlags_Enable,
fgp = Def_FGP_Invincibility,
function Init_After()
{
Battle_Std.MoveCodeEx.AddFlag( 1, def_MC1_ExtendAction ); // エクステンドアクション扱いにする
Battle_Std.MoveCodeEx.AddFlag( 7, def_MC7_Muteki );//無敵技
BMvTbl.SetLP(0,0); // 0:通常 1:ガードされた 2:攻撃終了
}
function FrameUpdate_After()
{
//端に到達するかガードされてたら弾かれる(シールドされた時は停止モーションに進む)
local mvs = BMvTbl.GetMvStatus();
local isShielded = Battle_Std.MoveCode.CheckFlag( def_MC_Shielded );
local isGuarded = (BMvTbl.GetLP(0)==1 && !isShielded);
if( ( mvs.Param3&1 && Battle_Std.CheckFromtCornerDistance_with_RoundEnd( 150 ) ) || isGuarded )
{
BMvTbl.SetPattern("ThrowMissBound");
BMvTbl.SetLP(0,2); // 攻撃終了
}
else if( isShielded )
{
BMvTbl.JumpFrameID(500); // 停止する
BMvTbl.SetLP(0,2); // 攻撃終了
}
switch( Battle_Std.GetUpdateFrameID(mvs) )
{
case 90:// ボイス再生 ここから無敵
Battle_Std.TypeSE_Play({ type="投げスカりからぶっぱ" });
Battle_Std.MoveCodeEx.AddFlag( 7, def_MC7_MutekiAnnounce );
BMvTbl.SetSkillLv(def_MVSL_Invincibility);//無敵技同士でのみ相殺
//アナウンス
BMvEff.AttackInfoString_Set({ word=def_AISW_Invincibility,} );
break;
}
}
function HitInterrupt_After()
{
// ガードされたら弾かれる この時点ではシールドされたかどうか分からんのでFrameUpdateで分岐させる
// 相手の当て身や攻撃判定同士の相殺時、走り続けるのがちょっと変なのでとりあえず終わるようにした
if( Battle_Std.CheckGuardTiming() )
{
BMvTbl.SetLP(0,1); // ガードされた
}
else if( Battle_Std.CheckSousaiHitTiming() )
{
BMvTbl.JumpFrameID(500); // 停止する
BMvTbl.SetLP(0,2); // 攻撃終了
}
}
}
// オプションキャラによる追撃が可能な投げ 受け身可能なので暴走アルクと同じように追撃不能を消す
t.Mv_Throw_F_Hit <-
{
function Init_After()
{
// 無敵で相手をつかみ開放の初期設定
Battle_Std.MutekiThrowRelease_Init();
Battle_Std.MoveCodeEx.AddFlag( 1, def_MC1_GenFlag );//LastUpdateの追撃不能を消す
}
function FrameUpdate_After()
{
// 無敵で相手を掴み開放
Battle_Std.MutekiThrowRelease( { FrameID=100, x=150, y=-0, type="無声ダウン" } );
}
}
t.Mv_Throw_A_Hit <-
{
function Init_After()
{
// 無敵で相手をつかみ開放の初期設定
Battle_Std.MutekiThrowRelease_Init();
}
function FrameUpdate_After()
{
// 無敵で相手を掴み開放
Battle_Std.MutekiThrowRelease( { FrameID=100, x=50, y=150, type="無声ダウン" } );
}
}
//-----------------------------------------------------------------------------
// 空中ダッシュ
//-----------------------------------------------------------------------------
local maketmpl_AirDash = function( param={} )
{
local ret_tmpl = {};
local mvParam =
{
stick = 6,
}
switch( param.type )
{
case "F":
mvParam.stick = 6;
break;
case "B":
mvParam.stick = 4;
break;
}
// Init_Afterだと最低高さ保証処理をリセットしてしまうのでInit_Beforeで
ret_tmpl.Init_Before <- function() : (mvParam)
{
// BMvTbl.SetLP(0,0);//空中ダッシュ後のレバーチェック Init_Stdで設定している
Battle_Std.InitVector(); //慣性ベクトルなどのクリア
}
ret_tmpl.FrameUpdate_After <- function() : (mvParam)
{
// レバー入れ続けると空中ダッシュ継続する
local mvs = BMvTbl.GetMvStatus();
local stick = BMvTbl.GetStickHold();
if( mvs.Param3==2 && stick != mvParam.stick ) // レバーが指定方向じゃない
{
BMvTbl.JumpFrameID(500); // 落下
}
}
return ret_tmpl;
}
t.Mv_AirDash_F <- maketmpl_AirDash( { type="F" } )
t.Mv_AirDash_B <- maketmpl_AirDash( { type="B" } )
//-----------------------------------------------------------------------------
// イベント
//-----------------------------------------------------------------------------
t.Mv_Startup <-
{
function Init_After()
{
// 超技のロック中かどうかオブジェクトから毎回本体プッシュせずにチェックするための管理オブジェクト
// BMvEff.CreateObject({ mvname="Mv_Null_SPActionProductionChecker" });
local neco_color = BMvTbl.GetSelectColor();
BMvTbl.SetPP(defc_PP_Chr019_NecoColor,neco_color); // オブジェクトからだとGetSelectColorでカラー取得できないことがあるのでPPにカラーを記憶
}
}
/*
// 超技のロック状態かどうかをPPに保存する ネコとか消したりするのに使う
// Battle_Std.EasyCheckCharaIsSPActionProduction(1) でまとめた
t.Mv_Null_SPActionProductionChecker <-
{
function Init_After()
{
BMvTbl.SetPattern(990); //非表示でパターン設定してないと0番のpatで色々なる
BMvTbl.SetPP(defc_PP_Chr019_IsSPActionProduction,0);// 超技のロック状態かどうか 0:通常 1:AD 2:LA
}
function Update_After()
{
// 毎フレーム超技のロック状態かどうかチェックする
local SPAction = 0;
local player = BMvCore.GetPlayerCharaData();
if( player.push() )
{
local mva = BMvTbl.GetMvAction();
if( Battle_Std.MoveCodeEx.CheckFlag( 3, def_MC3_SPActionProduction ) )
{
if( mva == def_MVA_LASkill )
{
SPAction=2;
}
else
{
SPAction=1;
}
}
player.pop();
}
local enemy = BMvCore.GetEnemyCharaData();
if( enemy.push() )
{
local mva = BMvTbl.GetMvAction();
if( Battle_Std.MoveCodeEx.CheckFlag( 3, def_MC3_SPActionProduction ) )
{
if( mva == def_MVA_LASkill )
{
SPAction=2;
}
else
{
SPAction=1;
}
}
enemy.pop();
}
BMvTbl.SetPP(defc_PP_Chr019_IsSPActionProduction,SPAction);
// デバッグ
{
local old = BMvTbl.GetPP(defc_PP_Chr019_IsSPActionProduction);
local easy = Battle_Std.EasyCheckCharaIsSPActionProduction(1);
if( old || easy )
{
local word = ( old != easy )? "★" : "";
_dpn("旧:"+old+" -> "+easy+" "+word);
}
}
}
}
*/
t.Mv_ConvertCharge <-
{
function Init_After()
{
//サングラスの有無をマスク処理で切り替える
// なし | 通常 | マスク
local rand = BMvEff.Random_Limit(100);
local mask = ( rand > 50 )? (1<<1) : (1<<2);//非表示にするレイヤー
BMvTbl.SetHan6LayerMask( { val=mask } );
}
function LastUpdate_After()
{
BMvTbl.SetHan6LayerMask( { val=0 } );
}
}
t.Mv_StandbyBlastWait <-
{
function Init_After()
{
//サングラスの有無をマスク処理で切り替える
// なし | 通常 | マスク
local rand = BMvEff.Random_Limit(100);
local mask = ( rand > 50 )? (1<<1) : (1<<2);//非表示にするレイヤー
BMvTbl.SetHan6LayerMask( { val=mask } );
}
function LastUpdate_After()
{
BMvTbl.SetHan6LayerMask( { val=0 } );
}
}
//-----------------------------------------------------------------------------
// 連打コンボ
//-----------------------------------------------------------------------------
t.Mv_Atk_RapidRelayAtk <-
{
function FrameUpdate_After()
{
switch( Battle_Std.GetUpdateFrameID() )
{
case 50:
Battle_Std.ChangeXVector_FromEnemyDistance( { frame=6, off_x=-75*128, par_x=60 } );//相手との距離が近い場合はNormalベクトルをへらす
break;
case 500: // 着地
BMvTbl.SetCommandLongDelay(2); //受付時間増加(先行入力用)
break;
}
}
function HitInterrupt_After()
{
if( Battle_Std.CheckHitTiming() )
{
/*
// ヒット時は浮きを少し低くしてRAが連続ガードになるように
local vec = BMvTbl.GetVector( { flags=_Vector_Normal } );
if( vec.y < 0 )
{
BMvTbl.SetVector({ y=vec.y*3/7 });
}
*/
}
}
}
local pat_num_RapidRelay_Finish = BMvEff.GetPatternNum( { datatype=0, pat="RapidRelay_Finish" } ); // パターン文字列のパターン番号を事前取得
t.Mv_Atk_RapidFinishAtk <-
{
function Init_After() : (pat_num_RapidRelay_Finish)
{
if( BMvTbl.ChangeMv_GetMvName()=="Mv_Atk_RapidRelayAtk" )
{
// 連打コンボから出した時は専用パターンに飛ぶ
BMvTbl.SetPattern(pat_num_RapidRelay_Finish);
BMvTbl.SetLP(0,0); // 専用パターン
}
else
{
BMvTbl.SetLP(0,1); // 3Cで出した
}
}
function FrameUpdate_After()
{
}
function HitInterrupt_After()
{
// ラピッドビートなら半ロック
if( Battle_Std.CheckDamageTiming_ExceptDown() && BMvTbl.GetLP(0)==0 )
{
Battle_Std.SetPosition_DamageHanteiRect( { power = 10 } );
}
}
}
//-----------------------------------------------------------------------------
// 通常技
//-----------------------------------------------------------------------------
t.Mv_Atk_StdA <-
{
function Init_After()
{
// ■レイヤー構造:通常レイヤ(1<<1) / ヒット時レイヤ(1<<2)
BMvTbl.SetHan6LayerMask( { val = (1<<2) } ); // ヒット時レイヤーは基本的に消しておく
BMvTbl.SetLP(0,0);
BMvTbl.SetLP(1,2);
}
function Update_After()
{
if( BMvTbl.GetLP(0)>0 )
{
BMvTbl.AddLP(0,-1);
if( BMvTbl.GetLP(0)<=0 )
{
BMvTbl.SetHan6LayerMask( { val = (1<<1) } ); // 通常レイヤーを消す
}
}
}
function HitInterrupt_After()
{
if( Battle_Std.CheckHitTiming() )
{
//
BMvTbl.SetLP(0, BMvTbl.GetLP(1) );
}
}
function LastUpdate_After()
{
BMvTbl.SetHan6LayerMask( { val = 0 } ); // レイヤーマスクを元に戻す
}
}
t.Mv_Atk_StdB <-
{
function FrameUpdate_After()
{
Battle_Std.SetPattern_NotHoldButton( { ButtonMask=(1<<1), CheckFrameID=50, EndFrameID=60, SetPattern="StdB_End", EndGuardFlag=_GuardFlag_ShieldXCrouch } ); // ボタンホールドしてなかったらパターンジャンプ
}
}
t.Mv_Atk_StdC <-
{
function Init_After()
{
}
}
t.Mv_Atk_CroA <-
{
function Init_After()
{
// ■レイヤー構造:通常レイヤ(1<<1) / ヒット時レイヤ(1<<2)
BMvTbl.SetHan6LayerMask( { val = (1<<2) } ); // ヒット時レイヤーは基本的に消しておく
BMvTbl.SetLP(0,0);
BMvTbl.SetLP(1,2);
}
function Update_After()
{
if( BMvTbl.GetLP(0)>0 )
{
BMvTbl.AddLP(0,-1);
if( BMvTbl.GetLP(0)<=0 )
{
BMvTbl.SetHan6LayerMask( { val = (1<<1) } ); // 通常レイヤーを消す
}
}
}
function HitInterrupt_After()
{
if( Battle_Std.CheckHitTiming() )
{
//
BMvTbl.SetLP(0, BMvTbl.GetLP(1) );
}
}
function LastUpdate_After()
{
BMvTbl.SetHan6LayerMask( { val = 0 } ); // レイヤーマスクを元に戻す
}
}
t.Mv_Atk_CroB <-
{
function Init_After()
{
BMvTbl.SetLP(0,0); // 何フレームホールドしたか
}
function Update_After()
{
// ホールドしたフレームをカウント
local mvs = BMvTbl.GetMvStatus();
if( mvs.FrameID == 50 )
{
BMvTbl.AddLP(0,1); // 何フレームホールドしたか
}
}
function FrameUpdate_After()
{
Battle_Std.SetPattern_NotHoldButton( { ButtonMask=(1<<1), CheckFrameID=50, EndFrameID=60, SetPattern="CroB_End" } ); // ボタンホールドしてなかったらパターンジャンプ
switch( Battle_Std.GetUpdateFrameID() )
{
case 100: // ヘッドスライディング
// ホールドしたフレームに応じて加速する
local charge = BMvTbl.GetLP(0); // 何フレームホールドしたか
BMvTbl.SetVector( { x=charge*100, flags=_VecFlag_Add } );
break;
}
}
function HitInterrupt_After()
{
// ガード不能のズーム処理
if( Battle_Std.CheckDamageTiming_ExceptDownFrameID( 200 ) )
{
Battle_Std.SetPosition_DamageHanteiRect( { power=100, flags=(1<<2) } );// flags=(1<<2)は空中やられ以外に設定するとバグるので注意
}
if( Battle_Std.SetImpactHitEffect( { frameid=200, offx=150, offy=-25 } ) ) // 追撃不能ガード不能
{
}
}
function Finalize_Std() //
{
if( Battle_Std.MoveCodeEx.CheckFlag( 1, def_MC1_ExtendAction ))
{
BMvTbl.SetFinalizeCode(256); //エクステンドしてたら立ちへ(戻りの絵が違うため)
}
Battle_Std.SwitchNextMoveTable("Mv_Crouch_Wait", [256,"Mv_Neutral"] );
}
}
t.Mv_Atk_CroC <-
{
function Init_After()
{
}
}
t.Mv_Atk_AirA <-
{
function Init_After()
{
// ■レイヤー構造:通常レイヤ(1<<1) / ヒット時レイヤ(1<<2)
BMvTbl.SetHan6LayerMask( { val = (1<<2) } ); // ヒット時レイヤーは基本的に消しておく
BMvTbl.SetLP(0,0);
BMvTbl.SetLP(1,2);
}
function Update_After()
{
local mvs = BMvTbl.GetMvStatus();
if( mvs.Param2 & 4 )
{
if( BMvTbl.GetLP(0)>0 )
{
BMvTbl.AddLP(0,-1);
if( BMvTbl.GetLP(0)<=0 )
{
BMvTbl.SetHan6LayerMask( { val = (1<<1) } ); // 通常レイヤーを消す
}
}
}
}
function FrameUpdate_After()
{
local mvs = BMvTbl.GetMvStatus();
if( mvs.Param2 & 4 )
{
}
else
{
BMvTbl.SetHan6LayerMask( { val = (1<<2) } ); // ヒット時レイヤーは基本的に消しておく
}
}
function HitInterrupt_After()
{
if( Battle_Std.CheckHitTiming() )
{
//
BMvTbl.SetLP(0, BMvTbl.GetLP(1) );
}
}
function LastUpdate_After()
{
BMvTbl.SetHan6LayerMask( { val = 0 } ); // レイヤーマスクを元に戻す
}
}
t.Mv_Atk_AirB <-
{
function Init_After()
{
}
}
// レバーで左右にぐねぐね動く
local set_JumpCtrlVector = function()
{
local vec = BMvTbl.GetVector();
local x = 0; //移動させるベクトル量
local plus_x = 96; //1F毎に変化させる値
if( ( BMvTbl.CheckStickHold( (1<<4) | (1<<7) | (1<<1) ) ) && vec.x > -1000 ) x -= plus_x;
if( ( BMvTbl.CheckStickHold( (1<<6) | (1<<9) | (1<<3) ) ) && vec.x < 1000 ) x += plus_x;
if( x )
{
vec.x += x;
BMvTbl.SetVector( { x=vec.x, flags=_Vector_Normal } );
}
}
t.Mv_Atk_AirC <-
{
function Init_After()
{
}
function FrameUpdate_After() : (set_JumpCtrlVector)
{
Battle_Std.SetPattern_NotHoldButton( { ButtonMask=(1<<2), CheckFrameID=50, EndFrameID=60, SetPattern="AirC_End" } ); // ボタンホールドしてなかったらパターンジャンプ
// BE版に派生したらレバーでちょっと動けるようにする
if( Battle_Std.MoveCodeEx.CheckFlag( 1, def_MC1_ExtendAction ) )
{
set_JumpCtrlVector();
}
}
function HitInterrupt_After()
{
if( Battle_Std.CheckGuardTiming() )
{
//一回ガードしたら上段化
BMvTbl.SetAtkGuardFlag( { guard=_GuardFlag_GuardCrouch|_GuardFlag_GuardAir, time=64, flag=_ClearFlag_ChangeMv } );
}
}
}
t.Mv_Atk_Std6A <-
{
function FrameUpdate_After()
{
Battle_Std.SetPattern_NotHoldButton( { ButtonMask=(1<<0), CheckFrameID=50, EndFrameID=60, SetPattern="6A_End" } ); // ボタンホールドしてなかったらパターンジャンプ
// 画面端の回り込みで相手を裏回るように座標調整
local mvs = BMvTbl.GetMvStatus();
if( mvs.FrameID == 100 && Battle_Std.CheckEnemyisBound() )
{
// 裏回り
local ppos = BMvTbl.GetPosition( 0 );
local epos = Battle_Std.GetEnemyPosition();
if( ppos.x == epos.x )
{
local set_pos_x = ppos.x - ( 128*10*BMvTbl.GetMuki() );
// print("\n 調整 epos.x:"+epos.x/128+" > "+set_pos_x/128 );
local enemy = BMvCore.GetEnemyCharaData();
if( enemy.push() )
{
BMvTbl.SetPosition( { x=set_pos_x } ); // 矯正
enemy.pop();
}
}
}
}
function HitInterrupt_After()
{
if( Battle_Std.CheckDamageTiming_FrameID(100) && !Battle_Std.RoundisEnd() )
{
// ラウンド終了してなければ分岐
BMvTbl.JumpFrameID(200);
}
Battle_Std.SetThrowHitFinalize(256); // ヒット分岐ファイナライズ
}
function Finalize()
{
Battle_Std.SwitchNextMoveTable("Mv_Neutral", [256, "Mv_Atk_6A_Throw_Hit" ] ); //デフォ,[code,mv]...
}
};
local pat_num_6A_Throw_Hit = BMvEff.GetPatternNum( { datatype=0, pat="6A_Throw_Hit" } ); // パターン文字列のパターン番号を事前取得
t.Mv_Atk_6A_Throw_Hit <-
{
atkflags = def_AtkTmplFlags_Enable,
flags = def_TmplFlags_ChangeStatusOnly, //状態の移行のみを行う
function Init_After() : (pat_num_6A_Throw_Hit)
{
// 無敵で相手をつかみ開放の初期設定
Battle_Std.MutekiThrowRelease_Init();
}
function FrameUpdate_After()
{
// 無敵で相手を掴み開放
Battle_Std.MutekiThrowRelease( { FrameID=100, x=150, y=-0, type="無声ダウン" } );
}
}
t.Mv_Atk_Std6C <-
{
function FrameUpdate_After()
{
}
};
local pat_num_Hit_6CC = BMvEff.GetPatternNum( { datatype=0, pat="Hit_6CC" } ); // パターン文字列のパターン番号を事前取得
t.Mv_Atk_6C_6C <- {
atkflags = def_AtkTmplFlags_Enable,
function HitInterrupt_After() : (pat_num_Hit_6CC)
{
if( Battle_Std.CheckHitTiming() )
{
local eff = BMvEff.CreateObject( {start_pat=pat_num_Hit_6CC,} );
if( eff.push() )
{
BMvEff.SetObjectFlags( { flags=_ObjFlags_EraseParentPatChange|_ObjFlags_NoGround } )
eff.pop();
}
}
}
};
t.Mv_Atk_6C_6C_6C <- {
atkflags = def_AtkTmplFlags_Enable,
function Init_After()
{
Battle_Std.MoveCodeEx.AddFlag( 7, def_MC7_ExorHigherCancelOnly );//EX必殺技以上でのみキャンセル可
Battle_Std.MoveCodeEx.AddFlag( 1, def_MC1_NoAtkCansel ); //通常Cは可能だけどジャンプキャンセルのみにする
}
};
t.Mv_Atk_Air2B <-
{
function Init_After()
{
Battle_Std.InitVector(); //慣性ベクトルなどのクリア
}
}
t.Mv_Atk_Air2C <-
{
function FrameUpdate_After() : (set_JumpCtrlVector)
{
// 動けるようにする
local mvs = BMvTbl.GetMvStatus();
if( mvs.Param3&4 )
{
set_JumpCtrlVector();
}
}
}
//-----------------------------------------------------------------------------
// 236攻
//-----------------------------------------------------------------------------
local maketmpl_SkillEyeBeam = function( param={} )
{
local ret_tmpl = {};
local mvParam =
{
ball = 0,
}
switch( param.type )
{
case "A":
mvParam.ball = { x=0, y=0, mv="Mv_FireBall_236A", pat="Rc236A" };
break;
case "B":
mvParam.ball = { x=0, y=0, mv="Mv_FireBall_236B", pat="Rc236B" };
break;
case "EX":
mvParam.ball = { x=0, y=0, mv="Mv_FireBall_236EX", pat="Rc236EX" };
break;
case "BC":
mvParam.ball = { x=0, y=0, mv="Mv_FireBall_236BC", pat="Rc236BC" };
break;
}
ret_tmpl.Init_After <- function() : (mvParam)
{
}
ret_tmpl.FrameUpdate_After <- function() : (mvParam)
{
switch( Battle_Std.GetUpdateFrameID() )
{
case 100:
if( mvParam.ball )
{
local ball = Battle_Std.CreateFireBall( mvParam.ball );
}
break;
}
}
ret_tmpl.LastUpdate_After <- function() : (mvParam)
{
}
return ret_tmpl;
}
t.Mv_Skill_236A <- maketmpl_SkillEyeBeam( { type="A" } );
t.Mv_Skill_236B <- maketmpl_SkillEyeBeam( { type="B" } );
t.Mv_Skill_236EX <- maketmpl_SkillEyeBeam( { type="EX" } );
t.Mv_Skill_236BC <- maketmpl_SkillEyeBeam( { type="BC" } );
t.Mv_FireBall_236A <-
{
flags=def_FBTmplFlags_NewTypeFireBall,
function Init_After()
{
BMvEff.SetObjectFlags({ flags=_ObjFlags_ParentMove|_ObjFlags_EraseParentPatChange });
}
function FrameUpdate_After()
{
}
}
t.Mv_FireBall_236B <- t.Mv_FireBall_236A;
t.Mv_FireBall_236EX <- t.Mv_FireBall_236A;
t.Mv_FireBall_236BC <- t.Mv_FireBall_236A;
//-----------------------------------------------------------------------------
// 22攻
//-----------------------------------------------------------------------------
t.Mv_Skill_0202A <-
{
function Init_After()
{
}
function FrameUpdate_After()
{
Battle_Std.SetPattern_NotHoldButton( { ButtonMask=(1<<0), CheckFrameID=150, EndFrameID=160, SetPattern="0202A_End" } ); // ボタンホールドしてなかったらパターンジャンプ
local update_id = Battle_Std.GetUpdateFrameID();
switch( update_id )
{
case 100:
case 150: // ホールドチェック中
case 160: // BE版派生確定
local ball = Battle_Std.CreateFireBall( { mv="Mv_FireBall_0202A", pat="Rc0202A" } );
if( ball.push() )
{
BMvEff.SetObjectFlags( { flags=_ObjFlags_ToParentHitBack } );
ball.pop();
}
break;
}
}
}
t.Mv_FireBall_0202A <- Battle_Std.MakeFireBallTmpl( { BlockedJumpID=900 } );
// ネコ吐き出す方
local maketmpl_SkillVomiting = function( param={} )
{
local ret_tmpl = {};
local mvParam =
{
necoParam = 0,
isEX = 0,
}
switch( param.type )
{
case "B":
mvParam.necoParam =
{
[0] = { neco_mv = { mvname="Mv_LandObj_JumpInNeco" }, neco_vec ={ x=1000, y=-3000, addy=200, flags=_Vector_Normal }, rand_baseVec = 300 },
};
break;
case "EX":// アバドンベレー
mvParam.isEX = 1; // ネコが沢山出ていても確定で呼び出す
mvParam.necoParam =
{
[0] = { neco_mv = { x=20*128, y=-5*128, mvname="Mv_AtkLandObj_AbaddonBeret" }, neco_vec = { x=1200+500, y=-1900, addy=40, flags=_Vector_Normal }, rand_baseVec = 0 },
[1] = { neco_mv = { x=10*128, y=-5*128, mvname="Mv_AtkLandObj_AbaddonBeret1", start_pat="AbaddonBeret" }, neco_vec = { x=1400+500, y=-950, addy=20, flags=_Vector_Normal }, rand_baseVec = 0 },
[2] = { neco_mv = { x=0, y=-5*128, mvname="Mv_AtkLandObj_AbaddonBeret2", start_pat="AbaddonBeret" }, neco_vec = { x=1600+500, y=0, addy=0, flags=_Vector_Normal }, rand_baseVec = 0 },
};
break;
case "BC":
mvParam.necoParam =
{
[0] = { neco_mv = { mvname="Mv_LandObj_JumpInNeco" }, neco_vec ={ x=1200, y=-3300, addy=200, flags=_Vector_Normal }, rand_baseVec = 200 },
[1] = { neco_mv = { mvname="Mv_LandObj_JumpInNeco" }, neco_vec ={ x=500, y=-3000, addy=200, flags=_Vector_Normal }, rand_baseVec = 100 },
};
break;
}
ret_tmpl.FrameUpdate_After <- function() : (mvParam)
{
local update_id = Battle_Std.GetUpdateFrameID();
switch( update_id )
{
case 100:
for( local ii=0; ii < mvParam.necoParam.len(); ii++ )
{
if( mvParam.necoParam[ii].neco_mv )
{
// ネコが出現最大数未満かEXなら呼び出す
if( BMvTbl.GetPP( defc_PP_Chr019_NecoCount ) < defc_Chr019_NecoMax || mvParam.isEX )
{
local neco = BMvEff.CreateObject( mvParam.necoParam[ii].neco_mv );
if( neco.push() )
{
// 親にヒット情報を伝える(親の行動ユニークIDが変わると伝わらない)
BMvEff.SetObjectFlags({ flags=_ObjFlags_ToParentHitStatus });
// ランダムで加速
local vec = clone mvParam.necoParam[ii].neco_vec;
if( mvParam.necoParam[ii].rand_baseVec )
{
local rand = BMvEff.Random_Limit( 5 )
vec.x += mvParam.necoParam[ii].rand_baseVec * rand;
vec.y -= mvParam.necoParam[ii].rand_baseVec*25/100 * rand;
}
BMvTbl.SetVector( vec );
neco.pop();
}
}
}
}
break;
}
}
return ret_tmpl;
}
t.Mv_Skill_0202B <- maketmpl_SkillVomiting( { type="B" } );
t.Mv_Skill_0202EX <- maketmpl_SkillVomiting( { type="EX" } );
t.Mv_Skill_0202BC <- maketmpl_SkillVomiting( { type="BC" } );
//EX属性にするためAtkに変更
t.Mv_AtkLandObj_AbaddonBeret <-
{
function Init_After()
{
// ネコ登場数カウント
BMvTbl.AddPP(defc_PP_Chr019_NecoCount,1);
BMvEff.SetObjectFlags( { flags=_ObjFlags_RenderShadow|_ObjFlags_NoRenderOrder } );
//必殺技のオブジェクト扱いにして生成される飛び道具も必殺技にする(skill bonus用)
Battle_Std.MoveCode.AddFlag( def_MC_Skill );//スキルボーナス用必殺技フラグ
BMvTbl.SetLP(2,0); // 親の被弾で消えたら1
}
function FrameUpdate_After() : (pat_num_NecoFukitobi)
{
// 超技のロック中は即消える
if( Battle_Std.EasyCheckCharaIsSPActionProduction(1) != 0 )
{
BMvTbl.SetFinalize();
}
Battle_Std.CheckNecoHasseiHosyou_Param1( pat_num_NecoFukitobi, 2 ); // Param1&1のときは親の被弾で消える( 処理後はSetLP(x,1) )
}
function HitInterrupt_After()
{
if( Battle_Std.CheckDamageTiming() )
{
BMvTbl.AddComboRate();
}
}
function LastUpdate_After()
{
// ネコ登場数減算
BMvTbl.AddPP(defc_PP_Chr019_NecoCount,-1);
}
}
t.Mv_AtkLandObj_AbaddonBeret1 <- t.Mv_AtkLandObj_AbaddonBeret;
t.Mv_AtkLandObj_AbaddonBeret2 <- t.Mv_AtkLandObj_AbaddonBeret;
//-----------------------------------------------------------------------------
// 214攻
//-----------------------------------------------------------------------------
local maketmpl_SkillWarp = function( param={} )
{
local ret_tmpl = {};
local mvParam =
{
dummy_neco = 0, // 分身の座標
}
switch( param.type )
{
case "A":
mvParam.dummy_neco = { neco1_pos = 300*128, neco2_pos = 700*128 };
break;
case "B":
mvParam.dummy_neco = { neco1_pos = -500*128, neco2_pos = 300*128 };
break;
case "C":
mvParam.dummy_neco = { neco1_pos = -500*128, neco2_pos = -900*128 };
break;
case "BC":
break;
}
ret_tmpl.flags <- def_TmplFlags_NoSurinuke;
ret_tmpl.Init_After <- function()
{
}
ret_tmpl.FrameUpdate_After <- function() : (mvParam)
{
switch( Battle_Std.GetUpdateFrameID() )
{
case 100://穴から出る
BtlPl.SetPos_ExcessGamenHajiX({ off_x=100*128 });//画面端近い時は調整
// ランダムで出現位置をずらす
local rand1 = BMvEff.Random_Limit(200)*128;
local rand2 = BMvEff.Random_Limit(200)*128;
// ネコが出現最大数未満なら呼び出す
if( mvParam.dummy_neco && BMvTbl.GetPP( defc_PP_Chr019_NecoCount ) < defc_Chr019_NecoMax )
{
BMvEff.CreateObject( { x=mvParam.dummy_neco.neco1_pos+rand1, mvname="Mv_LandObj_DummyNeco" } );
BMvEff.CreateObject( { x=mvParam.dummy_neco.neco2_pos+rand2, mvname="Mv_LandObj_DummyNeco" } );
}
break;
}
}
return ret_tmpl;
}
t.Mv_Skill_214A <- maketmpl_SkillWarp( { type="A" } );
t.Mv_Skill_214B <- maketmpl_SkillWarp( { type="B" } );
t.Mv_Skill_214C <- maketmpl_SkillWarp( { type="C" } );
t.Mv_Skill_214BC <- maketmpl_SkillWarp( { type="BC" } );
t.Mv_LandObj_DummyNeco <-
{
function Init_After()
{
// ネコ登場数カウント
BMvTbl.AddPP(defc_PP_Chr019_NecoCount,1);
BMvEff.SetObjectFlags( { flags=_ObjFlags_RenderShadow|_ObjFlags_NoRenderOrder } );
Battle_Std.MoveCode.AddFlag( def_MC_Skill );//スキルボーナス用必殺技フラグ
}
function FrameUpdate_After()
{
// 超技のロック中は即消える
if( Battle_Std.EasyCheckCharaIsSPActionProduction(1) != 0 )
{
BMvTbl.SetFinalize();
}
switch( Battle_Std.GetUpdateFrameID() )
{
case 110:
if( BMvEff.Random_Limit(100) >= 75 )
{
BMvTbl.SetPattern(222); // 攻撃判定ありで飛ぶ
}
break;
}
}
function HitInterrupt_After()
{
if( Battle_Std.CheckDamageTiming() )
{
BMvTbl.AddComboRate();
}
}
function LastUpdate_After()
{
// ネコ登場数減算
BMvTbl.AddPP(defc_PP_Chr019_NecoCount,-1);
}
}
//-----------------------------------------------------------------------------
// 623攻
//-----------------------------------------------------------------------------
local maketmpl_SkillSideStep = function( param={} )
{
local ret_tmpl = {};
local mvParam =
{
isMuteki = 0,
dmgMv = 0,
}
switch( param.type )
{
case "A":
break;
case "B":
mvParam.isMuteki = 1;
ret_tmpl.fgp <- Def_FGP_Invincibility;
break;
case "BC":
break;
case "EX":
mvParam.dmgMv = "Mv_Skill_623EX_Hit";
mvParam.isMuteki = 1;
ret_tmpl.fgp <- Def_FGP_Invincibility;
break;
}
ret_tmpl.Init_After <- function() : (mvParam)
{
if( mvParam.isMuteki )
{
Battle_Std.MoveCodeEx.AddFlag( 7, def_MC7_Muteki );//無敵技
}
}
ret_tmpl.FrameUpdate_After <- function() : (mvParam)
{
Battle_Std.Chr019.SideStepAfterImageUpdate(); // 残像出す
}
ret_tmpl.HitInterrupt_After <- function() : (mvParam)
{
if( mvParam.dmgMv )
{
// ロックしたら分岐
Battle_Std.SetThrowHitFinalize(100);
}
}
ret_tmpl.LastUpdate_After <- function() : (mvParam)
{
BMvEff.PcAfterImage_Clear();
}
if( mvParam.dmgMv )
{
ret_tmpl.Finalize <- function() : (mvParam)
{
Battle_Std.SwitchNextMoveTable("Mv_Neutral", [100, mvParam.dmgMv ] ); //デフォ,[code,mv]...
}
}
return ret_tmpl;
}
t.Mv_Skill_623A <- maketmpl_SkillSideStep( { type="A" } );
t.Mv_Skill_623B <- maketmpl_SkillSideStep( { type="B" } );
t.Mv_Skill_623EX <- maketmpl_SkillSideStep( { type="EX" } );
t.Mv_Skill_623BC <- maketmpl_SkillSideStep( { type="BC" } );
t.Mv_Skill_623EX_Hit <-
{
function EraceWhiteFade()
{
if( BMvTbl.GetLP(0)==0 )
{
BMvTbl.SetLP(0,1);//画面戻したかどうか
BMvEff.SetExist( { level = _Exist_NoWall, mode=_ExistMode_Erase } ); // 画面外判定チェックを戻す
BMvEff.FadeProc_Set( { type=0, time=[0,10,10] color=0xFFFFFF } ); //
BMvEff.SetCamera_Quake( { clear=1 } );
}
}
function Init_After()
{
BMvEff.FadeProc_Set( { type=0, time=[0,1,10] color=0xFFFFFF } );//ホワイトインで位置調節を分かりにくくする
BMvEff.SetExist( { level = _Exist_NoWall } ); // 画面外で行動する場合があるので壁判定解除
BMvTbl.SetLP(0,0);//画面戻したかどうか
BMvEff.ThrowParam( { x=100, y=0, pattern=607 } );
BMvEff.ThrowChara_SetCamera( 1 );//投げているキャラをカメラ処理に含める
// 無敵で相手をつかみ開放の初期設定
Battle_Std.MutekiThrowRelease_Init();
BMvEff.ThrowChara_SetJoint( 0 );
}
function FrameUpdate_After()
{
Battle_Std.Chr019.SideStepAfterImageUpdate();// 残像
// 無敵で相手を掴み開放
Battle_Std.MutekiThrowRelease( { FrameID=500, x=100, y=0, type="垂直きりもみ浮き_D1", flags=_ThrowRelease_NoGroundRecover|_ThrowRelease_NoAttackHit } );
switch( Battle_Std.GetUpdateFrameID() )
{
case 400: //光体化タイミング
BMvEff.PcAfterImage_Clear();// 残像は消す
BMvEff.SetCamera_Quake( { time=150, type=2, clear=0, } ); //揺らし
BMvEff.FadeProc_Set( { type=0, time=[150,999,10] color=0xFFFFFF } ); //
break;
case 500: //フィニッシュ
EraceWhiteFade();
break;
}
BtlPl.SetPos_CaptureGamenHajiXHosei();//つかみ相手が画面外なら互いに中央にシフト
}
function LastUpdate_After()
{
BMvEff.PcAfterImage_Clear();
EraceWhiteFade();
BMvEff.ThrowChara_SetCamera( 0 );//投げているキャラをカメラ処理に含める解除
BMvEff.ThrowChara_SetJoint( 1 ); // 切り離すを戻す
}
}
//-----------------------------------------------------------------------------
// J236攻
//-----------------------------------------------------------------------------
local maketmpl_SkillAirCrowFireBall = function( param={} )
{
local ret_tmpl = {};
ret_tmpl.fgp <- Def_FGP_ShotFireBall;
local mvParam =
{
ballst = 0,
}
switch( param.type )
{
case "A":
mvParam.ballst = { mv="Mv_FireBall_J236A", pat="BallJ236A", x= 50, y=-200, vec=Battle_Std.GetVector_FromAngle( { angle=4000, speed=3000 } ) };
break;
case "B":
mvParam.ballst = { mv="Mv_FireBall_J236B", pat="BallJ236A", x= 50, y=-200, vec=Battle_Std.GetVector_FromAngle( { angle=4000, speed=3000 } ) };
break;
case "BC":
mvParam.ballst = { mv="Mv_FireBall_J236BC", pat="BallJ236BC", x= 50, y=-200, vec=Battle_Std.GetVector_FromAngle( { angle=3900, speed=5000 } ) };
break;
case "EX":
mvParam.ballst = { mv="Mv_FireBall_J236EX", pat="BallJ236EX", x= 50, y=-200, vec=Battle_Std.GetVector_FromAngle( { angle=3700, speed=5250 } ) };
break;
}
ret_tmpl.Init_After <- function() : (mvParam)
{
}
ret_tmpl.FrameUpdate_After <- function() : (mvParam)
{
switch( Battle_Std.GetUpdateFrameID() )
{
case 100:
if( mvParam.ballst ) Battle_Std.CreateFireBall( mvParam.ballst );
break;
}
}
return ret_tmpl;
}
t.Mv_Skill_J236A <- maketmpl_SkillAirCrowFireBall( { type="A" } );
t.Mv_Skill_J236B <- maketmpl_SkillAirCrowFireBall( { type="B" } );
t.Mv_Skill_J236EX <- maketmpl_SkillAirCrowFireBall( { type="EX" } );
t.Mv_Skill_J236BC <- maketmpl_SkillAirCrowFireBall( { type="BC" } );
local pat_num_350_ballgrp = BMvEff.GetPatternNum( { datatype=0, pat="350_ballgrp" } );
local pat_num_350_ballgrp_end = BMvEff.GetPatternNum( { datatype=0, pat="350_ballgrp_end" } );
local pat_num_350_ballgrpEX = BMvEff.GetPatternNum( { datatype=0, pat="350_ballgrpEX" } );
local pat_num_350_ballgrpEX_end = BMvEff.GetPatternNum( { datatype=0, pat="350_ballgrpEX_end" } );
local makeTmpl_CrowFireBall = function( param={} ) : (pat_num_350_ballgrp,pat_num_350_ballgrp_end,pat_num_350_ballgrpEX,pat_num_350_ballgrpEX_end)
{
local ret_tmpl = {};
local mvParam =
{
hitslow = 1,
startPat = pat_num_350_ballgrp,
endPat = pat_num_350_ballgrp_end,
}
switch( param.type )
{
case "A":
break;
case "B":
break;
case "EX":
mvParam.startPat = pat_num_350_ballgrpEX;
mvParam.endPat = pat_num_350_ballgrpEX_end;
break;
case "BC":
break;
}
ret_tmpl.flags <- def_FBTmplFlags_NewTypeFireBall|def_FBTmplFlags_NoVanishHit;
ret_tmpl.Init_After <- function() : (mvParam)
{
local vec = BMvTbl.GetVector( { flags=_Vector_Normal } );
local posst = BMvEff.GetAngle_FromVector( { x=vec.x, y=vec.y } );
BMvTbl.SetAngle( { angle_float=posst.angle } );
local eff = BMvEff.CreateObject( { start_pat=mvParam.startPat } );
if( eff.push() )
{
BMvEff.SetObjectFlags( { flags=_ObjFlags_ParentMove|_ObjFlags_NoGround|_ObjFlags_EraseParentPatChange } );
//見た目の角度を弾のベクトルから設定
BMvTbl.SetAngle( { angle_float=posst.angle } );
eff.pop();
}
}
ret_tmpl.LandTiming <- function() : (mvParam)
{
// _dpn("着地");
BMvEff.SetObjectFlags( { flags=_ObjFlags_NoGround } );//念の為何度も着地しないように
BMvTbl.SetPattern(mvParam.endPat);
}
ret_tmpl.DamageTiming <- function() : (mvParam)
{
// _dpn("ダメージ");
// BMvTbl.SetPattern("350_ballgrp_end");
if( mvParam.hitslow )
{
//ヒットスロー
if( BMvTbl.CalcHitValue(0) == 0 )
{
BMvEff.Slowmotion_Set( { time=15, power=5000 } );
}
}
}
ret_tmpl.GuardTiming <- function() : (mvParam)
{
// _dpn("ガード");
// BMvTbl.SetPattern("350_ballgrp_end");
}
ret_tmpl.AtkCountZero <- function() : (mvParam)
{
// _dpn("ヒット数終わり");
BMvTbl.SetPattern(mvParam.endPat);
}
ret_tmpl.Blocked <- function() : (mvParam)
{
// _dpn("殴られ");
BMvTbl.SetPattern(mvParam.endPat);
}
return ret_tmpl;
}
t.Mv_FireBall_J236A <- makeTmpl_CrowFireBall( { type="A" } );
t.Mv_FireBall_J236B <- makeTmpl_CrowFireBall( { type="B" } );
t.Mv_FireBall_J236BC <- makeTmpl_CrowFireBall( { type="BC" } );
t.Mv_FireBall_J236EX <- makeTmpl_CrowFireBall( { type="EX" } );
//-----------------------------------------------------------------------------
// J214攻
//-----------------------------------------------------------------------------
local maketmpl_SkillAirDrill = function( param={} )
{
local ret_tmpl = {};
local mvParam =
{
tentou = 0, // 着地時にランダムで転倒するかどうか
min_height = 0, // 最低高度
}
switch( param.type )
{
case "A":
break;
case "B":
break;
case "EX":
ret_tmpl.fgp <- Def_FGP_Invincibility;
break;
case "BC":
break;
case "Add2":
mvParam.tentou = 1;
mvParam.min_height = -75*128;
break;
}
ret_tmpl.Init_After <- function() : (mvParam)
{
BMvTbl.SetLP(0,0); // 攻撃が当たったか
// 低すぎたら補正
local pos = BMvTbl.GetPosition();
if( mvParam.min_height && pos.y > mvParam.min_height )
{
BMvTbl.SetPosition({ y=mvParam.min_height });
}
}
ret_tmpl.FrameUpdate_After <- function() : (mvParam)
{
switch( Battle_Std.GetUpdateFrameID() )
{
case 50:
BMvTbl.AddAirCount( def_ACS_NECO_J214, 1 ); // 何度も出せないようにする
break;
case 100:
BMvEff.PcAfterImage_Set( { type=1, range=14, delay=2, color=0xDDCCCCFF, blendmode=1 } ); // 残像出す
break;
case 200:
BMvEff.PcAfterImage_Clear(); // 残像消す
break;
case 500://着地
if( mvParam.tentou )
{
local rand = BMvEff.Random_Limit(2);
if( rand == 0 && BMvTbl.GetLP(0)==0 )
{
// ダメージ時以外は確率で転倒して反撃確定か着地成功で有利
BMvTbl.JumpFrameID(600);
}
}
break;
}
}
ret_tmpl.HitInterrupt_After <- function()
{
if( Battle_Std.CheckDamageTiming() )
{
BMvTbl.SetLP(0,1); // 攻撃当たった
}
}
ret_tmpl.LastUpdate_After <- function() : (mvParam)
{
BMvEff.PcAfterImage_Clear();
}
return ret_tmpl;
}
t.Mv_Skill_J214A <- maketmpl_SkillAirDrill( { type="A" } );
t.Mv_Skill_J214B <- maketmpl_SkillAirDrill( { type="B" } );
t.Mv_Skill_J214EX <- maketmpl_SkillAirDrill( { type="EX" } );
t.Mv_Skill_J214BC <- maketmpl_SkillAirDrill( { type="BC" } );
t.Mv_Skill_J214_JAdd2 <- maketmpl_SkillAirDrill( { type="Add2" } );
//-----------------------------------------------------------------------------
// 421攻
//-----------------------------------------------------------------------------
local pat_num_421A_Vtuber = BMvEff.GetPatternNum( { datatype=0, pat="421A_Vtuber" } ); // パターン文字列のパターン番号を事前取得
local pat_num_421A_Tmitter = BMvEff.GetPatternNum( { datatype=0, pat="421A_Tmitter" } ); // パターン文字列のパターン番号を事前取得
local pat_num_421EX_Tmitter = BMvEff.GetPatternNum( { datatype=0, pat="421EX_Tmitter" } ); // パターン文字列のパターン番号を事前取得
local maketmpl_SkillSmartPhone = function( param={} ) : (gachaPick,checkCallCharaSPAction,pat_num_421A_Vtuber,pat_num_421A_Tmitter,pat_num_421EX_Tmitter)
{
local ret_tmpl = {};
local mvParam =
{
lotteryList = 0, // 抽選リスト
calldummy = 0, // 仲間を呼ぶか
includeVtuber = 0, // Vtuber化を含むリストか
iconPos = { x=121*128, y=-225*128 }, // アプリアイコンの表示位置
objPosx = 0, // オブジェクト呼び出し位置の基準値
isEX = 0,
}
switch( param.type )
{
case "A":
mvParam.lotteryList =
[
[["Vtuber"],4],// 行動+必要幸運値
[["FGO_S"],4],
[["FGO_C"],3],
[["Tmitter"],3],
[["Necocan"],2],
[["SOS"],1],
[["Light"],0],
[["Train"],0],
];
mvParam.includeVtuber=1;
break;
case "B":
mvParam.lotteryList =
[
[["EcoArc"],4],// 行動+必要幸運値
[["DashNecos"],4],
[["FallInNeco","FallInNeco","FallInNeco"],4],
[["FallInNeco","UndergroundInNeco"],3],
[["FallInNeco","FallInNeco"],2],
[["FallInNeco","UndergroundInNeco"],2],
[["FallInNeco","FallInNeco"],1],
[["UndergroundInNeco","FallInNeco"],1],
[["TirePull","UndergroundInNeco"],1],
[["FallInNeco","UndergroundInNeco"],0],
[["UndergroundInNeco","FallInNeco"],0],
];
break;
case "EX":
ret_tmpl.fgp <- Def_FGP_Invincibility;
mvParam.lotteryList =
[
//MEMO:VtuberとTmitterみたいなパターン変更あるものの共存はダメ
[["SOS","Vtuber","Light"],4],// 行動+必要幸運値
[["Light","FGO_S","Train"],4],
[["SOS","FGO_S","Light"],4],
[["Light","FGO_S","SOS"],4],
[["Necocan","FGO_C","Train"],3],
[["SOS","FGO_C","Light"],3],
[["Light","FGO_C","SOS"],3],
[["Light","Tmitter","Train"],2],
[["Light","Necocan","SOS"],0],
[["Train","SOS","Light"],0],
];
mvParam.calldummy = 1;
mvParam.includeVtuber=1;
mvParam.iconPos = { x=(121-250)*128, y=-225*128 }; // 分身から呼び出すときにずらす
mvParam.objPosx = -250*128; // 分身から呼び出すときにずらす
mvParam.isEX = 1;
break;
case "BC":
mvParam.lotteryList =
[
[["EcoArc","DashNecos"],4],// 行動+必要幸運値
[["EcoArc","FallInNeco"],4],
[["EcoArc","UndergroundInNeco"],4],
[["FallInNeco","FallInNeco","UndergroundInNeco"],3],
[["FallInNeco","UndergroundInNeco","FallInNeco"],3],
[["DashNecos","FallInNeco","UndergroundInNeco"],2],
[["UndergroundInNeco","FallInNeco""FallInNeco"],2],
[["DashNecos","FallInNeco","UndergroundInNeco"],2],
[["FallInNeco","UndergroundInNeco","FallInNeco"],1],
[["UndergroundInNeco","FallInNeco","DashNecos"],1],
[["UndergroundInNeco","FallInNeco","DashNecos"],0],
[["UndergroundInNeco","FallInNeco","TirePull"],0],
];
break;
}
ret_tmpl.Init_After <- function()
{
BMvTbl.SetLP(0,0); // 抽選した行動を覚えておく
BMvTbl.SetLP(1,0); // パターン変更がある場合、変更先のパターン番号を記憶
}
ret_tmpl.FrameUpdate_After <- function() : (mvParam,gachaPick,checkCallCharaSPAction,pat_num_421A_Vtuber,pat_num_421A_Tmitter,pat_num_421EX_Tmitter)
{
switch( Battle_Std.GetUpdateFrameID() )
{
case 50://スマホ操作開始
if( mvParam.calldummy )
{
// 分身にもスマホ操作させる
BMvEff.CreateObject( { mvname="Mv_LandObj_calldummy", x=250*128, y=0 } );
BMvEff.CreateObject( { mvname="Mv_LandObj_calldummy", x=-250*128, y=0 } );
}
break;
case 100: // 抽選タイミング アイコン表示もこのタイミング
// ランダムで色々な行動に飛ぶ
if( mvParam.lotteryList )
{
local uselotteryList = clone mvParam.lotteryList; // コピー作成 参照渡しにしないためcloneを使う
// Vtuber化は1ラウンドに両プレイヤーで1回まで
local isUsedVtuber = BMvTbl.GetPP(defc_PP_Chr019_Vtuber);
if( !isUsedVtuber )
{
// 相手プレイヤーのチェック
local enemy = BMvCore.GetNearEnemyCharaData();
if( enemy.push() )
{
if( BMvCore.GetCharaNo() == Def_ChrNo_Chr019 )
{
if( BMvTbl.GetPP(defc_PP_Chr019_Vtuber)==1 ) isUsedVtuber = 1; // 相手が発動してても使用済み扱い
}
enemy.pop();
}
}
local isRemoved = 0; // Vtuber化を抽選リストから除外したかどうか
local isUsedSP = BMvTbl.GetPP(defc_PP_Chr019_IsUseSPAction);
if( ( isUsedVtuber || isUsedSP ) && mvParam.includeVtuber )
{
// Vtuber発動条件を満たしていないならListから消す
uselotteryList.remove(0); // 配列の0番目がVtuberなので消す
isRemoved = 1;
}
local pickIndex = gachaPick( uselotteryList ); // ランダム抽選
//debug用に任意で選べるように Vtuber化の一回制限引っかかるようにここでやる
if( Def_Dbg_LocalDebugMode )
{
//レバーで選べる
local stick = BMvTbl.GetStickHold();
if( stick > 0 )
{
if( stick < 5)
{
pickIndex = stick - 1;
}
else
{
pickIndex = stick - 2; // キー入力に5が無いので
}
local list_len = uselotteryList.len();
if( pickIndex > uselotteryList.len() - 1 ) pickIndex = list_len - 1;
}
}
if( isRemoved )
{
pickIndex++; // Vtuber化除外しているなら除外した分1足す ※あとで元のリスト参照する時にズレちゃうので
}
BMvTbl.SetLP(0,pickIndex); // ピックしたものを記憶
// アイコン表示
local pickedMove = mvParam.lotteryList[pickIndex][0];// 元のリストから何が抽選されたか
for( local ii=0; ii < pickedMove.len(); ii++ )
{
local icon_pat = 0;
switch( pickedMove[ii] )
{
case "Vtuber":
icon_pat = "icon_vtuber";
BMvTbl.SetPP(defc_PP_Chr019_Vtuber,1); // Vtuber化発動
BMvTbl.SetPP(defc_PP_Chr019_IsUseSPAction,1); // 超技クラス使用中扱いにする
BMvTbl.SetLP(1,pat_num_421A_Vtuber); // 変更先パターン番号
BMvEff.SetPlayerTimer( { muteki_nage=30, muteki_dage=30 } ); //Vtuber化のみ無敵継続
break;
case "FGO_S"://サーヴァント
case "FGO_C"://礼装
icon_pat = "icon_fgo";
break;
case "Necocan":
icon_pat = "icon_necocan";
break;
case "Tmitter":
icon_pat = "icon_tmitter";
local use_pat = (mvParam.isEX) ? pat_num_421EX_Tmitter : pat_num_421A_Tmitter;
BMvTbl.SetLP(1,use_pat); // 変更先パターン番号
break;
case "Light":
icon_pat = "icon_light";
break;
case "Train":
icon_pat = "icon_train";
break;
case "SOS":
icon_pat = "icon_sos";
break;
}
if( icon_pat )
{
local eff = BMvEff.CreateObject( { x=mvParam.iconPos.x+ii*250*128, y=mvParam.iconPos.y , start_pat=icon_pat } );
if( eff.push() )
{
BMvEff.SetObjectFlags({ flags=_ObjFlags_ParentMove });
BMvEff.ObjProcFlags_Set( { flags=_ObjProcFlags_EraseChangeParentMv } );
eff.pop();
}
}
}
}
break;
case 200: // 呼び出しタイミング
if( mvParam.lotteryList )
{
local pickIndex = BMvTbl.GetLP(0);
if( pickIndex > mvParam.lotteryList.len()-1 )
{
_dp("\n なんかデカい数字が入ってる→pickIndex:"+pickIndex);
pickIndex = pickIndex%(mvParam.lotteryList.len());
}
local pickedMove = mvParam.lotteryList[pickIndex][0];
for( local ii=0; ii< pickedMove.len(); ii++)
{
switch( pickedMove[ii] )
{
case "Vtuber":
break;
case "FGO_S":
// 召喚エフェクト呼び出し
local mv_name = "Mv_Obj_SummonServant";
local isCallCharaSPAction = checkCallCharaSPAction();
if( isCallCharaSPAction )
{
// 超技クラス使用中は礼装が出る
mv_name = "Mv_Obj_SummonCraft";
}
else
{
// サーヴァントは超技クラス使用中扱いにする
BMvTbl.SetPP(defc_PP_Chr019_IsUseSPAction,1);
}
BMvEff.CreateObject( { mvname=mv_name, x=200*128+mvParam.objPosx+ii*250*128, y=0 } );
break;
case "FGO_C":
BMvEff.CreateObject( { mvname="Mv_Obj_SummonCraft", x=200*128+mvParam.objPosx+ii*250*128, y=0 } );
break;
case "Necocan":
BMvEff.CreateObject( { mvname="Mv_LandObj_Necocan", x=mvParam.objPosx+ii*250*128, y=-1000*128 } );
break;
case "Tmitter": // パターン変更だけ
break;
case "Light":
// ネコが最大数未満なら呼び出す
if( BMvTbl.GetPP( defc_PP_Chr019_NecoCount ) < defc_Chr019_NecoMax )
{
local rand = BMvEff.Random_Limit(300);
local light = BMvEff.CreateObject( { mvname="Mv_LandObj_Light", y=-(200+rand)*128 } );
if( light.push() )
{
// ランダムで反転して反対の画面外から出現
if( BMvEff.Random_Limit(2) ) BMvTbl.SetMuki( _Direction_Reverse );
light.pop();
}
}
break;
case "Train":
// ネコが最大数未満なら呼び出す
if( BMvTbl.GetPP( defc_PP_Chr019_NecoCount ) < defc_Chr019_NecoMax )
{
BMvEff.CreateObject( { mvname="Mv_LandObj_Train" } );
}
break;
case "EcoArc": //エコアルク 暴走アルクのADを出すので重め
local isCallCharaSPAction = checkCallCharaSPAction();
if( !isCallCharaSPAction )
{
BMvTbl.SetPP(defc_PP_Chr019_IsUseSPAction,1); // 超技クラス使用中扱いにする
//相手に、暗転後動けるようになると消えるオブジェクトを呼ぶ
Battle_Std.CallAntenStopObject();
local stoptime = def_FL_EXCutinStopTime; //暗転停止時間
BMvEff.SetStopTime( { time=stoptime } ); //時間停止
BMvEff.CutInProc_Set({ time=[3,stoptime-3,10], cutin_mv="",erasetype=0, bgtype=1 });
BMvEff.CreateObject( { mvname="Mv_LandObj_EcoArc", x=mvParam.objPosx+ii*250*128 } );
//暗転中にキャンセルできるとダメなのでキャンセル不可にする
BMvTbl.SetAsStatusFlag( { normal=_CancelFlag_None, special=_CancelFlag_None, time=254, flag=_ClearFlag_ChangeMv } );
}
else
{
// 超技クラス使用中なら代わりを出す
BMvEff.CreateObject( { mvname="Mv_LandObj_FallInNeco", x=mvParam.objPosx+ii*250*128 } );
}
break;
case "DashNecos":
BMvEff.CreateObject( { mvname="Mv_Null_DashNecos" } );
break;
case "TirePull":
// ネコが最大数未満なら呼び出す
if( BMvTbl.GetPP( defc_PP_Chr019_NecoCount ) < defc_Chr019_NecoMax )
{
BMvEff.CreateObject( { mvname="Mv_LandObj_TirePull" } );
}
break;
case "FallInNeco":
// ネコが最大数未満なら呼び出す
if( BMvTbl.GetPP( defc_PP_Chr019_NecoCount ) < defc_Chr019_NecoMax )
{
BMvEff.CreateObject( { mvname="Mv_LandObj_FallInNeco", x=mvParam.objPosx+ii*250*128 } );
}
break;
case "UndergroundInNeco":
// ネコが最大数未満なら呼び出す
if( BMvTbl.GetPP( defc_PP_Chr019_NecoCount ) < defc_Chr019_NecoMax )
{
BMvEff.CreateObject( { mvname="Mv_LandObj_UndergroundInNeco", x=mvParam.objPosx+ii*250*128 } );
}
break;
case "SOS":
BMvEff.CreateObject( { mvname="Mv_Null_RocketNecos", x=mvParam.objPosx+ii*250*128 } );
break;
}
}
}
break;
case 250:// パターン変更があるやつはここでやる
local set_pat = BMvTbl.GetLP(1);
if( set_pat != 0 )
{
BMvTbl.SetPattern(set_pat);
}
break;
case 300: // Tmitter炎上開始
local eff = BMvEff.CreateObject( { mvname="Mv_Null_ArmorMng" } );
if( eff.push() )
{
BMvTbl.SetLP(0,300);//アーマー時間
eff.pop();
}
break;
case 500: // Vtuber開始
//相手に、暗転後動けるようになると消えるオブジェクトを呼ぶ
Battle_Std.CallAntenStopObject();
local stoptime = 120; //暗転停止時間
BMvEff.SetStopTime( { time=stoptime, bounderase=1 } ); //時間停止
BMvEff.CutInProc_Set({ time=[3,stoptime-3,10], cutin_mv="",erasetype=0, bgtype=1 });
BMvEff.CreateObject( { mvname="Mv_Obj_liveframe" } );
break;
}
}
ret_tmpl.LastUpdate_After <- function()
{
}
return ret_tmpl;
}
t.Mv_Skill_421A <- maketmpl_SkillSmartPhone( { type="A" } );
t.Mv_Skill_421B <- maketmpl_SkillSmartPhone( { type="B" } );
t.Mv_Skill_421EX <- maketmpl_SkillSmartPhone( { type="EX" } );
t.Mv_Skill_421BC <- maketmpl_SkillSmartPhone( { type="BC" } );
// EX版で出てくる分身
t.Mv_LandObj_calldummy <-
{
function Init_After()
{
BMvEff.SetObjectFlags( { flags=_ObjFlags_RenderShadow|_ObjFlags_NoRenderOrder } );
}
function FrameUpdate_After()
{
// 超技のロック中は即消える
if( Battle_Std.EasyCheckCharaIsSPActionProduction(1) != 0 )
{
BMvTbl.SetFinalize();
}
}
}
//-----------------------------------------------------------------------------
// ネコパケット:ネコ呼び出し
//-----------------------------------------------------------------------------
local pat_num_Neco0 = BMvEff.GetPatternNum( { datatype=0, pat="Neco0" } ); // パターン文字列のパターン番号を事前取得
local pat_num_Neco1 = BMvEff.GetPatternNum( { datatype=0, pat="Neco1" } ); // パターン文字列のパターン番号を事前取得
local pat_num_Neco2 = BMvEff.GetPatternNum( { datatype=0, pat="Neco2" } ); // パターン文字列のパターン番号を事前取得
local pat_num_Neco3 = BMvEff.GetPatternNum( { datatype=0, pat="Neco3" } ); // パターン文字列のパターン番号を事前取得
local pat_num_Neco4 = BMvEff.GetPatternNum( { datatype=0, pat="Neco4" } ); // パターン文字列のパターン番号を事前取得
local pat_num_Neco5 = BMvEff.GetPatternNum( { datatype=0, pat="Neco5" } ); // パターン文字列のパターン番号を事前取得
local pat_num_Neco6 = BMvEff.GetPatternNum( { datatype=0, pat="Neco6" } ); // パターン文字列のパターン番号を事前取得
local pat_num_Neco7 = BMvEff.GetPatternNum( { datatype=0, pat="Neco7" } ); // パターン文字列のパターン番号を事前取得
local pat_num_Neco8 = BMvEff.GetPatternNum( { datatype=0, pat="Neco8" } ); // パターン文字列のパターン番号を事前取得
local pat_num_Neco9 = BMvEff.GetPatternNum( { datatype=0, pat="Neco9" } ); // パターン文字列のパターン番号を事前取得
local pat_num_Neco10 = BMvEff.GetPatternNum( { datatype=0, pat="Neco10" } ); // パターン文字列のパターン番号を事前取得
local pat_num_Neco11 = BMvEff.GetPatternNum( { datatype=0, pat="Neco11" } ); // パターン文字列のパターン番号を事前取得
local pat_num_Neco12 = BMvEff.GetPatternNum( { datatype=0, pat="Neco12" } ); // パターン文字列のパターン番号を事前取得
local pat_num_Neco13 = BMvEff.GetPatternNum( { datatype=0, pat="Neco13" } ); // パターン文字列のパターン番号を事前取得
local pat_num_Neco14 = BMvEff.GetPatternNum( { datatype=0, pat="Neco14" } ); // パターン文字列のパターン番号を事前取得
local pat_num_Neco15 = BMvEff.GetPatternNum( { datatype=0, pat="Neco15" } ); // パターン文字列のパターン番号を事前取得
local pat_num_Neco16 = BMvEff.GetPatternNum( { datatype=0, pat="Neco16" } ); // パターン文字列のパターン番号を事前取得
local pat_num_Neco17 = BMvEff.GetPatternNum( { datatype=0, pat="Neco17" } ); // パターン文字列のパターン番号を事前取得
local pat_num_Neco18 = BMvEff.GetPatternNum( { datatype=0, pat="Neco18" } ); // パターン文字列のパターン番号を事前取得
local neco_patList = [pat_num_Neco0,pat_num_Neco1,pat_num_Neco2,pat_num_Neco3,pat_num_Neco4,pat_num_Neco5,pat_num_Neco6,pat_num_Neco7,pat_num_Neco8,pat_num_Neco9,pat_num_Neco10,pat_num_Neco11,pat_num_Neco12,pat_num_Neco13,pat_num_Neco14,pat_num_Neco15,pat_num_Neco16,pat_num_Neco17,pat_num_Neco18];
// 22Bや421Bで呼ばれる単体のネコ パターン分岐あり
local maketmpl_CalledSoloCat = function( param={} ) : (gachaPick,checkCallCharaSPAction,neco_patList,pat_num_NecoFukitobi)
{
local ret_tmpl = {};
local mvParam =
{
appear_type = 0, // 出現の種類 0:ネコアルクの位置からジャンプ、1:上空から落下、2:地中から出現
}
switch( param.type )
{
case "JumpInNeco":// 飛び出すネコ 22B用
mvParam.appear_type = 0;
break;
case "FallInNeco":// 落下するネコ
mvParam.appear_type = 1;
break;
case "UndergroundInNeco":// 地中から出てくるネコ
mvParam.appear_type = 2;
break;
}
ret_tmpl.Init_After <- function() : (mvParam)
{
// Battle_Std.InitFireBall(); // ロック中に当たらないように弾扱いにする
// ネコ登場数カウント
BMvTbl.AddPP(defc_PP_Chr019_NecoCount,1);
BMvEff.SetObjectFlags( { flags=_ObjFlags_RenderShadow|_ObjFlags_NoRenderOrder } );
Battle_Std.MoveCode.AddFlag( def_MC_Skill );//スキルボーナス用必殺技フラグ
BMvTbl.SetLP(0,0); // 超技クラスが抽選されたか
BMvTbl.SetLP(1,0); // 登場時に着地したか
BMvTbl.SetLP(2,0); // 被弾消滅に進んだか
switch( mvParam.appear_type )
{
case 0:// ネコアルクの位置からジャンプ
break;
case 1:// 上空から出現
local rand = BMvEff.Random_Limit(800);
BMvTbl.SetPosition({ x=100+rand, y=-1000, flags=_Position_Add|_Position_ToolShift|_Position_ChangeMuki });
BtlPl.SetPos_ExcessGamenHajiX({ off_x=200*128 });//画面外にはみ出ていたら位置調整
BMvTbl.SetVector({ y=-rand*2, addy=180, }); // 振ってくるタイミングちょっとズラす 遠い方が出現がちょっと遅い
break;
case 2:// 地中から出現
local rand = BMvEff.Random_Limit(400);
BMvTbl.SetPosition({ x=100+rand, y=0, flags=_Position_Add|_Position_ToolShift|_Position_ChangeMuki });
BtlPl.SetPos_ExcessGamenHajiX({ off_x=200*128 });//画面外にはみ出ていたら位置調整
BMvTbl.SetLP(1,1); // 最初から着地済み
break;
}
}
ret_tmpl.FrameUpdate_After <- function() : (gachaPick,checkCallCharaSPAction,mvParam,neco_patList,pat_num_NecoFukitobi)
{
if( Battle_Std.CheckObjectisYarare_Chr019() )
{
BMvTbl.SetPattern(pat_num_NecoFukitobi);//判定なしふきとび
}
Battle_Std.CheckNecoHasseiHosyou_Param1( pat_num_NecoFukitobi, 2 ); // Param1&1のときは親の被弾で消える( 処理後はSetLP(x,1) )
// 登場時にステージ端にぶつかったら反転する
if( BMvTbl.GetLP(1)==0 && Battle_Std.GetFrontCornerDistance() < 0 )
{
local vec = BMvTbl.GetVector( { flags=_Vector_Normal } );
BMvTbl.SetVector({ x=-vec.x });
BMvTbl.SetMuki(_Direction_Reverse);
}
switch( Battle_Std.GetUpdateFrameID() )
{
case 50: // 着地
BMvTbl.SetLP(1,1); // 着地を記憶
break;
case 100:
// ラウンド終了してなかったら分岐
if( !Battle_Std.RoundisEnd() )
{
// ランダムで色々な行動に飛ぶ
local moveList = [
// 行動+必要幸運値
[neco_patList[8],4],//すごいアバドンフレア 大当たり枠
[neco_patList[9],4],//オラオラ 当たり枠
[neco_patList[0],0],//しゃがみ
[neco_patList[1],1],//ダッシュ
[neco_patList[2],1],//3C
[neco_patList[3],1],//ぐるぐるパンチ
[neco_patList[4],3],//鉄拳
[neco_patList[5],0],//歩き
[neco_patList[6],0],//しゃがみ歩き
[neco_patList[7],2],//ワニ園
[neco_patList[10],2],//反復横跳び
[neco_patList[11],3],//Bビーム
[neco_patList[12],1],//立ち強
[neco_patList[13],0],//勝ちポーズ
[neco_patList[14],3],//タメ立ち中
[neco_patList[15],1],//立ち中
[neco_patList[16],4],//斜めビーム
[neco_patList[17],1],//ジャブ
[neco_patList[18],0],//振り向き
];
local pickIndex = gachaPick(moveList);
// 超技使用中はすごいアバドンフレアは使用不可
if( pickIndex==0 )
{
local isCallCharaSPAction = checkCallCharaSPAction();
if( isCallCharaSPAction )
{
pickIndex = 1; // 代わりに普通の当たり枠にする
}
else
{
BMvTbl.SetPP(defc_PP_Chr019_IsUseSPAction,1); // 超技クラス使用中
BMvTbl.SetLP(0,1); // 超技クラスが抽選されたか
}
}
BMvTbl.SetPattern( moveList[pickIndex][0] );
}
break;
}
// 画面外に出るか、超技のロックがあったら消える
if( Battle_Std.CheckFromtCornerDistance_with_RoundEnd( -500 ) || Battle_Std.EasyCheckCharaIsSPActionProduction(1) != 0 )
{
BMvTbl.SetFinalize();
}
}
ret_tmpl.HitInterrupt_After <- function()
{
if( Battle_Std.CheckDamageTiming() )
{
BMvTbl.AddComboRate();
}
}
ret_tmpl.LastUpdate_After <- function()
{
BMvTbl.AddPP(defc_PP_Chr019_NecoCount,-1); // ネコ登場数カウント
if( BMvTbl.GetLP(0)==1 )
{
BMvTbl.SetPP(defc_PP_Chr019_IsUseSPAction,0); // 超技クラス終了
}
}
return ret_tmpl;
}
t.Mv_LandObj_JumpInNeco <- maketmpl_CalledSoloCat({ type="JumpInNeco" });
t.Mv_LandObj_FallInNeco <- maketmpl_CalledSoloCat({ type="FallInNeco" });
t.Mv_LandObj_UndergroundInNeco <- maketmpl_CalledSoloCat({ type="UndergroundInNeco" });
// パターン分岐しないネコ
local maketmpl_CalledCats = function( param={} )
{
local ret_tmpl = {};
local mvParam =
{
appear_backcornerpos = 0, // 背後の画面端からの出現座標
collision = 0, // 衝突チェックする判定
endID = 0, // 終了先のフレームID
}
switch( param.type )
{
case "Train":// 電車ごっこ
mvParam.appear_backcornerpos = -200; // 横に長いので余裕を持たせる
break;
case "TirePull":// タイヤ引っ張り
mvParam.appear_backcornerpos = -100;
break;
case "DashNeco":// 走ってくるネコ
mvParam.appear_backcornerpos = -100;
mvParam.collision = { src=[ _Hantei_Etc, 0, 1 ], dst=[ _Hantei_Kurai , 0, -1 ], flags=_HC_FavourPc|_HC_EnemyPc };
mvParam.endID = 512;
break;
case "SOSNeco":// 上から降ってくるネコ
mvParam.endID = 512;
break;
}
ret_tmpl.Init_After <- function() : (mvParam)
{
// Battle_Std.InitFireBall(); // ロック中に当たらないように弾扱いにする
// ネコ登場数カウント
BMvTbl.AddPP(defc_PP_Chr019_NecoCount,1);
BMvEff.SetObjectFlags( { flags=_ObjFlags_RenderShadow|_ObjFlags_NoRenderOrder } );
Battle_Std.MoveCode.AddFlag( def_MC_Skill );//スキルボーナス用必殺技フラグ
// 画面外に移動
if( mvParam.appear_backcornerpos != 0 )
{
Battle_Std.SetXPos_BackCorner( mvParam.appear_backcornerpos );
}
}
ret_tmpl.FrameUpdate_After <- function() : (mvParam)
{
// 相手キャラに殴られたら終了の絵に飛ぶ
if( mvParam.endID && Battle_Std.CheckObjectisYarare_Chr019() )
{
BMvTbl.JumpFrameID(mvParam.endID);
}
else if( mvParam.collision )
{
// 自キャラor相手にぶつかってこける
local collision = BMvEff.CheckHantei( mvParam.collision );
if( collision.push() )
{
local tag_st = BMvCore.GetTagStatus();//-1:通常 1:タッグのメイン 0:タッグのパートナー
local dageki_muteki = BMvEff.GetPlayerMuteki( 0 );
collision.pop();
if( tag_st != 0 && dageki_muteki==0 ) // タッグのパートナーには反応しない 打撃無敵にも反応しない
{
BMvTbl.JumpFrameID(512);//分岐へ
}
}
}
// 画面外に出るか、超技のロックがあったら消える
if( Battle_Std.CheckFromtCornerDistance_with_RoundEnd( -300 ) || Battle_Std.EasyCheckCharaIsSPActionProduction(1) != 0 )
{
BMvTbl.SetFinalize();
}
}
ret_tmpl.HitInterrupt_After <- function() : (mvParam)
{
// ヒット時に終了の絵に飛ぶ
if( Battle_Std.CheckHitTiming() && mvParam.endID )
{
BMvTbl.JumpFrameID(mvParam.endID);
}
if( Battle_Std.CheckDamageTiming() )
{
BMvTbl.AddComboRate();
}
}
ret_tmpl.LastUpdate_After <- function()
{
BMvTbl.AddPP(defc_PP_Chr019_NecoCount,-1); // ネコ登場数カウント
}
return ret_tmpl;
}
t.Mv_LandObj_Train <- maketmpl_CalledCats({ type="Train" });
t.Mv_LandObj_TirePull <- maketmpl_CalledCats({ type="TirePull" });
t.Mv_LandObj_DashNeco <- maketmpl_CalledCats({ type="DashNeco" });
t.Mv_LandObj_SOSNeco <- maketmpl_CalledCats({ type="SOSNeco" });
// 一反木綿
t.Mv_LandObj_Light <-
{
function Init_After()
{
// ネコ登場数カウント
BMvTbl.AddPP(defc_PP_Chr019_NecoCount,1);
BMvEff.SetObjectFlags( { flags=_ObjFlags_RenderShadow|_ObjFlags_NoRenderOrder } );
Battle_Std.MoveCode.AddFlag( def_MC_Skill );//スキルボーナス用必殺技フラグ
Battle_Std.SetXPos_BackCorner( -100 );
}
function FrameUpdate_After()
{
// 木綿ライダー自キャラになぐられてふきとぶ処理
local collision = BMvEff.CheckHantei( { src=[ _Hantei_Etc, 0, 1 ], dst=[ _Hantei_Attack , 0, -1 ], flags=_HC_FavourPc|_HC_FavourObj|_HC_WithoutNoHanteiFlagObj } );
if( collision.push() )
{
// 攻撃出現チェック
local lefthitcount = BMvTbl.CalcHitValue(0);
local mvcode = BMvTbl.GetMoveCode();
local nobreak = Battle_Std.MoveCodeEx.CheckFlag( 2, def_MC2_NoBreakObject|def_MC2_SkillThrow );
local atkGuardFlag = BMvTbl.GetAtkGuardFlag();
collision.pop();
if( !((mvcode&def_MC_Throw) || (atkGuardFlag&_GuardFlag_ThroughExceptBound)) )
{
BMvTbl.JumpFrameID(512);//分岐へ
}
}
switch( Battle_Std.GetUpdateFrameID() )
{
case 1024:
// 攻撃判定付きのネコが吹き飛ぶ
BMvEff.CreateObject({ mvname="Mv_LandObj_AtkNecoBlow" });
break;
}
// 画面外に出るか、超技のロックがあったら消える
if( Battle_Std.CheckFromtCornerDistance_with_RoundEnd( -300 ) || Battle_Std.EasyCheckCharaIsSPActionProduction(1) != 0 )
{
BMvTbl.SetFinalize();
}
}
function LastUpdate_After()
{
BMvTbl.AddPP(defc_PP_Chr019_NecoCount,-1); // ネコ登場数カウント
}
}
// 攻撃判定付きで吹き飛ぶネコ
t.Mv_LandObj_AtkNecoBlow <-
{
function Init_After()
{
// Battle_Std.InitFireBall(); // ロック中に当たらないように弾扱いにする
BMvEff.SetObjectFlags( { flags=_ObjFlags_RenderShadow|_ObjFlags_NoRenderOrder } );
Battle_Std.MoveCode.AddFlag( def_MC_Skill );//スキルボーナス用必殺技フラグ
}
function FrameUpdate_After()
{
// 超技のロックがあったら消える
if( Battle_Std.EasyCheckCharaIsSPActionProduction(1) != 0 )
{
BMvTbl.SetFinalize();
}
}
function HitInterrupt_After()
{
if( Battle_Std.CheckDamageTiming() )
{
BMvTbl.AddComboRate();
}
}
}
// 3体で走るネコ
t.Mv_Null_DashNecos <-
{
function Init_After()
{
BMvTbl.SetPattern(990); //非表示でパターン設定してないと0番のpatで色々なる
BMvTbl.SetLP(0,0); // 何回呼んだかカウント
}
function Update_After()
{
local mvs = BMvTbl.GetMvStatus();
if( mvs.MvCount%7 == 0 && mvs.MvCount > 20 )
{
// ネコが出現最大数未満なら呼び出す
if( BMvTbl.GetPP( defc_PP_Chr019_NecoCount ) < defc_Chr019_NecoMax )
{
local neco1 = BMvEff.CreateObject( { mvname="Mv_LandObj_DashNeco" } );
local neco2 = BMvEff.CreateObject( { mvname="Mv_LandObj_DashNeco" } );
if( neco2.push() )
{
BMvTbl.SetMuki( _Direction_Reverse ); // 反転
neco2.pop()
}
}
local count = BMvTbl.AddLP(0,1); //何回呼んだかカウント
if( count >= 3 )
{
BMvTbl.SetFinalize(0);
}
}
}
}
// 3体ワニ園で降ってくるネコ
t.Mv_Null_RocketNecos <-
{
function Init_After()
{
BMvTbl.SetPattern(990); //非表示でパターン設定してないと0番のpatで色々なる
BMvTbl.SetLP(0,0);
BtlPl.SetPos_ExcessGamenHajiX({ off_x=800*128 });//画面外にはみ出ていたら位置調整
}
function Update_After()
{
local mvs = BMvTbl.GetMvStatus();
local num = BMvTbl.GetLP(0);
if( mvs.MvCount%30 == 0 )
{
// ネコが出現最大数未満なら呼び出す
if( BMvTbl.GetPP( defc_PP_Chr019_NecoCount ) < defc_Chr019_NecoMax )
{
local neco = BMvEff.CreateObject( { mvname="Mv_LandObj_SOSNeco" } );
if( neco.push() )
{
BMvTbl.SetPosition({ x=250+num*250, y=-1000, flags=_Position_Add|_Position_ToolShift|_Position_ChangeMuki });
neco.pop()
}
}
local count = BMvTbl.AddLP(0,1);
if( count >= 3 )
{
BMvTbl.SetFinalize(0);
}
}
}
function HitInterrupt_After()
{
if( Battle_Std.CheckDamageTiming() )
{
BMvTbl.AddComboRate();
}
}
}
// エコアルク
t.Mv_LandObj_EcoArc <-
{
function Init_After()
{
BMvTbl.SetPosition({ x=100*128, flags=_Position_Add|_Position_ChangeMuki});
BtlPl.SetPos_ExcessGamenHajiX({ off_x=200*128 });//画面外にはみ出ていたら位置調整
BMvEff.SetObjectFlags( { flags=_ObjFlags_RenderShadow|_ObjFlags_NoRenderOrder } );
Battle_Std.MoveCode.AddFlag( def_MC_Skill );//スキルボーナス用必殺技フラグ
}
function FrameUpdate_After()
{
switch( Battle_Std.GetUpdateFrameID() )
{
case 100:
BMvEff.CreateObject({ mvname="Mv_Obj_AtkEcoWave"});
break;
}
// 超技のロック中は即消える
if( Battle_Std.EasyCheckCharaIsSPActionProduction(1) != 0 )
{
BMvTbl.SetFinalize();
}
}
function LastUpdate_After()
{
BMvTbl.SetPP(defc_PP_Chr019_IsUseSPAction,0); // 超技クラス終了
}
}
t.Mv_Obj_AtkEcoWave <-
{
function Init_After()
{
// Battle_Std.InitFireBall(); // ロック中に当たらないように弾扱いにする
BMvEff.SetObjectFlags( { flags=_ObjFlags_EraseParentPatChange } );
Battle_Std.MoveCode.AddFlag( def_MC_Skill );//スキルボーナス用必殺技フラグ
}
function HitInterrupt_After()
{
if( Battle_Std.CheckDamageTiming() )
{
BMvTbl.AddComboRate();
}
}
}
//-----------------------------------------------------------------------------
// ネコパケット:Tmitter
//-----------------------------------------------------------------------------
// 炎上オブジェクト アーマー管理
t.Mv_Null_ArmorMng <-
{
function SetArmor( time=0 )
{
local player = BMvCore.GetPlayerCharaData();
if( player.push() )
{
BMvTbl.SetSuperArmorFlag( { val=1, time=time, flag=0 } ); // アーマー
player.pop();
}
}
function IsArmor()
{
local player = BMvCore.GetPlayerCharaData();
if( player.push() )
{
local flag = BMvTbl.GetSuperArmorFlag()
player.pop();
return flag;
}
return 0;
}
function Init_After()
{
BMvTbl.SetPattern(990); //非表示でパターン設定してないと0番のpatで色々なる
// BMvTbl.SetLP(0,450);//アーマー時間
local armor_frame = BMvTbl.GetLP(0);
SetArmor(armor_frame);
BMvTbl.SetLP(1,0);//アーマー時間カウント
BMvEff.AttackInfoString_Set({ word=def_AISW_Armor,} );
}
function Update_After()
{
local mvs = BMvTbl.GetMvStatus();
local armor_frame = BMvTbl.GetLP(0);
local frame = BMvTbl.AddLP(1,1);//アーマー時間カウント
// _dpn("frame:"+frame);
//アーマーの処理
{
local player = BMvCore.GetPlayerCharaData();
if( player.push() )
{
BMvTbl.SetSuperArmorFlag( { val=1, time=16, flag=0 } ); // アーマー
player.pop();
}
if( mvs.MvCount%15==0 )
{
//効果中
local player = BMvCore.GetPlayerCharaData();
if( player.push() )
{
if( mvs.MvCount%30==0 )
{
BMvEff.SetCharaFlash( { color = 0xD02000, type = 2, time = 30 } );
}
player.pop();
}
}
}
//終了条件
if( frame > armor_frame || !IsArmor() || Battle_Std.CheckPlayerisDamage() || Battle_Std.RoundisEnd() )
{
BMvTbl.SetFinalize();
}
}
function LastUpdate_After()
{
local player = BMvCore.GetPlayerCharaData();
if( player.push() )
{
BMvEff.SetCharaFlash( { time = 0 } );
BMvTbl.SetSuperArmorFlag( { val=1, time=0, flag=0 } ); // アーマー
player.pop();
}
}
}
//-----------------------------------------------------------------------------
// ネコパケット:FGO
//-----------------------------------------------------------------------------
// ガチャの抽選処理を行う
local makeTmpl_FGO = function( param={} ) : (gachaPick)
{
local ret_tmpl = {};
local mvParam =
{
gachaList = 0,
}
switch( param.type )
{
case "SummonCraft":
mvParam.gachaList =[
["Mv_Null_bkeyManager",1],
["Mv_LandObj_ItemCurry",0],
["Mv_LandObj_ItemMapo",0],
];
break;
case "SummonServant":
mvParam.gachaList =[
// リストに最低一つは幸運値0が必須
["Mv_LandObj_Altria",0],
];
break;
}
ret_tmpl.Init_After <- function() : (mvParam)
{
BMvEff.SetObjectFlags( { flags=_ObjFlags_NoRenderOrder } );
BtlPl.SetPos_ExcessGamenHajiX({ off_x=200*128 });//画面外にはみ出ていたら位置調整
}
ret_tmpl.FrameUpdate_After <- function() : (mvParam,gachaPick)
{
switch( Battle_Std.GetUpdateFrameID() )
{
case 100:
// 抽選処理
local pickIndex = gachaPick(mvParam.gachaList);
BMvEff.CreateObject( { mvname=mvParam.gachaList[pickIndex][0] } );
break;
}
}
return ret_tmpl;
}
t.Mv_Obj_SummonCraft <- makeTmpl_FGO({type="SummonCraft"});
t.Mv_Obj_SummonServant <- makeTmpl_FGO({type="SummonServant"});
t.Mv_LandObj_Altria <-
{
function Init_After()
{
// Battle_Std.InitFireBall(); // ロック中に当たらないように弾扱いにする
BMvEff.SetObjectFlags( { flags=_ObjFlags_RenderShadow|_ObjFlags_NoRenderOrder } );
// 各種補正は最初の1ヒットのみ
BMvTbl.SetNoHoseiFlag( { val=1, time=254, flag=_ClearFlag_ChangeMv } );
Battle_Std.MoveCode.AddFlag( def_MC_Skill );//スキルボーナス用必殺技フラグ
}
function FrameUpdate_After()
{
if( Battle_Std.EasyCheckCharaIsSPActionProduction(1) != 0 )
{
// 超技のロック中は即消える
BMvTbl.SetFinalize();
}
}
function HitInterrupt_After()
{
BtlPl.SetPos_ShiftDamageMove_Enemy( { x=10*128 } );
if( Battle_Std.CheckDamageTiming() )
{
BMvTbl.AddComboRate();
}
}
function LastUpdate_After()
{
BMvTbl.SetPP(defc_PP_Chr019_IsUseSPAction,0); // 超技クラス終了
}
}
// 特殊判定0に触れたらアイテム取得
// _gainHP:HP回復量、1=500, _gainSP:SP回復量、1=5000
// _specificCharaList : 特効対象キャラ番号
// 戻り値 取得に成功したか 0:取得してない 1:取得した
local itemGet = function( _gainHP=0, _gainSP=0, _specificCharaList=[], _Check={ src=[ _Hantei_Etc, 0, 1 ], dst=[ _Hantei_Kasanari , 0, -1 ], flags=_HC_FavourPc|_HC_EnemyPc } )
{
//MEMO:ラウンド終了後とか特定の行動中は拾えないようにしとかないと危ない
//MEMO:タッグキャラ相手に同時に重なった時は操作キャラが優先される
//特殊判定に触れたら拾える
if( !Battle_Std.RoundisEnd() )
{
local collision = BMvEff.CheckHantei( _Check );
local player_side = 0;
local item = BMvTbl.GetLP(1);
if( collision.push() )
{
local charaNo = BMvTbl.GetCharaNo();
player_side = BMvTbl.GetPlayerSide(); // 1Por2P(回復エフェクト側でも取得して一致ならplayer、不一致ならenemyという処理)
// 超技中だとうかつにキャラを操作するとまずい
local tag_st = BMvCore.GetTagStatus();//-1:通常 1:タッグのメイン 0:タッグのパートナー
local isSPAction = Battle_Std.MvAction.CheckFlag( def_MC_SPAction );
local is_get = ( tag_st != 0 && !isSPAction );
if( is_get )
{
BMvEff.AttackInfoString_Set({ word=def_AISW_ItemGet,} ); // アナウンス表示
foreach( val in _specificCharaList )
{
if( val == charaNo )
{
// 特効対象なら回復量一段階アップ
if( _gainHP != 0 ) _gainHP += 1;
if( _gainSP != 0 ) _gainSP += 1;
}
}
if( _gainHP != 0 )
{
BMvEff.SetHpGauge( { value=_gainHP*500 } ); // 体力増加
}
else if( _gainSP != 0 )
{
BMvEff.SetSpGauge( { value=_gainSP*5000, correct=0 } ); // ゲージ増加
}
}
collision.pop();
// タッグのパートナーには反応しない && 超技にも反応しない
if( is_get )
{
local posst = BMvEff.GetPointStatus( { target=collision } );
if( _gainHP != 0 )
{
local eff = BMvEff.CreateObject({ x=posst.pos_x*BMvTbl.GetMuki(), y=posst.pos_y, mvname="Mv_Obj_Eff_HealHP"});
if( eff.push() )
{
BMvTbl.SetLP(0,player_side); // 1P2Pを記憶 エフェクト追尾用
BMvTbl.SetLP(1,_gainHP); // 体力回復量を記憶
eff.pop();
}
}
else if( _gainSP != 0 )
{
local eff = BMvEff.CreateObject({ x=posst.pos_x*BMvTbl.GetMuki(), y=posst.pos_y, mvname="Mv_Obj_Eff_HealSP"});
if( eff.push() )
{
BMvTbl.SetLP(0,player_side); // 1P2Pを記憶 エフェクト追尾用
BMvTbl.SetLP(1,0); // 体力回復量を記憶(SPは0)
eff.pop();
}
}
return 1;
}
}
}
return 0;
}
// 回復値の表示位置 オンラインのYOUと基本的には同じ位置
local healValOffset =
{
Default = 0,//0=-435 1:-435+(-25)*n
[Def_ChrNo_Chr000] = 0,
[Def_ChrNo_Chr001] = 0,
[Def_ChrNo_Chr002] = 0,
[Def_ChrNo_Chr003] = -1,
[Def_ChrNo_Chr004] = 0,
[Def_ChrNo_Chr005] = -1,
[Def_ChrNo_Chr006] = -2,
[Def_ChrNo_Chr008] = 0,
[Def_ChrNo_Chr009] = -3,
[Def_ChrNo_Chr010] = 0,
[Def_ChrNo_Chr011] = 0,
[Def_ChrNo_Chr012] = 0,
[Def_ChrNo_Chr013] = 1,
[Def_ChrNo_Chr014] = 1, // 掛け合いと違って座標が変に上がったりしないので1
[Def_ChrNo_Chr015] = 0,
[Def_ChrNo_Chr016] = 0,
[Def_ChrNo_Chr017] = 1,
[Def_ChrNo_Chr019] = 5, // YOU表示と同じだとちょっと高かったのでさらに低めに
[Def_ChrNo_Chr020] = 0,
}
// 回復エフェクト
local pat_num_Eff_spgain = BMvEff.GetPatternNum( { datatype=0, pat="Eff_spgain" } ); // パターン文字列のパターン番号を事前取得
local pat_num_Eff_hpgain_Lv1 = BMvEff.GetPatternNum( { datatype=0, pat="Eff_hpgain_Lv1" } ); // パターン文字列のパターン番号を事前取得
local pat_num_Eff_hpgain_Lv2 = BMvEff.GetPatternNum( { datatype=0, pat="Eff_hpgain_Lv2" } ); // パターン文字列のパターン番号を事前取得
local pat_num_Eff_hpgain_Lv3 = BMvEff.GetPatternNum( { datatype=0, pat="Eff_hpgain_Lv3" } ); // パターン文字列のパターン番号を事前取得
local maketmpl_EffHeal = function( param={} ) : (healValOffset,pat_num_Eff_spgain,pat_num_Eff_hpgain_Lv1,pat_num_Eff_hpgain_Lv2,pat_num_Eff_hpgain_Lv3)
{
local ret_tmpl = {};
local mvParam =
{
// 頭上に表示する文字列
healValPat =
{
[0] = pat_num_Eff_spgain, // MC UP SP回復の時のみ
[1] = pat_num_Eff_hpgain_Lv1, // 500
[2] = pat_num_Eff_hpgain_Lv2, // 1000
[3] = pat_num_Eff_hpgain_Lv3, // 1500
},
}
switch( param.type )
{
case "HP":
break;
case "SP":
break;
}
ret_tmpl.Init_After <- function() : (mvParam,healValOffset)
{
//BMvTbl.SetLP(0,0); //1Por2P 親からセットする
//BMvTbl.SetLP(1,0); //回復量 親からセットする
// 回復の文字列表示
local set_pos = 0;
local player_side = BMvTbl.GetPlayerSide();
local charaNo = ( BMvTbl.GetLP(0)==player_side )? Def_ChrNo_Chr019 : Battle_Std.GetEnemyCharaNo();
if( charaNo in healValOffset )
{
set_pos = healValOffset[charaNo];
}
else
{
set_pos = healValOffset.Default;
}
local healVal = BMvTbl.GetLP(1);
if( healVal > mvParam.healValPat.len()-1 )
{
// 上限値以上にはならない
healVal = mvParam.healValPat.len()-1;
_dp("\n healValの上限を超えている");
}
local eff = BMvEff.CreateObject({ y=-(435-(set_pos*25))*128, start_pat=mvParam.healValPat[healVal]});
if( eff.push() )
{
BMvEff.SetObjectFlags({ flags=_ObjFlags_ParentMove|_ObjFlags_EraseParentPatChange });
eff.pop();
}
}
ret_tmpl.FrameUpdate_After <- function() : (mvParam)
{
// 回復対象に追尾する
local player_side = BMvTbl.GetPlayerSide();
if( BMvTbl.GetLP(0) == player_side )
{
BtlPl.SetPos_Warp_Player();
}
else
{
BtlPl.SetPos_Warp_Enemy();
}
}
ret_tmpl.LastUpdate_After <- function() : (mvParam)
{
}
return ret_tmpl;
}
t.Mv_Obj_Eff_HealHP <- maketmpl_EffHeal({ type="HP" })
t.Mv_Obj_Eff_HealSP <- maketmpl_EffHeal({ type="SP" })
// 各種回復アイテム
// 特殊判定0に触れると回復(超技中は除く)し、FrameID500に飛んで終了
local maketmpl_RecoveryItem = function( param={} ) : (itemGet)
{
local ret_tmpl = {};
local mvParam =
{
hpGain = 0,
spGain = 0,
specificCharaList = [], // 回復効果アップする特効キャラリスト
}
switch( param.type )
{
case "Curry":
mvParam.hpGain = 1;
mvParam.specificCharaList = [Def_ChrNo_Chr011,Def_ChrNo_Chr016];
break;
case "Mapo":
mvParam.spGain = 1;
break;
case "Stone":
mvParam.spGain = 8; // 確定でゲージがMAXになる
break;
case "Pear":
mvParam.hpGain = 3;
}
ret_tmpl.Init_After <- function() : (mvParam)
{
BMvEff.SetObjectFlags( { flags=_ObjFlags_NoRenderOrder } );
BMvTbl.SetLP(0,0); // 状態 0:通常 1:消滅に進んだ
}
ret_tmpl.FrameUpdate_After <- function() : (mvParam,itemGet)
{
if( BMvTbl.GetLP(0) == 0 )
{
local isItemGet = itemGet( mvParam.hpGain, mvParam.spGain, mvParam.specificCharaList ); // HP SP 特効
if( isItemGet )
{
BMvTbl.SetLP(0,1); // 状態 0:通常 1:消滅に進んだ
Battle_Std.InitVector();//着地させない
BMvTbl.JumpFrameID(500);
BMvTbl.SetFinalize();
}
}
if( Battle_Std.EasyCheckCharaIsSPActionProduction(1) != 0 )
{
// 超技のロック中は即消える
BMvTbl.SetFinalize();
}
}
return ret_tmpl;
}
t.Mv_LandObj_ItemCurry <- maketmpl_RecoveryItem({type="Curry"});
t.Mv_LandObj_ItemMapo <- maketmpl_RecoveryItem({type="Mapo"});
t.Mv_LandObj_ItemStone <- maketmpl_RecoveryItem({type="Stone"});
t.Mv_LandObj_ItemPear <- maketmpl_RecoveryItem({type="Pear"});
// ガチャで出る黒鍵
t.Mv_Null_bkeyManager <-
{
function Init_After()
{
Battle_Std.CreateFireBall( { mv="Mv_FireBall_BkeyA", pat="Ball_BkeyA", x=0, y=-230, vec={ x=0, y=0, flags=_Vector_Normal } } );
BMvTbl.SetPattern(990); //非表示でパターン設定してないと0番のpatで色々なる
// 用が済んだら消える
BMvTbl.SetFinalize();
}
}
local makeTmpl_BKeyFireBallEx = function( param={} )
{
local ret_tmpl = {};
local mvParam =
{
damageType = 0,//1だとヒット時爆発
//飛ばす弾見た目のパラメータ
bKeyPats = [
{ pos={x= 0,y= 0} },
],
shot="bkey_shot",//弾見た目
roll="bkey_roll",//回転みため
bombPats = { hit1=0, hit2=0 },
}
switch( param.type )
{
case "A":
mvParam.bKeyPats = [
{ pos={x= 10,y=-25} },
{ pos={x= 0,y= 0} },
{ pos={x=-10,y= 25} },
]
break;
}
ret_tmpl.flags <- def_FBTmplFlags_NewTypeFireBall|def_FBTmplFlags_NoVanishDamage;
ret_tmpl.Init_After <- function() : (mvParam)
{
Battle_Std.MoveCode.AddFlag( def_MC_Skill );//スキルボーナス用必殺技フラグ
BMvTbl.SetLP(0,0); // 加速したか
BMvTbl.SetVector( { x=0, y=0, flags=_Vector_Normal });
for( local i=0; i<mvParam.bKeyPats.len(); i++ )
{
local bKey = mvParam.bKeyPats[i];
local eff = BMvEff.CreateObject( { start_pat=mvParam.shot, x=bKey.pos.x*128, y=bKey.pos.y*128 } );
if( eff.push() )
{
BMvEff.SetObjectFlags( { flags=_ObjFlags_ParentMove|_ObjFlags_NoGround|_ObjFlags_EraseParentPatChange } );
//角度決め打ち
BMvTbl.SetAngle( { angle_float=0.50 } );
eff.pop();
}
}
}
ret_tmpl.FrameUpdate_After <- function() : (mvParam)
{
// ちょっと時間たってから発射
local mvs = BMvTbl.GetMvStatus();
if( mvs.MvCount >= 20 && BMvTbl.GetLP(0)==0 )
{
BMvTbl.SetVector( { x=1600, y=0, addx=500, flags=_Vector_Normal });
BMvTbl.SetVector_MaxX( 6000 );
BMvTbl.SetLP(0,1);
}
}
local CallRollBlackKeys = function() : (mvParam)
{
//跳ねる黒鍵
for( local i=0; i<mvParam.bKeyPats.len(); i++ )
{
local bKey = mvParam.bKeyPats[i];
local eff = BMvEff.CreateObject( { start_pat=mvParam.roll, x=bKey.pos.x*128, y=bKey.pos.y*128 } );
if( eff.push() )
{
BMvEff.SetObjectFlags( { flags=_ObjFlags_MoveTimeStopAll|_ObjFlags_NoGround } );//念の為何度も着地しないように
local rand_pow = 75 + BMvEff.Random_Limit(50);
local vec = { x=-500, y=-1200 };
vec.x = vec.x * rand_pow / 100;
vec.y = vec.y * rand_pow / 100;
BMvTbl.SetVector( { x=vec.x, y=vec.y, addy=70, flags=_Vector_Normal } );
eff.pop();
}
}
}
// 着地することは無いが念のため
ret_tmpl.LandTiming <- function() : (mvParam, CallRollBlackKeys)
{
// _dpn("着地");
BMvTbl.SetFinalize(0);
CallRollBlackKeys();
}
ret_tmpl.DamageTiming <- function() : (mvParam, CallRollBlackKeys)
{
switch( mvParam.damageType )
{
case 0:
CallRollBlackKeys();
BMvTbl.SetFinalize(0);
break;
}
}
ret_tmpl.GuardTiming <- function() : (mvParam, CallRollBlackKeys)
{
// _dpn("ガード");
BMvTbl.SetFinalize(0);
CallRollBlackKeys();
}
ret_tmpl.Sousai <- function() : (mvParam, CallRollBlackKeys)
{
// _dpn("相殺");
BMvTbl.SetFinalize(0);
CallRollBlackKeys();
}
// 殴られることは無いが念のため
ret_tmpl.Blocked <- function() : (mvParam)
{
// _dpn("殴られ");
BMvTbl.SetFinalize(0);
}
return ret_tmpl;
}
t.Mv_FireBall_BkeyA <- makeTmpl_BKeyFireBallEx( { type="A" } );
//-----------------------------------------------------------------------------
// ネコパケット:ネコ缶
//-----------------------------------------------------------------------------
// ネコ缶
t.Mv_LandObj_Necocan <-
{
function Init_After()
{
// Battle_Std.InitFireBall(); // ロック中に当たらないように弾扱いにする
// 画面外上空から多少ランダムな位置で降ってくる
local rand = BMvEff.Random_Limit(300);
BMvTbl.SetPosition({ x=200+rand, flags=_Position_Add|_Position_ToolShift|_Position_ChangeMuki });
BtlPl.SetPos_ExcessGamenHajiX({ off_x=200*128 });//画面外にはみ出ていたら位置調整
Battle_Std.MoveCode.AddFlag( def_MC_Skill );//スキルボーナス用必殺技フラグ
BMvTbl.SetLP(0,0); // ネコ缶の状態 0:通常 1:消滅に進んだ
BMvTbl.SetLP( 1,BMvTbl.AddPP(defc_PP_Chr019_NecocanCount,1) ); // 何個目のネコ缶かカウント
}
function FrameUpdate_After() : (itemGet)
{
//特殊判定1を殴ると飛んでいく
local attack = BMvEff.CheckHantei( { src=[ _Hantei_Etc, 1, 1 ], dst=[ _Hantei_Attack, 0, -1 ], flags=_HC_FavourPc|_HC_WithoutNoHanteiFlagObj } ); // 自分の攻撃だけ
if( attack.push() )
{
local attack_muki = BMvTbl.GetMuki();
// 攻撃出現チェック
local lefthitcount = BMvTbl.CalcHitValue(0);
local mvcode = BMvTbl.GetMoveCode();
local atkGuardFlag = BMvTbl.GetAtkGuardFlag();
attack.pop();
if( lefthitcount > 0 && !( mvcode&def_MC_Throw ) && !(atkGuardFlag&_GuardFlag_ThroughExceptBound) )
{
local vec_x = 0;
BMvTbl.JumpFrameID(200); // 飛ぶ
BMvTbl.SetVector({ x=2000*attack_muki, y=-3000, addy=180 });
}
}
else
{
//特殊判定0に触れたら拾えるor次のネコ缶が出てきたら消える
if( BMvTbl.GetLP(0) == 0 )
{
local isCanGet = itemGet( 0, 1, [Def_ChrNo_Chr019] ); // HP SP 特効対象
if( isCanGet || BMvTbl.GetLP(1) != BMvTbl.GetPP(defc_PP_Chr019_NecocanCount) )
{
BMvTbl.SetLP(0,1); // 消滅に進んだ
Battle_Std.InitVector();//着地させない
BMvTbl.JumpFrameID(500);//消滅
BMvTbl.SetFinalize();
}
}
}
if( Battle_Std.EasyCheckCharaIsSPActionProduction(1) != 0 )
{
// 超技のロック中は即消える
BMvTbl.SetFinalize();
}
}
function HitInterrupt_After()
{
// 当たったら跳ねる
if( Battle_Std.CheckHitTiming() )
{
BMvTbl.SetVector({ x=-200, y=-1500, addy=180 });
BMvTbl.SetMuki(_Direction_Reverse);
}
if( Battle_Std.CheckDamageTiming() )
{
BMvTbl.AddComboRate();
}
}
}
//-----------------------------------------------------------------------------
// ネコパケット:Vtuber
//-----------------------------------------------------------------------------
// ネコシリーズの名前取得(アバターの分岐用)
local getNecoName = function()
{
local neco_name = "";
local color = BMvTbl.GetPP(defc_PP_Chr019_NecoColor);
switch( color )
{
case 30:
case 31:
// ネコシエル
neco_name = "Cie_";
break;
case 32:
case 33:
// ネコアキハ
neco_name = "Sak_";
break;
case 34:
case 35:
// ネコヒスイ
neco_name = "His_";
break;
case 36:
case 37:
// ネココハク
neco_name = "Koh_";
break;
}
return neco_name;
}
/*
Mv_Obj_liveframe:配信枠。全体の管理オブジェクトを兼ねる。ネコアバターへの指示出しなど
Mv_Obj_NecoAvatar:ネコアバター本体。
*/
const defSetVol = 50; // Vtuber中のネコアバター以外の音量
const defVolFadeTime = 60; // 音量を何フレームかけてフェードするか
const defLP_avaCommand = 0; // アバターへの指示状態
const defLP_liveframeState = 1; // 配信フレームを表示しきったかどうか
const defLP_actionReserve = 2; // スパチャorアイテム投げ入れ予約
const defLP_nextCommentFrame = 3; // 次のチャットコメント出すまでのフレーム
local pat_num_SuperChatRed = BMvEff.GetPatternNum( { datatype=0, pat="SuperChatRed" } ); // パターン文字列のパターン番号を事前取得
local pat_num_SuperChatGreen = BMvEff.GetPatternNum( { datatype=0, pat="SuperChatGreen" } ); // パターン文字列のパターン番号を事前取得
local pat_num_ChatMsg = BMvEff.GetPatternNum( { datatype=0, pat="ChatMsg" } ); // パターン文字列のパターン番号を事前取得
// 配信フレーム 管理オブジェクトも兼ねる
t.Mv_Obj_liveframe <-
{
function Init_After() : (getNecoName)
{
BMvTbl.SetMuki( _Direction_Right );//右向き固定
//画面中央に出す
BMvEff.SetObjectFlags( { flags=_ObjFlags_NoCamera } );
BMvTbl.SetPosition( { x=0, y=0 } );
BMvTbl.SetLP(defLP_avaCommand,0); // アバターへの指示状態 0:なし、2:スパチャ、3:アイテム投げ入れ、9:終了処理開始
BMvTbl.SetLP(defLP_liveframeState,0); // 配信フレームを表示しきったかどうか 1になったらチャット欄のコメント表示開始
BMvTbl.SetLP(defLP_actionReserve,0); // スパチャorアイテム投げ入れ予約 1:スパチャ確定 2:アイテム投げ入れ 3:スパチャ終了
BMvTbl.SetLP(defLP_nextCommentFrame,60); // 次のコメント出すまでのフレーム
BMvEff.Cockpit_SetView( { mode=2 } ); // ゲージ類非表示に
local mv_name= "Mv_Obj_" + getNecoName() + "NecoAvatar";
BMvEff.CreateObject({ mvname=mv_name });
}
function FrameUpdate_After() : (pat_num_SuperChatRed,pat_num_SuperChatGreen,pat_num_ChatMsg,gachaPick)
{
switch( Battle_Std.GetUpdateFrameID() )
{
case 100:
BMvTbl.SetLP(defLP_liveframeState,1); // フレーム表示しきった チャット欄を開始するために使う
break;
case 900:
// 終了時の暗転処理
if( Battle_Std.RoundisEnd() )
{
// ラウンド終了してたら枠が消えないように無限ループに飛ばす ネコのセリフがあるので配信画面を終了させない
BMvTbl.JumpFrameID(9999);
}
else
{
BMvTbl.SetLP(defLP_avaCommand,9); // 終了処理開始
// 終了時の時間停止処理は自分・相手・vの3つの時間停止が被り影響範囲が広そうなので廃止
/*
//相手に、暗転後動けるようになると消えるオブジェクトを呼ぶ
Battle_Std.CallAntenStopObject();
if( Battle_Std.EasyCheckCharaIsSPActionProduction(1) == 0 ) // ロックするADやLA中のとき以外
{
// ロックするADやLAの最中は演出がおかしくなるかもなので時間停止しない
// というか常にしない方がいいんじゃない?って気もするけど…
local stoptime = 120; //暗転停止時間
BMvEff.SetStopTime( { time=stoptime } ); //時間停止
BMvEff.CutInProc_Set({ time=[3,stoptime-3,10], cutin_mv="",erasetype=0, bgtype=1 });
}
*/
}
break;
case 1000: // 配信終了 表示物の削除
local findobj = BMvCore.CFindObject(); // クラス生成
local loopflag = true; // ループフラグ
while( loopflag )
{
local chat_comments = findobj.Get(def_ObjID_chat);
if( chat_comments.push() ) // 有効かどうか
{
// チャットコメント消去
BMvTbl.SetFinalize();
chat_comments.pop();
}
else
{
loopflag = false; // 無効だったので検索ループを抜ける
}
}
break;
}
local mvs = BMvTbl.GetMvStatus();
// しばらくたったらアイテム投げ入れかスパチャが始まる 他の処理が走っている可能性があるのでフラグ立てるだけ
if( mvs.MvCount > 400 && BMvTbl.GetLP(defLP_avaCommand)!=9 && BMvTbl.GetLP(defLP_actionReserve)==0 )
{
// アイテム投げ入れorスーパーチャット
if( BMvEff.Random_Limit(2) )
{
BMvTbl.SetLP(defLP_actionReserve,1); // スパチャ確定
// BMvTbl.SetLP(defLP_avaCommand,2); // アバターへの指示はスパチャ表示タイミングで行う
}
else
{
BMvTbl.SetLP(defLP_avaCommand,3); //アイテム投げ入れ
BMvTbl.SetLP(defLP_actionReserve,2);// アイテム投げ入れ確定
}
}
// チャット欄更新処理
// コメントの数と順番をLPでコメント自体に記憶して、コメントが増えるごとに一個ずつずらして表示する
// 一定フレームごとにチャット更新 配信画面の枠が完全に表示されたら開始 終了処理に入っていなければ表示
local chatframe = BMvTbl.GetLP(defLP_nextCommentFrame);
if( mvs.MvCount%chatframe == 0 && BMvTbl.GetLP(defLP_liveframeState)==1 && BMvTbl.GetLP(defLP_avaCommand) != 9 )
{
// 次のコメントまでの時間を再計算
local rand_frame = BMvEff.Random_Limit(91);
BMvTbl.SetLP(defLP_nextCommentFrame,rand_frame+30); // 30~120Fでランダム
// スパチャかどうかチェック
local isSpacha = 0;
if( BMvTbl.GetLP(defLP_actionReserve)==1 )
{
isSpacha = 1;
BMvTbl.SetLP(defLP_avaCommand,2); // アバターへのスパチャ指示
BMvTbl.SetLP(defLP_actionReserve,3); // スパチャやったことを記憶
}
// 既存のコメントを動かす
local isLiveEnd = ( BMvTbl.GetLP(defLP_liveframeState) == 2 )? 1 : 0; // 配信終了かどうか
local findobj = BMvCore.CFindObject(); // クラス生成
local loopflag = true; // ループフラグ
while( loopflag )
{
local chat_comments = findobj.Get(def_ObjID_chat);
if( chat_comments.push() ) // 有効かどうか
{
local my_num = BMvTbl.AddLP(0,1+isSpacha); // 今何番目のコメントか スパチャを追加する場合は二個増やす
if( my_num > 4 )
{
// 同時表示の限界を超えたら消える
BMvTbl.SetFinalize();
}
else
{
BMvTbl.SetPosition( { y=-520-(30*my_num), flags=_Position_CaptureShift } );
}
chat_comments.pop();
}
else
{
loopflag = false; // 無効だったので検索ループを抜ける
}
}
if( !isLiveEnd )
{
// 新しいアイコンとコメントを生成
// チャットのLP0:今何番目のコメントか
local set_pat = 0; // コメントのパターン 赤緑スパチャor通常コメント
local come_type = 0; // コメントの種類
// スパチャの処理
if( isSpacha )
{
// 赤スパチャor緑スパチャ
local commentList = [
[pat_num_SuperChatRed,3],//行動,重み,幸運補正値
[pat_num_SuperChatGreen,0],
];
local pickIndex = gachaPick(commentList);
set_pat = commentList[pickIndex][0];
local comeNum = ( pickIndex==0 )? 11 : 15; // スパチャの種類 赤 : 緑
come_type = BMvEff.Random_Limit(comeNum);
//MEMO:プレイヤーがどういう状態かわからないのでキャラを光らせたりアーマーにしたりするのはNG
if( !Battle_Std.RoundisEnd() )
{
local player = BMvCore.GetPlayerCharaData();
if( player.push() )
{
local healmv_name = "";
local hpheal_val = 0;
local p_pos = BMvTbl.GetPosition();
if( pickIndex==0 )
{
// 赤スパチャの処理
BMvEff.SetSpGauge( { value=30000, correct=0 } ); // ゲージ増加
healmv_name = "Mv_Obj_Eff_HealSP";
}
else
{
// 緑スパチャの処理
hpheal_val = 2;
BMvEff.SetHpGauge( { value=hpheal_val*500 } ); // 体力増加
healmv_name = "Mv_Obj_Eff_HealHP";
}
player.pop();
// 回復エフェクト表示
local player_side = BMvTbl.GetPlayerSide();
local eff = BMvEff.CreateObject({ x=p_pos.x, y=p_pos.y, mvname=healmv_name});
if( eff.push() )
{
BMvTbl.SetLP(0,player_side); // 1P2Pを記憶 エフェクト追尾用
BMvTbl.SetLP(1,hpheal_val); // 体力回復量を記憶
eff.pop();
}
}
}
}
else
{
// 通常コメント
set_pat = pat_num_ChatMsg;
local comeNum = 50; // コメントの種類
come_type = BMvEff.Random_Limit(comeNum);
}
// コメントを表示 一括管理できるようにIDを振る
local chat_comment = BMvEff.CreateObject({ start_pat=set_pat, id=def_ObjID_chat, mvname="Mv_VtuberComment" });
if( chat_comment.push() )
{
BMvTbl.SetLP(0,isSpacha); // コメントの順番を初期化 スパチャの時は1個多くカウントする
BMvEff.SetObjectFlags({ flags=_ObjFlags_ParentMove|_ObjFlags_NoCamera|_ObjFlags_EraseParentPatChange|_ObjFlags_MoveTimeStopAll });
BMvTbl.JumpFrameID( come_type+1 ); // ランダムでコメントを変更
local comment_posy = -520-30*isSpacha; // スパチャなら一個分上にずらす
BMvTbl.SetPosition( { x=100, y=comment_posy, flags=_Position_CaptureShift } );
// アイコン表示 コメントにくっつけるだけ
local chatIcon = BMvEff.CreateObject({ start_pat="ChatIcon" });
if( chatIcon.push() )
{
BMvEff.SetObjectFlags({ flags=_ObjFlags_ParentMove|_ObjFlags_NoCamera|_ObjFlags_EraseParentPatChange|_ObjFlags_MoveTimeStopAll });
local iconNum = 27; // アイコンの種類
local iconRand = BMvEff.Random_Limit(iconNum);
BMvTbl.JumpFrameID( iconRand+1 ); // ランダムでアイコンを変更
chatIcon.pop();
}
chat_comment.pop();
}
}
}
// BGMの音量調整(defVolFadeTimeでフェードさせてるのでそれ以降にやる)
// ラストアーク中にBGM下げる処理と干渉しないように管理
local haishin_state = BMvTbl.GetLP(defLP_avaCommand); //0:なし、2:スパチャ、3:アイテム投げ入れ、9:終了処理開始
if( mvs.MvCount > defVolFadeTime && haishin_state != 9 )
{
// LAでロック中かチェック
if( Battle_Std.EasyCheckCharaIsSPActionProduction(1) != 2 ) // LA中以外(通常時)
{
//BGMのフェードアウト LA終了時(LAじゃない時)に音量元に戻されるので、LA以外中は常に毎フレーム音量下げとく
BSound.BGM_SetFade( { val=defSetVol, time=0 } );
}
}
}
function LastUpdate_After()
{
BMvEff.Cockpit_SetView( { mode=1 } ); // ゲージ類表示
if( Battle_Std.EasyCheckCharaIsSPActionProduction(1) != 2 )
{
BSound.BGM_SetFade( { val=100, time=defVolFadeTime } );//BGMのフェードアウト解除 LA中ならLA側で音量元に戻されるのでこちらでは何もしない
}
BSound.Voice_SetFade( { val=100, time=defVolFadeTime } );//Voiceのフェードアウト解除
BSound.SE_SetFade( { val=100, time=defVolFadeTime } );//SEのフェードアウト解除
BMvTbl.SetPP(defc_PP_Chr019_IsUseSPAction,0); // 超技クラス終了
}
}
t.Mv_VtuberComment <-
{
function Init()
{
}
function Finalize()
{
BMvTbl.SetDeleteMoveTable();
}
}
//アバターのセリフ字幕を呼び出す
local playSubtitleAvatorVoice = function( _se, _delay=120, _fontsize=24 )
{
local use_delay = _delay;
local use_fontsize = _fontsize;
local tag = format("battlevoice_chr%03d_%03d",Def_ChrNo_Chr019,_se );
local string = sqfunc.GetExStringText( tag );
local param = BSound.SE_GetUserParam( { type=_SeType_Player, num=_se, } );//音声のフレーム数を取得
if( param != 0 )
{
use_delay = param + 10;//少しマージンあり
}
//未定義のときは*が入るのでそこでチェック
if( string != "*" )
{
BMvEff.Chara_SetMessageBattle( 640, 600, string, use_delay, _se );
BMvEff.Chara_SetMessageFontSize(use_fontsize);
}
else
{
BSound.SE_Play( { type=_SeType_Player, num=_se } );
}
}
// ネコアバター
t.Mv_Obj_NecoAvatar <-
{
function Init_After()
{
BMvTbl.SetMuki( _Direction_Right );//右向き固定
//画面中央に出す
BMvEff.SetObjectFlags( { flags=_ObjFlags_NoCamera|_ObjFlags_EraseParentPatChange|_ObjFlags_MoveTimeStopAll } );
BMvTbl.SetPosition( { x=480*128, y=0 } );
BMvTbl.SetLP(0,0); // アバターの状態
// 0:発動からの挨拶中
// 1:しゃべってない待機状態
// 2:スパチャが流れてきた時
// 3:アイテム投げ入れ
// 4:ネコアルクがコンボ開始
// 5:ネコアルクがEX技orADで暗転
// 6:ネコアルクがダウンから起き上がり
// 7:ネコアルクが勝利
// 8:ネコアルクが敗北
// 9:終了
BMvTbl.SetLP(1,0); // スパチャorアイテム投げ入れやったか
}
function FrameUpdate_After() : (playSubtitleAvatorVoice,getNecoName)
{
// ネコシリーズならパターン名の頭に識別子を付ける
local neco_name = getNecoName();
// 条件を満たしたらパターンジャンプ
local ava_state = BMvTbl.GetLP(0);
// _dp("\n ava_state:"+ava_state);
//勝利と敗北の処理
if( Battle_Std.RoundisEnd() )
{
local rs = BMvTbl.GetMvRoundStatus(); //ラウンドステータス取得
if( rs.WinType == 1 && ava_state == 1 )
{
// 勝利
BMvTbl.SetPattern(neco_name+"NecoAvatar_Wink");
BMvTbl.SetLP(0,7);
}
else if( ava_state == 1 )
{
// 敗北orドロー(ドロー時は本体が負けモーションになるので敗北と同じ扱いにする)
BMvTbl.SetPattern(neco_name+"NecoAvatar_Bpp");
BMvTbl.SetLP(0,8);
}
}
else
{
// 親のタイムラインチェック
local oya = BMvCore.GetParentCharaData();
local isEvented = BMvTbl.GetLP(1); // スパチャorアイテム投げ入れやったか
if( oya.push() )
{
local oya_state = BMvTbl.GetLP(defLP_avaCommand);
oya.pop();
if( oya_state == 9 && ava_state != 9 )
{
// 配信終了になった
BMvTbl.SetPattern(neco_name+"NecoAvatar_End");
BMvTbl.SetLP(0,9);
}
else if( oya_state == 2 && !isEvented )
{
// スパチャ
BMvTbl.SetPattern(neco_name+"NecoAvatar_Spacha");
BMvTbl.SetLP(0,2);
BMvTbl.SetLP(1,1);// スパチャorアイテム投げ入れやった
}
else if( oya_state == 3 && !isEvented )
{
// アイテム投げ入れ
BMvTbl.SetPattern(neco_name+"NecoAvatar_ItemThrow");
BMvTbl.SetLP(0,3);
BMvTbl.SetLP(1,1);// スパチャorアイテム投げ入れやった
}
else
{
// ネコアルク本体の状態チェック 優先度低い
if( ava_state == 1 ) // 待機中のみ
{
local player = BMvCore.GetPlayerCharaData();
if( player.push() )
{
local isSidou = 0; // コンボ始動当てた
local isAnten = 0; // 暗転技使った
local isDown = 0; // ダウンからの起き上がり
local mvs = BMvTbl.GetMvStatus();
// 同時には起きないのでelseでチェック
if( Battle_Std.MoveCodeEx.CheckFlag( 1, def_MC1_SidouHitSkill ) && mvs.MvCount<60 )
{
// 始動技当ててから60F以上経過してるようならやらない
isSidou = 1;
}
else if( Battle_Std.MoveCodeEx.CheckFlag( 3, def_MC3_Anten ) )
{
isAnten = 1;
}
else if( BMvTbl.GetMvName() == "Mv_Modori_Down" )
{
isDown = 1;
}
player.pop();
if( isSidou ) // 始動技当てた
{
BMvTbl.SetPattern(neco_name+"NecoAvatar_Iiyo");
BMvTbl.SetLP(0,4);
}
else if( isAnten ) // 暗転技使った
{
BMvTbl.SetPattern(neco_name+"NecoAvatar_Star");
BMvTbl.SetLP(0,5);
}
else if( isDown ) // 起き上がり
{
BMvTbl.SetPattern(neco_name+"NecoAvatar_Ikari");
BMvTbl.SetLP(0,6);
}
}
}
}
}
}
local mvs = BMvTbl.GetMvStatus();
switch( Battle_Std.GetUpdateFrameID(mvs) )
{
case 100: // 待機状態
BMvTbl.SetLP(0,1); // FrameIDが100になったら初期化
break;
case 200: // セリフ再生 ※下記のリストはse_list.txtで定義してある番号
local voiceList =
{
[10] = 590,// こんばんは~
[15] = 591,// グレキャちゃんねる、はっじまっるよ~
[20] = 592,// スーパーキャッツ!サンキュー!
[30] = 594,// 今がチャンス!
[40] = 599,// いいよいいよー
[50] = 596,// ここで大技!
[60] = 598,// ここからはガチャプレイで行くゾ!
[70] = 597,// ペロッ、これは神ゲーの味!
[80] = 595,// 今のハメじゃにゃい?
[90] = 593,// 今回の配信はこのようなもの
}
playSubtitleAvatorVoice( voiceList[mvs.Param0] );
break;
case 300: // アイテム射出
// ランダムで投げるアイテムが違う
local itemRand = BMvEff.Random_Limit(2);
local mv_name = ( itemRand==0 )? "Mv_LandObj_ItemStone" : "Mv_LandObj_ItemPear";
local pos = BMvEff.GetCameraPosition( { x=0, y=0, flags=_GetPos_TrueCamera | _GetPos_Offset | _GetPos_NoMuki } );
local eff = BMvEff.CreateObject({ x=pos.x+480*128*BMvTbl.GetMuki(), y=pos.y-60*128, mvname=mv_name });
if( eff.push() )
{
// 投げる速度は多少ランダムに
local rand = BMvEff.Random_Limit(500);
BMvTbl.SetVector({ x=-1500+rand, y=-5000+rand, addy=150 });
eff.pop();
}
local oya = BMvCore.GetParentCharaData();
if( oya.push() )
{
BMvTbl.SetLP(defLP_avaCommand,0); // 親の状態リセット
oya.pop();
}
break;
}
}
}
t.Mv_Obj_Cie_NecoAvatar <- t.Mv_Obj_NecoAvatar;
t.Mv_Obj_Sak_NecoAvatar <- t.Mv_Obj_NecoAvatar;
t.Mv_Obj_His_NecoAvatar <- t.Mv_Obj_NecoAvatar;
t.Mv_Obj_Koh_NecoAvatar <- t.Mv_Obj_NecoAvatar;
//-----------------------------------------------------------------------------
// 超必殺技
//-----------------------------------------------------------------------------
t.Mv_Skill_41236SP <-
{
fgp = Def_FGP_Invincibility|Def_FGP_ShotFireBall,
function Init_After()
{
Battle_Std.MoveCode.AddFlag( def_MC_CharaFlag1 );
BMvEff.SetCamera_Clipping( 0 ); //画面端のクリッピング補正を切る
BMvTbl.SetLP(0,0);//クリッピングとカメラを戻したか
BMvTbl.SetLP(1,0);//ヒットしたか
BMvEff.CreateObject({ mvname="Mv_Obj_NPframe" });
}
function FrameUpdate_After()
{
switch( Battle_Std.GetUpdateFrameID() )
{
case 100:
//カメラを引く
local pos = BMvTbl.GetPosition();
local camera_focus = { x = pos.x + 600*128*BMvTbl.GetMuki(), y=-50*128 };
BMvEff.SetCamera_Focus( { x=camera_focus.x, y=camera_focus.y, zoom=0.7, time=[20,360,10], type_in=1 } );
break;
case 500:
//終了
if( BMvTbl.GetLP(1)==0 )
{
//ヒットしてないときはすぐに戻す
//ヒット時は無敵なのでLastUpdateで戻す
BMvTbl.SetLP(0,1);//クリッピングとカメラを戻した
BMvEff.SetCamera_Focus( { time=[0,0,30] } );
BMvEff.SetCamera_Clipping( 1 ); //画面端のクリッピング補正をかける
}
break;
}
}
function HitInterrupt_After()
{
if( Battle_Std.CheckDamageTiming_ExceptDown() )
{
if( BMvTbl.GetLP(1)==0 )
{
// 初回ヒット時の処理
BMvTbl.SetLP(1,1);//ヒットしたか
Battle_Std.BoostArcDriveComboDamage();
}
BMvEff.SetPlayerTimer( { muteki_nage=60, muteki_dage=60 } ); //ヒットしたら無敵で上書き
Battle_Std.SetPosition_DamageHanteiRect( { power = 75 } ); // 半ロック
}
}
function LastUpdate_After()
{
BMvEff.SetPlayerTimer( { muteki_nage=0, muteki_dage=0 } ); //無敵状態を解除
//クリッピングを戻した瞬間に別のADを食らうとクリッピングが戻ったまま開始してしまう対策
//MEMO:処理としては結構力技。無敵などでごまかしているが、根本的には直っていない
if( BMvTbl.GetLP(0)==0 )
{
//クリッピングとカメラを戻してなかったら戻す
BMvEff.SetCamera_Focus( { time=[0,0,30] } );
BMvEff.SetCamera_Clipping( 1 ); //画面端のクリッピング補正をかける
}
}
}
// 使用時のゲージ残量に応じて表示する枠を変える
t.Mv_Obj_NPframe <-
{
function Init_After()
{
BMvTbl.SetMuki( _Direction_Right );//右向き固定
//画面中央に出す
BMvEff.SetObjectFlags( { flags=_ObjFlags_NoCamera } );
BMvTbl.SetPosition( { x=0, y=0 } );
local NP_Level = 0; // 宝具レベル
local isHeat = Battle_Std.PP_CheckFlag( def_PP_ArcDriveStatus, def_PP_ADS_Heat );
local isBloodHeat = Battle_Std.PP_CheckFlag( def_PP_ArcDriveStatus, def_PP_ADS_BloodHeat );
if( isHeat || isBloodHeat )
{
local heat_gauge_par = BMvTbl.GetPP(def_PP_SPInitHeatTimeValue); // 開放中以外は0
if( heat_gauge_par < 0 ) heat_gauge_par = 0;
if( heat_gauge_par > 100 ) heat_gauge_par = 100;
if( heat_gauge_par >= 0 && heat_gauge_par < 30 )
{
// 0~29は宝具レベル1
BMvTbl.JumpFrameID(100);
}
if( heat_gauge_par >= 30 && heat_gauge_par < 60 )
{
// 30~59は宝具レベル3
BMvTbl.JumpFrameID(200);
}
else if( heat_gauge_par >= 60 && isHeat )
{
// ヒートで60~は宝具レベル5
BMvTbl.JumpFrameID(300);
}
else if( heat_gauge_par >= 60 && isBloodHeat )
{
// ブラッドヒートで60~は宝具レベル5で装飾豪華
BMvTbl.JumpFrameID(500);
}
}
else
{
BMvTbl.JumpFrameID(300); // 宝具レベル5
}
}
}
t.Mv_Skill_63214SP <-
{
fgp = Def_FGP_Invincibility,
function Init_After()
{
BMvTbl.SetLP(1,0);//ヒットしたか
}
function FrameUpdate_After()
{
}
function HitInterrupt_After()
{
if( Battle_Std.CheckDamageTiming_ExceptDown() )
{
if( BMvTbl.GetLP(1)==0 )
{
// 初回ヒット時の処理
BMvTbl.SetLP(1,1);//ヒットしたか
Battle_Std.BoostArcDriveComboDamage();
}
Battle_Std.SetPosition_DamageHanteiRect();
}
}
function LastUpdate_After()
{
}
}
//-----------------------------------------------------------------------------
// ラストアーク
//-----------------------------------------------------------------------------
t.Mv_Skill_LastArc_Hit <-
{
flags = def_TmplFlags_NoAddComboRate // コンボレートを加算しない
function EnemyRelease()
{
BMvEff.ThrowParam( { pattern=620 x=400, y=-1200 } );
BMvEff.ThrowRelease( { type="バウンド_E1", airrecover=0, flags=_ThrowRelease_NoAttackHit|_ThrowRelease_NoGroundRecover } );
}
function Init_After()
{
Battle_Std.InitLastArc();
BMvEff.ThrowChara_SetJoint( 0 ); // 切り離す
BMvEff.ThrowChara_SetCamera( 0 ); // 相手をカメラにふくめる
BMvEff.SetCamera_Clipping( 0 ); //画面端のクリッピング補正を切る
BMvEff.SetExist( { level = _Exist_NoWall } ); // 画面外で行動する場合があるので壁判定解除
BMvEff.ThrowParam( { pattern=620 x=300, y=3000 } );//消す
local pos = BMvTbl.GetPosition();
BMvEff.CreateObject({ mvname="Mv_Obj_LA_Rocket", x=-600*128 });
BMvTbl.SetLP(0,BMvTbl.GetMuki()); // 向きを記憶
}
function FrameUpdate_After()
{
switch( Battle_Std.GetUpdateFrameID() )
{
case 100: // ネコがロケットと接触
break;
case 200: // 宇宙に
BSound.BGM_SetFade( { val=50, time=60 } );//BGMのフェードアウト
BSound.SE_Stop( { type=_SeType_Normal, fadetime=60 } ); // 画面切り替わりなので一旦SE停止
BMvEff.CreateObject({ mvname="Mv_Obj_LA_RocketUniverse", y=-260*128 }); // ロケット
break;
case 300: // 銀河
BSound.BGM_SetFade( { val=25, time=60 } );//BGMのフェードアウト
BSound.SE_Stop( { type=_SeType_Normal, fadetime=30 } ); // 画面切り替わりなので一旦SE停止
//カメラをアップに
local pos = BMvTbl.GetPosition( 0 );
BMvEff.SetCamera_Focus( { x=pos.x, y=pos.y, zoom=2.0, time=[0,0,45], type_in=1 } );
break;
case 900:
local eff = BMvEff.CreateObject( { mvname="Mv_Obj_LastArc_RapidAtk" } );
if( eff.push() )
{
Battle_Std.SetPos_MarkingEnemy();
eff.pop();
}
BMvEff.SetCamera_Quake( { time=120, type=2, clear=0, } ); //揺らし
BMvEff.FadeProc_Set( { type=0, time=[120,999,10] color=0xFFFFFF } ); //
// 判定ツールで固定で右向きにしてるので元々左向きなら向きを戻す
if( BMvTbl.GetLP(0)==-1 )
{
BMvTbl.SetMuki( _Direction_Left );
}
break;
}
}
function HitInterrupt_After()
{
}
function Finalize()
{
BMvTbl.SetNextMoveTable( "Mv_Skill_LastArc_End" );
}
function LastUpdate_After()
{
EnemyRelease();
Battle_Std.ClearSPLockCamera( { flags=(1<<0), pos={ player={ x=0, y=0 }, enemy={ x=400, y=-1200 } } } );
Battle_Std.LastUpdateLastArc();
BMvEff.Cockpit_SetPrioU( 0 );//戻し
}
}
local pat_num_350_LA_Rocketlaunch = BMvEff.GetPatternNum( { datatype=0, pat="LA_Rocketlaunch" } ); // パターン文字列のパターン番号を事前取得
t.Mv_Obj_LA_Rocket <-
{
function Init_After()
{
// 向きに応じてレイヤーマスク
local muki = BMvTbl.GetMuki();
local mask = (muki==1)? (1<<1):(1<<0);
BMvTbl.SetHan6LayerMask( { val = mask } );
}
function FrameUpdate_After() : (pat_num_350_LA_Rocketlaunch)
{
//ネコアルクが特殊判定0に触れているかチェック
local isNecoRide = 0; // ネコが乗ったか
local neco = BMvEff.CheckHantei( { src=[ _Hantei_Etc, 0, 1 ], dst=[ _Hantei_Etc , 0, 1 ], flags=_HC_FavourPc } );
if( neco.push() )
{
BMvTbl.JumpFrameID(100);// 見た目を消すとこにジャンプ
neco.pop();
BMvTbl.SetPattern(pat_num_350_LA_Rocketlaunch);//乗り込んだ絵にジャンプ
}
}
}
// 宇宙に飛んでるロケット
t.Mv_Obj_LA_RocketUniverse <-
{
function FrameUpdate_After()
{
switch( Battle_Std.GetUpdateFrameID() )
{
case 100:
BMvEff.CreateObject({ mvname="Mv_Obj_LA_NecoUniverse", x=-90*128, y=90*128 });
break;
}
}
}
// ロケットの窓から見えるネコ
t.Mv_Obj_LA_NecoUniverse <-
{
function Init_After()
{
BMvTbl.SetVector({ x=310, y=-430, flags=_Vector_Normal });
BMvEff.SetObjectFlags({ flags=_ObjFlags_ParentMove|_ObjFlags_EraseParentPatChange });
local face_num = BMvEff.Random_Limit(6); // 表情はランダム
local color = BMvTbl.GetPP(defc_PP_Chr019_NecoColor);
switch( color )
{
case 36:
case 37:
// ネココハク 最後のセリフが「こんな星にいられるか!アタシは帰らせてもらう!」の場合は感動顔に
if( BMvTbl.GetPP(def_PP_LastPlaySound) == 642 ) face_num = 3;
break;
}
BMvTbl.JumpFrameID(face_num);
}
}
t.Mv_Obj_LastArc_RapidAtk <- {};//KO判定
t.Mv_Skill_LastArc_End <-
{
flags = def_TmplFlags_NoFurimuki,
};
CHR019_MoveTable <- Battle_Std.MakeMoveTable( t, CHR019_CommandTable, Def_ChrNo_Chr019 );
__dofile__("./data/chr019/chr019_se_category.txt"); //SE定義
_dp(" -> Load OK");
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment