game: 토너먼터 자동 참가 시, 능력치에 기반

This commit is contained in:
2021-12-16 01:05:59 +09:00
parent 786306e32a
commit 8da0e685c8
2 changed files with 59 additions and 42 deletions
+24 -24
View File
@@ -36,15 +36,15 @@ if($btn == '참가') {
if($db->queryFirstField('SELECT `no` FROM tournament WHERE `no`=%i', $me['no'])){ if($db->queryFirstField('SELECT `no` FROM tournament WHERE `no`=%i', $me['no'])){
header('location:b_tournament.php'); 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']); $general = $db->queryFirstRow('SELECT no,name,npc,leadership,strength,intel,explevel,gold,horse,weapon,book FROM general WHERE `no`=%i', $me['no']);
//{$admin['develcost']}원 참가비 //{$admin['develcost']}원 참가비
if($general['gold'] < $admin['develcost']) { if($general['gold'] < $admin['develcost']) {
header('location:b_tournament.php'); header('location:b_tournament.php');
exit(1); exit(1);
} }
$general['gold'] -= $admin['develcost']; $general['gold'] -= $admin['develcost'];
@@ -66,7 +66,7 @@ if($btn == '참가') {
} }
$fullGrpCnt = 8 - count($freeSlot); $fullGrpCnt = 8 - count($freeSlot);
if($freeSlot) { if($freeSlot) {
$grp = Util::choiceRandom(array_keys($freeSlot)); $grp = Util::choiceRandom(array_keys($freeSlot));
$grpMemberCount = $db->queryFirstField('SELECT count(*) FROM tournament WHERE grp=%i', $grp); $grpMemberCount = $db->queryFirstField('SELECT count(*) FROM tournament WHERE grp=%i', $grp);
@@ -96,12 +96,12 @@ if($btn == '참가') {
$gameStor->phase = 0; $gameStor->phase = 0;
} }
header('location:b_tournament.php'); header('location:b_tournament.php');
die(); die();
} }
if($session->userGrade < 5) { if($session->userGrade < 5) {
header('location:b_tournament.php'); header('location:b_tournament.php');
exit(); exit();
} }
if($btn == "자동개최설정") { if($btn == "자동개최설정") {
@@ -157,10 +157,10 @@ if($btn == "자동개최설정") {
} elseif($btn == "랜덤전부투입") { } elseif($btn == "랜덤전부투입") {
$grpIn = []; $grpIn = [];
foreach($db->queryAllLists('SELECT grp, count(*) FROM tournament WHERE 0 <= grp AND grp < 8 GROUP BY grp') as [$grpIdx, $cnt]){ foreach($db->queryAllLists('SELECT grp, count(*) FROM tournament WHERE 0 <= grp AND grp < 8 GROUP BY grp') as [$grpIdx, $cnt]){
$grpIn[$grpIdx] = $cnt; $grpIn[$grpIdx] = $cnt;
} }
$code = []; $code = [];
foreach(Util::range(8) as $grpIdx){ foreach(Util::range(8) as $grpIdx){
@@ -201,38 +201,38 @@ if($btn == "자동개최설정") {
$gameStor->tournament = 2; $gameStor->tournament = 2;
$gameStor->phase = 0; $gameStor->phase = 0;
} elseif($btn == "무명전부투입") { } elseif($btn == "무명전부투입") {
fillLowGenAll(); fillLowGenAll($admin['tnmt_type']);
} elseif($btn == "예선") { } elseif($btn == "예선") {
qualify($admin['tnmt_type'], $admin['tournament'], $admin['phase']); qualify($admin['tnmt_type'], $admin['tournament'], $admin['phase']);
} elseif($btn == "예선전부") { } elseif($btn == "예선전부") {
qualifyAll($admin['tnmt_type'], $admin['tournament'], $admin['phase']); qualifyAll($admin['tnmt_type'], $admin['tournament'], $admin['phase']);
} elseif($btn == "추첨") { } elseif($btn == "추첨") {
selection($admin['tnmt_type'], $admin['tournament'], $admin['phase']); selection($admin['tnmt_type'], $admin['tournament'], $admin['phase']);
} elseif($btn == "추첨전부") { } elseif($btn == "추첨전부") {
selectionAll($admin['tnmt_type'], $admin['tournament'], $admin['phase']); selectionAll($admin['tnmt_type'], $admin['tournament'], $admin['phase']);
} elseif($btn == "본선") { } elseif($btn == "본선") {
finallySingle($admin['tnmt_type'], $admin['tournament'], $admin['phase']); finallySingle($admin['tnmt_type'], $admin['tournament'], $admin['phase']);
} elseif($btn == "본선전부") { } elseif($btn == "본선전부") {
finallyAll($admin['tnmt_type'], $admin['tournament'], $admin['phase']); finallyAll($admin['tnmt_type'], $admin['tournament'], $admin['phase']);
} elseif($btn == "배정") { } elseif($btn == "배정") {
final16set(); final16set();
} elseif($btn == "베팅마감") { } elseif($btn == "베팅마감") {
$dt = date("Y-m-d H:i:s", time() + 60); $dt = date("Y-m-d H:i:s", time() + 60);
$gameStor->tournament=7; $gameStor->tournament=7;
$gameStor->phase=0; $gameStor->phase=0;
$gameStor->tnmt_time = $dt; $gameStor->tnmt_time = $dt;
} elseif($btn == "16강") { } elseif($btn == "16강") {
finalFight($admin['tnmt_type'], $admin['tournament'], $admin['phase'], 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); finalFight($admin['tnmt_type'], $admin['tournament'], $admin['phase'], 8);
} elseif($btn == "4강") { } elseif($btn == "4강") {
finalFight($admin['tnmt_type'], $admin['tournament'], $admin['phase'], 4); finalFight($admin['tnmt_type'], $admin['tournament'], $admin['phase'], 4);
} elseif($btn == "결승") { } elseif($btn == "결승") {
finalFight($admin['tnmt_type'], $admin['tournament'], $admin['phase'], 2); finalFight($admin['tnmt_type'], $admin['tournament'], $admin['phase'], 2);
} elseif($btn == "포상") { } elseif($btn == "포상") {
setGift($admin['tnmt_type'], $admin['tournament'], $admin['phase']); setGift($admin['tnmt_type'], $admin['tournament'], $admin['phase']);
} elseif($btn == "회수") { } elseif($btn == "회수") {
setRefund(); setRefund();
} elseif($btn == "메시지") { } elseif($btn == "메시지") {
$gameStor->tnmt_msg = $msg; $gameStor->tnmt_msg = $msg;
+35 -18
View File
@@ -58,7 +58,7 @@ function processTournament()
for ($i = 0; $i < $iter; $i++) { for ($i = 0; $i < $iter; $i++) {
switch ($tnmt) { switch ($tnmt) {
case 1: //신청 마감 case 1: //신청 마감
fillLowGenAll(); fillLowGenAll($type);
$tnmt = 2; $tnmt = 2;
$phase = 0; $phase = 0;
break; break;
@@ -452,7 +452,7 @@ function startBetting()
} }
} }
function fillLowGenAll() function fillLowGenAll($tnmt_type)
{ {
$db = DB::db(); $db = DB::db();
$gameStor = KVStorage::getStorage($db, 'game_env'); $gameStor = KVStorage::getStorage($db, 'game_env');
@@ -466,17 +466,7 @@ function fillLowGenAll()
'leadership' => 10, 'leadership' => 10,
'strength' => 10, 'strength' => 10,
'intel' => 10, 'intel' => 10,
'explevel' => 10 'lvl' => 10,
];
$dummyGeneral = [
'no' => 0,
'npc' => 2,
'name' => '무명장수',
'leadership' => 10,
'strength' => 10,
'intel' => 10,
'lvl' => 0,
'h' => 'None', 'h' => 'None',
'w' => 'None', 'w' => 'None',
'b' => 'None' 'b' => 'None'
@@ -500,16 +490,43 @@ function fillLowGenAll()
$toBeFilledCnt = 8 * 8 - $currentJoinerCnt; $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( $freeJoinerCandidate = [];
'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 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 = []; $joinersValues = [];
$joinersIdx = []; $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]; $grpIdx = array_keys($grpCount, min($grpCount))[0];
$grpCnt = $grpCount[$grpIdx]; $grpCnt = $grpCount[$grpIdx];
$joinersValues[] = [ $joinersValues[] = [