diff --git a/hwe/c_tournament.php b/hwe/c_tournament.php index 7d40c74f..dcd79538 100644 --- a/hwe/c_tournament.php +++ b/hwe/c_tournament.php @@ -36,15 +36,15 @@ if($btn == '참가') { if($db->queryFirstField('SELECT `no` FROM tournament WHERE `no`=%i', $me['no'])){ header('location:b_tournament.php'); - exit(1); + exit(1); } $general = $db->queryFirstRow('SELECT no,name,npc,leadership,strength,intel,explevel,gold,horse,weapon,book FROM general WHERE `no`=%i', $me['no']); //{$admin['develcost']}원 참가비 - if($general['gold'] < $admin['develcost']) { + if($general['gold'] < $admin['develcost']) { header('location:b_tournament.php'); - exit(1); + exit(1); } $general['gold'] -= $admin['develcost']; @@ -66,7 +66,7 @@ if($btn == '참가') { } $fullGrpCnt = 8 - count($freeSlot); - + if($freeSlot) { $grp = Util::choiceRandom(array_keys($freeSlot)); $grpMemberCount = $db->queryFirstField('SELECT count(*) FROM tournament WHERE grp=%i', $grp); @@ -96,12 +96,12 @@ if($btn == '참가') { $gameStor->phase = 0; } header('location:b_tournament.php'); - die(); + die(); } -if($session->userGrade < 5) { +if($session->userGrade < 5) { header('location:b_tournament.php'); - exit(); + exit(); } if($btn == "자동개최설정") { @@ -157,10 +157,10 @@ if($btn == "자동개최설정") { } elseif($btn == "랜덤전부투입") { $grpIn = []; - + foreach($db->queryAllLists('SELECT grp, count(*) FROM tournament WHERE 0 <= grp AND grp < 8 GROUP BY grp') as [$grpIdx, $cnt]){ $grpIn[$grpIdx] = $cnt; - + } $code = []; foreach(Util::range(8) as $grpIdx){ @@ -201,38 +201,38 @@ if($btn == "자동개최설정") { $gameStor->tournament = 2; $gameStor->phase = 0; -} elseif($btn == "무명전부투입") { - fillLowGenAll(); -} elseif($btn == "예선") { +} elseif($btn == "무명전부투입") { + fillLowGenAll($admin['tnmt_type']); +} elseif($btn == "예선") { qualify($admin['tnmt_type'], $admin['tournament'], $admin['phase']); -} elseif($btn == "예선전부") { +} elseif($btn == "예선전부") { qualifyAll($admin['tnmt_type'], $admin['tournament'], $admin['phase']); -} elseif($btn == "추첨") { +} elseif($btn == "추첨") { selection($admin['tnmt_type'], $admin['tournament'], $admin['phase']); -} elseif($btn == "추첨전부") { +} elseif($btn == "추첨전부") { selectionAll($admin['tnmt_type'], $admin['tournament'], $admin['phase']); -} elseif($btn == "본선") { +} elseif($btn == "본선") { finallySingle($admin['tnmt_type'], $admin['tournament'], $admin['phase']); -} elseif($btn == "본선전부") { +} elseif($btn == "본선전부") { finallyAll($admin['tnmt_type'], $admin['tournament'], $admin['phase']); -} elseif($btn == "배정") { +} elseif($btn == "배정") { final16set(); } elseif($btn == "베팅마감") { $dt = date("Y-m-d H:i:s", time() + 60); $gameStor->tournament=7; $gameStor->phase=0; $gameStor->tnmt_time = $dt; -} elseif($btn == "16강") { +} elseif($btn == "16강") { finalFight($admin['tnmt_type'], $admin['tournament'], $admin['phase'], 16); -} elseif($btn == "8강") { +} elseif($btn == "8강") { finalFight($admin['tnmt_type'], $admin['tournament'], $admin['phase'], 8); -} elseif($btn == "4강") { +} elseif($btn == "4강") { finalFight($admin['tnmt_type'], $admin['tournament'], $admin['phase'], 4); -} elseif($btn == "결승") { +} elseif($btn == "결승") { finalFight($admin['tnmt_type'], $admin['tournament'], $admin['phase'], 2); -} elseif($btn == "포상") { +} elseif($btn == "포상") { setGift($admin['tnmt_type'], $admin['tournament'], $admin['phase']); -} elseif($btn == "회수") { +} elseif($btn == "회수") { setRefund(); } elseif($btn == "메시지") { $gameStor->tnmt_msg = $msg; diff --git a/hwe/func_tournament.php b/hwe/func_tournament.php index 32988b49..55111250 100644 --- a/hwe/func_tournament.php +++ b/hwe/func_tournament.php @@ -58,7 +58,7 @@ function processTournament() for ($i = 0; $i < $iter; $i++) { switch ($tnmt) { case 1: //신청 마감 - fillLowGenAll(); + fillLowGenAll($type); $tnmt = 2; $phase = 0; break; @@ -452,7 +452,7 @@ function startBetting() } } -function fillLowGenAll() +function fillLowGenAll($tnmt_type) { $db = DB::db(); $gameStor = KVStorage::getStorage($db, 'game_env'); @@ -466,17 +466,7 @@ function fillLowGenAll() 'leadership' => 10, 'strength' => 10, 'intel' => 10, - 'explevel' => 10 - ]; - - $dummyGeneral = [ - 'no' => 0, - 'npc' => 2, - 'name' => '무명장수', - 'leadership' => 10, - 'strength' => 10, - 'intel' => 10, - 'lvl' => 0, + 'lvl' => 10, 'h' => 'None', 'w' => 'None', 'b' => 'None' @@ -500,16 +490,43 @@ function fillLowGenAll() $toBeFilledCnt = 8 * 8 - $currentJoinerCnt; + $scoringCandFunction = match ($tnmt_type) { + 0 => function ($gen) { + return $gen['leadership'] + $gen['strength'] + $gen['intel']; + }, //전력전 + 1 => function ($gen) { + return $gen['leadership']; + }, //통솔전 + 2 => function ($gen) { + return $gen['strength']; + }, //통솔전 + 3 => function ($gen) { + return $gen['intel']; + }, //통솔전 + default => throw new \ValueError('invalid tnmt_type' . $tnmt_type) + }; + //자동신청하고, 돈 있고, 아직 참가 안한 장수 - $freeJoiners = $db->query( - 'SELECT no,npc,name,leadership,strength,intel,explevel,horse,weapon,book from general where tnmt=1 and tournament=0 order by rand() limit %d', - $toBeFilledCnt - ); + $freeJoinerCandidate = []; + + foreach($db->query( + 'SELECT no,npc,name,leadership,strength,intel,explevel,horse,weapon,book from general where tnmt=1 and tournament=0', + ) as $gen){ + $score = $scoringCandFunction($gen); + $freeJoinerCandidate[$gen['no']] = [$gen, $score**2]; + } + $joinersValues = []; $joinersIdx = []; - foreach ($freeJoiners as $general) { + foreach(Util::range($toBeFilledCnt) as $_){ + if(!$freeJoinerCandidate){ + break; + } + $general = Util::choiceRandomUsingWeightPair($freeJoinerCandidate); + unset($freeJoinerCandidate[$general['no']]); + $grpIdx = array_keys($grpCount, min($grpCount))[0]; $grpCnt = $grpCount[$grpIdx]; $joinersValues[] = [