JavaScript 都道府県対抗 戦国シミュレーションゲーム(2)の続きです。プレイヤーの県のターンの処理を実装します。
Contents
戦闘の処理
プレイヤーの県のターンの処理を実装するまえに必要な処理を先に実装しておきます。
戦闘は県庁(城)の外でおこなわれるものと県庁のなかでおこなわれるものがあります。侵攻軍が県庁内に突入する戦闘の場合は守備側が3倍有利とします。
「3倍」の根拠ですが、「攻撃三倍の法則」があります。これは戦闘において有効な攻撃を行うためには相手の3倍の兵力が必要となるというものです。「攻撃側の兵力が劣勢である場合でも戦史において勝利した事例も少なくないために、この法則の正確性については疑問がもたれている」とのことですが、固いことを言うのはやめましょう。所詮ネタゲーです。
Invaderクラスの定義
侵攻軍または援軍を示すInvaderクラスを定義します。
1 2 3 4 5 6 7 |
class Invader { constructor(ownerName, heisCount, foodsCount){ this.OwnerName = ownerName; this.HeisCount = heisCount; this.FoodsCount = foodsCount; } } |
県庁外の戦闘処理
battle関数は県庁外の戦闘処理をおこないます。この関数の引数はKenオブジェクトまたはInvaderオブジェクトになります。どちらにもHeisCountプロパティが存在します。
1 2 3 4 5 6 7 8 9 10 11 12 |
function battle(a, b){ if(Math.random() < 0.5){ a.HeisCount -= unitOfHeis; if(a.HeisCount < 0) a.HeisCount = 0; } else { b.HeisCount -= unitOfHeis; if(b.HeisCount < 0) b.HeisCount = 0; } } |
県庁に突入したときの戦闘処理
rush関数は県庁内に突入する戦闘処理をおこないます。ken側が3倍有利です。
1 2 3 4 5 6 7 8 9 10 11 12 |
function rush(ken, invader){ if(Math.random() < 0.25){ ken.HeisCount -= unitOfHeis; if(ken.HeisCount < 0) ken.HeisCount = 0; } else { invader.HeisCount -= unitOfHeis; if(invader.HeisCount < 0) invader.HeisCount = 0; } } |
侵攻軍同士の戦闘
自分の県にターンが回ってきたときに自県は侵攻されていて、しかもそれが複数の部隊によるものの場合、侵攻軍同士の戦闘がおきます。また侵攻軍の大名が同じ場合は合流の処理がおこなわれます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 |
async function battleBetweenInvaders(ken){ if(ken.Invaders.length >= 2){ playNoticeSound(); // 侵攻軍同士の戦闘がおきるまえにとりあえずメッセージを出しておく await showMessage([`ここは${ken.KenName}庁前`,], 1000); let invader = ken.Invaders.shift(); // ken.Invaders配列の先頭から要素を取り出して評価する。配列が空になるまで繰り返す // OwnerNameが同じなら援軍なので合流させる。異なるなら敵対勢力なので先頭を発生させる // もし戦闘の当事者の一方がプレイヤーであるなら結果だけでなく途中経過も表示する while(ken.Invaders.length > 0){ const invader2 = ken.Invaders.shift(); if(invader.OwnerName == invader2.OwnerName){ invader.HeisCount += invader2.HeisCount; invader.FoodsCount += invader2.FoodsCount; if(invader.OwnerName != ken.OwnerName) await showMessage([`侵攻軍に${invader.OwnerName}軍の援軍が合流しました`,], 2000); } else { await showMessage([`${ken.KenName}に侵攻した${invader.OwnerName}軍${invader2.OwnerName}軍のあいだで戦闘が発生しました`,], 1000); if(invader.OwnerName == playerOwnerName || invader2.OwnerName == playerOwnerName) playFightSound(); else playFightSound(2000); await showMessage([`戦闘中`,], 2000); while(true){ if(invader.OwnerName == playerOwnerName) await showMessage([`自軍 ${invader.HeisCount.toLocaleString()} 敵軍(${invader2.OwnerName}軍) ${invader2.HeisCount.toLocaleString()}`], 1000); if(invader2.OwnerName == playerOwnerName) await showMessage([`自軍 ${invader2.HeisCount.toLocaleString()} 敵軍(${invader.OwnerName}軍) ${invader.HeisCount.toLocaleString()}`], 1000); if(invader.HeisCount == 0 || invader2.HeisCount == 0) break; battle(invader, invader2); } stopFightSound(); // 戦闘の結果を表示するとともに勝った側は負けた側の兵糧を奪取する if(invader.HeisCount > 0){ invader.FoodsCount += invader2.FoodsCount; playNoticeSound(); await showMessage([`${invader.OwnerName}軍の勝利です`,], 1000); } else { invader2.FoodsCount += invader.FoodsCount; invader = invader2; playNoticeSound(); await showMessage([`${invader2.OwnerName}軍の勝利です`,], 1000); } } } // 残ったinvaderについてken.OwnerName == invader.OwnerNameであるならそれは援軍である // この場合は県庁内に兵力と兵糧を県庁内に追加する // そうでない場合は空になったken.Invaders配列にinvaderを追加する if(ken.OwnerName != invader.OwnerName){ ken.Invaders.push(invader); } else { ken.HeisCount += invader.HeisCount; ken.FoodsCount += invader.FoodsCount; showCurKenInformation(ken); playNoticeSound(); await showMessage([`${ken.KenName}庁に${invader.OwnerName}の援軍が到着しました`,], 2000); } } } |
侵攻されていない自分の県のターン
自分の県にターンが回ってきたときの処理を示します。
自分の県にターンが回ってきたときは他の県から侵攻されている場合とそうでない場合があります。そうでない場合は[開発], [徴兵], [調査], [侵攻/移動]ボタンを表示してプレイヤーに行動選択をさせます。侵攻されている場合は[静観], [敵の状態を表示], [決死の全軍突撃]のなかから行動選択させます。
自分の県にターンが回ってきたときに援軍がくる場合があります。
ken.Invaders.length == 1 で ken.Invaders[0].OwnerName が playerOwnerNameである場合です。この段階ではken.Invaders.lengthは0か1のどちらかです(この関数が呼び出される前にbattleBetweenInvaders関数によってken.Invaders.lengthは0か1のどちらかになるため)。
援軍の合流
援軍が存在する場合は合流させる処理を示します。
1 2 3 4 5 6 7 8 9 10 |
async function joinPlayersReinforcements(ken){ if(ken.Invaders.length > 0 && ken.Invaders[0].OwnerName == playerOwnerName){ const invader = ken.Invaders.shift(); playNoticeSound(); await showMessage([`${invader.OwnerName}軍の援軍${invader.HeisCount.toLocaleString()}人が合流しました`], 2000); ken.HeisCount += invader.HeisCount; ken.FoodsCount += invader.FoodsCount; showCurKenInformation(ken); } } |
開発/徴兵の選択時
[開発]をクリックしたときの処理を示します。ken.Valueをインクリメントしてメッセージを表示します。最後にresolve(”)を実行することで待機状態になっているループを再開させます。
1 2 3 4 5 6 7 8 9 |
async function onclickDevelopment(ken, resolve){ ken.Value += 1; $actions.style.display = 'none'; // コマンドが選択されたら選択肢が表示されている要素は非表示にする playNoticeSound(); await showMessage(['開発しました。次回の収穫量がアップしました'], 0, true); $currentKenInformation.style.display = 'block'; resolve(''); } |
[徴兵]をクリックしたときの処理を示します。ken.HeisCountをunitOfHeis増やしてメッセージを表示します。
1 2 3 4 5 6 7 8 9 |
async function onclickConscription(ken, resolve){ ken.HeisCount += unitOfHeis; $actions.style.display = 'none'; playNoticeSound(); await showMessage(['徴兵しました。兵数がアップしました。'], 0, true); $currentKenInformation.style.display = 'block'; resolve(''); } |
調査の選択時
[調査]をクリックしたときの処理を示します。どの県を調べるのかを選択するボタンを表示させ、クリックしたらその県の状態を表示します。これは選択してもゲームループは待機したままです。侵攻先を考えるときに活用してください。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 |
function onclickResearch(){ playNoticeSound(); $actions.style.display = 'none'; $currentKenInformation.style.display = 'none'; $selectKen.style.display = 'block'; document.getElementById('return-from-select-ken').onclick = () => { playNoticeSound(); $selectKen.style.display = 'none'; $actions.style.display = 'block'; $currentKenInformation.style.display = 'block'; } for(let i=1; i<=7; i++){ document.getElementById(`btn-region-${i}`).onclick = () => { playNoticeSound(); $selectKen.style.display = 'none'; const $selectKenX = document.getElementById(`select-ken-${i}`); $selectKenX.style.display = 'block'; document.getElementById(`return-from-select-ken-${i}`).onclick = () => { playNoticeSound(); $selectKenX.style.display = 'none'; $selectKen.style.display = 'block'; } } } for(let i = 0; i < 47; i++){ document.getElementById(`btn-ken-${i+1}`).onclick = () => { playNoticeSound(); const kenName = document.getElementById(`btn-ken-${i+1}`).innerHTML; const ken = kens.find(_ => _.KenName == kenName); let texts = []; let count = 0; for(let i = 0; i < ken.Invaders.length; i++){ if(ken.Invaders[i].OwnerName != ken.OwnerName) texts.push(`${ken.Invaders[i].OwnerName}軍(${ken.Invaders[i].HeisCount.toLocaleString()})名`); else count += Number(ken.Invaders[i].HeisCount); } let invadersText = 'どこからも侵攻されていません。'; if(ken.Invaders.length > 0) invadersText = texts.join(', ') + ' から侵攻されています。'; if(count > 0) invadersText += `援軍 ${count.toLocaleString()}人が派遣されようとしています。`; const html = ` <div class = "inner"> <p>県名:${ken.KenName}</p> <p>大名:${ken.OwnerName} 氏</p> <p>兵数:${ken.HeisCount.toLocaleString()}</p> <p>兵糧:${ken.FoodsCount.toLocaleString()}</p> <p>土地:${ken.Value.toLocaleString()}</p> <p>${invadersText}</p> <button id = "btn-hide-select-ken-information" class = "buttons">戻る</button> </div> `; const $selectKenInformation = document.getElementById('select-ken-information'); $selectKenInformation.innerHTML = html; $selectKenInformation.style.display = 'block'; document.getElementById('btn-hide-select-ken-information').onclick = () => { playNoticeSound(); $selectKenInformation.style.display = 'none'; } } } } |
侵攻の選択時
侵攻の選択時の処理を示します。侵攻をするときはどこへ?どれだけの人数と兵糧をもっていくのか?を指定しなければなりません。それを設定するためのHeisFoodsクラスを定義します。
コンストラクタの引数は最大の兵数と兵糧です。
1 2 3 4 5 6 7 8 |
class HeisFoods { constructor(maxHeisCount, maxFoodsCount, heisCount, foodsCount){ this.HeisCount = 0; this.FoodsCount = 0; this.MaxHeisCount = maxHeisCount; this.MaxFoodsCount = maxFoodsCount; } } |
selectHeisFoods関数は侵攻に動員する兵数と兵糧数を設定します。
[+10,000], [+1,000], [-10,000], [-1,000], [確定], [キャンセル]というボタンをもつ要素を表示させて兵数と兵糧を設定します。同じ要素を兵数の設定と兵糧の設定で使い回すのです。現在どちらの設定をしているのかを区別できるように変数stepを定義しています。1なら兵数、2なら兵糧です。step == 2でOKがクリックされたら’ok’を返して動員する兵員と兵糧が確定します。キャンセルがクリックされたらひとつ前の状態にもどります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 |
async function selectHeisFoods(heisFoods){ const $selectCount = document.getElementById('select-count'); const $selectCountNavi = document.getElementById('select-count-navi'); const ret = await new Promise(resolve => { let step = 1; function showHeisCount(){ if(heisFoods.HeisCount > heisFoods.MaxHeisCount) heisFoods.HeisCount = heisFoods.MaxHeisCount; if(heisFoods.HeisCount < 0) heisFoods.HeisCount = 0; playNoticeSound(); document.getElementById('select-count-value').innerHTML = heisFoods.HeisCount.toLocaleString() + '人'; } function showFoodsCount(){ if(heisFoods.FoodsCount > heisFoods.MaxFoodsCount) heisFoods.FoodsCount = heisFoods.MaxFoodsCount; if(heisFoods.FoodsCount < 0) heisFoods.FoodsCount = 0; playNoticeSound(); document.getElementById('select-count-value').innerHTML = heisFoods.FoodsCount.toLocaleString() + '俵'; } showHeisCount(); document.getElementById('btn-select-count-ok').onclick = () => { playNoticeSound(); if(step == 1){ step = 2; $selectCountNavi.innerHTML = '持っていく兵糧を指定してください'; showFoodsCount(); } else if(step == 2){ $selectCount.style.display = 'none'; resolve('ok'); } } document.getElementById('btn-select-count-cancel').onclick = () => { playNoticeSound(); if(step == 1){ resolve('cancel'); } else if(step == 2){ step = 1; $selectCountNavi.innerHTML = '侵攻に動員する職員数を指定してください'; showHeisCount(); } } document.getElementById('btn-select-count-plus-10k').onclick = () => { if(step == 1){ heisFoods.HeisCount += 10000; showHeisCount(); } if(step == 2){ heisFoods.FoodsCount += 10000; showFoodsCount() } } document.getElementById('btn-select-count-plus-1k').onclick = () => { if(step == 1){ heisFoods.HeisCount += 1000; showHeisCount(); } if(step == 2){ heisFoods.FoodsCount += 1000; showFoodsCount() } } document.getElementById('btn-select-count-minus-10k').onclick = () => { if(step == 1){ heisFoods.HeisCount -= 10000; showHeisCount(); } if(step == 2){ heisFoods.FoodsCount -= 10000; showFoodsCount() } } document.getElementById('btn-select-count-minus-1k').onclick = () => { if(step == 1){ heisFoods.HeisCount -= 1000; showHeisCount(); } if(step == 2){ heisFoods.FoodsCount -= 1000; showFoodsCount() } } }) return ret; } |
[侵攻/移動]がクリックされたときの処理を示します。
まずどこを侵攻するのか選択するボタンを表示させます。侵攻できるのはとなりの県だけです。ボタンは最大で8個あり(となりの県をもっとも多く持つのが長野県の8なので)、使わないものは非表示にします。侵攻の対象となる県のボタンがクリックされたらonclickTargetOfInvasion関数(後述)を呼び出して侵攻の処理をおこないます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
function onclickInvasion(ken, resolve){ const $invasionSelects = document.getElementById('select-target-invasion'); $actions.style.display = 'none'; $currentKenInformation.style.display = 'none'; playNoticeSound(); // どこを侵攻するのか? // とりあえずすべて非表示に for(let i = 0; i < 8; i++) document.getElementById(`btn-target-invasion-${i + 1}`).style.display = 'none'; // となりの県を取得。もし対象の OwnerName と playerOwnerName が同じなら侵攻ではなく援軍の派遣 for(let i = 0; i < ken.JoinKenNames.length; i++){ let action = '侵攻'; if(kens.find(_ => _.KenName == ken.JoinKenNames[i]).OwnerName == playerOwnerName) action = '移動'; const $btn = document.getElementById(`btn-target-invasion-${i + 1}`); $btn.innerHTML = ken.JoinKenNames[i]; if(action == '移動') $btn.innerHTML += '\n(移動)'; $btn.style.display = 'inline'; // 県名ボタンがクリックされたら兵数と兵糧を指定するボタンをもつ要素を表示する $btn.onclick = async() => await onclickTargetOfInvasion(ken, $btn.innerHTML.replace('\n(移動)', ''), action, resolve); } $invasionSelects.style.display = 'block'; document.getElementById('return-from-select-target-invasion').onclick = () => { playNoticeSound(); $invasionSelects.style.display = 'none'; $currentKenInformation.style.display = 'block'; $actions.style.display = 'block'; } } |
侵攻の対象となる県のボタンがクリックされたときの処理を示します。
侵攻の対象を選ぶ要素は非表示にして、HeisFoodsオブジェクトを上記のselectHeisFoods関数に渡して動員する兵数と兵糧を設定するボタンを表示させます。
この関数が’cancel’を返したときは動員する兵数と兵糧を選択する処理がキャンセルされたことになるので、再び侵攻対象を選ぶボタンをもつ要素を表示させます。
‘ok’が返されたときはheisFoodsオブジェクトのなかから侵攻に動員する兵と兵糧の数を取得してInvaderオブジェクトを生成します。そしてこれを侵攻または移動する県のInvaders配列に追加します(援軍もInvaderとして扱う)。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
async function onclickTargetOfInvasion(ken, targetKenName, action, resolve){ const $invasionSelects = document.getElementById('select-target-invasion'); $invasionSelects.style.display = 'none'; const $selectCount = document.getElementById('select-count'); const $selectCountNavi = document.getElementById('select-count-navi'); $selectCount.style.display = 'block'; $selectCountNavi.innerHTML = `${action}に動員する職員数を指定してください`; // HeisFoodsオブジェクトを上記のselectHeisFoods関数に渡して動員する兵数と兵糧を設定させる const heisFoods = new HeisFoods(ken.HeisCount, ken.FoodsCount); const ret = await selectHeisFoods(heisFoods); // [キャンセル]がクリックされた場合は前の処理へ戻る。 // すなわち侵攻対象を選ぶボタンをもつ要素を再表示する if(ret == 'cancel'){ $selectCount.style.display = 'none'; $invasionSelects.style.display = 'block'; return; } // [OK]がクリックされた場合は設定された値でInvaderオブジェクトを生成する // 侵攻/移動する県のInvaders配列に追加(援軍もInvaderとして扱う) $currentKenInformation.style.display = 'block'; kens.find(_ => _.KenName == targetKenName).Invaders.push(new Invader(ken.OwnerName, heisFoods.HeisCount, heisFoods.FoodsCount)); playNoticeSound(); await showMessage([ `${ken.OwnerName}軍は ${targetKenName}に${action}しました`, `兵数 ${heisFoods.HeisCount.toLocaleString()} 兵糧 ${heisFoods.FoodsCount.toLocaleString()}` ], 0, true); // 動員した兵と兵糧はもとの県からはなくなるのでそのぶんを差し引く ken.HeisCount -= heisFoods.HeisCount; ken.FoodsCount -= heisFoods.FoodsCount; resolve(''); } |
侵攻されている自分の県のターン
自分の県にターンが回ってきたときに侵攻されている場合も考えられます。この場合は[静観], [敵の状態を表示], [決死の全軍突撃]のなかから次の行動を選択します。静観する場合は兵糧攻めを受けるので自県の兵糧の値が大きく(県庁内の兵員数の3倍)下がります。静観は兵糧が足りなくなる場合は選択できません。
静観する場合
これは[静観]を選択したときにおこなわれる処理です。静観するつもりでも敵の側から突入してくるかもしれません。敵が突入しない場合は敵の兵糧が兵の数だけ少なくなります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 |
async function waitingAsBeingInvaded(ken, invader, resolve){ $battleActions1.style.display = 'none'; if(ken.FoodsCount >= ken.HeisCount * 3){ playNoticeSound(); await showMessage(['静観します',], 0, true); ken.FoodsCount -= ken.HeisCount * 3; invader.FoodsCount -= invader.HeisCount; // 静観したら敵が突入してくるかもしれない if(decideWhetherToRush(ken, invader)){ playNoticeSound(); await showMessage([`なんと敵(${invader.OwnerName}軍)が突入してきた!!`], 1000); playFightSound(); while(true){ await showMessage([`自軍 ${ken.HeisCount.toLocaleString()} 敵軍(${invader.OwnerName}軍) ${invader.HeisCount.toLocaleString()}`], 1000); if(ken.HeisCount == 0 || invader.HeisCount == 0) break; rush(ken, invader); } stopFightSound(); if(ken.HeisCount > 0){ playNoticeSound(); await showMessage([`${invader.OwnerName}軍に勝ちました!!`, `兵糧 ${invader.FoodsCount.toLocaleString()} を奪取しました。`], 0, true); ken.FoodsCount += invader.FoodsCount } else { playNoticeSound(); await showMessage([`${invader.OwnerName}軍に負けました`, `職員は全滅し、県庁を占領され、兵糧 ${ken.FoodsCount.toLocaleString()} も奪われました。`], 0, true); ken.FoodsCount += invader.FoodsCount ken.OwnerName = invader.OwnerName } ken.Invaders.length = 0; // 戦闘が終わったら侵攻軍はいなくなるので配列は空にする } resolve(''); } // 兵糧が足りない場合は選択の余地なし else { playNoticeSound(); await showMessage(['兵糧が足りないので[決死の全軍突撃]以外選択肢がありません!',], 0, true); $battleActions1.style.display = 'block'; } } |
敵が静観せずに突入するかどうかを決める関数です。兵糧が足りない場合は突入するしかないので突入させます。それ以外の場合は乱数で決めます。この部分は要検討です。あまり最適化された行動をするとクリアできないクソゲーになってしまいます。
1 2 3 4 5 6 |
function decideWhetherToRush(ken, invader){ if(invader.FoodsCount < invader.HeisCount) return true; else return Math.random() < 0.5; } |
敵の状態を表示
自県に侵攻している敵の状態を表示する処理を示します。
1 2 3 4 5 6 7 8 |
async function showEnemyAsBeingInvaded(ken, invader){ $battleActions1.style.display = 'none'; const text1 = `自軍: 兵数 ${ken.HeisCount.toLocaleString()} 兵糧 ${ken.FoodsCount.toLocaleString()}`; const text2 = `敵軍(${invader.OwnerName}軍): 兵数 ${invader.HeisCount.toLocaleString()} 兵糧 ${invader.FoodsCount.toLocaleString()}`; playNoticeSound(); await showMessage([text1, text2,], 0, true); $battleActions1.style.display = 'block'; } |
県庁を包囲している敵に突撃する処理を示します。
battle関数を呼び出すたびに自分か敵の兵数が1000減ります。先に0になったほうが負けです。自分が勝った場合は敵の兵糧を奪い取ります。負けた場合は兵糧を奪われるだけでなく県の所有権も奪われることになります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
async function assaultAsBeingInvaded(ken, invader, resolve){ $battleActions1.style.display = 'none'; playNoticeSound(); await showMessage([`決死の全軍突撃!!`], 1000); playFightSound(); while(true){ await showMessage([`自軍 ${ken.HeisCount.toLocaleString()} 敵軍 ${invader.HeisCount.toLocaleString()}`], 1000); if(ken.HeisCount == 0 || invader.HeisCount == 0) break; battle(ken, invader); } stopFightSound(); if(ken.HeisCount > 0){ playNoticeSound(); await showMessage([`${invader.OwnerName}軍に勝ちました!!`, `兵糧 ${invader.FoodsCount.toLocaleString()} を奪取しました。`], 0, true); ken.FoodsCount += invader.FoodsCount; } else { playNoticeSound(); await showMessage([`${invader.OwnerName}軍に負けました`, `職員は全滅し、県庁を占領され、兵糧 ${ken.FoodsCount.toLocaleString()} も奪われました。`], 0, true); ken.FoodsCount += invader.FoodsCount; ken.OwnerName = invader.OwnerName; } ken.Invaders.length = 0; resolve(''); } |
自県にターンが回ってきたときの処理
ゲームループにおいて自県にターンが回ってきたときの処理を示します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
async function myKenTurn(ken){ await battleBetweenInvaders(ken); // 侵攻軍同士の戦闘 await joinPlayersReinforcements(ken); // 援軍を合流させる // 敵に攻め込まれていないときは [開発], [徴兵], [調査], [侵攻], [保存]のなかから行動選択 if(ken.Invaders.length == 0){ await new Promise( resolve => { $actions.style.display = 'block'; $development.onclick = async() => onclickDevelopment(ken, resolve); $conscription.onclick = async() => onclickConscription(ken, resolve); $invasion.onclick = () => onclickInvasion(ken, resolve); $research.onclick = () => onclickResearch(); }); } // 敵に攻め込まれているときは [静観], [敵の状態を表示], [決死の全軍突撃] else { const invader = ken.Invaders[0]; $battleActions1.style.display = 'block'; await new Promise(async resolve => { // [静観]が選択された document.getElementById('waiting-1').onclick = () => waitingAsBeingInvaded(ken, invader, resolve); // [敵の状態を表示]が選択された document.getElementById('show-enemy-1').onclick = async() => showEnemyAsBeingInvaded(ken, invader); // [決死の全軍突撃]が選択された document.getElementById('assault-1').onclick = () => assaultAsBeingInvaded(ken, invader, resolve); }); } } |
次回は自県以外の県にターンが回ってきたときの処理を実装します。