varの初歩的な使い方くらいしか書いてません。
目次
■ リジェネレーション
□ フェードイン・アウト
■ タイマー設定
□ カウンターヒット
■ ランダムで行動が変化
□ ReversalDefを用いない打撃防御
■ リフレクター
□ 根性値
■ 逆根性値
□ ホーミング
■ 背後でヒット
□ --------------------------
リジェネレーション
徐々に体力が回復するようにする設定です。
マイナス2ステートに
[State -2, 1]
type = lifeadd
trigger1= (GameTime% __ )=0 ;何フレームごとに回復するか
value = __ ;回復量
;ignorehitpause = 1
回復量は大きい数値を入れると、ほぼ不死身になります。(爆
裏モード作るときや、ボス的な相手が弱いと思ったときに使うといいかもしれません。
lifeaddを、poweraddにすれば徐々にパワーゲージが蓄積されていきますね。
また、数値をマイナスの値にすると徐々に減っていきます。
フェードアウト・イン
演出など、ゆっくりと消えさせたい場合などに使用します。
フェードさせたい対象のステートに
[State 100]
type = PalFX
trigger1 = time = __ ; 出現が始まる時間
time = __ ; フェードする時間
add = -255,-255,-255
sinadd = 256,256,256, __;フェードする早さ*1
;ignorehitpause = 1
[State 100]
type = PalFX
trigger1 = time = __ ; 消滅が始まる時間
time = __ ; フェードする時間
add = -128,-128,-128
sinadd = -256,-256,-256, __;フェードする早さ*1
;ignorehitpause = 1
*1 ここの数値が大きいほどゆっくりフェードし、小さいほど早くフェードします。
timeと上手く合わせることで自然にフェードアウト、インするようになります。
フェードする対象が透明化されてること前提です。
ちなみに、ステートの1フレ目(0フレ?)には適用されないようなので、フェードインさせる際には、
アニメーションの1フレ目は何もない画像を設定しておくといいです。
タイマー設定
一定時間○○が出来るようになる、○○が強くなるなどのタイマー設定。
いろいろできますが、すべての使用例を書くのは面倒なので。
例 一定時間攻撃力アップする場合。
マイナス2ステートに
[State -2, 100]
type = AttackMulSet ; 攻撃力上昇の命令
trigger1 = var( __ ) > 0 ; 発動するためのvar
time = 1
value = __ ; 上昇する攻撃力
[State -2, 100]
type = varadd ; 徐々にvarを加算する命令
trigger1 = var( __ ) >= 1 ; 上のものと同じvar番号
var( __ ) = -1 ; 上に同じ
;IgnoreHitPause = 1
発動させるためのステートに
[State 100]
type = VarSet
trigger1 = __ ; 発動する条件
var( __ ) = __ ; varは上と同じ番号、そのあとは任意の数字*2
*2 タイマーセットの時間になります。高崎は800〜1000ぐらいが丁度いい。
AttackMulSetを、DefenceMulSetにすれば防御力が上昇。
AssertSpecialにして、flagをunguardableにすれば一定時間ガード不能になりますね。
palfxにすれば一定時間自分の色を変えることもできます。
cmdの、特定コマンドのtriggerallをvar(_) >= 1とすれば、一定時間のみ使用できる技が作れます。
カウンターヒット
カウンターヒット時とそうでないときのダメージや、演出が違うときに使えます。
攻撃ステートに
[State 100,1] ; 通常ヒット
type = HitDef
triggerall = p2movetype != A ; 相手が攻撃中ではないとき
trigger1 = __ ; 攻撃判定が発生する条件
省略
[State 100,1] ; カウンターヒット
type = HitDef
triggerall = p2movetype = A ; 相手が攻撃中のとき
trigger1 = __ ; 攻撃判定が発生する条件
省略
たぶん一番楽な方法でもあり、面倒な方法かも。
後者のほうにだけ色が変わる命令をつければ、ギルティみたいに一瞬赤くなったりします。
IDで識別すればカウンター時のみ音を鳴らしたり、画面効果を使ったりもできます。
ランダムで行動が変化
分岐させたいステートで
[State 4037, 3];行動1
type = ChangeState
triggerall = __ ; 分岐させる条件
trigger1 = Random < 500
value = __ ; 移行したいステート番号
[State 4037, 3];行動2
type = ChangeState
triggerall = __ ; 分岐させる条件
trigger1 = Random < 500
value = __ ; 移行したいステート番号
Randomの値を大きくすればするほど、そのステートへ移行する確立が高くなります。
randomの合計値が1000未満のときは、どれにも分岐されない可能性がありますので
どれにも移行しなかったときの処理をいれておくといいと思います。
ReversalDefを用いない打撃防御
ReversalDefで防いだ場合、相手側はmovecontactによるキャンセル等の行動が
出来ません。(ガードさせた状態でガトリングコンボなどができない。)
さらに、基本的に防げるのは1段だけ(だったと思う)なので、
原作では全段防げたのに2段目から耐えられずに攻撃を食らってしまいます。
また、ReversalDefを用いた打撃防御ではproj系の飛び道具を食らってしまいます。
というわけでそれらも防げる打撃防御の作り方の説明です。
例 藤堂香澄の白山桃を作る場合。
技説明
開始からすぐ数フレームの打撃防御があり、その後攻撃をする。
開始から打撃防御部分までのアニメと打撃防御後の攻撃から終了までのアニメを用意。
それと、130番と150番のステートが記載されたCNSファイルが必要。
打撃防御開始ステートと攻撃ステートを作る。(攻撃ステートは省略します。)
↓開始ステート開始↓
[Statedef 1000]
type = S
movetype = A
physics = S
anim = __ ; 開始anim番号
ctrl = 0
[State 1000, 1]
type = varset
trigger1 = 1
var(__) = 0 ; 判別のためのvar番号
ignorehitpause = 0
persistent = 1
[State1000, 2]
type = ChangeState
trigger1 = Animelem = __ ; 打撃防御が始まるanimelem番号
value = 130;ステート130番へ移る
ctrl = 0 ; 制御不能
↑開始ステート終了↑
130番ステートに
[State 130, 1]
type = varset
triggerall = anim = __ ; 打撃防御anim番号
trigger1 = prevstateno != 150
trigger1 = Time = 0
var(__) = 1 ; 上で設定したvar番号
[State 130, 2]
type = varset
triggerall = anim = __ ; 打撃防御anim番号
trigger1 = prevstateno != 150
trigger1 = Time = 10 打撃防御終了までの時間
var(__) = __ ; 左:上で設定したvar番号・右:1以外の番号
[State 130, 3]
type = ChangeState
triggerall = anim = __ ; 打撃防御anim番号
trigger1 = var(__) >= __ ;左:上で設定したvar番号・右:上で設定した1以外の番号
value = __ ; 攻撃ステート番号
150番ステートに
[State 150, 2]
type = ChangeState
triggerall = anim = __ ; 打撃防御anim番号
trigger1 = HitShakeOver
value = __ ; 攻撃ステート番号
既に130番、150番ステートにある記載それぞれに
triggerall = anim != __ ; 打撃防御anim番号
を記載すること。*3
*3 これを書かないと通常のガードになって、後の行動に移行しないから。
また、ガーキャン技がある場合、コマンドにも記載しないと、打撃防御中にも発動できてしまいます。(t_t)
いろいろ応用できるので試してみるといいかもしれません。
ちなみにこれは上段・中段のガードポイント技の作り方なので、下段には対応してません。
下段ガードポイント技を作りたい場合はステートを変更する必要があります。
多分空中ガードポイント技も作れると思います。
リフレクター
MUGENでは、格闘ゲームにあるほとんどの行動を再現できます。
しかし、当然再現不可能なものもあります。それは相手のステートをコントロールすることです。
リフレクターはそれにあたり、コンプゲーでも作らない限り再現は不可能です。
それでも、「反射」という効果は魅力的ですよね。というわけで模擬リフレクターの作り方の紹介です。
ではどうやってリフレクターを作るのか。
それは、弾を跳ね返すのが無理ならば、撃ち返す技を作ればよいのです。
とはいえ、「反射」とはだいぶ違いますけど・・・。
例 包のサイコボールアタックリフレクトを作る場合。
技説明
目の前に攻撃判定を持った気を作り出し、攻撃をしつつも弾を跳ね返す。
反射ステートを出現させるための本体アニメと、攻撃判定を設定したアニメ、
食らい判定を設定した見えないアニメ、反射飛び道具のアニメを用意。
本体用ステート、攻撃用ステート、反射用ステート、反射飛び道具ステートを作る。
↓本体ステート開始↓
[Statedef 1000]
type = A
movetype= A
physics = N
ctrl = 0
anim = _;本体アニメ番号
ignorehitpause = 1
[State 1000, 1];攻撃用ヘルパー出現
type = Helper
trigger1 = animelem = 5
name = "ATTACK"
stateno = 1020
ID = 1020
helpertype = normal
pos = 45,-55
postype = p1
facing = 1
keyctrl = 0
ownpal = 1
ontop = 1
省略
↑本体用ステート終了↑
↓攻撃用ステート開始↓
[Statedef 1020]
type = A
movetype= A
physics = N
ctrl = 0
anim = _;攻撃アニメ番号
sprpriority = 4
ignorehitpause = 1
[State 100,1] ; 攻撃
type = HitDef
省略
[State 1000, 1];反射用ヘルパー出現
type = Helper
triggerall = NumHelper(1050) = 0;1個出てればいい
trigger1 = time = 0
name = "HAJIKI"
stateno = 1050
ID = 1050
helpertype = normal
pos = 45,-55
postype = p1
facing = 1
keyctrl = 0
ownpal = 1
ontop = 1
[State 150, 0]
type = DestroySelf
trigger1 = animtime = 0
↑攻撃用ステート終了↑
↓反射用ステート開始↓
[Statedef 1050]
type = S
movetype = A
physics = S
ctrl = 0
anim =__;反射アニメ番号
priority = 6
sprpriority = 6
[State 10000, 1];ひとまず無敵の設定(投げられたりしないように)。
type = NotHitBy
trigger1 = Time >= 0
value = SCA, NP, SP, HP, AP, NA, SA, HA, NT, ST, HT
[State 10000, 1];食らい属性の設定。ここで飛び道具のみ可にする。
type = HitBy
trigger1 = Time >= 0
value = SCA, NP, SP, HP, AP;下段・中断・上段全ての飛び道具。
[State 15000, 1];飛び道具を受けた際の演出
type = HitOverride
trigger1 = 1
time = -1
attr = SCA, NP, SP, HP, AP, NA, SA, HA, NT, ST, HT;一応全部書いてみる。
slot = 0
stateno = 1100;反射飛び道具
[State 15000, 4];消滅
type = DestroySelf
trigger1 = animtime = 0;通常消滅条件(必須)
trigger2 = Parent,stateno != 1000;特殊消滅条件(本体がダメージを受けたとき等)
↑反射用ステート終了↑
↓反射飛び道具ステート↓
[Statedef 1100]
type = A
movetype= A
physics = N
poweradd= 0
ctrl = 0
velset = 0
anim = __;反射飛び道具アニメ番号
[State 100,1] ; 攻撃
type = HitDef
省略
↑反射飛び道具ステート終了↑
反射飛び道具のステートで、p2name = ""を使って相手キャラを限定させ、animを変更すれば
ある程度は相手の飛び道具を反射しているように見せれます。(sffに画像を登録する必要がありますが)
移動しながら反射させる場合は、本体にあわせてvelsetなどで移動させるか、-2でヘルパーを出現させればOKです。
根性値
自分の体力が少なくなる程防御力が上がるってやつです
マイナス2ステートに
[State -2, 0]
type = DefenceMulSet
trigger1 = Life <= 500
value = 0.9
これで
「自分の体力が500以下になることで、相手の攻撃ダメージを1割カットする」となります。
防御力を上げていきたい場合は
[State -2, 0]
type = DefenceMulSet
trigger1 = Life <= 500 && Life >= 401
value = 0.9
[State -2, 0]
type = DefenceMulSet
trigger1 = Life <= 400 && Life >= 301
value = 0.85
[State -2, 0]
type = DefenceMulSet
trigger1 = Life <= 300 && Life >= 201
value = 0.7
このようにちょっとずつ下げていけば、それっぽく見せられます。
DefenceMulSetの値は0に近くなるほど防御力が高まるので、キャラに合った値にするといいですね...
当然、値を大きくすることで、被ダメージが大きくなるので、逆にだんだん食らうダメージが増えていくということもできます。需要があるかわかりませんが...
DefenceMulSetの問題点として、これは自分のMovetypeがHのときしか適用されません。つまり、被ダメージが軽減されるのは2ヒット以上の連続技や、投げを受けているときなので、単発の攻撃に対しては無効になります。
逆根性値
相手の体力が減るにつれて自分の攻撃力が下がります。
もともと根性値が設定されてない相手用に用いられることが多いです。
マイナス2ステートに
[State -2, 0]
type = AttackMulSet
trigger1 = P2Life <= 500
value = 0.9
これで
相手の体力が500以下の時、自分の攻撃力が1割ダウンする
となります。
さらに減らしていきたい場合は、根性値と同じように、P2Lifeの値を減らして記載していけば、それらしくは見えます。
しかしこれだけでは、元から根性値が設定されているキャラにも適応されてしまい、根性値と逆根性値分のダメージをカットされて悲惨なことになります。
というわけで、それを指定します。
[State -2, 0]
type = AttackMulSet
triggerall = P2Name != "__" ; ←これを追加する。
trigger1 = P2Life <= 500
value = 0.9
これで指定した相手は逆根性値が適用されなくなります。
制作者様の名前でも指定できますが、私はあまり使いません。
また、P2Nameで相手を指定することで、相手によって逆根性値を変えられます。
例えば
Aタイプ;500以下で1割ダウン
[State -2, 0]
type = AttackMulSet
triggerall = P2Name = "IORI"
trigger1 = P2Life <= 500
value = 0.9
Bタイプ;500以下で1.5割ダウン
[State -2, 0]
type = AttackMulSet
triggerall = P2Name = "KYO"
trigger1 = P2Life <= 500
value = 0.85
Cタイプ;500以下で2.5割ダウン
[State -2, 0]
type = AttackMulSet
triggerall = P2Name = "SHINGO"
trigger1 = P2Life <= 500
value = 0.75
非常に面倒ですが...
AttackMulSetも、値が0に近づくほどダメージが少なくなります。
そのため、逆に自分の体力が減ると、自分の攻撃力が上がるといった設定もできます。
ホーミング
要は追尾弾のことです。
相手を追いかけて攻撃する飛び道具の作り方(未完成)
作り方はいろいろあるみたいですが、私のやり方はかなり単純です。
とりあえずヘルパーを出します。
↓ヘルパー用ステート↓
[State 1000, 0];前に離れてるとき
type = VelAdd
trigger1 = P2BodyDist X >= 1
x = 0.2
[State 1000, 0];後ろに離れてるとき
type = VelAdd
trigger1 = P2BodyDist X <= -1
x = -0.2
[State 1000, 0];下に離れてるとき
type = VelAdd
trigger1 = P2BodyDist Y >= 1
y = 0.2
[State 1000, 0];上に離れてるとき
type = VelAdd
trigger1 = P2BodyDist Y <=- 1
y = -0.2
これで相手をサーチして軌道を変えられますが、このままだと相手の距離によってはとんでもなく加速してしまいます。
そのため、限界速度を指定します。
[State 1000, 0]
type = VelSet
trigger1 = P2BodyDist X >= 1
triggerall = Vel X >= 5;x速度が5以上のとき
x = 5
[State 1000, 0]
type = VelSet
trigger1 = P2BodyDist X <= -1
triggerall = Vel X <= -5;x速度が-5以下のとき
x = -5
[State 1000, 0]
type = VelSet
trigger1 = P2BodyDist Y >= 1
triggerall = Vel Y >= 5;y速度が5以上のとき
y = 5
[State 1000, 0]
type = VelSet
trigger1 = P2BodyDist Y <= 1
triggerall = Vel Y <= -5;y速度が5以下のとき
y = -5
背後でヒット
攻撃が自分の後ろで当たったときの吹っ飛び方向などなど
当たり判定の大きい技など、たまに自分の背後でヒットしたりすることがあります。
この場合、食らい側の吹っ飛び方向は変わらないので、自分のほうに引き寄せてしまいます。
そのため通常では有り得ない技が繋がってしまったりするわけです。
そうならないために、私は二つの方法をとってます。
↓1つめ↓
[State 1000, 0]
type = HitDef
triggerall = P2BodyDist X >= 0 ;相手が前方にいるとき
中略
ground.velocity = -5,-5
guard.velocity = -5
[State 1000, 0]
type = HitDef
triggerall = P2BodyDist X <= -1 ;相手が後方にいるとき
中略
ground.velocity = 5,-5 ←x方向を逆の
guard.velocity = 5 ←値にする
これで、あきらかに後ろにいる相手を引き寄せることはなくなりますが...
真上らへんにいる相手(5〜-5くらい)にいると、たまに怪しい動きをしますので注意。
↓2つめ↓
こちらはvarを使います。
マイナス2ステートに
[State -2,1]
type = varset
trigger1 = p2BodyDist X >= 0
var(__) = 1 ;カッコ内は任意の数値
[State -2,1]
type = varset
trigger1 = p2BodyDist X <= -1
var(__) = -1 ;カッコ内は任意の数値
これで相手が自分の正面にいれば正の値、背後にいれば負の値になります。
任意の攻撃ステートに
[State 100, 0]
type = HitDef
trigger1 = 条件
attr =
省略
ground.velocity = -5*var(__)
guard.velocity = -5*var(__)
air.velocity = -5*var(__),-5 ;カッコ内は先ほど指定した数値
マイナス2で指定したものをかけることで、状況に応じて正反対の数値になります。
この方法だとtriggerでいちいち相手との距離を指定しなくていいので楽です。
しかしやはり、真上らへんにいる相手に対しては怪しいです。