スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

即死コン

生バニ始動
溜めバニガード始動
4ヒットバニ始動
画面端対空始動

これくらいあれば十分か?
スポンサーサイト

フライング対策

RoundStateno=2は試合中ではあるが、実はイントロ終わったあとのラウンドコール時も含まれているため

;立ち
[statedef 0]

;コントロール制御
[state ]
type=ctrlset
trigger1=roundstate=2
value=1

としてるようなキャラはフライングしてしまう。
__________________________________________

なので変数一個使って

;試合開始フラグ
[statedef -2]

[state ]
type=varset
triggerall=roundstate=2
trigger1=ctrl
trigger2=movetype!=i ;保険
var(0)=1

;立ち
[statedef 0]

;コントロールセット
[state ]
type=ctrlset
trigger1=roundstate=2
value=var(0)

99パーセントフライング防げます。
まあとにかくはroundstate=2の条件だけでctrlsetしてるようなキャラにはこういった修正するよよさげ。

コンボ補正記述サンプル

gethitvar(hitcount)の仕様がご愁傷様なので自分のはこんな感じ。

[statedef -2]

;var(0)=ヒット数

;-------ヒット数初期化
[state ]
type=varset
trigger1=!numtarget
var(0)=0

;------ヒット数加算
[state ]
type=varadd
triggerall=numtarget
triggerall=enemynear,movetype=h
triggerall=enemynear,gethitvar(hitcount)>var(0)
trigger1=movehit
trigger2=projhittime(0)=0
;ヘルパー用
trigger3=numhelper(XXX)
trigger3=helper(XXX),movehit=1+(movetype!=a)
var(0)=1

;-----補正
[state ]
type=attackmulset
trigger1=1
value=1.00-0.1*var(0)
[state ]
type=attackmulset
trigger1=var(0)>=10
value=0.1

よくわかる(?)逆混線

もし定義が以前から同じで「下り混線」のことを差しているものとするならの話。

通常のヘルパー混線は、

混線ヘルパー → ターゲット用喰らいヘルパー

という順番で出す。
これを

ターゲット用喰らいヘルパー → 混線ヘルパー

逆にすれば逆混線(下り混線)の出来上がり。
おしまい。

はー????

;----------着地
[statedef 52]
[state ]
type=changeanim
trigger1=anim!=[48,49]
value=48+(anim=47||anim=[600,630])
[state ]
type=changestate
trigger1=!animtime
value=0
;----------着地
[statedef 53]
[state ]
type=changeanim
trigger1=anim!=[48,49]
value=48+(anim=47||anim=[600,630])
[state ]
type=changestate
trigger1=!animtime
value=0

これはうちのキャラの着地ステートです。(エフェクト表示とか音声は省略)
さて、これの違うところはstatedef 52か53であるかだけです。
ところが↑はガードが可能で↓がガード不能です。なんぞこれ。

52といえばコモンステートでは着地が定義されてるステートだけども、なんでこれガードできる仕様なんだ?
普通ガードできるのはctrl=1あるときなんだよね。つまりそう設定すれば別に53でもガード自体はできるんだけども。
この仕様のせいで1時間悩まされた。だって着地硬直なのにガードできるっておかしーじゃん?

それともうちのキャラの仕様が特殊だからそういう事態になったのかな??
でもステート番号を変えただけでガード可否が変わるのはおかしいと思います。
というわけで現行版北斗キャラ全員着地硬直でガードができてしまう状態です。申し訳ない。

第二次汎用ステ抜け貫通

わっちのは結構単純にできています(´・ω・)
あとこれ普通の単調増加してる変数も誤検出してしまいまふ。

ステ抜け貫通作ろうとしてる人は参考にどぞ。
古い記述だけどこれ今動くのかわかりません。

;----------------------変数表
;v59 = 検索アドレス ;相手のどの変数を調べるか
;v58 = 検索フレーム ;10F計測
;v57 = 基準GameTime ;これが超重要
;v56 = 格納変数 ;保存したい変数を出力してるだけ
;v10 = gametime ;←1F目の相手の変数の値
;v11 = gametime+1 ;←2F目の相手の(ry
;v12 = gametime+2 ;←3F目の(
;v13 = gametime+3 ;←4F(
;v14 = gametime+4 ;←(
;v15 = gametime+5 ;(
;v16 = gametime+6 ;
;v17 = gametime+7
;v18 = gametime+8
;v19 = gametime+9
;取得した変数
;v20,v24,v28,v32,v36,v40,v44,v48,v52 = A
;v21,v25,v29,v33,v37,v41,v45,v49,v53 = B
;v22,v26,v30,v34,v38,v42,v46,v50,v54 = C
;v23,v27,v31,v35,v39,v43,v47,v51,v55 = アドレス

;-----------------------ステ抜け変数調査
[state ]
type=null
;--------------変数初期化
trigger1=animelem=1
trigger1=var(23):=-1||var(27):=-1||var(31):=-1||var(35):=-1||var(39):=-1
trigger1=var(43):=-1||var(47):=-1||var(51):=-1||var(55):=-1||var(59):=-1
trigger1=fvar(13):=-1||fvar(17):=-1||fvar(21):=-1||fvar(25):=-1||fvar(29):=-1
trigger1=fvar(33):=-1||fvar(37):=-1||var(9):=-1

;--------------変数調査
;まず10フレーム間相手の変数を観測して保存
;var(58)で10Fを計測、var(57)は計測しはじめたときのgametime値を保存(←超重要!)
trigger2=1||var(58):=var(58)*(var(58)<10)||var(57):=ifelse(!var(58),gametime,var(57))

;相手の変数アドレスを順番に見るためにvar(59)に調べたいアドレスを入力しておく。
trigger2=1||var(59):=ifelse(var(59)<59||var(59)=59&&var(58)>0,var(59),-1)+!var(58)

;10F分の相手の変数を全部保存していく
trigger2=1||var(10+var(58)):=enemy,var(var(59))
trigger2=(var(58):=var(58)+1)*0

;-------------変数判定
;取得した変数を全て違う値かを総当りで調べる(単純に全部の取得した値が違うかどうかを判断してるだけ)
trigger3=var(58)=10
trigger3=var(10)!=var(11)&&var(10)!=var(12)&&var(10)!=var(13)&&var(10)!=var(14)&&var(10)!=var(15)
trigger3=var(10)!=var(16)&&var(10)!=var(17)&&var(10)!=var(18)&&var(10)!=var(19)&&var(11)!=var(12)
trigger3=var(11)!=var(13)&&var(11)!=var(14)&&var(11)!=var(15)&&var(11)!=var(16)&&var(11)!=var(17)
trigger3=var(11)!=var(18)&&var(11)!=var(19)&&var(12)!=var(13)&&var(12)!=var(14)&&var(12)!=var(15)
trigger3=var(12)!=var(16)&&var(12)!=var(17)&&var(12)!=var(18)&&var(12)!=var(19)&&var(13)!=var(14)
trigger3=var(13)!=var(15)&&var(13)!=var(16)&&var(13)!=var(17)&&var(13)!=var(18)&&var(13)!=var(19)
trigger3=var(14)!=var(15)&&var(14)!=var(16)&&var(14)!=var(17)&&var(14)!=var(18)&&var(14)!=var(19)
trigger3=var(15)!=var(16)&&var(15)!=var(17)&&var(15)!=var(18)&&var(15)!=var(19)&&var(16)!=var(17)
trigger3=var(16)!=var(18)&&var(16)!=var(19)&&var(17)!=var(18)&&var(17)!=var(19)&&var(18)!=var(19)

;判定できたら取得した値から式を割り出す。
;まずどこに保存するかを決める。
trigger3=!(!var(10)+!var(11)+!var(12)+!var(13)+!var(14)+!var(15)+!var(16)+!var(17)+!var(18)+!var(19))&&var(55)=-1
trigger3=var(56):=23+(var(23)>-1)*4+(var(27)>-1)*4+(var(31)>-1)*4+(var(35)>-1)*4+(var(39)>-1)*4+(var(43)>-1)*4+(var(47)>-1)*4+(var(51)>-1)*4

;次に取得した値から aX^2+bX+cの方程式を解く要領で割り出す。
trigger3=1||var(var(56)-3):=(var(12)-var(10)-(var(11)-var(10))*2)/2
trigger3=1||var(var(56)-2):=var(11)-var(var(56)-3)*(var(57)+1)*(var(57)+1)-(var(10)-var(var(56)-3)*var(57)*var(57))
trigger3=1||var(var(56)-1):=var(10)-var(var(56)-3)*var(57)*var(57)-var(var(56)-2)*var(57)

;最後にもう既に取得してある変数かどうかを判断して保存。
trigger3=var(59)!=var(23)&&var(59)!=var(27)&&var(59)!=var(31)&&var(59)!=var(35)&&var(59)!=var(39)
trigger3=var(59)!=var(43)&&var(59)!=var(47)&&var(59)!=var(51)&&var(59)!=var(55)
trigger3=var(var(56)):=var(59)

タッグ対応記述

こんぺいとう氏シンの記述を覗いてみたら面白い記述があった。

fall.envshake.ampl=ID
fall.envshake.phase=200


本来は落下してバウンドしたときにどれくらい画面を振動させるかという記述なんだけど、
これgethitvar利用で相手が感知することができるみたいで、
つまりは敵にどのプレイヤーのどんな攻撃を喰らったかという判定をさせることができるわけだね。
じゃあ画面振動のほうはどうすんのよというのも問題はなく、time=0に設定すれば画面に反映されないので無問題であった。(省略したときどんな値になるのかはしらんけど0になるのかね)

これでタッグ時どっちがどっちかわかんなくなるというのを解消できるため、
上手く別々に処理をすることができるわけだ。
うーん面白い。
自分はこんなめんどくさい処理はできないからやらないけど
よく考えられてるシステムだね。

Ts氏キャラといいなんで最近の並キャラは凶悪MUGENに負けないような精巧な構造のキャラが多いのか(ry

デフォルトvarrangeset

ステート5900にあるやつね。
結論からいうとこいつは-3ステートにお引越ししたほうがいいね。
roundstate=0って1Fだけではなく4Fくらい、あるいはアドオンの設定次第なんだろうけど、少しだけ持続する。
だから開幕でいろいろ変数設定しようとすると勝手にリセットされちゃって困ったりするんだよね。
開幕混線していてこれのせいで挙動バグるとかもあるみたい。
自分のAIでもエラメを出させるもとになったりとね。まあ基本的に邪魔である。

もし-3ステートに移動させた場合は
[state ]
type=varrangeset
trigger1=!roundsexisted
trigger1=!roundstate
trigger1=stateno=5900
value=0
persistent=0
[state ]
type=varrangeset
trigger1=!roundsexisted
trigger1=!roundstate
trigger1=stateno=5900
fvalue=0
persistent=0

こんな感じかな。
persistent=0の変わりに!timeでもいいかも。

簡単ビット演算操作

知らない記号を使うのでなかなか慣れないのが現実。
しかもその記号の優先度が結構特殊なので誤作動しやすい原因でもある。
なので最近自分がやってる方法をば。

---ONにするとき

例:8と256

[state スイッチON]
type=varadd
trigger1=!(var(0)&8) ;←保険。余計なスイッチをONにするのを避ける。
trigger1=ON条件
var(0)=8

[state スイッチON]
type=varadd
trigger1=!(var(0)&256)
trigger1=ON条件
var(0)=256

つまり代入じゃなくて加算を使えばわかりやすくスイッチの管理ができるわけ。
これで8と256の二つのスイッチをONにしたことになる。

で、OFFにするときは

[state スイッチOFF]
type=varadd
trigger1=var(0)&8 ;同じく保険。
trigger1=OFF条件
var(0)=-8

[state スイッチOFF]
type=varadd
trigger1=var(0)&256
trigger1=OFF条件
var(0)=-256

単純に引けばOFFにできる。

--------------------代用(:=を使う人向け)

ON版

[state ]
type=varadd
trigger1=1
var(0)=8*!(var(0)&8)*(ON条件)

[state ]
type=varadd
trigger1=1
var(0)=256*!(var(0)&8)*(ON条件)

OFF版

[state ]
type=varadd
trigger1=1
var(0)=-(var(0)&8)*(OFF条件)

[state ]
type=varadd
trigger1=1
var(0)=-(var(0)&256)*(OFF条件)

やってることはいっしょでふ。
:=で記述する場合は var(0):=var(0)+8*!(var(0)&8)*(ON条件)
こんな感じかと。

正確に飛び道具を当てる

早い話、突進技と同じAI記述でできる。
AIでもよく使われている記述。特に昇竜系に。

例えば発生20フレームで発生時にx=[0,30],y=[-20,-40]で当たり、vel x=10の飛び道具がある。
これはすなわち発生20フレームで、20フレームからvel x=10のスピードで突進する技とほぼ同じ意味なので、

[state -1]
type=changestate
value=1110
triggerall=statetype!=a
triggerall=ctrl||stateno=[120,140]
triggerall=enemy,movetype=h
trigger1=p2dist x-(1-2*(enemynear,facing=facing))*enemynear,vel x*20=[0,30]
trigger1=p2dist y+enemynear,pos y+(enemynear,vel y*20+enemynear,gethitvar(yaccel)*20*20/2=[-20,-40]
trigger2=p2dist x-(1-2*(enemynear,facing=facing))*enemynear,vel x*21=[10,40]
trigger2=p2dist y+enemynear,pos y+(enemynear,vel y*21+enemynear,gethitvar(yaccel)*21*21/2=[-20,-40]
trigger3=p2dist x-(1-2*(enemynear,facing=facing))*enemynear,vel x*22=[20,50]
trigger3=p2dist y+enemynear,pos y+(enemynear,vel y*22+enemynear,gethitvar(yaccel)*22*22/2=[-20,-40]
trigger4=p2dist x-(1-2*(enemynear,facing=facing))*enemynear,vel x*23=[30,60]
trigger4=p2dist y+enemynear,pos y+(enemynear,vel y*23+enemynear,gethitvar(yaccel)*23*23/2=[-20,-40]
trigger5=p2dist x-(1-2*(enemynear,facing=facing))*enemynear,vel x*24=[40,70]
trigger5=p2dist y+enemynear,pos y+(enemynear,vel y*24+enemynear,gethitvar(yaccel)*24*24/2=[-20,-40]
trigger6=p2dist x-(1-2*(enemynear,facing=facing))*enemynear,vel x*25=[50,80]
trigger6=p2dist y+enemynear,pos y+(enemynear,vel y*25+enemynear,gethitvar(yaccel)*25*25/2=[-20,-40]




まあこんな感じ。でもテストしてないからもしかしたら間違ってる??まあそのうちテストするけど。
強いAIとかなら大抵こんな感じで記述しているよね。
プロフィール

SAIKEI

Author:SAIKEI
MUGEN製作跡地
現在製作はしておりません。
適当にはまってるゲームの攻略記事書いてます。

リンクフリーです

管理画面

キャラ公開
クリップボード01
・ユダ
本体
更新日:13/03/27
sff,sndファイル
更新日:11/03/03 クリップボード01
・ケンシロウ
本体(AI無し)
更新日:12/06/17
sff,sndファイル
更新日:12/05/21
AIが入ってる旧バージョン本体
更新日:12/02/19 クリップボード01
・サウザー
本体
更新日:10/12/26
sff,sndファイル
更新日:10/11/28

・ラオウAI(Ataru氏製)
AI
更新日:10/07/11
SFF修正ファイル
更新日:10/07/11

yukari_20090921184412.jpg
・影紫(09/08/24更新版)
※凶悪キャラにより注意
S-Yukari

・宇宙意思強化パッチ
パッチ
更新日 10/04/04
カテゴリ
月別アーカイブ
ブログカウンター
現在の閲覧者数:
検索フォーム
最新コメント
最新記事
リンク
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。