diff --git a/hwe/battle_simulator.php b/hwe/battle_simulator.php index 113ba8d4..0fd78640 100644 --- a/hwe/battle_simulator.php +++ b/hwe/battle_simulator.php @@ -1,481 +1,536 @@ -setReadOnly(); -$db = DB::db(); -$gameStor = KVStorage::getStorage($db, 'game_env'); - -$startYear = $gameStor->getValue('startyear'); - -?> - - - -<?=UniqueConst::$serverName?>: 전투 시뮬레이터 - - - - - - - - - - - - - - - - - -
-
-
- 전역 설정 -
-
-
-
-
- -
- 년 시작 -
- -
- -
- -
- -
-
-
-
- -
-
-
-
-
-
-
-
- 출병국 설정 -
-
-
-
- 국가 성향 -
- -
- 기술 -
- -
- 등급 -
-
-
-
- 국가 규모 -
- -
- 도시 규모 -
- -
- 수도 -
-
- - -
- -
-
- -
-
-
-
-
-
출병자 설정
- -
-
-
-
-
-
- 수비국 설정 -
-
-
-
- 국가 성향 -
- -
- 기술 -
- -
- 등급 -
-
-
-
- 국가 규모 -
- -
- 도시 규모 -
- -
- 수도 -
-
- - -
-
-
-
- 수비 -
- -
- 성벽 -
- -
-
-
-
-
-
수비자 설정
- -
-
-
-
-
수비자 설정
- -
-
-
-
- 이름 -
- -
- 직위 -
- -
- Level -
- - -
-
-
- 통솔 -
- -
- 무력 -
- -
- 지력 -
- -
-
-
- 명마 -
- -
- 무기 -
- -
- 서적 -
- -
-
-
- 부상 -
- -
- %(건강) -
-
- 군량 -
- -
- 도구 -
- -
-
-
- 병종 -
- -
- 병사 -
- -
- 성격 -
- -
-
-
- 훈련 -
- -
- 사기 -
- -
- 전특 -
- -
-
-
- 보병숙련 -
- -
- 궁병숙련 -
- -
- 기병숙련 -
- -
-
-
- 귀병숙련 -
- -
- 차병숙련 -
- -
- 수비여부 -
- -
-
-
- - -
-
-
-
- 전투 요약 -
- - - - - - - - - - - - -
전투 일시
전투 횟수
전투 페이즈
준 피해0 (0 ~ 0)
받은 피해0 (0 ~ 0)
출병자 군량 소모
수비자 군량 소모
공격자 스킬
수비자1 스킬
-
-
-
-
-
- 마지막 전투 로그 -
-
- -
-
-
-
-
-
- 마지막 전투 상세 로그 -
-
- -
-
-
-
-
- +setReadOnly(); +$db = DB::db(); +$gameStor = KVStorage::getStorage($db, 'game_env'); + +$gameStor->cacheValues(['startyear', 'year']); +$startYear = $gameStor->startyear; +$year = $gameStor->year; + +$me = $db->queryFirstRow('SELECT no, nation, city FROM general WHERE owner =%i', Session::getUserID()); + +if($me){ + $generalID = $me['no']; + $nationID = $me['nation']; + $city = $db->queryFirstRow('SELECT city, level, def, wall FROM city WHERE city = %i', $me['city']); +} +else{ + $generalID = 0; + $nationID = 0; + $city = [ + 'city'=>0, + 'level'=>5, + 'def'=>1000, + 'wall'=>1000, + ]; +} + +if($nationID){ + $nation = $db->queryFirstRow('SELECT level, type, tech, capital FROM nation WHERE nation = %i', $nationID); +} +else{ + $nation = null; +} + +?> + + + +<?=UniqueConst::$serverName?>: 전투 시뮬레이터 + + + + + + + + + + + + + + + + + +
+
+
+ 전역 설정 +
+
+
+
+
+ +
+ 년 시작 +
+ +
+ +
+ +
+ +
+
+
+
+ +
+
+
+
+
+
+
+
+ 출병국 설정 +
+
+
+
+ 국가 성향 +
+ +
+ 기술 +
+ +
+ 등급 +
+
+
+
+ 국가 규모 +
+ +
+ 도시 규모 +
+ +
+ 수도 +
+
+ + +
+ +
+
+ +
+
+
+
+
+
출병자 설정
+ +
+
+
+
+
+
+ 수비국 설정 +
+
+
+
+ 국가 성향 +
+ +
+ 기술 +
+ +
+ 등급 +
+
+
+
+ 국가 규모 +
+ +
+ 도시 규모 +
+ +
+ 수도 +
+
+ + +
+
+
+
+ 수비 +
+ +
+ 성벽 +
+ +
+
+
+
+
+
수비자 설정
+ +
+
+
+
+
수비자 설정
+ +
+
+
+
+ 이름 +
+ +
+ 직위 +
+ +
+ Level +
+ + +
+
+
+ 통솔 +
+ +
+ 무력 +
+ +
+ 지력 +
+ +
+
+
+ 명마 +
+ +
+ 무기 +
+ +
+ 서적 +
+ +
+
+
+ 부상 +
+ +
+ %(건강) +
+
+ 군량 +
+ +
+ 도구 +
+ +
+
+
+ 병종 +
+ +
+ 병사 +
+ +
+ 성격 +
+ +
+
+
+ 훈련 +
+ +
+ 사기 +
+ +
+ 전특 +
+ +
+
+
+ 보병숙련 +
+ +
+ 궁병숙련 +
+ +
+ 기병숙련 +
+ +
+
+
+ 귀병숙련 +
+ +
+ 차병숙련 +
+ +
+ 수비여부 +
+ +
+
+
+ + +
+
+
+
+ 전투 요약 +
+ + + + + + + + + + + + +
전투 일시
전투 횟수
전투 페이즈
준 피해0 (0 ~ 0)
받은 피해0 (0 ~ 0)
출병자 군량 소모
수비자 군량 소모
공격자 스킬
수비자1 스킬
+
+
+
+
+
+ 마지막 전투 로그 +
+
+ +
+
+
+
+
+
+ 마지막 전투 상세 로그 +
+
+ +
+
+
+
+
+ + \ No newline at end of file diff --git a/hwe/j_export_simulator_object.php b/hwe/j_export_simulator_object.php new file mode 100644 index 00000000..10a734a9 --- /dev/null +++ b/hwe/j_export_simulator_object.php @@ -0,0 +1,73 @@ +false, + 'reason'=>'올바르지 않은 장수 코드입니다' + ]); +} + +$session = Session::requireGameLogin([])->setReadOnly(); + +$db = DB::db(); + +increaseRefresh("시뮬레이터 추출", 1); + +$userID = Session::getUserID(); +$me = $db->queryFirstRow('SELECT no,nation from general where owner=%i', $userID); +$nationID = $me['nation']; + +$reqColumns = [ + 'nation', + 'name', 'officer_level', 'explevel', 'injury', + 'leadership', 'horse', 'strength', 'weapon', 'intel', 'book', 'item', + 'rice', 'personal', 'special2', + 'crew', 'crewtype', + 'atmos', 'train', 'dex1', 'dex2', 'dex3', 'dex4', 'dex5', 'defence_train' +]; + +$dummyItems = [ + 'officer_level'=>1, + 'weapon'=>'None', + 'book'=>'None', + 'item'=>'None', + 'crew'=>0, + 'crewtype'=>GameUnitConst::DEFAULT_CREWTYPE, + 'rice'=>10000, + 'train'=>GameConst::$maxTrainByCommand, + 'atmos'=>GameConst::$maxTrainByCommand, + 'dex1'=>0, + 'dex2'=>0, + 'dex3'=>0, + 'dex4'=>0, + 'dex5'=>0, + 'defence_train'=>80 +]; + +$rawDestGeneral = $db->queryFirstRow('SELECT %l FROM general WHERE no=%i', Util::formatListOfBackticks($reqColumns), $destGeneralID); + +if($nationID == 0 || $rawDestGeneral['nation'] != $nationID){ + foreach($dummyItems as $key=>$val){ + $rawDestGeneral[$key] = $val; + } +} + +foreach(['dex1', 'dex2', 'dex3', 'dex4', 'dex5'] as $dexKey){ + $dex = $rawDestGeneral[$dexKey]; + $rawDestGeneral[$dexKey] = getDexLevelList()[getDexLevel($dex)][0]; +} + +Json::die([ + 'result'=>true, + 'reason'=>'success', + 'general'=>$rawDestGeneral, +]); \ No newline at end of file diff --git a/hwe/j_get_basic_general_list.php b/hwe/j_get_basic_general_list.php new file mode 100644 index 00000000..e5ac83f0 --- /dev/null +++ b/hwe/j_get_basic_general_list.php @@ -0,0 +1,36 @@ +query('SELECT no, name, npc, nation FROM general'), 'no'); +$nationID = $rawList[$generalID]['nation']; + + +$result = [ + 'result'=>true, + 'reason'=>'success', + 'nationID'=>$nationID, + 'generalID'=>$generalID, + 'column'=>['no', 'name', 'npc'] +]; + +$resultItem = []; +foreach(Util::arrayGroupBy($rawList, 'nation') as $subNationID=>$generals){ + $subNation = []; + foreach($generals as $general){ + $subNation[] = [$general['no'], $general['name'], $general['npc']]; + } + $resultItem[$subNationID] = $subNation; +} + +$result['list'] = $resultItem; +$result['nation'] = Util::convertArrayToDict($db->query('SELECT nation, name, color FROM nation'), 'nation'); +Json::die($result); \ No newline at end of file diff --git a/hwe/j_get_general_list.php b/hwe/j_get_general_list.php index 4a0854d0..9222ba15 100644 --- a/hwe/j_get_general_list.php +++ b/hwe/j_get_general_list.php @@ -1,109 +1,109 @@ -isGameLoggedIn()){ - increaseRefresh("장수일람", 2); - - $me = $db->queryFirstRow('SELECT con, turntime FROM general WHERE owner=%i', $userID); - $con = checkLimit($me['con']); - if ($con >= 2) { - Json::die([ - 'result'=>false, - 'reason'=>'접속 제한중입니다. 1턴 이내에 너무 많은 갱신을 하셨습니다.' - ]); - } -} -else{ - $availableNextCall = $session->availableNextCallGetGeneralList??'2000-01-01 00:00:00'; - $now = new \DateTimeImmutable(); - - if($now <= new \DateTimeImmutable($availableNextCall) && $session->userGrade < 5){ - Json::die([ - 'result'=>false, - 'reason'=>"장수 리스트는 10초에 한번 갱신 가능합니다.\n다음 시간 : ".$availableNextCall - ]); - } - - $availableNextCall = $now->add(new \DateInterval('PT10S'))->format('Y-m-d H:i:s'); - $session->availableNextCallGetGeneralList = $availableNextCall; -} - -$session->setReadOnly(); - -$rawGeneralList = $db->queryAllLists('SELECT owner,no,picture,imgsvr,npc,age,nation,special,special2,personal,name,owner_name as ownerName,injury,leadership,strength,intel,experience,dedication,officer_level,killturn,connect from general'); - -$ownerNameList = []; -if($gameStor->isunited){ - foreach(RootDB::db()->queryAllLists('SELECT no, name FROM member') as [$ownerID, $ownerName]){ - $ownerNameList[$ownerID] = $ownerName; - } -} - -$generalList = []; -foreach($rawGeneralList as $rawGeneral){ - [$owner,$no,$picture,$imgsvr,$npc,$age,$nation,$special,$special2,$personal,$name,$ownerName,$injury,$leadership,$strength,$intel,$experience,$dedication,$officerLevel,$killturn,$connectCnt] = $rawGeneral; - - if(key_exists($owner, $ownerNameList)){ - $ownerName = $ownerNameList[$owner]; - } - - $nationArr = getNationStaticInfo($nation); - $lbonus = calcLeadershipBonus($officerLevel, $nationArr['level']); - - $generalList[] = [ - $no, - $picture, - $imgsvr, - $npc, - $age, - $nationArr['name'], - getGeneralSpecialDomesticName($special), - getGeneralSpecialWarName($special2), - getGenChar($personal), - $name, - $npc==1?$ownerName:null, - $injury, - $leadership, - $lbonus, - $strength, - $intel, - getExpLevel($experience), - getHonor($experience), - getDed($dedication), - getOfficerLevelText($officerLevel, $nationArr['level']), - $killturn, - $connectCnt - ]; -} - -$result = [ - 'result'=>'true', - 'list'=>$generalList, -]; - -if($withToken){ - $now = (new \DateTimeImmutable())->format('Y-m-d H:i:s'); - $tokens = []; - foreach($db->query('SELECT * FROM select_npc_token WHERE `valid_until`>=%s', $now) as $token){ - $validUntil = $token['valid_until']; - - foreach(Json::decode($token['pick_result']) as $pickResult){ - $tokens[$pickResult['no']]=$pickResult['keepCnt']; - } - } - $result['token'] = $tokens; -} - -Json::die($result); +isGameLoggedIn()){ + increaseRefresh("장수일람", 2); + + $me = $db->queryFirstRow('SELECT con, turntime FROM general WHERE owner=%i', $userID); + $con = checkLimit($me['con']); + if ($con >= 2) { + Json::die([ + 'result'=>false, + 'reason'=>'접속 제한중입니다. 1턴 이내에 너무 많은 갱신을 하셨습니다.' + ]); + } +} +else{ + $availableNextCall = $session->availableNextCallGetGeneralList??'2000-01-01 00:00:00'; + $now = new \DateTimeImmutable(); + + if($now <= new \DateTimeImmutable($availableNextCall) && $session->userGrade < 5){ + Json::die([ + 'result'=>false, + 'reason'=>"장수 리스트는 10초에 한번 갱신 가능합니다.\n다음 시간 : ".$availableNextCall + ]); + } + + $availableNextCall = $now->add(new \DateInterval('PT10S'))->format('Y-m-d H:i:s'); + $session->availableNextCallGetGeneralList = $availableNextCall; +} + +$session->setReadOnly(); + +$rawGeneralList = $db->queryAllLists('SELECT owner,no,picture,imgsvr,npc,age,nation,special,special2,personal,name,owner_name as ownerName,injury,leadership,strength,intel,experience,dedication,officer_level,killturn,connect from general'); + +$ownerNameList = []; +if($gameStor->isunited){ + foreach(RootDB::db()->queryAllLists('SELECT no, name FROM member') as [$ownerID, $ownerName]){ + $ownerNameList[$ownerID] = $ownerName; + } +} + +$generalList = []; +foreach($rawGeneralList as $rawGeneral){ + [$owner,$no,$picture,$imgsvr,$npc,$age,$nation,$special,$special2,$personal,$name,$ownerName,$injury,$leadership,$strength,$intel,$experience,$dedication,$officerLevel,$killturn,$connectCnt] = $rawGeneral; + + if(key_exists($owner, $ownerNameList)){ + $ownerName = $ownerNameList[$owner]; + } + + $nationArr = getNationStaticInfo($nation); + $lbonus = calcLeadershipBonus($officerLevel, $nationArr['level']); + + $generalList[] = [ + $no, + $picture, + $imgsvr, + $npc, + $age, + $nationArr['name'], + getGeneralSpecialDomesticName($special), + getGeneralSpecialWarName($special2), + getGenChar($personal), + $name, + $npc==1?$ownerName:null, + $injury, + $leadership, + $lbonus, + $strength, + $intel, + getExpLevel($experience), + getHonor($experience), + getDed($dedication), + getOfficerLevelText($officerLevel, $nationArr['level']), + $killturn, + $connectCnt + ]; +} + +$result = [ + 'result'=>'true', + 'list'=>$generalList, +]; + +if($withToken){ + $now = (new \DateTimeImmutable())->format('Y-m-d H:i:s'); + $tokens = []; + foreach($db->query('SELECT * FROM select_npc_token WHERE `valid_until`>=%s', $now) as $token){ + $validUntil = $token['valid_until']; + + foreach(Json::decode($token['pick_result']) as $pickResult){ + $tokens[$pickResult['no']]=$pickResult['keepCnt']; + } + } + $result['token'] = $tokens; +} + +Json::die($result); diff --git a/hwe/js/battle_simulator.js b/hwe/js/battle_simulator.js index 7b6f7f32..acbf6980 100644 --- a/hwe/js/battle_simulator.js +++ b/hwe/js/battle_simulator.js @@ -1,800 +1,922 @@ -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_officer_level', data.officer_level); - setVal('.form_exp_level', data.explevel); - setVal('.form_injury', data.injury); - - 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); - - 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'), - }; - } - - 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 = defenderCity.wall/5*6; - defenderCity.def_max = 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('재정렬 실패!'); - }); - } - - initBasicEvent(); - $attackerCard.append($generalForm.clone(true,true)); - addDefender(); - - $('.btn-begin_battle').click(function(){ - beginBattle(); - }); - - $('.btn-reorder_defender').click(function(){ - requestReorderDefender(); - }) +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(window.city.def); + $('.form_wall').val(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:second').click(); + $('.defender_nation .form_is_capital:second').click(); + } + } else { + $('.attacker_nation .form_is_capital:second').click(); + $('.defender_nation .form_is_capital:second').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); + + 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'), + }; + } + + 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 = defenderCity.wall / 5 * 6; + defenderCity.def_max = 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 diff --git a/hwe/js/common.js b/hwe/js/common.js index a2ca6950..8665bb3b 100644 --- a/hwe/js/common.js +++ b/hwe/js/common.js @@ -3,8 +3,8 @@ * @see https://stackoverflow.com/questions/24816/escaping-html-strings-with-jquery * @param {string} string escape하고자 하는 문자열 * @returns {string} -*/ -var escapeHtml = (function (string) { + */ +var escapeHtml = (function(string) { var entityMap = { '&': '&', '<': '<', @@ -32,58 +32,70 @@ function isInt(n) { return +n === n && !(n % 1); } -;(function(ns){ +; +(function(ns) { //https://gist.github.com/demouth/3217440 - /** - * mb_strwidth - * @param String - * @return int - * @see http://php.net/manual/ja/function.mb-strwidth.php - */ - var mb_strwidth = function(str){ - var i=0,l=str.length,c='',length=0; - for(;iwidth){ - trimmedStr += trimmarker; - break; - } - } - return trimmedStr; - }; - ns.mb_strwidth = mb_strwidth; - ns.mb_strimwidth = mb_strimwidth; + /** + * mb_strwidth + * @param String + * @return int + * @see http://php.net/manual/ja/function.mb-strwidth.php + */ + var mb_strwidth = function(str) { + var i = 0, + l = str.length, + c = '', + length = 0; + for (; i < l; i++) { + c = str.charCodeAt(i); + if (0x0000 <= c && c <= 0x0019) { + length += 0; + } else if (0x0020 <= c && c <= 0x1FFF) { + length += 1; + } else if (0x2000 <= c && c <= 0xFF60) { + length += 2; + } else if (0xFF61 <= c && c <= 0xFF9F) { + length += 1; + } else if (0xFFA0 <= c) { + length += 2; + } + } + return length; + }; + + /** + * mb_strimwidth + * @param String + * @param int + * @param int + * @param String + * @return String + * @see http://www.php.net/manual/ja/function.mb-strimwidth.php + */ + var mb_strimwidth = function(str, start, width, trimmarker) { + if (typeof trimmarker === 'undefined') trimmarker = ''; + var trimmakerWidth = mb_strwidth(trimmarker), + i = start, + l = str.length, + trimmedLength = 0, + trimmedStr = ''; + for (; i < l; i++) { + var charCode = str.charCodeAt(i), + c = str.charAt(i), + charWidth = mb_strwidth(c), + next = str.charAt(i + 1), + nextWidth = mb_strwidth(next); + trimmedLength += charWidth; + trimmedStr += c; + if (trimmedLength + trimmakerWidth + nextWidth > width) { + trimmedStr += trimmarker; + break; + } + } + return trimmedStr; + }; + ns.mb_strwidth = mb_strwidth; + ns.mb_strimwidth = mb_strimwidth; })(window); /** @@ -93,7 +105,7 @@ function isInt(n) { */ function convertDictById(arr) { var result = {}; - arr.forEach(function (v, i) { + arr.forEach(function(v, i) { result[v.id] = v; }); return result; @@ -106,7 +118,7 @@ function convertDictById(arr) { */ function convertSet(arr) { var result = {}; - arr.forEach(function (v) { + arr.forEach(function(v) { result[v] = true; }); return result; @@ -115,10 +127,10 @@ function convertSet(arr) { /** * {0}, {1}, {2}형태로 포맷해주는 함수 -*/ + */ String.prototype.format = function() { var args = arguments; - return this.replace(/{(\d+)}/g, function(match, number) { + return this.replace(/{(\d+)}/g, function(match, number) { return (typeof args[number] != 'undefined') ? args[number] : match; }); }; @@ -134,12 +146,11 @@ function hexToRgb(hex) { } -function isBrightColor(color){ +function isBrightColor(color) { color = hexToRgb(color); - if ((color.r*0.299 + color.g*0.587 + color.b*0.114) > 140){ + if ((color.r * 0.299 + color.g * 0.587 + color.b * 0.114) > 140) { return true; - } - else{ + } else { return false; } } @@ -177,7 +188,7 @@ function numberWithCommas(x) { return x.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ","); } -function linkifyStrWithOpt(text){ +function linkifyStrWithOpt(text) { return linkifyStr(text, {}); } @@ -188,14 +199,14 @@ function linkifyStrWithOpt(text){ * @param {object} options * @returns {string} */ -var TemplateEngine = function (html, options) { +var TemplateEngine = function(html, options) { var re = /<%(.+?)%>/g, reExp = /(^( )?(var|if|for|else|switch|case|break|{|}|;))(.*)?/g, code = 'with(obj) { var r=[];\n', cursor = 0, result, match; - var add = function (line, js) { + var add = function(line, js) { js ? (code += line.match(reExp) ? line + '\n' : 'r.push(' + line + ');\n') : (code += line != '' ? 'r.push("' + line.replace(/"/g, '\\"') + '");\n' : ''); return add; @@ -208,82 +219,97 @@ var TemplateEngine = function (html, options) { } add(html.substr(cursor, html.length - cursor)); code = (code + 'return r.join(""); }').replace(/[\r\t\n]/g, ' '); - try { result = new Function('obj', code).apply(options, [options]); } - catch (err) { console.error("'" + err.message + "'", " in \n\nCode:\n", code, "\n"); } + try { result = new Function('obj', code).apply(options, [options]); } catch (err) { console.error("'" + err.message + "'", " in \n\nCode:\n", code, "\n"); } return result; } -function getIconPath(imgsvr, picture){ +function getIconPath(imgsvr, picture) { // ../d_shared/common_path.js 필요 - if(!imgsvr){ - return pathConfig.sharedIcon+'/'+picture; - } - else{ - return pathConfig.root+'/d_pic/'+picture; + if (!imgsvr) { + return pathConfig.sharedIcon + '/' + picture; + } else { + return pathConfig.root + '/d_pic/' + picture; } } -function activeFlip($obj){ +function activeFlip($obj) { var $result; - if($obj === undefined){ + if ($obj === undefined) { $result = $('img[data-flip]'); - } - else{ + } else { $result = $obj.find('img[data-flip]'); } - $result.each(function(){ + $result.each(function() { activeFlipItem($(this)); }); } -function activeFlipItem($img){ +function combineObject(item, columnList) { + var newItem = {}; + for (var columnIdx in columnList) { + var columnName = columnList[columnIdx]; + newItem[columnName] = item[columnIdx]; + } + return newItem; +} + +function combineArray(array, columnList) { + var result = []; + for (var key in array) { + var item = array[key]; + result[key] = combineObject(item, columnList); + } + return result; +} + +function activeFlipItem($img) { var imageList = []; imageList.push($img.attr('src')); - $.each($img.data('flip').split(','), function(idx, value){ + $.each($img.data('flip').split(','), function(idx, value) { var value = $.trim(value); - if(!value){ + if (!value) { return true; } imageList.push(value); }); - if(imageList.length <= 1){ + if (imageList.length <= 1) { return; } $img.data('computed_flip_array', imageList); $img.data('computed_flip_idx', 0); - $img.click(function(){ + $img.click(function() { var arr = $img.data('computed_flip_array'); var idx = $img.data('computed_flip_idx'); - idx = (idx + 1)%(arr.length); + idx = (idx + 1) % (arr.length); $img.attr('src', arr[idx]); $img.data('computed_flip_idx', idx); }); - $img.css('cursor','pointer'); + $img.css('cursor', 'pointer'); } -jQuery(function($){ - $('.obj_tooltip').mouseover(function(){ +jQuery(function($) { + $('.obj_tooltip').mouseover(function() { var $objTooltip = $(this); - if($objTooltip.data('setObjTooltip')){ + if ($objTooltip.data('setObjTooltip')) { return true; } var tooltipClassText = $objTooltip.data('tooltip-class'); - if(!tooltipClassText){ + if (!tooltipClassText) { tooltipClassText = ''; } var template = '' .format(tooltipClassText); $objTooltip.tooltip({ - title:function(){ + title: function() { return $.trim($(this).find('.tooltiptext').html()); }, - template:template, - html:true + template: template, + html: true }).tooltip('show'); $objTooltip.data('setObjTooltip', true); @@ -297,21 +323,21 @@ jQuery(function($){ activeFlip(); var customCSS = localStorage.getItem('sam_customCSS'); - if(customCSS){ + if (customCSS) { var $style = $(''); - $style.text(customCSS); + $style.text(customCSS); $style.appendTo($('head')); } - + }); -function errUnknown(){ +function errUnknown() { alert('작업을 실패했습니다.'); } -function errUnknownToast(){ +function errUnknownToast() { $.toast({ title: '에러!', content: '작업을 실패했습니다.', @@ -320,8 +346,8 @@ function errUnknownToast(){ }); } -function quickReject(errMsg){ - if(errMsg === undefined){ +function quickReject(errMsg) { + if (errMsg === undefined) { errMsg = '작업을 실패했습니다.'; } var deferred = $.Deferred(); @@ -329,8 +355,8 @@ function quickReject(errMsg){ return deferred.promise(); } -function nl2br(text){ - return text.replace(/\n/g,"
"); +function nl2br(text) { + return text.replace(/\n/g, "
"); } /* function br2nl (text) { @@ -338,11 +364,11 @@ function br2nl (text) { } */ -function getNpcColor(npcType){ - if(npcType >= 2){ +function getNpcColor(npcType) { + if (npcType >= 2) { return 'cyan'; } - if(npcType == 1){ + if (npcType == 1) { return 'skyblue'; } return null; diff --git a/hwe/js/select_npc.js b/hwe/js/select_npc.js index 1ed760f0..02bad7f0 100644 --- a/hwe/js/select_npc.js +++ b/hwe/js/select_npc.js @@ -1,360 +1,353 @@ -var templateGeneralCard = -'
\ -

<%name%>

\ -

\ -

<%leadership%> / <%strength%> / <%intel%>
\ - <%nation%>
\ - <%personalText%>
\ - <%specialText%> / <%special2Text%>

\ - \ - \ -
'; - -var templateSpecial = -'<%text%>\ - \ - <%info%>\ - \ -\ -'; - -var templateGeneralRow = -'\ - \ - <%name%><%nameAux%>\ - <%age%>세\ - <%personalWithTooltip%>\ - <%specialDomesticWithTooltip%> / <%speicalWarWithTooltip%>\ - Lv <%explevel%>\ - <%nation%>\ - <%experience%>\ - <%dedication%>\ - <%officerLevel%>\ - <%total%>\ - <%leadership%>\ - <%strength%>\ - <%intel%>\ - <%killturn%>\ -'; - -function pickGeneral(){ - $btn = $(this); - - if (!confirm('빙의할까요? : {0}'.format($btn.data('name')))) { - return false; - } - - $.post({ - url:'j_select_npc.php', - dataType:'json', - data:{ - pick:$btn.val() - } - }).then(function(result){ - if(!result.result){ - alert(result.reason); - location.refresh(); - } - - alert('빙의에 성공했습니다.'); - location.href = './'; - }); - return false; -} - -function updateOutdateTimer(){ - var $validUntilText = $('#valid_until_text'); - var now = Date.now(); - var validUntil = $validUntilText.data('until'); - if(validUntil <= 0){ - return; - } - else if(validUntil < now){ - $validUntilText.data('until',0); - $('#valid_until').hide(); - $('#outdate_token').show(); - return; - } - else if(validUntil - now <= 30000){ - $validUntilText.css('color', "rgb(255, {0}, {0})".format(255*(validUntil - now)/30000)); - } - - setTimeout(updateOutdateTimer, 1000); -} - -function updatePickMoreTimer(){ - var $btn = $('#btn_pick_more'); - - var now = Date.now(); - var remain = ($btn.data('available') - now) / 1000; - if(remain <= 0){ - $btn.prop('disabled', false) - $btn.html('다른 장수 보기'); - return; - } - - $btn.html('다른 장수 보기({0}초)'.format(Math.ceil(remain))); - - setTimeout(updatePickMoreTimer, 250); -} - -function printGenerals(value){ - $('.card_holder').empty(); - $('#valid_until').show(); - $('#valid_until_text').html(value.validUntil).data('until', (new Date(value.validUntil)).getTime()).css('color','white'); - $('#outdate_token').hide(); - var time = Date.now() + value.pickMoreSeconds*1000; - $('#btn_pick_more').data('available', time).prop('disabled',true); - - var pick = $.map(value.pick, function(value, key) { - return value; - }); - - pick.sort(function(lhs, rhs){ - var lsum = lhs.leadership+lhs.strength+lhs.intel; - var rsum = rhs.leadership+rhs.strength+rhs.intel; - return lsum - rsum; - }); - - $.each(pick, function(idx, cardData){ - cardData.iconPath = getIconPath(cardData.imgsvr, cardData.picture); - if(cardData.special in specialInfo){ - cardData.specialText = TemplateEngine(templateSpecial, { - text:cardData.special, - info:specialInfo[cardData.special] - }); - } - else{ - cardData.specialText = cardData.special; - } - - if(cardData.special2 in specialInfo){ - cardData.special2Text = TemplateEngine(templateSpecial, { - text:cardData.special2, - info:specialInfo[cardData.special2] - }); - } - else{ - cardData.special2Text = cardData.special2; - } - - if(cardData.personal in characterInfo){ - cardData.personalText = TemplateEngine(templateSpecial, { - text:cardData.personal, - info:characterInfo[cardData.personal] - }); - } - else{ - cardData.personalText = cardData.personal; - } - - - var $card = $(TemplateEngine(templateGeneralCard, cardData)); - - $('.card_holder').append($card); - $card.find('.select_btn').click(pickGeneral); - $card.find('.obj_tooltip').tooltip({ - title:function(){ - return $.trim($(this).find('.tooltiptext').html()); - }, - html:true - }); - }); - - updatePickMoreTimer(); - updateOutdateTimer(); -} - -function printGeneralList(value){ - var tokenList = value.token; - var generalList = $.map(value.list, function(general){ - general = { - no:general[0], - picture:general[1], - imgsvr:general[2], - npc:general[3], - age:general[4], - nation:general[5], - special:general[6], - special2:general[7], - personal:general[8], - name:general[9], - ownerName:general[10], - injury:general[11], - leadership:general[12], - lbonus:general[13], - strength:general[14], - intel:general[15], - explevel:general[16], - experience:general[17], - dedication:general[18], - officerLevel:general[19], - killturn:general[20], - connect:general[21], - reserved:0 - }; - if(general.npc < 2){ - general.reserved = 2; - } - if(general.no in tokenList){ - general.reserved = 1; - } - - general.userCSS = ""; - general.nameAux = ""; - - if(general.reserved == 1){ - general.userCSS = 'color:violet'; - } - else if(general.npc >= 2){ - general.userCSS = 'color:cyan'; - } - else if(general.npc == 1){ - general.userCSS = 'color:skyblue'; - } - - if(general.ownerName){ - general.nameAux += '
({0})'.format(general.ownerName); - } - - if(general.reserved == 1){ - general.nameAux += '
({0}회)'.format(tokenList[general.no]); - } - - - general.total = general.leadership + general.strength + general.intel; - general.iconPath = getIconPath(general.imgsvr, general.picture); - - general.specialDomesticWithTooltip = TemplateEngine(templateSpecial, { - text:general.special, - info:specialInfo[general.special] - }); - - general.speicalWarWithTooltip = TemplateEngine(templateSpecial, { - text:general.special2, - info:specialInfo[general.special2] - }); - - general.personalWithTooltip = TemplateEngine(templateSpecial, { - text:general.personal, - info:characterInfo[general.personal] - }); - - return general; - }); - - generalList.sort(function(lhs, rhs){ - if(lhs.reserved > rhs.reserved){ - return -1; - } - if(lhs.reserved < rhs.reserved){ - return 1; - } - if(lhs.total != rhs.total){ - return rhs.total - lhs.total; - } - if(lhs.leadership != rhs.leadership){ - return rhs.leadership - lhs.total; - } - - if(lhs.name < rhs.name){ - return -1; - } - if(lhs.name > rhs.name){ - return 1; - } - return 0; - }); - - window.generalList = generalList; - _printGeneralList(true); -} - -function _printGeneralList(clear){ - var $generalTable = $('#general_list'); - if(clear){ - $generalTable.empty(); - $generalTable.data('lastIdx', 0); - $('#row_print_more').show(); - } - - generalList = window.generalList; - - var idxFrom = $generalTable.data('lastIdx'); - var idxTo = Math.min(idxFrom + 50, generalList.length); - $generalTable.data('lastIdx', idxTo); - - for(var idx = idxFrom; idx < idxFrom + 50; idx++){ - var general = generalList[idx]; - $generalTable.append(TemplateEngine(templateGeneralRow, general)); - } - - if(idxTo == generalList.length){ - $('#row_print_more').hide(); - } - - $generalTable.find('.obj_tooltip').tooltip({ - title:function(){ - return $.trim($(this).find('.tooltiptext').html()); - }, - html:true - }); - $('#tb_general_list').show(); -} - -$(function($){ -window.generalList = []; - -$.post('j_get_select_npc_token.php').then(function(value){ - if(!value.result){ - alert(value.reason); - return; - } - - console.log(value); - printGenerals(value); -}); - -$('#btn_pick_more').click(function(){ - var generals = $.map($('.keep_select:checked'), function(value){ - return $(value).val(); - }); - console.log(generals); - $.post({ - url:'j_get_select_npc_token.php', - dataType:'json', - data:{ - refresh:true, - keep:generals - } - }).then(function(result){ - if(!result.result){ - alert(result.reason); - location.refresh(); - } - console.log(result); - printGenerals(result); - }); -}); - -$('#btn_load_general_list').click(function(){ - $.post({ - url:'j_get_general_list.php', - dataType:'json', - data:{ - with_token:true - } - }).then(function(result){ - if(!result.result){ - alert(result.reason); - return false; - } - printGeneralList(result); - }); -}); - -$('#btn_print_more').click(function(){ - _printGeneralList(); -}) - +var templateGeneralCard = + '
\ +

<%name%>

\ +

\ +

<%leadership%> / <%strength%> / <%intel%>
\ + <%nation%>
\ + <%personalText%>
\ + <%specialText%> / <%special2Text%>

\ + \ + \ +
'; + +var templateSpecial = + '<%text%>\ + \ + <%info%>\ + \ +\ +'; + +var templateGeneralRow = + '\ + \ + <%name%><%nameAux%>\ + <%age%>세\ + <%personalWithTooltip%>\ + <%specialDomesticWithTooltip%> / <%speicalWarWithTooltip%>\ + Lv <%explevel%>\ + <%nation%>\ + <%experience%>\ + <%dedication%>\ + <%officerLevel%>\ + <%total%>\ + <%leadership%>\ + <%strength%>\ + <%intel%>\ + <%killturn%>\ +'; + +function pickGeneral() { + $btn = $(this); + + if (!confirm('빙의할까요? : {0}'.format($btn.data('name')))) { + return false; + } + + $.post({ + url: 'j_select_npc.php', + dataType: 'json', + data: { + pick: $btn.val() + } + }).then(function(result) { + if (!result.result) { + alert(result.reason); + location.refresh(); + } + + alert('빙의에 성공했습니다.'); + location.href = './'; + }); + return false; +} + +function updateOutdateTimer() { + var $validUntilText = $('#valid_until_text'); + var now = Date.now(); + var validUntil = $validUntilText.data('until'); + if (validUntil <= 0) { + return; + } else if (validUntil < now) { + $validUntilText.data('until', 0); + $('#valid_until').hide(); + $('#outdate_token').show(); + return; + } else if (validUntil - now <= 30000) { + $validUntilText.css('color', "rgb(255, {0}, {0})".format(255 * (validUntil - now) / 30000)); + } + + setTimeout(updateOutdateTimer, 1000); +} + +function updatePickMoreTimer() { + var $btn = $('#btn_pick_more'); + + var now = Date.now(); + var remain = ($btn.data('available') - now) / 1000; + if (remain <= 0) { + $btn.prop('disabled', false) + $btn.html('다른 장수 보기'); + return; + } + + $btn.html('다른 장수 보기({0}초)'.format(Math.ceil(remain))); + + setTimeout(updatePickMoreTimer, 250); +} + +function printGenerals(value) { + $('.card_holder').empty(); + $('#valid_until').show(); + $('#valid_until_text').html(value.validUntil).data('until', (new Date(value.validUntil)).getTime()).css('color', 'white'); + $('#outdate_token').hide(); + var time = Date.now() + value.pickMoreSeconds * 1000; + $('#btn_pick_more').data('available', time).prop('disabled', true); + + var pick = $.map(value.pick, function(value, key) { + return value; + }); + + pick.sort(function(lhs, rhs) { + var lsum = lhs.leadership + lhs.strength + lhs.intel; + var rsum = rhs.leadership + rhs.strength + rhs.intel; + return lsum - rsum; + }); + + $.each(pick, function(idx, cardData) { + cardData.iconPath = getIconPath(cardData.imgsvr, cardData.picture); + if (cardData.special in specialInfo) { + cardData.specialText = TemplateEngine(templateSpecial, { + text: cardData.special, + info: specialInfo[cardData.special] + }); + } else { + cardData.specialText = cardData.special; + } + + if (cardData.special2 in specialInfo) { + cardData.special2Text = TemplateEngine(templateSpecial, { + text: cardData.special2, + info: specialInfo[cardData.special2] + }); + } else { + cardData.special2Text = cardData.special2; + } + + if (cardData.personal in characterInfo) { + cardData.personalText = TemplateEngine(templateSpecial, { + text: cardData.personal, + info: characterInfo[cardData.personal] + }); + } else { + cardData.personalText = cardData.personal; + } + + + var $card = $(TemplateEngine(templateGeneralCard, cardData)); + + $('.card_holder').append($card); + $card.find('.select_btn').click(pickGeneral); + $card.find('.obj_tooltip').tooltip({ + title: function() { + return $.trim($(this).find('.tooltiptext').html()); + }, + html: true + }); + }); + + updatePickMoreTimer(); + updateOutdateTimer(); +} + +function printGeneralList(value) { + var tokenList = value.token; + var generalList = $.map(value.list, function(general) { + general = { + no: general[0], + picture: general[1], + imgsvr: general[2], + npc: general[3], + age: general[4], + nation: general[5], + special: general[6], + special2: general[7], + personal: general[8], + name: general[9], + ownerName: general[10], + injury: general[11], + leadership: general[12], + lbonus: general[13], + strength: general[14], + intel: general[15], + explevel: general[16], + experience: general[17], + dedication: general[18], + officerLevel: general[19], + killturn: general[20], + connect: general[21], + reserved: 0 + }; + if (general.npc < 2) { + general.reserved = 2; + } + if (general.no in tokenList) { + general.reserved = 1; + } + + general.userCSS = ""; + general.nameAux = ""; + + if (general.reserved == 1) { + general.userCSS = 'color:violet'; + } else if (general.npc >= 2) { + general.userCSS = 'color:cyan'; + } else if (general.npc == 1) { + general.userCSS = 'color:skyblue'; + } + + if (general.ownerName) { + general.nameAux += '
({0})'.format(general.ownerName); + } + + if (general.reserved == 1) { + general.nameAux += '
({0}회)'.format(tokenList[general.no]); + } + + + general.total = general.leadership + general.strength + general.intel; + general.iconPath = getIconPath(general.imgsvr, general.picture); + + general.specialDomesticWithTooltip = TemplateEngine(templateSpecial, { + text: general.special, + info: specialInfo[general.special] + }); + + general.speicalWarWithTooltip = TemplateEngine(templateSpecial, { + text: general.special2, + info: specialInfo[general.special2] + }); + + general.personalWithTooltip = TemplateEngine(templateSpecial, { + text: general.personal, + info: characterInfo[general.personal] + }); + + return general; + }); + + generalList.sort(function(lhs, rhs) { + if (lhs.reserved > rhs.reserved) { + return -1; + } + if (lhs.reserved < rhs.reserved) { + return 1; + } + if (lhs.total != rhs.total) { + return rhs.total - lhs.total; + } + if (lhs.leadership != rhs.leadership) { + return rhs.leadership - lhs.total; + } + + if (lhs.name < rhs.name) { + return -1; + } + if (lhs.name > rhs.name) { + return 1; + } + return 0; + }); + + window.generalList = generalList; + _printGeneralList(true); +} + +function _printGeneralList(clear) { + var $generalTable = $('#general_list'); + if (clear) { + $generalTable.empty(); + $generalTable.data('lastIdx', 0); + $('#row_print_more').show(); + } + + generalList = window.generalList; + + var idxFrom = $generalTable.data('lastIdx'); + var idxTo = Math.min(idxFrom + 50, generalList.length); + $generalTable.data('lastIdx', idxTo); + + for (var idx = idxFrom; idx < idxFrom + 50; idx++) { + var general = generalList[idx]; + $generalTable.append(TemplateEngine(templateGeneralRow, general)); + } + + if (idxTo == generalList.length) { + $('#row_print_more').hide(); + } + + $generalTable.find('.obj_tooltip').tooltip({ + title: function() { + return $.trim($(this).find('.tooltiptext').html()); + }, + html: true + }); + $('#tb_general_list').show(); +} + +$(function($) { + window.generalList = []; + + $.post('j_get_select_npc_token.php').then(function(value) { + if (!value.result) { + alert(value.reason); + return; + } + + console.log(value); + printGenerals(value); + }); + + $('#btn_pick_more').click(function() { + var generals = $.map($('.keep_select:checked'), function(value) { + return $(value).val(); + }); + console.log(generals); + $.post({ + url: 'j_get_select_npc_token.php', + dataType: 'json', + data: { + refresh: true, + keep: generals + } + }).then(function(result) { + if (!result.result) { + alert(result.reason); + location.refresh(); + } + console.log(result); + printGenerals(result); + }); + }); + + $('#btn_load_general_list').click(function() { + $.post({ + url: 'j_get_general_list.php', + dataType: 'json', + data: { + with_token: true + } + }).then(function(result) { + if (!result.result) { + alert(result.reason); + return false; + } + printGeneralList(result); + }); + }); + + $('#btn_print_more').click(function() { + _printGeneralList(); + }) + }); \ No newline at end of file