전투 시뮬레이터 기본 기능 구현 완료

This commit is contained in:
2018-08-27 02:21:45 +09:00
parent 6b4a7ee03b
commit ef1f2722fc
4 changed files with 122 additions and 8 deletions
+40 -1
View File
@@ -20,7 +20,6 @@ $startYear = $gameStor->getValue('startyear');
<meta name="viewport" content="width=1100" />
<?=WebUtil::printCSS('../e_lib/bootstrap.min.css')?>
<?=WebUtil::printCSS('../d_shared/common.css')?>
<?=WebUtil::printCSS('../css/config.css')?>
<?=WebUtil::printCSS('css/common.css')?>
<?=WebUtil::printCSS('css/battle_simulator.css')?>
<?=WebUtil::printJS('../d_shared/common_path.js')?>
@@ -431,6 +430,46 @@ $startYear = $gameStor->getValue('startyear');
</div><!-- <div class="col-sm"> -->
</div>
<div class="card mb-3">
<div class="card-header">
전투 요약
</div>
<table class="table">
<tbody id="battle_result_summary">
<tr><th style='width:16ch;'>전투 일시</th><td id='result_datetime'></td></tr>
<tr><th>전투 횟수</th><td id='result_warcnt'></td></tr>
<tr><th>전투 페이즈</th><td id='result_phase'></td></tr>
<tr><th>공격량</th><td id='result_killed'></td></tr>
<tr><th>피해량</th><td id='result_dead'></td></tr>
<tr><th>출병자 군량 소모</th><td id='result_attackerRice'></td></tr>
<tr><th>수비자 군량 소모</th><td id='result_defenderRice'></td></tr>
<tr><th>공격자 스킬</th><td id='result_attackerSkills'></td></tr>
<tr class='result_defenderSkills'><th>수비자1 스킬</th><td></td></tr>
</tbody>
</table>
</div>
<div class="row">
<div class="col-sm">
<div class="card mb-3">
<div class="card-header">
마지막 전투 로그
</div>
<div class="card-body" id="generalBattleResultLog">
</div>
</div>
</div>
<div class="col-sm">
<div class="card mb-3">
<div class="card-header">
마지막 전투 상세 로그
</div>
<div class="card-body" id="generalBattleDetailLog">
</div>
</div>
</div>
</div>
</div>
</body>
</html>
+20 -7
View File
@@ -70,6 +70,7 @@ $month = $query['month'];
$repeatCnt = $query['repeatCnt'];
$rawAttacker = $query['attackerGeneral'];
$rawAttacker['turntime'] = date('Y-m-d H:i:s');
$rawAttackerCity = $query['attackerCity'];
$rawAttackerNation = $query['attackerNation'];
@@ -347,6 +348,9 @@ $attackerDead = 0;
$attackerAvgRice = 0;
$defenderAvgRice = 0;
$avgPhase = 0;
$avgWar = 0;
$attackerActivatedSkills = [];
$defendersActivatedSkills = [];
@@ -356,13 +360,19 @@ foreach(range(1, $repeatCnt) as $repeatIdx){
$defenderList, $rawDefenderCity, $rawDefenderNation,
$startYear, $year, $month, $cityRate
);
$lastWarLog = $attacker->getLogger()->rollback();
$lastWarLog = Util::mapWithKey(function($key, $values){
return ConvertLog(join('<br>', $values));
}, $attacker->getLogger()->rollback());
$avgPhase += $attacker->getPhase() / $repeatCnt;
$attackerKilled += $attacker->getKilled() / $repeatCnt;
$attackerDead += $attacker->getDead() / $repeatCnt;
$attackerAvgRice += $attackerRice /= $repeatCnt;
$defenderAvgRice += $defenderRice /= $repeatCnt;
$attackerAvgRice += $attackerRice / $repeatCnt;
$defenderAvgRice += $defenderRice / $repeatCnt;
$avgWar += count($battleResult) / $repeatCnt;
foreach($attacker->getActivatedSkillLog() as $skillName => $skillCnt){
if(!key_exists($skillName, $attackerActivatedSkills)){
@@ -393,12 +403,15 @@ foreach(range(1, $repeatCnt) as $repeatIdx){
Json::die([
'result'=>true,
'datetime'=>$rawAttacker['turntime'],
'reason'=>'success',
'lastWarLog'=>$lastWarLog,
'attackerKilled'=>$attackerKilled,
'attackerDead'=>$attackerDead,
'avgWar'=>$avgWar,
'phase'=>$avgPhase,
'killed'=>$attackerKilled,
'dead'=>$attackerDead,
'attackerRice'=>$attackerAvgRice,
'defenderRice'=>$defenderAvgRice,
'attackerActivatedSkills'=>$attackerActivatedSkills,
'defendersActivatedSkills'=>$defendersActivatedSkills,
'attackerSkills'=>$attackerActivatedSkills,
'defendersSkills'=>$defendersActivatedSkills,
]);
+49
View File
@@ -519,6 +519,54 @@ jQuery(function($){
});
}
var parseSkillCount = function(skills){
var result = [];
$.each(skills, function(key, value){
result.push("{0}({1}회)".format(key, toPretty(value)));
})
if(result.length == 0){
return '-';
}
return result.join(', ');
}
var toPretty = function(number){
if(isInt(number)){
number = parseInt(number);
}
else{
number = parseFloat(number).toFixed(2);
}
return numberWithCommas(number);
}
var showBattleResult = function(result){
$('#result_datetime').html(result.datetime);
$('#result_warcnt').html(toPretty(result.avgWar));
$('#result_phase').html(toPretty(result.phase));
$('#result_killed').html(toPretty(result.killed));
$('#result_dead').html(toPretty(result.dead));
$('#result_attackerRice').html(toPretty(result.attackerRice));
$('#result_defenderRice').html(toPretty(result.defenderRice));
$('#result_attackerSkills').html(parseSkillCount(result.attackerSkills));
$('.result_defenderSkills').detach();
var $summary = $('#battle_result_summary');
$.each(result.defendersSkills, function(idx, defenderSkills){
console.log(defenderSkills);
var $result = $("<tr class='result_defenderSkills'><th>수비자{0} 스킬</th><td></td></tr>".format(idx + 1));
$result.find('td').html(parseSkillCount(defenderSkills));
$summary.append($result);
});
$('#generalBattleResultLog').html(result.lastWarLog.generalBattleResultLog);
$('#generalBattleDetailLog').html(result.lastWarLog.generalBattleDetailLog);
}
var beginBattle = function(){
var data = extendAllDataForDB(exportAllData());
console.log(data);
@@ -536,6 +584,7 @@ jQuery(function($){
alert(result.reason);
return;
}
showBattleResult(result);
}, function(result){
alert('전투 개시 실패!');
+13
View File
@@ -23,6 +23,14 @@ var escapeHtml = (function (string) {
}
})();
/**
* 변수가 정수인지 확인하는 함수
* @param {*} n 정수인지 확인하기 위한 인자
* @return {boolean} 정수인지 여부
*/
function isInt(n) {
return +n === n && !(n % 1);
}
/**
* object의 array를 id를 key로 삼는 object로 재 변환
@@ -89,6 +97,11 @@ function convColorValue(color) {
}
function numberWithCommas(x) {
return x.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ",");
}
/**
* 단순한 Template 함수. <%변수명%>으로 template 가능
* @see https://github.com/krasimir/absurd/blob/master/lib/processors/html/helpers/TemplateEngine.js