diff --git a/hwe/js/battle_simulator.js b/hwe/js/battle_simulator.js
index 7e335b7d..7c1d2006 100644
--- a/hwe/js/battle_simulator.js
+++ b/hwe/js/battle_simulator.js
@@ -1,932 +1,2 @@
-jQuery(function($) {
-
-
- var $generalForm = $('.form_sample .general_detail');
- var $defenderHeaderForm = $('.form_sample .card-header');
- var $defenderColumn = $('.defender-column');
-
- var defenderNoList = {};
-
- var $attackerCard = $('.attacker_form');
-
- var initBasicEvent = function() {
-
- if (window.nation) {
- $('.form_city_level').val(window.city.level);
- $('.form_def').val(parseInt(window.city.def));
- $('.form_wall').val(parseInt(window.city.wall));
- $('.form_nation_type').val(window.nation.type);
- $('.form_nation_level').val(window.nation.level);
- $('.form_tech').val(parseInt(window.nation.tech / 1000));
- if (window.nation.capital == window.city.city) {
- $('.attacker_nation .form_is_capital:first').click();
- $('.defender_nation .form_is_capital:first').click();
- } else {
- $('.attacker_nation .form_is_capital:last').click();
- $('.defender_nation .form_is_capital:last').click();
- }
- } else {
- $('.attacker_nation .form_is_capital:last').click();
- $('.defender_nation .form_is_capital:last').click();
- }
-
- $('.form_injury').change(function() {
- var $this = $(this);
- var $general = getGeneralDetail($this);
- var $helptext = $general.find('.injury_helptext');
-
- var injury = parseInt($this.val());
- //FIXME: PHP 코드와 항상 일치하도록 변경
- var text = '건강';
- var color = 'white';
- if (injury > 60) {
- text = '위독';
- color = 'red';
- } else if (injury > 40) {
- text = '심각';
- color = 'magenta';
- } else if (injury > 20) {
- text = '중상';
- color = 'orange';
- } else if (injury > 0) {
- text = '경상';
- color = 'yellow';
- }
- $helptext.html(text).css('color', color);
- });
-
- $('.export_general').click(function() {
- var $btn = $(this);
- var $general = getGeneralDetail($btn);
-
- var values = exportGeneralInfo($general);
- console.log(values);
- });
- $('.delete-defender').click(function() {
- var $card = getGeneralFrame($(this));
- deleteDefender($card);
- });
- $('.copy-defender').click(function() {
- var $card = getGeneralFrame($(this));
- copyDefender($card);
- });
-
- $('.add-defender').click(function() {
- addDefender();
- });
-
- $('.btn-general-load').click(function() {
- var $file = $(this).prev();
- $file[0].click();
- })
-
- $('.form_load_general_file').on('change', function(e) {
- e.preventDefault();
- var $this = $(this);
- var $card = getGeneralFrame($this);
-
- var files = e.target.files;
-
- importGeneralInfoByFile(files, $card);
- return false;
- });
-
- $('.btn-general-import-server').click(function() {
- var $this = $(this);
- var $card = getGeneralFrame($this);
-
- var $modal = $('#importModal');
- $modal.data('target', $card);
- $modal.modal('show');
- });
-
- $('.btn-general-save').click(function() {
- var $this = $(this);
- var $general = getGeneralDetail($this);
- var generalData = exportGeneralInfo($general);
-
- var filename = "general_{0}.json".format(generalData.name);
- var saveData = JSON.stringify({
- objType: 'general',
- data: generalData
- }, null, 4);
-
- download(saveData, filename, 'application/json');
- });
-
- $('.btn-battle-load').click(function() {
- var $file = $(this).prev();
- $file[0].click();
- })
-
- $('.form_load_battle_file').on('change', function(e) {
- e.preventDefault();
- var $this = $(this);
- var files = e.target.files;
-
- importBattleInfoByFile(files);
- return false;
- });
-
- $('.btn-battle-save').click(function() {
- var battleData = exportAllData();
- var filename = "battle_{0}.json".format(moment().format('YYYYMMDD_hhmmss'));
- var saveData = JSON.stringify({
- objType: 'battle',
- data: battleData
- }, null, 4);
-
- download(saveData, filename, 'application/json');
- })
-
- var $generals = $('.general_detail');
- $generals.bind('dragover dragleave', function(e) {
- e.stopPropagation()
- e.preventDefault()
- })
- $generals.bind('drop', function(e) {
- e.preventDefault();
- var $this = $(this);
- var $card = getGeneralFrame($this);
-
- var files = e.originalEvent.dataTransfer.files;
-
- importGeneralInfoByFile(files, $card);
- return false;
- });
-
- var $battlePad = $('.dragpad_battle');
- $battlePad.bind('dragover dragleave', function(e) {
- e.stopPropagation()
- e.preventDefault()
- })
- $battlePad.bind('drop', function(e) {
- e.preventDefault();
-
- var files = e.originalEvent.dataTransfer.files;
-
- importBattleInfoByFile(files);
- return false;
- });
- }
-
- var importGeneralInfo = function($general, data) {
- var setVal = function(query, val) {
- $general.find(query).val(val).change();
- }
-
- setVal('.form_general_name', data.name);
-
- setVal('.form_officer_level', data.officer_level);
- setVal('.form_exp_level', data.explevel);
-
- setVal('.form_leadership', data.leadership);
- setVal('.form_general_horse', data.horse);
- setVal('.form_strength', data.strength);
- setVal('.form_general_weap', data.weapon);
- setVal('.form_intel', data.intel);
- setVal('.form_general_book', data.book);
- setVal('.form_general_item', data.item);
-
- setVal('.form_injury', data.injury);
-
- setVal('.form_rice', data.rice);
-
- setVal('.form_general_character', data.personal);
- setVal('.form_general_special_war', data.special2);
-
- setVal('.form_crew', data.crew);
- setVal('.form_crewtype', data.crewtype);
- setVal('.form_atmos', data.atmos);
- setVal('.form_train', data.train);
-
- setVal('.form_dex1', data.dex1);
- setVal('.form_dex2', data.dex2);
- setVal('.form_dex3', data.dex3);
- setVal('.form_dex4', data.dex4);
- setVal('.form_dex5', data.dex5);
- setVal('.form_defence_train', data.defence_train);
-
- setVal('.form_warnum', data.warnum);
- setVal('.form_killnum', data.killnum);
- setVal('.form_killcrew', data.killcrew);
-
- if (!setGeneralNo($general, data.no)) {
- setGeneralNo($general, generateNewGeneralNo());
- }
- }
-
- var exportGeneralInfo = function($general) {
- var getInt = function(query) {
- return parseInt($general.find(query).val());
- }
-
- var getVal = function(query) {
- return $general.find(query).val();
- }
-
- return {
- no: getGeneralNo($general),
- name: getVal('.form_general_name'),
- officer_level: getInt('.form_officer_level'),
- explevel: getInt('.form_exp_level'),
-
- leadership: getInt('.form_leadership'),
- horse: getVal('.form_general_horse'),
- strength: getInt('.form_strength'),
- weapon: getVal('.form_general_weap'),
- intel: getInt('.form_intel'),
- book: getVal('.form_general_book'),
- item: getVal('.form_general_item'),
-
- injury: getInt('.form_injury'),
-
- rice: getInt('.form_rice'),
-
- personal: getVal('.form_general_character'),
- special2: getVal('.form_general_special_war'),
-
- crew: getInt('.form_crew'),
- crewtype: getInt('.form_crewtype'),
- atmos: getInt('.form_atmos'),
- train: getInt('.form_train'),
-
- dex1: getInt('.form_dex1'),
- dex2: getInt('.form_dex2'),
- dex3: getInt('.form_dex3'),
- dex4: getInt('.form_dex4'),
- dex5: getInt('.form_dex5'),
-
- defence_train: getInt('.form_defence_train'),
-
- warnum: getInt('.form_warnum'),
- killnum: getInt('.form_killnum'),
- killcrew: getInt('.form_killcrew'),
-
- };
- }
-
- var importBattleInfoByFile = function(files) {
- if (files === null) {
- alert('파일 에러!');
- return false;
- }
-
- if (files.length < 1) {
- alert("파일 에러!");
- return false;
- }
-
-
- var file = files[0];
- if (file.size > 1024 * 1024) {
- alert('파일이 너무 큽니다!');
- return false;
- }
- if (file.type === '') {
- alert('폴더를 업로드할 수 없습니다!');
- return false;
- }
-
- var reader = new FileReader();
- reader.onload = function() {
- var battleData = {};
- try {
- battleData = JSON.parse(reader.result);
- } catch (e) {
- alert('올바르지 않은 파일 형식입니다');
- return false;
- }
-
- if (!('objType' in battleData)) {
- alert('파일 형식을 확인할 수 없습니다');
- return false;
- }
-
- if (battleData.objType != 'battle') {
- alert('전투 데이터가 아닙니다');
- return false;
- }
-
- importBattleInfo(battleData.data);
- return true;
- };
-
- try {
-
- reader.readAsText(file);
- } catch (e) {
- alert('파일을 읽는데 실패했습니다.');
- return false;
- }
-
- return true;
- }
-
- var importGeneralInfoByFile = function(files, $card) {
- if ($card === undefined) {
- $card = addDefender();
- }
-
- if (files === null) {
- alert('파일 에러!');
- return false;
- }
-
- if (files.length < 1) {
- alert("파일 에러!");
- return false;
- }
-
-
- var file = files[0];
- if (file.size > 1024 * 1024) {
- alert('파일이 너무 큽니다!');
- return false;
- }
- if (file.type === '') {
- alert('폴더를 업로드할 수 없습니다!');
- return false;
- }
-
- var reader = new FileReader();
- reader.onload = function() {
- var generalData = {};
- try {
- generalData = JSON.parse(reader.result);
- } catch (e) {
- alert('올바르지 않은 파일 형식입니다');
- return false;
- }
-
- if (!('objType' in generalData)) {
- alert('파일 형식을 확인할 수 없습니다');
- return false;
- }
-
- if (generalData.objType == 'battle') {
- importBattleInfo(generalData.data);
- return true;
- }
- if (generalData.objType != 'general') {
- alert('장수 데이터가 아닙니다');
- return false;
- }
-
- $card.find('.form_load_general_file').val('');
-
- importGeneralInfo($card, generalData.data);
- return true;
- };
-
- try {
-
- reader.readAsText(file);
- } catch (e) {
- alert('파일을 읽는데 실패했습니다.');
- return false;
- }
-
- return true;
- }
-
- var extendGeneralInfoForDB = function(generalData) {
-
- var dbVal = {
- nation: (generalData.no) <= 1 ? 1 : 2,
- city: (generalData.no) <= 1 ? 1 : 3,
- turntime: '2018-08-26 12:00',
- special: defaultSpecialDomestic,
- leadership_exp: 0,
- strength_exp: 0,
- intel_exp: 0,
-
- gold: 10000,
-
- dedication: 0,
-
- recent_war: '2018-08-26 12:00',
- experience: Math.pow(generalData.explevel, 2),
- };
-
- return $.extend({}, generalData, dbVal);
- }
-
- var getGeneralFrame = function($btn) {
- var $card = $btn.closest('.general_form');
- return $card;
- }
-
- var getGeneralDetail = function($btn) {
- var $card = getGeneralFrame($btn);
- var $general = $card.find('.general_detail');
- return $general;
- }
-
- var getGeneralNo = function($btn) {
- return parseInt(getGeneralFrame($btn).data('general_no'));
- }
-
- var setGeneralNo = function($btn, value) {
- if (value == 1) {
- //1번은 무조건 공격자임
- return false;
- }
- if (value in defenderNoList) {
- return false;
- }
- var $card = getGeneralFrame($btn);
- $card.data('general_no', value);
- defenderNoList[value] = $card;
- return true;
- }
-
- var generateNewGeneralNo = function() {
- while (true) {
- var newGeneralNo = parseInt(Math.random() * (1 << 24)) + 2;
- if (newGeneralNo in defenderNoList) {
- continue;
- }
- return newGeneralNo;
- }
- }
-
- var deleteGeneralNo = function($btn) {
- var $card = getGeneralFrame($btn);
- $card.removeData('general_no');
- var generalNo = getGeneralNo($card);
- delete defenderNoList[generalNo];
- }
-
- var addDefender = function($cardAfter) {
- var $newCard = $('
');
-
- if ($cardAfter === undefined) {
- $defenderColumn.append($newCard);
- } else {
- $cardAfter.after($newCard);
- }
-
- $newCard.append($defenderHeaderForm.clone(true, true));
- $newCard.append($generalForm.clone(true, true));
-
- $newGeneral = getGeneralDetail($newCard);
- setGeneralNo($newCard, generateNewGeneralNo());
-
- return $newCard;
- }
-
- var deleteDefender = function($card) {
- deleteGeneralNo($card);
- $card.detach();
- }
-
- var copyDefender = function($card) {
- var $general = getGeneralDetail($card);
-
- var generalData = exportGeneralInfo($general);
- var $newObj = addDefender($card);
- importGeneralInfo(getGeneralDetail($newObj), generalData);
- }
-
- var importBattleInfo = function(battleData) {
-
- $('.form_load_battle_file').val('');
- console.log(battleData);
-
- var $attackerNation = $('.attacker_nation');
- var $defenderNation = $('.defender_nation');
-
- var attackerGeneral = battleData.attackerGeneral;
- var attackerCity = battleData.attackerCity;
- var attackerNation = battleData.attackerNation;
-
- var defenderGenerals = battleData.defenderGenerals;
- var defenderCity = battleData.defenderCity;
- var defenderNation = battleData.defenderNation;
-
- $('#year').val(battleData.year);
- $('#month').val(battleData.month);
- $('#repeat_cnt').val(battleData.repeatCnt);
-
- $('.delete-defender').click();
-
- $attackerNation.find('.form_nation_type').val(attackerNation.type);
- $attackerNation.find('.form_tech').val(Math.floor(attackerNation.tech / 1000));
- $attackerNation.find('.form_nation_level').val(attackerNation.level);
- if (attackerNation.capital == 1) {
- $attackerNation.find('.form_is_capital:first').click();
- } else {
- $attackerNation.find('.form_is_capital:last').click();
- }
- $attackerNation.find('.form_city_level').val(attackerCity.level);
-
- importGeneralInfo($('.attacker_form'), attackerGeneral);
-
- $defenderNation.find('.form_nation_type').val(defenderNation.type);
- $defenderNation.find('.form_tech').val(Math.floor(defenderNation.tech / 1000));
- $defenderNation.find('.form_nation_level').val(defenderNation.level);
- if (defenderNation.capital == 1) {
- $defenderNation.find('.form_is_capital:first').click();
- } else {
- $defenderNation.find('.form_is_capital:last').click();
- }
- $defenderNation.find('.form_city_level').val(defenderCity.level);
- $('#city_def').val(defenderCity.def);
- $('#city_wall').val(defenderCity.wall);
-
- $.each(defenderGenerals, function(idx, defenderGeneral) {
- var $card = addDefender();
- importGeneralInfo($card, defenderGeneral);
- });
- }
-
- var exportAllData = function() {
- var $attackerNation = $('.attacker_nation');
- var $defenderNation = $('.defender_nation');
-
- var attackerGeneral = exportGeneralInfo($('.attacker_form'));
-
- var attackerCity = {
- level: parseInt($attackerNation.find('.form_city_level').val()),
- };
-
- var attackerNation = {
- type: $attackerNation.find('.form_nation_type').val(),
- tech: parseInt($attackerNation.find('.form_tech').val()) * 1000,
- level: parseInt($attackerNation.find('.form_nation_level').val()),
- capital: $attackerNation.find('.form_is_capital:checked').val() == '1' ? 1 : 2,
- }
-
- var defenderGenerals = $('.defender_form').map(function() {
- return exportGeneralInfo($(this));
- }).toArray();
-
- var defenderCity = {
- def: parseInt($('#city_def').val()),
- wall: parseInt($('#city_wall').val()),
- level: parseInt($defenderNation.find('.form_city_level').val()),
- };
-
- var defenderNation = {
- type: $defenderNation.find('.form_nation_type').val(),
- tech: parseInt($defenderNation.find('.form_tech').val()) * 1000,
- level: parseInt($defenderNation.find('.form_nation_level').val()),
- capital: $defenderNation.find('.form_is_capital:checked').val() == '1' ? 3 : 4,
- }
-
- var year = parseInt($('#year').val());
- var month = parseInt($('#month').val());
- var repeatCnt = parseInt($('#repeat_cnt').val());
-
- return {
- attackerGeneral: attackerGeneral,
- attackerCity: attackerCity,
- attackerNation: attackerNation,
-
- defenderGenerals: defenderGenerals,
- defenderCity: defenderCity,
- defenderNation: defenderNation,
-
- year: year,
- month: month,
- repeatCnt: repeatCnt,
- };
- }
-
- var extendAllDataForDB = function(allData) {
- var defaultNation = {
- nation: 0,
- name: '재야',
- capital: 0,
- level: 0,
- gold: 0,
- rice: 2000,
- type: 'None',
- tech: 0,
- gennum: 200,
- };
-
- var defaultCity = {
- nation: 0,
- supply: 1,
- name: '도시',
-
- pop: 500000,
- agri: 10000,
- comm: 10000,
- secu: 10000,
- def: 1000,
- wall: 1000,
-
- trust: 100,
-
- pop_max: 600000,
- agri_max: 12000,
- comm_max: 12000,
- secu_max: 10000,
- def_max: 12000,
- wall_max: 12000,
-
- dead: 0,
-
- state: 0,
-
- conflict: '{}',
- };
-
- var attackerNation = $.extend({}, defaultNation, allData.attackerNation);
- attackerNation.nation = 1;
- attackerNation.name = '출병국';
-
- var attackerCity = $.extend({}, defaultCity, allData.attackerCity);
- attackerCity.nation = 1;
- attackerCity.city = 1;
-
- var attackerGeneral = extendGeneralInfoForDB(allData.attackerGeneral);
- if (2 <= attackerGeneral.officer_level && attackerGeneral.officer_level <= 4) {
- attackerGeneral.officer_city = 1;
- } else {
- attackerGeneral.officer_city = 0;
- }
-
- var defenderNation = $.extend({}, defaultNation, allData.defenderNation);
- defenderNation.nation = 2;
- defenderNation.name = '수비국';
-
- var defenderCity = $.extend({}, defaultCity, allData.defenderCity);
- defenderCity.nation = 2;
- defenderCity.city = 3;
- defenderCity.wall_max = parseInt(defenderCity.wall / 5 * 6);
- defenderCity.def_max = parseInt(defenderCity.def / 5 * 6);
-
- var defenderGenerals = [];
- $.each(allData.defenderGenerals, function() {
- var defenderGeneral = extendGeneralInfoForDB(this);
- if (2 <= defenderGeneral.officer_level && defenderGeneral.officer_level <= 4) {
- defenderGeneral.officer_city = 3;
- } else {
- defenderGeneral.officer_city = 0;
- }
-
- defenderGenerals.push(defenderGeneral);
- });
-
-
- return $.extend({}, allData, {
- attackerGeneral: attackerGeneral,
- attackerCity: attackerCity,
- attackerNation: attackerNation,
-
- defenderGenerals: defenderGenerals,
- defenderCity: defenderCity,
- defenderNation: defenderNation,
- });
- }
-
- 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));
- if (result.minKilled != result.maxKilled) {
- $('#result_maxKilled').html(toPretty(result.maxKilled));
- $('#result_minKilled').html(toPretty(result.minKilled));
- $('#result_varKilled').show();
- } else {
- $('#result_varKilled').hide();
- }
- $('#result_dead').html(toPretty(result.dead));
- if (result.minDead != result.maxDead) {
- $('#result_maxDead').html(toPretty(result.maxDead));
- $('#result_minDead').html(toPretty(result.minDead));
- $('#result_varDead').show();
- } else {
- $('#result_varDead').hide();
- }
-
- $('#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 = $("| 수비자{0} 스킬 | |
".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);
- $.ajax({
- type: 'post',
- url: 'j_simulate_battle.php',
- dataType: 'json',
- data: {
- action: 'battle',
- query: JSON.stringify(data),
- }
- }).then(function(result) {
- console.log(result);
- if (!result.result) {
- alert(result.reason);
- return;
- }
- showBattleResult(result);
-
- }, function(result) {
- alert('전투 개시 실패!');
- });
- }
-
-
- var reorderDefender = function(defenderOrder) {
- $.each(defenderOrder, function(idx, generalNo) {
-
- if (!(generalNo in defenderNoList)) {
- //음..?
- alert("{0}이 수비자 리스트에 없습니다. 버그인 듯 합니다.".format(generalNo));
- return true;
- }
-
- var $defenderObj = defenderNoList[generalNo];
- $defenderObj.detach();
- $defenderColumn.append($defenderObj);
- })
- }
-
- var requestReorderDefender = function() {
- var data = extendAllDataForDB(exportAllData());
- console.log(data);
- $.ajax({
- type: 'post',
- url: 'j_simulate_battle.php',
- dataType: 'json',
- data: {
- action: 'reorder',
- query: JSON.stringify(data),
- }
- }).then(function(result) {
- console.log(result);
- if (!result.result) {
- alert(result.reason);
- return;
- }
- reorderDefender(result.order);
-
- }, function(result) {
- alert('재정렬 실패!');
- });
- }
-
- var initGeneralList = false;
-
- $('#importFromDB').click(function() {
- var generalID = $('#modalSelector').val();
- console.log(generalID);
-
-
- $.post({
- url: 'j_export_simulator_object.php',
- dataType: 'json',
- data: {
- destGeneralID: generalID
- }
- }).then(function(data) {
-
- if (!data.result) {
- alert(data.reason);
- return false;
- }
-
- var $modal = $('#importModal');
- var $card = $modal.data('target');
- importGeneralInfo($card, data.general);
-
- $modal.modal('hide');
- }, errUnknown);
-
-
- });
-
- $('#importModal').on('show.bs.modal', function(e) {
- if (!initGeneralList) {
- var $list = $('#modalSelector');
-
- var addNation = function(generalList, nationName, color) {
-
- generalList.sort(function(lhs, rhs) {
- if (lhs.npc != rhs.npc) {
- return lhs.npc - rhs.npc;
- }
- if (lhs.name < rhs.name) {
- return -1;
- }
- if (lhs.name > rhs.name) {
- return 1;
- }
- return 0;
- })
- var $optGroup = $(''.format(nationName));
- $optGroup.css('background-color', color);
- $optGroup.css('color', isBrightColor(color) ? 'black' : 'white');
-
- $.each(generalList, function(idx, general) {
- $item = $(''.format(general.no, general.name));
- if (general.npc) {
- $item.css('color', getNpcColor(general.npc));
- } else {
- $item.css('color', 'white');
- }
- $item.css('background-color', 'black');
- $optGroup.append($item);
-
- });
- $list.append($optGroup);
- }
- $.post({
- url: 'j_get_basic_general_list.php',
- dataType: 'json',
- data: {
- req: 2,
- }
- }).then(function(data) {
- if (!data.result) {
- alert(data.reason);
- $('#importModal').modal('hide');
- return false;
- }
-
- var nations = data.nation;
- var myNationID = data.nationID;
-
- $list.empty();
- //자국 먼저
-
- if (0 in data.list) {
- nations[0] = {
- nation: 0,
- name: '재야',
- color: '#000000'
- };
- }
-
-
-
- addNation(combineArray(data.list[myNationID], data.column), nations[myNationID].name, nations[myNationID].color);
-
- for (var nationID in data.list) {
- if (nationID == myNationID) {
- continue;
- }
- addNation(combineArray(data.list[nationID], data.column), nations[nationID].name, nations[nationID].color);
- }
- initGeneralList = true;
- }, errUnknown);
- }
-
- });
-
- initBasicEvent();
- $attackerCard.append($generalForm.clone(true, true));
- addDefender();
-
- $('.btn-begin_battle').click(function() {
- beginBattle();
- });
-
- $('.btn-reorder_defender').click(function() {
- requestReorderDefender();
- })
-});
\ No newline at end of file
+(()=>{"use strict";var e,t={2890:(e,t,r)=>{r(2526),r(1817),r(1539),r(2165),r(6992),r(8783),r(3948),r(7042),r(1038);var n=r(3754),a=r.n(n),o=(r(9826),r(1058),r(1249),r(9720),r(2222),r(4678),r(2707),r(7941),r(9755)),l=r.n(o),i=(r(3734),r(9490)),c=r(3729),f=r.n(c);function u(e){return(u="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}function d(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function s(e,t){for(var r=0;r0&&void 0!==arguments[0]?arguments[0]:"";return d(this,a),k(v(e=n.call(this,t)),"name","RuntimeError"),e.message=t,e}return t=a,(r=[{key:"toString",value:function(){return this.message?this.name+": "+this.message:this.name}}])&&s(t.prototype,r),a}(y(Error)));function j(e){if(null==e)throw new x;return e}r(4916),r(5306),r(2479),r(189),r(4723),r(3123),r(3210);var S=r(9669);function O(e,t){(null==t||t>e.length)&&(t=e.length);for(var r=0,n=new Array(t);r=e.length?{done:!0}:{done:!1,value:e[n++]}},e:function(e){throw e},f:a}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var o,l=!0,i=!1;return{s:function(){r=r.call(e)},n:function(){var e=r.next();return l=e.done,e},e:function(e){i=!0,o=e},f:function(){try{l||null==r.return||r.return()}finally{if(i)throw o}}}}(e.keys());try{for(a.s();!(r=a.n()).done;){var o=r.value,l=e[o];n[o]=I(l,t)}}catch(e){a.e(e)}finally{a.f()}return n}function M(){alert("작업을 실패했습니다.")}function D(e){if(null==e)throw new x;return e}function A(e,t){var r="undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(!r){if(Array.isArray(e)||(r=N(e))||t&&e&&"number"==typeof e.length){r&&(e=r);var n=0,a=function(){};return{s:a,n:function(){return n>=e.length?{done:!0}:{done:!1,value:e[n++]}},e:function(e){throw e},f:a}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var o,l=!0,i=!1;return{s:function(){r=r.call(e)},n:function(){var e=r.next();return l=e.done,e},e:function(e){i=!0,o=e},f:function(){try{l||null==r.return||r.return()}finally{if(i)throw o}}}}function R(e,t){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){var r=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=r){var n,a,o=[],l=!0,i=!1;try{for(r=r.call(e);!(l=(n=r.next()).done)&&(o.push(n.value),!t||o.length!==t);l=!0);}catch(e){i=!0,a=e}finally{try{l||null==r.return||r.return()}finally{if(i)throw a}}return o}}(e,t)||N(e,t)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function N(e,t){if(e){if("string"==typeof e)return C(e,t);var r=Object.prototype.toString.call(e).slice(8,-1);return"Object"===r&&e.constructor&&(r=e.constructor.name),"Map"===r||"Set"===r?Array.from(e):"Arguments"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)?C(e,t):void 0}}function C(e,t){(null==t||t>e.length)&&(t=e.length);for(var r=0,n=new Array(t);r1048576)return alert("파일이 너무 큽니다!"),!1;if(""===t.type)return alert("폴더를 업로드할 수 없습니다!"),!1;var r=new FileReader;r.onload=function(){var e;try{e=JSON.parse(D(r.result))}catch(e){return alert("올바르지 않은 파일 형식입니다"),!1}return"objType"in e?"battle"!=e.objType?(alert("전투 데이터가 아닙니다"),!1):(b(e.data),!0):(alert("파일 형식을 확인할 수 없습니다"),!1)};try{r.readAsText(t)}catch(e){return alert("파일을 읽는데 실패했습니다."),!1}return!0},s=function(e,t){if(void 0===t&&(t=g()),null===e)return alert("파일 에러!"),!1;if(e.length<1)return alert("파일 에러!"),!1;var r=e[0];if(r.size>1048576)return alert("파일이 너무 큽니다!"),!1;if(""===r.type)return alert("폴더를 업로드할 수 없습니다!"),!1;var n=new FileReader;n.onload=function(){var e;try{e=JSON.parse(D(n.result))}catch(e){return alert("올바르지 않은 파일 형식입니다"),!1}return"objType"in e?"battle"==e.objType?(b(e.data),!0):"general"!=e.objType?(alert("장수 데이터가 아닙니다"),!1):(t.find(".form_load_general_file").val(""),c(t,e.data),!0):(alert("파일 형식을 확인할 수 없습니다"),!1)};try{n.readAsText(r)}catch(e){return alert("파일을 읽는데 실패했습니다."),!1}return!0},p=function(t){var r={nation:t.no<=1?1:2,city:t.no<=1?1:3,turntime:"2018-08-26 12:00",special:window.defaultSpecialDomestic,leadership_exp:0,strength_exp:0,intel_exp:0,gold:1e4,dedication:0,recent_war:"2018-08-26 12:00",experience:Math.pow(t.explevel,2)};return e.extend({},t,r)},m=function(e){return e.closest(".general_form")},_=function(e){return m(e).find(".general_detail")},v=function(e){return parseInt(m(e).data("general_no"))},y=function(e,t){if(1==t)return!1;if(t in o)return!1;var r=m(e);return r.data("general_no",t),o[t]=r,!0},h=function(){for(;;){var e=Math.floor(Math.random()*(1<<24))+2;if(!(e in o))return e}},g=function(a){var o=e('');return void 0===a?n.append(o):a.after(o),o.append(r.clone(!0,!0)),o.append(t.clone(!0,!0)),y(o,h()),o},b=function(t){e(".form_load_battle_file").val(""),console.log(t);var r=e(".attacker_nation"),n=e(".defender_nation"),a=t.attackerGeneral,o=t.attackerCity,l=t.attackerNation,i=t.defenderGenerals,f=t.defenderCity,u=t.defenderNation;e("#year").val(t.year),e("#month").val(t.month),e("#repeat_cnt").val(t.repeatCnt),e(".delete-defender").trigger("click"),r.find(".form_nation_type").val(l.type),r.find(".form_tech").val(Math.floor(l.tech/1e3)),r.find(".form_nation_level").val(l.level),1==l.capital?r.find(".form_is_capital:first").trigger("click"):r.find(".form_is_capital:last").trigger("click"),r.find(".form_city_level").val(o.level),c(e(".attacker_form"),a),n.find(".form_nation_type").val(u.type),n.find(".form_tech").val(Math.floor(u.tech/1e3)),n.find(".form_nation_level").val(u.level),1==u.capital?n.find(".form_is_capital:first").trigger("click"):n.find(".form_is_capital:last").trigger("click"),n.find(".form_city_level").val(f.level),e("#city_def").val(f.def),e("#city_wall").val(f.wall),e.each(i,(function(e,t){var r=g();c(r,t)}))},w=function(){var t=e(".attacker_nation"),r=e(".defender_nation");return{attackerGeneral:u(e(".attacker_form")),attackerCity:{level:parseInt(t.find(".form_city_level").val())},attackerNation:{type:D(t.find(".form_nation_type").val()),tech:1e3*parseInt(t.find(".form_tech").val()),level:parseInt(t.find(".form_nation_level").val()),capital:"1"==t.find(".form_is_capital:checked").val()?1:2},defenderGenerals:e(".defender_form").map((function(){return u(e(this))})).toArray(),defenderCity:{def:parseInt(e("#city_def").val()),wall:parseInt(e("#city_wall").val()),level:parseInt(r.find(".form_city_level").val())},defenderNation:{type:D(r.find(".form_nation_type").val()),tech:1e3*parseInt(D(r.find(".form_tech").val())),level:parseInt(D(r.find(".form_nation_level").val())),capital:"1"==r.find(".form_is_capital:checked").val()?3:4},year:parseInt(D(e("#year").val())),month:parseInt(D(e("#month").val())),repeatCnt:parseInt(D(e("#repeat_cnt").val()))}},k=function(t){var r={nation:0,name:"재야",capital:0,level:0,gold:0,rice:2e3,type:"None",tech:0,gennum:200},n={nation:0,supply:1,name:"도시",pop:5e5,agri:1e4,comm:1e4,secu:1e4,def:1e3,wall:1e3,trust:100,pop_max:6e5,agri_max:12e3,comm_max:12e3,secu_max:1e4,def_max:12e3,wall_max:12e3,dead:0,state:0,conflict:"{}"},a=e.extend({},r,t.attackerNation);a.nation=1,a.name="출병국";var o=e.extend({},n,t.attackerCity);o.nation=1,o.city=1;var l=p(t.attackerGeneral);2<=l.officer_level&&l.officer_level<=4?l.officer_city=1:l.officer_city=0;var i=e.extend({},r,t.defenderNation);i.nation=2,i.name="수비국";var c=e.extend({},n,t.defenderCity);c.nation=2,c.city=3,c.wall_max=Math.floor(c.wall/5*6),c.def_max=Math.floor(c.def/5*6);var f=[];return e.each(t.defenderGenerals,(function(){var e=p(this);2<=e.officer_level&&e.officer_level<=4?e.officer_city=3:e.officer_city=0,f.push(e)})),e.extend({},t,{attackerGeneral:l,attackerCity:o,attackerNation:a,defenderGenerals:f,defenderCity:c,defenderNation:i})},x=function(e){for(var t=[],r=0,n=Object.entries(e);rt.name?1:0}));var o=e(''));o.css("background-color",a),o.css("color",function(e){var t,r=j((t=/^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(e))?{r:parseInt(t[1],16),g:parseInt(t[2],16),b:parseInt(t[3],16)}:null);return.299*r.r+.587*r.g+.114*r.b>140}(a)?"black":"white");var l,i,c=A(t);try{for(c.s();!(l=c.n()).done;){var f=l.value,u=e('"));f.npc?u.css("color",j((i=f.npc)>=2?"cyan":1==i?"skyblue":null)):u.css("color","white"),u.css("background-color","black"),o.append(u)}}catch(e){c.e(e)}finally{c.f()}r.append(o)};e.post({url:"j_get_basic_general_list.php",dataType:"json",data:{req:2}}).then((function(t){if(!t.result)return alert(t.reason),e("#importModal").modal("hide"),!1;var a=t.nation,o=t.nationID;r.empty(),0 in t.list&&(a[0]={nation:0,name:"재야",color:"#000000"}),n(T(t.list[o],t.column),a[o].name,a[o].color);for(var l=0,i=Object.keys(t.list);l60?(a="위독",o="red"):n>40?(a="심각",o="magenta"):n>20?(a="중상",o="orange"):n>0&&(a="경상",o="yellow"),r.html(a).css("color",o)})),e(".export_general").on("click",(function(){var t=e(this),r=_(t),n=u(r);console.log(n)})),e(".delete-defender").on("click",(function(){!function(e){!function(e){var t=m(e);t.removeData("general_no");var r=v(t);delete o[r]}(e),e.detach()}(m(e(this)))})),e(".copy-defender").on("click",(function(){!function(e){var t=_(e),r=u(t),n=g(e);c(_(n),r)}(m(e(this)))})),e(".add-defender").on("click",(function(){g()})),e(".btn-general-load").on("click",(function(){e(this).prev()[0].click()})),e(".form_load_general_file").on("change",(function(t){t.preventDefault();var r=e(this),n=m(r),a=j(t.target.files);return s(a,n),!1})),e(".btn-general-import-server").on("click",(function(){var t=e(this),r=m(t),n=e("#importModal");n.data("target",r),n.modal("show")})),e(".btn-general-save").on("click",(function(){var t=e(this),r=_(t),n=u(r),a="general_".concat(n.name,".json"),o=JSON.stringify({objType:"general",data:n},null,4);f()(o,a,"application/json")})),e(".btn-battle-load").on("click",(function(){e(this).prev()[0].click()})),e(".form_load_battle_file").on("change",(function(e){e.preventDefault();var t=j(e.target.files);return d(t),!1})),e(".btn-battle-save").on("click",(function(){var e=w(),t=i.ou.now().toFormat("yyyyMMdd_HHmmss"),r="battle_".concat(t,".json"),n=JSON.stringify({objType:"battle",data:e},null,4);f()(n,r,"application/json")}));var t=e(".general_detail");t.on("dragover dragleave",(function(e){e.stopPropagation(),e.preventDefault()})),t.on("drop",(function(t){t.preventDefault();var r=e(this),n=m(r),a=j(j(t.originalEvent).dataTransfer).files;return s(a,n),!1}));var r=e(".dragpad_battle");r.on("dragover dragleave",(function(e){e.stopPropagation(),e.preventDefault()})),r.on("drop",(function(e){e.preventDefault();var t=j(j(e.originalEvent).dataTransfer).files;return d(t),!1}))}(),l.append(t.clone(!0,!0)),g(),e(".btn-begin_battle").on("click",(function(){var t;t=k(w()),console.log(t),e.ajax({type:"post",url:"j_simulate_battle.php",dataType:"json",data:{action:"battle",query:JSON.stringify(t)}}).then((function(t){console.log(t),t.result?function(t){e("#result_datetime").html(t.datetime),e("#result_warcnt").html(S(t.avgWar)),e("#result_phase").html(S(t.phase)),e("#result_killed").html(S(t.killed)),t.minKilled!=t.maxKilled?(e("#result_maxKilled").html(S(t.maxKilled)),e("#result_minKilled").html(S(t.minKilled)),e("#result_varKilled").show()):e("#result_varKilled").hide(),e("#result_dead").html(S(t.dead)),t.minDead!=t.maxDead?(e("#result_maxDead").html(S(t.maxDead)),e("#result_minDead").html(S(t.minDead)),e("#result_varDead").show()):e("#result_varDead").hide(),e("#result_attackerRice").html(S(t.attackerRice)),e("#result_defenderRice").html(S(t.defenderRice)),e("#result_attackerSkills").html(x(t.attackerSkills)),e(".result_defenderSkills").detach();for(var r=e("#battle_result_summary"),n=0,a=Object.entries(t.defendersSkills);n수비자".concat(parseInt(l)+1," 스킬 | | "));c.find("td").html(x(i)),r.append(c)}e("#generalBattleResultLog").html(t.lastWarLog.generalBattleResultLog),e("#generalBattleDetailLog").html(t.lastWarLog.generalBattleDetailLog)}(t):alert(t.reason)}),(function(e){alert("전투 개시 실패!")}))})),e(".btn-reorder_defender").on("click",(function(){var t;t=k(w()),console.log(t),e.ajax({type:"post",url:"j_simulate_battle.php",dataType:"json",data:{action:"reorder",query:JSON.stringify(t)}}).then((function(e){console.log(e),e.result?function(e){var t,r=A(e);try{for(r.s();!(t=r.n()).done;){var a=t.value;if(!(a in o))return alert("".concat(a,"이 수비자 리스트에 없습니다. 버그인 듯 합니다.")),!0;var l=o[a];l.detach(),n.append(l)}}catch(e){r.e(e)}finally{r.f()}}(e.order):alert(e.reason)}),(function(e){alert("재정렬 실패!")}))}))}))}},r={};function n(e){var a=r[e];if(void 0!==a)return a.exports;var o=r[e]={id:e,loaded:!1,exports:{}};return t[e].call(o.exports,o,o.exports,n),o.loaded=!0,o.exports}n.m=t,e=[],n.O=(t,r,a,o)=>{if(!r){var l=1/0;for(u=0;u=o)&&Object.keys(n.O).every((e=>n.O[e](r[c])))?r.splice(c--,1):(i=!1,o0&&e[u-1][2]>o;u--)e[u]=e[u-1];e[u]=[r,a,o]},n.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return n.d(t,{a:t}),t},n.d=(e,t)=>{for(var r in t)n.o(t,r)&&!n.o(e,r)&&Object.defineProperty(e,r,{enumerable:!0,get:t[r]})},n.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),n.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),n.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.nmd=e=>(e.paths=[],e.children||(e.children=[]),e),n.j=871,(()=>{var e={871:0};n.O.j=t=>0===e[t];var t=(t,r)=>{var a,o,[l,i,c]=r,f=0;for(a in i)n.o(i,a)&&(n.m[a]=i[a]);if(c)var u=c(n);for(t&&t(r);fn(2890)));a=n.O(a)})();
+//# sourceMappingURL=battle_simulator.js.map
\ No newline at end of file
diff --git a/hwe/js/battle_simulator.js.map b/hwe/js/battle_simulator.js.map
new file mode 100644
index 00000000..bc2c94ba
--- /dev/null
+++ b/hwe/js/battle_simulator.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"battle_simulator.js","mappings":"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","sources":["webpack://hidche_lib/webpack/runtime/chunk loaded","webpack://hidche_lib/./hwe/ts/util.ts","webpack://hidche_lib/./hwe/ts/common_legacy.ts","webpack://hidche_lib/./hwe/ts/util/unwrap_any.ts","webpack://hidche_lib/./hwe/ts/battle_simulator.ts","webpack://hidche_lib/webpack/bootstrap","webpack://hidche_lib/webpack/runtime/compat get default export","webpack://hidche_lib/webpack/runtime/define property getters","webpack://hidche_lib/webpack/runtime/global","webpack://hidche_lib/webpack/runtime/hasOwnProperty shorthand","webpack://hidche_lib/webpack/runtime/make namespace object","webpack://hidche_lib/webpack/runtime/node module decorator","webpack://hidche_lib/webpack/runtime/runtimeId","webpack://hidche_lib/webpack/runtime/jsonp chunk loading","webpack://hidche_lib/webpack/startup"],"sourcesContent":["var deferred = [];\n__webpack_require__.O = (result, chunkIds, fn, priority) => {\n\tif(chunkIds) {\n\t\tpriority = priority || 0;\n\t\tfor(var i = deferred.length; i > 0 && deferred[i - 1][2] > priority; i--) deferred[i] = deferred[i - 1];\n\t\tdeferred[i] = [chunkIds, fn, priority];\n\t\treturn;\n\t}\n\tvar notFulfilled = Infinity;\n\tfor (var i = 0; i < deferred.length; i++) {\n\t\tvar [chunkIds, fn, priority] = deferred[i];\n\t\tvar fulfilled = true;\n\t\tfor (var j = 0; j < chunkIds.length; j++) {\n\t\t\tif ((priority & 1 === 0 || notFulfilled >= priority) && Object.keys(__webpack_require__.O).every((key) => (__webpack_require__.O[key](chunkIds[j])))) {\n\t\t\t\tchunkIds.splice(j--, 1);\n\t\t\t} else {\n\t\t\t\tfulfilled = false;\n\t\t\t\tif(priority < notFulfilled) notFulfilled = priority;\n\t\t\t}\n\t\t}\n\t\tif(fulfilled) {\n\t\t\tdeferred.splice(i--, 1)\n\t\t\tvar r = fn();\n\t\t\tif (r !== undefined) result = r;\n\t\t}\n\t}\n\treturn result;\n};","type ErrType = { new(msg?: string): T }\nexport type Nullable = T | null | undefined\n\nexport class RuntimeError extends Error {\n public name = 'RuntimeError';\n constructor(public message: string = '') {\n super(message);\n }\n toString(): string {\n if (this.message) {\n return this.name + ': ' + this.message;\n }\n else {\n return this.name;\n }\n }\n}\n\nexport class NotNullExpected extends RuntimeError {\n public name = 'NotNullExpected';\n}\n\nexport function unwrap(result: Nullable): T {\n if (result === null || result === undefined) {\n throw new NotNullExpected();\n }\n return result;\n}\n\nexport function unwrap_err(result: Nullable, errType: ErrType, errMsg?: string): T {\n if (result === null || result === undefined) {\n throw new errType(errMsg);\n }\n return result;\n}","import { unwrap } from \"./util\";\n\nimport jQuery from \"jquery\";\nimport 'bootstrap';\n\nimport axios from \"axios\";\n\naxios.defaults.headers.common['X-Requested-With'] = 'XMLHttpRequest';\n//TODO: X-Requested-With 믿지 말자.\n\n/** \n * <>& 등을 html에서도 그대로 보이도록 escape주는 함수\n * @see https://stackoverflow.com/questions/24816/escaping-html-strings-with-jquery\n */\nexport const escapeHtml = (() => {\n const entityMap: { [v: string]: string } = {\n '&': '&',\n '<': '<',\n '>': '>',\n '\"': '"',\n \"'\": ''',\n '/': '/',\n '`': '`',\n '=': '='\n };\n\n return function (string: string) {\n return String(string).replace(/[&<>\"'`=/]/g, function (s: string) {\n return entityMap[s];\n });\n }\n})();\n\n/**\n * 변수가 정수인지 확인하는 함수\n * @param {*} n 정수인지 확인하기 위한 인자\n * @return {boolean} 정수인지 여부\n */\nexport function isInt(n: unknown): n is number {\n const v = n as number;\n return +v === v && !(v % 1);\n}\n\n\n//https://gist.github.com/demouth/3217440\n/**\n * mb_strwidth\n * @see http://php.net/manual/function.mb-strwidth.php\n */\nexport function mb_strwidth(str: string): number {\n const l = str.length;\n let length = 0;\n for (let i = 0; i < l; i++) {\n const c = str.charCodeAt(i);\n if (0x0000 <= c && c <= 0x0019) {\n length += 0;\n } else if (0x0020 <= c && c <= 0x1FFF) {\n length += 1;\n } else if (0x2000 <= c && c <= 0xFF60) {\n length += 2;\n } else if (0xFF61 <= c && c <= 0xFF9F) {\n length += 1;\n } else if (0xFFA0 <= c) {\n length += 2;\n }\n }\n return length;\n}\n\n\n/**\n * mb_strimwidth\n * @param String\n * @param int\n * @param int\n * @param String\n * @return String\n * @see http://www.php.net/manual/function.mb-strimwidth.php\n */\nexport function mb_strimwidth(str: string, start: number, width: number, trimmarker = ''): string {\n const trimmakerWidth = mb_strwidth(trimmarker);\n const l = str.length;\n let trimmedLength = 0;\n const trimmedStr: string[] = [];\n for (let i = start; i < l; i++) {\n const c = str.charAt(i);\n const charWidth = mb_strwidth(c);\n const next = str.charAt(i + 1);\n const nextWidth = mb_strwidth(next);\n\n trimmedLength += charWidth;\n trimmedStr.push(c);\n if (trimmedLength + trimmakerWidth + nextWidth > width) {\n trimmedStr.push(trimmarker);\n break;\n }\n }\n return trimmedStr.join('');\n}\n\n/**\n * object의 array를 id를 key로 삼는 object로 재 변환\n */\nexport function convertDictById(arr: ArrayLike): Record {\n const result: Record = {};\n for (const v of Object.values(arr)) {\n result[v.id] = v;\n }\n return result;\n}\n\n/**\n * array를 set 형태의 object로 변환\n */\nexport function convertSet(arr: ArrayLike): Record {\n const result: Record = {};\n for (const v of Object.values(arr)) {\n result[v] = true;\n }\n return result;\n}\n\n\n/** \n * {0}, {1}, {2}형태로 포맷해주는 함수\n */\n\ndeclare global {\n interface String {\n format(...args: (string | number)[]): string;\n }\n}\nString.prototype.format = function (...args: (string | number)[]) {\n return this.replace(/{(\\d+)}/g, function (match, number) {\n return (typeof args[number] != 'undefined') ? args[number].toString() : match;\n });\n};\n\n\nexport function hexToRgb(hex: string): { r: number, g: number, b: number } | null {\n const result = /^#?([a-f\\d]{2})([a-f\\d]{2})([a-f\\d]{2})$/i.exec(hex);\n return result ? {\n r: parseInt(result[1], 16),\n g: parseInt(result[2], 16),\n b: parseInt(result[3], 16)\n } : null;\n}\n\nexport function isBrightColor(color: string): boolean {\n const cv = unwrap(hexToRgb(color));\n if ((cv.r * 0.299 + cv.g * 0.587 + cv.b * 0.114) > 140) {\n return true;\n } else {\n return false;\n }\n}\n\n/**\n * 게임내에서 지원하는 color type만 선택할 수 있도록 해주는 함수\n * @param {string} color #AAAAAA 또는 AAAAAA 형태로 작성된 RGB hex color string\n * @returns {string}\n */\nexport function convColorValue(color: string): string {\n if (color.charAt(0) == '#') {\n color = color.substr(1);\n }\n color = color.toUpperCase();\n\n const colorBase = new Set([\n '000080', '0000FF', '008000', '008080', '00BFFF', '00FF00', '00FFFF', '20B2AA',\n '2E8B57', '483D8B', '6495ED', '7B68EE', '7CFC00', '7FFFD4', '800000', '800080',\n '808000', '87CEEB', 'A0522D', 'A9A9A9', 'AFEEEE', 'BA55D3', 'E0FFFF', 'F5F5DC',\n 'FF0000', 'FF00FF', 'FF6347', 'FFA500', 'FFC0CB', 'FFD700', 'FFDAB9', 'FFFF00',\n 'FFFFFF'\n ]);\n\n if (!colorBase.has(color)) {\n return '000000';\n }\n\n return color;\n}\n\n\nexport function numberWithCommas(x: number): string {\n return x.toString().replace(/\\B(?=(\\d{3})+(?!\\d))/g, \",\");\n}\n\n//linkify가 불러와 있어야함\ndeclare global {\n interface Window {\n linkifyStr: (v: string, k?: Record) => string;\n }\n}\nexport function linkifyStrWithOpt(text: string): string {\n return window.linkifyStr(text, {});\n}\n\n/**\n * 단순한 Template 함수. <%변수명%>으로 template 가능\n * @see https://github.com/krasimir/absurd/blob/master/lib/processors/html/helpers/TemplateEngine.js\n * @param {string} html \n * @param {object} options \n * @returns {string}\n */\nexport function TemplateEngine(html: string, options: Record = {}): string {\n const re = /<%(.+?)%>/g;\n const reExp = /(^( )?(var|if|for|else|switch|case|break|{|}|;))(.*)?/g;\n const code = ['with(obj) { var r=[];\\n'];\n let cursor = 0;\n const add = function (line: string, js?: boolean) {\n js ? code.push(line.match(reExp) ? line + '\\n' : 'r.push(' + line + ');\\n') :\n code.push(line != '' ? 'r.push(\"' + line.replace(/\"/g, '\\\\\"') + '\");\\n' : '');\n return add;\n }\n options.e = escapeHtml;\n options.linkifyStr = linkifyStrWithOpt;\n for (; ;) {\n const match = re.exec(html);\n if (!match) {\n break;\n }\n add(html.slice(cursor, match.index))(match[1], true);\n cursor = match.index + match[0].length;\n }\n add(html.substr(cursor, html.length - cursor));\n\n code.push('return r.join(\"\"); }');\n const compiledCode = code.join('').replace(/[\\r\\t\\n]/g, ' ');\n try {\n return new Function('obj', compiledCode).apply(options, [options]);\n } catch (err) {\n console.error(\"'\" + err.message + \"'\", \" in \\n\\nCode:\\n\", code, \"\\n\");\n throw err;\n }\n}\n\nexport function getIconPath(imgsvr: boolean | 1 | 0, picture: string): string {\n // ../d_shared/common_path.js 필요\n if (!imgsvr) {\n return window.pathConfig.sharedIcon + '/' + picture;\n } else {\n return window.pathConfig.root + '/d_pic/' + picture;\n }\n}\n\nexport function activeFlip($obj?: JQuery): void {\n let $result: JQuery;\n if ($obj === undefined) {\n $result = $('img[data-flip]');\n } else {\n $result = $obj.find('img[data-flip]');\n }\n\n $result.each(function () {\n activeFlipItem($(this));\n });\n\n}\n\nexport function combineObject(item: V[], columnList: K[]): Record {\n const newItem: Record = {};\n for (const columnIdx in columnList) {\n const columnName = columnList[columnIdx];\n newItem[columnName] = item[columnIdx];\n }\n return newItem;\n}\n\nexport function combineArray(array: V[][], columnList: K[]): Record[] {\n const result: Record[] = [];\n for (const key of array.keys()) {\n const item = array[key];\n result[key] = combineObject(item, columnList);\n }\n return result;\n}\n\nexport function activeFlipItem($img: JQuery): void {\n const imageList = [];\n imageList.push($img.attr('src'));\n $.each($img.data('flip').split(','), function (idx, value) {\n value = $.trim(value);\n if (!value) {\n return true;\n }\n imageList.push(value);\n });\n if (imageList.length <= 1) {\n return;\n }\n $img.data('computed_flip_array', imageList);\n $img.data('computed_flip_idx', 0);\n\n $img.click(function () {\n const arr = $img.data('computed_flip_array');\n let idx = $img.data('computed_flip_idx');\n idx = (idx + 1) % (arr.length);\n $img.attr('src', arr[idx]);\n $img.data('computed_flip_idx', idx);\n });\n $img.css('cursor', 'pointer');\n}\n\n\n\nexport function errUnknown(): void {\n alert('작업을 실패했습니다.');\n}\n\n\n\nexport function errUnknownToast(): void {\n jQuery.toast({\n title: '에러!',\n content: '작업을 실패했습니다.',\n type: 'danger',\n delay: 5000\n });\n}\n\nexport function quickReject(errMsg: string): JQuery.Promise {\n if (errMsg === undefined) {\n errMsg = '작업을 실패했습니다.';\n }\n const deferred = $.Deferred();\n void deferred.reject(errMsg);\n return deferred.promise();\n}\n\nexport function nl2br(text: string): string {\n return text.replace(/\\n/g, \"
\");\n}\n/*\nfunction br2nl (text) { \n return text.replace(/<\\s*\\/?br\\s*[\\/]?>/gi, '\\n');\n}\n*/\n\nexport function getNpcColor(npcType: number): 'cyan' | 'skyblue' | null {\n if (npcType >= 2) {\n return 'cyan';\n }\n if (npcType == 1) {\n return 'skyblue';\n }\n return null;\n}\n\nexport function initTooltip($obj?: JQuery): void {\n if ($obj === undefined) {\n $obj = $('.obj_tooltip');\n } else if (!$obj.hasClass('obj_tooltip')) {\n $obj = $obj.find('.obj_tooltip');\n }\n console.log($obj);\n\n $obj.each(function () {\n const $target = $(this);\n\n if ($target.data('installHandler')) {\n return;\n }\n $target.data('installHandler', true);\n\n $target.mouseover(function () {\n const $objTooltip = $(this);\n if ($objTooltip.data('setObjTooltip')) {\n return;\n }\n\n let tooltipClassText = $objTooltip.data('tooltip-class');\n if (!tooltipClassText) {\n tooltipClassText = '';\n }\n const template = ''\n .format(tooltipClassText);\n\n $objTooltip.tooltip({\n title: function () {\n return $.trim($(this).find('.tooltiptext').html());\n },\n template: template,\n html: true\n }).tooltip('show');\n\n $objTooltip.data('setObjTooltip', true);\n });\n });\n}","import { Nullable, NotNullExpected } from \"../util\";\n\n\nexport function unwrap_any(result: Nullable): T {\n if (result === null || result === undefined) {\n throw new NotNullExpected();\n }\n return result as T;\n}\n","import $ from 'jquery';\r\nimport 'bootstrap';\r\nimport { DateTime } from 'luxon';\r\nimport download from 'downloadjs';\r\nimport { unwrap } from './util';\r\nimport { isInteger } from 'lodash';\r\nimport { combineArray, errUnknown, getNpcColor, isBrightColor, numberWithCommas } from './common_legacy';\r\nimport { unwrap_any } from './util/unwrap_any';\r\nimport { BasicGeneralListResponse, InvalidResponse } from './defs';\r\n\r\ntype CityAttackerInfo = {\r\n level: number,\r\n}\r\n\r\ntype CityBasicInfo = {\r\n nation?: number,\r\n level: number,\r\n def: number,\r\n wall: number,\r\n city?: number,\r\n}\r\n\r\ntype NationBasicInfo = {\r\n level: number,\r\n type: string,\r\n tech: number,\r\n capital: number,\r\n}\r\n\r\ntype GeneralInfo = {\r\n no: number,\r\n npc?: number\r\n name: string,\r\n officer_level: number,\r\n explevel: number,\r\n\r\n leadership: number,\r\n horse: string,\r\n strength: number,\r\n weapon: string,\r\n intel: number,\r\n book: string,\r\n item: string,\r\n\r\n injury: number,\r\n\r\n rice: number,\r\n\r\n personal: string,\r\n special2: string,\r\n\r\n crew: number,\r\n crewtype: number,\r\n atmos: number,\r\n train: number,\r\n\r\n dex1: number,\r\n dex2: number,\r\n dex3: number,\r\n dex4: number,\r\n dex5: number,\r\n\r\n defence_train: number,\r\n\r\n warnum: number,\r\n killnum: number,\r\n killcrew: number,\r\n\r\n officer_city?: number,\r\n};\r\n\r\ntype BattleInfo = {\r\n attackerGeneral: GeneralInfo,\r\n attackerCity: CityAttackerInfo|CityBasicInfo,\r\n attackerNation: NationBasicInfo,\r\n defenderGenerals: GeneralInfo[],\r\n defenderCity: CityBasicInfo,\r\n defenderNation: NationBasicInfo,\r\n year: number,\r\n month: number,\r\n repeatCnt: number,\r\n};\r\n\r\ntype ExportedGeneralInfo = {\r\n objType: 'general',\r\n data: GeneralInfo,\r\n}\r\n\r\ntype ExportedBattleInfo = {\r\n objType: 'battle',\r\n data: BattleInfo\r\n}\r\ntype ExportedInfo = ExportedGeneralInfo | ExportedBattleInfo;\r\n\r\ntype BattleResult = {\r\n result:true,\r\n datetime:string,\r\n lastWarLog:{\r\n generalBattleResultLog: string,\r\n generalBattleDetailLog: string,\r\n },\r\n avgWar:number,\r\n phase:number,\r\n killed:number,\r\n maxKilled:number,\r\n minKilled:number,\r\n dead:number,\r\n maxDead:number,\r\n minDead:number,\r\n attackerRice:number,\r\n defenderRice:number,\r\n attackerSkills:Record,\r\n defendersSkills:Record[],\r\n}\r\n\r\ndeclare global {\r\n interface Window {\r\n nation?: NationBasicInfo,\r\n city?: CityBasicInfo,\r\n defaultSpecialDomestic: string,\r\n }\r\n}\r\n\r\n$(function ($) {\r\n\r\n\r\n const $generalForm = $('.form_sample .general_detail');\r\n const $defenderHeaderForm = $('.form_sample .card-header');\r\n const $defenderColumn = $('.defender-column');\r\n\r\n const defenderNoList: Record> = {};\r\n\r\n const $attackerCard = $('.attacker_form');\r\n\r\n const initBasicEvent = function () {\r\n\r\n if (window.nation && window.city) {\r\n $('.form_city_level').val(window.city.level);\r\n $('.form_def').val(window.city.def);\r\n $('.form_wall').val(window.city.wall);\r\n $('.form_nation_type').val(window.nation.type);\r\n $('.form_nation_level').val(window.nation.level);\r\n $('.form_tech').val(window.nation.tech / 1000);\r\n if (window.nation.capital == window.city.city) {\r\n $('.attacker_nation .form_is_capital:first').trigger('click');\r\n $('.defender_nation .form_is_capital:first').trigger('click');\r\n } else {\r\n $('.attacker_nation .form_is_capital:last').trigger('click');\r\n $('.defender_nation .form_is_capital:last').trigger('click');\r\n }\r\n } else {\r\n $('.attacker_nation .form_is_capital:last').trigger('click');\r\n $('.defender_nation .form_is_capital:last').trigger('click');\r\n }\r\n\r\n $('.form_injury').on('change', function () {\r\n const $this = $(this) as JQuery;\r\n const $general = getGeneralDetail($this);\r\n const $helptext = $general.find('.injury_helptext');\r\n\r\n const injury = parseInt($this.val() as string);\r\n //FIXME: PHP 코드와 항상 일치하도록 변경\r\n let text = '건강';\r\n let color = 'white';\r\n if (injury > 60) {\r\n text = '위독';\r\n color = 'red';\r\n } else if (injury > 40) {\r\n text = '심각';\r\n color = 'magenta';\r\n } else if (injury > 20) {\r\n text = '중상';\r\n color = 'orange';\r\n } else if (injury > 0) {\r\n text = '경상';\r\n color = 'yellow';\r\n }\r\n $helptext.html(text).css('color', color);\r\n });\r\n\r\n $('.export_general').on('click', function () {\r\n const $btn = $(this);\r\n const $general = getGeneralDetail($btn);\r\n\r\n const values = exportGeneralInfo($general);\r\n console.log(values);\r\n });\r\n $('.delete-defender').on('click', function () {\r\n const $card = getGeneralFrame($(this));\r\n deleteDefender($card);\r\n });\r\n $('.copy-defender').on('click', function () {\r\n const $card = getGeneralFrame($(this));\r\n copyDefender($card);\r\n });\r\n\r\n $('.add-defender').on('click', function () {\r\n addDefender();\r\n });\r\n\r\n $('.btn-general-load').on('click', function () {\r\n const $file = $(this).prev();\r\n $file[0].click();\r\n })\r\n\r\n $('.form_load_general_file').on('change', function (e) {\r\n e.preventDefault();\r\n const $this = $(this);\r\n const $card = getGeneralFrame($this);\r\n\r\n const files = unwrap(e.target.files);\r\n\r\n importGeneralInfoByFile(files, $card);\r\n return false;\r\n });\r\n\r\n $('.btn-general-import-server').on('click', function () {\r\n const $this = $(this);\r\n const $card = getGeneralFrame($this);\r\n\r\n const $modal = $('#importModal');\r\n $modal.data('target', $card);\r\n $modal.modal('show');\r\n });\r\n\r\n $('.btn-general-save').on('click', function () {\r\n const $this = $(this);\r\n const $general = getGeneralDetail($this);\r\n const generalData = exportGeneralInfo($general);\r\n\r\n const filename = `general_${generalData.name}.json`;\r\n const saveData = JSON.stringify({\r\n objType: 'general',\r\n data: generalData\r\n }, null, 4);\r\n\r\n download(saveData, filename, 'application/json');\r\n });\r\n\r\n $('.btn-battle-load').on('click', function () {\r\n const $file = $(this).prev();\r\n $file[0].click();\r\n })\r\n\r\n $('.form_load_battle_file').on('change', function (e) {\r\n e.preventDefault();\r\n const files = unwrap(e.target.files);\r\n\r\n importBattleInfoByFile(files);\r\n return false;\r\n });\r\n\r\n $('.btn-battle-save').on('click', function () {\r\n const battleData = exportAllData();\r\n const dateText = DateTime.now().toFormat('yyyyMMdd_HHmmss');\r\n const filename = `battle_${dateText}.json`;\r\n const saveData = JSON.stringify({\r\n objType: 'battle',\r\n data: battleData\r\n }, null, 4);\r\n\r\n download(saveData, filename, 'application/json');\r\n })\r\n\r\n const $generals = $('.general_detail');\r\n $generals.on('dragover dragleave', function (e) {\r\n e.stopPropagation()\r\n e.preventDefault()\r\n })\r\n $generals.on('drop', function (e) {\r\n e.preventDefault();\r\n const $this = $(this);\r\n const $card = getGeneralFrame($this);\r\n\r\n const files = unwrap((unwrap(e.originalEvent) as DragEvent).dataTransfer).files;\r\n\r\n importGeneralInfoByFile(files, $card);\r\n return false;\r\n });\r\n\r\n const $battlePad = $('.dragpad_battle');\r\n $battlePad.on('dragover dragleave', function (e) {\r\n e.stopPropagation()\r\n e.preventDefault()\r\n })\r\n $battlePad.on('drop', function (e) {\r\n e.preventDefault();\r\n\r\n const files = unwrap((unwrap(e.originalEvent) as DragEvent).dataTransfer).files;\r\n\r\n importBattleInfoByFile(files);\r\n return false;\r\n });\r\n }\r\n\r\n const importGeneralInfo = function ($general: JQuery, data: GeneralInfo) {\r\n const setVal = function (query: string, val: string | number) {\r\n $general.find(query).val(val).trigger('change');\r\n }\r\n\r\n setVal('.form_general_name', data.name);\r\n\r\n setVal('.form_officer_level', data.officer_level);\r\n setVal('.form_exp_level', data.explevel);\r\n\r\n setVal('.form_leadership', data.leadership);\r\n setVal('.form_general_horse', data.horse);\r\n setVal('.form_strength', data.strength);\r\n setVal('.form_general_weap', data.weapon);\r\n setVal('.form_intel', data.intel);\r\n setVal('.form_general_book', data.book);\r\n setVal('.form_general_item', data.item);\r\n\r\n setVal('.form_injury', data.injury);\r\n\r\n setVal('.form_rice', data.rice);\r\n\r\n setVal('.form_general_character', data.personal);\r\n setVal('.form_general_special_war', data.special2);\r\n\r\n setVal('.form_crew', data.crew);\r\n setVal('.form_crewtype', data.crewtype);\r\n setVal('.form_atmos', data.atmos);\r\n setVal('.form_train', data.train);\r\n\r\n setVal('.form_dex1', data.dex1);\r\n setVal('.form_dex2', data.dex2);\r\n setVal('.form_dex3', data.dex3);\r\n setVal('.form_dex4', data.dex4);\r\n setVal('.form_dex5', data.dex5);\r\n setVal('.form_defence_train', data.defence_train);\r\n\r\n setVal('.form_warnum', data.warnum);\r\n setVal('.form_killnum', data.killnum);\r\n setVal('.form_killcrew', data.killcrew);\r\n\r\n if (!setGeneralNo($general, data.no)) {\r\n setGeneralNo($general, generateNewGeneralNo());\r\n }\r\n }\r\n\r\n const exportGeneralInfo = function ($general: JQuery): GeneralInfo {\r\n const getInt = function (query: string): number {\r\n return parseInt(unwrap_any($general.find(query).val()));\r\n }\r\n\r\n const getVal = function (query: string): string {\r\n return unwrap_any($general.find(query).val());\r\n }\r\n\r\n return {\r\n no: getGeneralNo($general),\r\n name: getVal('.form_general_name'),\r\n officer_level: getInt('.form_officer_level'),\r\n explevel: getInt('.form_exp_level'),\r\n\r\n leadership: getInt('.form_leadership'),\r\n horse: getVal('.form_general_horse'),\r\n strength: getInt('.form_strength'),\r\n weapon: getVal('.form_general_weap'),\r\n intel: getInt('.form_intel'),\r\n book: getVal('.form_general_book'),\r\n item: getVal('.form_general_item'),\r\n\r\n injury: getInt('.form_injury'),\r\n\r\n rice: getInt('.form_rice'),\r\n\r\n personal: getVal('.form_general_character'),\r\n special2: getVal('.form_general_special_war'),\r\n\r\n crew: getInt('.form_crew'),\r\n crewtype: getInt('.form_crewtype'),\r\n atmos: getInt('.form_atmos'),\r\n train: getInt('.form_train'),\r\n\r\n dex1: getInt('.form_dex1'),\r\n dex2: getInt('.form_dex2'),\r\n dex3: getInt('.form_dex3'),\r\n dex4: getInt('.form_dex4'),\r\n dex5: getInt('.form_dex5'),\r\n\r\n defence_train: getInt('.form_defence_train'),\r\n\r\n warnum: getInt('.form_warnum'),\r\n killnum: getInt('.form_killnum'),\r\n killcrew: getInt('.form_killcrew'),\r\n\r\n };\r\n }\r\n\r\n const importBattleInfoByFile = function (files: FileList) {\r\n if (files === null) {\r\n alert('파일 에러!');\r\n return false;\r\n }\r\n\r\n if (files.length < 1) {\r\n alert(\"파일 에러!\");\r\n return false;\r\n }\r\n\r\n\r\n const file = files[0];\r\n if (file.size > 1024 * 1024) {\r\n alert('파일이 너무 큽니다!');\r\n return false;\r\n }\r\n if (file.type === '') {\r\n alert('폴더를 업로드할 수 없습니다!');\r\n return false;\r\n }\r\n\r\n const reader = new FileReader();\r\n reader.onload = function () {\r\n let battleData: ExportedInfo;\r\n try {\r\n battleData = JSON.parse(unwrap_any(reader.result));\r\n } catch (e) {\r\n alert('올바르지 않은 파일 형식입니다');\r\n return false;\r\n }\r\n\r\n if (!('objType' in battleData)) {\r\n alert('파일 형식을 확인할 수 없습니다');\r\n return false;\r\n }\r\n\r\n if (battleData.objType != 'battle') {\r\n alert('전투 데이터가 아닙니다');\r\n return false;\r\n }\r\n\r\n importBattleInfo(battleData.data);\r\n return true;\r\n };\r\n\r\n try {\r\n\r\n reader.readAsText(file);\r\n } catch (e) {\r\n alert('파일을 읽는데 실패했습니다.');\r\n return false;\r\n }\r\n\r\n return true;\r\n }\r\n\r\n const importGeneralInfoByFile = function (files: FileList, $card: JQuery) {\r\n if ($card === undefined) {\r\n $card = addDefender();\r\n }\r\n\r\n if (files === null) {\r\n alert('파일 에러!');\r\n return false;\r\n }\r\n\r\n if (files.length < 1) {\r\n alert(\"파일 에러!\");\r\n return false;\r\n }\r\n\r\n\r\n const file = files[0];\r\n if (file.size > 1024 * 1024) {\r\n alert('파일이 너무 큽니다!');\r\n return false;\r\n }\r\n if (file.type === '') {\r\n alert('폴더를 업로드할 수 없습니다!');\r\n return false;\r\n }\r\n\r\n const reader = new FileReader();\r\n reader.onload = function () {\r\n let generalData: ExportedInfo;\r\n try {\r\n generalData = JSON.parse(unwrap_any(reader.result));\r\n } catch (e) {\r\n alert('올바르지 않은 파일 형식입니다');\r\n return false;\r\n }\r\n\r\n if (!('objType' in generalData)) {\r\n alert('파일 형식을 확인할 수 없습니다');\r\n return false;\r\n }\r\n\r\n if (generalData.objType == 'battle') {\r\n importBattleInfo(generalData.data);\r\n return true;\r\n }\r\n if (generalData.objType != 'general') {\r\n alert('장수 데이터가 아닙니다');\r\n return false;\r\n }\r\n\r\n $card.find('.form_load_general_file').val('');\r\n\r\n importGeneralInfo($card, generalData.data);\r\n return true;\r\n };\r\n\r\n try {\r\n\r\n reader.readAsText(file);\r\n } catch (e) {\r\n alert('파일을 읽는데 실패했습니다.');\r\n return false;\r\n }\r\n\r\n return true;\r\n }\r\n\r\n const extendGeneralInfoForDB = function (generalData: GeneralInfo) {\r\n\r\n const dbVal = {\r\n nation: (generalData.no) <= 1 ? 1 : 2,\r\n city: (generalData.no) <= 1 ? 1 : 3,\r\n turntime: '2018-08-26 12:00',\r\n special: window.defaultSpecialDomestic,\r\n leadership_exp: 0,\r\n strength_exp: 0,\r\n intel_exp: 0,\r\n\r\n gold: 10000,\r\n\r\n dedication: 0,\r\n\r\n recent_war: '2018-08-26 12:00',\r\n experience: Math.pow(generalData.explevel, 2),\r\n };\r\n\r\n return $.extend({}, generalData, dbVal);\r\n }\r\n\r\n const getGeneralFrame = function ($btn: JQuery) {\r\n const $card = $btn.closest('.general_form');\r\n return $card;\r\n }\r\n\r\n const getGeneralDetail = function ($btn: JQuery) {\r\n const $card = getGeneralFrame($btn);\r\n const $general = $card.find('.general_detail');\r\n return $general;\r\n }\r\n\r\n const getGeneralNo = function ($btn: JQuery) {\r\n return parseInt(getGeneralFrame($btn).data('general_no'));\r\n }\r\n\r\n const setGeneralNo = function ($btn: JQuery, value: number) {\r\n if (value == 1) {\r\n //1번은 무조건 공격자임\r\n return false;\r\n }\r\n if (value in defenderNoList) {\r\n return false;\r\n }\r\n const $card = getGeneralFrame($btn);\r\n $card.data('general_no', value);\r\n defenderNoList[value] = $card;\r\n return true;\r\n }\r\n\r\n const generateNewGeneralNo = function () {\r\n for (; ;) {\r\n const newGeneralNo = Math.floor(Math.random() * (1 << 24)) + 2;\r\n if (newGeneralNo in defenderNoList) {\r\n continue;\r\n }\r\n return newGeneralNo;\r\n }\r\n }\r\n\r\n const deleteGeneralNo = function ($btn: JQuery) {\r\n const $card = getGeneralFrame($btn);\r\n $card.removeData('general_no');\r\n const generalNo = getGeneralNo($card);\r\n delete defenderNoList[generalNo];\r\n }\r\n\r\n const addDefender = function ($cardAfter?: JQuery) {\r\n const $newCard = $('');\r\n\r\n if ($cardAfter === undefined) {\r\n $defenderColumn.append($newCard);\r\n } else {\r\n $cardAfter.after($newCard);\r\n }\r\n\r\n $newCard.append($defenderHeaderForm.clone(true, true));\r\n $newCard.append($generalForm.clone(true, true));\r\n\r\n //$newGeneral = getGeneralDetail($newCard);\r\n setGeneralNo($newCard, generateNewGeneralNo());\r\n\r\n return $newCard;\r\n }\r\n\r\n const deleteDefender = function ($card: JQuery) {\r\n deleteGeneralNo($card);\r\n $card.detach();\r\n }\r\n\r\n const copyDefender = function ($card: JQuery) {\r\n const $general = getGeneralDetail($card);\r\n\r\n const generalData = exportGeneralInfo($general);\r\n const $newObj = addDefender($card);\r\n importGeneralInfo(getGeneralDetail($newObj), generalData);\r\n }\r\n\r\n const importBattleInfo = function (battleData: BattleInfo) {\r\n\r\n $('.form_load_battle_file').val('');\r\n console.log(battleData);\r\n\r\n const $attackerNation = $('.attacker_nation');\r\n const $defenderNation = $('.defender_nation');\r\n\r\n const attackerGeneral = battleData.attackerGeneral;\r\n const attackerCity = battleData.attackerCity;\r\n const attackerNation = battleData.attackerNation;\r\n\r\n const defenderGenerals = battleData.defenderGenerals;\r\n const defenderCity = battleData.defenderCity;\r\n const defenderNation = battleData.defenderNation;\r\n\r\n $('#year').val(battleData.year);\r\n $('#month').val(battleData.month);\r\n $('#repeat_cnt').val(battleData.repeatCnt);\r\n\r\n $('.delete-defender').trigger('click');\r\n\r\n $attackerNation.find('.form_nation_type').val(attackerNation.type);\r\n $attackerNation.find('.form_tech').val(Math.floor(attackerNation.tech / 1000));\r\n $attackerNation.find('.form_nation_level').val(attackerNation.level);\r\n if (attackerNation.capital == 1) {\r\n $attackerNation.find('.form_is_capital:first').trigger('click');\r\n } else {\r\n $attackerNation.find('.form_is_capital:last').trigger('click');\r\n }\r\n $attackerNation.find('.form_city_level').val(attackerCity.level);\r\n\r\n importGeneralInfo($('.attacker_form'), attackerGeneral);\r\n\r\n $defenderNation.find('.form_nation_type').val(defenderNation.type);\r\n $defenderNation.find('.form_tech').val(Math.floor(defenderNation.tech / 1000));\r\n $defenderNation.find('.form_nation_level').val(defenderNation.level);\r\n if (defenderNation.capital == 1) {\r\n $defenderNation.find('.form_is_capital:first').trigger('click');\r\n } else {\r\n $defenderNation.find('.form_is_capital:last').trigger('click');\r\n }\r\n $defenderNation.find('.form_city_level').val(defenderCity.level);\r\n $('#city_def').val(defenderCity.def);\r\n $('#city_wall').val(defenderCity.wall);\r\n\r\n $.each(defenderGenerals, function (idx, defenderGeneral) {\r\n const $card = addDefender();\r\n importGeneralInfo($card, defenderGeneral);\r\n });\r\n }\r\n\r\n const exportAllData = function (): BattleInfo {\r\n const $attackerNation = $('.attacker_nation');\r\n const $defenderNation = $('.defender_nation');\r\n\r\n const attackerGeneral = exportGeneralInfo($('.attacker_form'));\r\n\r\n const attackerCity = {\r\n level: parseInt($attackerNation.find('.form_city_level').val() as string),\r\n };\r\n\r\n const attackerNation = {\r\n type: unwrap_any($attackerNation.find('.form_nation_type').val()),\r\n tech: parseInt($attackerNation.find('.form_tech').val() as string) * 1000,\r\n level: parseInt($attackerNation.find('.form_nation_level').val() as string),\r\n capital: $attackerNation.find('.form_is_capital:checked').val() == '1' ? 1 : 2,\r\n }\r\n\r\n const defenderGenerals = $('.defender_form').map(function () {\r\n return exportGeneralInfo($(this));\r\n }).toArray();\r\n\r\n const defenderCity = {\r\n def: parseInt($('#city_def').val() as string),\r\n wall: parseInt($('#city_wall').val() as string),\r\n level: parseInt($defenderNation.find('.form_city_level').val() as string),\r\n };\r\n\r\n const defenderNation = {\r\n type: unwrap_any($defenderNation.find('.form_nation_type').val()),\r\n tech: parseInt(unwrap_any($defenderNation.find('.form_tech').val())) * 1000,\r\n level: parseInt(unwrap_any($defenderNation.find('.form_nation_level').val())),\r\n capital: $defenderNation.find('.form_is_capital:checked').val() == '1' ? 3 : 4,\r\n }\r\n\r\n const year = parseInt(unwrap_any($('#year').val()));\r\n const month = parseInt(unwrap_any($('#month').val()));\r\n const repeatCnt = parseInt(unwrap_any($('#repeat_cnt').val()));\r\n\r\n return {\r\n attackerGeneral: attackerGeneral,\r\n attackerCity: attackerCity,\r\n attackerNation: attackerNation,\r\n\r\n defenderGenerals: defenderGenerals,\r\n defenderCity: defenderCity,\r\n defenderNation: defenderNation,\r\n\r\n year: year,\r\n month: month,\r\n repeatCnt: repeatCnt,\r\n };\r\n }\r\n\r\n const extendAllDataForDB = function (allData: BattleInfo): BattleInfo {\r\n const defaultNation = {\r\n nation: 0,\r\n name: '재야',\r\n capital: 0,\r\n level: 0,\r\n gold: 0,\r\n rice: 2000,\r\n type: 'None',\r\n tech: 0,\r\n gennum: 200,\r\n };\r\n\r\n const defaultCity = {\r\n nation: 0,\r\n supply: 1,\r\n name: '도시',\r\n\r\n pop: 500000,\r\n agri: 10000,\r\n comm: 10000,\r\n secu: 10000,\r\n def: 1000,\r\n wall: 1000,\r\n\r\n trust: 100,\r\n\r\n pop_max: 600000,\r\n agri_max: 12000,\r\n comm_max: 12000,\r\n secu_max: 10000,\r\n def_max: 12000,\r\n wall_max: 12000,\r\n\r\n dead: 0,\r\n\r\n state: 0,\r\n\r\n conflict: '{}',\r\n };\r\n\r\n const attackerNation = $.extend({}, defaultNation, allData.attackerNation);\r\n attackerNation.nation = 1;\r\n attackerNation.name = '출병국';\r\n\r\n const attackerCity = $.extend({}, defaultCity, allData.attackerCity) as CityBasicInfo;\r\n attackerCity.nation = 1;\r\n attackerCity.city = 1;\r\n\r\n const attackerGeneral = extendGeneralInfoForDB(allData.attackerGeneral);\r\n if (2 <= attackerGeneral.officer_level && attackerGeneral.officer_level <= 4) {\r\n attackerGeneral.officer_city = 1;\r\n } else {\r\n attackerGeneral.officer_city = 0;\r\n }\r\n\r\n const defenderNation = $.extend({}, defaultNation, allData.defenderNation);\r\n defenderNation.nation = 2;\r\n defenderNation.name = '수비국';\r\n\r\n const defenderCity = $.extend({}, defaultCity, allData.defenderCity);\r\n defenderCity.nation = 2;\r\n defenderCity.city = 3;\r\n defenderCity.wall_max = Math.floor(defenderCity.wall / 5 * 6);\r\n defenderCity.def_max = Math.floor(defenderCity.def / 5 * 6);\r\n\r\n const defenderGenerals: GeneralInfo[] = [];\r\n $.each(allData.defenderGenerals, function () {\r\n const defenderGeneral = extendGeneralInfoForDB(this);\r\n if (2 <= defenderGeneral.officer_level && defenderGeneral.officer_level <= 4) {\r\n defenderGeneral.officer_city = 3;\r\n } else {\r\n defenderGeneral.officer_city = 0;\r\n }\r\n\r\n defenderGenerals.push(defenderGeneral);\r\n });\r\n\r\n\r\n return $.extend({}, allData, {\r\n attackerGeneral: attackerGeneral,\r\n attackerCity: attackerCity,\r\n attackerNation: attackerNation,\r\n\r\n defenderGenerals: defenderGenerals,\r\n defenderCity: defenderCity,\r\n defenderNation: defenderNation,\r\n });\r\n }\r\n\r\n const parseSkillCount = function (skills: Record) {\r\n const result: string[] = [];\r\n for (const [key, value] of Object.entries(skills)) {\r\n result.push(`${key}(${toPretty(value)}회)`);\r\n }\r\n\r\n if (result.length == 0) {\r\n return '-';\r\n }\r\n return result.join(', ');\r\n }\r\n\r\n const toPretty = function (number: number) {\r\n if (isInteger(number)) {\r\n number = Math.floor(number);\r\n } else {\r\n number = parseFloat(number.toFixed(2));\r\n }\r\n return numberWithCommas(number);\r\n }\r\n\r\n const showBattleResult = function (result: BattleResult) {\r\n $('#result_datetime').html(result.datetime);\r\n $('#result_warcnt').html(toPretty(result.avgWar));\r\n $('#result_phase').html(toPretty(result.phase));\r\n $('#result_killed').html(toPretty(result.killed));\r\n if (result.minKilled != result.maxKilled) {\r\n $('#result_maxKilled').html(toPretty(result.maxKilled));\r\n $('#result_minKilled').html(toPretty(result.minKilled));\r\n $('#result_varKilled').show();\r\n } else {\r\n $('#result_varKilled').hide();\r\n }\r\n $('#result_dead').html(toPretty(result.dead));\r\n if (result.minDead != result.maxDead) {\r\n $('#result_maxDead').html(toPretty(result.maxDead));\r\n $('#result_minDead').html(toPretty(result.minDead));\r\n $('#result_varDead').show();\r\n } else {\r\n $('#result_varDead').hide();\r\n }\r\n\r\n $('#result_attackerRice').html(toPretty(result.attackerRice));\r\n $('#result_defenderRice').html(toPretty(result.defenderRice));\r\n $('#result_attackerSkills').html(parseSkillCount(result.attackerSkills));\r\n\r\n $('.result_defenderSkills').detach();\r\n\r\n const $summary = $('#battle_result_summary');\r\n\r\n for (const [idx, defenderSkills] of Object.entries(result.defendersSkills)) {\r\n console.log(defenderSkills);\r\n const $result = $(`| 수비자${parseInt(idx) + 1} 스킬 | |
`);\r\n $result.find('td').html(parseSkillCount(defenderSkills));\r\n $summary.append($result);\r\n }\r\n\r\n $('#generalBattleResultLog').html(result.lastWarLog.generalBattleResultLog);\r\n $('#generalBattleDetailLog').html(result.lastWarLog.generalBattleDetailLog);\r\n\r\n }\r\n\r\n const beginBattle = function () {\r\n const data = extendAllDataForDB(exportAllData());\r\n console.log(data);\r\n $.ajax({\r\n type: 'post',\r\n url: 'j_simulate_battle.php',\r\n dataType: 'json',\r\n data: {\r\n action: 'battle',\r\n query: JSON.stringify(data),\r\n }\r\n }).then(function (result) {\r\n console.log(result);\r\n if (!result.result) {\r\n alert(result.reason);\r\n return;\r\n }\r\n showBattleResult(result);\r\n\r\n }, function (result) {\r\n alert('전투 개시 실패!');\r\n });\r\n }\r\n\r\n\r\n const reorderDefender = function (defenderOrder: number[]) {\r\n for (const generalNo of defenderOrder) {\r\n\r\n if (!(generalNo in defenderNoList)) {\r\n //음..?\r\n alert(`${generalNo}이 수비자 리스트에 없습니다. 버그인 듯 합니다.`);\r\n return true;\r\n }\r\n\r\n const $defenderObj = defenderNoList[generalNo];\r\n $defenderObj.detach();\r\n $defenderColumn.append($defenderObj);\r\n }\r\n }\r\n\r\n const requestReorderDefender = function () {\r\n const data = extendAllDataForDB(exportAllData());\r\n console.log(data);\r\n $.ajax({\r\n type: 'post',\r\n url: 'j_simulate_battle.php',\r\n dataType: 'json',\r\n data: {\r\n action: 'reorder',\r\n query: JSON.stringify(data),\r\n }\r\n }).then(function (result) {\r\n console.log(result);\r\n if (!result.result) {\r\n alert(result.reason);\r\n return;\r\n }\r\n reorderDefender(result.order);\r\n\r\n }, function (result) {\r\n alert('재정렬 실패!');\r\n });\r\n }\r\n\r\n let initGeneralList = false;\r\n\r\n $('#importFromDB').on('click', function () {\r\n const generalID = $('#modalSelector').val();\r\n console.log(generalID);\r\n\r\n\r\n $.post({\r\n url: 'j_export_simulator_object.php',\r\n dataType: 'json',\r\n data: {\r\n destGeneralID: generalID\r\n }\r\n }).then(function (data) {\r\n\r\n if (!data.result) {\r\n alert(data.reason);\r\n return false;\r\n }\r\n\r\n const $modal = $('#importModal');\r\n const $card = $modal.data('target');\r\n importGeneralInfo($card, data.general);\r\n\r\n $modal.modal('hide');\r\n }, errUnknown);\r\n\r\n\r\n });\r\n\r\n $('#importModal').on('show.bs.modal', function (e) {\r\n if (!initGeneralList) {\r\n const $list = $('#modalSelector');\r\n\r\n const addNation = function (generalList: GeneralInfo[], nationName: string, color: string) {\r\n\r\n generalList.sort(function (lhs, rhs) {\r\n if (lhs.npc != rhs.npc) {\r\n return (lhs.npc??0) - (rhs.npc??0);\r\n }\r\n if (lhs.name < rhs.name) {\r\n return -1;\r\n }\r\n if (lhs.name > rhs.name) {\r\n return 1;\r\n }\r\n return 0;\r\n })\r\n const $optGroup = $(``);\r\n $optGroup.css('background-color', color);\r\n $optGroup.css('color', isBrightColor(color) ? 'black' : 'white');\r\n\r\n for(const general of generalList){\r\n const $item = $(``);\r\n if (general.npc) {\r\n $item.css('color', unwrap(getNpcColor(general.npc)));\r\n } else {\r\n $item.css('color', 'white');\r\n }\r\n $item.css('background-color', 'black');\r\n $optGroup.append($item);\r\n }\r\n $list.append($optGroup);\r\n }\r\n $.post({\r\n url: 'j_get_basic_general_list.php',\r\n dataType: 'json',\r\n data: {\r\n req: 2,\r\n }\r\n }).then(function (data: BasicGeneralListResponse|InvalidResponse) {\r\n if (!data.result) {\r\n alert(data.reason);\r\n $('#importModal').modal('hide');\r\n return false;\r\n }\r\n\r\n const nations = data.nation;\r\n const myNationID = data.nationID;\r\n\r\n $list.empty();\r\n //자국 먼저\r\n\r\n if (0 in data.list) {\r\n nations[0] = {\r\n nation: 0,\r\n name: '재야',\r\n color: '#000000'\r\n };\r\n }\r\n\r\n\r\n\r\n addNation(combineArray(data.list[myNationID], data.column) as GeneralInfo[], nations[myNationID].name, nations[myNationID].color);\r\n\r\n for (const nationID of Object.keys(data.list)) {\r\n if (parseInt(nationID) == myNationID) {\r\n continue;\r\n }\r\n addNation(combineArray(data.list[nationID], data.column) as GeneralInfo[], nations[nationID].name, nations[nationID].color);\r\n }\r\n initGeneralList = true;\r\n }, errUnknown);\r\n }\r\n\r\n });\r\n\r\n initBasicEvent();\r\n $attackerCard.append($generalForm.clone(true, true));\r\n addDefender();\r\n\r\n $('.btn-begin_battle').on('click', function () {\r\n beginBattle();\r\n });\r\n\r\n $('.btn-reorder_defender').on('click', function () {\r\n requestReorderDefender();\r\n })\r\n});","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\tid: moduleId,\n\t\tloaded: false,\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Flag the module as loaded\n\tmodule.loaded = true;\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n// expose the modules object (__webpack_modules__)\n__webpack_require__.m = __webpack_modules__;\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\n\t}\n})();","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","__webpack_require__.nmd = (module) => {\n\tmodule.paths = [];\n\tif (!module.children) module.children = [];\n\treturn module;\n};","__webpack_require__.j = 871;","// no baseURI\n\n// object to store loaded and loading chunks\n// undefined = chunk not loaded, null = chunk preloaded/prefetched\n// [resolve, reject, Promise] = chunk loading, 0 = chunk loaded\nvar installedChunks = {\n\t871: 0\n};\n\n// no chunk on demand loading\n\n// no prefetching\n\n// no preloaded\n\n// no HMR\n\n// no HMR manifest\n\n__webpack_require__.O.j = (chunkId) => (installedChunks[chunkId] === 0);\n\n// install a JSONP callback for chunk loading\nvar webpackJsonpCallback = (parentChunkLoadingFunction, data) => {\n\tvar [chunkIds, moreModules, runtime] = data;\n\t// add \"moreModules\" to the modules object,\n\t// then flag all \"chunkIds\" as loaded and fire callback\n\tvar moduleId, chunkId, i = 0;\n\tfor(moduleId in moreModules) {\n\t\tif(__webpack_require__.o(moreModules, moduleId)) {\n\t\t\t__webpack_require__.m[moduleId] = moreModules[moduleId];\n\t\t}\n\t}\n\tif(runtime) var result = runtime(__webpack_require__);\n\tif(parentChunkLoadingFunction) parentChunkLoadingFunction(data);\n\tfor(;i < chunkIds.length; i++) {\n\t\tchunkId = chunkIds[i];\n\t\tif(__webpack_require__.o(installedChunks, chunkId) && installedChunks[chunkId]) {\n\t\t\tinstalledChunks[chunkId][0]();\n\t\t}\n\t\tinstalledChunks[chunkIds[i]] = 0;\n\t}\n\treturn __webpack_require__.O(result);\n}\n\nvar chunkLoadingGlobal = self[\"webpackChunkhidche_lib\"] = self[\"webpackChunkhidche_lib\"] || [];\nchunkLoadingGlobal.forEach(webpackJsonpCallback.bind(null, 0));\nchunkLoadingGlobal.push = webpackJsonpCallback.bind(null, chunkLoadingGlobal.push.bind(chunkLoadingGlobal));","// startup\n// Load entry module and return exports\n// This entry module depends on other loaded chunks and execution need to be delayed\nvar __webpack_exports__ = __webpack_require__.O(undefined, [216], () => (__webpack_require__(2890)))\n__webpack_exports__ = __webpack_require__.O(__webpack_exports__);\n"],"names":["deferred","NotNullExpected","message","this","name","Error","unwrap","result","combineObject","item","columnList","newItem","columnIdx","combineArray","array","keys","key","errUnknown","alert","unwrap_any","String","prototype","format","args","replace","match","number","toString","$","$generalForm","$defenderHeaderForm","$defenderColumn","defenderNoList","$attackerCard","importGeneralInfo","$general","data","setVal","query","val","find","trigger","officer_level","explevel","leadership","horse","strength","weapon","intel","book","injury","rice","personal","special2","crew","crewtype","atmos","train","dex1","dex2","dex3","dex4","dex5","defence_train","warnum","killnum","killcrew","setGeneralNo","no","generateNewGeneralNo","exportGeneralInfo","getInt","parseInt","getVal","getGeneralNo","importBattleInfoByFile","files","length","file","size","type","reader","FileReader","onload","battleData","JSON","parse","e","objType","importBattleInfo","readAsText","importGeneralInfoByFile","$card","undefined","addDefender","generalData","extendGeneralInfoForDB","dbVal","nation","city","turntime","special","window","defaultSpecialDomestic","leadership_exp","strength_exp","intel_exp","gold","dedication","recent_war","experience","Math","pow","extend","getGeneralFrame","$btn","closest","getGeneralDetail","value","newGeneralNo","floor","random","$cardAfter","$newCard","append","after","clone","console","log","$attackerNation","$defenderNation","attackerGeneral","attackerCity","attackerNation","defenderGenerals","defenderCity","defenderNation","year","month","repeatCnt","tech","level","capital","def","wall","each","idx","defenderGeneral","exportAllData","map","toArray","extendAllDataForDB","allData","defaultNation","gennum","defaultCity","supply","pop","agri","comm","secu","trust","pop_max","agri_max","comm_max","secu_max","def_max","wall_max","dead","state","conflict","officer_city","push","parseSkillCount","skills","Object","entries","toPretty","join","parseFloat","toFixed","initGeneralList","on","generalID","post","url","dataType","destGeneralID","then","reason","$modal","general","modal","$list","addNation","generalList","nationName","color","sort","lhs","rhs","npc","$optGroup","css","cv","exec","r","g","b","isBrightColor","npcType","$item","req","nations","myNationID","nationID","empty","list","column","$this","$helptext","text","html","values","removeData","generalNo","deleteGeneralNo","detach","deleteDefender","$newObj","copyDefender","prev","click","preventDefault","target","filename","saveData","stringify","dateText","toFormat","$generals","stopPropagation","originalEvent","dataTransfer","$battlePad","initBasicEvent","ajax","action","datetime","avgWar","phase","killed","minKilled","maxKilled","show","hide","minDead","maxDead","attackerRice","defenderRice","attackerSkills","$summary","defendersSkills","defenderSkills","$result","lastWarLog","generalBattleResultLog","generalBattleDetailLog","showBattleResult","defenderOrder","$defenderObj","reorderDefender","order","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","exports","module","id","loaded","__webpack_modules__","call","m","O","chunkIds","fn","priority","notFulfilled","Infinity","i","fulfilled","j","every","splice","n","getter","__esModule","d","a","definition","o","defineProperty","enumerable","get","globalThis","Function","obj","prop","hasOwnProperty","Symbol","toStringTag","nmd","paths","children","installedChunks","chunkId","webpackJsonpCallback","parentChunkLoadingFunction","moreModules","runtime","chunkLoadingGlobal","self","forEach","bind","__webpack_exports__"],"sourceRoot":""}
\ No newline at end of file
diff --git a/hwe/js/install.js b/hwe/js/install.js
index 7cd2a10d..4f82d4d6 100644
--- a/hwe/js/install.js
+++ b/hwe/js/install.js
@@ -1,2 +1,2 @@
-(()=>{"use strict";var e,r={609:(e,r,t)=>{t(5666),t(9826),t(2222),t(1058),t(603),t(4916),t(9714),t(1539),t(8674),t(9720),t(2526),t(1817),t(2165),t(6992),t(8783),t(3948),t(7042),t(1038),t(7941),t(7327),t(5003),t(4747),t(9337);var n=t(9755),a=t.n(n),o=(t(3734),t(9669)),i=t.n(o),u=t(1469),l=t.n(u),c=(t(1532),t(3123),t(5715)),s=t(7037),f=t.n(s);function p(e,r){(null==r||r>e.length)&&(r=e.length);for(var t=0,n=new Array(r);t=e.length?{done:!0}:{done:!1,value:e[n++]}},e:function(e){throw e},f:a}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var o,i=!0,u=!1;return{s:function(){t=t.call(e)},n:function(){var e=t.next();return i=e.done,e},e:function(e){u=!0,o=e},f:function(){try{i||null==t.return||t.return()}finally{if(u)throw o}}}}(e);try{for(n.s();!(r=n.n()).done;){var a=r.value,o=a.name,i=a.value;if(!f()(o))throw new TypeError("".concat(o," is not string"));if(!f()(i))throw new TypeError("".concat(i," is not string"));if(""!==o&&"[]"!==o)if(o.length>2&&"[]"==o.slice(-2)){var u=o.slice(0,-2);u in t?t[u].push(i):t[u]=[i]}else t[o]=i}}catch(e){n.e(e)}finally{n.f()}return t}function v(e,r){(null==r||r>e.length)&&(r=e.length);for(var t=0,n=new Array(r);t".concat(p,""));if(d.addClass("invalid-feedback"),"radio"==c.prop("type")){var v=c.parents(".btn-group");d.insertAfter(v),v.addClass("is-invalid")}else if("checkbox"==c.prop("type")){var h=c.parent("label");h.parent(".btn-group").length&&(h=h.parent(".btn-group")),d.insertAfter(h),h.addClass("is-invalid")}else d.insertAfter(c),c.addClass("is-invalid")}}s.inputs.each((function(){this.name in r||this.classList.add("is-valid")}))}));case 6:if(void 0!==(c=e.sent)){e.next=9;break}return e.abrupt("return",void 0);case 9:return this.clearErrMsg(),this.inputs.addClass("is-valid"),e.abrupt("return",c);case 12:case"end":return e.stop()}var f,p}),e,this)})),o=function(){var e=this,r=arguments;return new Promise((function(t,a){var o=n.apply(e,r);function i(e){h(o,t,a,i,u,"next",e)}function u(e){h(o,t,a,i,u,"throw",e)}i(void 0)}))},function(){return o.apply(this,arguments)})}])&&y(r.prototype,t),e}(),b=t(1584),g=t.n(b),w=t(1763),j=t.n(w);function O(e,r){var t="undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(!t){if(Array.isArray(e)||(t=x(e))||r&&e&&"number"==typeof e.length){t&&(e=t);var n=0,a=function(){};return{s:a,n:function(){return n>=e.length?{done:!0}:{done:!1,value:e[n++]}},e:function(e){throw e},f:a}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var o,i=!0,u=!1;return{s:function(){t=t.call(e)},n:function(){var e=t.next();return i=e.done,e},e:function(e){u=!0,o=e},f:function(){try{i||null==t.return||t.return()}finally{if(u)throw o}}}}function x(e,r){if(e){if("string"==typeof e)return _(e,r);var t=Object.prototype.toString.call(e).slice(8,-1);return"Object"===t&&e.constructor&&(t=e.constructor.name),"Map"===t||"Set"===t?Array.from(e):"Arguments"===t||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t)?_(e,r):void 0}}function _(e,r){(null==r||r>e.length)&&(r=e.length);for(var t=0,n=new Array(r);te.length)&&(r=e.length);for(var t=0,n=new Array(r);t").attr("label",w),x=0,_=Object.entries(j);x<_.length;x++)A=P(_[x],2),S=A[0],I=A[1],E=a()("