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(){ $('.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-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_general_level', data.level); setVal('.form_exp_level', data.explevel); setVal('.form_injury', data.injury); setVal('.form_leadership', data.leader); setVal('.form_general_horse', data.horse); setVal('.form_power', data.power); setVal('.form_general_weap', data.weap); 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_dex0', data.dex0); setVal('.form_dex10', data.dex10); setVal('.form_dex20', data.dex20); setVal('.form_dex30', data.dex30); setVal('.form_dex40', data.dex40); setVal('.form_defend_mode', data.mode); 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'), level:getInt('.form_general_level'), explevel:getInt('.form_exp_level'), leader:getInt('.form_leadership'), horse:getInt('.form_general_horse'), power:getInt('.form_power'), weap:getInt('.form_general_weap'), intel:getInt('.form_intel'), book:getInt('.form_general_book'), item:getInt('.form_general_item'), injury:getInt('.form_injury'), rice:getInt('.form_rice'), personal:getInt('.form_general_character'), special2:getInt('.form_general_special_war'), crew:getInt('.form_crew'), crewtype:getInt('.form_crewtype'), atmos:getInt('.form_atmos'), train:getInt('.form_train'), dex0:getInt('.form_dex0'), dex10:getInt('.form_dex10'), dex20:getInt('.form_dex20'), dex30:getInt('.form_dex30'), dex40:getInt('.form_dex40'), mode:getInt('.form_defend_mode'), }; } 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:0, leader2:0, power2:0, intel2:0, gold:10000, dedication:0, warnum:0, killnum:0, deathnum:0, killcrew:20000, deathcrew:20000, recwar:'SUCCESS', 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:parseInt($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:parseInt($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:0, tech:0, totaltech:0, gennum:200, }; var defaultCity = { nation:0, supply:1, name:'도시', pop:500000, agri:10000, comm:10000, secu:10000, def:1000, wall:1000, rate:100, pop2:600000, agri2:12000, comm2:12000, secu2:10000, def2:12000, wall2:12000, dead:0, state:0, gen1:0, gen2:0, gen3:0, conflict:'{}', }; var attackerNation = $.extend({}, defaultNation, allData.attackerNation); attackerNation.nation = 1; attackerNation.name = '출병국'; attackerNation.totaltech = attackerNation.tech * attackerNation.gennum; var attackerCity = $.extend({}, defaultCity, allData.attackerCity); attackerCity.nation = 1; attackerCity.city = 1; var attackerGeneral = extendGeneralInfoForDB(allData.attackerGeneral); if(attackerGeneral.level == 4){ attackerCity.gen1 = attackerGeneral.no; } if(attackerGeneral.level == 3){ attackerCity.gen2 = attackerGeneral.no; } if(attackerGeneral.level == 2){ attackerCity.gen3 = attackerGeneral.no; } var defenderNation = $.extend({}, defaultNation, allData.defenderNation); defenderNation.nation = 2; defenderNation.name = '수비국'; defenderNation.totaltech = defenderNation.tech * defenderNation.gennum; var defenderCity = $.extend({}, defaultCity, allData.defenderCity); defenderCity.nation = 2; defenderCity.city = 3; defenderCity.wall2 = defenderCity.wall/5*6; defenderCity.def2 = defenderCity.def/5*6; var defenderGenerals = []; $.each(allData.defenderGenerals, function(){ var defenderGeneral = extendGeneralInfoForDB(this); if(defenderGeneral.level == 4){ defenderCity.gen1 = defenderGeneral.no; } if(defenderGeneral.level == 3){ defenderCity.gen2 = defenderGeneral.no; } if(defenderGeneral.level == 2){ defenderCity.gen3 = defenderGeneral.no; } 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('재정렬 실패!'); }); } initBasicEvent(); $attackerCard.append($generalForm.clone(true,true)); addDefender(); $('.btn-begin_battle').click(function(){ beginBattle(); }); $('.btn-reorder_defender').click(function(){ requestReorderDefender(); }) });