☆ベルトアクション作 ..
108:名前は開発中のものです。
21/04/30 18:18:44.10 81YP+Cwz.net
訂正 X(ステージを進んだ距離、画面右端) O 画面左端
X(+480画面左端) O 画面右端
@script
if(frame==0){
void self=getlocalvar("self");
int sdir=getentityproperty(self,"direction");
setdrawmethod(self,1,256,384,1,0,0,0,0,0,0,0,0);
drawstring(120, 120, 4, sdir, 1);
if (sdir==0) {
// changedrawmethod(self, "flipx", 0);
changedrawmethod(self, "scaley", 256);
changeentityproperty(self,"velocity",-1,0,0);
} else {
changeentityproperty(self,"velocity",1,0,0); }
}
@end_script
何故かストライカーがムーンウォークで登場してしまい悶絶。
その為Drawmethodを使って大きさを変えたりしてチェックする、デバッグ用スクリプト。
散々テストして結局、元の絵(gif)が左向き基準に描いてあっただけという
基本、OpenBoRのキャラ絵は右向き基準で描く事が多いので
左右向きが混在してしまうとOpenBoRは正しい処理しているのに
こちらの脳がパンクするという事態に。
結構 Anim Turnなんかでもやっちゃうんですよ。
109:名前は開発中のものです。
21/04/30 18:36:19.99 81YP+Cwz.net
anim attack3
cancel 11 20 0 D A freespecial4
cancel 11 20 0 U A freespecial5
delay 6
offset 37 78
frame data/chars/erika/363.gif
〜
〜
delay 4
drawmethod alpha 1
offset 42 105
frame data/chars/erika/373.gif
frame data/chars/erika/373.gif
途中を端折ってますが、Cancelを組み込むとき、Drawmethodを使って
受付がスタートしたのを知らせる(alpha 1は半透明)。
Drawmethod fillcolor {int0-256}を使えば指定した色にできるようなことがマニュアルに書いてありますが
まだイマイチ数値の指定方法がわかりません、パレット番号なのか、RGB指定みたいな事も書いてあるし
またググル先生に聞きにいかなきゃです。
110:名前は開発中のものです。
21/05/01 23:32:33.70 ce6GRoi2.net
なんとなーく調べたら、drawmethodハイフンfillcolor R G B 各々0-255のようですね
drawmethod-fillcolor 0 255 255 で以降のframe コマンドのentityキャラが水色に塗り潰されて表示される筈ですが
現在、別な環境の為確認出来ずにいます。
drawmethodを上手く使いこなせれば、用意する絵的にかなり省力化できるんで
マスターしたいところですが、今のトコ自分で絵を用意した方が早いですね
111:kt住江
21/05/04 01:38:40.54 UuKfeUKx.net
途中経過画像。開発は順調です。
URLリンク(twitter.com)
>>110さん
いつもお疲れ様です。
アークシステムワークスの格闘ゲームによくある、
ストライカーまで実装可能とは、スクリプトは本当に凄いですねぇ。
(deleted an unsolicited ad)
112:名前は開発中のものです。
21/05/05 23:54:41.45 +/eMzjlh.net
@cmd clearspawnentry();setspawnentry("name", "fire")
@cmd bindentity spawn() getlocalvar("self") 0 1 10 1 0 1
便利なことなんでもう一度
たったこの2行だけで(MODELS.txtにfireというEnityの登録は必要ですが)
自分にエフェクトを”くっ付ける”ことが出来ます。
上の例では”fire”というEntityを自キャラに重ねて表示します。
謎の数値 0 1 10 1 0 1 はBindentity(バインド)の座標 くっ付けるキャラ(Entity)の
X, Z, Y(A), 向き, 親のAnimと同期するか, キャラに被せるか背景にするか
難しいっぽいのが同期で、実は難しい事などなく、逆に効果的に使えるもので
自キャラ(親)とBindentityで付くEnitityに同じAnimが用意されていると、
親と同じAnimが実行されるので、親がAnim Attackなら子(Bind)もAnim Attackが実行されるというもの
「実体のある分身」が気軽に作れるのが想像できると思います。
しかし、getlocalvar("self")にgetlocalvar("self")はBindできないので、
分身は中身は一緒でも適当に名前を変えてMODELS.txtに登録しておかないとエラー落ちします。
113:名前は開発中のものです。
21/05/06 02:16:30.98 /KeaSO9B.net
訂正 setspawnentry("name", "fire") X setspawnentry "name" "fire" O
@CMD でスクリプトやコマンドを直接呼び出す際は
コマンドに最初から設定されている 括弧やカンマ、ピリオドを消して
スペース記号(見えませんが)で区切って記述しないとエラーになることが多いです。
便利な反面、エラーがでるとかなりてこずります。
スクリプトを弄っていてエラー落ちが発生した場合、便利なのがLogフォルダの
Scriptlog.txt ここに、どのようなスクリプトが実行されているか出力されるので
エラー箇所を特定することになります。
114:名前は開発中のものです。
21/05/06 02:24:21.35 /KeaSO9B.net
括弧やカンマなど消すといっても getlocalvar("self") これは?
スクリプトや@cmdを使う際にさらに別なコマンドを使うときは
基本どおりの記述でよいので
@cmd bindentity spawn() getlocalvar("self") 0 1 10 1 0 1
この場合 spawn() と getlocalvar("self") は通常の記述
大元の bindentityについては括弧やカンマなど削除して記述します。
bindentity(spawn(), getlocalvar("self"), 0, 1, 10, 1, 0, 1);
本来あるべき姿は上のようになります。
OpenBoRのシステムに直接干渉するので、エラー(大概こちらの勘違い)のさいは
結構な手間になりますが、基本コマンド以上に色々弄れるのが痛し痒し。
115:名前は開発中のものです。
21/05/06 02:47:41.51 /KeaSO9B.net
>>111さん
すいません、あまりブラウザ更新しないので気付かずに居ました。
画像を拝見しました。
上からっぽくてすいませんが、
1枚の画像からも kt住江様の世界観や作風を大切になさる様が大いに感じられ
ワクワクが止まりません。
いつも人様のムゲンキャラを弄って消費してばかりの私にとって、
いつかは自分もと参考&励みにさせて頂いています。
既存のものを改変するのってとても簡単なので、ついつい人様の作品に弄って楽しんでばかりで
そのぬるま湯から抜け出せすにいます。
別なスレに「作品を完成させられない人」ってのもありますが、私はそのタイプ。
イメージを形に出来る方を本当に尊敬します。
116:名前は開発中のものです。
21/05/06 23:33:55.01 /KeaSO9B.net
@script
void self = getlocalvar("self");
int MP = getentityproperty(self,"mp");
setlocalvar("T"+self, findtarget(self));
if( frame == 0 && getlocalvar("T"+self) != NULL() ) {
void target = getlocalvar("T"+self);
void vAniID = getentityproperty(target,"animationID");
void TType = getentityproperty(target,"type");
int Boss = getentityproperty(target, "boss");
if(TType == openborconstant("TYPE_ENEMY") && Boss==0 && vAniID != openborconstant("ANI_DIE") && vAniID != openborconstant("ANI_SPAWN") && vAniID != openborconstant("ANI_RISE")) {
changeentityproperty(self,"mp",MP-80);
changeentityproperty(target, "parent", self);
changeentityproperty(target, "type", openborconstant("TYPE_NPC"));
changeentityproperty(target, "hostile", "TYPE_ENEMY");
changeentityproperty(target, "candamage", "TYPE_ENEMY");
changeentityproperty(target, "lifespancountdown", 2200);
changedrawmethod(target, "reset", 1);
setlocalvar("T"+self, NULL());
changedrawmethod(target,"tintmode",3);
changedrawmethod(target,"tintcolor",rgbcolor(128, 255, 255));
}
}
@end_script
117:名前は開発中のものです。
21/05/06 23:43:25.09 /KeaSO9B.net
上は、敵をNPCにしてしまうスクリプト
anim runjumpattack
followanim 9
followcond 1
attack 25 9 76 85 10 1 1 0 60 20
dropv 4 1
offset 31 91
frame data/chars/kunagi/399.gif
こんな感じで、攻撃がヒットしたらFollow9に跳ぶようにして
anim follow9
## charm
@script
〜
@end_script
delay 22
offset 32 91
frame data/chars/kunagi/401.gif
跳び先のFollowにこんな感じでスクリプトを仕込みます。
簡単に説明すると、攻撃がヒットした相手の種別をNPCにして、敵対者をENEMYにしてるだけ
そして、Lifespancountdown 2200(およそ100で0.5秒)11秒後に自動で消滅します。
ヒットした直後にスクリプトを即発動せず、わざわざFollowを挟んでいるのは
単なる趣味で、私の場合、このキャラには予備動作、発動、決めポーズの段階を踏ませているため
べつに当たるを構わず片っ端からNPC化しても良いのですが、その辺は好みで。
後、これの問題点はステージ終端のラッシュなどで片っ端からNPC化するとステージクリアしてしまうことw
118:名前は開発中のものです。
21/05/07 00:13:33.09 RxUWGAGV.net
上のスクリプトは元々、もっと複雑な仕様(使うにはアイテムを購入して消費)だったものを
簡略化したのでMPさえあれば連続使用できてしまう訳です。
さらには時間で元の敵に戻るということも出来るのですが、それにはMODELS.txtにて
専用 Entityを作成して、それを Bindentityしなければならないので、結構手間がかかります。
簡単に説明すると、Bindentityには必ずParent(親Entity)が必要、それを逆に利用して
透明なEntityをBindentityし、一定時間経ったら元のParent(Entity)の情報に上書きするというもの。
一瞬頭が混乱しますが、Bindentityの特性を理解すると「なるほどー!」となります
もちろんオリジナルは私などでは無く、D&D Rise of Warduke2015から拝借しました。
119:名前は開発中のものです。
21/05/08 00:13:01.25 S2juEpeY.net
少し前に、data/scripts/フォルダ下に特定のファイルを入れておくと自動で読み込まれ
優先的に実行されると書きましたが、Loading.c もその一つ
void main()
{
void s;
void value = getlocalvar("value");
void max = getlocalvar("max");
if(max==1){
return;
}else{}
void percent=value*99/max;
percent%=++percent;
void dot=percent%3;
if(dot==0)
s=".";
else if(dot==1)
s="..";
else
s="...";
drawstring(80,144,1,"Loading Please Wait Moment"+percent);
drawstring(128,176,1,"Loading Complete Part"+s);
drawbox(160,197,126,10,11,rgbcolor(200,0,0),0);
drawbox(160,197,percent*126*0.01,10,15,rgbcolor(200,200,0),0);
}
こんな感じでテキストファイルを先のファイル名で保存しておけばOK
いくつかMODをプレイしていると、最初にパーセントやメーターが上昇してゆく
スクリーンを見た事があるかと思います。
data/BGS/ フォルダ下にLoading.gif など画像を入れておくと、同じく最初に自動で表示されます。
その他にも色々と自動で表示される画像などは多々ありますが、
その辺は各MODの data/BGS/ フォルダの中を見てみれば殆どの方が用意しているので参考になるかと思います。
120:名前は開発中のものです。
21/05/08 00:34:31.12 S2juEpeY.net
didhitscript @script
void main() {
void self = getlocalvar("self");
void opp = getlocalvar("damagetaker");
if(opp != NULL()) {
if(getentityproperty(self, "animationID") == openborconstant("ANI_RUNATTACK")) {
if (getentityproperty(opp,"a")==0) {
changeentityproperty(opp, "nextanim", getentityproperty(opp, "nextanim")+360);
changeentityproperty(opp, "nextthink", getentityproperty(opp, "nextthink")+360);
setglobalvar(getlocalvar("self")+"_delayhit",1);
}
}
}
}
@end_script
普通なら data/SCRIPTS/ フォルダに入れておいて都度参照するように指定するスクリプトを
じかにEntityに仕込みAnim RUNATTACKがヒットしたら、その相手が3.5秒ほど硬直するというもの
setglobalvar(getlocalvar("self")+"_delayhit",1);これは攻撃が当たったというフラグ
121:名前は開発中のものです。
21/05/08 00:41:03.92 S2juEpeY.net
anim runattack
jumpframe 0 0 1 0
@script
if (frame==13){
void self = getlocalvar("self");
if (getglobalvar(self +"_delayhit")) {
setglobalvar(self +"_delayhit",NULL());
changeentityproperty(self, "animation", openborconstant("ANI_SPECIAL"));
}
}
で、件のAnim RUNATTACKにて最終 frame(この例ではFrame==13)にて
getglobalvar(self +"_delayhit")フラグが成立していると
SPECIALに自動で移行するというもの
別にスクリプト使わなくてもAttackコマンドの後にSTUN 3と記述すれば
攻撃がヒットした相手は3秒ほど硬直するので、追撃は可能なのですが、
例の場合、直線にならんだ多数の敵を硬直させ、SPECIALで一網打尽に出来るという
演出重視の処理ができて、仕込んだ本人はご満悦というものです。
122:名前は開発中のものです。
21/05/08 01:01:56.73 S2juEpeY.net
jumpframe {Frame}{a}{x}{z}について
もともとキャラクター(Entity)の座標を直接変化させるには
Move(水平)Movea(垂直)Movez(奥行き)があり、
コマンド後に書かれたFrame 掛ける Moveの数値分座標が移動します(+なら進行方向 ーなら逆)
Move 0コマンドが記述されるまでFrameの度に移動しますので注意。
Jumpframeコマンドは、その名の通りジャンプに関するコマンドなのですが
指定したFrame(最初は0で数える)からスタートして、{a}{x}{z}分
自動で移動します。{a}を3などにすれば通常通りジャンプするのですが、
{a}を0にし、{x}{z}に+−数値を入れる事で、ジャンプせずに移動も可能になります。
すべる様にに移動するので、Moveではガクガクしてしまう動作も滑らかにすることができます。
が、微妙な距離調整が必要になるので、そんな時便利なのが
@cmd changeentityproperty getlocalvar("self") "velocity" 0 0 0
後ろのほうの数値が 0 0 0 とあるように全ての方向への慣性が0になります。
つまり動作STOP、数値の並びは x z a なので色々弄って遊ぶのも良いかと。
jumpframeだけでも結構いろいろ使えるので便利ではあります。
問題は、Anim中に複数記述しても有効なのは1つだけです。
123:名前は開発中のものです。
21/05/09 18:57:27.67 uQy3TiTw.net
OpenBoR stats 0.53 では mugen のairファイルが読み込めて便利と以前に書きましたが
たまにファイルが灰色に表示され、選択出来なくなることがあります。
そんな時は無限用のファイターファクトリーでsffファイルを8bit用のデータでセーブしてやると
OpenBoRstatsでも読み込めるようになることもあります。
124:名前は開発中のものです。
21/05/09 23:30:14.44 1QV0D9Lf.net
>>118 ここで「## Charm」とありますが、「#」これ一つで以降に書かれたテキストはOpenBoRとしては無視する
いわゆる「コメント(人間が読んだときの栞や説明)」となります。
で一つ「#」を使えば十分なのですが、大量に使って作成者が目印にしたりもします。
私は基本「##」2つ連続で使うのですが、一時的に使わないけど、また後で使うかもなコマンドの最初に
# jumpframe 0 0 1 0
こんな感じに使う事で、一時的に無効にすることができます。
で、OpenBoR stats を使っていると、#を使っているとたまに行ごと削除されてしまうことが有り
それを防ぐおまじないとして##2つ重ねています。
125:名前は開発中のものです。
21/05/09 23:36:48.96 1QV0D9Lf.net
「## Charm」は >>117 でした。
@Script
〜
@End_script
ここで使うコメントは「//」となります。
@cmd これをコメントにするときはこんな感じ「# @cmd」 なので
スクリプト的に内部動作を弄るときはC言語みたいに「//」だったよなと
「// @cmd 」とするとエラーになりますので注意です。
126:名前は開発中のものです。
21/05/10 00:00:27.11 snJfXwVZ.net
この様なサイトがあるのを初めて知りました。
レベルの高い内容ばかりで参考になります。
素人ながら「RescueCommandU」を色々いじって遊んでるのですが
試したいことがあるので教えていただきたいです。
敵キャラ同士が同じ座標に重なったり、すり抜けたりしないように
接触判定の条件?をいいじりたいのですが、どこをどのようにいじればよいか
どなたかご教示いただけないでしょうか。
敵キャラ同士の攻撃は従来通り当たらないで、あくまで接触判定だけ変えたいです。
何卒よろしくお願いします。
127:名前は開発中のものです。
21/05/10 00:05:01.81 LcOGIvvu.net
>>118 で説明しようとしてた Entityの内容がこれになります。
name Charm
type none
anim idle
@script
void self = getlocalvar("self");
int Parent = getentityvar(self,1);
if(frame==1) {
setdrawmethod(Parent, 1, 128, 128, 0, 0, 0, 6);
changedrawmethod(Parent,"tintmode",3);
changedrawmethod(Parent,"tintcolor",rgbcolor(128, 255, 255)); }
if(frame==3) {
setdrawmethod(Parent, 1, 256, 256, 0, 0, 0.5, 0);
changedrawmethod(Parent,"flag",0);
changeentityproperty(Parent,"hostile","TYPE_PLAYER","TYPE_NPC");
changeentityproperty(Parent,"type",openborconstant("TYPE_ENEMY"));
changeentityproperty(Parent,"candamage","TYPE_PLAYER","TYPE_NPC"); }
@end_script
delay 1
frame data/chars/misc/empty.gif
delay 220
frame data/chars/misc/empty.gif
delay 1100
frame data/chars/misc/empty.gif
delay 1
frame data/chars/misc/empty.gif
128:名前は開発中のものです。
21/05/10 00:23:14.55 LcOGIvvu.net
>>116 のスクリプト中に
clearspawnentry();
setspawnentry("name", "Charm");
void Ceff = spawn();
setentityvar(Ceff, 1, target);
bindentity(Ceff, target, 0, 1, 0, 0, 0, 0);
このような感じでMODEL.txt で設定した Entity CharmをBindentityしてあげると
name Charm の親Entity(攻撃がヒットした相手)の情報がCharmに収納され
一定時間(delay 1100) frame data/chars/misc/empty.gifが実行されると
Frame==3で
元のEntity、changeentityproperty(Parent,"type",openborconstant("TYPE_ENEMY")に戻ることになります。
こういう閃きが出来る方って本当に凄いと尊敬します。
私はスクリプトの中身を読んで「ほへ〜凄いなー」となって、何も考えずコピーして「動いたー!」
さっそくスレに書き込むことしかしないので、どういう経緯でこうなるのか基本全く分かりません。
世の中には凄い人が沢山いるものです。
129:名前は開発中のものです。
21/05/10 01:02:42.20 LcOGIvvu.net
>>126 さん、私は適当に人様のMOD内を覗き込んで、スゲーと思ったことを
こちらに転載してるだけなので、何の取り柄もありませんが分かる範囲では、
敵同士の「重なり判定」については謎になってます。
きっと調べる手段はあると思います。
実際、画面上に存在するキャラ(TYPE_ENEMY)の数をカウントするコマンドは存在します、
カウント数からPROPERTYを取得、さらに座標を取得して、互いにぶつからない様処理することは
たぶんですが、可能だとは思います。
MODのMIXMASTERSでは、そのコマンドを利用して画面上の全ての敵、味方にHPアップや
一斉攻撃などを実現していました。
プレイヤーについてはGetPlayerPropertyで1〜4プレイヤーの情報取得が簡単になってます。
しかし敵については漏れることもあり(画面端でボーっとしてたりw)、けっこう大雑把でもありました。
一番簡単なところでは、各敵キャラをSPAWNさせる際に
changeentityproperty(vSpawn, "speed", (rand()%14)+6); 動くか分かりません。
こんな風に移動速度("speed")にランダム要素を組み込む感じで、
移動速度をずらす位にして置いたほうが悶絶しなくて済むかもです。
Entityの性格づけにSubtypeやAimoveなどいくつか設定できるものもありますが、
敵同士で移動の衝突判定して、それを避けるようなものは私はまだ見た事がありません。
そこまで細かく判定してないからこれだけOpenBoR Engineが軽いんじゃないかな?と想像してます。
130:名前は開発中のものです。
21/05/10 01:16:10.44 LcOGIvvu.net
せっかくラッシュな感じで敵を大量に出現させても、
重なって団子になってしまうと興ざめな部分もありますよね。
かといって敵があまりにランダムな動きをしてしまうと、
それはそれで、、、となってしまいます。
このスレでも度々お世話になっている、kt住江氏のMODを遊んでいると、
絶妙な敵のコンビネーション(ザコは固まるし、バラける、ボスは適度に意地悪)
ステージの作り方でどちらも一方的にならないように工夫されているなど、
OpenBoRの基本システムだけで表現しているので、とても参考になるかと思います。
131:名前は開発中のものです。
21/05/10 02:53:40.87 snJfXwVZ.net
>>129さん
ご丁寧に返信いただきありがとうございます。
私も自分なりにマニュアルを読みましたがわからず相談させていただきました。
頂いた代替案も参考にさせて頂きつつもうちょっと粘ってみます。
ありがとうございました!!
132:名前は開発中のものです。
21/05/10 09:21:40.27 iq7vM874.net
敵の動きについては昔2016年頃のMODだと
AiMove1やAiMove2など思考に優先順位を付ける事ができたようす
最近のBoRエンジンでは省略されたぽい
公式でも話題になってた。
133:名前は開発中のものです。
21/05/10 10:46:10.08 iq7vM874.net
今ふと思いついただけなんですが
敵のidleやwalkにattackコマンドをダメージ0で記述して
painにmove-1とかすれば敵同士重なったら多少ずれるかな?
134:名前は開発中のものです。
21/05/11 00:12:34.39 W5SAA6KE.net
やってみました。
敵のヘッダーにcandamage player enemyと記述
Anim WalkにAttack6(普段あまり使わない、MODELS.txtにMaxAttacks 99など必要)を
ダメージ 0、吹っ飛び無し 0、必中 1、エフェクト無し 1、で設定
そしてAnim Pain6(Attack6がヒットしたとき専用リアクション)に適当に
Delay 12くらいでMove -16とFrame 〜といった感じに。
プレイヤー側にはAnim Pain6をリアクションしないように設定
Delay 1でFrame 〜Empty.gifとか
結果、敵同士がぶつかる(Attack6がヒット)すると、敵Anim Pain6の処理のおかげで
立ち止まったり、Move分移動したりはできた。
が、OpenBoRのシステム上、攻撃がヒットするとヒットした方向を自動で向くため
なんとも野暮ったい感じに(お前が先いけよ、どうぞどうぞみたいなw)、
あとCandamage player enemyのせいで、敵の通常攻撃も敵にヒットするようになり(当たりまえですが)
これはこれで、同士討ちは面白いのでこういう敵(中・大型の敵味方かまわない感じの)を少々混ぜる分には良いかも。
ファンタジーの中ボスが味方を蹴散らして乱入みたいな演出に良いかも?
しかし、通常の敵に仕込んでも苦労の割りに効果は「渋滞と同士討ちが発生する」なので、
適当にNPCをSPAWNさせて標的を散らすほうが簡単かも。
135:名前は開発中のものです。
21/05/11 00:32:56.22 W5SAA6KE.net
上のAttack6はattackコマンドの方で、Anim Attack6ではありません。
Attack6 0 0 100 100 0 0 1 1 0 15の方です。
この攻撃がヒットした際にAnim Pain6が存在すると、
このAnimが優先して実行されます。
136:名前は開発中のものです。
21/05/11 21:24:05.65 hyfsamfM.net
>>134さん
なんと!!私も早速試してみます。情報ありがとうございます。
同士討ちは、それはそれで面白そうなのでやってみます。
同士討ちは”Anim Walk”による判定か”Anim Attack”による判定か
判別出来れば解消するんですかね〜。やれるかわかりませんが・・
137:名前は開発中のものです。
21/05/12 00:57:58.28 z4QIhI5l.net
近くにいる敵に向かって進む
@script
if(frame==6) {
float Velx=2, Velz=1, dx=0, dz=0;
void self = getlocalvar("self");
int dir = getentityproperty(self, "direction");
float x = getentityproperty(self, "x");
float z = getentityproperty(self, "z");
if (dir == 0) { dx = -dx; }
setlocalvar("T"+self, findtarget(self));
if( getlocalvar("T"+self) != NULL()) {
void target = getlocalvar("T"+self);
float Tx = getentityproperty(target, "x");
float Tz = getentityproperty(target, "z");
if(Tx < x){
changeentityproperty(self, "direction", 0);
} else {
changeentityproperty(self, "direction", 1); }
続く
138:名前は開発中のものです。
21/05/12 01:03:15.13 z4QIhI5l.net
続き
x = x+dx;
z = z+dz;
float Disx = Tx - x;
float Disz = Tz - z;
if(Disx < 0){ Disx = -Disx; }
if(Disz < 0){ Disz = -Disz; }
if(Disz < Disx) {
if(Tx < x){
setlocalvar("x"+self, -Velx);
} else { setlocalvar("x"+self, Velx); }
setlocalvar("z"+self, Velx*(Tz-z)/Disx);
} else {
if(Tz < z){
setlocalvar("z"+self, -Velz);
} else { setlocalvar("z"+self, Velz); }
setlocalvar("x"+self, Velz*(Tx-x)/Disz); }
} else {
setlocalvar("z"+self, 0);
if(dir==0){
setlocalvar("x"+self, -Velx);
} else { setlocalvar("x"+self, Velx); }
}
float Vvx = getlocalvar("x"+self);
float Vvz = getlocalvar("z"+self);
if( Vvx!=NULL() && Vvz!=NULL() ) {
changeentityproperty(self, "velocity", Vvx, Vvz);
}
}
@end_script
近くにいる敵をFindtargetして座標を割り出し、自分の座標と比較して
向きと距離から計算して、敵のいる方向にVelocity(慣性とでもいいますか、強制移動)させるというもの
139:名前は開発中のものです。
21/05/12 01:15:27.65 z4QIhI5l.net
>>137 で(Frame==6)とあるようにAnim のFrame 7番目(1番は0なので)で実行されます。
frame 7番目にAttackコマンドが記述してあれば、攻撃判定を持ったまま移動します。
勢いは Velx(横方向)Velz(奥行き)dx、dzはスタート位置をずらしたりの調整(0でOK)
適当なFrameで@cmd changeentityproperty getlocalvar("self") "velocity" 0 0 0として
止めてあげます。
利点は、奥や手前の敵にホーミング攻撃できる!
問題点はFindtarget(OpenBoRに最初から用意されてるコマンド)が結構雑で思った敵に行かない所でしょうか
一対一の格闘ではないですし、現在画面内にいる敵をカウントして自分との距離を算出するなんて
想像しただけで気が遠くなるので、コマンドを用意してくれてる公式に感謝です。
140:名前は開発中のものです。
21/05/12 01:48:22.25 z4QIhI5l.net
>>136 さん
同士討ちの原因は簡単で
candamage player enemy
candamage(Attackコマンドの攻撃判定が有効になる対象)
player(そのままプレイヤー) enemy(TYPE_ENEMYと設定されたentity)なので
これが記述されていると同士討ちになる訳です。
特別スクリプトを使わずに、OpenBoRの基本設定でなんとできるかな?と試しただけなので穴だらけです。
丁寧に処理するには、OnDoAttack(Entityが攻撃コマンド実行時に処理されるスクリプト)か
AnimationScript(Entityが何かするたび処理)辺りで設定してみるか、
@scriptでうまいこと座標の重なりを検知できれば良いのですが、
攻撃対象を検知(FindTarget)するのはあるんで、きっと存在はしてる筈なのですが
141:名前は開発中のものです。
21/05/12 01:56:59.21 z4QIhI5l.net
>>134 で苦労の割りにと書いたのは、場合によっては全ての敵にAnim Pain6などリアクション設定しないと
あまり効果が出ないので、同じ種類の敵でもSpeed(移動速度)をランダムにしてみる。
などのステータスを弄ってみたほうが楽かなと思いました。
srand(seed)
set a seed for random number generator
まだ使った事ないですが、こんなコマンドもあるようなので試してみようと思います。
142:名前は開発中のものです。
21/05/12 15:39:00.17 z4QIhI5l.net
スクリプトばっかりで意味がわからん、という方も多いかと思います。
スクリプトはあくまで味付けなので、殆どのMODはOpenBoRの基本コマンドだけで作られていますので
もし、たとえばOpenBoR STATSに触れる機会があったら、+LEVELSをクリックしていってみて
spawn Bob
health 50
coords 500 200
at 0
こんな感じの所をコピペで増やしてみたり
+PLAYERをクリックしていってHealth 100などとあったら300にしてみたり
ちょっとづつ出来合いのものを変えてみてはいかがでしょう?
でもちょっと味付けを変えてみようかな?と思ったら
Chrono Crash 公式?サイトから
OpenBOR >Help & Resources >Scripting >Scripts Index とたどっていって
Bloodbane's Simple Scriptsあたりを見てみると大量に実例とファイルが用意されているので
覗いてみると泥沼に嵌るかもしれません。
143:名前は開発中のものです。
21/05/13 01:20:35.32 OoHlaO5a.net
anim jumpattack3 ## Jump, Up + A
@script
if(frame==3) {
float vx=3, vz=0, vy=-4;
int vd=getentityproperty(getlocalvar("self"),"direction");
if(vd==0) { vx= -vx; }
changeentityproperty(getlocalvar("self"), "velocity", vx, vz, vy);
}
@end_script
jumpframe 0 2 -0.5
delay 8
offset 34 97
frame data/chars/kunagi/318.gif
offset 34 95
frame data/chars/kunagi/319.gif
offset 42 88
frame data/chars/kunagi/320.gif
delay 30
attack 20 20 30 60 10 0 1 0 0 20
stun 1
offset 40 99
frame data/chars/kunagi/371.gif
offset 65 90
frame data/chars/kunagi/372.gif
私は基本あまり使わない攻撃には強力な性能を仕込むようにしてます。
例はジャンプ中にレバー上+A で飛び込み攻撃
OpenBoRの標準コマンド JumpFrameはとても便利ですが、一つのAnim中に一回しか機能しません
そこで@Scriptを使って飛び込み動作をさせています。地上でVelocityを使う時はX,Z,Yを0に
戻す手間が掛かりますが、Jump中なら着地で自動的に0に戻るので、気軽に使えます。
144:名前は開発中のものです。
21/05/16 00:01:17.20 FoJl/otl.net
あいかわらず Paletteや ReMapについては良く分からないです。
ぐっちゃぐちゃの色になったり、Alphaがとんでもない事になったり
もう色については放置です。
@cmd changeentityproperty getlocalvar("self") "animation" openborconstant("ANI_CHARGE")
frame data/〜
とすることで、Animの処理中に別なAnim(例ではCHARGE)に処理を跳ばす事が出来るんですが
処理中のAnimにLoop 1(当該Animを繰り返し実行)があると、例のパターンだと一瞬だけANI_CHARGEに跳んで
すぐLoop 1のAnimに戻ってしまうんですね。
そんな時、Loop 1であっても別なAnimに処理を強制的に移行させるのが
@cmd executeanimation getlocalvar("self") openborconstant("ANI_CHARGE") 0
これで、Loopの呪縛から開放されます。
145:名前は開発中のものです。
21/05/16 00:31:35.07 FoJl/otl.net
>>143 に、ジャンプ上攻撃(JumpAttack3)の中にもJumpFrame 0 2 0.5とありますが
これは、元々のジャンプが降下に移っているとき攻撃を出しても、
攻撃が実行される前に着地してしまうことを避けるため、擬似2段ジャンプのような形にして
JumpAttack3が降下中でも攻撃判定がでるように工夫してます。
以前に紹介した、Cancelを利用した2段ジャンプは別にFreeSpecialを用意する必要がありましたが
時には使う事が無いJumpAttack2やJumpAttack3を2段ジャンプ代わりにすることも出来るわけです。
146:名前は開発中のものです。
21/05/16 00:43:11.17 FoJl/otl.net
>>137 の敵に向かってホーミング移動は自分だけでは無く
自分が射出する系(はどー拳みたいな)のEntityに仕込むことで、実際に誘導弾にできるので
void self = getlocalvar("self");
float vX=2 , vY= 0, vZ= 0, dX= 50;
int sX = getentityproperty(self, "x");
int sY = getentityproperty(self, "a");
int sZ = getentityproperty(self, "z");
int iCnt=4, iEnt, Rd= 0, dir = getentityproperty(self, "direction");
if(!dir) { dX= -dX; }
for(iEnt= 0; iEnt<iCnt; iEnt++) {
void vShot = projectile("Ktball", sX+dX, sZ+0, sY+60);
vY += 0.5;
vX -= 0.25;
setdrawmethod(vShot, 1, 160, 160,0,0,0,1,0,0,0,0,0);
changeentityproperty(vShot, "owner", self);
changeentityproperty(vShot, "parent", self);
changeentityproperty(vShot, "direction", self);
changeentityproperty(vShot, "velocity", vX, vZ, vY);
changeentityproperty(vShot, "speed", vX);
}
こんな感じのスクリプト(4発 iCnt=4 の弾 ”Ktball”をばら撒く)の ”name Ktball”Entityに
>>137 の誘導スクリプトを仕込めば画面がとっても五月蝿い感じになります。
147:名前は開発中のものです。
21/05/16 00:46:10.02 FoJl/otl.net
上の
setdrawmethod(vShot, 1, 160, 160,0,0,0,1,0,0,0,0,0);
changeentityproperty(vShot, "owner", self);
changeentityproperty(vShot, "parent", self);
ここはあまり意味無い(darawmethodによる描画の変化、プレイヤーにスコアが入るかの設定)なので
気にしないでOK
148:名前は開発中のものです。
21/05/16 01:04:20.46 FoJl/otl.net
vY += 0.5;
vX -= 0.25;
この部分で射出される弾の軌道を調整(例では4つの弾が斜め上にずれて打ち出される)しているので、
iCntを増やして、vX,vYを関数的に処理すれば綺麗な扇弾にすることもできますね。
ジャンプに関しての追記ですが、
anim jumpattack2
@script
if(frame==8) {
float vx=3, vz=0, vy=-4;
int vd=getentityproperty(getlocalvar("self"),"direction");
if(vd==0) { vx= -vx; }
changeentityproperty(getlocalvar("self"), "velocity", vx, vz, vy);
}
@end_script
jumpframe 0 4 -0.5
delay 6
offset 37 95
frame data/chars/kunagi/01.gif
〜
attack 0 0 30 40 8 1 1 0 10 20
offset 26 93
frame data/chars/kunagi/08.gif
こんな感じにすることで、ジャンプ中レバー下攻撃(JumpAttack2)と入力すると
擬似2段ジャンプから一転、急角度(vx=3, vy=-4)で飛び込む攻撃になります。
changeentityproperty(getlocalvar("self"), "velocity", vx, vz, vy)
とても便利ですね。
以前にも書き込みましたが、適当なところで "velocity", 0,0,0 にしないと
同一Anim内では動きっぱなしになってしまいますがw
149:名前は開発中のものです。
21/05/16 01:26:03.54 FoJl/otl.net
余計な事ですが、
int vd=getentityproperty(getlocalvar("self"),"direction");
if(vd==0) { vx= -vx; }
この部分は、一回しか使わないので、
if(!getentityproperty(getlocalvar("self"),"direction")) { vx= -vx; }
これでも良さそうですね
度々、お世話になる”direction”これは、キャラ(Entity)の向きを表しています。
1ならEntityは右向き、0なら左向きとなります。これはプレイヤーでも敵でもアイテムでも一緒です。
if(〜) { 〜 } に関しては、もし(〜)内の条件が 1の時は{〜}内の処理を実行するというもの。
!getentityproperty 気付きにくいですが先頭の!マークがあると「〜ではない場合」の意味なので
向きが左(数値が0)ということは1では無い、一番上のvd==0と同じ意味になります。
分かりにくいので、他人に見せる場合は一番上のように記述するのが良いと思います。
なんかこんな風に記述することで「ちょっと分かった気分になれる」という利点があります。
最近覚えたので薀蓄たれたくなりました。
150:名前は開発中のものです。
21/05/16 03:06:57.62 FoJl/otl.net
Loop 1からの脱出
AnimにLoop 1が設定されていると
@cmd changeentityproperty getlocalvar("self") "animation" openborconstant("ANI_CHARGE")
では、すぐに元のAnimに戻されてしまう。
そこで、executeanimationを使う事で完全に別なAnimに移行できると紹介しましたが、
executeanimationを実行させる条件付けはどうしよう?
@script
if(frame>0) {
if(getplayerproperty(0, "newkeys")) {
executeanimation(getlocalvar("self"), openborconstant("ANI_CHARGE"), 0);
}
}
@end_script
これは何らかのキー入力(方向キー、各ボタン)でexecuteanimationするもの。
他にPlayerkeys(0,0,"anybutton")もありますが、これはボタン(Aの攻撃など)のみ、
あと、標準コマンドのCancelを使ってFreeSpecial#に移行することも出来ますね。
これだけでは無くプレイヤーに関しては、プレイヤーの状況を取得する手段が結構いろいろと用意されています。
>>148 のAnim JumpAttack2内の Velocity制御について、
結局、強制的に動かしたい方向が決まっていれば以下のように Velocityを指定してやれば良いということになります。
@cmd changeentityproperty getlocalvar("self") "velocity" 3 0 -4
frame data/~
~
@cmd changeentityproperty getlocalvar("self") "velocity" 0 0 0
frame data/~
ただ、直接指定すると”強制的に右向きを基本とした動作”になってしまうので、
if(vd==0) { vx= -vx; }こういった処理が必要な場合、@Scriptを利用することになります。
標準コマンドを利用するとAnim中に1回のみなどの制約が伴いますが、気軽に使えます。
一方、@cmdや@scriptを利用すると、様々な要素(省略できる部分もあります)について指定する必要があります。
151:名前は開発中のものです。
21/05/17 00:52:19.70 FAJnAZ+T.net
@Script
〜
@Emd_Script
ばかり紹介してるけれど、本来スクリプトは data/scripts/フォルダにまとめて
そこから呼び出すようにした方が良いって公式にも書かれています。
でも完全にそうなってしまうと、得体の知れないブラックボックス的なものになってしまうかも
という危惧があります(余計なお世話ですが)。
なので一旦、スクリプトってどんな働きをしてるの?という部分について
大雑把にこんな感じ(だと思う)だよ、と紹介できたらなというのが私の思いです。
標準コマンドは危険が無いように各種ステータスを自動で調整してくれますし、
標準コマンドですべて完結するのが一番だと考えています。
一方、私程度でも、いつもよりチョッとだけ違う動きが出来たりする懐の深さが
OpenBoRの魅力かなと思います。
Entityのヘッダー(ファイルの上のほう)で設定する、SpeedやAntigravityなどの数値ですが
最初に設定する以外にもChangeEntityPropertyなどで自由に変更できる事は、これまでも紹介した通りです。
ヘッダーではSpeed 11のAntigravity 100のように設定していても、ChangeEntityPropertyなどで変更する時は
10分の1〜100分の1程度の数値にしないと、影響が大きすぎて激しく動いてしまう事も多々あります。
これはやってみないと判らないことが多いので、試行錯誤で悶絶ですね。
152:名前は開発中のものです。
21/05/17 02:39:29.32 FAJnAZ+T.net
同じ敵でもSpeedの数値をランダムに変えれば、多少は「団子状態」で迫りくる状況が変えられるか?
という事で、いくつかのシチュエーションで試してみましたが、
プレイヤーが一人で、転んだり(Fall)などの状況になってしまうと
結局、団子になってしまいます。
敵同士のぶつかり(重なり)を避けるためにCanDamage を使うと、プレイヤーに対する攻撃が
同じ属性(TYPE_ENEMY)にもヒットしてしまうので、面白いけれど、全ての敵がそうだと少々面倒。
今後の課題として、EntityPropertyなどの参照で、”DamageTaker”や”Opponent”を取得できれば
TYPE_ENEMYのAttackコマンドがTYPE_ENEMMYにヒットしないように(ヒットしても無視するように)
することも出来るかな?と思う。
もう一つの対処法としてRand()%100などを使ってランダムな数値を出し、その数値によって
Anim AttackやAnim Idle3のようなAnimに分岐させて、暇つぶしをさせることによって
重なりを防ぐという事も考えられます。
これは、他のいくつかのMODでも
敵の攻撃が成功したら、攻撃した敵に適当なAnim処理(攻撃が当たったヒャッホーみたいなモーション)をさせ
プレイヤーがいわゆるハメ状態にならないように工夫しているものからヒントを得ています。
沢山のTYPE_ENEMYを用意して、同じ種類の敵が同時に出現することを防げば良いのですが。
それはそれで試行の回数が増えることになるのでバランスが難しいですね。
153:名前は開発中のものです。
21/05/19 23:48:02.64 upn5bY1m.net
model commands:
entitypushing {int}: if 1 entity pushing target on collision
pushingfactor {float}: pushing factor on collision. Default: 1.0
openborscript functions: get_entity_collision_collection(void handle, int frame);
get_entity_collision_instance(void handle, int index);
get_entity_collision_property(void handle, int property);
set_entity_collision_property(void handle, int property, value);
openborscript:
added "entitypushing", "pushingfactor" to entityproperty
added "collidedentity" to entityproperty
added "maxcollisions" to openborvariants
Entity同士の衝突判定用?と思われるPropertyが Git hubの OpenBoR Plusで発見
Open BoRをデバグモードにすると緑やら青や赤の判定枠が表示することも出来ますが
ただ単にそれ用のPropertyかもしれませんが、Collisionという衝突のみを判定するフラグは
存在しているのが伺えますので、Entity同士の衝突しているのかの判定について
何らかのデータを取得する手段はあるのかなと思います。
一方で、そもそもOpenBoR Plusって・・・という謎も多々ありますし
とっくに実装されているとされている、Boomerangも動作確認できていないので
謎は深まるばかりです。
154:名前は開発中のものです。
21/05/22 03:25:15.70 zSTPvS3W.net
drawmethod scale # は機能する(#の数だけ拡大・縮小)のに
drawmethod scalex # scaley # (横、縦の比率を指定して拡大・縮小)は機能しない
OpenBoRのバージョンは3で固定のようですが、Buildでかなり動作にムラがあるようなので
MODによって、全く動作しなかったり、特定のステージ・エリアに行くと落ちたりします。
作者さんが動作確認できているBuildを公表するなりしてくれていると助かるのですが、
私の勝手な分け方では、古いMOD(2018年以前)はBuild 3789〜4086あたり、
それ以降であれば最新のものでも、ほぼ動作するようです。
大分安定しているとはいえ、過去Buildでは問題なく動作したコマンドが
最新ではエラー扱いになったりするので、どんな物でもそうなんですが、エラー原因の特定は
なかなか難しいですね。
155:名前は開発中のものです。
21/05/25 01:13:32.55 blxYdI/g.net
今ちょこちょこと弄っているのが、DungeonMAgic、過去にライトブリンガーとして
アーケードゲームとして斜め見下ろしダンジョン攻略アクションRPG風とでも言うのでしょうか
その登場キャラを例によってゴニョってOpenBoRに落とし込んだもの
ただ公式サイトでも、動いたー止まったーと幾つか混乱が生じているようですが、
Build 4078であれば特に落ちる事無くエンディングまで行けるようです。
Build 6000番くらいまで来ると、EntityPropertyの関係や、AttackTypes、AImoveの関係で落ちるっぽい?
修正できるかな?と思いましたが、とにかくLoadされるModelが多過ぎなのと
作者さんが ;セミコロンをコメント扱いにしていたりと中々の曲者なので
素直にBuild 4078でプレイするのが吉かと
156:kt住江
21/05/25 22:23:59.77 GJ3pQcTQ.net
こんばんは、kt住江です。
開発中のベルトアクションの開発率が50%に達しましたので、
途中経過の動画をご紹介します。
タイトル『ダブルドラゴン番外編』のOPです。
URLリンク(twitter.com)
2か月後の完成を目指して、引き続き頑張りたいと思います。
僭越ながら宜しくお願いします。
(deleted an unsolicited ad)
157:名前は開発中のものです。
21/05/30 02:14:00.16 VOVq5aSh.net
おろしや国辺りのサイトを見てると、痕跡は残っているのに、
Modそのものは結構消滅して行ってる感じが悲しい。
チャイさんヒスパさん系はフリーだったり、寄付募集したり、逞しい感じw
2D_Engineとしてかなり取っ付き易いのでもっと皆に弄って遊んで欲しいですね。
158:名前は開発中のものです。
21/06/07 00:31:12.40 kBKigIMN.net
分岐器で開発部門特製ソフトが発売されると大々的にCM打たれてますが
これを機にエディター系のジャンルが流行ってくれればなーと個人的には思いますが
カルネージハートは検索しても出てこないし、ヒューマンリソースマシーンとか
7ビリオンとか別に話題になってないみたいなんで、
おじ様達にちょっとヒットするくらいなんでしょうか
OpenBoRのほうはジャンプと攻撃のみでシンプルに楽しむ、王道2Dを弄っております
足場の端っこに立った場合のAnimとか用意してあって、OpenBoRの奥深さにいまさらながら驚いています。
159:名前は開発中のものです。
21/06/09 01:15:57.76 GZBN8r0d.net
純粋な2Dは難しいですね
パースーオリマーのようにジャンプで避ける、踏みつけて攻撃という
多少の派生動作はあってもシンプルな2種類の動作を選択するのみで
爽快感を得られるように工夫されている凄さに改めて敬服します。
OpenBoRでも、もちろんそのようなシステムにする事は可能ですが
ついつい、おキャッスルヴァーニャのように足を止めて打ち合う方に魅力を感じて
しまうのですが、その場合、足場の選択、自分の手数からの攻撃手段の取捨、
どの方向の敵を優先的に攻撃するか、などなどプレイする側はもとより
状況(ステージ)を設定する側の手腕も問われる訳でして
設定をチョッと間違えると、一瞬で無理ゲーや作業になってしまうので
あ熊城などの練り込み完成度の高さに、いまさらながら関心しています。
160:名前は開発中のものです。
21/06/13 00:36:10.90 54syd5Da.net
楽しい BindEntity
anim idle
loop 1
@script
if (frame == 0) {
clearspawnentry();
setspawnentry("name", "Ariel");
void vSpawn = spawn();
bindentity(vSpawn, getlocalvar("self"), -60, 0, 0, -1, 4, 1);
}
@end_script
これは、プレイヤーキャラが アイドリング状態になるたびに Arielというキャラを呼び出すもの
もちろんArielは自キャラ同様 MODELS.txtで設定しておく必要があります。
幾つか自キャラを選べるなら、そのうちの一つで良いのです。
ただし、呼び出すキャラと呼び出されるキャラ、ややこしいですね、上の例だと
Selfが親でArielが子になります。
書式は bindentity(entity, target, int x, int z, int a, int direction, int bindanimation, int sortid)
長いですね、entity(子)target(親)x,y,z(親の何処に表示するか)
direction(向き、0出現した時の向き、1親と一緒、2常に右、−2常に左)
bindanimation(子に親と同じAnimが設定されていると実行される)
sortid(重なった際に優先して表示されるか?なので、こだわり無ければ別に)
一番面白いのは bindanimation部分でしょうか、0何もせず、1親と同じAnimを実行
2親と同じAnimをFrame数までシンクロして実行、3は無くて
4は基本1で親と同じAnimが無ければEntity(上だとAriel)を消去(bindentity消去)
夢が広がるコマンドですね。
161:名前は開発中のものです。
21/06/13 00:57:23.46 54syd5Da.net
weapons {name1} {name2} {name3} {name4} {name5} {original name}
ちょっと説明が難しいのですが使うと便利なコマンドです。
というか DCManualを読むのが一番早いのですが、「なんか面倒そう」という感想を抱くかとおもいます。
また色々Anim設定しなきゃでしょ?と思うかも知れませんが、
modelflag 0(デフォ)となっていれば{original name}のAnimがコピーされます。
プレイヤーキャラを名前を変えてコピペして別キャラを作らなくても、
Anim Attack1〜3などのEntity(Model)を設定して、上の{name1}に記述しておけば
他のFreespecialなどは{original name}のAnimが実行されるので
Animを変えたい部分だけ作れば良いのです。
あるFreespecialを使うとスタイルチェンジ!とか変身!とかしたい場合便利。
特定のステージでプレイヤーの向きを固定(スクロール方向に)するなど、かなり便利なので
weaponFrame などこだわると結構いろいろ出来そうです。
162:名前は開発中のものです。
21/06/13 01:05:41.40 54syd5Da.net
>>160
BindEntity の Direction -1は常に親と逆向きです。
163:名前は開発中のものです。
21/06/14 01:20:36.86 f6qMiOOZ.net
@script
if(frame==0) { float Vx, Vz, Vy=3, dx=0, dz=0;
void self = getlocalvar("self");
int dir = getentityproperty(self, "direction");
float x = getentityproperty(self, "x");
float z = getentityproperty(self, "z");
if (dir==0) { dx = -dx; }
setlocalvar("T"+self, findtarget(self));
if( getlocalvar("T"+self) != NULL()){
void target = getlocalvar("T"+self);
float Tx = getentityproperty(target, "x");
float Tz = getentityproperty(target, "z");
if(Tx < x) { changeentityproperty(self, "direction", 0);
} else { changeentityproperty(self, "direction", 1); }
x = x+dx;
z = z+dz;
Vx = ((Tx-x)/(22*Vy));
Vz = ((Tz-z)/(22*Vy));
} else {
Vx = 1 ;
if(dir==0){ Vx = -Vx ; }
Vz = 0 ; }
tossentity(self, Vy, Vx, Vz); }
@end_script
他人様のアイデアを偉そうに紹介するのもアレなんですが、近くの敵に誘導ジャンプします。
if(frame==0) { float Vx, Vz, Vy=3, dx=0, dz=0;
これで、Frame 0の時、ジャンプ力3(Vy=3)で届く範囲を索敵してジャンプします。
攻撃するかどうかは、Anim中に記述されたコマンド次第で、このままなら、
攻撃可能と設定した近くの対象にジャンプするだけです。
164:名前は開発中のものです。
21/06/17 02:47:33.77 1MwPeeuR.net
DOT {Index} {Time} {Mode} {Force} {Rate}
{Index} defines DOT index. Entity may have up to 10 DOT effects at one time. An entity can be hit by more than one DOT effect at once. If entity is hit by same indexed DOT effects, only the latest one will be applied.
{Time} defines how long DOT effect active in centiseconds.
{Mode} defines how DOT effect is applied to hit entity. HP damage is same type as original attack and affected by damage mitigation.
1 = Nonlethal HP (can reduce to 1 but not below).
2 = MP.
3 = MP and nonlethal HP.
4 = HP.
5 = MP and HP.
{Force} defines amount of damage per tick.
{Rate} defines delay between each tick in centisecond.
DROPVと同じように Attack コマンドと一緒に記述することで
一定時間、ダメージを与え続けるというもの、
Indexは特に気にしなくてOK(DOTが重複して掛かるかどうか)、Timeは持続時間(600で6秒)
ModeはHPにダメージ、MPにダメージか双方か、ダメージによって消滅するか
Forceは一回あたりのダメージ。Rateは総時間(Time)中、何回ダメージを与えるか
Timeが600でRateが100なら、1秒ごとに6秒間Forceダメージ与えるというもの。
次ページ最新レス表示スレッドの検索類似スレ一覧話題のニュースおまかせリスト▼オプションを表示暇つぶし2ch
35日前に更新/359 KB
担当:undef