diff --git a/hwe/func_converter.php b/hwe/func_converter.php
index 9a7a29eb..3d93bc19 100644
--- a/hwe/func_converter.php
+++ b/hwe/func_converter.php
@@ -174,13 +174,10 @@ function getGenSpecial($type) {
return $call;
}
-function getSpecialInfo(?int $type):?string{
- if($type === null){
- return null;
- }
-
+function getSpecialTextList():array{
+
//앞칸은 '설명을 위해' '그냥' 적어둠
- $infoText = [
+ return [
0 => ['-', null],
1 => ['경작', '[내정] 농지 개간 : 기본 보정 +10%, 성공률 +10%p, 비용 -20%'],
2 => ['상재', '[내정] 상업 투자 : 기본 보정 +10%, 성공률 +10%p, 비용 -20%'],
@@ -219,6 +216,14 @@ function getSpecialInfo(?int $type):?string{
74 => ['격노', '[전투] 상대방 필살 및 회피 시도시 일정 확률로 격노(필살) 발동, 공격 시 일정 확률로 진노(1페이즈 추가)'],
75 => ['척사', '[전투] 지역·도시 병종 상대로 대미지 +10%, 아군 피해 -10%']
];
+}
+
+function getSpecialInfo(?int $type):?string{
+ if($type === null){
+ return null;
+ }
+
+ $infoText = getSpecialTextList();
return $infoText[$type][1]??null;
}
diff --git a/hwe/func_process.php b/hwe/func_process.php
index 8f773efd..58082070 100644
--- a/hwe/func_process.php
+++ b/hwe/func_process.php
@@ -159,6 +159,17 @@ function CriticalRatioDomestic(&$general, $type) {
);
}
+function calcLeadershipBonus($generalLevel, $nationLevel):int{
+ if($generalLevel == 12) {
+ $lbonus = $nationLevel * 2;
+ } elseif($generalLevel >= 5) {
+ $lbonus = $nationLevel;
+ } else {
+ $lbonus = 0;
+ }
+ return $lbonus;
+}
+
/**
* 수뇌직 통솔 보너스 계산
*
@@ -168,13 +179,7 @@ function CriticalRatioDomestic(&$general, $type) {
* @return int 계산된 $general['lbonus'] 값
*/
function setLeadershipBonus(&$general, $nationLevel){
- if($general['level'] == 12) {
- $lbonus = $nationLevel * 2;
- } elseif($general['level'] >= 5) {
- $lbonus = $nationLevel;
- } else {
- $lbonus = 0;
- }
+ $lbonus = calcLeadershipBonus($general['level'], $nationLevel);
$general['lbonus'] = $lbonus;
return $lbonus;
}
diff --git a/hwe/j_get_general_list.php b/hwe/j_get_general_list.php
new file mode 100644
index 00000000..218692e2
--- /dev/null
+++ b/hwe/j_get_general_list.php
@@ -0,0 +1,109 @@
+isGameLoggedIn()){
+ increaseRefresh("장수일람", 2);
+
+ $me = $db->queryFirstRow('SELECT con, turntime FROM general WHERE owner=%i', $userID);
+ $con = checkLimit($me['con']);
+ if ($con >= 2) {
+ Json::die([
+ 'result'=>false,
+ 'reason'=>'접속 제한중입니다. 1턴 이내에 너무 많은 갱신을 하셨습니다.'
+ ]);
+ }
+}
+else{
+ $availableNextCall = $session->availableNextCallGetGeneralList??'2000-01-01 00:00:00';
+ $now = new \DateTimeImmutable();
+
+ if($now <= new \DateTimeImmutable($availableNextCall) && $session->userGrade < 5){
+ Json::die([
+ 'result'=>false,
+ 'reason'=>"장수 리스트는 10초에 한번 갱신 가능합니다.\n다음 시간 : ".$availableNextCall
+ ]);
+ }
+
+ $availableNextCall = $now->add(new \DateInterval('PT10S'))->format('Y-m-d H:i:s');
+ $session->availableNextCallGetGeneralList = $availableNextCall;
+}
+
+$session->setReadOnly();
+
+$rawGeneralList = $db->queryAllLists('SELECT owner,no,picture,imgsvr,npc,age,nation,special,special2,personal,name,name2,injury,leader,power,intel,experience,dedication,level,killturn,connect from general');
+
+$ownerNameList = [];
+if($gameStor->isunited){
+ foreach(RootDB::db()->queryAllLists('SELECT no, name FROM member') as [$ownerID, $ownerName]){
+ $ownerNameList[$ownerID] = $ownerName;
+ }
+}
+
+$generalList = [];
+foreach($rawGeneralList as $rawGeneral){
+ [$owner,$no,$picture,$imgsvr,$npc,$age,$nation,$special,$special2,$personal,$name,$name2,$injury,$leader,$power,$intel,$experience,$dedication,$level,$killturn,$connect] = $rawGeneral;
+
+ if(key_exists($owner, $ownerNameList)){
+ $name2 = $ownerNameList[$owner];
+ }
+
+ $nationArr = getNationStaticInfo($nation);
+ $lbonus = calcLeadershipBonus($level, $nationArr['level']);
+
+ $generalList[] = [
+ $no,
+ $picture,
+ $imgsvr,
+ $npc,
+ $age,
+ $nationArr['name'],
+ getGenSpecial($special),
+ getGenSpecial($special2),
+ getGenChar($personal),
+ $name,
+ $name2,
+ $injury,
+ $leader,
+ $lbonus,
+ $power,
+ $intel,
+ getExpLevel($experience),
+ getHonor($experience),
+ getDed($dedication),
+ getLevel($level, $nationArr['level']),
+ $killturn,
+ $connect
+ ];
+}
+
+$result = [
+ 'result'=>'true',
+ 'list'=>$generalList,
+];
+
+if($withToken){
+ $now = (new \DateTimeImmutable())->format('Y-m-d H:i:s');
+ $tokens = [];
+ foreach($db->query('SELECT * FROM select_npc_token WHERE `valid_until`>=%s', $now) as $token){
+ $validUntil = $token['valid_until'];
+
+ foreach(Json::decode($token['pick_result']) as $pickResult){
+ $tokens[$pickResult['no']]=$pickResult['keepCnt'];
+ }
+ }
+ $result['token'] = $tokens;
+}
+
+Json::die($result);
diff --git a/hwe/j_get_select_npc_token.php b/hwe/j_get_select_npc_token.php
index 7944cf70..f83f973c 100644
--- a/hwe/j_get_select_npc_token.php
+++ b/hwe/j_get_select_npc_token.php
@@ -90,9 +90,11 @@ if($token && !$refresh){
$candidates = [];
$weight = [];
-foreach($db->query('SELECT `no`, `name`, leader, power, intel, imgsvr, picture, special, special2 FROM general WHERE npc=2') as $general){
+foreach($db->query('SELECT `no`, `name`, leader, power, nation, personal, intel, imgsvr, picture, special, special2 FROM general WHERE npc=2') as $general){
$general['special'] = \sammo\SpecialityConst::DOMESTIC[$general['special']][0]??'-';
$general['special2'] = \sammo\SpecialityConst::WAR[$general['special2']][0]??'-';
+ $general['personal'] = getGenChar($general['personal']);
+ $general['nation'] = getNationStaticInfo($general['nation'])['name'];
$candidates[$general['no']] = $general + ['keepCnt'=>KEEP_CNT];
$allStat = $general['leader'] + $general['power'] + $general['intel'];
$weight[$general['no']] = pow($allStat, 1.5);
diff --git a/hwe/js/select_npc.js b/hwe/js/select_npc.js
index 773e9bf8..b563a755 100644
--- a/hwe/js/select_npc.js
+++ b/hwe/js/select_npc.js
@@ -3,8 +3,10 @@ var templateGeneralCard =
<%name%>
\

\
<%leader%> / <%power%> / <%intel%>
\
+ <%nation%>
\
+ <%personalText%>
\
<%specialText%> / <%special2Text%>
\
- \
+ \
\
';
@@ -16,9 +18,32 @@ var templateSpecial =
\
';
+var templateGeneralRow =
+'\
+  | \
+ <%name%><%nameAux%> | \
+ <%age%>세 | \
+ <%personalWithTooltip%> | \
+ <%specialDomesticWithTooltip%> / <%speicalWarWithTooltip%> | \
+ Lv <%explevel%> | \
+ <%nation%> | \
+ <%experience%> | \
+ <%dedication%> | \
+ <%level%> | \
+ <%total%> | \
+ <%leader%> | \
+ <%power%> | \
+ <%intel%> | \
+ <%killturn%> | \
+
';
+
function pickGeneral(){
$btn = $(this);
+ if (!confirm('빙의할까요? : {0}'.format($btn.data('name')))) {
+ return false;
+ }
+
$.post({
url:'j_select_npc.php',
dataType:'json',
@@ -112,10 +137,19 @@ function printGenerals(value){
else{
cardData.special2Text = cardData.special2;
}
+
+ if(cardData.personal in characterInfo){
+ cardData.personalText = TemplateEngine(templateSpecial, {
+ text:cardData.personal,
+ info:characterInfo[cardData.personal]
+ });
+ }
+ else{
+ cardData.personalText = cardData.personal;
+ }
var $card = $(TemplateEngine(templateGeneralCard, cardData));
- console.log($card);
$('.card_holder').append($card);
$card.find('.select_btn').click(pickGeneral);
@@ -131,7 +165,145 @@ function printGenerals(value){
updateOutdateTimer();
}
+function printGeneralList(value){
+ var tokenList = value.token;
+ var generalList = $.map(value.list, function(general){
+ general = {
+ no:general[0],
+ picture:general[1],
+ imgsvr:general[2],
+ npc:general[3],
+ age:general[4],
+ nation:general[5],
+ special:general[6],
+ special2:general[7],
+ personal:general[8],
+ name:general[9],
+ name2:general[10],
+ injury:general[11],
+ leader:general[12],
+ lbonus:general[13],
+ power:general[14],
+ intel:general[15],
+ explevel:general[16],
+ experience:general[17],
+ dedication:general[18],
+ level:general[19],
+ killturn:general[20],
+ connect:general[21],
+ reserved:0
+ };
+ if(general.npc < 2){
+ general.reserved = 2;
+ }
+ if(general.no in tokenList){
+ general.reserved = 1;
+ }
+
+ general.userCSS = "";
+ general.nameAux = "";
+
+ if(general.reserved == 1){
+ general.userCSS = 'color:violet';
+ }
+ else if(general.npc >= 2){
+ general.userCSS = 'color:cyan';
+ }
+ else if(general.npc == 1){
+ general.userCSS = 'color:skyblue';
+ }
+
+ if(general.name2){
+ general.nameAux += '
({0})'.format(general.name2);
+ }
+
+ if(general.reserved == 1){
+ general.nameAux += '
({0}회)'.format(tokenList[general.no]);
+ }
+
+
+ general.total = general.leader + general.power + general.intel;
+ general.iconPath = getIconPath(general.imgsvr, general.picture);
+
+ general.specialDomesticWithTooltip = TemplateEngine(templateSpecial, {
+ text:general.special,
+ info:specialInfo[general.special]
+ });
+
+ general.speicalWarWithTooltip = TemplateEngine(templateSpecial, {
+ text:general.special2,
+ info:specialInfo[general.special2]
+ });
+
+ general.personalWithTooltip = TemplateEngine(templateSpecial, {
+ text:general.personal,
+ info:characterInfo[general.personal]
+ });
+
+ return general;
+ });
+
+ generalList.sort(function(lhs, rhs){
+ if(lhs.reserved > rhs.reserved){
+ return -1;
+ }
+ if(lhs.reserved < rhs.reserved){
+ return 1;
+ }
+ if(lhs.total != rhs.total){
+ return rhs.total - lhs.total;
+ }
+ if(lhs.leader != rhs.leader){
+ return rhs.leader - lhs.total;
+ }
+
+ if(lhs.name < rhs.name){
+ return -1;
+ }
+ if(lhs.name > rhs.name){
+ return 1;
+ }
+ return 0;
+ });
+
+ window.generalList = generalList;
+ _printGeneralList(true);
+}
+
+function _printGeneralList(clear){
+ var $generalTable = $('#general_list');
+ if(clear){
+ $generalTable.empty();
+ $generalTable.data('lastIdx', 0);
+ $('#row_print_more').show();
+ }
+
+ generalList = window.generalList;
+
+ var idxFrom = $generalTable.data('lastIdx');
+ var idxTo = Math.min(idxFrom + 50, generalList.length);
+ $generalTable.data('lastIdx', idxTo);
+
+ for(var idx = idxFrom; idx < idxFrom + 50; idx++){
+ var general = generalList[idx];
+ $generalTable.append(TemplateEngine(templateGeneralRow, general));
+ }
+
+ if(idxTo == generalList.length){
+ $('#row_print_more').hide();
+ }
+
+ $generalTable.find('.obj_tooltip').tooltip({
+ title:function(){
+ return $.trim($(this).find('.tooltiptext').html());
+ },
+ html:true
+ });
+ $('#tb_general_list').show();
+}
+
$(function($){
+window.generalList = [];
$.post('j_get_select_npc_token.php').then(function(value){
if(!value.result){
@@ -165,4 +337,24 @@ $('#btn_pick_more').click(function(){
});
});
+$('#btn_load_general_list').click(function(){
+ $.post({
+ url:'j_get_general_list.php',
+ dataType:'json',
+ data:{
+ with_token:true
+ }
+ }).then(function(result){
+ if(!result.result){
+ alert(result.reason);
+ return false;
+ }
+ printGeneralList(result);
+ });
+});
+
+$('#btn_print_more').click(function(){
+ _printGeneralList();
+})
+
});
\ No newline at end of file
diff --git a/hwe/select_npc.php b/hwe/select_npc.php
index 979bbf62..70bc418f 100644
--- a/hwe/select_npc.php
+++ b/hwe/select_npc.php
@@ -26,7 +26,7 @@ $nationList = $db->query('SELECT nation,`name`,color,scout,scoutmsg FROM nation
=UniqueConst::$serverName?>: NPC빙의
-
+
=WebUtil::printCSS('../e_lib/bootstrap.min.css')?>
=WebUtil::printCSS('../d_shared/common.css')?>
=WebUtil::printCSS('../css/config.css')?>
@@ -50,7 +50,16 @@ foreach (SpecialityConst::WAR as $id=>$values) {
$specialAll['-'] = '없음';
echo Json::encode($specialAll);
?>
-;
+;
+var characterInfo =
+[$name, $info]){
+ $characterAll[$name] = $info;
+}
+echo Json::encode($characterAll);
+?>
+;
=WebUtil::printJS('../d_shared/common_path.js')?>
@@ -63,7 +72,7 @@ echo Json::encode($specialAll);
= $maxgeneral) {
+if ($gencount>= $maxgeneral) {
?>
@@ -93,9 +102,38 @@ history.go(-1);
-
-
+
+
+
+
+
+
+ | 얼 굴
+ | 이 름
+ | 연령
+ | 성격
+ | 특기
+ | 레 벨
+ | 국 가
+ | 명 성
+ | 계 급
+ | 관 직
+ | 종능
+ | 통솔
+ | 무력
+ | 지력
+ | 삭턴
+ |
+
+
+
+
+
+ |
+
+
+
=backButton()?>
=banner()?>
diff --git a/js/entrance.js b/js/entrance.js
index 1a5b0191..ea9a87ba 100644
--- a/js/entrance.js
+++ b/js/entrance.js
@@ -36,7 +36,7 @@ var serverCreateTemplate = "\
";
var serverLoginTemplate = "\
- | \
+ | \
<%name%> | \
\
\
|