JavaScriptによるRPG制作 Volume.4

以前、インターネット上の動画を参考にして、
HSPで製作した自作RPGゲームを
JavaScriptとjQueryで書き直してみることにした。
ジャンル的には、シミュレーションRPGに近いと思われる。
他サイトへの無断転載及び、外部サイトから
このページへの直接リンクをすることは、禁止する。

ソースコードは残っているものの、かなり前のもので、
何を作ったか記憶が曖昧なので、解析する必要がある。

24 25 26 27




第24講. 複数の敵を想定する

jsrpg024.html(旧版)

<!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>

jsrpg024.html(新版)



jsrpg024.js(旧版)


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]);
}

jsrpg024.js(新版)


(解説) 第22講で属性システムを導入し、第23講でそれを実装したが、
常にプレイヤーが有利になる様に、属性を選んでいけば、簡単に勝つことができ、
そこに運の要素が絡む余地は極めて少ない。しかし、相手が複数存在し、
その属性が異なれば、属性を変更する余地が生じる可能性が高い。

通常攻撃は、攻撃対象を選択する必要があるが、特殊攻撃は全体攻撃とした。
攻撃対象を変更する技は、特殊攻撃7として実装しているが、ターン消費はしない。
また、敵の一方が斃れた場合、他方が自動的に攻撃対象に選択されるようになっている他、
既に斃れている敵は攻撃対象に選択できず、アラートが出るようにした。
但し、中ボス戦及び最終ボス戦は、敵は1体だけである。
また、特殊攻撃1と特殊攻撃2はエネルギーがないときは発動できないように修正を施した。




第25講. 爵位システムの導入

jsrpg025.html(旧版)

<!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>

jsrpg025.html(新版)



jsrpg025.js(旧版)

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]);
}

jsrpg025.js(新版)


(解説) 第21講の強くてニューゲームでは、クリア後のHPを引き継いで、
何周もできるように実装したが、単調になる為、全ステージをクリアする度に、
その時点でのHPに応じて、爵位が授与されるようにした。

さらに、第24講で複数の敵を想定したが、ステージ1の時点で、
敵の属性の組み合わせによっては、突破することが難しくなる場合がある。
その為、プレイヤー側のHPを2倍にすることでゲームバランスを調整した。
また、攻撃対象を選択するコマンドは、ターンを消費しないので、
特殊攻撃7としてではなく、単に攻撃対象の変更とし、
位置を通常攻撃の横に置き、インターフェースも変更した。




第26講. ボスキャラクターの効果

jsrpg026.html(旧版)

<!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>

jsrpg026.html(新版)



jsrpg026.js(旧版)

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]);
}

jsrpg026.js(新版)


(解説) 




第27講.

jsrpg027.html(旧版)

<!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>

jsrpg027.html(新版)



jsrpg027.js(旧版)

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;
  }
}

jsrpg027.js(新版)


(解説) 




Shadow Academy トップへ戻る

inserted by FC2 system