このゲームは、行動をあらかじめ命令したキャラクター同士を戦わせるゲームです。
キャラクターを作成するときに、使えるスキルを4種類自分で設定します。
そこで決めたスキルの待ち時間が、宣言してから実際に使えるまでの時間です。
大まかな戦闘の流れを説明します。
①開始時に、両者が同時にスキルを宣言します。
↓
②スキルの待ち時間が経過したキャラからスキルを実行します。
↓
③一度スキルを使うと、すぐに次のスキルを宣言します。
↓
④1000(ターン)が経過、もしくはどちらかのHPが0以下になったら終了です。この時、HPが高い方が勝ちです。
詳しいルールやスクリプトの文法の説明をここでしたいと思います。
まず、スキルには3つの属性、物理、魔法、カウンターがあります。以下に特徴を述べます。
物理:攻撃力、防御力、待ち時間を設定します。相手が直前に使ったのが魔法スキルなら攻撃力が1.5倍になります。
魔法:攻撃力、防御力、待ち時間を設定します。
カウンター:倍率、防御力、待ち時間を設定します。次のスキルを発するまでの間、相手の物理スキルを跳ね返します。
攻撃力はスキルを発動した瞬間の攻撃に影響し、防御力は発動してから次のスキルを発動するまでの間、有効です。
待ち時間は、スキルの性能が上がるにつれて増えていきます。
キャラクターには3つのステータス、HP、物理力、魔法力があります。
HPは打たれ強さを、物理力は物理スキルの強さ、魔法力は魔法スキルの強さに影響します。
物理力、魔法力が低くても、強いスキルを作ることはできますが、その分待ち時間が大幅に増えてしまいます。
使いたいスキルに合わせたステータスにすると良いでしょう。
キャラ作成ページ下部の大きい枠に、キャラに実行させるスクリプトを書きます。
ここでは最低限必要な文法を紹介します。
スキル実行
使いたいスキル名が「パンチ」だとすると、
act("パンチ");
と入力することで、スキルを宣言することができます。
スキルを宣言すると自動的にスクリプトを読むのは終了され、次にスクリプトを参照するのは次のスキル宣言時になります。
スキル名を""で囲うのを忘れると、うまくいかないので注意してください。
また、最後のセミコロン( ; )は、「ここで一つの命令を書き終えますよ」という日本語の句読点のようなものです。
今後も一つの命令の最後には必ずセミコロンをつけてください。
if文による条件分岐
スキルを実行できれば、とりあえずキャラを動かすことができますが、
状況に応じてスキルを使い分けなければ、あっさり他のキャラに負けてしまいます。
そこで、if文です。例えば、敵のHPはE_HPという変数に保存されています。
これを利用すると、
if(E_HP > 50){
act("パンチ");
}
else {
act("キック");
}
このように書くことができます。
これは、相手のHPが50より大きければ、「パンチ」を実行し、そうでなければ「キック」を実行するというスクリプトです。
このif文を使って、相手や自分のステータスによって使うスキルを使い分ける、というのが基本的なスクリプトの書き方です。
逆に言えば、if文さえ使えればかなり強いキャラも作れるようになります。
敵のHP以外にも参照できる変数はたくさんあるので、以下のリンク先で紹介しています。
参照できる変数など一覧 最後に、if文の書き方をいくつか紹介します。
#のあとは改行するまでコメントになりスクリプトとして扱われません。
if(E_HP > 50) act("パンチ") #一行にまとめられる、{}が不要
if(E_HP > 40 && E_HP
< 50) act( "キック") #敵のHPが40より大きい、かつ50未満ならパンチ
if(E_HP > 40 || E_HP
< 10) act( "フレイム") #敵のHPが40より大きい、または10未満ならキック
if(E_HP == 40) act("頭突き") #敵のHPが40なら頭突き、等しい時は==となるのに注意
変数/関数 |
意味 |
NOW |
今の経過時間 |
E_HP |
今の敵のHP |
E_ATK |
今の敵の攻撃力 |
E_DEF |
今の敵の防御力 |
E_TYE |
敵が最後に使ったスキルの属性 (0:物理,1:魔法,2:カウンター) |
E_N |
敵が最後に使ったスキルのスキル番号(1~4) |
E_NOW |
敵が最後にスキルを発動した時間 |
E_MAXHP |
勝負前の敵のHP |
E_PHY |
敵の物理力 |
E_MAG |
敵の魔法力 |
E_ATK_n |
攻撃力がn番目のスキルの攻撃力 |
E_DEF_n |
防御力がn番目のスキルの防御力 |
E_WAI_n |
待ち時間がn番目のスキルの待ち時間 |
E_ATK_n_S |
攻撃力がn番目のスキルのスキル番号(1~4) |
E_DEF_n_S |
防御力がn番目のスキルのスキル番号(1~4) |
E_WAI_n_S |
待ち時間がn番目のスキルのスキル番号(1~4) |
E_NUM(n,ATK) |
スキル番号(1~4)がnのスキルの攻撃力 |
E_NUM(n,DEF) |
スキル番号(1~4)がnのスキルの防御力 |
E_NUM(n,WAI) |
スキル番号(1~4)がnのスキルの待ち時間 |
E_NUM(n,TYE) |
スキル番号(1~4)がnのスキルの属性 |
M_HP |
自分の今のHP |
M_ATK |
自分の今の攻撃力 |
M_DEF |
自分の今の防御力 |
M_TYE |
自分が最後に使ったスキルの属性 (0:物理,1:魔法,2:カウンター) |
M_N |
自分が最後に使ったスキルのスキル番号(1~4) |
M_NOW |
自分が最後にスキルを発動した時間 |
M_ATK_n |
自分の攻撃力がn番目のスキルの攻撃力 |
M_DEF_n |
自分の防御力がn番目のスキルの防御力 |
M_WAI_n |
自分の待ち時間がn番目のスキルの待ち時間 |
M_ATK_n_S |
自分の攻撃力がn番目のスキルのスキル番号(1~4) |
M_DEF_n_S |
自分の防御力がn番目のスキルのスキル番号(1~4) |
M_WAI_n_S |
自分の待ち時間がn番目のスキルのスキル番号(1~4) |
M_NUM(n,ATK) |
自分のスキル番号(1~4)がnのスキルの攻撃力 |
M_NUM(n,DEF) |
自分のスキル番号(1~4)がnのスキルの防御力 |
M_NUM(n,WAI) |
自分のスキル番号(1~4)がnのスキルの待ち時間 |
M_NUM(n,TYE) |
自分のスキル番号(1~4)がnのスキルの属性 |
基本編で紹介しなかったひょっとしたら使うかもしれない文法を紹介します。
なお、基本的なfor文やwhile文もC++やJavaと同様に使えますが、使いどころが少ないので紹介はしません。
また、i++;でi+=1;を表したり、小数を扱えないので注意してください。
具体的な使い方は、実践編を見てください。
変数
あらかじめ設定されている変数(E_HPなど)がありますが、自分で変数を新たに作ることができます。
int a;
eternal int b;
とすることで、変数を定義することができます。
上の方は、スクリプトの読み込みが終了すると消えてしまい、次にスクリプトが読まれるときに新しく定義される変数です。
一方で下の方は、スクリプトの読み込みが終了しても値が受け継がれる変数です。
int a = 0;
eternal int b = 0;
a = a + 1;
b = b + 1;
例えば、このスクリプトを一回実行すると、aもbも1が入っていますが、二回実行するとaには1が、bには2が入ります。
関数
少々面倒な概念なのですが、関数というのはあらかじめ処理を書いておき、好きな時に実行することができる、
という便利なものです。
int a = 0;
function add( ){
a = a + 1;
}
add( );
add( );
add( );
これで、aには3が入ることになります。
配列
これは変数の一種なのですが、[ ]の中の数字によって複数の変数を管理できます。
int[] ary1 = int[]{1, 2, 3};
int a = len(ary1);
append(ary1, 10);
int b = ary1[2];
delete(ary1, 0);
一行目で配列を定義しています。{ }の中の数字はあらかじめ決められますし、入れなくても定義できます。
len()は配列の要素数を返す関数なので、aには3が入ります。
append()は配列の最後に要素を付け足す関数なので、3行目でaryの4要素目に10を加えます。
ary[2]は、aryの2+1番目の要素です。この場合は3を取り出します。
delete()は、配列の0+1番目の要素を削除され、消した分の要素は、詰められます。
今回は、1番目の要素に元の2番目の要素が入り、2番目の要素は元の3番目の要素が入ります。
強そうな攻撃をガードする(初心者向け)
if(NOW-E_NOW > E_WAI_2){
#ここで一番防御が高い物理属性のスキルを実行する
}
防御で防がれない攻撃(初心者向け)
int machi;#相手の強いスキルの待ち時間
#20は硬いかのてきとーな基準
if(E_DEF_1 > 20){
machi=E_NUM(E_DEF_1_S,WAI);
}
#「相手が行動してない時間が、相手の防御力が一番高いスキルの待ちターンより長い」かつ、
#「相手がカウンターを発動してない」かつ「相手の今の防御力が20以下」
if(NOW-E_NOW > machi && E_TYE != 2 && E_DEF
<20){
#ここで攻撃
}
カウンターを上手く当てる(中級者向け)
eternal int check1 = 10;
eternal int check2 = 10;
if(check1 != check2){
check1 = 10;
check2 = 10;
}
#過去二回の相手が物理を使う前に自分が使った属性と、最後に使った属性が一致したら
if(check1 == check2 && M_TYE == check1){
#ここで物理を跳ね返すカウンター属性のスキルを実行する
}
#check1に値が入っていて、相手が物理攻撃を使ったら
if (E_TYE == 0 && check1 != 10 && check2 == 10){
check2 = M_TYE; #自分が直前に使ったスキルの属性を記録
}
#相手が物理攻撃を使って、check1に値が入っていなければ
if (E_TYE == 0 && check1 == 10){
check1 = M_TYE; #自分が直前に使ったスキルの属性を記録
}
DPS(ダメージ/秒)を計算する(中級者向け)
#自分のスキルidを入れるとdpsを計算する関数
int dps(int a){
if(M_NUM(a,TYE) ==0 && E_TYE == 1){
return (M_NUM(a,ATK)*2/3 - E_DEF)/M_NUM(a,WAI);
}
else if(M_NUM(a,TYE) ==0 && E_TYE == 2){
return 0;
}
else {
return (M_NUM(a,ATK) - E_DEF)/M_NUM(a,WAI);
}
}
倒せる場合に必ず倒す(中級者向け)
#1~3番目のスキルがカウンターでなくて、4番目がカウンターの時
if(M_NUM(M_WAI_1_S,ATK)-E_DEF_1 > E_HP){
act("スキル番号1のスキル名");
}
else if(M_NUM(M_WAI_2_S,ATK)-E_DEF_2 > E_HP){
act("スキル番号2のスキル名");
}
else if(M_NUM(M_WAI_3_S,ATK)-E_DEF_3 > E_HP){
act("スキル番号3のスキル名");
}
次に来る可能性のあるスキルを集計(上級者向け)
int Buturi = 0;
int Mahou = 0;
int Counter = 0;
for(int i = 1;i
<=4 ;i+=1){
if(NOW - E_NOW
<=E_NUM(i,WAI)){
if(E_NUM(i,TYE)==0) Buturi=Buturi+1;
else if(E_NUM(i,TYE)==1) Mahou=Mahou+1;
else if(E_NUM(i,TYE)==2) Counter=Counter+1;
}
}