전투 시뮬레이터 장수 불러오기 완성

This commit is contained in:
2020-06-11 03:13:02 +09:00
parent 0a6496ddfb
commit a87fcb44a6
7 changed files with 2155 additions and 1850 deletions
+535 -480
View File
@@ -1,481 +1,536 @@
<?php <?php
namespace sammo; namespace sammo;
include "lib.php"; include "lib.php";
include "func.php"; include "func.php";
$session = Session::requireLogin()->setReadOnly(); $session = Session::requireLogin()->setReadOnly();
$db = DB::db(); $db = DB::db();
$gameStor = KVStorage::getStorage($db, 'game_env'); $gameStor = KVStorage::getStorage($db, 'game_env');
$startYear = $gameStor->getValue('startyear'); $gameStor->cacheValues(['startyear', 'year']);
$startYear = $gameStor->startyear;
?> $year = $gameStor->year;
<!DOCTYPE html>
<html> $me = $db->queryFirstRow('SELECT no, nation, city FROM general WHERE owner =%i', Session::getUserID());
<head>
<title><?=UniqueConst::$serverName?>: 전투 시뮬레이터</title> if($me){
<meta charset="UTF-8"> $generalID = $me['no'];
<meta http-equiv="X-UA-Compatible" content="IE=edge"> $nationID = $me['nation'];
<meta name="viewport" content="width=1100" /> $city = $db->queryFirstRow('SELECT city, level, def, wall FROM city WHERE city = %i', $me['city']);
<?=WebUtil::printCSS('../e_lib/bootstrap.min.css')?> }
<?=WebUtil::printCSS('../d_shared/common.css')?> else{
<?=WebUtil::printCSS('css/common.css')?> $generalID = 0;
<?=WebUtil::printCSS('css/battle_simulator.css')?> $nationID = 0;
<?=WebUtil::printJS('../d_shared/common_path.js')?> $city = [
<?=WebUtil::printJS('../e_lib/jquery-3.3.1.min.js')?> 'city'=>0,
<?=WebUtil::printJS('../e_lib/moment.min.js')?> 'level'=>5,
<?=WebUtil::printJS('../e_lib/bootstrap.bundle.min.js')?> 'def'=>1000,
<?=WebUtil::printJS('../e_lib/download2.js')?> 'wall'=>1000,
<?=WebUtil::printJS('js/common.js')?> ];
<script> }
var defaultSpecialDomestic = '<?=GameConst::$defaultSpecialDomestic?>';
</script> if($nationID){
<?=WebUtil::printJS('js/battle_simulator.js')?> $nation = $db->queryFirstRow('SELECT level, type, tech, capital FROM nation WHERE nation = %i', $nationID);
</head> }
<body> else{
<div id="container"> $nation = null;
<div class="card mb-3"> }
<div class="card-header">
전역 설정 ?>
</div> <!DOCTYPE html>
<div class="card-body dragpad_battle"> <html>
<div class="row"> <head>
<div class="col-sm-6"> <title><?=UniqueConst::$serverName?>: 전투 시뮬레이터</title>
<div class="input-group"> <meta charset="UTF-8">
<input type="number" class="form-control" aria-describedby="text_year" value="<?=$startYear?>" disabled> <meta http-equiv="X-UA-Compatible" content="IE=edge">
<div class="input-group-append"> <meta name="viewport" content="width=1100" />
<span class="input-group-text">년 시작</span> <?=WebUtil::printCSS('../e_lib/bootstrap.min.css')?>
</div> <?=WebUtil::printCSS('../d_shared/common.css')?>
<input type="number" class="form-control" id="year" value="<?=$startYear+3?>" min="<?=$startYear?>"> <?=WebUtil::printCSS('css/common.css')?>
<div class="input-group-append"> <?=WebUtil::printCSS('css/battle_simulator.css')?>
<span class="input-group-text">년</span> <?=WebUtil::printJS('../d_shared/common_path.js')?>
</div> <?=WebUtil::printJS('../e_lib/jquery-3.3.1.min.js')?>
<input type="number" class="form-control" id="month" value="1" min="1" max="12"> <?=WebUtil::printJS('../e_lib/moment.min.js')?>
<div class="input-group-append"> <?=WebUtil::printJS('../e_lib/bootstrap.bundle.min.js')?>
<span class="input-group-text">월</span> <?=WebUtil::printJS('../e_lib/download2.js')?>
</div> <?=WebUtil::printJS('js/common.js')?>
</div> <script>
</div> var defaultSpecialDomestic = '<?=GameConst::$defaultSpecialDomestic?>';
<div class="col-sm-6"> var city = <?=Json::encode($city)?>;
<div class="btn-toolbar" role="toolbar"> var nation = <?=Json::encode($nation)?>;
<div class="input-group mr-2" role="group"> </script>
<div class="input-group-prepend"> <?=WebUtil::printJS('js/battle_simulator.js')?>
<span class="input-group-text">반복 횟수</span> </head>
</div> <body>
<select class="custom-select" id="repeat_cnt"> <div id="container">
<option value="1">1회 (로그 표기)</option> <div class="card mb-3">
<option value="1000">1000회 (요약 표기)</option> <div class="card-header">
</select> 전역 설정
</div> </div>
<div class="btn-group mr-2" role="group"> <div class="card-body dragpad_battle">
<button type="button" class="btn btn-danger btn-begin_battle">전투</button> <div class="row">
</div> <div class="col-sm-6">
<div class="btn-group mr-2" role="group"> <div class="input-group">
<button type="button" class="btn btn-info btn-battle-save">모두 저장</button> <input type="number" class="form-control" aria-describedby="text_year" value="<?=$startYear?>" disabled>
<input type="file" class="form_load_battle_file" accept=".json" style="display: none;" /> <div class="input-group-append">
<button type="button" class="btn btn-primary btn-battle-load">모두 불러오기</button> <span class="input-group-text">년 시작</span>
</div> </div>
</div> <input type="number" class="form-control" id="year" value="<?=$year?>" min="<?=$startYear?>">
</div> <div class="input-group-append">
</div> <span class="input-group-text">년</span>
</div> </div>
</div> <input type="number" class="form-control" id="month" value="1" min="1" max="12">
<div class="row"> <div class="input-group-append">
<div class="col-sm"> <span class="input-group-text">월</span>
<div class="card mb-2 attacker_nation"> </div>
<div class="card-header"> </div>
출병국 설정 </div>
</div> <div class="col-sm-6">
<div class="card-body nation_detail dragpad_battle"> <div class="btn-toolbar" role="toolbar">
<div class="input-group mb-1"> <div class="input-group mr-2" role="group">
<div class="input-group-prepend"> <div class="input-group-prepend">
<span class="input-group-text">국가 성향</span> <span class="input-group-text">반복 횟수</span>
</div> </div>
<select class="custom-select form_nation_type" style="width:25ch;"> <select class="custom-select" id="repeat_cnt">
<?php foreach(GameConst::$availableNationType as $typeID): ?> <option value="1">1회 (로그 표기)</option>
<?php $nationTypeClass = buildNationTypeClass($typeID) ?> <option value="1000">1000회 (요약 표기)</option>
<option value="<?=$typeID?>"><?=$nationTypeClass->getName()?> (<?=$nationTypeClass::$pros?>, <?=$nationTypeClass::$cons?>)</option> </select>
<?php endforeach; ?> </div>
</select> <div class="btn-group mr-2" role="group">
<div class="input-group-prepend"> <button type="button" class="btn btn-danger btn-begin_battle">전투</button>
<span class="input-group-text">기술</span> </div>
</div> <div class="btn-group mr-2" role="group">
<input type="number" class="form-control form_tech" value="1" min="0" max="12"> <button type="button" class="btn btn-info btn-battle-save">모두 저장</button>
<div class="input-group-append"> <input type="file" class="form_load_battle_file" accept=".json" style="display: none;" />
<span class="input-group-text">등급</span> <button type="button" class="btn btn-primary btn-battle-load">모두 불러오기</button>
</div> </div>
</div> </div>
<div class="input-group mb-3"> </div>
<div class="input-group-prepend"> </div>
<span class="input-group-text">국가 규모</span> </div>
</div> </div>
<select class="custom-select form_nation_level"> <div class="row">
<?php foreach(getNationLevelList() as $nationLevel => [$name,$chiefCnt,$cityCnt]): ?> <div class="col-sm">
<option value="<?=$nationLevel?>"><?=$name?></option> <div class="card mb-2 attacker_nation">
<?php endforeach; ?> <div class="card-header">
</select> 출병국 설정
<div class="input-group-prepend"> </div>
<span class="input-group-text">도시 규모</span> <div class="card-body nation_detail dragpad_battle">
</div> <div class="input-group mb-1">
<select class="custom-select form_city_level"> <div class="input-group-prepend">
<?php foreach(getCityLevelList() as $levelID => $name): ?> <span class="input-group-text">국가 성향</span>
<option value="<?=$levelID?>"><?=$name?></option> </div>
<?php endforeach; ?> <select class="custom-select form_nation_type" style="width:25ch;">
</select> <?php foreach(GameConst::$availableNationType as $typeID): ?>
<div class="input-group-prepend"> <?php $nationTypeClass = buildNationTypeClass($typeID) ?>
<span class="input-group-text">수도</span> <option value="<?=$typeID?>"><?=$nationTypeClass->getName()?> (<?=$nationTypeClass::$pros?>, <?=$nationTypeClass::$cons?>)</option>
</div> <?php endforeach; ?>
<div class="input-group-append btn-group btn-group-toggle" data-toggle="buttons"> </select>
<label class="btn btn-secondary"> <div class="input-group-prepend">
<input type="radio" name="is_attacker_capital" class="form_is_capital" value="1" autocomplete="off">Y <span class="input-group-text">기술</span>
</label> </div>
<label class="btn btn-secondary active"> <input type="number" class="form-control form_tech" value="1" min="0" max="12">
<input type="radio" name="is_attacker_capital" class="form_is_capital" value="2" autocomplete="off" checked>N <div class="input-group-append">
</label> <span class="input-group-text">등급</span>
</div> </div>
</div>
</div> <div class="input-group mb-3">
<div class="input-group mb-1"> <div class="input-group-prepend">
<span class="input-group-text">국가 규모</span>
</div> </div>
</div> <select class="custom-select form_nation_level">
</div> <?php foreach(getNationLevelList() as $nationLevel => [$name,$chiefCnt,$cityCnt]): ?>
<div class="card mb-2 attacker_form general_form" data-general_no='1'> <option value="<?=$nationLevel?>"><?=$name?></option>
<div class="card-header"> <?php endforeach; ?>
<div class="float-sm-left" style="line-height:25px;">출병자 설정</div> </select>
<div class="float-sm-right btn-toolbar" role="toolbar"> <div class="input-group-prepend">
<div class="btn-group btn-group-sm mr-2" role="group"> <span class="input-group-text">도시 규모</span>
<button type="button" class="btn btn-info btn-general-save">저장</button> </div>
<input type="file" class="form_load_general_file" accept=".json" style="display: none;" /> <select class="custom-select form_city_level">
<button type="button" class="btn btn-primary btn-general-load">불러오기</button> <?php foreach(getCityLevelList() as $levelID => $name): ?>
</div> <option value="<?=$levelID?>"><?=$name?></option>
</div> <?php endforeach; ?>
</div> </select>
</div> <div class="input-group-prepend">
</div><!-- <div class="col-sm"> --> <span class="input-group-text">수도</span>
<div class="col-sm defender-column"> </div>
<div class="card mb-2 defender_nation"> <div class="input-group-append btn-group btn-group-toggle" data-toggle="buttons">
<div class="card-header"> <label class="btn btn-secondary">
수비국 설정 <input type="radio" name="is_attacker_capital" class="form_is_capital" value="1" autocomplete="off">Y
</div> </label>
<div class="card-body dragpad_battle"> <label class="btn btn-secondary active">
<div class="input-group mb-1"> <input type="radio" name="is_attacker_capital" class="form_is_capital" value="0" autocomplete="off">N
<div class="input-group-prepend"> </label>
<span class="input-group-text">국가 성향</span> </div>
</div>
<select class="custom-select form_nation_type" style="width:25ch;"> </div>
<?php foreach(GameConst::$availableNationType as $typeID): ?> <div class="input-group mb-1">
<?php $nationTypeObj = buildNationTypeClass($typeID) ?>
<option value="<?=$typeID?>"><?=$nationTypeObj->getName()?> (<?=$nationTypeObj::$pros?>, <?=$nationTypeObj::$cons?>)</option> </div>
<?php endforeach; ?> </div>
</select> </div>
<div class="input-group-prepend"> <div class="card mb-2 attacker_form general_form" data-general_no='1'>
<span class="input-group-text">기술</span> <div class="card-header">
</div> <div class="float-sm-left" style="line-height:25px;">출병자 설정</div>
<input type="number" class="form-control form_tech" value="1" min="0" max="12"> <div class="float-sm-right btn-toolbar" role="toolbar">
<div class="input-group-append"> <div class="btn-group btn-group-sm mr-2" role="group">
<span class="input-group-text">등급</span> <button type="button" class="btn btn-success btn-general-import-server">서버에서 가져오기</button>
</div> </div>
</div> <div class="btn-group btn-group-sm mr-2" role="group">
<div class="input-group mb-3"> <button type="button" class="btn btn-info btn-general-save">저장</button>
<div class="input-group-prepend"> <input type="file" class="form_load_general_file" accept=".json" style="display: none;" />
<span class="input-group-text">국가 규모</span> <button type="button" class="btn btn-primary btn-general-load">불러오기</button>
</div> </div>
<select class="custom-select form_nation_level"> </div>
<?php foreach(getNationLevelList() as $nationLevel => [$name,$chiefCnt,$cityCnt]): ?> </div>
<option value="<?=$nationLevel?>"><?=$name?></option> </div>
<?php endforeach; ?> </div><!-- <div class="col-sm"> -->
</select> <div class="col-sm defender-column">
<div class="input-group-prepend"> <div class="card mb-2 defender_nation">
<span class="input-group-text">도시 규모</span> <div class="card-header">
</div> 수비국 설정
<select class="custom-select form_city_level"> </div>
<?php foreach(getCityLevelList() as $levelID => $name): ?> <div class="card-body dragpad_battle">
<option value="<?=$levelID?>"><?=$name?></option> <div class="input-group mb-1">
<?php endforeach; ?> <div class="input-group-prepend">
</select> <span class="input-group-text">국가 성향</span>
<div class="input-group-prepend"> </div>
<span class="input-group-text">수도</span> <select class="custom-select form_nation_type" style="width:25ch;">
</div> <?php foreach(GameConst::$availableNationType as $typeID): ?>
<div class="input-group-append btn-group btn-group-toggle" data-toggle="buttons"> <?php $nationTypeObj = buildNationTypeClass($typeID) ?>
<label class="btn btn-secondary"> <option value="<?=$typeID?>"><?=$nationTypeObj->getName()?> (<?=$nationTypeObj::$pros?>, <?=$nationTypeObj::$cons?>)</option>
<input type="radio" name="is_defender_capital" class="form_is_capital" value="1" autocomplete="off">Y <?php endforeach; ?>
</label> </select>
<label class="btn btn-secondary active"> <div class="input-group-prepend">
<input type="radio" name="is_defender_capital" class="form_is_capital" value="0" autocomplete="off" checked>N <span class="input-group-text">기술</span>
</label> </div>
</div> <input type="number" class="form-control form_tech" value="1" min="0" max="12">
</div> <div class="input-group-append">
<div class="input-group mb-1"> <span class="input-group-text">등급</span>
<div class="input-group-prepend"> </div>
<span class="input-group-text">수비</span> </div>
</div> <div class="input-group mb-3">
<input type="number" class="form-control form_def" id="city_def" value="1000" min="10" step="10"> <div class="input-group-prepend">
<div class="input-group-prepend"> <span class="input-group-text">국가 규모</span>
<span class="input-group-text">성벽</span> </div>
</div> <select class="custom-select form_nation_level">
<input type="number" class="form-control form_wall" id="city_wall" value="1000" min="0" step="10"> <?php foreach(getNationLevelList() as $nationLevel => [$name,$chiefCnt,$cityCnt]): ?>
</div> <option value="<?=$nationLevel?>"><?=$name?></option>
</div> <?php endforeach; ?>
</div> </select>
<div class="card mb-2 defender_add_form"> <div class="input-group-prepend">
<div class="card-header"> <span class="input-group-text">도시 규모</span>
<div class="float-sm-left" style="line-height:25px;">수비자 설정</div> </div>
<div class="float-sm-right btn-toolbar" role="toolbar"> <select class="custom-select form_city_level">
<div class="btn-group btn-group-sm mr-2" role="group"> <?php foreach(getCityLevelList() as $levelID => $name): ?>
<button type="button" class="btn btn-dark btn-reorder_defender">수비 순서대로 정렬</button> <option value="<?=$levelID?>"><?=$name?></option>
</div> <?php endforeach; ?>
<div class="btn-group btn-group-sm" role="group"> </select>
<button type="button" class="btn btn-success add-defender">추가</button> <div class="input-group-prepend">
</div> <span class="input-group-text">수도</span>
</div> </div>
</div> <div class="input-group-append btn-group btn-group-toggle" data-toggle="buttons">
</div> <label class="btn btn-secondary">
<div class="card mb-2 form_sample"> <input type="radio" name="is_defender_capital" class="form_is_capital" value="1" autocomplete="off">Y
<div class="card-header"> </label>
<div class="float-sm-left" style="line-height:25px;">수비자 설정</div> <label class="btn btn-secondary active">
<div class="float-sm-right btn-toolbar" role="toolbar"> <input type="radio" name="is_defender_capital" class="form_is_capital" value="0" autocomplete="off">N
<div class="btn-group btn-group-sm mr-2" role="group"> </label>
<button type="button" class="btn btn-info btn-general-save">저장</button> </div>
<input type="file" class="form_load_general_file" accept=".json" style="display: none;" /> </div>
<button type="button" class="btn btn-primary btn-general-load">불러오기</button> <div class="input-group mb-1">
</div> <div class="input-group-prepend">
<div class="btn-group btn-group-sm" role="group"> <span class="input-group-text">수비</span>
<button type="button" class="btn btn-warning copy-defender">복제</button> </div>
<button type="button" class="btn btn-danger delete-defender">제거</button> <input type="number" class="form-control form_def" id="city_def" value="1000" min="10" step="10">
</div> <div class="input-group-prepend">
</div> <span class="input-group-text">성벽</span>
</div> </div>
<div class="card-body general_detail"> <input type="number" class="form-control form_wall" id="city_wall" value="1000" min="0" step="10">
<div class="input-group mb-3"> </div>
<div class="input-group-prepend"> </div>
<span class="input-group-text">이름</span> </div>
</div> <div class="card mb-2 defender_add_form">
<input type="text" class="form-control form_general_name" value="무명" style="width:15ch;"> <div class="card-header">
<div class="input-group-prepend"> <div class="float-sm-left" style="line-height:25px;">수비자 설정</div>
<span class="input-group-text">직위</span> <div class="float-sm-right btn-toolbar" role="toolbar">
</div> <div class="btn-group btn-group-sm mr-2" role="group">
<select class="custom-select form_officer_level" style="width:8ch;"> <button type="button" class="btn btn-dark btn-reorder_defender">수비 순서대로 정렬</button>
<option value="1">일반</option> </div>
<option value="4">태수</option> <div class="btn-group btn-group-sm" role="group">
<option value="3">군사</option> <button type="button" class="btn btn-success add-defender">추가</button>
<option value="2">종사</option> </div>
<option value="10">무장 수뇌</option> </div>
<option value="9">지장 수뇌</option> </div>
<option value="11">참모</option> </div>
<option value="12">군주</option> <div class="card mb-2 form_sample">
</select> <div class="card-header">
<div class="input-group-prepend"> <div class="float-sm-left" style="line-height:25px;">수비자 설정</div>
<span class="input-group-text">Level</span> <div class="float-sm-right btn-toolbar" role="toolbar">
</div> <div class="btn-group btn-group-sm mr-2" role="group">
<input type="number" class="form-control form_exp_level" value="20" min="0" max="300" step="1"> <button type="button" class="btn btn-success btn-general-import-server">서버에서 가져오기</button>
</div>
</div> <div class="btn-group btn-group-sm mr-2" role="group">
<div class="input-group mb-1"> <button type="button" class="btn btn-info btn-general-save">저장</button>
<div class="input-group-prepend"> <input type="file" class="form_load_general_file" accept=".json" style="display: none;" />
<span class="input-group-text">통솔</span> <button type="button" class="btn btn-primary btn-general-load">불러오기</button>
</div> </div>
<input type="number" class="form-control form_leadership" value="50" min="1" max="300" step="1"> <div class="btn-group btn-group-sm" role="group">
<div class="input-group-prepend"> <button type="button" class="btn btn-warning copy-defender">복제</button>
<span class="input-group-text">무력</span> <button type="button" class="btn btn-danger delete-defender">제거</button>
</div> </div>
<input type="number" class="form-control form_strength" value="50" min="1" max="300" step="1"> </div>
<div class="input-group-prepend"> </div>
<span class="input-group-text">지력</span> <div class="card-body general_detail">
</div> <div class="input-group mb-3">
<input type="number" class="form-control form_intel" value="50" min="1" max="300" step="1"> <div class="input-group-prepend">
</div> <span class="input-group-text">이름</span>
<div class="input-group mb-1"> </div>
<div class="input-group-prepend"> <input type="text" class="form-control form_general_name" value="무명" style="width:15ch;">
<span class="input-group-text">명마</span> <div class="input-group-prepend">
</div> <span class="input-group-text">직위</span>
<select class="custom-select form_general_horse"> </div>
<option value='None'>-</option> <select class="custom-select form_officer_level" style="width:8ch;">
<?php foreach(GameConst::$allItems['horse'] as $horseID=>$cnt): ?> <option value="1">일반</option>
<option value="<?=$horseID?>"><?=getItemName($horseID)?></option> <option value="4">태수</option>
<?php endforeach; ?> <option value="3">군사</option>
</select> <option value="2">종사</option>
<div class="input-group-prepend"> <option value="10">무장 수뇌</option>
<span class="input-group-text">무기</span> <option value="9">지장 수뇌</option>
</div> <option value="11">참모</option>
<select class="custom-select form_general_weap"> <option value="12">군주</option>
<option value='None'>-</option> </select>
<?php foreach(GameConst::$allItems['weapon'] as $weaponID=>$cnt): ?> <div class="input-group-prepend">
<option value="<?=$weaponID?>"><?=getItemName($weaponID)?></option> <span class="input-group-text">Level</span>
<?php endforeach; ?> </div>
</select> <input type="number" class="form-control form_exp_level" value="20" min="0" max="300" step="1">
<div class="input-group-prepend">
<span class="input-group-text">서적</span> </div>
</div> <div class="input-group mb-1">
<select class="custom-select form_general_book"> <div class="input-group-prepend">
<option value='None'>-</option> <span class="input-group-text">통솔</span>
<?php foreach(GameConst::$allItems['book'] as $bookID=>$cnt): ?> </div>
<option value="<?=$bookID?>"><?=getItemName($bookID)?></option> <input type="number" class="form-control form_leadership" value="50" min="1" max="300" step="1">
<?php endforeach; ?> <div class="input-group-prepend">
</select> <span class="input-group-text">무력</span>
</div> </div>
<div class="input-group mb-3"> <input type="number" class="form-control form_strength" value="50" min="1" max="300" step="1">
<div class="input-group-prepend"> <div class="input-group-prepend">
<span class="input-group-text">부상</span> <span class="input-group-text">지력</span>
</div> </div>
<input type="number" class="form-control form_injury" value="0" min="0" max="80" step="1"> <input type="number" class="form-control form_intel" value="50" min="1" max="300" step="1">
<div class="input-group-append"> </div>
<span class="input-group-text">%(<span class="injury_helptext">건강</span>)</span> <div class="input-group mb-1">
</div> <div class="input-group-prepend">
<div class="input-group-prepend"> <span class="input-group-text">명마</span>
<span class="input-group-text">군량</span> </div>
</div> <select class="custom-select form_general_horse">
<input type="number" class="form-control form_rice" value="5000" min="50" max="40000" step="50"> <option value='None'>-</option>
<div class="input-group-prepend"> <?php foreach(GameConst::$allItems['horse'] as $horseID=>$cnt): ?>
<span class="input-group-text">도구</span> <option value="<?=$horseID?>"><?=getItemName($horseID)?></option>
</div> <?php endforeach; ?>
<select class="custom-select form_general_item"> </select>
<option value='None'>-</option> <div class="input-group-prepend">
<?php foreach(GameConst::$allItems['item'] as $itemID=>$cnt): ?> <span class="input-group-text">무기</span>
<option value="<?=$itemID?>"><?=getItemName($itemID)?></option> </div>
<?php endforeach; ?> <select class="custom-select form_general_weap">
</select> <option value='None'>-</option>
</div> <?php foreach(GameConst::$allItems['weapon'] as $weaponID=>$cnt): ?>
<div class="input-group mb-1"> <option value="<?=$weaponID?>"><?=getItemName($weaponID)?></option>
<div class="input-group-prepend"> <?php endforeach; ?>
<span class="input-group-text">병종</span> </select>
</div> <div class="input-group-prepend">
<select class="custom-select form_crewtype"> <span class="input-group-text">서적</span>
<?php foreach(GameUnitConst::all() as $crewTypeID => $crewType): ?> </div>
<?php if($crewType->armType === GameUnitConst::T_CASTLE){ continue; } ?> <select class="custom-select form_general_book">
<option value="<?=$crewTypeID?>"><?=$crewType->name?></option> <option value='None'>-</option>
<?php endforeach; ?> <?php foreach(GameConst::$allItems['book'] as $bookID=>$cnt): ?>
</select> <option value="<?=$bookID?>"><?=getItemName($bookID)?></option>
<div class="input-group-prepend"> <?php endforeach; ?>
<span class="input-group-text">병사</span> </select>
</div> </div>
<input type="number" class="form-control form_crew" value="7000" min="100" step="100"> <div class="input-group mb-3">
<div class="input-group-prepend"> <div class="input-group-prepend">
<span class="input-group-text">성격</span> <span class="input-group-text">부상</span>
</div> </div>
<select class="custom-select form_general_character"> <input type="number" class="form-control form_injury" value="0" min="0" max="80" step="1">
<?php foreach(getCharacterList(false) as $characterID => [$name,$info]): ?> <div class="input-group-append">
<option value="<?=$characterID?>"><?=$name?></option> <span class="input-group-text">%(<span class="injury_helptext">건강</span>)</span>
<?php endforeach; ?> </div>
</select> <div class="input-group-prepend">
</div> <span class="input-group-text">군량</span>
<div class="input-group mb-3"> </div>
<div class="input-group-prepend"> <input type="number" class="form-control form_rice" value="5000" min="50" max="40000" step="50">
<span class="input-group-text">훈련</span> <div class="input-group-prepend">
</div> <span class="input-group-text">도구</span>
<input type="number" class="form-control form_train" value="100" min="40" max="<?=GameConst::$maxTrainByWar?>" step="1"> </div>
<div class="input-group-prepend"> <select class="custom-select form_general_item">
<span class="input-group-text">사기</span> <option value='None'>-</option>
</div> <?php foreach(GameConst::$allItems['item'] as $itemID=>$cnt): ?>
<input type="number" class="form-control form_atmos" value="100" min="40" max="<?=GameConst::$maxAtmosByWar?>" step="1"> <option value="<?=$itemID?>"><?=getItemName($itemID)?></option>
<div class="input-group-prepend"> <?php endforeach; ?>
<span class="input-group-text">전특</span> </select>
</div> </div>
<select class="custom-select form_general_special_war"> <div class="input-group mb-1">
<?php foreach(SpecialityHelper::getSpecialWarList(false) as $specialWarID =>$specialObj): ?> <div class="input-group-prepend">
<option value="<?=$specialWarID?>"><?=$specialObj->getName()?></option> <span class="input-group-text">병종</span>
<?php endforeach; ?> </div>
</select> <select class="custom-select form_crewtype">
</div> <?php foreach(GameUnitConst::all() as $crewTypeID => $crewType): ?>
<div class="input-group mb-1"> <?php if($crewType->armType === GameUnitConst::T_CASTLE){ continue; } ?>
<div class="input-group-prepend"> <option value="<?=$crewTypeID?>"><?=$crewType->name?></option>
<span class="input-group-text">보병숙련</span> <?php endforeach; ?>
</div> </select>
<select class="custom-select form_dex1"> <div class="input-group-prepend">
<?php foreach(getDexLevelList() as $dexLevel => [$dexAmount, $color, $name]): ?> <span class="input-group-text">병사</span>
<option value="<?=$dexAmount?>"><?="{$name} (".number_format($dexAmount).")"?></option> </div>
<?php endforeach; ?> <input type="number" class="form-control form_crew" value="7000" min="100" step="100">
</select> <div class="input-group-prepend">
<div class="input-group-prepend"> <span class="input-group-text">성격</span>
<span class="input-group-text">궁병숙련</span> </div>
</div> <select class="custom-select form_general_character">
<select class="custom-select form_dex2"> <?php foreach(getCharacterList(false) as $characterID => [$name,$info]): ?>
<?php foreach(getDexLevelList() as $dexLevel => [$dexAmount, $color, $name]): ?> <option value="<?=$characterID?>"><?=$name?></option>
<option value="<?=$dexAmount?>"><?="{$name} (".number_format($dexAmount).")"?></option> <?php endforeach; ?>
<?php endforeach; ?> </select>
</select> </div>
<div class="input-group-prepend"> <div class="input-group mb-3">
<span class="input-group-text">기병숙련</span> <div class="input-group-prepend">
</div> <span class="input-group-text">훈련</span>
<select class="custom-select form_dex3"> </div>
<?php foreach(getDexLevelList() as $dexLevel => [$dexAmount, $color, $name]): ?> <input type="number" class="form-control form_train" value="100" min="40" max="<?=GameConst::$maxTrainByWar?>" step="1">
<option value="<?=$dexAmount?>"><?="{$name} (".number_format($dexAmount).")"?></option> <div class="input-group-prepend">
<?php endforeach; ?> <span class="input-group-text">사기</span>
</select> </div>
</div> <input type="number" class="form-control form_atmos" value="100" min="40" max="<?=GameConst::$maxAtmosByWar?>" step="1">
<div class="input-group mb-1"> <div class="input-group-prepend">
<div class="input-group-prepend"> <span class="input-group-text">전특</span>
<span class="input-group-text">귀병숙련</span> </div>
</div> <select class="custom-select form_general_special_war">
<select class="custom-select form_dex4"> <?php foreach(SpecialityHelper::getSpecialWarList(false) as $specialWarID =>$specialObj): ?>
<?php foreach(getDexLevelList() as $dexLevel => [$dexAmount, $color, $name]): ?> <option value="<?=$specialWarID?>"><?=$specialObj->getName()?></option>
<option value="<?=$dexAmount?>"><?="{$name} (".number_format($dexAmount).")"?></option> <?php endforeach; ?>
<?php endforeach; ?> </select>
</select> </div>
<div class="input-group-prepend"> <div class="input-group mb-1">
<span class="input-group-text">차병숙련</span> <div class="input-group-prepend">
</div> <span class="input-group-text">보병숙련</span>
<select class="custom-select form_dex5"> </div>
<?php foreach(getDexLevelList() as $dexLevel => [$dexAmount, $color, $name]): ?> <select class="custom-select form_dex1">
<option value="<?=$dexAmount?>"><?="{$name} (".number_format($dexAmount).")"?></option> <?php foreach(getDexLevelList() as $dexLevel => [$dexAmount, $color, $name]): ?>
<?php endforeach; ?> <option value="<?=$dexAmount?>"><?="{$name} (".number_format($dexAmount).")"?></option>
</select> <?php endforeach; ?>
<div class="input-group-prepend only_defender"> </select>
<span class="input-group-text">수비여부</span> <div class="input-group-prepend">
</div> <span class="input-group-text">궁병숙련</span>
<select class="custom-select form_defence_train only_defender"> </div>
<option value="80">훈사 80</option> <select class="custom-select form_dex2">
<option value="60">훈사 60</option> <?php foreach(getDexLevelList() as $dexLevel => [$dexAmount, $color, $name]): ?>
<option value="999">안함</option> <option value="<?=$dexAmount?>"><?="{$name} (".number_format($dexAmount).")"?></option>
</select> <?php endforeach; ?>
</div> </select>
</div> <div class="input-group-prepend">
</div> <span class="input-group-text">기병숙련</span>
</div>
<select class="custom-select form_dex3">
</div><!-- <div class="col-sm"> --> <?php foreach(getDexLevelList() as $dexLevel => [$dexAmount, $color, $name]): ?>
</div> <option value="<?=$dexAmount?>"><?="{$name} (".number_format($dexAmount).")"?></option>
<div class="card mb-3"> <?php endforeach; ?>
<div class="card-header"> </select>
전투 요약 </div>
</div> <div class="input-group mb-1">
<table class="table"> <div class="input-group-prepend">
<tbody id="battle_result_summary"> <span class="input-group-text">귀병숙련</span>
<tr><th style='width:18ch;'>전투 일시</th><td id='result_datetime'></td></tr> </div>
<tr><th>전투 횟수</th><td id='result_warcnt'></td></tr> <select class="custom-select form_dex4">
<tr><th>전투 페이즈</th><td id='result_phase'></td></tr> <?php foreach(getDexLevelList() as $dexLevel => [$dexAmount, $color, $name]): ?>
<tr><th>준 피해</th><td><span id='result_killed'>0</span><span id='result_varKilled'> (<span id='result_minKilled'>0</span> ~ <span id='result_maxKilled'>0</span>)</span></td></tr> <option value="<?=$dexAmount?>"><?="{$name} (".number_format($dexAmount).")"?></option>
<tr><th>받은 피해</th><td><span id='result_dead'>0</span><span id='result_varDead'> (<span id='result_minDead'>0</span> ~ <span id='result_maxDead'>0</span>)</span></td></tr> <?php endforeach; ?>
<tr><th>출병자 군량 소모</th><td id='result_attackerRice'></td></tr> </select>
<tr><th>수비자 군량 소모</th><td id='result_defenderRice'></td></tr> <div class="input-group-prepend">
<tr><th>공격자 스킬</th><td id='result_attackerSkills'></td></tr> <span class="input-group-text">차병숙련</span>
<tr class='result_defenderSkills'><th>수비자1 스킬</th><td></td></tr> </div>
</tbody> <select class="custom-select form_dex5">
</table> <?php foreach(getDexLevelList() as $dexLevel => [$dexAmount, $color, $name]): ?>
</div> <option value="<?=$dexAmount?>"><?="{$name} (".number_format($dexAmount).")"?></option>
<div class="row"> <?php endforeach; ?>
<div class="col-sm"> </select>
<div class="card mb-3"> <div class="input-group-prepend only_defender">
<div class="card-header"> <span class="input-group-text">수비여부</span>
마지막 전투 로그 </div>
</div> <select class="custom-select form_defence_train only_defender">
<div class="card-body" id="generalBattleResultLog"> <option value="80">훈사 80</option>
<option value="60">훈사 60</option>
</div> <option value="999">안함</option>
</div> </select>
</div> </div>
<div class="col-sm"> </div>
<div class="card mb-3"> </div>
<div class="card-header">
마지막 전투 상세 로그
</div> </div><!-- <div class="col-sm"> -->
<div class="card-body" id="generalBattleDetailLog"> </div>
<div class="card mb-3">
</div> <div class="card-header">
</div> 전투 요약
</div> </div>
</div> <table class="table">
</div> <tbody id="battle_result_summary">
</body> <tr><th style='width:18ch;'>전투 일시</th><td id='result_datetime'></td></tr>
<tr><th>전투 횟수</th><td id='result_warcnt'></td></tr>
<tr><th>전투 페이즈</th><td id='result_phase'></td></tr>
<tr><th>준 피해</th><td><span id='result_killed'>0</span><span id='result_varKilled'> (<span id='result_minKilled'>0</span> ~ <span id='result_maxKilled'>0</span>)</span></td></tr>
<tr><th>받은 피해</th><td><span id='result_dead'>0</span><span id='result_varDead'> (<span id='result_minDead'>0</span> ~ <span id='result_maxDead'>0</span>)</span></td></tr>
<tr><th>출병자 군량 소모</th><td id='result_attackerRice'></td></tr>
<tr><th>수비자 군량 소모</th><td id='result_defenderRice'></td></tr>
<tr><th>공격자 스킬</th><td id='result_attackerSkills'></td></tr>
<tr class='result_defenderSkills'><th>수비자1 스킬</th><td></td></tr>
</tbody>
</table>
</div>
<div class="row">
<div class="col-sm">
<div class="card mb-3">
<div class="card-header">
마지막 전투 로그
</div>
<div class="card-body" id="generalBattleResultLog">
</div>
</div>
</div>
<div class="col-sm">
<div class="card mb-3">
<div class="card-header">
마지막 전투 상세 로그
</div>
<div class="card-body" id="generalBattleDetailLog">
</div>
</div>
</div>
</div>
</div>
<div id="importModal" class="modal" tabindex="-1" role="dialog">
<div class="modal-dialog" role="document">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title">장수 목록</h5>
<button type="button" class="close" data-dismiss="modal" aria-label="Close">
<span aria-hidden="true">&times;</span>
</button>
</div>
<div class="modal-body">
<select id="modalSelector"></select>
<p>타국 장수을 선택한 경우 숙련과 아이템은 0으로 초기화됩니다.</p>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-primary" id='importFromDB'>가져오기</button>
<button type="button" class="btn btn-secondary" data-dismiss="modal">닫기</button>
</div>
</div>
</div>
</div>
</body>
</html> </html>
+73
View File
@@ -0,0 +1,73 @@
<?php
namespace sammo;
include "lib.php";
include "func.php";
WebUtil::requireAJAX();
$destGeneralID = Util::getPost('destGeneralID', 'int', 0);
if(!$destGeneralID || $destGeneralID <= 0){
Json::die([
'result'=>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,
]);
+36
View File
@@ -0,0 +1,36 @@
<?php
namespace sammo;
include "lib.php";
include "func.php";
//로그인 검사
$session = Session::requireGameLogin([]);
$generalID = Session::getGeneralID();
$db = DB::db();
$rawList = Util::convertArrayToDict($db->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);
+109 -109
View File
@@ -1,109 +1,109 @@
<?php <?php
namespace sammo; namespace sammo;
include "lib.php"; include "lib.php";
include "func.php"; include "func.php";
//로그인 검사 //로그인 검사
$session = Session::requireLogin(); $session = Session::requireLogin([]);
$userID = Session::getUserID(); $userID = Session::getUserID();
$db = DB::db(); $db = DB::db();
$withToken = Util::getPost('with_token', 'bool', false); $withToken = Util::getPost('with_token', 'bool', false);
$gameStor = KVStorage::getStorage($db, 'game_env'); $gameStor = KVStorage::getStorage($db, 'game_env');
if($session->isGameLoggedIn()){ if($session->isGameLoggedIn()){
increaseRefresh("장수일람", 2); increaseRefresh("장수일람", 2);
$me = $db->queryFirstRow('SELECT con, turntime FROM general WHERE owner=%i', $userID); $me = $db->queryFirstRow('SELECT con, turntime FROM general WHERE owner=%i', $userID);
$con = checkLimit($me['con']); $con = checkLimit($me['con']);
if ($con >= 2) { if ($con >= 2) {
Json::die([ Json::die([
'result'=>false, 'result'=>false,
'reason'=>'접속 제한중입니다. 1턴 이내에 너무 많은 갱신을 하셨습니다.' 'reason'=>'접속 제한중입니다. 1턴 이내에 너무 많은 갱신을 하셨습니다.'
]); ]);
} }
} }
else{ else{
$availableNextCall = $session->availableNextCallGetGeneralList??'2000-01-01 00:00:00'; $availableNextCall = $session->availableNextCallGetGeneralList??'2000-01-01 00:00:00';
$now = new \DateTimeImmutable(); $now = new \DateTimeImmutable();
if($now <= new \DateTimeImmutable($availableNextCall) && $session->userGrade < 5){ if($now <= new \DateTimeImmutable($availableNextCall) && $session->userGrade < 5){
Json::die([ Json::die([
'result'=>false, 'result'=>false,
'reason'=>"장수 리스트는 10초에 한번 갱신 가능합니다.\n다음 시간 : ".$availableNextCall 'reason'=>"장수 리스트는 10초에 한번 갱신 가능합니다.\n다음 시간 : ".$availableNextCall
]); ]);
} }
$availableNextCall = $now->add(new \DateInterval('PT10S'))->format('Y-m-d H:i:s'); $availableNextCall = $now->add(new \DateInterval('PT10S'))->format('Y-m-d H:i:s');
$session->availableNextCallGetGeneralList = $availableNextCall; $session->availableNextCallGetGeneralList = $availableNextCall;
} }
$session->setReadOnly(); $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'); $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 = []; $ownerNameList = [];
if($gameStor->isunited){ if($gameStor->isunited){
foreach(RootDB::db()->queryAllLists('SELECT no, name FROM member') as [$ownerID, $ownerName]){ foreach(RootDB::db()->queryAllLists('SELECT no, name FROM member') as [$ownerID, $ownerName]){
$ownerNameList[$ownerID] = $ownerName; $ownerNameList[$ownerID] = $ownerName;
} }
} }
$generalList = []; $generalList = [];
foreach($rawGeneralList as $rawGeneral){ 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; [$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)){ if(key_exists($owner, $ownerNameList)){
$ownerName = $ownerNameList[$owner]; $ownerName = $ownerNameList[$owner];
} }
$nationArr = getNationStaticInfo($nation); $nationArr = getNationStaticInfo($nation);
$lbonus = calcLeadershipBonus($officerLevel, $nationArr['level']); $lbonus = calcLeadershipBonus($officerLevel, $nationArr['level']);
$generalList[] = [ $generalList[] = [
$no, $no,
$picture, $picture,
$imgsvr, $imgsvr,
$npc, $npc,
$age, $age,
$nationArr['name'], $nationArr['name'],
getGeneralSpecialDomesticName($special), getGeneralSpecialDomesticName($special),
getGeneralSpecialWarName($special2), getGeneralSpecialWarName($special2),
getGenChar($personal), getGenChar($personal),
$name, $name,
$npc==1?$ownerName:null, $npc==1?$ownerName:null,
$injury, $injury,
$leadership, $leadership,
$lbonus, $lbonus,
$strength, $strength,
$intel, $intel,
getExpLevel($experience), getExpLevel($experience),
getHonor($experience), getHonor($experience),
getDed($dedication), getDed($dedication),
getOfficerLevelText($officerLevel, $nationArr['level']), getOfficerLevelText($officerLevel, $nationArr['level']),
$killturn, $killturn,
$connectCnt $connectCnt
]; ];
} }
$result = [ $result = [
'result'=>'true', 'result'=>'true',
'list'=>$generalList, 'list'=>$generalList,
]; ];
if($withToken){ if($withToken){
$now = (new \DateTimeImmutable())->format('Y-m-d H:i:s'); $now = (new \DateTimeImmutable())->format('Y-m-d H:i:s');
$tokens = []; $tokens = [];
foreach($db->query('SELECT * FROM select_npc_token WHERE `valid_until`>=%s', $now) as $token){ foreach($db->query('SELECT * FROM select_npc_token WHERE `valid_until`>=%s', $now) as $token){
$validUntil = $token['valid_until']; $validUntil = $token['valid_until'];
foreach(Json::decode($token['pick_result']) as $pickResult){ foreach(Json::decode($token['pick_result']) as $pickResult){
$tokens[$pickResult['no']]=$pickResult['keepCnt']; $tokens[$pickResult['no']]=$pickResult['keepCnt'];
} }
} }
$result['token'] = $tokens; $result['token'] = $tokens;
} }
Json::die($result); Json::die($result);
+921 -799
View File
@@ -1,800 +1,922 @@
jQuery(function($){ jQuery(function($) {
var $generalForm = $('.form_sample .general_detail'); var $generalForm = $('.form_sample .general_detail');
var $defenderHeaderForm = $('.form_sample .card-header'); var $defenderHeaderForm = $('.form_sample .card-header');
var $defenderColumn = $('.defender-column'); var $defenderColumn = $('.defender-column');
var defenderNoList = {}; var defenderNoList = {};
var $attackerCard = $('.attacker_form'); var $attackerCard = $('.attacker_form');
var initBasicEvent = function(){ var initBasicEvent = function() {
$('.form_injury').change(function(){ if (window.nation) {
var $this = $(this); $('.form_city_level').val(window.city.level);
var $general = getGeneralDetail($this); $('.form_def').val(window.city.def);
var $helptext = $general.find('.injury_helptext'); $('.form_wall').val(window.city.wall);
$('.form_nation_type').val(window.nation.type);
var injury = parseInt($this.val()); $('.form_nation_level').val(window.nation.level);
//FIXME: PHP 코드와 항상 일치하도록 변경 $('.form_tech').val(parseInt(window.nation.tech / 1000));
var text = '건강'; if (window.nation.capital == window.city.city) {
var color = 'white'; $('.attacker_nation .form_is_capital:first').click();
if(injury > 60){ $('.defender_nation .form_is_capital:first').click();
text = '위독'; } else {
color = 'red'; $('.attacker_nation .form_is_capital:second').click();
} $('.defender_nation .form_is_capital:second').click();
else if(injury > 40){ }
text = '심각'; } else {
color = 'magenta'; $('.attacker_nation .form_is_capital:second').click();
} $('.defender_nation .form_is_capital:second').click();
else if(injury > 20){ }
text = '중상';
color = 'orange'; $('.form_injury').change(function() {
} var $this = $(this);
else if(injury > 0){ var $general = getGeneralDetail($this);
text = '경상'; var $helptext = $general.find('.injury_helptext');
color = 'yellow';
} var injury = parseInt($this.val());
$helptext.html(text).css('color', color); //FIXME: PHP 코드와 항상 일치하도록 변경
}); var text = '건강';
var color = 'white';
$('.export_general').click(function(){ if (injury > 60) {
var $btn = $(this); text = '위독';
var $general = getGeneralDetail($btn); color = 'red';
} else if (injury > 40) {
var values = exportGeneralInfo($general); text = '심각';
console.log(values); color = 'magenta';
}); } else if (injury > 20) {
$('.delete-defender').click(function(){ text = '중상';
var $card = getGeneralFrame($(this)); color = 'orange';
deleteDefender($card); } else if (injury > 0) {
}); text = '경상';
$('.copy-defender').click(function(){ color = 'yellow';
var $card = getGeneralFrame($(this)); }
copyDefender($card); $helptext.html(text).css('color', color);
}); });
$('.add-defender').click(function(){ $('.export_general').click(function() {
addDefender(); var $btn = $(this);
}); var $general = getGeneralDetail($btn);
$('.btn-general-load').click(function(){ var values = exportGeneralInfo($general);
var $file = $(this).prev(); console.log(values);
$file[0].click(); });
}) $('.delete-defender').click(function() {
var $card = getGeneralFrame($(this));
$('.form_load_general_file').on('change', function(e){ deleteDefender($card);
e.preventDefault(); });
var $this = $(this); $('.copy-defender').click(function() {
var $card = getGeneralFrame($this); var $card = getGeneralFrame($(this));
copyDefender($card);
var files = e.target.files; });
importGeneralInfoByFile(files, $card); $('.add-defender').click(function() {
return false; addDefender();
}); });
$('.btn-general-save').click(function(){ $('.btn-general-load').click(function() {
var $this = $(this); var $file = $(this).prev();
var $general = getGeneralDetail($this); $file[0].click();
var generalData = exportGeneralInfo($general); })
var filename = "general_{0}.json".format(generalData.name); $('.form_load_general_file').on('change', function(e) {
var saveData = JSON.stringify({ e.preventDefault();
objType:'general', var $this = $(this);
data:generalData var $card = getGeneralFrame($this);
}, null, 4);
var files = e.target.files;
download(saveData, filename, 'application/json');
}); importGeneralInfoByFile(files, $card);
return false;
$('.btn-battle-load').click(function(){ });
var $file = $(this).prev();
$file[0].click(); $('.btn-general-import-server').click(function() {
}) var $this = $(this);
var $card = getGeneralFrame($this);
$('.form_load_battle_file').on('change', function(e){
e.preventDefault(); var $modal = $('#importModal');
var $this = $(this); $modal.data('target', $card);
var files = e.target.files; $modal.modal('show');
});
importBattleInfoByFile(files);
return false; $('.btn-general-save').click(function() {
}); var $this = $(this);
var $general = getGeneralDetail($this);
$('.btn-battle-save').click(function(){ var generalData = exportGeneralInfo($general);
var battleData = exportAllData();
var filename = "battle_{0}.json".format(moment().format('YYYYMMDD_hhmmss')); var filename = "general_{0}.json".format(generalData.name);
var saveData = JSON.stringify({ var saveData = JSON.stringify({
objType:'battle', objType: 'general',
data:battleData data: generalData
}, null, 4); }, null, 4);
download(saveData, filename, 'application/json'); download(saveData, filename, 'application/json');
}) });
var $generals = $('.general_detail'); $('.btn-battle-load').click(function() {
$generals.bind('dragover dragleave', function(e) { var $file = $(this).prev();
e.stopPropagation() $file[0].click();
e.preventDefault() })
})
$generals.bind('drop', function(e){ $('.form_load_battle_file').on('change', function(e) {
e.preventDefault(); e.preventDefault();
var $this = $(this); var $this = $(this);
var $card = getGeneralFrame($this); var files = e.target.files;
var files = e.originalEvent.dataTransfer.files; importBattleInfoByFile(files);
return false;
importGeneralInfoByFile(files, $card); });
return false;
}); $('.btn-battle-save').click(function() {
var battleData = exportAllData();
var $battlePad = $('.dragpad_battle'); var filename = "battle_{0}.json".format(moment().format('YYYYMMDD_hhmmss'));
$battlePad.bind('dragover dragleave', function(e) { var saveData = JSON.stringify({
e.stopPropagation() objType: 'battle',
e.preventDefault() data: battleData
}) }, null, 4);
$battlePad.bind('drop', function(e){
e.preventDefault(); download(saveData, filename, 'application/json');
})
var files = e.originalEvent.dataTransfer.files;
var $generals = $('.general_detail');
importBattleInfoByFile(files); $generals.bind('dragover dragleave', function(e) {
return false; e.stopPropagation()
}); e.preventDefault()
} })
$generals.bind('drop', function(e) {
var importGeneralInfo = function($general, data){ e.preventDefault();
var setVal = function(query, val){ var $this = $(this);
$general.find(query).val(val).change(); var $card = getGeneralFrame($this);
}
var files = e.originalEvent.dataTransfer.files;
setVal('.form_general_name', data.name);
importGeneralInfoByFile(files, $card);
setVal('.form_officer_level', data.officer_level); return false;
setVal('.form_exp_level', data.explevel); });
setVal('.form_injury', data.injury);
var $battlePad = $('.dragpad_battle');
setVal('.form_leadership', data.leadership); $battlePad.bind('dragover dragleave', function(e) {
setVal('.form_general_horse', data.horse); e.stopPropagation()
setVal('.form_strength', data.strength); e.preventDefault()
setVal('.form_general_weap', data.weapon); })
setVal('.form_intel', data.intel); $battlePad.bind('drop', function(e) {
setVal('.form_general_book', data.book); e.preventDefault();
setVal('.form_general_item', data.item);
var files = e.originalEvent.dataTransfer.files;
setVal('.form_injury', data.injury);
importBattleInfoByFile(files);
setVal('.form_rice', data.rice); return false;
});
setVal('.form_general_character', data.personal); }
setVal('.form_general_special_war', data.special2);
var importGeneralInfo = function($general, data) {
setVal('.form_crew', data.crew); var setVal = function(query, val) {
setVal('.form_crewtype', data.crewtype); $general.find(query).val(val).change();
setVal('.form_atmos', data.atmos); }
setVal('.form_train', data.train);
setVal('.form_general_name', data.name);
setVal('.form_dex1', data.dex1);
setVal('.form_dex2', data.dex2); setVal('.form_officer_level', data.officer_level);
setVal('.form_dex3', data.dex3); setVal('.form_exp_level', data.explevel);
setVal('.form_dex4', data.dex4);
setVal('.form_dex5', data.dex5); setVal('.form_leadership', data.leadership);
setVal('.form_defence_train', data.defence_train); setVal('.form_general_horse', data.horse);
setVal('.form_strength', data.strength);
if(!setGeneralNo($general, data.no)){ setVal('.form_general_weap', data.weapon);
setGeneralNo($general, generateNewGeneralNo()); setVal('.form_intel', data.intel);
} setVal('.form_general_book', data.book);
} setVal('.form_general_item', data.item);
var exportGeneralInfo = function($general){ setVal('.form_injury', data.injury);
var getInt = function(query){
return parseInt($general.find(query).val()); setVal('.form_rice', data.rice);
}
setVal('.form_general_character', data.personal);
var getVal = function(query){ setVal('.form_general_special_war', data.special2);
return $general.find(query).val();
} setVal('.form_crew', data.crew);
setVal('.form_crewtype', data.crewtype);
return { setVal('.form_atmos', data.atmos);
no:getGeneralNo($general), setVal('.form_train', data.train);
name:getVal('.form_general_name'),
officer_level:getInt('.form_officer_level'), setVal('.form_dex1', data.dex1);
explevel:getInt('.form_exp_level'), setVal('.form_dex2', data.dex2);
setVal('.form_dex3', data.dex3);
leadership:getInt('.form_leadership'), setVal('.form_dex4', data.dex4);
horse:getVal('.form_general_horse'), setVal('.form_dex5', data.dex5);
strength:getInt('.form_strength'), setVal('.form_defence_train', data.defence_train);
weapon:getVal('.form_general_weap'),
intel:getInt('.form_intel'), if (!setGeneralNo($general, data.no)) {
book:getVal('.form_general_book'), setGeneralNo($general, generateNewGeneralNo());
item:getVal('.form_general_item'), }
}
injury:getInt('.form_injury'),
var exportGeneralInfo = function($general) {
rice:getInt('.form_rice'), var getInt = function(query) {
return parseInt($general.find(query).val());
personal:getVal('.form_general_character'), }
special2:getVal('.form_general_special_war'),
var getVal = function(query) {
crew:getInt('.form_crew'), return $general.find(query).val();
crewtype:getInt('.form_crewtype'), }
atmos:getInt('.form_atmos'),
train:getInt('.form_train'), return {
no: getGeneralNo($general),
dex1:getInt('.form_dex1'), name: getVal('.form_general_name'),
dex2:getInt('.form_dex2'), officer_level: getInt('.form_officer_level'),
dex3:getInt('.form_dex3'), explevel: getInt('.form_exp_level'),
dex4:getInt('.form_dex4'),
dex5:getInt('.form_dex5'), leadership: getInt('.form_leadership'),
defence_train:getInt('.form_defence_train'), horse: getVal('.form_general_horse'),
}; strength: getInt('.form_strength'),
} weapon: getVal('.form_general_weap'),
intel: getInt('.form_intel'),
var importBattleInfoByFile = function(files){ book: getVal('.form_general_book'),
if(files === null){ item: getVal('.form_general_item'),
alert('파일 에러!');
return false; injury: getInt('.form_injury'),
}
rice: getInt('.form_rice'),
if(files.length < 1){
alert("파일 에러!"); personal: getVal('.form_general_character'),
return false; special2: getVal('.form_general_special_war'),
}
crew: getInt('.form_crew'),
crewtype: getInt('.form_crewtype'),
var file = files[0]; atmos: getInt('.form_atmos'),
if(file.size > 1024*1024){ train: getInt('.form_train'),
alert('파일이 너무 큽니다!');
return false; dex1: getInt('.form_dex1'),
} dex2: getInt('.form_dex2'),
if(file.type === ''){ dex3: getInt('.form_dex3'),
alert('폴더를 업로드할 수 없습니다!'); dex4: getInt('.form_dex4'),
return false; dex5: getInt('.form_dex5'),
} defence_train: getInt('.form_defence_train'),
};
var reader = new FileReader(); }
reader.onload = function(){
var battleData = {}; var importBattleInfoByFile = function(files) {
try { if (files === null) {
battleData = JSON.parse(reader.result); alert('파일 에러!');
} catch(e) { return false;
alert('올바르지 않은 파일 형식입니다'); }
return false;
} if (files.length < 1) {
alert("파일 에러!");
if(!('objType' in battleData)){ return false;
alert('파일 형식을 확인할 수 없습니다'); }
return false;
}
var file = files[0];
if(battleData.objType != 'battle'){ if (file.size > 1024 * 1024) {
alert('전투 데이터가 아닙니다'); alert('파일이 너무 큽니다!');
return false; return false;
} }
if (file.type === '') {
importBattleInfo(battleData.data); alert('폴더를 업로드할 수 없습니다!');
return true; return false;
}; }
try { var reader = new FileReader();
reader.onload = function() {
reader.readAsText(file); var battleData = {};
} try {
catch(e) { battleData = JSON.parse(reader.result);
alert('파일을 읽는데 실패했습니다.'); } catch (e) {
return false; alert('올바르지 않은 파일 형식입니다');
} return false;
}
return true;
} if (!('objType' in battleData)) {
alert('파일 형식을 확인할 수 없습니다');
var importGeneralInfoByFile = function(files, $card){ return false;
if($card === undefined){ }
$card = addDefender();
} if (battleData.objType != 'battle') {
alert('전투 데이터가 아닙니다');
if(files === null){ return false;
alert('파일 에러!'); }
return false;
} importBattleInfo(battleData.data);
return true;
if(files.length < 1){ };
alert("파일 에러!");
return false; try {
}
reader.readAsText(file);
} catch (e) {
var file = files[0]; alert('파일을 읽는데 실패했습니다.');
if(file.size > 1024*1024){ return false;
alert('파일이 너무 큽니다!'); }
return false;
} return true;
if(file.type === ''){ }
alert('폴더를 업로드할 수 없습니다!');
return false; var importGeneralInfoByFile = function(files, $card) {
} if ($card === undefined) {
$card = addDefender();
var reader = new FileReader(); }
reader.onload = function(){
var generalData = {}; if (files === null) {
try { alert('파일 에러!');
generalData = JSON.parse(reader.result); return false;
} catch(e) { }
alert('올바르지 않은 파일 형식입니다');
return false; if (files.length < 1) {
} alert("파일 에러!");
return false;
if(!('objType' in generalData)){ }
alert('파일 형식을 확인할 수 없습니다');
return false;
} var file = files[0];
if (file.size > 1024 * 1024) {
if(generalData.objType == 'battle'){ alert('파일이 너무 큽니다!');
importBattleInfo(generalData.data); return false;
return true; }
} if (file.type === '') {
if(generalData.objType != 'general'){ alert('폴더를 업로드할 수 없습니다!');
alert('장수 데이터가 아닙니다'); return false;
return false; }
}
var reader = new FileReader();
$card.find('.form_load_general_file').val(''); reader.onload = function() {
var generalData = {};
importGeneralInfo($card, generalData.data); try {
return true; generalData = JSON.parse(reader.result);
}; } catch (e) {
alert('올바르지 않은 파일 형식입니다');
try { return false;
}
reader.readAsText(file);
} if (!('objType' in generalData)) {
catch(e) { alert('파일 형식을 확인할 수 없습니다');
alert('파일을 읽는데 실패했습니다.'); return false;
return false; }
}
if (generalData.objType == 'battle') {
return true; importBattleInfo(generalData.data);
} return true;
}
var extendGeneralInfoForDB = function(generalData){ if (generalData.objType != 'general') {
alert('장수 데이터가 아닙니다');
var dbVal = { return false;
nation: (generalData.no)<=1 ? 1 : 2, }
city: (generalData.no)<=1 ? 1 : 3,
turntime:'2018-08-26 12:00', $card.find('.form_load_general_file').val('');
special:defaultSpecialDomestic,
leadership_exp:0, importGeneralInfo($card, generalData.data);
strength_exp:0, return true;
intel_exp:0, };
gold:10000, try {
dedication:0, reader.readAsText(file);
} catch (e) {
recent_war:'2018-08-26 12:00', alert('파일을 읽는데 실패했습니다.');
experience:Math.pow(generalData.explevel, 2), return false;
}; }
return $.extend({}, generalData, dbVal); return true;
} }
var getGeneralFrame = function($btn){ var extendGeneralInfoForDB = function(generalData) {
var $card = $btn.closest('.general_form');
return $card; var dbVal = {
} nation: (generalData.no) <= 1 ? 1 : 2,
city: (generalData.no) <= 1 ? 1 : 3,
var getGeneralDetail = function($btn){ turntime: '2018-08-26 12:00',
var $card = getGeneralFrame($btn); special: defaultSpecialDomestic,
var $general = $card.find('.general_detail'); leadership_exp: 0,
return $general; strength_exp: 0,
} intel_exp: 0,
var getGeneralNo = function($btn){ gold: 10000,
return parseInt(getGeneralFrame($btn).data('general_no'));
} dedication: 0,
var setGeneralNo = function($btn, value){ recent_war: '2018-08-26 12:00',
if(value == 1){ experience: Math.pow(generalData.explevel, 2),
//1번은 무조건 공격자임 };
return false;
} return $.extend({}, generalData, dbVal);
if(value in defenderNoList){ }
return false;
} var getGeneralFrame = function($btn) {
var $card = getGeneralFrame($btn); var $card = $btn.closest('.general_form');
$card.data('general_no', value); return $card;
defenderNoList[value] = $card; }
return true;
} var getGeneralDetail = function($btn) {
var $card = getGeneralFrame($btn);
var generateNewGeneralNo = function(){ var $general = $card.find('.general_detail');
while(true){ return $general;
var newGeneralNo = parseInt(Math.random()*(1<<24))+2; }
if(newGeneralNo in defenderNoList){
continue; var getGeneralNo = function($btn) {
} return parseInt(getGeneralFrame($btn).data('general_no'));
return newGeneralNo; }
}
} var setGeneralNo = function($btn, value) {
if (value == 1) {
var deleteGeneralNo = function($btn){ //1번은 무조건 공격자임
var $card = getGeneralFrame($btn); return false;
$card.removeData('general_no'); }
var generalNo = getGeneralNo($card); if (value in defenderNoList) {
delete defenderNoList[generalNo]; return false;
} }
var $card = getGeneralFrame($btn);
var addDefender = function($cardAfter){ $card.data('general_no', value);
var $newCard = $('<div class="card mb-2 defender_form general_form"></div>'); defenderNoList[value] = $card;
return true;
if($cardAfter === undefined){ }
$defenderColumn.append($newCard);
} var generateNewGeneralNo = function() {
else{ while (true) {
$cardAfter.after($newCard); var newGeneralNo = parseInt(Math.random() * (1 << 24)) + 2;
} if (newGeneralNo in defenderNoList) {
continue;
$newCard.append($defenderHeaderForm.clone(true,true)); }
$newCard.append($generalForm.clone(true,true)); return newGeneralNo;
}
$newGeneral = getGeneralDetail($newCard); }
setGeneralNo($newCard, generateNewGeneralNo());
var deleteGeneralNo = function($btn) {
return $newCard; var $card = getGeneralFrame($btn);
} $card.removeData('general_no');
var generalNo = getGeneralNo($card);
var deleteDefender = function($card){ delete defenderNoList[generalNo];
deleteGeneralNo($card); }
$card.detach();
} var addDefender = function($cardAfter) {
var $newCard = $('<div class="card mb-2 defender_form general_form"></div>');
var copyDefender = function($card){
var $general = getGeneralDetail($card); if ($cardAfter === undefined) {
$defenderColumn.append($newCard);
var generalData = exportGeneralInfo($general); } else {
var $newObj = addDefender($card); $cardAfter.after($newCard);
importGeneralInfo(getGeneralDetail($newObj), generalData); }
}
$newCard.append($defenderHeaderForm.clone(true, true));
var importBattleInfo = function(battleData){ $newCard.append($generalForm.clone(true, true));
$('.form_load_battle_file').val(''); $newGeneral = getGeneralDetail($newCard);
console.log(battleData); setGeneralNo($newCard, generateNewGeneralNo());
var $attackerNation = $('.attacker_nation'); return $newCard;
var $defenderNation = $('.defender_nation'); }
var attackerGeneral = battleData.attackerGeneral; var deleteDefender = function($card) {
var attackerCity = battleData.attackerCity; deleteGeneralNo($card);
var attackerNation = battleData.attackerNation; $card.detach();
}
var defenderGenerals = battleData.defenderGenerals;
var defenderCity = battleData.defenderCity; var copyDefender = function($card) {
var defenderNation = battleData.defenderNation; var $general = getGeneralDetail($card);
$('#year').val(battleData.year); var generalData = exportGeneralInfo($general);
$('#month').val(battleData.month); var $newObj = addDefender($card);
$('#repeat_cnt').val(battleData.repeatCnt); importGeneralInfo(getGeneralDetail($newObj), generalData);
}
$('.delete-defender').click();
var importBattleInfo = function(battleData) {
$attackerNation.find('.form_nation_type').val(attackerNation.type);
$attackerNation.find('.form_tech').val(Math.floor(attackerNation.tech/1000)); $('.form_load_battle_file').val('');
$attackerNation.find('.form_nation_level').val(attackerNation.level); console.log(battleData);
if(attackerNation.capital == 1){
$attackerNation.find('.form_is_capital:first').click(); var $attackerNation = $('.attacker_nation');
} var $defenderNation = $('.defender_nation');
else{
$attackerNation.find('.form_is_capital:last').click(); var attackerGeneral = battleData.attackerGeneral;
} var attackerCity = battleData.attackerCity;
$attackerNation.find('.form_city_level').val(attackerCity.level); var attackerNation = battleData.attackerNation;
importGeneralInfo($('.attacker_form'), attackerGeneral); var defenderGenerals = battleData.defenderGenerals;
var defenderCity = battleData.defenderCity;
$defenderNation.find('.form_nation_type').val(defenderNation.type); var defenderNation = battleData.defenderNation;
$defenderNation.find('.form_tech').val(Math.floor(defenderNation.tech/1000));
$defenderNation.find('.form_nation_level').val(defenderNation.level); $('#year').val(battleData.year);
if(defenderNation.capital == 1){ $('#month').val(battleData.month);
$defenderNation.find('.form_is_capital:first').click(); $('#repeat_cnt').val(battleData.repeatCnt);
}
else{ $('.delete-defender').click();
$defenderNation.find('.form_is_capital:last').click();
} $attackerNation.find('.form_nation_type').val(attackerNation.type);
$defenderNation.find('.form_city_level').val(defenderCity.level); $attackerNation.find('.form_tech').val(Math.floor(attackerNation.tech / 1000));
$('#city_def').val(defenderCity.def); $attackerNation.find('.form_nation_level').val(attackerNation.level);
$('#city_wall').val(defenderCity.wall); if (attackerNation.capital == 1) {
$attackerNation.find('.form_is_capital:first').click();
$.each(defenderGenerals, function(idx, defenderGeneral){ } else {
var $card = addDefender(); $attackerNation.find('.form_is_capital:last').click();
importGeneralInfo($card, defenderGeneral); }
}); $attackerNation.find('.form_city_level').val(attackerCity.level);
}
importGeneralInfo($('.attacker_form'), attackerGeneral);
var exportAllData = function(){
var $attackerNation = $('.attacker_nation'); $defenderNation.find('.form_nation_type').val(defenderNation.type);
var $defenderNation = $('.defender_nation'); $defenderNation.find('.form_tech').val(Math.floor(defenderNation.tech / 1000));
$defenderNation.find('.form_nation_level').val(defenderNation.level);
var attackerGeneral = exportGeneralInfo($('.attacker_form')); if (defenderNation.capital == 1) {
$defenderNation.find('.form_is_capital:first').click();
var attackerCity = { } else {
level:parseInt($attackerNation.find('.form_city_level').val()), $defenderNation.find('.form_is_capital:last').click();
}; }
$defenderNation.find('.form_city_level').val(defenderCity.level);
var attackerNation = { $('#city_def').val(defenderCity.def);
type:$attackerNation.find('.form_nation_type').val(), $('#city_wall').val(defenderCity.wall);
tech:parseInt($attackerNation.find('.form_tech').val()) * 1000,
level:parseInt($attackerNation.find('.form_nation_level').val()), $.each(defenderGenerals, function(idx, defenderGeneral) {
capital:$attackerNation.find('.form_is_capital:checked').val()=='1'?1:2, var $card = addDefender();
} importGeneralInfo($card, defenderGeneral);
});
var defenderGenerals = $('.defender_form').map(function(){ }
return exportGeneralInfo($(this));
}).toArray(); var exportAllData = function() {
var $attackerNation = $('.attacker_nation');
var defenderCity = { var $defenderNation = $('.defender_nation');
def: parseInt($('#city_def').val()),
wall: parseInt($('#city_wall').val()), var attackerGeneral = exportGeneralInfo($('.attacker_form'));
level:parseInt($defenderNation.find('.form_city_level').val()),
}; var attackerCity = {
level: parseInt($attackerNation.find('.form_city_level').val()),
var defenderNation = { };
type:$defenderNation.find('.form_nation_type').val(),
tech:parseInt($defenderNation.find('.form_tech').val()) * 1000, var attackerNation = {
level:parseInt($defenderNation.find('.form_nation_level').val()), type: $attackerNation.find('.form_nation_type').val(),
capital:$defenderNation.find('.form_is_capital:checked').val()=='1'?3:4, 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 year = parseInt($('#year').val()); }
var month = parseInt($('#month').val());
var repeatCnt = parseInt($('#repeat_cnt').val()); var defenderGenerals = $('.defender_form').map(function() {
return exportGeneralInfo($(this));
return { }).toArray();
attackerGeneral:attackerGeneral,
attackerCity:attackerCity, var defenderCity = {
attackerNation:attackerNation, def: parseInt($('#city_def').val()),
wall: parseInt($('#city_wall').val()),
defenderGenerals:defenderGenerals, level: parseInt($defenderNation.find('.form_city_level').val()),
defenderCity:defenderCity, };
defenderNation:defenderNation,
var defenderNation = {
year:year, type: $defenderNation.find('.form_nation_type').val(),
month:month, tech: parseInt($defenderNation.find('.form_tech').val()) * 1000,
repeatCnt:repeatCnt, level: parseInt($defenderNation.find('.form_nation_level').val()),
}; capital: $defenderNation.find('.form_is_capital:checked').val() == '1' ? 3 : 4,
} }
var extendAllDataForDB = function(allData){ var year = parseInt($('#year').val());
var defaultNation = { var month = parseInt($('#month').val());
nation:0, var repeatCnt = parseInt($('#repeat_cnt').val());
name:'재야',
capital:0, return {
level:0, attackerGeneral: attackerGeneral,
gold:0, attackerCity: attackerCity,
rice:2000, attackerNation: attackerNation,
type:'None',
tech:0, defenderGenerals: defenderGenerals,
gennum:200, defenderCity: defenderCity,
}; defenderNation: defenderNation,
var defaultCity = { year: year,
nation:0, month: month,
supply:1, repeatCnt: repeatCnt,
name:'도시', };
}
pop:500000,
agri:10000, var extendAllDataForDB = function(allData) {
comm:10000, var defaultNation = {
secu:10000, nation: 0,
def:1000, name: '재야',
wall:1000, capital: 0,
level: 0,
trust:100, gold: 0,
rice: 2000,
pop_max:600000, type: 'None',
agri_max:12000, tech: 0,
comm_max:12000, gennum: 200,
secu_max:10000, };
def_max:12000,
wall_max:12000, var defaultCity = {
nation: 0,
dead:0, supply: 1,
name: '도시',
state:0,
pop: 500000,
conflict:'{}', agri: 10000,
}; comm: 10000,
secu: 10000,
var attackerNation = $.extend({}, defaultNation, allData.attackerNation); def: 1000,
attackerNation.nation = 1; wall: 1000,
attackerNation.name = '출병국';
trust: 100,
var attackerCity = $.extend({}, defaultCity, allData.attackerCity);
attackerCity.nation = 1; pop_max: 600000,
attackerCity.city = 1; agri_max: 12000,
comm_max: 12000,
var attackerGeneral = extendGeneralInfoForDB(allData.attackerGeneral); secu_max: 10000,
if(2 <= attackerGeneral.officer_level && attackerGeneral.officer_level <= 4){ def_max: 12000,
attackerGeneral.officer_city = 1; wall_max: 12000,
}
else{ dead: 0,
attackerGeneral.officer_city = 0;
} state: 0,
var defenderNation = $.extend({}, defaultNation, allData.defenderNation); conflict: '{}',
defenderNation.nation = 2; };
defenderNation.name = '수비국';
var attackerNation = $.extend({}, defaultNation, allData.attackerNation);
var defenderCity = $.extend({}, defaultCity, allData.defenderCity); attackerNation.nation = 1;
defenderCity.nation = 2; attackerNation.name = '출병국';
defenderCity.city = 3;
defenderCity.wall_max = defenderCity.wall/5*6; var attackerCity = $.extend({}, defaultCity, allData.attackerCity);
defenderCity.def_max = defenderCity.def/5*6; attackerCity.nation = 1;
attackerCity.city = 1;
var defenderGenerals = [];
$.each(allData.defenderGenerals, function(){ var attackerGeneral = extendGeneralInfoForDB(allData.attackerGeneral);
var defenderGeneral = extendGeneralInfoForDB(this); if (2 <= attackerGeneral.officer_level && attackerGeneral.officer_level <= 4) {
if(2 <= defenderGeneral.officer_level && defenderGeneral.officer_level <= 4){ attackerGeneral.officer_city = 1;
defenderGeneral.officer_city = 3; } else {
} attackerGeneral.officer_city = 0;
else{ }
defenderGeneral.officer_city = 0;
} var defenderNation = $.extend({}, defaultNation, allData.defenderNation);
defenderNation.nation = 2;
defenderGenerals.push(defenderGeneral); defenderNation.name = '수비국';
});
var defenderCity = $.extend({}, defaultCity, allData.defenderCity);
defenderCity.nation = 2;
return $.extend({}, allData, { defenderCity.city = 3;
attackerGeneral:attackerGeneral, defenderCity.wall_max = defenderCity.wall / 5 * 6;
attackerCity:attackerCity, defenderCity.def_max = defenderCity.def / 5 * 6;
attackerNation:attackerNation,
var defenderGenerals = [];
defenderGenerals:defenderGenerals, $.each(allData.defenderGenerals, function() {
defenderCity:defenderCity, var defenderGeneral = extendGeneralInfoForDB(this);
defenderNation:defenderNation, if (2 <= defenderGeneral.officer_level && defenderGeneral.officer_level <= 4) {
}); defenderGeneral.officer_city = 3;
} } else {
defenderGeneral.officer_city = 0;
var parseSkillCount = function(skills){ }
var result = [];
$.each(skills, function(key, value){ defenderGenerals.push(defenderGeneral);
result.push("{0}({1}회)".format(key, toPretty(value))); });
})
if(result.length == 0){ return $.extend({}, allData, {
return '-'; attackerGeneral: attackerGeneral,
} attackerCity: attackerCity,
return result.join(', '); attackerNation: attackerNation,
}
defenderGenerals: defenderGenerals,
var toPretty = function(number){ defenderCity: defenderCity,
if(isInt(number)){ defenderNation: defenderNation,
number = parseInt(number); });
} }
else{
number = parseFloat(number).toFixed(2); var parseSkillCount = function(skills) {
} var result = [];
return numberWithCommas(number); $.each(skills, function(key, value) {
} result.push("{0}({1}회)".format(key, toPretty(value)));
})
var showBattleResult = function(result){
$('#result_datetime').html(result.datetime); if (result.length == 0) {
$('#result_warcnt').html(toPretty(result.avgWar)); return '-';
$('#result_phase').html(toPretty(result.phase)); }
$('#result_killed').html(toPretty(result.killed)); return result.join(', ');
if(result.minKilled != result.maxKilled){ }
$('#result_maxKilled').html(toPretty(result.maxKilled));
$('#result_minKilled').html(toPretty(result.minKilled)); var toPretty = function(number) {
$('#result_varKilled').show(); if (isInt(number)) {
} number = parseInt(number);
else{ } else {
$('#result_varKilled').hide(); number = parseFloat(number).toFixed(2);
} }
$('#result_dead').html(toPretty(result.dead)); return numberWithCommas(number);
if(result.minDead != result.maxDead){ }
$('#result_maxDead').html(toPretty(result.maxDead));
$('#result_minDead').html(toPretty(result.minDead)); var showBattleResult = function(result) {
$('#result_varDead').show(); $('#result_datetime').html(result.datetime);
} $('#result_warcnt').html(toPretty(result.avgWar));
else{ $('#result_phase').html(toPretty(result.phase));
$('#result_varDead').hide(); $('#result_killed').html(toPretty(result.killed));
} if (result.minKilled != result.maxKilled) {
$('#result_maxKilled').html(toPretty(result.maxKilled));
$('#result_attackerRice').html(toPretty(result.attackerRice)); $('#result_minKilled').html(toPretty(result.minKilled));
$('#result_defenderRice').html(toPretty(result.defenderRice)); $('#result_varKilled').show();
$('#result_attackerSkills').html(parseSkillCount(result.attackerSkills)); } else {
$('#result_varKilled').hide();
$('.result_defenderSkills').detach(); }
$('#result_dead').html(toPretty(result.dead));
var $summary = $('#battle_result_summary'); if (result.minDead != result.maxDead) {
$('#result_maxDead').html(toPretty(result.maxDead));
$.each(result.defendersSkills, function(idx, defenderSkills){ $('#result_minDead').html(toPretty(result.minDead));
console.log(defenderSkills); $('#result_varDead').show();
var $result = $("<tr class='result_defenderSkills'><th>수비자{0} 스킬</th><td></td></tr>".format(idx + 1)); } else {
$result.find('td').html(parseSkillCount(defenderSkills)); $('#result_varDead').hide();
$summary.append($result); }
});
$('#result_attackerRice').html(toPretty(result.attackerRice));
$('#generalBattleResultLog').html(result.lastWarLog.generalBattleResultLog); $('#result_defenderRice').html(toPretty(result.defenderRice));
$('#generalBattleDetailLog').html(result.lastWarLog.generalBattleDetailLog); $('#result_attackerSkills').html(parseSkillCount(result.attackerSkills));
} $('.result_defenderSkills').detach();
var beginBattle = function(){ var $summary = $('#battle_result_summary');
var data = extendAllDataForDB(exportAllData());
console.log(data); $.each(result.defendersSkills, function(idx, defenderSkills) {
$.ajax({ console.log(defenderSkills);
type:'post', var $result = $("<tr class='result_defenderSkills'><th>수비자{0} 스킬</th><td></td></tr>".format(idx + 1));
url:'j_simulate_battle.php', $result.find('td').html(parseSkillCount(defenderSkills));
dataType:'json', $summary.append($result);
data:{ });
action:'battle',
query:JSON.stringify(data), $('#generalBattleResultLog').html(result.lastWarLog.generalBattleResultLog);
} $('#generalBattleDetailLog').html(result.lastWarLog.generalBattleDetailLog);
}).then(function(result){
console.log(result); }
if(!result.result){
alert(result.reason); var beginBattle = function() {
return; var data = extendAllDataForDB(exportAllData());
} console.log(data);
showBattleResult(result); $.ajax({
type: 'post',
}, function(result){ url: 'j_simulate_battle.php',
alert('전투 개시 실패!'); dataType: 'json',
}); data: {
} action: 'battle',
query: JSON.stringify(data),
}
var reorderDefender = function(defenderOrder){ }).then(function(result) {
$.each(defenderOrder, function(idx, generalNo){ console.log(result);
if (!result.result) {
if(!(generalNo in defenderNoList)){ alert(result.reason);
//음..? return;
alert("{0}이 수비자 리스트에 없습니다. 버그인 듯 합니다.".format(generalNo)); }
return true; showBattleResult(result);
}
}, function(result) {
var $defenderObj = defenderNoList[generalNo]; alert('전투 개시 실패!');
$defenderObj.detach(); });
$defenderColumn.append($defenderObj); }
})
}
var reorderDefender = function(defenderOrder) {
var requestReorderDefender = function(){ $.each(defenderOrder, function(idx, generalNo) {
var data = extendAllDataForDB(exportAllData());
console.log(data); if (!(generalNo in defenderNoList)) {
$.ajax({ //음..?
type:'post', alert("{0}이 수비자 리스트에 없습니다. 버그인 듯 합니다.".format(generalNo));
url:'j_simulate_battle.php', return true;
dataType:'json', }
data:{
action:'reorder', var $defenderObj = defenderNoList[generalNo];
query:JSON.stringify(data), $defenderObj.detach();
} $defenderColumn.append($defenderObj);
}).then(function(result){ })
console.log(result); }
if(!result.result){
alert(result.reason); var requestReorderDefender = function() {
return; var data = extendAllDataForDB(exportAllData());
} console.log(data);
reorderDefender(result.order); $.ajax({
type: 'post',
}, function(result){ url: 'j_simulate_battle.php',
alert('재정렬 실패!'); dataType: 'json',
}); data: {
} action: 'reorder',
query: JSON.stringify(data),
initBasicEvent(); }
$attackerCard.append($generalForm.clone(true,true)); }).then(function(result) {
addDefender(); console.log(result);
if (!result.result) {
$('.btn-begin_battle').click(function(){ alert(result.reason);
beginBattle(); return;
}); }
reorderDefender(result.order);
$('.btn-reorder_defender').click(function(){
requestReorderDefender(); }, 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 = $('<optgroup label="{0}"></optgroup>'.format(nationName));
$optGroup.css('background-color', color);
$optGroup.css('color', isBrightColor(color) ? 'black' : 'white');
$.each(generalList, function(idx, general) {
$item = $('<option value="{0}">{1}</option>'.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();
})
}); });
+129 -103
View File
@@ -3,8 +3,8 @@
* @see https://stackoverflow.com/questions/24816/escaping-html-strings-with-jquery * @see https://stackoverflow.com/questions/24816/escaping-html-strings-with-jquery
* @param {string} string escape하고자 하는 문자열 * @param {string} string escape하고자 하는 문자열
* @returns {string} * @returns {string}
*/ */
var escapeHtml = (function (string) { var escapeHtml = (function(string) {
var entityMap = { var entityMap = {
'&': '&amp;', '&': '&amp;',
'<': '&lt;', '<': '&lt;',
@@ -32,58 +32,70 @@ function isInt(n) {
return +n === n && !(n % 1); return +n === n && !(n % 1);
} }
;(function(ns){ ;
(function(ns) {
//https://gist.github.com/demouth/3217440 //https://gist.github.com/demouth/3217440
/** /**
* mb_strwidth * mb_strwidth
* @param String * @param String
* @return int * @return int
* @see http://php.net/manual/ja/function.mb-strwidth.php * @see http://php.net/manual/ja/function.mb-strwidth.php
*/ */
var mb_strwidth = function(str){ var mb_strwidth = function(str) {
var i=0,l=str.length,c='',length=0; var i = 0,
for(;i<l;i++){ l = str.length,
c=str.charCodeAt(i); c = '',
if(0x0000<=c&&c<=0x0019){ length = 0;
length += 0; for (; i < l; i++) {
}else if(0x0020<=c&&c<=0x1FFF){ c = str.charCodeAt(i);
length += 1; if (0x0000 <= c && c <= 0x0019) {
}else if(0x2000<=c&&c<=0xFF60){ length += 0;
length += 2; } else if (0x0020 <= c && c <= 0x1FFF) {
}else if(0xFF61<=c&&c<=0xFF9F){ length += 1;
length += 1; } else if (0x2000 <= c && c <= 0xFF60) {
}else if(0xFFA0<=c){ length += 2;
length += 2; } else if (0xFF61 <= c && c <= 0xFF9F) {
} length += 1;
} } else if (0xFFA0 <= c) {
return length; length += 2;
}; }
}
/** return length;
* mb_strimwidth };
* @param String
* @param int /**
* @param int * mb_strimwidth
* @param String * @param String
* @return String * @param int
* @see http://www.php.net/manual/ja/function.mb-strimwidth.php * @param int
*/ * @param String
var mb_strimwidth = function(str,start,width,trimmarker){ * @return String
if(typeof trimmarker === 'undefined') trimmarker=''; * @see http://www.php.net/manual/ja/function.mb-strimwidth.php
var trimmakerWidth = mb_strwidth(trimmarker),i=start,l=str.length,trimmedLength=0,trimmedStr=''; */
for(;i<l;i++){ var mb_strimwidth = function(str, start, width, trimmarker) {
var charCode=str.charCodeAt(i),c=str.charAt(i),charWidth=mb_strwidth(c),next=str.charAt(i+1),nextWidth=mb_strwidth(next); if (typeof trimmarker === 'undefined') trimmarker = '';
trimmedLength += charWidth; var trimmakerWidth = mb_strwidth(trimmarker),
trimmedStr += c; i = start,
if(trimmedLength+trimmakerWidth+nextWidth>width){ l = str.length,
trimmedStr += trimmarker; trimmedLength = 0,
break; trimmedStr = '';
} for (; i < l; i++) {
} var charCode = str.charCodeAt(i),
return trimmedStr; c = str.charAt(i),
}; charWidth = mb_strwidth(c),
ns.mb_strwidth = mb_strwidth; next = str.charAt(i + 1),
ns.mb_strimwidth = mb_strimwidth; 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); })(window);
/** /**
@@ -93,7 +105,7 @@ function isInt(n) {
*/ */
function convertDictById(arr) { function convertDictById(arr) {
var result = {}; var result = {};
arr.forEach(function (v, i) { arr.forEach(function(v, i) {
result[v.id] = v; result[v.id] = v;
}); });
return result; return result;
@@ -106,7 +118,7 @@ function convertDictById(arr) {
*/ */
function convertSet(arr) { function convertSet(arr) {
var result = {}; var result = {};
arr.forEach(function (v) { arr.forEach(function(v) {
result[v] = true; result[v] = true;
}); });
return result; return result;
@@ -115,10 +127,10 @@ function convertSet(arr) {
/** /**
* {0}, {1}, {2}형태로 포맷해주는 함수 * {0}, {1}, {2}형태로 포맷해주는 함수
*/ */
String.prototype.format = function() { String.prototype.format = function() {
var args = arguments; 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; return (typeof args[number] != 'undefined') ? args[number] : match;
}); });
}; };
@@ -134,12 +146,11 @@ function hexToRgb(hex) {
} }
function isBrightColor(color){ function isBrightColor(color) {
color = hexToRgb(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; return true;
} } else {
else{
return false; return false;
} }
} }
@@ -177,7 +188,7 @@ function numberWithCommas(x) {
return x.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ","); return x.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ",");
} }
function linkifyStrWithOpt(text){ function linkifyStrWithOpt(text) {
return linkifyStr(text, {}); return linkifyStr(text, {});
} }
@@ -188,14 +199,14 @@ function linkifyStrWithOpt(text){
* @param {object} options * @param {object} options
* @returns {string} * @returns {string}
*/ */
var TemplateEngine = function (html, options) { var TemplateEngine = function(html, options) {
var re = /<%(.+?)%>/g, var re = /<%(.+?)%>/g,
reExp = /(^( )?(var|if|for|else|switch|case|break|{|}|;))(.*)?/g, reExp = /(^( )?(var|if|for|else|switch|case|break|{|}|;))(.*)?/g,
code = 'with(obj) { var r=[];\n', code = 'with(obj) { var r=[];\n',
cursor = 0, cursor = 0,
result, result,
match; match;
var add = function (line, js) { var add = function(line, js) {
js ? (code += line.match(reExp) ? line + '\n' : 'r.push(' + line + ');\n') : js ? (code += line.match(reExp) ? line + '\n' : 'r.push(' + line + ');\n') :
(code += line != '' ? 'r.push("' + line.replace(/"/g, '\\"') + '");\n' : ''); (code += line != '' ? 'r.push("' + line.replace(/"/g, '\\"') + '");\n' : '');
return add; return add;
@@ -208,82 +219,97 @@ var TemplateEngine = function (html, options) {
} }
add(html.substr(cursor, html.length - cursor)); add(html.substr(cursor, html.length - cursor));
code = (code + 'return r.join(""); }').replace(/[\r\t\n]/g, ' '); code = (code + 'return r.join(""); }').replace(/[\r\t\n]/g, ' ');
try { result = new Function('obj', code).apply(options, [options]); } try { result = new Function('obj', code).apply(options, [options]); } catch (err) { console.error("'" + err.message + "'", " in \n\nCode:\n", code, "\n"); }
catch (err) { console.error("'" + err.message + "'", " in \n\nCode:\n", code, "\n"); }
return result; return result;
} }
function getIconPath(imgsvr, picture){ function getIconPath(imgsvr, picture) {
// ../d_shared/common_path.js 필요 // ../d_shared/common_path.js 필요
if(!imgsvr){ if (!imgsvr) {
return pathConfig.sharedIcon+'/'+picture; return pathConfig.sharedIcon + '/' + picture;
} } else {
else{ return pathConfig.root + '/d_pic/' + picture;
return pathConfig.root+'/d_pic/'+picture;
} }
} }
function activeFlip($obj){ function activeFlip($obj) {
var $result; var $result;
if($obj === undefined){ if ($obj === undefined) {
$result = $('img[data-flip]'); $result = $('img[data-flip]');
} } else {
else{
$result = $obj.find('img[data-flip]'); $result = $obj.find('img[data-flip]');
} }
$result.each(function(){ $result.each(function() {
activeFlipItem($(this)); 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 = []; var imageList = [];
imageList.push($img.attr('src')); 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); var value = $.trim(value);
if(!value){ if (!value) {
return true; return true;
} }
imageList.push(value); imageList.push(value);
}); });
if(imageList.length <= 1){ if (imageList.length <= 1) {
return; return;
} }
$img.data('computed_flip_array', imageList); $img.data('computed_flip_array', imageList);
$img.data('computed_flip_idx', 0); $img.data('computed_flip_idx', 0);
$img.click(function(){ $img.click(function() {
var arr = $img.data('computed_flip_array'); var arr = $img.data('computed_flip_array');
var idx = $img.data('computed_flip_idx'); var idx = $img.data('computed_flip_idx');
idx = (idx + 1)%(arr.length); idx = (idx + 1) % (arr.length);
$img.attr('src', arr[idx]); $img.attr('src', arr[idx]);
$img.data('computed_flip_idx', idx); $img.data('computed_flip_idx', idx);
}); });
$img.css('cursor','pointer'); $img.css('cursor', 'pointer');
} }
jQuery(function($){ jQuery(function($) {
$('.obj_tooltip').mouseover(function(){ $('.obj_tooltip').mouseover(function() {
var $objTooltip = $(this); var $objTooltip = $(this);
if($objTooltip.data('setObjTooltip')){ if ($objTooltip.data('setObjTooltip')) {
return true; return true;
} }
var tooltipClassText = $objTooltip.data('tooltip-class'); var tooltipClassText = $objTooltip.data('tooltip-class');
if(!tooltipClassText){ if (!tooltipClassText) {
tooltipClassText = ''; tooltipClassText = '';
} }
var template = '<div class="tooltip {0}" role="tooltip"><div class="arrow"></div><div class="tooltip-inner"></div></div>' var template = '<div class="tooltip {0}" role="tooltip"><div class="arrow"></div><div class="tooltip-inner"></div></div>'
.format(tooltipClassText); .format(tooltipClassText);
$objTooltip.tooltip({ $objTooltip.tooltip({
title:function(){ title: function() {
return $.trim($(this).find('.tooltiptext').html()); return $.trim($(this).find('.tooltiptext').html());
}, },
template:template, template: template,
html:true html: true
}).tooltip('show'); }).tooltip('show');
$objTooltip.data('setObjTooltip', true); $objTooltip.data('setObjTooltip', true);
@@ -297,21 +323,21 @@ jQuery(function($){
activeFlip(); activeFlip();
var customCSS = localStorage.getItem('sam_customCSS'); var customCSS = localStorage.getItem('sam_customCSS');
if(customCSS){ if (customCSS) {
var $style = $('<style type="text/css"></style>'); var $style = $('<style type="text/css"></style>');
$style.text(customCSS); $style.text(customCSS);
$style.appendTo($('head')); $style.appendTo($('head'));
} }
}); });
function errUnknown(){ function errUnknown() {
alert('작업을 실패했습니다.'); alert('작업을 실패했습니다.');
} }
function errUnknownToast(){ function errUnknownToast() {
$.toast({ $.toast({
title: '에러!', title: '에러!',
content: '작업을 실패했습니다.', content: '작업을 실패했습니다.',
@@ -320,8 +346,8 @@ function errUnknownToast(){
}); });
} }
function quickReject(errMsg){ function quickReject(errMsg) {
if(errMsg === undefined){ if (errMsg === undefined) {
errMsg = '작업을 실패했습니다.'; errMsg = '작업을 실패했습니다.';
} }
var deferred = $.Deferred(); var deferred = $.Deferred();
@@ -329,8 +355,8 @@ function quickReject(errMsg){
return deferred.promise(); return deferred.promise();
} }
function nl2br(text){ function nl2br(text) {
return text.replace(/\n/g,"<br>"); return text.replace(/\n/g, "<br>");
} }
/* /*
function br2nl (text) { function br2nl (text) {
@@ -338,11 +364,11 @@ function br2nl (text) {
} }
*/ */
function getNpcColor(npcType){ function getNpcColor(npcType) {
if(npcType >= 2){ if (npcType >= 2) {
return 'cyan'; return 'cyan';
} }
if(npcType == 1){ if (npcType == 1) {
return 'skyblue'; return 'skyblue';
} }
return null; return null;
+352 -359
View File
@@ -1,360 +1,353 @@
var templateGeneralCard = var templateGeneralCard =
'<div class="general_card">\ '<div class="general_card">\
<h4 class="bg1 with_border"><%name%></h4>\ <h4 class="bg1 with_border"><%name%></h4>\
<h4><img src="<%iconPath%>" height=64 width=64></h4>\ <h4><img src="<%iconPath%>" height=64 width=64></h4>\
<p><%leadership%> / <%strength%> / <%intel%><br>\ <p><%leadership%> / <%strength%> / <%intel%><br>\
<%nation%><br>\ <%nation%><br>\
<%personalText%><br>\ <%personalText%><br>\
<%specialText%> / <%special2Text%></p>\ <%specialText%> / <%special2Text%></p>\
<button type="subject" class="with_skin with_border select_btn" data-name="<%name%>" value="<%no%>" name="pick">빙의하기</button>\ <button type="subject" class="with_skin with_border select_btn" data-name="<%name%>" value="<%no%>" name="pick">빙의하기</button>\
<label><input <%keepCnt?"":disabled="disabled"%> type="checkbox" value="<%no%>" name="keep[]" class="keep_select">보관(<%keepCnt%>회)</label>\ <label><input <%keepCnt?"":disabled="disabled"%> type="checkbox" value="<%no%>" name="keep[]" class="keep_select">보관(<%keepCnt%>회)</label>\
</div>'; </div>';
var templateSpecial = var templateSpecial =
'<span class="obj_tooltip" data-toggle="tooltip" data-placement="top"><%text%>\ '<span class="obj_tooltip" data-toggle="tooltip" data-placement="top"><%text%>\
<span class="tooltiptext">\ <span class="tooltiptext">\
<%info%>\ <%info%>\
</span>\ </span>\
</span>\ </span>\
'; ';
var templateGeneralRow = var templateGeneralRow =
'<tr>\ '<tr>\
<td><img class="generalIcon" width="64" height="64" src="<%iconPath%>"></td>\ <td><img class="generalIcon" width="64" height="64" src="<%iconPath%>"></td>\
<td style="<%userCSS%>"><%name%><%nameAux%></td>\ <td style="<%userCSS%>"><%name%><%nameAux%></td>\
<td><%age%>세</td>\ <td><%age%>세</td>\
<td><%personalWithTooltip%></td>\ <td><%personalWithTooltip%></td>\
<td><%specialDomesticWithTooltip%> / <%speicalWarWithTooltip%></td>\ <td><%specialDomesticWithTooltip%> / <%speicalWarWithTooltip%></td>\
<td>Lv <%explevel%></td>\ <td>Lv <%explevel%></td>\
<td><%nation%></td>\ <td><%nation%></td>\
<td><%experience%></td>\ <td><%experience%></td>\
<td><%dedication%></td>\ <td><%dedication%></td>\
<td><%officerLevel%></td>\ <td><%officerLevel%></td>\
<td><%total%></td>\ <td><%total%></td>\
<td><%leadership%></td>\ <td><%leadership%></td>\
<td><%strength%></td>\ <td><%strength%></td>\
<td><%intel%></td>\ <td><%intel%></td>\
<td><%killturn%></td>\ <td><%killturn%></td>\
</tr>'; </tr>';
function pickGeneral(){ function pickGeneral() {
$btn = $(this); $btn = $(this);
if (!confirm('빙의할까요? : {0}'.format($btn.data('name')))) { if (!confirm('빙의할까요? : {0}'.format($btn.data('name')))) {
return false; return false;
} }
$.post({ $.post({
url:'j_select_npc.php', url: 'j_select_npc.php',
dataType:'json', dataType: 'json',
data:{ data: {
pick:$btn.val() pick: $btn.val()
} }
}).then(function(result){ }).then(function(result) {
if(!result.result){ if (!result.result) {
alert(result.reason); alert(result.reason);
location.refresh(); location.refresh();
} }
alert('빙의에 성공했습니다.'); alert('빙의에 성공했습니다.');
location.href = './'; location.href = './';
}); });
return false; return false;
} }
function updateOutdateTimer(){ function updateOutdateTimer() {
var $validUntilText = $('#valid_until_text'); var $validUntilText = $('#valid_until_text');
var now = Date.now(); var now = Date.now();
var validUntil = $validUntilText.data('until'); var validUntil = $validUntilText.data('until');
if(validUntil <= 0){ if (validUntil <= 0) {
return; return;
} } else if (validUntil < now) {
else if(validUntil < now){ $validUntilText.data('until', 0);
$validUntilText.data('until',0); $('#valid_until').hide();
$('#valid_until').hide(); $('#outdate_token').show();
$('#outdate_token').show(); return;
return; } else if (validUntil - now <= 30000) {
} $validUntilText.css('color', "rgb(255, {0}, {0})".format(255 * (validUntil - now) / 30000));
else if(validUntil - now <= 30000){ }
$validUntilText.css('color', "rgb(255, {0}, {0})".format(255*(validUntil - now)/30000));
} setTimeout(updateOutdateTimer, 1000);
}
setTimeout(updateOutdateTimer, 1000);
} function updatePickMoreTimer() {
var $btn = $('#btn_pick_more');
function updatePickMoreTimer(){
var $btn = $('#btn_pick_more'); var now = Date.now();
var remain = ($btn.data('available') - now) / 1000;
var now = Date.now(); if (remain <= 0) {
var remain = ($btn.data('available') - now) / 1000; $btn.prop('disabled', false)
if(remain <= 0){ $btn.html('다른 장수 보기');
$btn.prop('disabled', false) return;
$btn.html('다른 장수 보기'); }
return;
} $btn.html('다른 장수 보기({0}초)'.format(Math.ceil(remain)));
$btn.html('다른 장수 보기({0}초)'.format(Math.ceil(remain))); setTimeout(updatePickMoreTimer, 250);
}
setTimeout(updatePickMoreTimer, 250);
} function printGenerals(value) {
$('.card_holder').empty();
function printGenerals(value){ $('#valid_until').show();
$('.card_holder').empty(); $('#valid_until_text').html(value.validUntil).data('until', (new Date(value.validUntil)).getTime()).css('color', 'white');
$('#valid_until').show(); $('#outdate_token').hide();
$('#valid_until_text').html(value.validUntil).data('until', (new Date(value.validUntil)).getTime()).css('color','white'); var time = Date.now() + value.pickMoreSeconds * 1000;
$('#outdate_token').hide(); $('#btn_pick_more').data('available', time).prop('disabled', true);
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;
var pick = $.map(value.pick, function(value, key) { });
return value;
}); pick.sort(function(lhs, rhs) {
var lsum = lhs.leadership + lhs.strength + lhs.intel;
pick.sort(function(lhs, rhs){ var rsum = rhs.leadership + rhs.strength + rhs.intel;
var lsum = lhs.leadership+lhs.strength+lhs.intel; return lsum - rsum;
var rsum = rhs.leadership+rhs.strength+rhs.intel; });
return lsum - rsum;
}); $.each(pick, function(idx, cardData) {
cardData.iconPath = getIconPath(cardData.imgsvr, cardData.picture);
$.each(pick, function(idx, cardData){ if (cardData.special in specialInfo) {
cardData.iconPath = getIconPath(cardData.imgsvr, cardData.picture); cardData.specialText = TemplateEngine(templateSpecial, {
if(cardData.special in specialInfo){ text: cardData.special,
cardData.specialText = TemplateEngine(templateSpecial, { info: specialInfo[cardData.special]
text:cardData.special, });
info:specialInfo[cardData.special] } else {
}); cardData.specialText = cardData.special;
} }
else{
cardData.specialText = cardData.special; if (cardData.special2 in specialInfo) {
} cardData.special2Text = TemplateEngine(templateSpecial, {
text: cardData.special2,
if(cardData.special2 in specialInfo){ info: specialInfo[cardData.special2]
cardData.special2Text = TemplateEngine(templateSpecial, { });
text:cardData.special2, } else {
info:specialInfo[cardData.special2] cardData.special2Text = cardData.special2;
}); }
}
else{ if (cardData.personal in characterInfo) {
cardData.special2Text = cardData.special2; cardData.personalText = TemplateEngine(templateSpecial, {
} text: cardData.personal,
info: characterInfo[cardData.personal]
if(cardData.personal in characterInfo){ });
cardData.personalText = TemplateEngine(templateSpecial, { } else {
text:cardData.personal, cardData.personalText = cardData.personal;
info:characterInfo[cardData.personal] }
});
}
else{ var $card = $(TemplateEngine(templateGeneralCard, cardData));
cardData.personalText = cardData.personal;
} $('.card_holder').append($card);
$card.find('.select_btn').click(pickGeneral);
$card.find('.obj_tooltip').tooltip({
var $card = $(TemplateEngine(templateGeneralCard, cardData)); title: function() {
return $.trim($(this).find('.tooltiptext').html());
$('.card_holder').append($card); },
$card.find('.select_btn').click(pickGeneral); html: true
$card.find('.obj_tooltip').tooltip({ });
title:function(){ });
return $.trim($(this).find('.tooltiptext').html());
}, updatePickMoreTimer();
html:true updateOutdateTimer();
}); }
});
function printGeneralList(value) {
updatePickMoreTimer(); var tokenList = value.token;
updateOutdateTimer(); var generalList = $.map(value.list, function(general) {
} general = {
no: general[0],
function printGeneralList(value){ picture: general[1],
var tokenList = value.token; imgsvr: general[2],
var generalList = $.map(value.list, function(general){ npc: general[3],
general = { age: general[4],
no:general[0], nation: general[5],
picture:general[1], special: general[6],
imgsvr:general[2], special2: general[7],
npc:general[3], personal: general[8],
age:general[4], name: general[9],
nation:general[5], ownerName: general[10],
special:general[6], injury: general[11],
special2:general[7], leadership: general[12],
personal:general[8], lbonus: general[13],
name:general[9], strength: general[14],
ownerName:general[10], intel: general[15],
injury:general[11], explevel: general[16],
leadership:general[12], experience: general[17],
lbonus:general[13], dedication: general[18],
strength:general[14], officerLevel: general[19],
intel:general[15], killturn: general[20],
explevel:general[16], connect: general[21],
experience:general[17], reserved: 0
dedication:general[18], };
officerLevel:general[19], if (general.npc < 2) {
killturn:general[20], general.reserved = 2;
connect:general[21], }
reserved:0 if (general.no in tokenList) {
}; general.reserved = 1;
if(general.npc < 2){ }
general.reserved = 2;
} general.userCSS = "";
if(general.no in tokenList){ general.nameAux = "";
general.reserved = 1;
} if (general.reserved == 1) {
general.userCSS = 'color:violet';
general.userCSS = ""; } else if (general.npc >= 2) {
general.nameAux = ""; general.userCSS = 'color:cyan';
} else if (general.npc == 1) {
if(general.reserved == 1){ general.userCSS = 'color:skyblue';
general.userCSS = 'color:violet'; }
}
else if(general.npc >= 2){ if (general.ownerName) {
general.userCSS = 'color:cyan'; general.nameAux += '<br><small>({0})</small>'.format(general.ownerName);
} }
else if(general.npc == 1){
general.userCSS = 'color:skyblue'; if (general.reserved == 1) {
} general.nameAux += '<br><small>({0}회)</small>'.format(tokenList[general.no]);
}
if(general.ownerName){
general.nameAux += '<br><small>({0})</small>'.format(general.ownerName);
} general.total = general.leadership + general.strength + general.intel;
general.iconPath = getIconPath(general.imgsvr, general.picture);
if(general.reserved == 1){
general.nameAux += '<br><small>({0}회)</small>'.format(tokenList[general.no]); general.specialDomesticWithTooltip = TemplateEngine(templateSpecial, {
} text: general.special,
info: specialInfo[general.special]
});
general.total = general.leadership + general.strength + general.intel;
general.iconPath = getIconPath(general.imgsvr, general.picture); general.speicalWarWithTooltip = TemplateEngine(templateSpecial, {
text: general.special2,
general.specialDomesticWithTooltip = TemplateEngine(templateSpecial, { info: specialInfo[general.special2]
text:general.special, });
info:specialInfo[general.special]
}); general.personalWithTooltip = TemplateEngine(templateSpecial, {
text: general.personal,
general.speicalWarWithTooltip = TemplateEngine(templateSpecial, { info: characterInfo[general.personal]
text:general.special2, });
info:specialInfo[general.special2]
}); return general;
});
general.personalWithTooltip = TemplateEngine(templateSpecial, {
text:general.personal, generalList.sort(function(lhs, rhs) {
info:characterInfo[general.personal] if (lhs.reserved > rhs.reserved) {
}); return -1;
}
return general; if (lhs.reserved < rhs.reserved) {
}); return 1;
}
generalList.sort(function(lhs, rhs){ if (lhs.total != rhs.total) {
if(lhs.reserved > rhs.reserved){ return rhs.total - lhs.total;
return -1; }
} if (lhs.leadership != rhs.leadership) {
if(lhs.reserved < rhs.reserved){ return rhs.leadership - lhs.total;
return 1; }
}
if(lhs.total != rhs.total){ if (lhs.name < rhs.name) {
return rhs.total - lhs.total; return -1;
} }
if(lhs.leadership != rhs.leadership){ if (lhs.name > rhs.name) {
return rhs.leadership - lhs.total; return 1;
} }
return 0;
if(lhs.name < rhs.name){ });
return -1;
} window.generalList = generalList;
if(lhs.name > rhs.name){ _printGeneralList(true);
return 1; }
}
return 0; function _printGeneralList(clear) {
}); var $generalTable = $('#general_list');
if (clear) {
window.generalList = generalList; $generalTable.empty();
_printGeneralList(true); $generalTable.data('lastIdx', 0);
} $('#row_print_more').show();
}
function _printGeneralList(clear){
var $generalTable = $('#general_list'); generalList = window.generalList;
if(clear){
$generalTable.empty(); var idxFrom = $generalTable.data('lastIdx');
$generalTable.data('lastIdx', 0); var idxTo = Math.min(idxFrom + 50, generalList.length);
$('#row_print_more').show(); $generalTable.data('lastIdx', idxTo);
}
for (var idx = idxFrom; idx < idxFrom + 50; idx++) {
generalList = window.generalList; var general = generalList[idx];
$generalTable.append(TemplateEngine(templateGeneralRow, general));
var idxFrom = $generalTable.data('lastIdx'); }
var idxTo = Math.min(idxFrom + 50, generalList.length);
$generalTable.data('lastIdx', idxTo); if (idxTo == generalList.length) {
$('#row_print_more').hide();
for(var idx = idxFrom; idx < idxFrom + 50; idx++){ }
var general = generalList[idx];
$generalTable.append(TemplateEngine(templateGeneralRow, general)); $generalTable.find('.obj_tooltip').tooltip({
} title: function() {
return $.trim($(this).find('.tooltiptext').html());
if(idxTo == generalList.length){ },
$('#row_print_more').hide(); html: true
} });
$('#tb_general_list').show();
$generalTable.find('.obj_tooltip').tooltip({ }
title:function(){
return $.trim($(this).find('.tooltiptext').html()); $(function($) {
}, window.generalList = [];
html:true
}); $.post('j_get_select_npc_token.php').then(function(value) {
$('#tb_general_list').show(); if (!value.result) {
} alert(value.reason);
return;
$(function($){ }
window.generalList = [];
console.log(value);
$.post('j_get_select_npc_token.php').then(function(value){ printGenerals(value);
if(!value.result){ });
alert(value.reason);
return; $('#btn_pick_more').click(function() {
} var generals = $.map($('.keep_select:checked'), function(value) {
return $(value).val();
console.log(value); });
printGenerals(value); console.log(generals);
}); $.post({
url: 'j_get_select_npc_token.php',
$('#btn_pick_more').click(function(){ dataType: 'json',
var generals = $.map($('.keep_select:checked'), function(value){ data: {
return $(value).val(); refresh: true,
}); keep: generals
console.log(generals); }
$.post({ }).then(function(result) {
url:'j_get_select_npc_token.php', if (!result.result) {
dataType:'json', alert(result.reason);
data:{ location.refresh();
refresh:true, }
keep:generals console.log(result);
} printGenerals(result);
}).then(function(result){ });
if(!result.result){ });
alert(result.reason);
location.refresh(); $('#btn_load_general_list').click(function() {
} $.post({
console.log(result); url: 'j_get_general_list.php',
printGenerals(result); dataType: 'json',
}); data: {
}); with_token: true
}
$('#btn_load_general_list').click(function(){ }).then(function(result) {
$.post({ if (!result.result) {
url:'j_get_general_list.php', alert(result.reason);
dataType:'json', return false;
data:{ }
with_token:true printGeneralList(result);
} });
}).then(function(result){ });
if(!result.result){
alert(result.reason); $('#btn_print_more').click(function() {
return false; _printGeneralList();
} })
printGeneralList(result);
});
});
$('#btn_print_more').click(function(){
_printGeneralList();
})
}); });