JavaScript Maniax
■RPGの戦闘シーンをつくる その2
多彩な攻撃パターンを再現。
前回の講義で作成したプログラムでは単純な殴り合い、しかも敵の方が圧倒的に強いということで欲求不満なサンプルを提示したところで終わってしまいました。
そこで貧弱な勇者氏には呪文を使えるようにしてあげましょう。
呪文に関しても基本的には攻撃と変わりありません。
引数として攻撃側や防御側のオブジェクトを渡し、ダメージなどを計算する関数をつくってやればよいのです。
//--sample--
function gira(at, df){
var p,m,r;
r=true;
m=at.name+"は攻撃呪文を唱えた⇒";
if(at.mp<1){
m+="しかし魔力がたりない!";
}else{
at.mp--;
//影響力計算
p=Math.floor(Math.random()*4)+8;
//メッセージ作成
if(p>0){
m+=df.name+"に"+p+"ポイントのダメージを与えた。";
df.hp-=p;
if(df.hp<1){
//戦闘終了
m+="<BR><FONT color=\"red\">"+at.name+"の勝利!(残り体力"+at.hp+")。</FONT>";
r=false;
}
}else{
m+=df.name+"には効かなかった!";
}
}
m+="<BR>";
document.all.t.innerHTML+=m;
return r;
}
//--sample--
関数名に関してはかるく流しておいて、内容は通常攻撃と対して変わらないことが判るかと思います。
ただ、キャラクタのプロパティに魔力を追加してあります。
//--sample--
function chara(a,b,c,d,e,f){
this.hp=a; //体力
this.mhp=a; //最大体力
this.mp=b; //魔力
this.sp=c; //速さ
this.at=d; //攻撃力
this.df=e; //防御力
this.name=f; //名前
}
//--sample--
オブジェクトを実装するときに引数が増えたことを忘れないよう気をつけてください。
//--sample--
mych=new chara(val[0],val[1],val[2],val[3],val[4],"勇者");
enmy=new chara(50,50,20,40,40,"魔王");
//--sample--
回復魔法を作成することも考え、体力プロパティの初期値を最大体力というプロパティにも登録しました。
体力を回復しても、この最大値を超えないようにする為です。
回復魔法の関数も同じように簡単に作ることが出来ます。
//--sample--
function hoimi(at){
var p,m;
m=at.name+"は回復呪文を唱えた⇒";
if(at.mp<1){
m+="しかし魔力がたりない!";
}else{
at.mp--;
//影響力計算
p=Math.floor(Math.random()*8)+16;
//メッセージ作成
if(p>0){
if(p>(at.mhp-at.hp))p=at.mhp-at.hp;
m+=at.name+"の体力が"+p+"ポイントの回復した。";
at.hp+=p;
}else{
m+="呪文は失敗した!";
}
}
m+="<BR>";
document.all.t.innerHTML+=m;
return true;
}
//--sample--
回復時は防御キャラはいませんから、引数は呪文を唱えるほうのキャラクタオブジェクトだけで良いのが判るかと思います。
あとは、攻撃、攻撃魔法、回復魔法のどの関数を呼ぶかを決めればよいのです。
ゆくゆくは画面から入力した値にしたがって行動させるようにしようと思いますが、まずはランダムに関数を呼んでみます。
//--sample--
switch(Math.floor(Math.random()*10)){
case 0:case 1:case 2:case 3:case 4:case 5:flg=attack(mych, enmy);break;
case 6:case 7:flg=gira(mych, enmy);break;
default:flg=hoimi(mych);break;}
//--sample--
敵も「魔王」を名乗るわりにはタコ殴り魔王なので、攻撃魔法を使うようにしてみました。
こちらもゆくゆくは勇者の残り体力をみて攻撃パターンを変える様なプログラムにしてゆきたいと思います。
//--sample--
switch(Math.floor(Math.random()*10)){
case 0:case 1:case 2:case 3:case 4:case 5:flg=attack(enmy, mych);break;
default:flg=gira(enmy, mych);break;}
//--sample--
これで勇者も敵も魔法を使う、手に汗握る激戦(言いすぎ)が繰り広げられるようになりました。
[