TAG换人战代码的略简易科普+讲解
作者口水轩
TAG换人战代码其实并不是什么新鲜的东西了,不过在天朝mugen界貌似并不普及。最近胧零君搬运了某个TAG杯赛,引起了大家的关注和好奇,这东西才慢慢又进入了我们的视线。
笔者其实一直想略研究一下这个代码的,不过由于作业多(泥垢)+找不到源代码所以一直就耽搁着。在若干周之前很幸运在胧零君那里得到源代码,大概自己拆开了看了看,大概做了下翻译讲解。在此笔者就对这一种系统的代码作一下简单的讲解吧(普及用意)...
另外该换人战代码的作者是pprn氏,胧零君之前推广的“在血条上显示Life的剩余数值的方法”也是他的代码,在此谢谢他的创意以及分享精神OTL,还有要感谢胧零君给了我这个文件OTL...
惯例贴作者地址https://skydrive.live.com/?cid=e3545520e659ce44
其实这个系统的原理是,在两个人物里面共同添加某些特殊状态号,之后双打时人物根据特殊的状态做出相关的切换变化等等。
首先在def文件当中st部分,紧接着最后一个st X(例如最后一个是st3),加上st X+1(即st4) = TAG.txt(也就是这个文本,令人物可以读取本文本里面的代码(当然你喜欢把这文本里面的内容添加到其他st文件也行,反正原理一样,能读取就好),之后慢慢按步骤修改下面此文件,最后在其他相关地方添加好代码即可。
另外因为援护系统的多样性,这个系统里面糅合了各种各样的系统,有特殊要求的话请自己特化。同时不同作者的TAG代码都会有些许的不同,所以使用时最好自己统一一下。比较推荐的TAG作者有TR氏,网盘地址https://skydrive.live.com/?ci d=B83DD1C94FCB3105
由于全部代码贴出来的话显得略♂长,而且还有几张pcx图片,所以还是发到我网盘吧
网盘地址https://skydrive.live.com/?cid=ea4512f91a7269b5,放在TAG讲解文件夹内
代码部分:
;4/2 大きなバグでない限り最終稿
;バグとかあったらご報告お願いします
;「ココ」で検索するとキャラごとに変更しなければならない位置に飛びます
;sysfvar 添加此系统需要用到以下sysfvar
; 2 前衛/後衛 sysfvar(2)是是否出场人物(0是/1否)
; 0:前衛
; 1:後衛
; 3 アシスト選択 sysfvar(3)是援护类型选择,用于区分特殊出场、援护出场等不同情况
; -1:イントロ -1是开场,-2是特殊出场
; -2:特殊交代
; <-2:ディレイドハイパーコンボ
; 4 再突入カウント sysfvar(4)是可再次进入的时间计数,为0时表示可以进入,赋值均为
; XX*60,即XX秒(mugen1秒60f)。如果想改变该时间,麻烦在下面的
; sysfvar(4)赋值地方更改其值
;
;Statedef 添加此系统新增的状态:
; 358000 交代モーション 主动请求换人
; 358001 後退ジャンプ 向后跳进入待机
; 358002 待機中 待机
; 358003 通常突入落下 正常进场
; 358004 アシスト突入落下 援护攻击进场
;
;ExplodID 这里的都是要加入的提示动画,不过其实并不是必要的,可以不加
; 358000 AssistOK! 援护可用
; 358001 AssistAttack! 援护攻击
; 358002 Change! 换人提示
; 358003 待機時間の黄帯 换人槽
;
;
;後衛時のAIの行動制限方法
; 全行動に「triggerall = sysfvar(2) = 0」を追加
;因为AI里面增加了新的状态,处于不在战斗状态时不能做其他动作,
;所以请把原AI的原有动作前都加上【triggerall = sysfvar(2) = 0】加以限制
;↓から適当な位置にコピー
;===================================================================
;交代モーション
;===================================================================
[Statedef 358000]
type = S
ctrl = 0
velset = 0,0
;ココ
;交代モーションと台詞
;10F以上は確保して下さい。長すぎると待機までが長引くのでほどほどに
;请求换人的动画,下面的value要自己设,动画也需要自己设定,怕麻烦可以直接用挑衅动作
[state 358000,Anim変更]
type = changeanim
trigger1 = time = 0
value = 192; モーション
;请求换人动画所需要用的台词声效,需要自己设定
[State 358000, 交代ボイス]
type = PlaySnd
trigger1 = time = 1
value = 12,7; 台詞
;画面绑定,可无视
[State 358000,カメラに追われないように]
type = ScreenBound
trigger1 = partner,stateno = 358003
value = 0
movecamera = 0,0
;可再次进入的时间计数重设
[state 8000];待機時間
type = varset
trigger1 = partner,stateno = 358003
sysfvar(4) = 60
ignorehitpause = 1
;请求换人成功
[state 8000,2];交代成立
type = varset
trigger1 = partner,stateno = 358003
sysfvar(3) = 1
ignorehitpause = 1
;换人命令成立后无敌
[state 8000,2];交代成立後無敵◇
type = nothitby
trigger1 = partner,stateno = 358003 || time > 10
value = SCA
time = 999
;无推挤效果,可无视
[state 358000,押し出し判定削除]
type = playerpush
trigger1 = partner,stateno = 358003
value = 0
;请求换人成功后退场
[State 358000,ジャンプステートへ]
type = Changestate
trigger1 = animtime = 0 || time > 30
value = 358001
;===================================================================
;後退ジャンプ中
;===================================================================
[Statedef 358001]
type = S
ctrl = 0
anim = 40
;ココ
;ジャンプ音の指定
;跳跃音效,需要自己设定
[State 358000, ジャンプ音]
type = PlaySnd
trigger1 = anim = 40 && animtime = 0
value = 0,1
persistent = 0
;画面绑定,可无视
[State 358001,カメラに追われないように]
type = ScreenBound
trigger1 = 1
value = 0
movecamera = 0,0
;跳跃动画,通常不用换
[State 358001,後方ジャンプ]
type = ChangeAnim
trigger1 = anim = 40 && animtime = 0
value = 43
;移动速度,可无视
[State 358001,ジャンプ速度]
type = VelSet
trigger1 = anim = 43
x = -15
Y = -5
;可再次进入的时间计数重设
[state 8001,5];特殊交代の待機時間
type = varset
trigger1 = time = 0
trigger1 = partner,sysfvar(3) = -2
sysfvar(4) = 60*5
;可再次进入的时间计数重设
[state 8001,5];ディレイドの待機時間
type = varset
trigger1 = time = 0
trigger1 = partner,sysfvar(3) < -2
sysfvar(4) = 60*2;◆
;退到版边切换为待机状态
[State 358001,待機ステートに移行]
type = ChangeState
trigger1 = backEdgeDist <= -40
value = 358002
;===================================================================
;待機中
;===================================================================
[Statedef 358002]
type = A
ctrl = 0
anim = 0
movetype= I
physics = S
;Attack提示动画消去
[state 8000];Attack消去
type = removeexplod
trigger1 = 1
ID = 358002
;援护攻击类型选择重设
[state 8001];アシスト選択リセット
type = varset
trigger1 = sysfvar(3) != 0
sysfvar(3) = 0
;可再次进入的时间计数小于0时重设
[state 8002];待機時間0
type = varset
trigger1 = sysfvar(4) < 0
sysfvar(4) = 0
;可再次进入的时间计数缓慢减少
[state 8002];待機時間カウントダウン
type = varadd
trigger1 = sysfvar(4) > 0
sysfvar(4) = -1
;画面绑定,可无视
[State 358002,カメラに追われないように]
type = ScreenBound
trigger1 = 1
value = 0
movecamera = 0,0
;透明化不可视
[State 358002,透明化]
type = AssertSpecial
trigger1 = 1
flag = noshadow
flag2 = invisible
;无敌,以免被打到
[state 358002,無敵化]
type = NotHitBy
trigger1 = 1
value = SCA
;无推挤效果,可无视
[state 358002,押し出し判定削除]
type = playerpush
trigger1 = 1
value = 0
;图像变黑
[State 358002, 黒ずみ]
type = PalFX
trigger1 = 1
time = 1
add = 0,0,0
mul = 100, 100, 100
;待机时回血
[State -358002,待機中ライフ回復]
type = LifeAdd
trigger1 = sysfvar(4) = 0
value = 1
;↓の一行はコメントアウト部分も含めて一切変更しないでください。
;回复速度,数值越小速度越快
persistent = 3;回復;◇
;转向,与队友同方向
[State 358002,向き合わせ]
type = Turn
trigger1 = numpartner
trigger1 = facing != partner,facing
;使位置处于屏幕外
[State 358002,すごく後ろに移動]
type = PosSet
trigger1 = 1
x = -10000*(facing)
y = 0
ignorehitpause = 1
persistent = 1
;强制切换的进场动作,包括队友请求换人、对方死亡、回合结束等
[State 358002,通常乱入]
type = ChangeState
triggerall = numpartner
trigger1 = partner,stateno = 358000 && partner,time >= 10; 相方が後退モーション
trigger2 = partner,alive = 0; 相方死亡
trigger3 = win || losetime || DrawGame; ラウンド終了
trigger4 = ID < partner,ID && partner,stateno = 358002; 相方も待機ステート☆
value = 358003
;援护可用提示,需要自己加上提示的动画
[state 905900,AssistOK表示]
type = Explod
trigger1 = !numexplod(358001) && !numexplod(358002)
trigger1 = sysfvar(4) = 0
anim = F3580
pos = ifelse(teamside=1,80,173), 38
postype = left
facing = ifelse(teamside=1,1,1)
bindtime = -1
supermovetime = 9999999999999
pausemovetime = 9999999999999
scale = .5, .5
ontop = 1
removetime = 1
ID = 358000
;换人槽,需要自己加上提示的动画
[state 905900,残り時間黄帯]
type = Explod
trigger1 = !numexplod(358001) && !numexplod(358002)
trigger1 = sysfvar(4) > 0
anim = F3583
pos = ifelse(teamside=1,139-ceil(sysfvar(4)*0.25),180), 45
postype = left
facing = ifelse(teamside=1,1,1)
bindtime = -1
supermovetime = 9999999999999
pausemovetime = 9999999999999
scale = sysfvar(4)*0.25, .25
ontop = 1
removetime = 1
ID = 358003
[state 905900,残り時間黄帯_1P側の見栄え調整]
type = Explod
trigger1 = !numexplod(358001) && !numexplod(358002)
trigger1 = sysfvar(4) > 0 && teamside=1
anim = F3583
pos = 138, 45
postype = left
facing = ifelse(teamside=1,1,1)
bindtime = -1
supermovetime = 9999999999999
pausemovetime = 9999999999999
scale = 2, .25
ontop = 1
removetime = 1
ID = 358003
;===特殊交代===============
;特殊换人状态
[state 8002,3];★
type = varset
sysfvar(3) = -2
triggerall = numpartner
triggerall = partner,alive && partner,stateno < 358000
triggerall = partner,ctrl && power >= 500 || power >= 1000
triggerall = sysfvar(4) <= 0
;乱入条件。常時ステートへのAI記述と同等でOKです;ココ
;特殊换人进场条件,例如换人连段之类的,需要自己补充AI
trigger1 = partner,command = "z" && partner,command = "holdback"
;以下附送一个耗气换人脱离的例子
;trigger2 = var(59)
;trigger2 = EnemyNear,Movetype = A && Partner,Movetype = H && power >= 1000 && EnemyNear,AnimTime <= -12 && EnemyNear,Stateno < 3000
;trigger2 = Random < 100/(1+(partner,stateno = [150,160)))
;可再次进入的时间计数重设
[state 8003];再突入F
type = varset
trigger1 = sysfvar(3) = -2
sysfvar(4) = 60*5
;切换特殊换人的进场动作
[State 358002,]
type = ChangeState
triggerall = numpartner
trigger1 = partner,alive
trigger1 = sysfvar(3) = -2
value = 358003
;===アシスト指定===============;ココ
;以下是援护攻击。下面要切换的动作虽然是有默认的状态号,但是我个人建议重新自己加入新的援护用状态比较好,
;例如自己新建状态号为360000/360050,专门用于援护攻击A/B,援护攻击状态结束之后就切换回退场动作
;另外,默认的援护攻击并非像KOF那样子出场人物叫出来的,而是非出场人物主动出来攻击,如果需要像KOF那样子
;呼叫才能出场的话,请自己加入请求援护动作和修改援护攻击的出场条件并修改相关代码
;最后如果不要援护攻击的话,把相关的varset去掉即可
;---ディレイド指定-------
;超必杀援护
[state 8002,1]
type = varset
triggerall = numpartner
triggerall = partner,alive && partner,movetype != H;★
triggerall = sysfvar(4) <= 0
;乱入後に移行するステート番号(-を付けて下さい)
;进场后做的超必杀援护攻击状态编号,-3000是默认值,详细的需要自己设定,格式为: -(你需要切换的状态号)
sysfvar(3) = -3000
;乱入条件。常時ステートへのAI記述と同等でOKです
;进场条件,需要自己补充AI
trigger1 = partner,HitDefAttr = SCA, HA, HT, HP
trigger1 = power >= 1500
;---アシスト攻撃A-------☆
;援护攻击A
[state 8002,1]
type = varset
triggerall = numpartner
triggerall = partner,alive
triggerall = sysfvar(4) <= 0
triggerall = partner,movetype != H;◇
;乱入後に移行するステート番号
;进场后做的援护攻击状态编号,1000是默认值,详细的需要自己设定
sysfvar(3) = 1000
;乱入条件。常時ステートへのAI記述と同等でOKです
;进场条件,需要自己补充AI
trigger1 = partner,command = "c"
;可再次进入的时间计数重设
[state 8003];再突入F
type = varset
triggerall = partner,movetype != H;◇
trigger1 = sysfvar(3) = 1000;上のステート番号とあわせる
sysfvar(4) = 60*2.5;乱入終了後(失敗含む)に再度乱入可能になるまでのF数
;-----------------------
;---アシスト攻撃B-------☆
;援护攻击B
[state 8002,1]
type = varset
triggerall = numpartner
triggerall = partner,alive
triggerall = sysfvar(4) <= 0
triggerall = partner,movetype != H;◇
;乱入後に移行するステート番号
;进场后做的援护攻击状态编号,1100是默认值,详细的需要自己设定
sysfvar(3) = 1100
;乱入条件。常時ステートへのAI記述と同等でOKです
;进场条件,需要自己补充AI
trigger1 = partner,command = "c"
;可再次进入的时间计数重设
[state 8003];再突入F
type = varset
triggerall = partner,movetype != H;◇
trigger1 = sysfvar(3) = 1100
sysfvar(4) = 60*2.5;乱入終了後(失敗含む)に再度乱入可能になるまでのF数
;-----------------------
;切换援护攻击的进场动作
[State 358002,]
type = ChangeState
triggerall = numpartner
trigger1 = partner,alive
trigger1 = partner,movetype != H
trigger1 = sysfvar(3) != 0
value = 358004
;===================================================================
;通常突入
;===================================================================
[Statedef 358003]
type = A
ctrl = 1
physics = A
anim = 42
;进场的最初位置设定
[State 358003,突入初期位置]
type = PosSet
trigger1 = time = 0
x = -170*(facing)
y = -140
;特殊换人所需要的消费
[state 8003,2];特殊交代によるゲージ消費
type = poweradd
trigger1 = sysfvar(3) = -2
trigger1 = time = 0
value = -500-500*(partner,ctrl=0)
;换人提示,需要自己加上提示的动画
[state 905900,Change表示]
type = Explod
trigger1 = time = 1
anim = F3581
pos = ifelse(teamside=1,88,173), 40
postype = left
facing = ifelse(teamside=1,1,1)
bindtime = -1
supermovetime = 9999999999999
pausemovetime = 9999999999999
scale = .5, .5
ontop = 1
removetime = 30
ID = 358001
;进场的速度设定
[State 358003,突入落下]
type = VelSet
trigger1 = anim = 42;time >=0
x = 6
Y = 10
;===================================================================
;アシスト突入
;===================================================================
[Statedef 358004]
type = A
ctrl = 0
physics = N
anim = 42
;特殊换人所需要的额外消费
[state 8004];ディレイドのゲージ余剰消費
type = poweradd
trigger1 = time = 0
trigger1 = sysfvar(3) < -1
value = -500
;援护攻击提示,需要自己加上提示的动画
[state 905900,AssistAttack表示]
type = Explod
trigger1 = time = 0
anim = F3582
pos = ifelse(teamside=1,55,173), 40
postype = left
facing = ifelse(teamside=1,1,1)
bindtime = -1
supermovetime = 9999999999999
pausemovetime = 9999999999999
scale = .5, .5
ontop = 1
removetime = -1
ID = 358002
;ココ
;乱入行動によって位置と速度調整をどうぞ
;进场的最初位置设定
[State 358003,突入初期位置]
type = PosSet
trigger1 = time = 0
x = partner,pos x
y = -140
;进场的速度设定
[State 358003,突入落下]
type = VelSet
trigger1 = anim = 42;time >=0
x = 3
Y = 10
;落地时动画切换
[State 358003,着地アニメ]
type = changeanim
trigger1 = pos y >= 0
value = 47
persistent = 0
;落地时速度为0
[State 358003,着地Vel]
type = velset
trigger1 = pos y >= 0
x = 0
y = 0
;落地后人物垂直坐标为0
[State 358003,着地Pos]
type = posset
trigger1 = pos y >= 0
y = 0
;可控设置
[State 358003,sfv3が0になった];◆
type = ctrlset
trigger1 = sysfvar(3) = 0
value = 1
;援护攻击落地后切换动作,会根据你之前设定的援护状态号进行动作切换
[State 358003,攻撃ステートへ];☆
type = changestate
trigger1 = anim = 47 && animtime = 0
value = floor(abs(sysfvar(3)))
;===================================================================
;[statedef -2];に追加
;请将以下代码加进[statedef -2]
;呃,这些是debug用代码
[State -2, 1 デバッグ];☆
type = null;DisplayToClipboard
trigger1 = 1
text = "1P_s2:%d 1P_s3:%d 1P_s4:%d 1P_Sno:%d \n"
params = floor(sysfvar(2)),floor(sysfvar(3)),floor(sysfvar(4)),stateno
ignorehitpause = 1
[State -2, 1 デバッグ];☆
type = null;AppendToClipboard
trigger1 = numpartner
text = "3P_s2:%d 3P_s3:%d 3P_s4:%d 3P_Sno:%d \n"
params = floor(partner,sysfvar(2)),floor(partner,sysfvar(3)),floor(partner,sysfvar(4)),partner,stateno
ignorehitpause = 1
;开场ID大的人物退场(如P3>P1,所以P3退场)
[state -3];開幕判定
type = varset
triggerall = numpartner
triggerall = ID>partner,ID
trigger1 = roundstate < 2
sysfvar(3) = -1
;出场人物强制处理
[state -3];W前衛強制対処★
type = varset
triggerall = numpartner
triggerall = ID>partner,ID
trigger1 = roundstate = 2 && alive && partner,alive
trigger1 = sysfvar(3) = 0 && stateno != [358000,358004]
trigger1 = partner,sysfvar(3) = 0 && partner,stateno != [358000,358004]
sysfvar(3) = 1
;P3开场后退场
[State -2];3Pイントロ★
type = ChangeState
triggerall = !IsHelper
trigger1 = ctrl
trigger1 = numpartner
trigger1 = ID>partner,ID
trigger1 = sysfvar(3) = -1
trigger1 = roundstate = 2 && alive && partner,alive
value = 358001
ctrl = 0
;无敌
[state -2];3Pイントロ_無敵化
type = NotHitBy
trigger1 = sysfvar(3) = -1
value = SCA
;若换人过程被阻碍了
[State -2,交代ステートへ_妨害されてた場合★]
type = ChangeState
triggerall = !IsHelper
triggerall = roundstate = 2
triggerall = numpartner
triggerall = partner,alive
triggerall = statetype != A && ctrl
trigger1 = sysfvar(3) > 0
trigger2 = partner,sysfvar(3) < -1; 特殊交代
value = 358001
ctrl = 0
;sysfvar(3)重设
[state -3]
type = varset
;死んだら解除☆
trigger1 = alive = 0
trigger1 = sysfvar(3) != 0
;パートナーが倒されていたら解除
trigger2 = partner,alive = 0
trigger2 = sysfvar(3) != 0
;パートナーが待機状態になったら解除
trigger3 = partner,stateno = 358002
trigger3 = sysfvar(3) != 0
sysfvar(3) = 0
;换人提示消去
[state -3,AssistAttack消去]
type = removeExplod
triggerall = numexplod(358002)
trigger1 = movetype != A && stateno != 358004
id = 358002
;是否前场人物判定
[state -3,状況判定];☆
type = varset
trigger1 = 1
sysfvar(2) = (sysfvar(3) > 0 || sysfvar(3) = -1 || partner,sysfvar(3) <= -2 || stateno = 358002)
;主动请求换人动作,需要自己补充AI
;另外其实这个应该放在正常AI当中的- -...
;ここからAI記述に追加
;ココ
[State -2,交代ステートへ_AI用]
type = ChangeState
value = 358000
ctrl = 0
triggerall = numpartner
triggerall = roundstate = 2
triggerall = statetype !=A && ctrl
triggerall = partner,alive && partner,stateno = 358002
triggerall = partner,sysfvar(4) = 0
;交代モーション条件
;主动请求换人条件,需要自己补充AI
trigger1 = command = "z" && command != "holdback"
;以下附送一个比较泛用的例子
;[State -3, TAG]
;type = ChangeState
;value = 358000
;ctrl = 0
;TriggerAll = HitPauseTime = 0
;Triggerall = !Ishelper
;Triggerall = Var(59) > 0
;TriggerAll = RoundState = 2 && Life > 0
;TriggerAll = !InGuardDist
;Triggerall = ctrl
;TriggerAll = Life + 50 < Partner,Life
;TriggerAll = !(StateType = A || StateType = L)
;TriggerAll = NumPartner
;TriggerAll = Partner,Alive && Partner,StateNo = 358002
;TriggerAll = Partner,sysfvar(4) = 0
;Trigger1 = EnemyNear,Statetype = L && EnemyNear,Stateno != 5120
;Trigger2 = EnemyNear,Statetype = A && EnemyNear,Movetype = H