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빙의 - + @@ -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); +?> +; @@ -63,7 +72,7 @@ echo Json::encode($specialAll); = $maxgeneral) { +if ($gencount>= $maxgeneral) { ?> @@ -93,9 +102,38 @@ history.go(-1);
-
-
+
+
+ + + + + + + + + + + + + +
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%>\ \ \