diff --git a/css/config.css b/css/config.css index 34b9b848..53b22574 100644 --- a/css/config.css +++ b/css/config.css @@ -3,6 +3,7 @@ body { color:white; background-color:black; font-family: '맑은 고딕'; } + table { border: solid 1px; border-spacing: 0px; border-collapse: separate; border-top-color: gray; border-left-color: gray; border-right-color: black; border-bottom-color: black; padding: 0px; @@ -25,6 +26,7 @@ a.just_link { } .with_border{ + margin:0; border: solid 1px; border-spacing: 0px; border-collapse: separate; diff --git a/hwe/css/select_npc.css b/hwe/css/select_npc.css new file mode 100644 index 00000000..d86b3365 --- /dev/null +++ b/hwe/css/select_npc.css @@ -0,0 +1,26 @@ +.card_holder{ + text-align:center; +} +.general_card{ + width:100px; + display:inline-block; +} + + +.general_card label { + display: block; + padding-left: 15px; + text-indent: -15px; + } + +.general_card input { + width: 13px; + height: 13px; + padding: 0; + margin:0; + vertical-align: bottom; + position: relative; + top: -1px; + *overflow: hidden; + } + \ No newline at end of file diff --git a/hwe/j_get_select_npc_token.php b/hwe/j_get_select_npc_token.php new file mode 100644 index 00000000..e924cb8f --- /dev/null +++ b/hwe/j_get_select_npc_token.php @@ -0,0 +1,172 @@ +setReadOnly(); +$userID = Session::getUserID(); + + +$oNow = new \DateTimeImmutable(); + +$now = $oNow->format('Y-m-d H:i:s'); + +$db = DB::db(); + +$oldGeneral = $db->queryFirstField('SELECT `no` FROM general WHERE `owner`=%i', $userID); +if($oldGeneral !== null){ + Json::die([ + 'result'=>false, + 'reason'=>'이미 장수가 생성되었습니다' + ]); +} + +list( + $year, + $month, + $maxgeneral, + $turnterm, + $genius, + $npcmode +) = $db->queryFirstList('SELECT year,month,maxgeneral,turnterm,genius,npcmode from game limit 1'); + +if(!$npcmode){ + Json::die([ + 'result'=>false, + 'reason'=>'빙의 가능한 서버가 아닙니다' + ]); +} + + +$token = $db->queryFirstRow('SELECT * FROM select_npc_token WHERE `owner`=%i AND `valid_until`>=%s', $userID, $now); +$pickResult = []; + + +if($token && $refresh){ + $pickMoreFrom = (new \DateTime($token['pick_more_from']))->getTimestamp(); + $nowT = $oNow->getTimestamp(); + + if($nowT >= $pickMoreFrom){ + $oldPickResult = Json::decode($token['pick_result']); + + foreach($keepResult as $keepId){ + if(\key_exists($keepId, $oldPickResult) && $oldPickResult[$keepId]['keepCnt'] > 0){ + $pickResult[$keepId] = $oldPickResult[$keepId]; + $pickResult[$keepId]['keepCnt']-=1; + } + } + + if(count($pickResult) == count($oldPickResult)){ + $refresh = false; + } + } + else{ + Json::die([ + 'result'=>false, + 'reason'=>'아직 다시 뽑을 수 없습니다', + ]); + } +} + +if($token && !$refresh){ + Json::die([ + 'result'=>true, + 'pick'=>Json::decode($token['pick_result']), + 'pickMoreFrom'=>$token['pick_more_from'], + 'validUntil'=>$token['valid_until'] + ]); +} + +$candidates = []; + +$weight = []; +foreach($db->query('SELECT `no`, `name`, leader, power, 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]??'-'; + $candidates[$general['no']] = $general + ['keepCnt'=>KEEP_CNT]; + $allStat = $general['leader'] + $general['power'] + $general['intel']; + $weight[$general['no']] = pow($allStat, 1.7); +} + +foreach($db->queryFirstColumn('SELECT pick_result FROM select_npc_token WHERE `owner`!=%i AND valid_until >=%s', $userID, $now) as $reserved){ + $reserved = Json::decode($reserved); + foreach(array_keys($reserved) as $reservedNPC){ + if(key_exists($reservedNPC, $weight)){ + unset($candidates[$reservedNPC]); + unset($weight[$reservedNPC]); + } + } +} + +$pickLimit = min(count($candidates), 5); + +while(count($pickResult) < $pickLimit){ + $generalID = Util::choiceRandomUsingWeight($weight); + if(!key_exists($generalID, $pickResult)){ + $pickResult[$generalID] = $candidates[$generalID]; + } +} + +$newNonce = mt_rand(0, 0xfffffff); + +$validMinute = max(VALID_MINUTE, intdiv($turnterm, 2)); +$pickMoreMinute = max(PICK_MORE_MINUTE, intdiv($turnterm, 5)); + +$validUntil = $oNow->add(new \DateInterval(sprintf('PT%dM', $validMinute))); +$pickMoreFrom = $oNow->add(new \DateInterval(sprintf('PT%dM', $pickMoreMinute))); + +$db->query('LOCK TABLES select_npc_token WRITE'); + +$db->delete('select_npc_token', 'valid_until < %s', $now); + +$inserted = 0; + +if($token){ + $db->update('select_npc_token', [ + 'valid_until'=>$validUntil->format('Y-m-d H:i:s'), + 'pick_more_from'=>$pickMoreFrom->format('Y-m-d H:i:s'), + 'pick_result'=>Json::encode($pickResult), + 'nonce'=>$newNonce + ], 'owner = %i AND nonce = %i', $userID, $token['nonce']); + if($db->affectedRows()){ + $inserted = -1; + } +} +else{ + $db->insertIgnore('select_npc_token', [ + 'owner'=>$userID, + 'valid_until'=>$validUntil->format('Y-m-d H:i:s'), + 'pick_more_from'=>'2000-01-01 01:00:00', + 'pick_result'=>Json::encode($pickResult), + 'nonce'=>$newNonce + ]); + + if($db->affectedRows()){ + $inserted = 1; + } +} + +$db->query('UNLOCK TABLES'); + +if($inserted === 0){ + Json::die([ + 'result'=>false, + 'reason'=>'중복 요청, 다시 랜덤 토큰을 확인해주세요' + ]); +} + +Json::die([ + 'result'=>true, + 'pick'=>$pickResult, + 'pickMoreFrom'=>($inserted===-1)?$pickMoreFrom->format('Y-m-d H:i:s'):'2000-01-01 01:00:00', + 'validUntil'=>$validUntil->format('Y-m-d H:i:s') +]); \ No newline at end of file diff --git a/hwe/js/select_npc.js b/hwe/js/select_npc.js new file mode 100644 index 00000000..8229d686 --- /dev/null +++ b/hwe/js/select_npc.js @@ -0,0 +1,76 @@ +var templateGeneralCard = +'
<%leader%> / <%power%> / <%intel%>
\
+ <%special%> / <%special2%>
| =info(0)?> |
| 임관 권유 메세지 | |
|---|---|
| =$name?> | +=$scoutmsg?:'-'?> | +