以前、インターネット上の動画を参考にして、
HSPで製作した自作RPGゲームを
JavaScriptとjQueryで書き直してみることにした。
ジャンル的には、シミュレーションRPGに近いと思われる。
他サイトへの無断転載及び、外部サイトから
このページへの直接リンクをすることは、禁止する。
ソースコードは残っているものの、かなり前のもので、
何を作ったか記憶が曖昧なので、解析する必要がある。
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html lang="ja"> <head> <meta name="robots" content="noindex,nofollow"> <meta http-equiv="content-type" content="text/html;charset=utf-8"> <title>JavaScriptによるRPG制作・第24講</title> <script language="JavaScript" type="text/javascript" src="jquery.js"></script> <script language="JavaScript" type="text/javascript" src="jsrpg024.js"></script> </head> <body bgcolor="#c0c0c0"> <center> <h1>JavaScriptによるRPG制作・第24講</h1> <form> <table border="0" frame="void" rules="none" background="lattice.png"> <tr> <td align="center"><span id="stage">ステージ:1</span></td> <td align="center"><span id="HPenemy1">敵1HP:10</span></td> <td align="center">敵1属性:<span id="TypeEnemy1" style="color:#000000;">???</span></td> <td align="center"><span>通常攻撃:</span></td> <td align="center"><span> <input type="button" value="13ダメージを与え、13充電する" style="background-color:#808080;width:250px;" onclick="thirteen()"> </span></td> </tr> <tr> <td align="center"><span id="target">攻撃対象:敵1</span></td> <td align="center"><span id="HPenemy2">敵2HP:10</span></td> <td align="center">敵2属性:<span id="TypeEnemy2" style="color:#000000;">???</span></td> <td align="center"><span> <input type="button" value="2ダメージを与え、2充電する" style="background-color:#808080;width:250px;" onclick="two()"> </span></td> <td align="center"><span> <input type="button" value="17ダメージを与え、17充電する" style="background-color:#808080;width:250px;" onclick="seventeen()"> </span></td> </tr> <tr> <td align="center"><span id="HPplayer">HP:10</span></td> <td align="center">属性:<span id="TypePlayer" style="color:#000000;">???</span></td> <td align="center"><span id="ATKplayer">全蓄積エネルギー:0</span></td> <td align="center"><span> <input type="button" value="3ダメージを与え、3充電する" style="background-color:#808080;width:250px;" onclick="three()"> </span></td> <td align="center"><span> <input type="button" value="19ダメージを与え、19充電する" style="background-color:#808080;width:250px;" onclick="nineteen()"> </span></td> </tr> <tr> <td align="center" colspan="3"> <span id="poison" style="color:#800080;"> </span> </td> <td align="center"><span> <input type="button" value="5ダメージを与え、5充電する" style="background-color:#808080;width:250px;" onclick="five()"> </span></td> <td align="center"><span> <input type="button" value="23ダメージを与え、23充電する" style="background-color:#808080;width:250px;" onclick="twentythree()"> </span></td> </tr> <tr> <td align="center" colspan="3"> <span id="barrier" style="color:#008000;"> </span> </td> <td align="center"><span> <input type="button" value="7ダメージを与え、7充電する" style="background-color:#808080;width:250px;" onclick="seven()"> </span></td> <td align="center"><span> <input type="button" value="29ダメージを与え、29充電する" style="background-color:#808080;width:250px;" onclick="twentynine()"> </span></td> </tr> <tr> <td align="center" colspan="3"><span id="message1"> </span></td> <td align="center"><span> <input type="button" value="11ダメージを与え、11充電する" style="background-color:#808080;width:250px;" onclick="eleven()"> </span></td> <td align="center"><span> <input type="button" value="31ダメージを与え、31充電する" style="background-color:#808080;width:250px;" onclick="thirtyone()"> </span></td> </tr> <tr> <td align="center" colspan="3"><span id="message2"> </span></td> <td align="center" colspan="2"><span> <hr> </span></td> </tr> <tr> <td align="center" colspan="3"><span id="message3"> </span></td> <td align="center"><span>特殊攻撃:</span></td> <td align="center"><span> <input type="button" value="ダメージを半減させる結界を発動する" style="background-color:#008000;width:250px;" onclick="special4()"> </span></td> </tr> <tr> <td align="center" colspan="3"><span id="message4"> </span></td> <td align="center"><span> <input type="button" value="全蓄積エネルギーを放電する" style="background-color:#000000;color:#ffff00;width:250px;" onclick="special1()"> </span></td> <td align="center"><span> <input type="button" value="ランダムダメージを与える" style="background-color:#ffff00;width:250px;" onclick="special5()"> </span></td> </tr> <tr> <td align="center" colspan="3"><span id="message5"> </span></td> <td align="center"><span> <input type="button" value="エネルギーを使って回復する" style="background-color:#000000;color:#ff0000;width:250px;" onclick="special2()"> </span></td> <td align="center"><span> <input type="button" value="プレイヤーの属性を変更する" style="background-color:#808080;width:250px;" onclick="special6()"> </span></td> </tr> <tr> <td align="center" colspan="3"><span id="message6"> </span></td> <td align="center"><span> <input type="button" value="敵に毒を与え、毒状態にする" style="background-color:#800080;width:250px;" onclick="special3()"> </span></td> <td align="center"><span> <input type="button" value="攻撃対象を変更する(ターン消費なし)" style="background-color:#808080;width:250px;" onclick="special7()"> </span></td> </tr> <tr> <td align="center" colspan="3"><span id="winlose" style="color:#000000;"> </span></td> <td align="center" colspan="2"><span> <hr> </span></td> </tr> <tr> <td align="center" colspan="3"><span id="ending"> </span></td> <td align="center"><span>メニュー:</span></td> <td align="center"><span> <input type="button" value="最初から始める" style="background-color:#808080;width:250px;" onclick="GameStart()"> </span></td> </tr> <tr> <td align="center" colspan="3"><span id="score"> </span></td> <td align="center"><span> <input type="button" value="次のステージへ/メッセージクリア" style="background-color:#808080;width:250px;" onclick="NextStage()"> </span></td> <td align="center"><span> <input type="button" value="強くてニューゲーム" style="background-color:#808080;width:250px;" onclick="NewGameStart()"> </span></td> </tr> <tr> <td align="center" colspan="3"><span id="next"> </span></td> <td align="center"><span> </span></td> <td align="center"><span> </span></td> </tr> </table> </form> </center> </body> </html> |
var HPenemy1 = 10; // 敵1の初期HP var HPenemy2 = 10; // 敵2の初期HP var HPplayer = 10; var ATKenemy = 0; // 敵の攻撃力を初期化 var ATKplayer = 0; // プレイヤーの攻撃力を初期化 var stage = 1; // ステージ数 var power; // 技の威力 var PoisonCounter = 0; // ポイズンカウンター var BarrierCounter = 0; // バリアカウンター var RandomDamage; // ランダムダメージの数値を格納する変数を宣言 var RandomMax; // ステージ数との積がランダムダメージの上限 var TypeName = new Array("Feuer", "Eis", "Donner"); // 属性名称(0:Feuer, 1:Eis, 2:Donner) var TypeColor = new Array("#ff0000", "#0000ff", "#008000"); // 属性の色(0:赤, 1:青, 2:緑) var TypeBackGroundColor = new Array("#ff00ff", "#00ffff", "#00ff00"); // 属性の色(0:マゼンタ, 1:シアン, 2:ライム) var TypeEnemy1; // 敵1の属性 var TypeEnemy2; // 敵2の属性 var TypePlayer; // プレイヤーの属性 var TypeChange; // 属性変更用の乱数 var TypeEffect; // 属性による補正効果用の乱数 var TypeEffectATK; // 攻撃時の属性による補正効果 var TypeEffectDEF; // 防御時の属性による補正効果 var target = 1; // 通常攻撃の対象(初期状態では敵1) window.onload = function() { TypeChangeEnemy(); TypeChangePlayer(); } function ATKcalc(HPenemy, TypeEnemy){ // 敵の攻撃力を計算する関数(HPenemy, TypeEnemyは仮引数) ATKenemy = 0; // 敵の攻撃力を初期化 if (HPenemy % 2 == 0) { ATKenemy += 2; } // 敵のHPが2の倍数の時、敵の攻撃力が2上昇する。 if (HPenemy % 3 == 0) { ATKenemy += 3; } // 敵のHPが3の倍数の時、敵の攻撃力が3上昇する。 if (stage >= 3 && HPenemy % 5 == 0) { ATKenemy += 5; } // ステージ3以降、敵のHPが5の倍数の時、敵の攻撃力が5上昇する。 if (stage >= 5 && HPenemy % 7 == 0) { ATKenemy += 7; } // ステージ5以降、敵のHPが7の倍数の時、敵の攻撃力が7上昇する。 if (stage >= 50 && HPenemy % 11 == 0) { ATKenemy += 11; } // 中ボス戦及び、最終ボス戦の時、敵のHPが11の倍数の時、敵の攻撃力が11上昇する。 if (stage >= 50 && HPenemy % 13 == 0) { ATKenemy += 13; } // 中ボス戦及び、最終ボス戦の時、敵のHPが13の倍数の時、敵の攻撃力が13上昇する。 if (stage >= 50 && HPenemy % 17 == 0) { ATKenemy += 17; } // 中ボス戦及び、最終ボス戦の時、敵のHPが17の倍数の時、敵の攻撃力が17上昇する。 if (stage >= 50 && HPenemy % 19 == 0) { ATKenemy += 19; } // 中ボス戦及び、最終ボス戦の時、敵のHPが19の倍数の時、敵の攻撃力が19上昇する。 if (stage >= 100 && HPenemy % 23 == 0) { ATKenemy += 23; } // 最終ボス戦時のみ、敵のHPが23の倍数の時、敵の攻撃力が23上昇する。 if (stage >= 100 && HPenemy % 29 == 0) { ATKenemy += 29; } // 最終ボス戦時のみ、敵のHPが29の倍数の時、敵の攻撃力が29上昇する。 if (stage >= 100 && HPenemy % 31 == 0) { ATKenemy += 31; } // 最終ボス戦時のみ、敵のHPが31の倍数の時、敵の攻撃力が31上昇する。 TypeEffect = (TypeEnemy + 3 - TypePlayer) % 3; switch(TypeEffect){ case 0 : TypeEffectDEF = 1; break; case 1 : TypeEffectDEF = 2; break; case 2 : TypeEffectDEF = 0.5; break; default : break; } ATKenemy = parseInt(ATKenemy * TypeEffectDEF); } function BarrierState(){ // 結界を表示する関数 if (BarrierCounter > 0) { $("#barrier").text("結界が発動中(あと " + BarrierCounter + " ターン)"); // バリアカウンターが0以外のとき、結界が発動中であることを表示する。 } else { $("#barrier").text(""); } } function NextStage(){ // 勝利後のイベント処理をする関数 if (HPenemy1 <= 0 && HPenemy2 <= 0) { // 敵1と敵2のHPが共に0以下ならば、勝利。 $("#winlose").text(""); $("#next").text(""); ATKplayer = 0; // プレイヤーの攻撃力を初期化 $("#ATKplayer").text("全蓄積エネルギー:" + ATKplayer); // 現在の全蓄積エネルギー PoisonCounter = 0; // ポイズンカウンターを0にする BarrierCounter = 0; // バリアカウンターを0にする if (stage < 5 || (stage > 5 && stage < 10)) { stage += 1; // 次のステージへ HPenemy1 = stage * 10; // 次のステージの敵1のHP HPenemy2 = stage * 10; // 次のステージの敵2のHP HPplayer += stage * 10; // HPを加算 $("#stage").text("ステージ:" + stage); $("#HPenemy1").text("敵1HP:" + HPenemy1); // 次のステージの敵1のHP $("#HPenemy2").text("敵2HP:" + HPenemy2); // 次のステージの敵2のHP $("#HPplayer").text("HP:" + HPplayer); TypeChangeEnemy(); // 次のステージへ行く場合は、敵のみ属性を変更。 } else if (stage == 5) { stage = 50; // 中ボス戦のステージへ HPenemy1 = 500; // 中ボスのHP HPenemy2 = 0; // 中ボス戦のステージでは、敵は中ボス1体のみ。 $("#stage").text("中ボス戦"); $("#HPenemy1").text("敵1HP:" + HPenemy1); TypeChangeEnemy(); // 次のステージへ行く場合は、敵のみ属性を変更。 } else if (stage == 10) { stage = 100; // 最終ボス戦のステージへ HPenemy1 = 1000; // 最終ボスのHP HPenemy2 = 0; // 最終ボス戦のステージでは、敵は最終ボス1体のみ。 $("#stage").text("最終ボス戦"); $("#HPenemy1").text("敵1HP:" + HPenemy1); TypeChangeEnemy(); // 次のステージへ行く場合は、敵のみ属性を変更。 } else if (stage == 50) { stage = 6; // 中ボスを倒した後は、ステージ6へ HPenemy1 = stage * 10; // 次のステージの敵1のHP HPenemy2 = stage * 10; // 次のステージの敵2のHP HPplayer += stage * 10; // HPを加算 $("#stage").text("ステージ:" + stage); $("#HPenemy1").text("敵1HP:" + HPenemy1); // 次のステージの敵1のHP $("#HPenemy2").text("敵2HP:" + HPenemy2); // 次のステージの敵2のHP $("#HPplayer").text("HP:" + HPplayer); TypeChangeEnemy(); // 次のステージへ行く場合は、敵のみ属性を変更。 } else { $("#ending").text("祝!ゲームクリア"); $("#score").text("スコア:" + HPplayer); // エンディング $("#next").text("「最初から始める」? or 「強くてニューゲーム」?"); } } TurnStart(); $("#winlose").css("color","#000000"); // 色を黒に戻す } function PoisonState(){ // 毒状態を表示する関数 if (PoisonCounter > 0) { $("#poison").text("敵は、毒状態(あと " + PoisonCounter + " ターン)"); // ポイズンカウンターが0以外のとき、敵のHPが残っていれば、毒状態であることを表示する。 } else { $("#poison").text(""); } } function TurnStart(){ // ターン開始時の処理をする関数 $("#message1").text(""); $("#message2").text(""); $("#message3").text(""); $("#message4").text(""); $("#message5").text(""); $("#message6").text(""); if (BarrierCounter > 0 || PoisonCounter > 0) { if (BarrierCounter > PoisonCounter){ document.bgColor = "#008000"; // 背景を緑色にする } else { document.bgColor = "#800080"; // 背景を紫色にする } } else { document.bgColor = "#c0c0c0"; // 背景を銀色に戻す } PoisonState(); BarrierState(); } // メイン関数 function main(){ if (HPenemy1 <= 0 && HPenemy2 <= 0) { // 敵1と敵2のHPが共に0以下ならば、勝利。 $("#HPenemy1").text("敵HP1:0"); // 敵1のHP表示を0にする。 $("#HPenemy2").text("敵HP2:0"); // 敵2のHP表示を0にする。 $("#winlose").css("color","#ff0000"); // 勝利メッセージの色を赤にする $("#winlose").text("You win!"); // 勝利メッセージ $("#next").text("「次のステージへ」ボタンを押してください。"); } else { if (HPenemy1 > 0) { ATKcalc(HPenemy1, TypeEnemy1); if (BarrierCounter > 0) { ATKenemy = parseInt( ATKenemy / 2 ); // 敵の攻撃力を半減させる。 // JavaScriptでは、自動で実数化されてしまうので、整数化する。 } HPplayer -= ATKenemy; // 敵の攻撃によるダメージを受ける。 $("#HPplayer").text("HP:" + HPplayer); $("#message3").text("敵1の攻撃!プレイヤーは " + ATKenemy + " のダメージを受けた"); if (PoisonCounter > 0) { HPenemy1 -= ATKenemy; // ポイズンカウンターが0以外の場合は、敵1は毒によるダメージを受ける。 $("#HPenemy1").text("敵1HP:" + HPenemy1); $("#message4").text("敵1は毒により " + ATKenemy + " のダメージを受けた"); // 敵1が毒によるダメージを受けた場合のメッセージ } else { HPenemy1 += ATKenemy; // ポイズンカウンターが0の場合は敵1はその数値分HPを回復する。 $("#HPenemy1").text("敵1HP:" + HPenemy1); $("#message4").text("敵1はHPを " + ATKenemy + " 回復した"); // 敵1がHPを回復した場合のメッセージ } } else { target = 2; // 通常攻撃の対象を敵2に強制変更 $("#target").text("攻撃対象:敵2"); $("#HPenemy1").text("敵HP1:0"); // 敵1のHP表示を0にする。 $("#message3").text("敵1は斃れた。"); } if (HPenemy2 > 0) { ATKcalc(HPenemy2, TypeEnemy2); if (BarrierCounter > 0) { ATKenemy = parseInt( ATKenemy / 2 ); // 敵の攻撃力を半減させる。 // JavaScriptでは、自動で実数化されてしまうので、整数化する。 } HPplayer -= ATKenemy; // 敵の攻撃によるダメージを受ける。 $("#HPplayer").text("HP:" + HPplayer); $("#message5").text("敵2の攻撃!プレイヤーは " + ATKenemy + " のダメージを受けた"); if (PoisonCounter > 0) { HPenemy2 -= ATKenemy; // ポイズンカウンターが0以外の場合は、敵1は毒によるダメージを受ける。 $("#HPenemy2").text("敵2HP:" + HPenemy2); $("#message6").text("敵2は毒により " + ATKenemy + " のダメージを受けた"); // 敵1が毒によるダメージを受けた場合のメッセージ } else { HPenemy2 += ATKenemy; // ポイズンカウンターが0の場合は敵1はその数値分HPを回復する。 $("#HPenemy2").text("敵2HP:" + HPenemy2); $("#message6").text("敵2はHPを " + ATKenemy + " 回復した"); // 敵1がHPを回復した場合のメッセージ } } else { target = 1; // 通常攻撃の対象を敵1に強制変更 $("#target").text("攻撃対象:敵1"); $("#HPenemy2").text("敵HP2:0"); // 敵2のHP表示を0にする。 $("#message5").text("敵2は斃れた。"); } if (BarrierCounter > 0) { BarrierCounter -= 1; // バリアカウンターを1減らす } if (PoisonCounter > 0) { PoisonCounter -= 1; // ポイズンカウンターを1減らす } if (HPenemy1 <= 0) { target = 2; // 通常攻撃の対象を敵2に強制変更 $("#target").text("攻撃対象:敵2"); $("#HPenemy1").text("敵HP1:0"); // 敵1のHP表示を0にする。 $("#message3").text("敵1は斃れた。"); } // 敵1が毒のダメージで力尽きた場合の処理 if (HPenemy2 <= 0) { target = 1; // 通常攻撃の対象を敵1に強制変更 $("#target").text("攻撃対象:敵1"); $("#HPenemy2").text("敵HP2:0"); // 敵2のHP表示を0にする。 $("#message5").text("敵2は斃れた。"); } // 敵2が毒のダメージで力尽きた場合の処理 if (HPenemy1 <= 0 && HPenemy2 <= 0) { // 敵1と敵2のHPが共に0以下ならば、勝利。 $("#winlose").css("color","#800080"); // 勝利メッセージの色を紫にする $("#winlose").text("You win!"); // 勝利メッセージ $("#next").text("「次のステージへ」ボタンを押してください。"); } // 敵が毒のダメージで力尽きた場合にも、 // 戦闘を継続させずに、次のステージへ行く為の処理 if (HPplayer <= 0) { // プレイヤーのHPが0以下ならば、敗北。 $("#HPplayer").text("HP:0"); $("#winlose").css("color","#0000ff"); // 敗北メッセージの色を青にする $("#winlose").text("You lose!"); // 敗北メッセージ $("#next").text("もう一回?(Yes→「最初から始める」)"); } } } // 通常攻撃(コア) function NormalAttack(power){ if (HPplayer > 0 && (HPenemy1 > 0 || HPenemy2 > 0) && stage <= 100){ // プレイヤーと敵1と敵2のHPが全て正、かつステージ100以下の場合 TurnStart(); if(target == 1) { TypeEffect = (TypePlayer + 3 - TypeEnemy1) % 3; switch(TypeEffect){ case 0 : TypeEffectATK = 1; break; case 1 : TypeEffectATK = 2; break; case 2 : TypeEffectATK = 0.5; break; default : break; } power = parseInt(power * TypeEffectATK); HPenemy1 -= power; // 技の威力だけダメ―ジを与え、 ATKplayer += power; // その数値分充電する。 $("#HPenemy1").text("敵1HP:" + HPenemy1); $("#ATKplayer").text("全蓄積エネルギー:" + ATKplayer); $("#message1").text("敵1に " + power + " のダメージを与えた"); $("#message2").text("エネルギーを " + power + " 充電した"); } else { TypeEffect = (TypePlayer + 3 - TypeEnemy2) % 3; switch(TypeEffect){ case 0 : TypeEffectATK = 1; break; case 1 : TypeEffectATK = 2; break; case 2 : TypeEffectATK = 0.5; break; default : break; } power = parseInt(power * TypeEffectATK); HPenemy2 -= power; // 技の威力だけダメ―ジを与え、 ATKplayer += power; // その数値分充電する。 $("#HPenemy2").text("敵2HP:" + HPenemy2); $("#ATKplayer").text("全蓄積エネルギー:" + ATKplayer); $("#message1").text("敵2に " + power + " のダメージを与えた"); $("#message2").text("エネルギーを " + power + " 充電した"); } main(); } } // 特殊攻撃(全体攻撃) function special1(){ if (HPplayer > 0 && (HPenemy1 > 0 || HPenemy2 > 0) && stage <= 100){ // プレイヤーと敵1と敵2のHPが全て正、かつステージ100以下の場合 if (ATKplayer > 0){ TurnStart(); document.bgColor = "#ffff00"; // 背景を黄色にする HPenemy1 -= ATKplayer; // 敵1へのダメージ HPenemy2 -= ATKplayer; // 敵2へのダメージ // 全蓄積エネルギーを放電する(全体攻撃) $("#HPenemy1").text("敵1HP:" + HPenemy1); // 敵1のHP表示 $("#HPenemy2").text("敵2HP:" + HPenemy2); // 敵2のHP表示 $("#ATKplayer").text("全蓄積エネルギー:" + 0); $("#message1").text("蓄積されていた全エネルギーを放電した"); $("#message2").text("敵全体に " + ATKplayer + " のダメージを与えた"); ATKplayer = 0; // プレイヤーの攻撃力を初期化 main(); } else { alert("エネルギーがないと発動できません。"); } } } function special2(){ if (HPplayer > 0 && (HPenemy1 > 0 || HPenemy2 > 0) && stage <= 100){ // プレイヤーと敵1と敵2のHPが全て正、かつステージ100以下の場合 if (ATKplayer > 0){ TurnStart(); document.bgColor = "#ff0000"; // 背景を赤にする HPplayer += ATKplayer; // エネルギーを使って回復する $("#HPplayer").text("HP:" + HPplayer); $("#ATKplayer").text("全蓄積エネルギー:" + 0); $("#message1").text("蓄積されていた全エネルギーを吸収した"); $("#message2").text("プレイヤーはHPを " + ATKplayer + " 回復した"); ATKplayer = 0; // プレイヤーの攻撃力を初期化 main(); } else { alert("エネルギーがないと発動できません。"); } } } function special3(){ if (HPplayer > 0 && (HPenemy1 > 0 || HPenemy2 > 0) && stage <= 100){ // プレイヤーと敵1と敵2のHPが全て正、かつステージ100以下の場合 TurnStart(); document.bgColor = "#800080"; // 背景を紫色にする PoisonCounter = stage + 1; // ポイズンカウンターにはステージ数+1を代入 $("#poison").text("敵は、毒状態(あと " + PoisonCounter + " ターン)"); $("#message1").text("敵全体を毒状態にした"); main(); } } function special4(){ if (HPplayer > 0 && (HPenemy1 > 0 || HPenemy2 > 0) && stage <= 100){ // プレイヤーと敵1と敵2のHPが全て正、かつステージ100以下の場合 TurnStart(); document.bgColor = "#008000"; // 背景を緑色にする BarrierCounter = stage + 1; // バリアカウンターにはステージ数+1を代入 $("#barrier").text("結界が発動中(あと " + BarrierCounter + " ターン)"); $("#message1").text("ダメージを半減させる結界を発動した"); main(); } } function special5(){ if (HPplayer > 0 && (HPenemy1 > 0 || HPenemy2 > 0) && stage <= 10){ // プレイヤーと敵1と敵2のHPが全て正、かつステージ10以下の場合 TurnStart(); document.bgColor = "#ffff00"; // 背景を黄色にする RandomMax = Math.floor(Math.random() * 11); // RandomMaxは、0から10の値をとる。 if (RandomMax > 0) { // RandomMaxが0以外の時、 RandomDamage = Math.floor(Math.random() * (RandomMax * stage + 1)); // ランダムダメージの威力を決定 HPenemy1 -= RandomDamage; // 敵1へのダメージ HPenemy2 -= RandomDamage; // 敵2へのダメージ $("#HPenemy1").text("敵1HP:" + HPenemy1); // 敵1のHP表示 $("#HPenemy2").text("敵2HP:" + HPenemy2); // 敵2のHP表示 $("#message1").text("ランダムダメージを与える攻撃!"); $("#message2").text("敵全体に " + RandomDamage + " のダメージを与えた"); // ランダムダメージの威力だけダメ―ジを与える(全体攻撃) } else { // RandomMaxが0の時、敵は攻撃を回避する(0での剰余算を避ける)。 $("#message1").text("ランダムダメージを与える攻撃!"); $("#message2").text("敵は攻撃を回避した。"); } main(); } else { alert("中ボス戦・最終ボス戦では、この技を選択することができません。"); } } function special6(){ if (HPplayer > 0 && (HPenemy1 > 0 || HPenemy2 > 0) && stage <= 100){ // プレイヤーと敵1と敵2のHPが全て正、かつステージ100以下の場合 TurnStart(); TypeChange = Math.floor(Math.random() * 2) + 1; // 1~2の変数 TypePlayer = (TypePlayer + TypeChange) % 3; // 属性を変更する document.bgColor = TypeBackGroundColor[TypePlayer]; // 背景を属性の色にする $("#TypePlayer").css("color", TypeColor[TypePlayer]); $("#TypePlayer").text(TypeName[TypePlayer]); $("#message1").text("属性を" + TypeName[TypePlayer] + "に変更した。"); main(); } } function special7(){ if (HPplayer > 0 && (HPenemy1 > 0 || HPenemy2 > 0) && stage <= 10){ // プレイヤーと敵1と敵2のHPが全て正、かつステージ10以下の場合 TurnStart(); if(target == 1) { if(HPenemy2 > 0){ target = 2; $("#target").text("攻撃対象:敵2"); $("#message1").text("通常攻撃の対象を敵2に変更した。"); } else { alert("敵2は既に斃されています。"); } } else { if(HPenemy1 > 0){ target = 1; $("#target").text("攻撃対象:敵1"); $("#message1").text("通常攻撃の対象を敵1に変更した。"); } else { alert("敵1は既に斃されています。"); } } } else { alert("中ボス戦・最終ボス戦では、この技を選択することができません。"); } } // 通常攻撃 function two() { NormalAttack(2); } function three() { NormalAttack(3); } function five(){ if (stage >= 3) { NormalAttack(5); } else { alert("ステージ数3未満では、この技を選択することができません。"); } } function seven(){ if (stage >= 5){ NormalAttack(7); } else { alert("ステージ数5未満では、この技を選択することができません。"); } } function eleven(){ if (stage >= 50){ NormalAttack(11); } else { alert("中ボス戦・最終ボス戦以外では、この技を選択することができません。"); } } function thirteen(){ if (stage >= 50){ NormalAttack(13); } else { alert("中ボス戦・最終ボス戦以外では、この技を選択することができません。"); } } function seventeen(){ if (stage >= 50){ NormalAttack(17); } else { alert("中ボス戦・最終ボス戦以外では、この技を選択することができません。"); } } function nineteen(){ if (stage >= 50){ NormalAttack(19); } else { alert("中ボス戦・最終ボス戦以外では、この技を選択することができません。"); } } function twentythree(){ if (stage >= 100){ NormalAttack(23); } else { alert("最終ボス戦以外では、この技を選択することができません。"); } } function twentynine(){ if (stage >= 100){ NormalAttack(29); } else { alert("最終ボス戦以外では、この技を選択することができません。"); } } function thirtyone(){ if (stage >= 100){ NormalAttack(31); } else { alert("最終ボス戦以外では、この技を選択することができません。"); } } // 最初から始める function GameStart(){ if ((HPplayer <= 0) || (stage == 100 && HPenemy1 <= 0)){ // ゲームオーバー時または、全てのステージクリア後にのみ、選択可能。 $("#winlose").text(""); ATKplayer = 0; // プレイヤーの攻撃力を初期化 $("#ATKplayer").text("全蓄積エネルギー:" + ATKplayer); // 現在の全蓄積エネルギー PoisonCounter = 0; // ポイズンカウンターを0にする BarrierCounter = 0; // バリアカウンターを0にする HPenemy1 = 10; // 【変更】敵1の初期HP HPenemy2 = 10; // 【変更】敵2の初期HP $("#HPenemy1").text("敵1HP:" + HPenemy1); // 【変更】敵1のHP表示 $("#HPenemy2").text("敵2HP:" + HPenemy2); // 【変更】敵2のHP表示 HPplayer = 10; // プレイヤーの初期HPへ stage = 1; // ステージ1へ $("#HPplayer").text("HP:" + HPplayer); $("#stage").text("ステージ:" + stage); TypeChangeEnemy(); TypeChangePlayer(); } else { alert("ゲームオーバー時または、全てのステージクリア後にのみ、選択可能。"); } TurnStart(); $("#winlose").css("color","#000000"); // 色を黒に戻す $("#ending").text(""); $("#score").text(""); $("#next").text(""); } // 強くてニューゲーム function NewGameStart(){ if (stage == 100 && HPenemy1 <= 0){ // 全てのステージクリア後にのみ、選択可能。 $("#winlose").text(""); ATKplayer = 0; // プレイヤーの攻撃力を初期化 $("#ATKplayer").text("全蓄積エネルギー:" + ATKplayer); // 現在の全蓄積エネルギー PoisonCounter = 0; // ポイズンカウンターを0にする BarrierCounter = 0; // バリアカウンターを0にする HPenemy1 = 10; // 【変更】敵1の初期HP HPenemy2 = 10; // 【変更】敵2の初期HP $("#HPenemy1").text("敵1HP:" + HPenemy1); // 【変更】敵1のHP表示 $("#HPenemy2").text("敵2HP:" + HPenemy2); // 【変更】敵2のHP表示 HPplayer += 10; // クリア後のプレイヤーのHPに10を加算 stage = 1; // ステージ1へ $("#HPplayer").text("HP:" + HPplayer); $("#stage").text("ステージ:" + stage); TypeChangeEnemy(); // 強くてニューゲームの場合は、敵のみ。 } else { alert("全てのステージクリア後にのみ、選択可能。"); } TurnStart(); $("#winlose").css("color","#000000"); // 色を黒に戻す $("#ending").text(""); $("#score").text(""); $("#next").text(""); } function TypeChangeEnemy(){ TypeEnemy1 = parseInt(Math.random() * 3); TypeEnemy2 = parseInt(Math.random() * 3); $("#TypeEnemy1").css("color", TypeColor[TypeEnemy1]); $("#TypeEnemy2").css("color", TypeColor[TypeEnemy2]); $("#TypeEnemy1").text(TypeName[TypeEnemy1]); $("#TypeEnemy2").text(TypeName[TypeEnemy2]); } function TypeChangePlayer(){ TypePlayer = Math.floor(Math.random() * 3); $("#TypePlayer").css("color", TypeColor[TypePlayer]); $("#TypePlayer").text(TypeName[TypePlayer]); } |
(解説) 第22講で属性システムを導入し、第23講でそれを実装したが、
常にプレイヤーが有利になる様に、属性を選んでいけば、簡単に勝つことができ、
そこに運の要素が絡む余地は極めて少ない。しかし、相手が複数存在し、
その属性が異なれば、属性を変更する余地が生じる可能性が高い。
通常攻撃は、攻撃対象を選択する必要があるが、特殊攻撃は全体攻撃とした。
攻撃対象を変更する技は、特殊攻撃7として実装しているが、ターン消費はしない。
また、敵の一方が斃れた場合、他方が自動的に攻撃対象に選択されるようになっている他、
既に斃れている敵は攻撃対象に選択できず、アラートが出るようにした。
但し、中ボス戦及び最終ボス戦は、敵は1体だけである。
また、特殊攻撃1と特殊攻撃2はエネルギーがないときは発動できないように修正を施した。
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html lang="ja"> <head> <meta name="robots" content="noindex,nofollow"> <meta http-equiv="content-type" content="text/html;charset=utf-8"> <title>JavaScriptによるRPG制作・第25講</title> <script language="JavaScript" type="text/javascript" src="jquery.js"></script> <script language="JavaScript" type="text/javascript" src="jsrpg025.js"></script> </head> <body bgcolor="#c0c0c0"> <center> <h1>JavaScriptによるRPG制作・第25講</h1> <form> <table border="0" frame="void" rules="none" background="lattice.png"> <tr> <td align="center" rowspan="2"><span id="stage">ステージ:1</span></td> <td align="center"><span id="HPenemy1">敵1HP:10</span></td> <td align="center">敵1属性:<span id="TypeEnemy1" style="color:#000000;">???</span></td> <td align="center">通常攻撃(対象選択:<span id="target">敵1</span>) <input type="button" value="変更" style="background-color:#808080;width:50px;" onclick="TargetChange()">:</td> <td align="center"><span> <input type="button" value="13ダメージを与え、13充電する" style="background-color:#808080;width:250px;" onclick="thirteen()"> </span></td> </tr> <tr> <td align="center"><span id="HPenemy2">敵2HP:10</span></td> <td align="center">敵2属性:<span id="TypeEnemy2" style="color:#000000;">???</span></td> <td align="center"><span> <input type="button" value="2ダメージを与え、2充電する" style="background-color:#808080;width:250px;" onclick="two()"> </span></td> <td align="center"><span> <input type="button" value="17ダメージを与え、17充電する" style="background-color:#808080;width:250px;" onclick="seventeen()"> </span></td> </tr> <tr> <td align="center" colspan="3"><span> <hr> </span></td> <td align="center"><span> <input type="button" value="3ダメージを与え、3充電する" style="background-color:#808080;width:250px;" onclick="three()"> </span></td> <td align="center"><span> <input type="button" value="19ダメージを与え、19充電する" style="background-color:#808080;width:250px;" onclick="nineteen()"> </span></td> </tr> <tr> <td align="center" rowspan="2"><span>プレイヤー:</span></td> <td align="center"><span id="HPplayer">HP:10</span></td> <td align="center">属性:<span id="TypePlayer" style="color:#000000;">???</span></td> <td align="center"><span> <input type="button" value="5ダメージを与え、5充電する" style="background-color:#808080;width:250px;" onclick="five()"> </span></td> <td align="center"><span> <input type="button" value="23ダメージを与え、23充電する" style="background-color:#808080;width:250px;" onclick="twentythree()"> </span></td> </span></td> </tr> <tr> <td align="center">爵位:<span id="rank">???</span></td> <td align="center"><span id="ATKplayer">全蓄積エネルギー:0</span></td> <td align="center"><span> <input type="button" value="7ダメージを与え、7充電する" style="background-color:#808080;width:250px;" onclick="seven()"> </span></td> <td align="center"><span> <input type="button" value="29ダメージを与え、29充電する" style="background-color:#808080;width:250px;" onclick="twentynine()"> </span></td> </tr> <tr> <td align="center" colspan="3"><span> <hr> </span></td> <td align="center"><span> <input type="button" value="11ダメージを与え、11充電する" style="background-color:#808080;width:250px;" onclick="eleven()"> </span></td> <td align="center"><span> <input type="button" value="31ダメージを与え、31充電する" style="background-color:#808080;width:250px;" onclick="thirtyone()"> </span></td> </tr> <tr> <td align="center" colspan="3"> <span id="poison" style="color:#800080;"> </span><br> <span id="barrier" style="color:#008000;"> </span></td> <td align="center" colspan="2"><span> <hr> </span></td> </tr> <tr> <td align="center" colspan="3"> <span id="message1"> </span><br><span id="message2"> </span></td> <td align="center"><span>特殊攻撃(全体攻撃):</span></td> <td align="center"><span> <input type="button" value="ダメージを半減させる結界を発動する" style="background-color:#008000;width:250px;height:40px;" onclick="special4()"> </span></td> </tr> <tr> <td align="center" colspan="3"> <span id="message3"> </span><br><span id="message4"> </span></td> <td align="center"><span> <input type="button" value="全蓄積エネルギーを放電する" style="background-color:#000000;color:#ffff00;width:250px;height:40px;" onclick="special1()"> </span></td> <td align="center"><span> <input type="button" value="ランダムダメージを与える" style="background-color:#ffff00;width:250px;height:40px;" onclick="special5()"> </span></td> </tr> <tr> <td align="center" colspan="3"> <span id="message5"> </span><br><span id="message6"> </span></td> <td align="center"><span> <input type="button" value="エネルギーを使って回復する" style="background-color:#000000;color:#ff0000;width:250px;height:40px;" onclick="special2()"> </span></td> <td align="center"><span> <input type="button" value="プレイヤーの属性を変更する" style="background-color:#808080;width:250px;height:40px;" onclick="special6()"> </span></td> </tr> <tr> <td align="center" colspan="3"> <span id="message7"> </span><br><span id="message8"> </span></td> <td align="center"><span> <input type="button" value="敵に毒を与え、毒状態にする" style="background-color:#800080;width:250px;height:40px;" onclick="special3()"> </span></td> <td align="center"><span> </span></td> </tr> <tr> <td align="center" colspan="3"><span id="winlose" style="color:#000000;">winlose</span></td> <td align="center" colspan="2"><span> <hr> </span></td> </tr> <tr> <td align="center"><span id="ending" style="color:#ff0000;">ending</span></td> <td align="center"><span id="score" style="color:#008000;">score</span></td> <td align="center"><span id="reformat" style="color:#0000ff;">reformat</span></td> <td align="center"><span>メニュー:</span></td> <td align="center"><span> <input type="button" value="最初から始める" style="background-color:#808080;width:250px;" onclick="GameStart()"> </span></td> </tr> <tr> <td align="center" colspan="3"><span id="next">next</span></td> <td align="center"><span> <input type="button" value="次のステージへ/メッセージクリア" style="background-color:#808080;width:250px;" onclick="NextStage()"> </span></td> <td align="center"><span> <input type="button" value="強くてニューゲーム" style="background-color:#808080;width:250px;" onclick="NewGameStart()"> </span></td> </tr> </table> </form> </center> </body> </html> |
var HPenemy1 = 10; // 敵1の初期HP var HPenemy2 = 10; // 敵2の初期HP var HPplayer = 20; // プレイヤーの初期HP var ATKenemy = 0; // 敵の攻撃力を初期化 var ATKplayer = 0; // プレイヤーの攻撃力を初期化 var stage = 1; // ステージ数 var power; // 技の威力 var PoisonCounter = 0; // ポイズンカウンター var BarrierCounter = 0; // バリアカウンター var RandomDamage; // ランダムダメージの数値を格納する変数を宣言 var RandomMax; // ステージ数との積がランダムダメージの上限 var TypeName = new Array("Feuer", "Eis", "Donner"); // 属性名称(0:Feuer, 1:Eis, 2:Donner) var TypeColor = new Array("#ff0000", "#0000ff", "#008000"); // 属性の色(0:赤, 1:青, 2:緑) var TypeBackGroundColor = new Array("#ff00ff", "#00ffff", "#00ff00"); // 属性の色(0:マゼンタ, 1:シアン, 2:ライム) var TypeEnemy1; // 敵1の属性 var TypeEnemy2; // 敵2の属性 var TypePlayer; // プレイヤーの属性 var TypeChange; // 属性変更用の乱数 var TypeEffect; // 属性による補正効果用の乱数 var TypeEffectATK; // 攻撃時の属性による補正効果 var TypeEffectDEF; // 防御時の属性による補正効果 var target = 1; // 攻撃対象(初期状態では敵1) var RankName = new Array("男爵", "子爵", "伯爵", "侯爵", "公爵", "大公", "魔王"); var RankNumber; // 0から6の値をとり、それぞれが上記の爵位に相当する window.onload = function() { reformat(); // ページを開いたときも爵位を表示 TypeChangeEnemy(); TypeChangePlayer(); } function ATKcalc(HPenemy, TypeEnemy){ // 敵の攻撃力を計算する関数(HPenemy, TypeEnemyは仮引数) ATKenemy = 0; // 敵の攻撃力を初期化 if (HPenemy % 2 == 0) { ATKenemy += 2; } // 敵のHPが2の倍数の時、敵の攻撃力が2上昇する。 if (HPenemy % 3 == 0) { ATKenemy += 3; } // 敵のHPが3の倍数の時、敵の攻撃力が3上昇する。 if (stage >= 3 && HPenemy % 5 == 0) { ATKenemy += 5; } // ステージ3以降、敵のHPが5の倍数の時、敵の攻撃力が5上昇する。 if (stage >= 5 && HPenemy % 7 == 0) { ATKenemy += 7; } // ステージ5以降、敵のHPが7の倍数の時、敵の攻撃力が7上昇する。 if (stage >= 50 && HPenemy % 11 == 0) { ATKenemy += 11; } // 中ボス戦及び、最終ボス戦の時、敵のHPが11の倍数の時、敵の攻撃力が11上昇する。 if (stage >= 50 && HPenemy % 13 == 0) { ATKenemy += 13; } // 中ボス戦及び、最終ボス戦の時、敵のHPが13の倍数の時、敵の攻撃力が13上昇する。 if (stage >= 50 && HPenemy % 17 == 0) { ATKenemy += 17; } // 中ボス戦及び、最終ボス戦の時、敵のHPが17の倍数の時、敵の攻撃力が17上昇する。 if (stage >= 50 && HPenemy % 19 == 0) { ATKenemy += 19; } // 中ボス戦及び、最終ボス戦の時、敵のHPが19の倍数の時、敵の攻撃力が19上昇する。 if (stage >= 100 && HPenemy % 23 == 0) { ATKenemy += 23; } // 最終ボス戦時のみ、敵のHPが23の倍数の時、敵の攻撃力が23上昇する。 if (stage >= 100 && HPenemy % 29 == 0) { ATKenemy += 29; } // 最終ボス戦時のみ、敵のHPが29の倍数の時、敵の攻撃力が29上昇する。 if (stage >= 100 && HPenemy % 31 == 0) { ATKenemy += 31; } // 最終ボス戦時のみ、敵のHPが31の倍数の時、敵の攻撃力が31上昇する。 TypeEffect = (TypeEnemy + 3 - TypePlayer) % 3; switch(TypeEffect){ case 0 : TypeEffectDEF = 1; break; case 1 : TypeEffectDEF = 2; break; case 2 : TypeEffectDEF = 0.5; break; default : break; } ATKenemy = parseInt(ATKenemy * TypeEffectDEF); } function BarrierState(){ // 結界を表示する関数 if (BarrierCounter > 0) { $("#barrier").text("結界が発動中(あと " + BarrierCounter + " ターン)"); // バリアカウンターが0以外のとき、結界が発動中であることを表示する。 } else { $("#barrier").text(""); } } function NextStage(){ // 勝利後のイベント処理をする関数 if (HPenemy1 <= 0 && HPenemy2 <= 0) { // 敵1と敵2のHPが共に0以下ならば、勝利。 $("#winlose").text(""); $("#next").text(""); ATKplayer = 0; // プレイヤーの攻撃力を初期化 $("#ATKplayer").text("全蓄積エネルギー:" + ATKplayer); // 現在の全蓄積エネルギー PoisonCounter = 0; // ポイズンカウンターを0にする BarrierCounter = 0; // バリアカウンターを0にする if (stage < 5 || (stage > 5 && stage < 10)) { stage += 1; // 次のステージへ HPenemy1 = stage * 10; // 次のステージの敵1のHP HPenemy2 = stage * 10; // 次のステージの敵2のHP HPplayer += stage * 20; // HPを加算 $("#stage").text("ステージ:" + stage); $("#HPenemy1").text("敵1HP:" + HPenemy1); // 次のステージの敵1のHP $("#HPenemy2").text("敵2HP:" + HPenemy2); // 次のステージの敵2のHP $("#HPplayer").text("HP:" + HPplayer); TypeChangeEnemy(); // 次のステージへ行く場合は、敵のみ属性を変更。 } else if (stage == 5) { stage = 50; // 中ボス戦のステージへ HPenemy1 = 500; // 中ボスのHP HPenemy2 = 0; // 中ボス戦のステージでは、敵は中ボス1体のみ。 $("#stage").text("中ボス戦"); $("#HPenemy1").text("敵1HP:" + HPenemy1); TypeChangeEnemy(); // 次のステージへ行く場合は、敵のみ属性を変更。 } else if (stage == 10) { stage = 100; // 最終ボス戦のステージへ HPenemy1 = 1000; // 最終ボスのHP HPenemy2 = 0; // 最終ボス戦のステージでは、敵は最終ボス1体のみ。 $("#stage").text("最終ボス戦"); $("#HPenemy1").text("敵1HP:" + HPenemy1); TypeChangeEnemy(); // 次のステージへ行く場合は、敵のみ属性を変更。 } else if (stage == 50) { stage = 6; // 中ボスを倒した後は、ステージ6へ HPenemy1 = stage * 10; // 次のステージの敵1のHP HPenemy2 = stage * 10; // 次のステージの敵2のHP HPplayer += stage * 20; // HPを加算 $("#stage").text("ステージ:" + stage); $("#HPenemy1").text("敵1HP:" + HPenemy1); // 次のステージの敵1のHP $("#HPenemy2").text("敵2HP:" + HPenemy2); // 次のステージの敵2のHP $("#HPplayer").text("HP:" + HPplayer); TypeChangeEnemy(); // 次のステージへ行く場合は、敵のみ属性を変更。 } else { $("#ending").text("祝!ゲームクリア"); $("#score").text("スコア:" + HPplayer); reformat(); // 全ステージクリア後に転生 $("#reformat").text(RankName[RankNumber] + "に転生した!"); // エンディング $("#next").text("「最初から始める」? or 「強くてニューゲーム」?"); } } TurnStart(); $("#winlose").css("color","#000000"); // 色を黒に戻す } function PoisonState(){ // 毒状態を表示する関数 if (PoisonCounter > 0) { $("#poison").text("敵は、毒状態(あと " + PoisonCounter + " ターン)"); // ポイズンカウンターが0以外のとき、敵のHPが残っていれば、毒状態であることを表示する。 } else { $("#poison").text(""); } } function reformat(){ // クリア時に転生し、爵位をリフォーマットする関数 RankNumber = parseInt(Math.sqrt(HPplayer / 500)); if(RankNumber > 6){ RankNumber = 6; } // RankNumberが6以上の値をとる場合は、全て6として扱う。 $("#rank").text(RankName[RankNumber]); } function TurnStart(){ // ターン開始時の処理をする関数 $("#message1").text(""); $("#message2").text(""); $("#message3").text(""); $("#message4").text(""); $("#message5").text(""); $("#message6").text(""); if (BarrierCounter > 0 || PoisonCounter > 0) { if (BarrierCounter > PoisonCounter){ document.bgColor = "#008000"; // 背景を緑色にする } else { document.bgColor = "#800080"; // 背景を紫色にする } } else { document.bgColor = "#c0c0c0"; // 背景を銀色に戻す } PoisonState(); BarrierState(); } // メイン関数 function main(){ if (HPenemy1 <= 0 && HPenemy2 <= 0) { // 敵1と敵2のHPが共に0以下ならば、勝利。 $("#HPenemy1").text("敵HP1:0"); // 敵1のHP表示を0にする。 $("#HPenemy2").text("敵HP2:0"); // 敵2のHP表示を0にする。 $("#winlose").css("color","#ff0000"); // 勝利メッセージの色を赤にする $("#winlose").text("You win!"); // 勝利メッセージ $("#next").text("「次のステージへ」ボタンを押してください。"); } else { if (HPenemy1 > 0) { ATKcalc(HPenemy1, TypeEnemy1); if (BarrierCounter > 0) { ATKenemy = parseInt( ATKenemy / 2 ); // 敵の攻撃力を半減させる。 // JavaScriptでは、自動で実数化されてしまうので、整数化する。 } HPplayer -= ATKenemy; // 敵の攻撃によるダメージを受ける。 $("#HPplayer").text("HP:" + HPplayer); $("#message3").text("敵1の攻撃!プレイヤーは " + ATKenemy + " のダメージを受けた"); if (PoisonCounter > 0) { HPenemy1 -= ATKenemy; // ポイズンカウンターが0以外の場合は、敵1は毒によるダメージを受ける。 $("#HPenemy1").text("敵1HP:" + HPenemy1); $("#message4").text("敵1は毒により " + ATKenemy + " のダメージを受けた"); // 敵1が毒によるダメージを受けた場合のメッセージ } else { HPenemy1 += ATKenemy; // ポイズンカウンターが0の場合は敵1はその数値分HPを回復する。 $("#HPenemy1").text("敵1HP:" + HPenemy1); $("#message4").text("敵1はHPを " + ATKenemy + " 回復した"); // 敵1がHPを回復した場合のメッセージ } } else { target = 2; // 通常攻撃の対象を敵2に強制変更 $("#target").text("敵2"); // 表示を変更 $("#HPenemy1").text("敵HP1:0"); // 敵1のHP表示を0にする。 $("#message3").text("敵1は斃れた。"); } if (HPenemy2 > 0) { ATKcalc(HPenemy2, TypeEnemy2); if (BarrierCounter > 0) { ATKenemy = parseInt( ATKenemy / 2 ); // 敵の攻撃力を半減させる。 // JavaScriptでは、自動で実数化されてしまうので、整数化する。 } HPplayer -= ATKenemy; // 敵の攻撃によるダメージを受ける。 $("#HPplayer").text("HP:" + HPplayer); $("#message5").text("敵2の攻撃!プレイヤーは " + ATKenemy + " のダメージを受けた"); if (PoisonCounter > 0) { HPenemy2 -= ATKenemy; // ポイズンカウンターが0以外の場合は、敵1は毒によるダメージを受ける。 $("#HPenemy2").text("敵2HP:" + HPenemy2); $("#message6").text("敵2は毒により " + ATKenemy + " のダメージを受けた"); // 敵1が毒によるダメージを受けた場合のメッセージ } else { HPenemy2 += ATKenemy; // ポイズンカウンターが0の場合は敵1はその数値分HPを回復する。 $("#HPenemy2").text("敵2HP:" + HPenemy2); $("#message6").text("敵2はHPを " + ATKenemy + " 回復した"); // 敵1がHPを回復した場合のメッセージ } } else { target = 1; // 通常攻撃の対象を敵1に強制変更 $("#target").text("敵1"); // 表示を変更 $("#HPenemy2").text("敵HP2:0"); // 敵2のHP表示を0にする。 $("#message5").text("敵2は斃れた。"); } if (BarrierCounter > 0) { BarrierCounter -= 1; // バリアカウンターを1減らす } if (PoisonCounter > 0) { PoisonCounter -= 1; // ポイズンカウンターを1減らす } if (HPenemy1 <= 0) { target = 2; // 通常攻撃の対象を敵2に強制変更 $("#target").text("敵2"); // 表示を変更 $("#HPenemy1").text("敵HP1:0"); // 敵1のHP表示を0にする。 $("#message3").text("敵1は斃れた。"); } // 敵1が毒のダメージで力尽きた場合の処理 if (HPenemy2 <= 0) { target = 1; // 通常攻撃の対象を敵1に強制変更 $("#target").text("敵1"); // 表示を変更 $("#HPenemy2").text("敵HP2:0"); // 敵2のHP表示を0にする。 $("#message5").text("敵2は斃れた。"); } // 敵2が毒のダメージで力尽きた場合の処理 if (HPenemy1 <= 0 && HPenemy2 <= 0) { // 敵1と敵2のHPが共に0以下ならば、勝利。 $("#winlose").css("color","#800080"); // 勝利メッセージの色を紫にする $("#winlose").text("You win!"); // 勝利メッセージ $("#next").text("「次のステージへ」ボタンを押してください。"); } // 敵が毒のダメージで力尽きた場合にも、 // 戦闘を継続させずに、次のステージへ行く為の処理 if (HPplayer <= 0) { // プレイヤーのHPが0以下ならば、敗北。 $("#HPplayer").text("HP:0"); $("#winlose").css("color","#0000ff"); // 敗北メッセージの色を青にする $("#winlose").text("You lose!"); // 敗北メッセージ $("#next").text("もう一回?(Yes→「最初から始める」)"); } } } // 通常攻撃(コア) function NormalAttack(power){ if (HPplayer > 0 && (HPenemy1 > 0 || HPenemy2 > 0) && stage <= 100){ // プレイヤーと敵1と敵2のHPが全て正、かつステージ100以下の場合 TurnStart(); if(target == 1) { TypeEffect = (TypePlayer + 3 - TypeEnemy1) % 3; switch(TypeEffect){ case 0 : TypeEffectATK = 1; break; case 1 : TypeEffectATK = 2; break; case 2 : TypeEffectATK = 0.5; break; default : break; } power = parseInt(power * TypeEffectATK); HPenemy1 -= power; // 技の威力だけダメ―ジを与え、 ATKplayer += power; // その数値分充電する。 $("#HPenemy1").text("敵1HP:" + HPenemy1); $("#ATKplayer").text("全蓄積エネルギー:" + ATKplayer); $("#message1").text("敵1に " + power + " のダメージを与えた"); $("#message2").text("エネルギーを " + power + " 充電した"); } else { TypeEffect = (TypePlayer + 3 - TypeEnemy2) % 3; switch(TypeEffect){ case 0 : TypeEffectATK = 1; break; case 1 : TypeEffectATK = 2; break; case 2 : TypeEffectATK = 0.5; break; default : break; } power = parseInt(power * TypeEffectATK); HPenemy2 -= power; // 技の威力だけダメ―ジを与え、 ATKplayer += power; // その数値分充電する。 $("#HPenemy2").text("敵2HP:" + HPenemy2); $("#ATKplayer").text("全蓄積エネルギー:" + ATKplayer); $("#message1").text("敵2に " + power + " のダメージを与えた"); $("#message2").text("エネルギーを " + power + " 充電した"); } main(); } } // 特殊攻撃(全体攻撃) function special1(){ if (HPplayer > 0 && (HPenemy1 > 0 || HPenemy2 > 0) && stage <= 100){ // プレイヤーと敵1と敵2のHPが全て正、かつステージ100以下の場合 if (ATKplayer > 0){ TurnStart(); document.bgColor = "#ffff00"; // 背景を黄色にする HPenemy1 -= ATKplayer; // 敵1へのダメージ HPenemy2 -= ATKplayer; // 敵2へのダメージ // 全蓄積エネルギーを放電する(全体攻撃) $("#HPenemy1").text("敵1HP:" + HPenemy1); // 敵1のHP表示 $("#HPenemy2").text("敵2HP:" + HPenemy2); // 敵2のHP表示 $("#ATKplayer").text("全蓄積エネルギー:" + 0); $("#message1").text("蓄積されていた全エネルギーを放電した"); $("#message2").text("敵全体に " + ATKplayer + " のダメージを与えた"); ATKplayer = 0; // プレイヤーの攻撃力を初期化 main(); } else { alert("エネルギーがないと発動できません。"); } } } function special2(){ if (HPplayer > 0 && (HPenemy1 > 0 || HPenemy2 > 0) && stage <= 100){ // プレイヤーと敵1と敵2のHPが全て正、かつステージ100以下の場合 if (ATKplayer > 0){ TurnStart(); document.bgColor = "#ff0000"; // 背景を赤にする HPplayer += ATKplayer; // エネルギーを使って回復する $("#HPplayer").text("HP:" + HPplayer); $("#ATKplayer").text("全蓄積エネルギー:" + 0); $("#message1").text("蓄積されていた全エネルギーを吸収した"); $("#message2").text("プレイヤーはHPを " + ATKplayer + " 回復した"); ATKplayer = 0; // プレイヤーの攻撃力を初期化 main(); } else { alert("エネルギーがないと発動できません。"); } } } function special3(){ if (HPplayer > 0 && (HPenemy1 > 0 || HPenemy2 > 0) && stage <= 100){ // プレイヤーと敵1と敵2のHPが全て正、かつステージ100以下の場合 TurnStart(); document.bgColor = "#800080"; // 背景を紫色にする PoisonCounter = stage + 1; // ポイズンカウンターにはステージ数+1を代入 $("#poison").text("敵は、毒状態(あと " + PoisonCounter + " ターン)"); $("#message1").text("敵全体を毒状態にした"); main(); } } function special4(){ if (HPplayer > 0 && (HPenemy1 > 0 || HPenemy2 > 0) && stage <= 100){ // プレイヤーと敵1と敵2のHPが全て正、かつステージ100以下の場合 TurnStart(); document.bgColor = "#008000"; // 背景を緑色にする BarrierCounter = stage + 1; // バリアカウンターにはステージ数+1を代入 $("#barrier").text("結界が発動中(あと " + BarrierCounter + " ターン)"); $("#message1").text("ダメージを半減させる結界を発動した"); main(); } } function special5(){ if (HPplayer > 0 && (HPenemy1 > 0 || HPenemy2 > 0) && stage <= 10){ // プレイヤーと敵1と敵2のHPが全て正、かつステージ10以下の場合 TurnStart(); document.bgColor = "#ffff00"; // 背景を黄色にする RandomMax = Math.floor(Math.random() * 11); // RandomMaxは、0から10の値をとる。 if (RandomMax > 0) { // RandomMaxが0以外の時、 RandomDamage = Math.floor(Math.random() * (RandomMax * stage + 1)); // ランダムダメージの威力を決定 HPenemy1 -= RandomDamage; // 敵1へのダメージ HPenemy2 -= RandomDamage; // 敵2へのダメージ $("#HPenemy1").text("敵1HP:" + HPenemy1); // 敵1のHP表示 $("#HPenemy2").text("敵2HP:" + HPenemy2); // 敵2のHP表示 $("#message1").text("ランダムダメージを与える攻撃!"); $("#message2").text("敵全体に " + RandomDamage + " のダメージを与えた"); // ランダムダメージの威力だけダメ―ジを与える(全体攻撃) } else { // RandomMaxが0の時、敵は攻撃を回避する(0での剰余算を避ける)。 $("#message1").text("ランダムダメージを与える攻撃!"); $("#message2").text("敵は攻撃を回避した。"); } main(); } else { alert("中ボス戦・最終ボス戦では、この技を選択することができません。"); } } function special6(){ if (HPplayer > 0 && (HPenemy1 > 0 || HPenemy2 > 0) && stage <= 100){ // プレイヤーと敵1と敵2のHPが全て正、かつステージ100以下の場合 TurnStart(); TypeChange = Math.floor(Math.random() * 2) + 1; // 1~2の変数 TypePlayer = (TypePlayer + TypeChange) % 3; // 属性を変更する document.bgColor = TypeBackGroundColor[TypePlayer]; // 背景を属性の色にする $("#TypePlayer").css("color", TypeColor[TypePlayer]); $("#TypePlayer").text(TypeName[TypePlayer]); $("#message1").text("属性を" + TypeName[TypePlayer] + "に変更した。"); main(); } } function TargetChange(){ // 特殊攻撃7→攻撃対象の変更関数 if (HPplayer > 0 && (HPenemy1 > 0 || HPenemy2 > 0) && stage <= 10){ // プレイヤーと敵1と敵2のHPが全て正、かつステージ10以下の場合 TurnStart(); if(target == 1) { if(HPenemy2 > 0){ target = 2; $("#target").text("敵2"); // 表示を変更 $("#message1").text("通常攻撃の対象を敵2に変更した。"); } else { alert("敵2は既に斃されています。"); } } else { if(HPenemy1 > 0){ target = 1; $("#target").text("敵1"); // 表示を変更 $("#message1").text("通常攻撃の対象を敵1に変更した。"); } else { alert("敵1は既に斃されています。"); } } } else { alert("中ボス戦・最終ボス戦では、この技を選択することができません。"); } } // 通常攻撃 function two() { NormalAttack(2); } function three() { NormalAttack(3); } function five(){ if (stage >= 3) { NormalAttack(5); } else { alert("ステージ数3未満では、この技を選択することができません。"); } } function seven(){ if (stage >= 5){ NormalAttack(7); } else { alert("ステージ数5未満では、この技を選択することができません。"); } } function eleven(){ if (stage >= 50){ NormalAttack(11); } else { alert("中ボス戦・最終ボス戦以外では、この技を選択することができません。"); } } function thirteen(){ if (stage >= 50){ NormalAttack(13); } else { alert("中ボス戦・最終ボス戦以外では、この技を選択することができません。"); } } function seventeen(){ if (stage >= 50){ NormalAttack(17); } else { alert("中ボス戦・最終ボス戦以外では、この技を選択することができません。"); } } function nineteen(){ if (stage >= 50){ NormalAttack(19); } else { alert("中ボス戦・最終ボス戦以外では、この技を選択することができません。"); } } function twentythree(){ if (stage >= 100){ NormalAttack(23); } else { alert("最終ボス戦以外では、この技を選択することができません。"); } } function twentynine(){ if (stage >= 100){ NormalAttack(29); } else { alert("最終ボス戦以外では、この技を選択することができません。"); } } function thirtyone(){ if (stage >= 100){ NormalAttack(31); } else { alert("最終ボス戦以外では、この技を選択することができません。"); } } // 最初から始める function GameStart(){ if ((HPplayer <= 0) || (stage == 100 && HPenemy1 <= 0)){ // ゲームオーバー時または、全てのステージクリア後にのみ、選択可能。 $("#winlose").text(""); ATKplayer = 0; // プレイヤーの攻撃力を初期化 $("#ATKplayer").text("全蓄積エネルギー:" + ATKplayer); // 現在の全蓄積エネルギー PoisonCounter = 0; // ポイズンカウンターを0にする BarrierCounter = 0; // バリアカウンターを0にする HPenemy1 = 10; // 敵1の初期HP HPenemy2 = 10; // 敵2の初期HP $("#HPenemy1").text("敵1HP:" + HPenemy1); // 敵1のHP表示 $("#HPenemy2").text("敵2HP:" + HPenemy2); // 敵2のHP表示 HPplayer = 20; // プレイヤーの初期HPへ stage = 1; // ステージ1へ $("#HPplayer").text("HP:" + HPplayer); $("#stage").text("ステージ:" + stage); TypeChangeEnemy(); TypeChangePlayer(); } else { alert("ゲームオーバー時または、全てのステージクリア後にのみ、選択可能。"); } TurnStart(); $("#winlose").css("color","#000000"); // 色を黒に戻す $("#ending").text(""); $("#score").text(""); $("#reformat").text(""); // 転生時メッセージの削除 $("#next").text(""); } // 強くてニューゲーム function NewGameStart(){ if (stage == 100 && HPenemy1 <= 0){ // 全てのステージクリア後にのみ、選択可能。 $("#winlose").text(""); ATKplayer = 0; // プレイヤーの攻撃力を初期化 $("#ATKplayer").text("全蓄積エネルギー:" + ATKplayer); // 現在の全蓄積エネルギー PoisonCounter = 0; // ポイズンカウンターを0にする BarrierCounter = 0; // バリアカウンターを0にする HPenemy1 = 10; // 敵1の初期HP HPenemy2 = 10; // 敵2の初期HP $("#HPenemy1").text("敵1HP:" + HPenemy1); // 敵1のHP表示 $("#HPenemy2").text("敵2HP:" + HPenemy2); // 敵2のHP表示 HPplayer += 20; // クリア後のプレイヤーのHPに20を加算 stage = 1; // ステージ1へ $("#HPplayer").text("HP:" + HPplayer); $("#stage").text("ステージ:" + stage); TypeChangeEnemy(); // 強くてニューゲームの場合は、敵のみ。 } else { alert("全てのステージクリア後にのみ、選択可能。"); } TurnStart(); $("#winlose").css("color","#000000"); // 色を黒に戻す $("#ending").text(""); $("#score").text(""); $("#reformat").text(""); // 転生時メッセージの削除 $("#next").text(""); } function TypeChangeEnemy(){ TypeEnemy1 = parseInt(Math.random() * 3); TypeEnemy2 = parseInt(Math.random() * 3); $("#TypeEnemy1").css("color", TypeColor[TypeEnemy1]); $("#TypeEnemy2").css("color", TypeColor[TypeEnemy2]); $("#TypeEnemy1").text(TypeName[TypeEnemy1]); $("#TypeEnemy2").text(TypeName[TypeEnemy2]); } function TypeChangePlayer(){ TypePlayer = Math.floor(Math.random() * 3); $("#TypePlayer").css("color", TypeColor[TypePlayer]); $("#TypePlayer").text(TypeName[TypePlayer]); } |
(解説) 第21講の強くてニューゲームでは、クリア後のHPを引き継いで、
何周もできるように実装したが、単調になる為、全ステージをクリアする度に、
その時点でのHPに応じて、爵位が授与されるようにした。
さらに、第24講で複数の敵を想定したが、ステージ1の時点で、
敵の属性の組み合わせによっては、突破することが難しくなる場合がある。
その為、プレイヤー側のHPを2倍にすることでゲームバランスを調整した。
また、攻撃対象を選択するコマンドは、ターンを消費しないので、
特殊攻撃7としてではなく、単に攻撃対象の変更とし、
位置を通常攻撃の横に置き、インターフェースも変更した。
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html lang="ja"> <head> <meta name="robots" content="noindex,nofollow"> <meta http-equiv="content-type" content="text/html;charset=utf-8"> <title>JavaScriptによるRPG制作・第26講</title> <script language="JavaScript" type="text/javascript" src="jquery.js"></script> <script language="JavaScript" type="text/javascript" src="jsrpg026.js"></script> </head> <body bgcolor="#c0c0c0"> <center> <h1>JavaScriptによるRPG制作・第26講</h1> <form> <table border="0" frame="void" rules="none" background="lattice.png"> <tr> <td align="center" rowspan="2"><span id="stage">ステージ:1</span></td> <td align="center"><span id="HPenemy1">敵1HP:10</span></td> <td align="center">敵1属性:<span id="TypeEnemy1" style="color:#000000;">???</span></td> <td align="center">通常攻撃(対象選択:<span id="target">敵1</span>) <input type="button" value="変更" style="background-color:#808080;width:50px;" onclick="TargetChange()">:</td> <td align="center"><span> <input type="button" value="13ダメージを与え、13充電する" style="background-color:#808080;width:250px;" onclick="thirteen()"> </span></td> </tr> <tr> <td align="center"><span id="HPenemy2">敵2HP:10</span></td> <td align="center">敵2属性:<span id="TypeEnemy2" style="color:#000000;">???</span></td> <td align="center"><span> <input type="button" value="2ダメージを与え、2充電する" style="background-color:#808080;width:250px;" onclick="two()"> </span></td> <td align="center"><span> <input type="button" value="17ダメージを与え、17充電する" style="background-color:#808080;width:250px;" onclick="seventeen()"> </span></td> </tr> <tr> <td align="center" colspan="3"><span> <hr> </span></td> <td align="center"><span> <input type="button" value="3ダメージを与え、3充電する" style="background-color:#808080;width:250px;" onclick="three()"> </span></td> <td align="center"><span> <input type="button" value="19ダメージを与え、19充電する" style="background-color:#808080;width:250px;" onclick="nineteen()"> </span></td> </tr> <tr> <td align="center" rowspan="2"><span>プレイヤー:</span></td> <td align="center"><span id="HPplayer">HP:10</span></td> <td align="center">属性:<span id="TypePlayer" style="color:#000000;">???</span></td> <td align="center"><span> <input type="button" value="5ダメージを与え、5充電する" style="background-color:#808080;width:250px;" onclick="five()"> </span></td> <td align="center"><span> <input type="button" value="23ダメージを与え、23充電する" style="background-color:#808080;width:250px;" onclick="twentythree()"> </span></td> </span></td> </tr> <tr> <td align="center">爵位:<span id="rank">???</span></td> <td align="center"><span id="ATKplayer">全蓄積エネルギー:0</span></td> <td align="center"><span> <input type="button" value="7ダメージを与え、7充電する" style="background-color:#808080;width:250px;" onclick="seven()"> </span></td> <td align="center"><span> <input type="button" value="29ダメージを与え、29充電する" style="background-color:#808080;width:250px;" onclick="twentynine()"> </span></td> </tr> <tr> <td align="center" colspan="3"><span> <hr> </span></td> <td align="center"><span> <input type="button" value="11ダメージを与え、11充電する" style="background-color:#808080;width:250px;" onclick="eleven()"> </span></td> <td align="center"><span> <input type="button" value="31ダメージを与え、31充電する" style="background-color:#808080;width:250px;" onclick="thirtyone()"> </span></td> </tr> <tr> <td align="center" colspan="3"> <span id="poison" style="color:#800080;"> </span><br> <span id="barrier" style="color:#008000;"> </span></td> <td align="center" colspan="2"><span> <hr> </span></td> </tr> <tr> <td align="center" colspan="3"> <span id="message1"> </span><br><span id="message2"> </span></td> <td align="center"><span>特殊攻撃(全体攻撃):</span></td> <td align="center"><span> <input type="button" value="ダメージを半減させる結界を発動する" style="background-color:#008000;width:250px;height:40px;" onclick="special4()"> </span></td> </tr> <tr> <td align="center" colspan="3"> <span id="message3"> </span><br><span id="message4"> </span></td> <td align="center"><span> <input type="button" value="全蓄積エネルギーを放電する" style="background-color:#000000;color:#ffff00;width:250px;height:40px;" onclick="special1()"> </span></td> <td align="center"><span> <input type="button" value="ランダムダメージを与える" style="background-color:#ffff00;width:250px;height:40px;" onclick="special5()"> </span></td> </tr> <tr> <td align="center" colspan="3"> <span id="message5"> </span><br><span id="message6"> </span></td> <td align="center"><span> <input type="button" value="エネルギーを使って回復する" style="background-color:#000000;color:#ff0000;width:250px;height:40px;" onclick="special2()"> </span></td> <td align="center"><span> <input type="button" value="プレイヤーの属性を変更する" style="background-color:#808080;width:250px;height:40px;" onclick="special6()"> </span></td> </tr> <tr> <td align="center" colspan="3"> <span id="message7"> </span><br><span id="message8"> </span></td> <td align="center"><span> <input type="button" value="敵に毒を与え、毒状態にする" style="background-color:#800080;width:250px;height:40px;" onclick="special3()"> </span></td> <td align="center"><span> </span></td> </tr> <tr> <td align="center" colspan="3"><span id="winlose" style="color:#000000;"> </span></td> <td align="center" colspan="2"><span> <hr> </span></td> </tr> <tr> <td align="center"><span id="ending" style="color:#ff0000;"> </span></td> <td align="center"><span id="score" style="color:#008000;"> </span></td> <td align="center"><span id="reformat" style="color:#0000ff;"> </span></td> <td align="center"><span>メニュー:</span></td> <td align="center"><span> <input type="button" value="最初から始める" style="background-color:#808080;width:250px;" onclick="GameStart()"> </span></td> </tr> <tr> <td align="center" colspan="3"><span id="next"> </span></td> <td align="center"><span> <input type="button" value="次のステージへ/メッセージクリア" style="background-color:#808080;width:250px;" onclick="NextStage()"> </span></td> <td align="center"><span> <input type="button" value="強くてニューゲーム" style="background-color:#808080;width:250px;" onclick="NewGameStart()"> </span></td> </tr> </table> </form> </center> </body> </html> |
var HPenemy1 = 10; // 敵1の初期HP var HPenemy2 = 10; // 敵2の初期HP var HPplayer = 20; // プレイヤーの初期HP var ATKenemy = 0; // 敵の攻撃力を初期化 var ATKplayer = 0; // プレイヤーの攻撃力を初期化 var stage = 1; // ステージ数 var power; // 技の威力 var PoisonCounter = 0; // ポイズンカウンター var BarrierCounter = 0; // バリアカウンター var RandomDamage; // ランダムダメージの数値を格納する変数を宣言 var RandomMax; // ステージ数との積がランダムダメージの上限 var TypeName = new Array("Feuer", "Eis", "Donner"); // 属性名称(0:Feuer, 1:Eis, 2:Donner) var TypeColor = new Array("#ff0000", "#0000ff", "#008000"); // 属性の色(0:赤, 1:青, 2:緑) var TypeBackGroundColor = new Array("#ff00ff", "#00ffff", "#00ff00"); // 属性の色(0:マゼンタ, 1:シアン, 2:ライム) var TypeEnemy1; // 敵1の属性 var TypeEnemy2; // 敵2の属性 var TypePlayer; // プレイヤーの属性 var TypeChange; // 属性変更用の乱数 var TypeEffect; // 属性による補正効果用の乱数 var TypeEffectATK; // 攻撃時の属性による補正効果 var TypeEffectDEF; // 防御時の属性による補正効果 var target = 1; // 攻撃対象(初期状態では敵1) var RankName = new Array("男爵", "子爵", "伯爵", "侯爵", "公爵", "大公", "魔王"); var RankNumber; // 0から6の値をとり、それぞれが上記の爵位に相当する var TurnCounter = 0; // ボス戦のみターン進行をカウントするカウンター window.onload = function() { reformat(); TypeChangeEnemy(); TypeChangePlayer(); } function ATKcalc(HPenemy, TypeEnemy){ // 敵の攻撃力を計算する関数(HPenemy, TypeEnemyは仮引数) ATKenemy = 0; // 敵の攻撃力を初期化 if (HPenemy % 2 == 0) { ATKenemy += 2; } // 敵のHPが2の倍数の時、敵の攻撃力が2上昇する。 if (HPenemy % 3 == 0) { ATKenemy += 3; } // 敵のHPが3の倍数の時、敵の攻撃力が3上昇する。 if (stage >= 3 && HPenemy % 5 == 0) { ATKenemy += 5; } // ステージ3以降、敵のHPが5の倍数の時、敵の攻撃力が5上昇する。 if (stage >= 5 && HPenemy % 7 == 0) { ATKenemy += 7; } // ステージ5以降、敵のHPが7の倍数の時、敵の攻撃力が7上昇する。 if (stage >= 50 && HPenemy % 11 == 0) { ATKenemy += 11; } // 中ボス戦及び、最終ボス戦の時、敵のHPが11の倍数の時、敵の攻撃力が11上昇する。 if (stage >= 50 && HPenemy % 13 == 0) { ATKenemy += 13; } // 中ボス戦及び、最終ボス戦の時、敵のHPが13の倍数の時、敵の攻撃力が13上昇する。 if (stage >= 50 && HPenemy % 17 == 0) { ATKenemy += 17; } // 中ボス戦及び、最終ボス戦の時、敵のHPが17の倍数の時、敵の攻撃力が17上昇する。 if (stage >= 50 && HPenemy % 19 == 0) { ATKenemy += 19; } // 中ボス戦及び、最終ボス戦の時、敵のHPが19の倍数の時、敵の攻撃力が19上昇する。 if (stage >= 100 && HPenemy % 23 == 0) { ATKenemy += 23; } // 最終ボス戦時のみ、敵のHPが23の倍数の時、敵の攻撃力が23上昇する。 if (stage >= 100 && HPenemy % 29 == 0) { ATKenemy += 29; } // 最終ボス戦時のみ、敵のHPが29の倍数の時、敵の攻撃力が29上昇する。 if (stage >= 100 && HPenemy % 31 == 0) { ATKenemy += 31; } // 最終ボス戦時のみ、敵のHPが31の倍数の時、敵の攻撃力が31上昇する。 TypeEffect = (TypeEnemy + 3 - TypePlayer) % 3; switch(TypeEffect){ case 0 : TypeEffectDEF = 1; break; case 1 : TypeEffectDEF = 2; break; case 2 : TypeEffectDEF = 0.5; break; default : break; } ATKenemy = parseInt(ATKenemy * TypeEffectDEF); } function BarrierState(){ // 結界を表示する関数 if (BarrierCounter > 0) { $("#barrier").text("結界が発動中(あと " + BarrierCounter + " ターン)"); // バリアカウンターが0以外のとき、結界が発動中であることを表示する。 } else { $("#barrier").text(""); } } function BOSSonly(){ // ボスキャラクターのみが行う行動をまとめた関数 TurnCounter++; // ターンカウンターを進める。 if(TurnCounter % 3 == 0) { // 3ターン毎に、 TypeChange = Math.floor(Math.random() * 2) + 1; // 1~2の変数 TypeEnemy1 = (TypeEnemy1 + TypeChange) % 3; // 属性を変更する $("#TypeEnemy1").css("color", TypeColor[TypeEnemy1]); $("#TypeEnemy1").text(TypeName[TypeEnemy1]); TypeChange = Math.floor(Math.random() * 2) + 1; // 1~2の変数 TypeEnemy2 = (TypeEnemy2 + TypeChange) % 3; // 属性を変更する $("#TypeEnemy2").css("color", TypeColor[TypeEnemy2]); $("#TypeEnemy2").text(TypeName[TypeEnemy2]); $("#message7").text("敵のボスは、自軍全体の属性を変更した。"); } if(TurnCounter % 5 == 0) { // 5ターン毎に、 if(HPenemy2 >= 0) { // 敵2のHPがまだ残っていれば、 HPenemy1 += stage; // ボスキャラクター(敵1)自身の初期HPの10%を回復する。 $("#HPenemy1").text("敵1HP:" + HPenemy1); // 次のステージの敵1のHP $("#message8").text("敵のボスは、自己再生能力により、HPを" + stage + "回復した。"); } else { // 敵2が既に倒れている場合は、 HPenemy2 = stage; // 敵2を中ボス戦ならHP50、最終ボス戦ならHP100で復活させる。 $("#HPenemy2").text("敵2HP:" + HPenemy2); // 次のステージの敵2のHP $("#message8").text("敵のボスは、斃れていた配下を蘇生させた。"); } } } function NextStage(){ // 勝利後のイベント処理をする関数 if (HPenemy1 <= 0 && HPenemy2 <= 0) { // 敵1と敵2のHPが共に0以下ならば、勝利。 $("#winlose").text(""); $("#next").text(""); ATKplayer = 0; // プレイヤーの攻撃力を初期化 $("#ATKplayer").text("全蓄積エネルギー:" + ATKplayer); // 現在の全蓄積エネルギー PoisonCounter = 0; // ポイズンカウンターを0にする BarrierCounter = 0; // バリアカウンターを0にする if (stage < 5 || (stage > 5 && stage < 10)) { stage += 1; // 次のステージへ HPenemy1 = stage * 10; // 次のステージの敵1のHP HPenemy2 = stage * 10; // 次のステージの敵2のHP HPplayer += stage * 20; // HPを加算 $("#stage").text("ステージ:" + stage); $("#HPenemy1").text("敵1HP:" + HPenemy1); // 次のステージの敵1のHP $("#HPenemy2").text("敵2HP:" + HPenemy2); // 次のステージの敵2のHP $("#HPplayer").text("HP:" + HPplayer); TypeChangeEnemy(); // 次のステージへ行く場合は、敵のみ属性を変更。 } else if (stage == 5) { stage = 50; // 中ボス戦のステージへ HPenemy1 = 500; // 中ボスのHP HPenemy2 = 50; // 中ボス配下の敵2のHPは50。 $("#stage").text("中ボス戦"); $("#HPenemy1").text("敵1HP:" + HPenemy1); $("#HPenemy2").text("敵2HP:" + HPenemy2); TypeChangeEnemy(); // 次のステージへ行く場合は、敵のみ属性を変更。 } else if (stage == 10) { stage = 100; // 最終ボス戦のステージへ HPenemy1 = 1000; // 最終ボスのHP HPenemy2 = 100; // 最終ボス配下の敵2のHPは100。 $("#stage").text("最終ボス戦"); $("#HPenemy1").text("敵1HP:" + HPenemy1); $("#HPenemy2").text("敵2HP:" + HPenemy2); TypeChangeEnemy(); // 次のステージへ行く場合は、敵のみ属性を変更。 } else if (stage == 50) { stage = 6; // 中ボスを倒した後は、ステージ6へ HPenemy1 = stage * 10; // 次のステージの敵1のHP HPenemy2 = stage * 10; // 次のステージの敵2のHP HPplayer += stage * 20; // HPを加算 $("#stage").text("ステージ:" + stage); $("#HPenemy1").text("敵1HP:" + HPenemy1); // 次のステージの敵1のHP $("#HPenemy2").text("敵2HP:" + HPenemy2); // 次のステージの敵2のHP $("#HPplayer").text("HP:" + HPplayer); TypeChangeEnemy(); // 次のステージへ行く場合は、敵のみ属性を変更。 TurnCounter = 0; // 中ボス戦終了時に、ターンカウンターを停止する。 } else { $("#ending").text("祝!ゲームクリア"); $("#score").text("スコア:" + HPplayer); reformat(); $("#reformat").text(RankName[RankNumber] + "に転生した!"); // エンディング $("#next").text("「最初から始める」? or 「強くてニューゲーム」?"); TurnCounter = 0; // 最終ボス戦終了時に、ターンカウンターを停止する。 } } TurnStart(); $("#winlose").css("color","#000000"); // 色を黒に戻す } function PoisonState(){ // 毒状態を表示する関数 if (PoisonCounter > 0) { $("#poison").text("敵は、毒状態(あと " + PoisonCounter + " ターン)"); // ポイズンカウンターが0以外のとき、敵のHPが残っていれば、毒状態であることを表示する。 } else { $("#poison").text(""); } } function reformat(){ // クリア時に転生し、爵位をリフォーマットする関数 RankNumber = parseInt(Math.sqrt(HPplayer / 500)); if(RankNumber > 6){ RankNumber = 6; } // RankNumberが6以上の値をとる場合は、全て6として扱う。 $("#rank").text(RankName[RankNumber]); } function TurnStart(){ // ターン開始時の処理をする関数 $("#message1").text(""); $("#message2").text(""); $("#message3").text(""); $("#message4").text(""); $("#message5").text(""); $("#message6").text(""); $("#message7").text(""); $("#message8").text(""); if (BarrierCounter > 0 || PoisonCounter > 0) { if (BarrierCounter > PoisonCounter){ document.bgColor = "#008000"; // 背景を緑色にする } else { document.bgColor = "#800080"; // 背景を紫色にする } } else { document.bgColor = "#c0c0c0"; // 背景を銀色に戻す } PoisonState(); BarrierState(); } // メイン関数 function main(){ if (HPenemy1 <= 0 && HPenemy2 <= 0) { // 敵1と敵2のHPが共に0以下ならば、勝利。 $("#HPenemy1").text("敵HP1:0"); // 敵1のHP表示を0にする。 $("#HPenemy2").text("敵HP2:0"); // 敵2のHP表示を0にする。 $("#winlose").css("color","#ff0000"); // 勝利メッセージの色を赤にする $("#winlose").text("You win!"); // 勝利メッセージ $("#next").text("「次のステージへ」ボタンを押してください。"); } else { if (HPenemy1 > 0) { ATKcalc(HPenemy1, TypeEnemy1); if (BarrierCounter > 0) { ATKenemy = parseInt( ATKenemy / 2 ); // 敵の攻撃力を半減させる。 // JavaScriptでは、自動で実数化されてしまうので、整数化する。 } HPplayer -= ATKenemy; // 敵の攻撃によるダメージを受ける。 $("#HPplayer").text("HP:" + HPplayer); $("#message3").text("敵1の攻撃!プレイヤーは " + ATKenemy + " のダメージを受けた"); if (PoisonCounter > 0) { HPenemy1 -= ATKenemy; // ポイズンカウンターが0以外の場合は、敵1は毒によるダメージを受ける。 $("#HPenemy1").text("敵1HP:" + HPenemy1); $("#message4").text("敵1は毒により " + ATKenemy + " のダメージを受けた"); // 敵1が毒によるダメージを受けた場合のメッセージ } else { HPenemy1 += ATKenemy; // ポイズンカウンターが0の場合は敵1はその数値分HPを回復する。 $("#HPenemy1").text("敵1HP:" + HPenemy1); $("#message4").text("敵1はHPを " + ATKenemy + " 回復した"); // 敵1がHPを回復した場合のメッセージ } } else { target = 2; // 通常攻撃の対象を敵2に強制変更 $("#target").text("敵2"); $("#HPenemy1").text("敵HP1:0"); // 敵1のHP表示を0にする。 $("#message3").text("敵1は斃れた。"); } if (HPenemy2 > 0) { ATKcalc(HPenemy2, TypeEnemy2); if (BarrierCounter > 0) { ATKenemy = parseInt( ATKenemy / 2 ); // 敵の攻撃力を半減させる。 // JavaScriptでは、自動で実数化されてしまうので、整数化する。 } HPplayer -= ATKenemy; // 敵の攻撃によるダメージを受ける。 $("#HPplayer").text("HP:" + HPplayer); $("#message5").text("敵2の攻撃!プレイヤーは " + ATKenemy + " のダメージを受けた"); if (PoisonCounter > 0) { HPenemy2 -= ATKenemy; // ポイズンカウンターが0以外の場合は、敵1は毒によるダメージを受ける。 $("#HPenemy2").text("敵2HP:" + HPenemy2); $("#message6").text("敵2は毒により " + ATKenemy + " のダメージを受けた"); // 敵1が毒によるダメージを受けた場合のメッセージ } else { HPenemy2 += ATKenemy; // ポイズンカウンターが0の場合は敵1はその数値分HPを回復する。 $("#HPenemy2").text("敵2HP:" + HPenemy2); $("#message6").text("敵2はHPを " + ATKenemy + " 回復した"); // 敵1がHPを回復した場合のメッセージ } } else { target = 1; // 通常攻撃の対象を敵1に強制変更 $("#target").text("敵1"); $("#HPenemy2").text("敵HP2:0"); // 敵2のHP表示を0にする。 $("#message5").text("敵2は斃れた。"); } if (BarrierCounter > 0) { BarrierCounter -= 1; // バリアカウンターを1減らす } if (PoisonCounter > 0) { PoisonCounter -= 1; // ポイズンカウンターを1減らす } if (HPenemy1 <= 0) { target = 2; // 通常攻撃の対象を敵2に強制変更 $("#target").text("敵2"); $("#HPenemy1").text("敵HP1:0"); // 敵1のHP表示を0にする。 $("#message3").text("敵1は斃れた。"); } // 敵1が毒のダメージで力尽きた場合の処理 if (HPenemy2 <= 0) { target = 1; // 通常攻撃の対象を敵1に強制変更 $("#target").text("敵1"); $("#HPenemy2").text("敵HP2:0"); // 敵2のHP表示を0にする。 $("#message5").text("敵2は斃れた。"); } // 敵2が毒のダメージで力尽きた場合の処理 if (HPenemy1 <= 0 && HPenemy2 <= 0) { // 敵1と敵2のHPが共に0以下ならば、勝利。 $("#winlose").css("color","#800080"); // 勝利メッセージの色を紫にする $("#winlose").text("You win!"); // 勝利メッセージ $("#next").text("「次のステージへ」ボタンを押してください。"); } // 敵が毒のダメージで力尽きた場合にも、 // 戦闘を継続させずに、次のステージへ行く為の処理 if (stage > 10 && HPenemy1 > 0) { // ボス戦で、ボスキャラクター(敵1)のHPが残っている時、 BOSSonly(); // ターン終了時に、ボスキャラクター特有の行動を行う。 } if (HPplayer <= 0) { // プレイヤーのHPが0以下ならば、敗北。 $("#HPplayer").text("HP:0"); $("#winlose").css("color","#0000ff"); // 敗北メッセージの色を青にする $("#winlose").text("You lose!"); // 敗北メッセージ $("#next").text("もう一回?(Yes→「最初から始める」)"); } } } // 通常攻撃(コア) function NormalAttack(power){ if (HPplayer > 0 && (HPenemy1 > 0 || HPenemy2 > 0) && stage <= 100){ // プレイヤーと敵1と敵2のHPが全て正、かつステージ100以下の場合 TurnStart(); if(target == 1) { TypeEffect = (TypePlayer + 3 - TypeEnemy1) % 3; switch(TypeEffect){ case 0 : TypeEffectATK = 1; break; case 1 : TypeEffectATK = 2; break; case 2 : TypeEffectATK = 0.5; break; default : break; } power = parseInt(power * TypeEffectATK); HPenemy1 -= power; // 技の威力だけダメ―ジを与え、 ATKplayer += power; // その数値分充電する。 $("#HPenemy1").text("敵1HP:" + HPenemy1); $("#ATKplayer").text("全蓄積エネルギー:" + ATKplayer); $("#message1").text("敵1に " + power + " のダメージを与えた"); $("#message2").text("エネルギーを " + power + " 充電した"); } else { TypeEffect = (TypePlayer + 3 - TypeEnemy2) % 3; switch(TypeEffect){ case 0 : TypeEffectATK = 1; break; case 1 : TypeEffectATK = 2; break; case 2 : TypeEffectATK = 0.5; break; default : break; } power = parseInt(power * TypeEffectATK); HPenemy2 -= power; // 技の威力だけダメ―ジを与え、 ATKplayer += power; // その数値分充電する。 $("#HPenemy2").text("敵2HP:" + HPenemy2); $("#ATKplayer").text("全蓄積エネルギー:" + ATKplayer); $("#message1").text("敵2に " + power + " のダメージを与えた"); $("#message2").text("エネルギーを " + power + " 充電した"); } main(); } } // 特殊攻撃(全体攻撃) function special1(){ if (HPplayer > 0 && (HPenemy1 > 0 || HPenemy2 > 0) && stage <= 100){ // プレイヤーと敵1と敵2のHPが全て正、かつステージ100以下の場合 if (ATKplayer > 0){ TurnStart(); document.bgColor = "#ffff00"; // 背景を黄色にする HPenemy1 -= ATKplayer; // 敵1へのダメージ HPenemy2 -= ATKplayer; // 敵2へのダメージ // 全蓄積エネルギーを放電する(全体攻撃) $("#HPenemy1").text("敵1HP:" + HPenemy1); // 敵1のHP表示 $("#HPenemy2").text("敵2HP:" + HPenemy2); // 敵2のHP表示 $("#ATKplayer").text("全蓄積エネルギー:" + 0); $("#message1").text("蓄積されていた全エネルギーを放電した"); $("#message2").text("敵全体に " + ATKplayer + " のダメージを与えた"); ATKplayer = 0; // プレイヤーの攻撃力を初期化 main(); } else { alert("エネルギーがないと発動できません。"); } } } function special2(){ if (HPplayer > 0 && (HPenemy1 > 0 || HPenemy2 > 0) && stage <= 100){ // プレイヤーと敵1と敵2のHPが全て正、かつステージ100以下の場合 if (ATKplayer > 0){ TurnStart(); document.bgColor = "#ff0000"; // 背景を赤にする HPplayer += ATKplayer; // エネルギーを使って回復する $("#HPplayer").text("HP:" + HPplayer); $("#ATKplayer").text("全蓄積エネルギー:" + 0); $("#message1").text("蓄積されていた全エネルギーを吸収した"); $("#message2").text("プレイヤーはHPを " + ATKplayer + " 回復した"); ATKplayer = 0; // プレイヤーの攻撃力を初期化 main(); } else { alert("エネルギーがないと発動できません。"); } } } function special3(){ if (HPplayer > 0 && (HPenemy1 > 0 || HPenemy2 > 0) && stage <= 100){ // プレイヤーと敵1と敵2のHPが全て正、かつステージ100以下の場合 TurnStart(); document.bgColor = "#800080"; // 背景を紫色にする PoisonCounter = stage + 1; // ポイズンカウンターにはステージ数+1を代入 $("#poison").text("敵は、毒状態(あと " + PoisonCounter + " ターン)"); $("#message1").text("敵全体を毒状態にした"); main(); } } function special4(){ if (HPplayer > 0 && (HPenemy1 > 0 || HPenemy2 > 0) && stage <= 100){ // プレイヤーと敵1と敵2のHPが全て正、かつステージ100以下の場合 TurnStart(); document.bgColor = "#008000"; // 背景を緑色にする BarrierCounter = stage + 1; // バリアカウンターにはステージ数+1を代入 $("#barrier").text("結界が発動中(あと " + BarrierCounter + " ターン)"); $("#message1").text("ダメージを半減させる結界を発動した"); main(); } } function special5(){ if (HPplayer > 0 && (HPenemy1 > 0 || HPenemy2 > 0) && stage <= 10){ // プレイヤーと敵1と敵2のHPが全て正、かつステージ10以下の場合 TurnStart(); document.bgColor = "#ffff00"; // 背景を黄色にする RandomMax = Math.floor(Math.random() * 11); // RandomMaxは、0から10の値をとる。 if (RandomMax > 0) { // RandomMaxが0以外の時、 RandomDamage = Math.floor(Math.random() * (RandomMax * stage + 1)); // ランダムダメージの威力を決定 HPenemy1 -= RandomDamage; // 敵1へのダメージ HPenemy2 -= RandomDamage; // 敵2へのダメージ $("#HPenemy1").text("敵1HP:" + HPenemy1); // 敵1のHP表示 $("#HPenemy2").text("敵2HP:" + HPenemy2); // 敵2のHP表示 $("#message1").text("ランダムダメージを与える攻撃!"); $("#message2").text("敵全体に " + RandomDamage + " のダメージを与えた"); // ランダムダメージの威力だけダメ―ジを与える(全体攻撃) } else { // RandomMaxが0の時、敵は攻撃を回避する(0での剰余算を避ける)。 $("#message1").text("ランダムダメージを与える攻撃!"); $("#message2").text("敵は攻撃を回避した。"); } main(); } else { alert("中ボス戦・最終ボス戦では、この技を選択することができません。"); } } function special6(){ if (HPplayer > 0 && (HPenemy1 > 0 || HPenemy2 > 0) && stage <= 100){ // プレイヤーと敵1と敵2のHPが全て正、かつステージ100以下の場合 TurnStart(); TypeChange = Math.floor(Math.random() * 2) + 1; // 1~2の変数 TypePlayer = (TypePlayer + TypeChange) % 3; // 属性を変更する document.bgColor = TypeBackGroundColor[TypePlayer]; // 背景を属性の色にする $("#TypePlayer").css("color", TypeColor[TypePlayer]); $("#TypePlayer").text(TypeName[TypePlayer]); $("#message1").text("属性を" + TypeName[TypePlayer] + "に変更した。"); main(); } } function TargetChange(){ if (HPplayer > 0 && (HPenemy1 > 0 || HPenemy2 > 0) && stage <= 100){ // プレイヤーと敵1と敵2のHPが全て正、かつステージ100以下の場合 TurnStart(); if(target == 1) { if(HPenemy2 > 0){ target = 2; $("#target").text("敵2"); $("#message1").text("通常攻撃の対象を敵2に変更した。"); } else { alert("敵2は既に斃されています。"); } } else { if(HPenemy1 > 0){ target = 1; $("#target").text("敵1"); $("#message1").text("通常攻撃の対象を敵1に変更した。"); } else { alert("敵1は既に斃されています。"); } } } } // 通常攻撃 function two() { NormalAttack(2); } function three() { NormalAttack(3); } function five(){ if (stage >= 3) { NormalAttack(5); } else { alert("ステージ数3未満では、この技を選択することができません。"); } } function seven(){ if (stage >= 5){ NormalAttack(7); } else { alert("ステージ数5未満では、この技を選択することができません。"); } } function eleven(){ if (stage >= 50){ NormalAttack(11); } else { alert("中ボス戦・最終ボス戦以外では、この技を選択することができません。"); } } function thirteen(){ if (stage >= 50){ NormalAttack(13); } else { alert("中ボス戦・最終ボス戦以外では、この技を選択することができません。"); } } function seventeen(){ if (stage >= 50){ NormalAttack(17); } else { alert("中ボス戦・最終ボス戦以外では、この技を選択することができません。"); } } function nineteen(){ if (stage >= 50){ NormalAttack(19); } else { alert("中ボス戦・最終ボス戦以外では、この技を選択することができません。"); } } function twentythree(){ if (stage >= 100){ NormalAttack(23); } else { alert("最終ボス戦以外では、この技を選択することができません。"); } } function twentynine(){ if (stage >= 100){ NormalAttack(29); } else { alert("最終ボス戦以外では、この技を選択することができません。"); } } function thirtyone(){ if (stage >= 100){ NormalAttack(31); } else { alert("最終ボス戦以外では、この技を選択することができません。"); } } // 最初から始める function GameStart(){ if ((HPplayer <= 0) || (stage == 100 && HPenemy1 <= 0)){ // ゲームオーバー時または、全てのステージクリア後にのみ、選択可能。 $("#winlose").text(""); ATKplayer = 0; // プレイヤーの攻撃力を初期化 $("#ATKplayer").text("全蓄積エネルギー:" + ATKplayer); // 現在の全蓄積エネルギー PoisonCounter = 0; // ポイズンカウンターを0にする BarrierCounter = 0; // バリアカウンターを0にする HPenemy1 = 10; // 敵1の初期HP HPenemy2 = 10; // 敵2の初期HP $("#HPenemy1").text("敵1HP:" + HPenemy1); // 敵1のHP表示 $("#HPenemy2").text("敵2HP:" + HPenemy2); // 敵2のHP表示 HPplayer = 20; // プレイヤーの初期HPへ stage = 1; // ステージ1へ $("#HPplayer").text("HP:" + HPplayer); $("#stage").text("ステージ:" + stage); TypeChangeEnemy(); TypeChangePlayer(); } else { alert("ゲームオーバー時または、全てのステージクリア後にのみ、選択可能。"); } TurnStart(); $("#winlose").css("color","#000000"); // 色を黒に戻す $("#ending").text(""); $("#score").text(""); $("#reformat").text(""); $("#next").text(""); } // 強くてニューゲーム function NewGameStart(){ if (stage == 100 && HPenemy1 <= 0){ // 全てのステージクリア後にのみ、選択可能。 $("#winlose").text(""); ATKplayer = 0; // プレイヤーの攻撃力を初期化 $("#ATKplayer").text("全蓄積エネルギー:" + ATKplayer); // 現在の全蓄積エネルギー PoisonCounter = 0; // ポイズンカウンターを0にする BarrierCounter = 0; // バリアカウンターを0にする HPenemy1 = 10; // 敵1の初期HP HPenemy2 = 10; // 敵2の初期HP $("#HPenemy1").text("敵1HP:" + HPenemy1); // 敵1のHP表示 $("#HPenemy2").text("敵2HP:" + HPenemy2); // 敵2のHP表示 HPplayer += 20; // クリア後のプレイヤーのHPに20を加算 stage = 1; // ステージ1へ $("#HPplayer").text("HP:" + HPplayer); $("#stage").text("ステージ:" + stage); TypeChangeEnemy(); // 強くてニューゲームの場合は、敵のみ。 } else { alert("全てのステージクリア後にのみ、選択可能。"); } TurnStart(); $("#winlose").css("color","#000000"); // 色を黒に戻す $("#ending").text(""); $("#score").text(""); $("#reformat").text(""); $("#next").text(""); } function TypeChangeEnemy(){ TypeEnemy1 = parseInt(Math.random() * 3); TypeEnemy2 = parseInt(Math.random() * 3); $("#TypeEnemy1").css("color", TypeColor[TypeEnemy1]); $("#TypeEnemy2").css("color", TypeColor[TypeEnemy2]); $("#TypeEnemy1").text(TypeName[TypeEnemy1]); $("#TypeEnemy2").text(TypeName[TypeEnemy2]); } function TypeChangePlayer(){ TypePlayer = Math.floor(Math.random() * 3); $("#TypePlayer").css("color", TypeColor[TypePlayer]); $("#TypePlayer").text(TypeName[TypePlayer]); } |
(解説)
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html lang="ja"> <head> <meta name="robots" content="noindex,nofollow"> <meta http-equiv="content-type" content="text/html;charset=utf-8"> <title>JavaScriptによるRPG制作・第27講</title> <script language="JavaScript" type="text/javascript" src="jquery.js"></script> <script language="JavaScript" type="text/javascript" src="jsrpg027.js"></script> </head> <body bgcolor="#c0c0c0"> <center> <h1>JavaScriptによるRPG制作・第27講</h1> <form name="jsrpg"> <table border="0" frame="void" rules="none" background="lattice.png"> <tr> <td align="center" rowspan="2"><span id="stage">ステージ:1</span></td> <td align="center"><span id="HPenemy1">敵1HP:10</span></td> <td align="center">敵1属性:<span id="TypeEnemy1" style="color:#000000;">???</span></td> <td align="center" colspan="2" rowspan="7"><span> <hr> </span></td> </tr> <tr> <td align="center"><span id="HPenemy2">敵2HP:10</span></td> <td align="center">敵2属性:<span id="TypeEnemy2" style="color:#000000;">???</span></td> </tr> <tr> <td align="center" colspan="3"><span> <hr> </span></td> </tr> <tr> <td align="center" rowspan="2"><span>プレイヤー:</span></td> <td align="center"><span id="HPplayer">HP:10</span></td> <td align="center">属性:<span id="TypePlayer" style="color:#000000;">???</span></td> </tr> <tr> <td align="center">爵位:<span id="rank">???</span></td> <td align="center"><span id="ATKplayer">全蓄積エネルギー:0</span></td> </tr> <tr> <td align="center" colspan="3"><span> <hr> </span></td> </tr> <tr> <td align="center" colspan="3"> <span id="poison" style="color:#800080;"> </span><br> <span id="barrier" style="color:#008000;"> </span></td> </tr> <tr> <td align="center" colspan="3"> <span id="message1"> </span><br><span id="message2"> </span></td> <td align="center" colspan="2"><span> <hr> </span></td> </tr> <tr> <td align="center" colspan="3"> <span id="message3"> </span><br><span id="message4"> </span></td> <td align="center">通常攻撃(対象選択:<span id="target">敵1</span>) <input type="button" value="変更" style="background-color:#808080;width:50px;" onclick="TargetChange()">:</td> <td align="center"><span> <select name="NormalSkillList" style="background-color:#808080;width:250px;"> <option value="0">技を選択して下さい。</option> <option value="1">2ダメージを与え、2充電する</option> <option value="2">3ダメージを与え、3充電する</option> <option value="3">5ダメージを与え、5充電する</option> <option value="4">7ダメージを与え、7充電する</option> <option value="5">11ダメージを与え、11充電する</option> <option value="6">13ダメージを与え、13充電する</option> <option value="7">17ダメージを与え、17充電する</option> <option value="8">19ダメージを与え、19充電する</option> <option value="9">23ダメージを与え、23充電する</option> <option value="10">29ダメージを与え、29充電する</option> <option value="11">31ダメージを与え、31充電する</option> </select> <input type="button" value="決定" style="background-color:#808080;width:50px;" onclick="NormalSkillSelect()"> </span></td> </tr> <tr> <td align="center" colspan="3"> <span id="message5"> </span><br><span id="message6"> </span></td> <td align="center" colspan="2"><span> <hr> </span></td> </tr> <tr> <td align="center" colspan="3"> <span id="message7"> </span><br><span id="message8"> </span></td> <td align="center"><span>特殊攻撃(全体攻撃):</span></td> <td align="center"><span> <select name="SpecialSkillList" style="background-color:#808080;width:250px;"> <option value="0">技を選択して下さい。</option> <option value="1" style="background-color:#000000;color:#ffff00;">全蓄積エネルギーを放電する</option> <option value="2" style="background-color:#000000;color:#ff0000;">エネルギーを使って回復する</option> <option value="3" style="background-color:#800080;">敵に毒を与え、毒状態にする</option> <option value="4" style="background-color:#008000;">ダメージを半減させる結界を発動する</option> <option value="5" style="background-color:#ffff00;">ランダムダメージを与える</option> <option value="6">プレイヤーの属性を変更する</option> </select> <input type="button" value="決定" style="background-color:#808080;width:50px;" onclick="SpecialSkillSelect()"> </span></td> </tr> <tr> <td align="center" colspan="3"><span id="winlose" style="color:#000000;"> </span></td> <td align="center" colspan="2"><span> <hr> </span></td> </tr> <tr> <td align="center"><span id="ending" style="color:#ff0000;"> </span></td> <td align="center"><span id="score" style="color:#008000;"> </span></td> <td align="center"><span id="reformat" style="color:#0000ff;"> </span></td> <td align="center"><span>メニュー:</span></td> <td align="center"><span> <input type="button" value="最初から始める" style="background-color:#808080;width:300px;" onclick="GameStart()"> </span></td> </tr> <tr> <td align="center" colspan="3"><span id="next"> </span></td> <td align="center"><span> <input type="button" value="次のステージへ/メッセージクリア" style="background-color:#808080;width:300px;" onclick="NextStage()"> </span></td> <td align="center"><span> <input type="button" value="強くてニューゲーム" style="background-color:#808080;width:300px;" onclick="NewGameStart()"> </span></td> </tr> </table> </form> </center> </body> </html> |
var HPenemy1 = 10; // 敵1の初期HP var HPenemy2 = 10; // 敵2の初期HP var HPplayer = 20; // プレイヤーの初期HP var ATKenemy = 0; // 敵の攻撃力を初期化 var ATKplayer = 0; // プレイヤーの攻撃力を初期化 var stage = 1; // ステージ数 var power; // 技の威力 var PoisonCounter = 0; // ポイズンカウンター var BarrierCounter = 0; // バリアカウンター var RandomDamage; // ランダムダメージの数値を格納する変数を宣言 var RandomMax; // ステージ数との積がランダムダメージの上限 var TypeName = new Array("Feuer", "Eis", "Donner"); // 属性名称(0:Feuer, 1:Eis, 2:Donner) var TypeColor = new Array("#ff0000", "#0000ff", "#008000"); // 属性の色(0:赤, 1:青, 2:緑) var TypeBackGroundColor = new Array("#ff00ff", "#00ffff", "#00ff00"); // 属性の色(0:マゼンタ, 1:シアン, 2:ライム) var TypeEnemy1; // 敵1の属性 var TypeEnemy2; // 敵2の属性 var TypePlayer; // プレイヤーの属性 var TypeChange; // 属性変更用の乱数 var TypeEffect; // 属性による補正効果用の乱数 var TypeEffectATK; // 攻撃時の属性による補正効果 var TypeEffectDEF; // 防御時の属性による補正効果 var target = 1; // 攻撃対象(初期状態では敵1) var RankName = new Array("男爵", "子爵", "伯爵", "侯爵", "公爵", "大公", "魔王"); var RankNumber; // 0から6の値をとり、それぞれが上記の爵位に相当する var TurnCounter = 0; // ボス戦のみターン進行をカウントするカウンター var SkillNumber = 0; // 【追加】セレクトメニュー用変数 window.onload = function() { reformat(); TypeChangeEnemy(); TypeChangePlayer(); } function ATKcalc(HPenemy, TypeEnemy){ // 敵の攻撃力を計算する関数(HPenemy, TypeEnemyは仮引数) ATKenemy = 0; // 敵の攻撃力を初期化 if (HPenemy % 2 == 0) { ATKenemy += 2; } // 敵のHPが2の倍数の時、敵の攻撃力が2上昇する。 if (HPenemy % 3 == 0) { ATKenemy += 3; } // 敵のHPが3の倍数の時、敵の攻撃力が3上昇する。 if (stage >= 3 && HPenemy % 5 == 0) { ATKenemy += 5; } // ステージ3以降、敵のHPが5の倍数の時、敵の攻撃力が5上昇する。 if (stage >= 5 && HPenemy % 7 == 0) { ATKenemy += 7; } // ステージ5以降、敵のHPが7の倍数の時、敵の攻撃力が7上昇する。 if (stage >= 50 && HPenemy % 11 == 0) { ATKenemy += 11; } // 中ボス戦及び、最終ボス戦の時、敵のHPが11の倍数の時、敵の攻撃力が11上昇する。 if (stage >= 50 && HPenemy % 13 == 0) { ATKenemy += 13; } // 中ボス戦及び、最終ボス戦の時、敵のHPが13の倍数の時、敵の攻撃力が13上昇する。 if (stage >= 50 && HPenemy % 17 == 0) { ATKenemy += 17; } // 中ボス戦及び、最終ボス戦の時、敵のHPが17の倍数の時、敵の攻撃力が17上昇する。 if (stage >= 50 && HPenemy % 19 == 0) { ATKenemy += 19; } // 中ボス戦及び、最終ボス戦の時、敵のHPが19の倍数の時、敵の攻撃力が19上昇する。 if (stage >= 100 && HPenemy % 23 == 0) { ATKenemy += 23; } // 最終ボス戦時のみ、敵のHPが23の倍数の時、敵の攻撃力が23上昇する。 if (stage >= 100 && HPenemy % 29 == 0) { ATKenemy += 29; } // 最終ボス戦時のみ、敵のHPが29の倍数の時、敵の攻撃力が29上昇する。 if (stage >= 100 && HPenemy % 31 == 0) { ATKenemy += 31; } // 最終ボス戦時のみ、敵のHPが31の倍数の時、敵の攻撃力が31上昇する。 TypeEffect = (TypeEnemy + 3 - TypePlayer) % 3; switch(TypeEffect){ case 0 : TypeEffectDEF = 1; break; case 1 : TypeEffectDEF = 2; break; case 2 : TypeEffectDEF = 0.5; break; default : break; } ATKenemy = parseInt(ATKenemy * TypeEffectDEF); } function BarrierState(){ // 結界を表示する関数 if (BarrierCounter > 0) { $("#barrier").text("結界が発動中(あと " + BarrierCounter + " ターン)"); // バリアカウンターが0以外のとき、結界が発動中であることを表示する。 } else { $("#barrier").text(""); } } function BOSSonly(){ // ボスキャラクターのみが行う行動をまとめた関数 TurnCounter++; // ターンカウンターを進める。 if(TurnCounter % 3 == 0) { // 3ターン毎に、 TypeChange = Math.floor(Math.random() * 2) + 1; // 1~2の変数 TypeEnemy1 = (TypeEnemy1 + TypeChange) % 3; // 属性を変更する $("#TypeEnemy1").css("color", TypeColor[TypeEnemy1]); $("#TypeEnemy1").text(TypeName[TypeEnemy1]); TypeChange = Math.floor(Math.random() * 2) + 1; // 1~2の変数 TypeEnemy2 = (TypeEnemy2 + TypeChange) % 3; // 属性を変更する $("#TypeEnemy2").css("color", TypeColor[TypeEnemy2]); $("#TypeEnemy2").text(TypeName[TypeEnemy2]); $("#message7").text("敵のボスは、自軍全体の属性を変更した。"); } if(TurnCounter % 5 == 0) { // 5ターン毎に、 if(HPenemy2 >= 0) { // 敵2のHPがまだ残っていれば、 HPenemy1 += stage; // ボスキャラクター(敵1)自身の初期HPの10%を回復する。 $("#HPenemy1").text("敵1HP:" + HPenemy1); // 次のステージの敵1のHP $("#message8").text("敵のボスは、自己再生能力により、HPを" + stage + "回復した。"); } else { // 敵2が既に倒れている場合は、 HPenemy2 = stage; // 敵2を中ボス戦ならHP50、最終ボス戦ならHP100で復活させる。 $("#HPenemy2").text("敵2HP:" + HPenemy2); // 次のステージの敵2のHP $("#message8").text("敵のボスは、斃れていた配下を蘇生させた。"); } } } function NextStage(){ // 勝利後のイベント処理をする関数 if (HPenemy1 <= 0 && HPenemy2 <= 0) { // 敵1と敵2のHPが共に0以下ならば、勝利。 $("#winlose").text(""); $("#next").text(""); ATKplayer = 0; // プレイヤーの攻撃力を初期化 $("#ATKplayer").text("全蓄積エネルギー:" + ATKplayer); // 現在の全蓄積エネルギー PoisonCounter = 0; // ポイズンカウンターを0にする BarrierCounter = 0; // バリアカウンターを0にする if (stage < 5 || (stage > 5 && stage < 10)) { stage += 1; // 次のステージへ HPenemy1 = stage * 10; // 次のステージの敵1のHP HPenemy2 = stage * 10; // 次のステージの敵2のHP HPplayer += stage * 20; // HPを加算 $("#stage").text("ステージ:" + stage); $("#HPenemy1").text("敵1HP:" + HPenemy1); // 次のステージの敵1のHP $("#HPenemy2").text("敵2HP:" + HPenemy2); // 次のステージの敵2のHP $("#HPplayer").text("HP:" + HPplayer); TypeChangeEnemy(); // 次のステージへ行く場合は、敵のみ属性を変更。 } else if (stage == 5) { stage = 50; // 中ボス戦のステージへ HPenemy1 = 500; // 中ボスのHP HPenemy2 = 50; // 【変更】中ボス配下の敵2のHPは50。 $("#stage").text("中ボス戦"); $("#HPenemy1").text("敵1HP:" + HPenemy1); $("#HPenemy2").text("敵2HP:" + HPenemy2); // 【追加】 TypeChangeEnemy(); // 次のステージへ行く場合は、敵のみ属性を変更。 } else if (stage == 10) { stage = 100; // 最終ボス戦のステージへ HPenemy1 = 1000; // 最終ボスのHP HPenemy2 = 100; // 【変更】最終ボス配下の敵2のHPは100。 $("#stage").text("最終ボス戦"); $("#HPenemy1").text("敵1HP:" + HPenemy1); $("#HPenemy2").text("敵2HP:" + HPenemy2); // 【追加】 TypeChangeEnemy(); // 次のステージへ行く場合は、敵のみ属性を変更。 } else if (stage == 50) { stage = 6; // 中ボスを倒した後は、ステージ6へ HPenemy1 = stage * 10; // 次のステージの敵1のHP HPenemy2 = stage * 10; // 次のステージの敵2のHP HPplayer += stage * 20; // HPを加算 $("#stage").text("ステージ:" + stage); $("#HPenemy1").text("敵1HP:" + HPenemy1); // 次のステージの敵1のHP $("#HPenemy2").text("敵2HP:" + HPenemy2); // 次のステージの敵2のHP $("#HPplayer").text("HP:" + HPplayer); TypeChangeEnemy(); // 次のステージへ行く場合は、敵のみ属性を変更。 TurnCounter = 0; // 【追加】中ボス戦終了時に、ターンカウンターを停止する。 } else { $("#ending").text("祝!ゲームクリア"); $("#score").text("スコア:" + HPplayer); reformat(); $("#reformat").text(RankName[RankNumber] + "に転生した!"); // エンディング $("#next").text("「最初から始める」? or 「強くてニューゲーム」?"); TurnCounter = 0; // 【追加】最終ボス戦終了時に、ターンカウンターを停止する。 } } TurnStart(); $("#winlose").css("color","#000000"); // 色を黒に戻す } function PoisonState(){ // 毒状態を表示する関数 if (PoisonCounter > 0) { $("#poison").text("敵は、毒状態(あと " + PoisonCounter + " ターン)"); // ポイズンカウンターが0以外のとき、敵のHPが残っていれば、毒状態であることを表示する。 } else { $("#poison").text(""); } } function reformat(){ // クリア時に転生し、爵位をリフォーマットする関数 RankNumber = parseInt(Math.sqrt(HPplayer / 500)); if(RankNumber > 6){ RankNumber = 6; } // RankNumberが6以上の値をとる場合は、全て6として扱う。 $("#rank").text(RankName[RankNumber]); } function TurnStart(){ // ターン開始時の処理をする関数 $("#message1").text(""); $("#message2").text(""); $("#message3").text(""); $("#message4").text(""); $("#message5").text(""); $("#message6").text(""); $("#message7").text(""); // 【追加】 $("#message8").text(""); // 【追加】 if (BarrierCounter > 0 || PoisonCounter > 0) { if (BarrierCounter > PoisonCounter){ document.bgColor = "#008000"; // 背景を緑色にする } else { document.bgColor = "#800080"; // 背景を紫色にする } } else { document.bgColor = "#c0c0c0"; // 背景を銀色に戻す } PoisonState(); BarrierState(); } // メイン関数 function main(){ if (HPenemy1 <= 0 && HPenemy2 <= 0) { // 敵1と敵2のHPが共に0以下ならば、勝利。 $("#HPenemy1").text("敵HP1:0"); // 敵1のHP表示を0にする。 $("#HPenemy2").text("敵HP2:0"); // 敵2のHP表示を0にする。 $("#winlose").css("color","#ff0000"); // 勝利メッセージの色を赤にする $("#winlose").text("You win!"); // 勝利メッセージ $("#next").text("「次のステージへ」ボタンを押してください。"); } else { if (HPenemy1 > 0) { ATKcalc(HPenemy1, TypeEnemy1); if (BarrierCounter > 0) { ATKenemy = parseInt( ATKenemy / 2 ); // 敵の攻撃力を半減させる。 // JavaScriptでは、自動で実数化されてしまうので、整数化する。 } HPplayer -= ATKenemy; // 敵の攻撃によるダメージを受ける。 $("#HPplayer").text("HP:" + HPplayer); $("#message3").text("敵1の攻撃!プレイヤーは " + ATKenemy + " のダメージを受けた"); if (PoisonCounter > 0) { HPenemy1 -= ATKenemy; // ポイズンカウンターが0以外の場合は、敵1は毒によるダメージを受ける。 $("#HPenemy1").text("敵1HP:" + HPenemy1); $("#message4").text("敵1は毒により " + ATKenemy + " のダメージを受けた"); // 敵1が毒によるダメージを受けた場合のメッセージ } else { HPenemy1 += ATKenemy; // ポイズンカウンターが0の場合は敵1はその数値分HPを回復する。 $("#HPenemy1").text("敵1HP:" + HPenemy1); $("#message4").text("敵1はHPを " + ATKenemy + " 回復した"); // 敵1がHPを回復した場合のメッセージ } } else { target = 2; // 通常攻撃の対象を敵2に強制変更 $("#target").text("敵2"); $("#HPenemy1").text("敵HP1:0"); // 敵1のHP表示を0にする。 $("#message3").text("敵1は斃れた。"); } if (HPenemy2 > 0) { ATKcalc(HPenemy2, TypeEnemy2); if (BarrierCounter > 0) { ATKenemy = parseInt( ATKenemy / 2 ); // 敵の攻撃力を半減させる。 // JavaScriptでは、自動で実数化されてしまうので、整数化する。 } HPplayer -= ATKenemy; // 敵の攻撃によるダメージを受ける。 $("#HPplayer").text("HP:" + HPplayer); $("#message5").text("敵2の攻撃!プレイヤーは " + ATKenemy + " のダメージを受けた"); if (PoisonCounter > 0) { HPenemy2 -= ATKenemy; // ポイズンカウンターが0以外の場合は、敵1は毒によるダメージを受ける。 $("#HPenemy2").text("敵2HP:" + HPenemy2); $("#message6").text("敵2は毒により " + ATKenemy + " のダメージを受けた"); // 敵1が毒によるダメージを受けた場合のメッセージ } else { HPenemy2 += ATKenemy; // ポイズンカウンターが0の場合は敵1はその数値分HPを回復する。 $("#HPenemy2").text("敵2HP:" + HPenemy2); $("#message6").text("敵2はHPを " + ATKenemy + " 回復した"); // 敵1がHPを回復した場合のメッセージ } } else { target = 1; // 通常攻撃の対象を敵1に強制変更 $("#target").text("敵1"); $("#HPenemy2").text("敵HP2:0"); // 敵2のHP表示を0にする。 $("#message5").text("敵2は斃れた。"); } if (BarrierCounter > 0) { BarrierCounter -= 1; // バリアカウンターを1減らす } if (PoisonCounter > 0) { PoisonCounter -= 1; // ポイズンカウンターを1減らす } if (HPenemy1 <= 0) { target = 2; // 通常攻撃の対象を敵2に強制変更 $("#target").text("敵2"); $("#HPenemy1").text("敵HP1:0"); // 敵1のHP表示を0にする。 $("#message3").text("敵1は斃れた。"); } // 敵1が毒のダメージで力尽きた場合の処理 if (HPenemy2 <= 0) { target = 1; // 通常攻撃の対象を敵1に強制変更 $("#target").text("敵1"); $("#HPenemy2").text("敵HP2:0"); // 敵2のHP表示を0にする。 $("#message5").text("敵2は斃れた。"); } // 敵2が毒のダメージで力尽きた場合の処理 if (HPenemy1 <= 0 && HPenemy2 <= 0) { // 敵1と敵2のHPが共に0以下ならば、勝利。 $("#winlose").css("color","#800080"); // 勝利メッセージの色を紫にする $("#winlose").text("You win!"); // 勝利メッセージ $("#next").text("「次のステージへ」ボタンを押してください。"); } // 敵が毒のダメージで力尽きた場合にも、 // 戦闘を継続させずに、次のステージへ行く為の処理 if (stage > 10 && HPenemy1 > 0) { // 【追加】ボス戦で、ボスキャラクター(敵1)のHPが残っている時、 BOSSonly(); // 【追加】ターン終了時に、ボスキャラクター特有の行動を行う。 } if (HPplayer <= 0) { // プレイヤーのHPが0以下ならば、敗北。 $("#HPplayer").text("HP:0"); $("#winlose").css("color","#0000ff"); // 敗北メッセージの色を青にする $("#winlose").text("You lose!"); // 敗北メッセージ $("#next").text("もう一回?(Yes→「最初から始める」)"); } } } // 通常攻撃(コア) function NormalAttack(power){ if (HPplayer > 0 && (HPenemy1 > 0 || HPenemy2 > 0) && stage <= 100){ // プレイヤーと敵1と敵2のHPが全て正、かつステージ100以下の場合 TurnStart(); if(target == 1) { TypeEffect = (TypePlayer + 3 - TypeEnemy1) % 3; switch(TypeEffect){ case 0 : TypeEffectATK = 1; break; case 1 : TypeEffectATK = 2; break; case 2 : TypeEffectATK = 0.5; break; default : break; } power = parseInt(power * TypeEffectATK); HPenemy1 -= power; // 技の威力だけダメ―ジを与え、 ATKplayer += power; // その数値分充電する。 $("#HPenemy1").text("敵1HP:" + HPenemy1); $("#ATKplayer").text("全蓄積エネルギー:" + ATKplayer); $("#message1").text("敵1に " + power + " のダメージを与えた"); $("#message2").text("エネルギーを " + power + " 充電した"); } else { TypeEffect = (TypePlayer + 3 - TypeEnemy2) % 3; switch(TypeEffect){ case 0 : TypeEffectATK = 1; break; case 1 : TypeEffectATK = 2; break; case 2 : TypeEffectATK = 0.5; break; default : break; } power = parseInt(power * TypeEffectATK); HPenemy2 -= power; // 技の威力だけダメ―ジを与え、 ATKplayer += power; // その数値分充電する。 $("#HPenemy2").text("敵2HP:" + HPenemy2); $("#ATKplayer").text("全蓄積エネルギー:" + ATKplayer); $("#message1").text("敵2に " + power + " のダメージを与えた"); $("#message2").text("エネルギーを " + power + " 充電した"); } main(); } } // 特殊攻撃(全体攻撃) function special1(){ if (HPplayer > 0 && (HPenemy1 > 0 || HPenemy2 > 0) && stage <= 100){ // プレイヤーと敵1と敵2のHPが全て正、かつステージ100以下の場合 if (ATKplayer > 0){ TurnStart(); document.bgColor = "#ffff00"; // 背景を黄色にする HPenemy1 -= ATKplayer; // 敵1へのダメージ HPenemy2 -= ATKplayer; // 敵2へのダメージ // 全蓄積エネルギーを放電する(全体攻撃) $("#HPenemy1").text("敵1HP:" + HPenemy1); // 敵1のHP表示 $("#HPenemy2").text("敵2HP:" + HPenemy2); // 敵2のHP表示 $("#ATKplayer").text("全蓄積エネルギー:" + 0); $("#message1").text("蓄積されていた全エネルギーを放電した"); $("#message2").text("敵全体に " + ATKplayer + " のダメージを与えた"); ATKplayer = 0; // プレイヤーの攻撃力を初期化 main(); } else { alert("エネルギーがないと発動できません。"); } } } function special2(){ if (HPplayer > 0 && (HPenemy1 > 0 || HPenemy2 > 0) && stage <= 100){ // プレイヤーと敵1と敵2のHPが全て正、かつステージ100以下の場合 if (ATKplayer > 0){ TurnStart(); document.bgColor = "#ff0000"; // 背景を赤にする HPplayer += ATKplayer; // エネルギーを使って回復する $("#HPplayer").text("HP:" + HPplayer); $("#ATKplayer").text("全蓄積エネルギー:" + 0); $("#message1").text("蓄積されていた全エネルギーを吸収した"); $("#message2").text("プレイヤーはHPを " + ATKplayer + " 回復した"); ATKplayer = 0; // プレイヤーの攻撃力を初期化 main(); } else { alert("エネルギーがないと発動できません。"); } } } function special3(){ if (HPplayer > 0 && (HPenemy1 > 0 || HPenemy2 > 0) && stage <= 100){ // プレイヤーと敵1と敵2のHPが全て正、かつステージ100以下の場合 TurnStart(); document.bgColor = "#800080"; // 背景を紫色にする PoisonCounter = stage + 1; // ポイズンカウンターにはステージ数+1を代入 $("#poison").text("敵は、毒状態(あと " + PoisonCounter + " ターン)"); $("#message1").text("敵全体を毒状態にした"); main(); } } function special4(){ if (HPplayer > 0 && (HPenemy1 > 0 || HPenemy2 > 0) && stage <= 100){ // プレイヤーと敵1と敵2のHPが全て正、かつステージ100以下の場合 TurnStart(); document.bgColor = "#008000"; // 背景を緑色にする BarrierCounter = stage + 1; // バリアカウンターにはステージ数+1を代入 $("#barrier").text("結界が発動中(あと " + BarrierCounter + " ターン)"); $("#message1").text("ダメージを半減させる結界を発動した"); main(); } } function special5(){ if (HPplayer > 0 && (HPenemy1 > 0 || HPenemy2 > 0) && stage <= 10){ // プレイヤーと敵1と敵2のHPが全て正、かつステージ10以下の場合 TurnStart(); document.bgColor = "#ffff00"; // 背景を黄色にする RandomMax = Math.floor(Math.random() * 11); // RandomMaxは、0から10の値をとる。 if (RandomMax > 0) { // RandomMaxが0以外の時、 RandomDamage = Math.floor(Math.random() * (RandomMax * stage + 1)); // ランダムダメージの威力を決定 HPenemy1 -= RandomDamage; // 敵1へのダメージ HPenemy2 -= RandomDamage; // 敵2へのダメージ $("#HPenemy1").text("敵1HP:" + HPenemy1); // 敵1のHP表示 $("#HPenemy2").text("敵2HP:" + HPenemy2); // 敵2のHP表示 $("#message1").text("ランダムダメージを与える攻撃!"); $("#message2").text("敵全体に " + RandomDamage + " のダメージを与えた"); // ランダムダメージの威力だけダメ―ジを与える(全体攻撃) } else { // RandomMaxが0の時、敵は攻撃を回避する(0での剰余算を避ける)。 $("#message1").text("ランダムダメージを与える攻撃!"); $("#message2").text("敵は攻撃を回避した。"); } main(); } else { alert("中ボス戦・最終ボス戦では、この技を選択することができません。"); } } function special6(){ if (HPplayer > 0 && (HPenemy1 > 0 || HPenemy2 > 0) && stage <= 100){ // プレイヤーと敵1と敵2のHPが全て正、かつステージ100以下の場合 TurnStart(); TypeChange = Math.floor(Math.random() * 2) + 1; // 1~2の変数 TypePlayer = (TypePlayer + TypeChange) % 3; // 属性を変更する document.bgColor = TypeBackGroundColor[TypePlayer]; // 背景を属性の色にする $("#TypePlayer").css("color", TypeColor[TypePlayer]); $("#TypePlayer").text(TypeName[TypePlayer]); $("#message1").text("属性を" + TypeName[TypePlayer] + "に変更した。"); main(); } } function TargetChange(){ if (HPplayer > 0 && (HPenemy1 > 0 || HPenemy2 > 0) && stage <= 100){ // 【変更】プレイヤーと敵1と敵2のHPが全て正、かつステージ100以下の場合 TurnStart(); if(target == 1) { if(HPenemy2 > 0){ target = 2; $("#target").text("敵2"); $("#message1").text("通常攻撃の対象を敵2に変更した。"); } else { alert("敵2は既に斃されています。"); } } else { if(HPenemy1 > 0){ target = 1; $("#target").text("敵1"); $("#message1").text("通常攻撃の対象を敵1に変更した。"); } else { alert("敵1は既に斃されています。"); } } } } // 通常攻撃 function two() { NormalAttack(2); } function three() { NormalAttack(3); } function five(){ if (stage >= 3) { NormalAttack(5); } else { alert("ステージ数3未満では、この技を選択することができません。"); } } function seven(){ if (stage >= 5){ NormalAttack(7); } else { alert("ステージ数5未満では、この技を選択することができません。"); } } function eleven(){ if (stage >= 50){ NormalAttack(11); } else { alert("中ボス戦・最終ボス戦以外では、この技を選択することができません。"); } } function thirteen(){ if (stage >= 50){ NormalAttack(13); } else { alert("中ボス戦・最終ボス戦以外では、この技を選択することができません。"); } } function seventeen(){ if (stage >= 50){ NormalAttack(17); } else { alert("中ボス戦・最終ボス戦以外では、この技を選択することができません。"); } } function nineteen(){ if (stage >= 50){ NormalAttack(19); } else { alert("中ボス戦・最終ボス戦以外では、この技を選択することができません。"); } } function twentythree(){ if (stage >= 100){ NormalAttack(23); } else { alert("最終ボス戦以外では、この技を選択することができません。"); } } function twentynine(){ if (stage >= 100){ NormalAttack(29); } else { alert("最終ボス戦以外では、この技を選択することができません。"); } } function thirtyone(){ if (stage >= 100){ NormalAttack(31); } else { alert("最終ボス戦以外では、この技を選択することができません。"); } } // 最初から始める function GameStart(){ if ((HPplayer <= 0) || (stage == 100 && HPenemy1 <= 0)){ // ゲームオーバー時または、全てのステージクリア後にのみ、選択可能。 $("#winlose").text(""); ATKplayer = 0; // プレイヤーの攻撃力を初期化 $("#ATKplayer").text("全蓄積エネルギー:" + ATKplayer); // 現在の全蓄積エネルギー PoisonCounter = 0; // ポイズンカウンターを0にする BarrierCounter = 0; // バリアカウンターを0にする HPenemy1 = 10; // 敵1の初期HP HPenemy2 = 10; // 敵2の初期HP $("#HPenemy1").text("敵1HP:" + HPenemy1); // 敵1のHP表示 $("#HPenemy2").text("敵2HP:" + HPenemy2); // 敵2のHP表示 HPplayer = 20; // プレイヤーの初期HPへ stage = 1; // ステージ1へ $("#HPplayer").text("HP:" + HPplayer); $("#stage").text("ステージ:" + stage); TypeChangeEnemy(); TypeChangePlayer(); } else { alert("ゲームオーバー時または、全てのステージクリア後にのみ、選択可能。"); } TurnStart(); $("#winlose").css("color","#000000"); // 色を黒に戻す $("#ending").text(""); $("#score").text(""); $("#reformat").text(""); $("#next").text(""); } // 強くてニューゲーム function NewGameStart(){ if (stage == 100 && HPenemy1 <= 0){ // 全てのステージクリア後にのみ、選択可能。 $("#winlose").text(""); ATKplayer = 0; // プレイヤーの攻撃力を初期化 $("#ATKplayer").text("全蓄積エネルギー:" + ATKplayer); // 現在の全蓄積エネルギー PoisonCounter = 0; // ポイズンカウンターを0にする BarrierCounter = 0; // バリアカウンターを0にする HPenemy1 = 10; // 敵1の初期HP HPenemy2 = 10; // 敵2の初期HP $("#HPenemy1").text("敵1HP:" + HPenemy1); // 敵1のHP表示 $("#HPenemy2").text("敵2HP:" + HPenemy2); // 敵2のHP表示 HPplayer += 20; // クリア後のプレイヤーのHPに20を加算 stage = 1; // ステージ1へ $("#HPplayer").text("HP:" + HPplayer); $("#stage").text("ステージ:" + stage); TypeChangeEnemy(); // 強くてニューゲームの場合は、敵のみ。 } else { alert("全てのステージクリア後にのみ、選択可能。"); } TurnStart(); $("#winlose").css("color","#000000"); // 色を黒に戻す $("#ending").text(""); $("#score").text(""); $("#reformat").text(""); $("#next").text(""); } function TypeChangeEnemy(){ TypeEnemy1 = parseInt(Math.random() * 3); TypeEnemy2 = parseInt(Math.random() * 3); $("#TypeEnemy1").css("color", TypeColor[TypeEnemy1]); $("#TypeEnemy2").css("color", TypeColor[TypeEnemy2]); $("#TypeEnemy1").text(TypeName[TypeEnemy1]); $("#TypeEnemy2").text(TypeName[TypeEnemy2]); } function TypeChangePlayer(){ TypePlayer = Math.floor(Math.random() * 3); $("#TypePlayer").css("color", TypeColor[TypePlayer]); $("#TypePlayer").text(TypeName[TypePlayer]); } function NormalSkillSelect(){ SkillNumber = parseInt(document.jsrpg.NormalSkillList.selectedIndex); switch(SkillNumber){ case 0 : break; case 1 : two(); break; case 2 : three(); break; case 3 : five(); break; case 4 : seven(); break; case 5 : eleven(); break; case 6 : thirteen(); break; case 7 : seventeen(); break; case 8 : nineteen(); break; case 9 : twentythree(); break; case 10 : twentynine(); break; case 11 : thirtyone(); break; default : break; } } function SpecialSkillSelect(){ SkillNumber = parseInt(document.jsrpg.SpecialSkillList.selectedIndex); switch(SkillNumber){ case 0 : break; case 1 : special1(); break; case 2 : special2(); break; case 3 : special3(); break; case 4 : special4(); break; case 5 : special5(); break; case 6 : special6(); break; default : break; } } |
(解説)