refac: 토너먼트 베팅 세부 로직을 ng_betting으로 이동 (#218)
- 토너먼트 베팅을 betting 테이블 대신 Betting 모듈을 이용하는 형태로 변경 - 이전 토너먼트 베팅 기록이 남음 - 현재 이전 토너먼트 기록을 볼 수는 없음 - 베팅에 API/Betting/Bet 을 이용 - 토너먼트, 베팅 페이지를 Betting 모듈에 맞게 임시 조정 - 이전 버전과의 호환성을 위해 betting table과 betting 테이블에 초기값을 추가하는 로직은 남김 - 이후 0.30이 되었을 때 제거 Reviewed-on: https://storage.hided.net/gitea/devsam/core/pulls/218
This commit was merged in pull request #218.
This commit is contained in:
@@ -84,7 +84,6 @@ return [
|
|||||||
'hwe/j_adjust_icon.php',
|
'hwe/j_adjust_icon.php',
|
||||||
'hwe/j_autoreset.php',
|
'hwe/j_autoreset.php',
|
||||||
'hwe/j_basic_info.php',
|
'hwe/j_basic_info.php',
|
||||||
'hwe/j_betting.php',
|
|
||||||
'hwe/j_board_article_add.php',
|
'hwe/j_board_article_add.php',
|
||||||
'hwe/j_board_comment_add.php',
|
'hwe/j_board_comment_add.php',
|
||||||
'hwe/j_board_get_articles.php',
|
'hwe/j_board_get_articles.php',
|
||||||
|
|||||||
+1
-1
@@ -14,7 +14,7 @@ $gameStor = KVStorage::getStorage($db, 'game_env');
|
|||||||
|
|
||||||
[$turntime, $tnmt_time] = $gameStor->getValuesAsArray(['turntime','tnmt_time']);
|
[$turntime, $tnmt_time] = $gameStor->getValuesAsArray(['turntime','tnmt_time']);
|
||||||
|
|
||||||
$plock = $db->queryFirstField('SELECT plock FROM plock');
|
$plock = $db->queryFirstField('SELECT plock FROM plock WHERE `type` ="GAME"');
|
||||||
?>
|
?>
|
||||||
<!DOCTYPE html>
|
<!DOCTYPE html>
|
||||||
<html>
|
<html>
|
||||||
|
|||||||
+92
-55
@@ -16,17 +16,11 @@ TurnExecutionHelper::executeAllCommand();
|
|||||||
|
|
||||||
$generalID = $session->generalID;
|
$generalID = $session->generalID;
|
||||||
|
|
||||||
//NOTE: general_id만 빼기 귀찮음.
|
|
||||||
$myBet = $db->queryFirstList('SELECT * FROM betting WHERE general_id = %i', $generalID);
|
|
||||||
$myBet = array_splice($myBet, -16);
|
|
||||||
$globalBet = $db->queryFirstList('SELECT * FROM betting WHERE general_id = 0');
|
|
||||||
$globalBet = array_splice($globalBet, -16);
|
|
||||||
|
|
||||||
$me = $db->queryFirstRow('SELECT no,tournament,con,turntime from general where owner=%i', $userID);
|
$me = $db->queryFirstRow('SELECT no,tournament,con,turntime from general where owner=%i', $userID);
|
||||||
|
|
||||||
$myBetTotal = array_sum($myBet);
|
|
||||||
$globalBetTotal = array_sum($globalBet);
|
|
||||||
|
|
||||||
$admin = $gameStor->getValues(['tournament', 'phase', 'tnmt_type', 'develcost']);
|
$admin = $gameStor->getValues(['tournament', 'phase', 'tnmt_type', 'develcost']);
|
||||||
|
|
||||||
$con = checkLimit($me['con']);
|
$con = checkLimit($me['con']);
|
||||||
@@ -36,34 +30,68 @@ if ($con >= 2) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
switch ($admin['tnmt_type']) {
|
switch ($admin['tnmt_type']) {
|
||||||
default:
|
|
||||||
throw new \RuntimeException('Invalid tnmt_type');
|
|
||||||
case convertTournamentType('전력전'):
|
case convertTournamentType('전력전'):
|
||||||
$tnmt_type = "<font color=cyan>전력전</font>";
|
$tnmt_type = "전력전";
|
||||||
|
$color = "cyan";
|
||||||
$tp = "total";
|
$tp = "total";
|
||||||
$tp2 = "종합";
|
$tp2 = "종합";
|
||||||
$tp3 = "total";
|
$tp3 = "total";
|
||||||
break;
|
break;
|
||||||
case convertTournamentType('통솔전'):
|
case convertTournamentType('통솔전'):
|
||||||
$tnmt_type = "<font color=cyan>통솔전</font>";
|
$tnmt_type = "통솔전";
|
||||||
|
$color = "cyan";
|
||||||
$tp = "leadership";
|
$tp = "leadership";
|
||||||
$tp2 = "통솔";
|
$tp2 = "통솔";
|
||||||
$tp3 = "leadership";
|
$tp3 = "leadership";
|
||||||
break;
|
break;
|
||||||
case convertTournamentType('일기토'):
|
case convertTournamentType('일기토'):
|
||||||
$tnmt_type = "<font color=cyan>일기토</font>";
|
$tnmt_type = "일기토";
|
||||||
|
$color = "cyan";
|
||||||
$tp = "strength";
|
$tp = "strength";
|
||||||
$tp2 = "무력";
|
$tp2 = "무력";
|
||||||
$tp3 = "strength";
|
$tp3 = "strength";
|
||||||
break;
|
break;
|
||||||
case convertTournamentType('설전'):
|
case convertTournamentType('설전'):
|
||||||
$tnmt_type = "<font color=cyan>설전</font>";
|
$tnmt_type = "설전";
|
||||||
|
$color = "cyan";
|
||||||
$tp = "intel";
|
$tp = "intel";
|
||||||
$tp2 = "지력";
|
$tp2 = "지력";
|
||||||
$tp3 = "intel";
|
$tp3 = "intel";
|
||||||
break;
|
break;
|
||||||
|
default:
|
||||||
|
throw new \RuntimeException('Invalid tnmt_type');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$bettingID = $gameStor->last_tournament_betting_id ?? 0;
|
||||||
|
$myBet = [];
|
||||||
|
$globalBet = [];
|
||||||
|
|
||||||
|
if ($bettingID != 0) {
|
||||||
|
$betting = $bettingID != 0 ? new Betting($bettingID) : null;
|
||||||
|
$info = $betting->getInfo();
|
||||||
|
|
||||||
|
foreach ($db->queryAllLists(
|
||||||
|
'SELECT general_id, user_id, amount, betting_type FROM ng_betting WHERE betting_id = %i',
|
||||||
|
$bettingID
|
||||||
|
) as [$betGeneralID, $userID, $amount, $bettingTypeKey]) {
|
||||||
|
$bettingKey = Json::decode($bettingTypeKey)[0];
|
||||||
|
if ($betGeneralID == $generalID) {
|
||||||
|
$myBet[$bettingKey] = $amount;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (key_exists($bettingKey, $globalBet)) {
|
||||||
|
$globalBet[$bettingKey] += $amount;
|
||||||
|
} else {
|
||||||
|
$globalBet[$bettingKey] = $amount;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
$info = getDummyBettingInfo($tnmt_type);
|
||||||
|
}
|
||||||
|
|
||||||
|
$myBetTotal = array_sum($myBet);
|
||||||
|
$globalBetTotal = array_sum($globalBet);
|
||||||
|
|
||||||
$str1 = getTournament($admin['tournament']);
|
$str1 = getTournament($admin['tournament']);
|
||||||
$str2 = getTournamentTime();
|
$str2 = getTournamentTime();
|
||||||
if ($str2) {
|
if ($str2) {
|
||||||
@@ -90,6 +118,11 @@ if ($str3) {
|
|||||||
<?= WebUtil::printCSS('../d_shared/common.css') ?>
|
<?= WebUtil::printCSS('../d_shared/common.css') ?>
|
||||||
<link rel="stylesheet" type="text/css" href="https://cdn.jsdelivr.net/gh/orioncactus/pretendard/dist/web/static/pretendard.css" />
|
<link rel="stylesheet" type="text/css" href="https://cdn.jsdelivr.net/gh/orioncactus/pretendard/dist/web/static/pretendard.css" />
|
||||||
<?= WebUtil::printDist('ts', ['common', 'betting']) ?>
|
<?= WebUtil::printDist('ts', ['common', 'betting']) ?>
|
||||||
|
<?= WebUtil::printStaticValues([
|
||||||
|
'staticValues'=>[
|
||||||
|
'bettingID'=> $bettingID
|
||||||
|
]
|
||||||
|
])?>
|
||||||
</head>
|
</head>
|
||||||
|
|
||||||
<body>
|
<body>
|
||||||
@@ -104,7 +137,7 @@ if ($str3) {
|
|||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td colspan=16 align=center>
|
<td colspan=16 align=center>
|
||||||
<font color=white size=6><?= $tnmt_type ?> (<?= $str1 . $str2 . $str3 ?>)</font>
|
<font color=white size=6><span style="color:<?= $color ?>"><?= $tnmt_type ?></span> (<?= $str1 . $str2 . $str3 ?>)</font>
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
@@ -293,9 +326,9 @@ if ($str3) {
|
|||||||
}
|
}
|
||||||
$gen[$i] = $general['name'];
|
$gen[$i] = $general['name'];
|
||||||
if (array_key_exists($tp, $general)) {
|
if (array_key_exists($tp, $general)) {
|
||||||
$stat[$i] = $general[$tp];
|
$stat[$i] = $general[$tp];
|
||||||
} else {
|
} else {
|
||||||
$stat[$i] = "-";
|
$stat[$i] = "-";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
for ($i = 0; $i < 8; $i++) {
|
for ($i = 0; $i < 8; $i++) {
|
||||||
@@ -305,17 +338,17 @@ if ($str3) {
|
|||||||
echo "<td colspan=2>{$line[$i * 2]}{$cent[$i]}{$line[$i * 2 + 1]}</td>";
|
echo "<td colspan=2>{$line[$i * 2]}{$cent[$i]}{$line[$i * 2 + 1]}</td>";
|
||||||
}
|
}
|
||||||
?>
|
?>
|
||||||
</tr>
|
</tr>
|
||||||
<tr align=center>
|
<tr align=center>
|
||||||
<?php for ($i = 0; $i < 16; $i++) { ?>
|
<?php for ($i = 0; $i < 16; $i++) { ?>
|
||||||
<td width=70><?=$gen[$i]?></td>
|
<td width=70><?= $gen[$i] ?></td>
|
||||||
<?php } ?>
|
<?php } ?>
|
||||||
</tr>
|
</tr>
|
||||||
<tr align=center>
|
<tr align=center>
|
||||||
<?php for ($i = 0; $i < 16; $i++) { ?>
|
<?php for ($i = 0; $i < 16; $i++) { ?>
|
||||||
<td width=70 style="font-size: 14px"><?=$stat[$i]?></td>
|
<td width=70 style="font-size: 14px"><?= $stat[$i] ?></td>
|
||||||
<?php } ?>
|
<?php } ?>
|
||||||
</tr>
|
</tr>
|
||||||
</table>
|
</table>
|
||||||
<table align=center width=1120 style="table-layout: fixed" class='tb_layout bg0'>
|
<table align=center width=1120 style="table-layout: fixed" class='tb_layout bg0'>
|
||||||
<tr align=center>
|
<tr align=center>
|
||||||
@@ -323,29 +356,29 @@ if ($str3) {
|
|||||||
</tr>
|
</tr>
|
||||||
<?php
|
<?php
|
||||||
|
|
||||||
$bet = [];
|
$bet = [];
|
||||||
$gold = [];
|
$gold = [];
|
||||||
|
$keyMap = [];
|
||||||
|
foreach ($info->candidates as $key => $candidate) {
|
||||||
|
$keyMap[$candidate->aux['idx']] = $key;
|
||||||
|
}
|
||||||
|
|
||||||
for ($i = 0; $i < 16; $i++) {
|
foreach ($globalBet as $key => $amount) {
|
||||||
if ($globalBet[$i] == 0) {
|
if ($amount == 0) {
|
||||||
$bet[$i] = "∞";
|
$bet[$key] = "∞";
|
||||||
} else {
|
$gold[$key] = 0;
|
||||||
$bet[$i] = round($globalBetTotal / $globalBet[$i], 2);
|
} else {
|
||||||
}
|
$rewardRatio = round($globalBetTotal / $amount, 2);
|
||||||
}
|
$bet[$key] = $rewardRatio;
|
||||||
|
$gold[$key] = $rewardRatio * ($myBet[$key] ?? 0);
|
||||||
for ($i = 0; $i < 16; $i++) {
|
}
|
||||||
if (!is_numeric($bet[$i])) {
|
}
|
||||||
$gold[$i] = 0;
|
|
||||||
} else {
|
|
||||||
$gold[$i] = Util::round($myBet[$i] * $bet[$i]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
echo "
|
echo "
|
||||||
<tr align=center>";
|
<tr align=center>";
|
||||||
|
|
||||||
for ($i = 0; $i < 16; $i++) {
|
foreach (range(0, 15) as $i) {
|
||||||
echo "<td width=70><font color=skyblue>{$bet[$i]}</font></td>";
|
$amount = $bet[$keyMap[$i] ?? -1] ?? 0;
|
||||||
|
echo "<td width=70><font color=skyblue>{$amount}</font></td>";
|
||||||
}
|
}
|
||||||
?>
|
?>
|
||||||
</tr>
|
</tr>
|
||||||
@@ -369,8 +402,9 @@ if ($str3) {
|
|||||||
</tr>
|
</tr>
|
||||||
<tr align=center>
|
<tr align=center>
|
||||||
<?php
|
<?php
|
||||||
for ($i = 0; $i < 16; $i++) {
|
foreach (range(0, 15) as $i) {
|
||||||
echo "<td><font color=orange>{$myBet[$i]}</font></td>";
|
$amount = $myBet[$keyMap[$i] ?? -1] ?? 0;
|
||||||
|
echo "<td><font color=orange>{$amount}</font></td>";
|
||||||
}
|
}
|
||||||
?>
|
?>
|
||||||
</tr>
|
</tr>
|
||||||
@@ -394,8 +428,9 @@ if ($str3) {
|
|||||||
</tr>
|
</tr>
|
||||||
<tr align=center>
|
<tr align=center>
|
||||||
<?php
|
<?php
|
||||||
for ($i = 0; $i < 16; $i++) {
|
foreach (range(0, 15) as $i) {
|
||||||
echo "<td><font color=cyan>{$gold[$i]}</font></td>";
|
$amount = $gold[$keyMap[$i] ?? -1] ?? 0;
|
||||||
|
echo "<td><font color=cyan>{$amount}</font></td>";
|
||||||
}
|
}
|
||||||
|
|
||||||
echo "
|
echo "
|
||||||
@@ -406,10 +441,11 @@ if ($str3) {
|
|||||||
echo "
|
echo "
|
||||||
<tr align=center>";
|
<tr align=center>";
|
||||||
|
|
||||||
for ($i = 0; $i < 16; $i++) {
|
foreach (range(0, 15) as $i) {
|
||||||
|
$key = $keyMap[$i] ?? -1;
|
||||||
echo "
|
echo "
|
||||||
<td>
|
<td>
|
||||||
<select size=1 id='target_{$i}' style=color:white;background-color:black;>
|
<select size=1 id='target_{$key}' style=color:white;background-color:black;>
|
||||||
<option style=color:white; value=10>금10</option>
|
<option style=color:white; value=10>금10</option>
|
||||||
<option style=color:white; value=20>금20</option>
|
<option style=color:white; value=20>금20</option>
|
||||||
<option style=color:white; value=50>금50</option>
|
<option style=color:white; value=50>금50</option>
|
||||||
@@ -425,9 +461,10 @@ if ($str3) {
|
|||||||
</tr>
|
</tr>
|
||||||
<tr align=center>";
|
<tr align=center>";
|
||||||
|
|
||||||
for ($i = 0; $i < 16; $i++) {
|
foreach (range(0, 15) as $i) {
|
||||||
|
$key = $keyMap[$i] ?? -1;
|
||||||
echo "
|
echo "
|
||||||
<td><input type=button class='submitBtn' data-target='{$i}' value=베팅! style=width:100%;color:white;background-color:black;></td>";
|
<td><input type=button class='submitBtn' data-target='{$key}' value=베팅! style=width:100%;color:white;background-color:black;></td>";
|
||||||
}
|
}
|
||||||
|
|
||||||
echo "</tr>";
|
echo "</tr>";
|
||||||
|
|||||||
+71
-21
@@ -15,6 +15,7 @@ increaseRefresh("토너먼트", 1);
|
|||||||
TurnExecutionHelper::executeAllCommand();
|
TurnExecutionHelper::executeAllCommand();
|
||||||
|
|
||||||
$me = $db->queryFirstRow('select no,tournament,con,turntime from general where owner=%i', $userID);
|
$me = $db->queryFirstRow('select no,tournament,con,turntime from general where owner=%i', $userID);
|
||||||
|
$generalID = $session->generalID;
|
||||||
|
|
||||||
$admin = $gameStor->getValues(['tournament', 'phase', 'tnmt_msg', 'tnmt_type', 'develcost', 'tnmt_trig']);
|
$admin = $gameStor->getValues(['tournament', 'phase', 'tnmt_msg', 'tnmt_type', 'develcost', 'tnmt_trig']);
|
||||||
|
|
||||||
@@ -25,34 +26,76 @@ if ($con >= 2) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
switch ($admin['tnmt_type']) {
|
switch ($admin['tnmt_type']) {
|
||||||
default:
|
case convertTournamentType('전력전'):
|
||||||
throw new \RuntimeException('invalid tnmt_type');
|
$tnmt_type = "전력전";
|
||||||
case 0:
|
$color = 'cyan';
|
||||||
$tnmt_type = "<font color=cyan>전력전</font>";
|
|
||||||
$tp = "total";
|
$tp = "total";
|
||||||
$tp2 = "종합";
|
$tp2 = "종합";
|
||||||
$tp3 = "total";
|
$tp3 = "total";
|
||||||
break;
|
break;
|
||||||
case 1:
|
case convertTournamentType('통솔전'):
|
||||||
$tnmt_type = "<font color=cyan>통솔전</font>";
|
$tnmt_type = "통솔전";
|
||||||
|
$color = 'cyan';
|
||||||
$tp = "leadership";
|
$tp = "leadership";
|
||||||
$tp2 = "통솔";
|
$tp2 = "통솔";
|
||||||
$tp3 = "leadership";
|
$tp3 = "leadership";
|
||||||
break;
|
break;
|
||||||
case 2:
|
case convertTournamentType('일기토'):
|
||||||
$tnmt_type = "<font color=cyan>일기토</font>";
|
$tnmt_type = "일기토";
|
||||||
|
$color = 'cyan';
|
||||||
$tp = "strength";
|
$tp = "strength";
|
||||||
$tp2 = "무력";
|
$tp2 = "무력";
|
||||||
$tp3 = "strength";
|
$tp3 = "strength";
|
||||||
break;
|
break;
|
||||||
case 3:
|
case convertTournamentType('설전'):
|
||||||
$tnmt_type = "<font color=cyan>설전</font>";
|
$tnmt_type = "설전";
|
||||||
|
$color = 'cyan';
|
||||||
$tp = "intel";
|
$tp = "intel";
|
||||||
$tp2 = "지력";
|
$tp2 = "지력";
|
||||||
$tp3 = "intel";
|
$tp3 = "intel";
|
||||||
break;
|
break;
|
||||||
|
default:
|
||||||
|
throw new \RuntimeException('invalid tnmt_type');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
$bettingID = $gameStor->last_tournament_betting_id ?? 0;
|
||||||
|
if ($bettingID != 0) {
|
||||||
|
$betting = $bettingID != 0 ? new Betting($bettingID) : null;
|
||||||
|
$info = $betting->getInfo();
|
||||||
|
} else {
|
||||||
|
$info = getDummyBettingInfo($tnmt_type);
|
||||||
|
}
|
||||||
|
|
||||||
|
$myBet = [];
|
||||||
|
$globalBet = [];
|
||||||
|
|
||||||
|
if ($bettingID != 0) {
|
||||||
|
$betting = $bettingID != 0 ? new Betting($bettingID) : null;
|
||||||
|
$info = $betting->getInfo();
|
||||||
|
|
||||||
|
foreach ($db->queryAllLists(
|
||||||
|
'SELECT general_id, user_id, amount, betting_type FROM ng_betting WHERE betting_id = %i',
|
||||||
|
$bettingID
|
||||||
|
) as [$betGeneralID, $userID, $amount, $bettingTypeKey]) {
|
||||||
|
$bettingKey = Json::decode($bettingTypeKey)[0];
|
||||||
|
if ($betGeneralID == $generalID) {
|
||||||
|
$myBet[$bettingKey] = $amount;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (key_exists($bettingKey, $globalBet)) {
|
||||||
|
$globalBet[$bettingKey] += $amount;
|
||||||
|
} else {
|
||||||
|
$globalBet[$bettingKey] = $amount;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
$info = getDummyBettingInfo($tnmt_type);
|
||||||
|
}
|
||||||
|
|
||||||
|
$myBetTotal = array_sum($myBet);
|
||||||
|
$globalBetTotal = array_sum($globalBet);
|
||||||
|
|
||||||
?>
|
?>
|
||||||
<!DOCTYPE html>
|
<!DOCTYPE html>
|
||||||
<html>
|
<html>
|
||||||
@@ -209,7 +252,7 @@ switch ($admin['tnmt_type']) {
|
|||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td colspan=8 align=center>
|
<td colspan=8 align=center>
|
||||||
<font color=white size=6><?= $tnmt_type ?> (<?= $str1 . $str2 . $str3 ?>)</font>
|
<font color=white size=6><span style="color:<?= $color ?>"><?= $tnmt_type ?></span> (<?= $str1 . $str2 . $str3 ?>)</font>
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
@@ -418,24 +461,31 @@ switch ($admin['tnmt_type']) {
|
|||||||
|
|
||||||
echo "
|
echo "
|
||||||
</tr>";
|
</tr>";
|
||||||
$globalBet = $db->queryFirstList('SELECT * FROM betting WHERE general_id = 0') ?? [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,];
|
|
||||||
$globalBet = array_splice($globalBet, -16);
|
|
||||||
$globalBetTotal = array_sum($globalBet);
|
|
||||||
$admin = $gameStor->getValues(['tournament', 'phase']);
|
$admin = $gameStor->getValues(['tournament', 'phase']);
|
||||||
$bet = [];
|
$bet = [];
|
||||||
for ($i = 0; $i < 16; $i++) {
|
$gold = [];
|
||||||
if ($globalBet[$i] == 0) {
|
$keyMap = [];
|
||||||
$bet[$i] = '∞';
|
foreach ($info->candidates as $key => $candidate) {
|
||||||
continue;
|
$keyMap[$candidate->aux['idx']] = $key;
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach ($globalBet as $key => $amount) {
|
||||||
|
if ($amount == 0) {
|
||||||
|
$bet[$key] = "∞";
|
||||||
|
$gold[$key] = 0;
|
||||||
|
} else {
|
||||||
|
$rewardRatio = round($globalBetTotal / $amount, 2);
|
||||||
|
$bet[$key] = $rewardRatio;
|
||||||
|
$gold[$key] = $rewardRatio * ($myBet[$key] ?? 0);
|
||||||
}
|
}
|
||||||
$bet[$i] = round($globalBetTotal / $globalBet[$i], 2);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
echo "
|
echo "
|
||||||
<tr align=center>";
|
<tr align=center>";
|
||||||
|
|
||||||
for ($i = 0; $i < 16; $i++) {
|
foreach (range(0, 15) as $i) {
|
||||||
echo "<td><font color=skyblue>{$bet[$i]}</font></td>";
|
$amount = $bet[$keyMap[$i] ?? -1] ?? 0;
|
||||||
|
echo "<td><font color=skyblue>{$amount}</font></td>";
|
||||||
}
|
}
|
||||||
|
|
||||||
echo "
|
echo "
|
||||||
|
|||||||
@@ -225,6 +225,8 @@ if($btn == "자동개최설정") {
|
|||||||
finallyAll($admin['tnmt_type'], $admin['tournament'], $admin['phase']);
|
finallyAll($admin['tnmt_type'], $admin['tournament'], $admin['phase']);
|
||||||
} elseif($btn == "배정") {
|
} elseif($btn == "배정") {
|
||||||
final16set();
|
final16set();
|
||||||
|
$phase = 0;
|
||||||
|
startBetting($admin['tnmt_type'], 720);
|
||||||
} 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;
|
||||||
|
|||||||
+8
-7
@@ -472,7 +472,8 @@ function getCommandTable(General $general)
|
|||||||
return $result;
|
return $result;
|
||||||
}
|
}
|
||||||
|
|
||||||
function getChiefCommandTable(General $general){
|
function getChiefCommandTable(General $general)
|
||||||
|
{
|
||||||
$db = DB::db();
|
$db = DB::db();
|
||||||
$gameStor = KVStorage::getStorage($db, 'game_env');
|
$gameStor = KVStorage::getStorage($db, 'game_env');
|
||||||
$gameStor->turnOnCache();
|
$gameStor->turnOnCache();
|
||||||
@@ -1121,7 +1122,7 @@ function CheckOverhead()
|
|||||||
|
|
||||||
function isLock()
|
function isLock()
|
||||||
{
|
{
|
||||||
return DB::db()->queryFirstField("SELECT plock from plock limit 1") != 0;
|
return DB::db()->queryFirstField("SELECT plock from plock WHERE `type`='GAME'") != 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
function tryLock(): bool
|
function tryLock(): bool
|
||||||
@@ -1133,7 +1134,7 @@ function tryLock(): bool
|
|||||||
$db->update('plock', [
|
$db->update('plock', [
|
||||||
'plock' => 1,
|
'plock' => 1,
|
||||||
'locktime' => TimeUtil::now(true)
|
'locktime' => TimeUtil::now(true)
|
||||||
], 'plock=0');
|
], 'plock=0 AND type="GAME"');
|
||||||
|
|
||||||
return $db->affectedRows() > 0;
|
return $db->affectedRows() > 0;
|
||||||
}
|
}
|
||||||
@@ -1144,7 +1145,7 @@ function unlock(): bool
|
|||||||
$db = DB::db();
|
$db = DB::db();
|
||||||
$db->update('plock', [
|
$db->update('plock', [
|
||||||
'plock' => 0
|
'plock' => 0
|
||||||
], true);
|
], 'type="GAME"');
|
||||||
|
|
||||||
return $db->affectedRows() > 0;
|
return $db->affectedRows() > 0;
|
||||||
}
|
}
|
||||||
@@ -1581,7 +1582,7 @@ function giveRandomUniqueItem(General $general, string $acquireType): bool
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
foreach($db->queryAllLists('SELECT namespace, count(*) as cnt FROM `storage` WHERE namespace LIKE "ut_%" GROUP BY namespace') as [$uniqueNS, $cnt]){
|
foreach ($db->queryAllLists('SELECT namespace, count(*) as cnt FROM `storage` WHERE namespace LIKE "ut_%" GROUP BY namespace') as [$uniqueNS, $cnt]) {
|
||||||
$itemCode = substr($uniqueNS, 3);
|
$itemCode = substr($uniqueNS, 3);
|
||||||
$itemClass = buildItemClass($itemCode);
|
$itemClass = buildItemClass($itemCode);
|
||||||
if (!$itemClass) {
|
if (!$itemClass) {
|
||||||
@@ -1590,7 +1591,7 @@ function giveRandomUniqueItem(General $general, string $acquireType): bool
|
|||||||
if ($itemClass->isBuyable()) {
|
if ($itemClass->isBuyable()) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
$occupiedUnique[$itemCode] = ($occupiedUnique[$itemCode]??0) + $cnt;
|
$occupiedUnique[$itemCode] = ($occupiedUnique[$itemCode] ?? 0) + $cnt;
|
||||||
}
|
}
|
||||||
|
|
||||||
foreach (GameConst::$allItems as $itemType => $itemCategories) {
|
foreach (GameConst::$allItems as $itemType => $itemCategories) {
|
||||||
@@ -1632,7 +1633,7 @@ function giveRandomUniqueItem(General $general, string $acquireType): bool
|
|||||||
$relMonthByInit = Util::joinYearMonth($year, $month) - Util::joinYearMonth($initYear, $initMonth);
|
$relMonthByInit = Util::joinYearMonth($year, $month) - Util::joinYearMonth($initYear, $initMonth);
|
||||||
$availableBuyUnique = $relMonthByInit >= GameConst::$minMonthToAllowInheritItem;
|
$availableBuyUnique = $relMonthByInit >= GameConst::$minMonthToAllowInheritItem;
|
||||||
|
|
||||||
if($availableBuyUnique){
|
if ($availableBuyUnique) {
|
||||||
$general->setAuxVar('inheritRandomUnique', null);
|
$general->setAuxVar('inheritRandomUnique', null);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+119
-86
@@ -2,13 +2,14 @@
|
|||||||
|
|
||||||
namespace sammo;
|
namespace sammo;
|
||||||
|
|
||||||
|
use sammo\DTO\BettingInfo;
|
||||||
|
|
||||||
function processTournament()
|
function processTournament()
|
||||||
{
|
{
|
||||||
$db = DB::db();
|
$db = DB::db();
|
||||||
$gameStor = KVStorage::getStorage($db, 'game_env');
|
$gameStor = KVStorage::getStorage($db, 'game_env');
|
||||||
|
|
||||||
$admin = $gameStor->getValues(['tournament', 'phase', 'tnmt_type', 'tnmt_auto', 'tnmt_time']);
|
$admin = $gameStor->getValues(['tournament', 'phase', 'tnmt_type', 'tnmt_auto', 'tnmt_time', 'last_tournament_betting_id']);
|
||||||
$now = new \DateTime();
|
$now = new \DateTime();
|
||||||
$offset = $now->getTimestamp() - (new \DateTime($admin['tnmt_time']))->getTimestamp();
|
$offset = $now->getTimestamp() - (new \DateTime($admin['tnmt_time']))->getTimestamp();
|
||||||
|
|
||||||
@@ -90,9 +91,12 @@ function processTournament()
|
|||||||
final16set();
|
final16set();
|
||||||
$tnmt = 6;
|
$tnmt = 6;
|
||||||
$phase = 0;
|
$phase = 0;
|
||||||
startBetting();
|
startBetting($type, $unit);
|
||||||
break;
|
break;
|
||||||
case 6: //베팅중
|
case 6: //베팅중
|
||||||
|
$bettingID = $admin['last_tournament_betting_id'];
|
||||||
|
$betting = new Betting($bettingID);
|
||||||
|
$betting->closeBetting();
|
||||||
$tnmt = 7;
|
$tnmt = 7;
|
||||||
$phase = 0;
|
$phase = 0;
|
||||||
break;
|
break;
|
||||||
@@ -164,23 +168,32 @@ function processTournament()
|
|||||||
$gameStor->tnmt_time = (new \DateTimeImmutable($admin['tnmt_time']))->add(new \DateInterval("PT{$second}S"))->format('Y-m-d H:i:s');
|
$gameStor->tnmt_time = (new \DateTimeImmutable($admin['tnmt_time']))->add(new \DateInterval("PT{$second}S"))->format('Y-m-d H:i:s');
|
||||||
}
|
}
|
||||||
|
|
||||||
function getTournamentTerm(): ?int{
|
function getTournamentTerm(): ?int
|
||||||
|
{
|
||||||
$db = DB::db();
|
$db = DB::db();
|
||||||
$gameStor = KVStorage::getStorage($db, 'game_env');
|
$gameStor = KVStorage::getStorage($db, 'game_env');
|
||||||
|
|
||||||
$tnmt_auto = $gameStor->tnmt_auto;
|
$tnmt_auto = $gameStor->tnmt_auto;
|
||||||
if($tnmt_auto === null){
|
if ($tnmt_auto === null) {
|
||||||
$tnmt_auto = $gameStor->tnmt_trig;
|
$tnmt_auto = $gameStor->tnmt_trig;
|
||||||
}
|
}
|
||||||
switch($tnmt_auto){
|
switch ($tnmt_auto) {
|
||||||
case 0: return null;
|
case 0:
|
||||||
case 1: return 12 * 60;
|
return null;
|
||||||
case 2: return 7 * 60;
|
case 1:
|
||||||
case 3: return 3 * 60;
|
return 12 * 60;
|
||||||
case 4: return 1 * 60;
|
case 2:
|
||||||
case 5: return 30;
|
return 7 * 60;
|
||||||
case 6: return 15;
|
case 3:
|
||||||
case 7: return 5;
|
return 3 * 60;
|
||||||
|
case 4:
|
||||||
|
return 1 * 60;
|
||||||
|
case 5:
|
||||||
|
return 30;
|
||||||
|
case 6:
|
||||||
|
return 15;
|
||||||
|
case 7:
|
||||||
|
return 5;
|
||||||
}
|
}
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
@@ -189,16 +202,16 @@ function getTournamentTermText()
|
|||||||
{
|
{
|
||||||
$term = getTournamentTerm();
|
$term = getTournamentTerm();
|
||||||
|
|
||||||
if($term === null){
|
if ($term === null) {
|
||||||
return '수동';
|
return '수동';
|
||||||
}
|
}
|
||||||
|
|
||||||
if($term % 60 === 0){
|
if ($term % 60 === 0) {
|
||||||
$termMin = intdiv($term, 60);
|
$termMin = intdiv($term, 60);
|
||||||
return "경기당 {$termMin}분";
|
return "경기당 {$termMin}분";
|
||||||
}
|
}
|
||||||
|
|
||||||
if($term > 60){
|
if ($term > 60) {
|
||||||
$termSec = $term % 60;
|
$termSec = $term % 60;
|
||||||
$termMin = intdiv($term, 60);
|
$termMin = intdiv($term, 60);
|
||||||
return "경기당 {$termMin}분 {$termSec}초";
|
return "경기당 {$termMin}분 {$termSec}초";
|
||||||
@@ -268,7 +281,7 @@ function printRow($k, $npc, $name, $abil, $tgame, $win, $draw, $lose, $gd, $gl,
|
|||||||
$k += 1;
|
$k += 1;
|
||||||
if ($prmt > 0) {
|
if ($prmt > 0) {
|
||||||
$name = "<font color=orange>" . $name . "</font>";
|
$name = "<font color=orange>" . $name . "</font>";
|
||||||
} else if($npc > 0){
|
} else if ($npc > 0) {
|
||||||
$name = formatName($name, $npc);
|
$name = formatName($name, $npc);
|
||||||
}
|
}
|
||||||
echo "<tr align=center><td class='bg2'>$k</td><td style='font-size:80%;'>$name</td><td>$abil</td><td>$tgame</td><td>$win</td><td>$draw</td><td>$lose</td><td>$gd</td><td>$gl</td></tr>";
|
echo "<tr align=center><td class='bg2'>$k</td><td style='font-size:80%;'>$name</td><td>$abil</td><td>$tgame</td><td>$win</td><td>$draw</td><td>$lose</td><td>$gd</td><td>$gl</td></tr>";
|
||||||
@@ -367,29 +380,12 @@ function startTournament($auto, $type)
|
|||||||
$gameStor->tnmt_time = (new \DateTimeImmutable())->add(new \DateInterval("PT{$unit}M"))->format('Y-m-d H:i:s');
|
$gameStor->tnmt_time = (new \DateTimeImmutable())->add(new \DateInterval("PT{$unit}M"))->format('Y-m-d H:i:s');
|
||||||
$gameStor->tournament = 1;
|
$gameStor->tournament = 1;
|
||||||
$gameStor->tnmt_type = $type;
|
$gameStor->tnmt_type = $type;
|
||||||
|
$gameStor->last_tournament_betting_id = 0;
|
||||||
$gameStor->phase = 0;
|
$gameStor->phase = 0;
|
||||||
|
|
||||||
$db->update('general', [
|
$db->update('general', [
|
||||||
'tournament' => 0,
|
'tournament' => 0,
|
||||||
], true);
|
], true);
|
||||||
$db->update('betting', [
|
|
||||||
'bet0' => 0,
|
|
||||||
'bet1' => 0,
|
|
||||||
'bet2' => 0,
|
|
||||||
'bet3' => 0,
|
|
||||||
'bet4' => 0,
|
|
||||||
'bet5' => 0,
|
|
||||||
'bet6' => 0,
|
|
||||||
'bet7' => 0,
|
|
||||||
'bet8' => 0,
|
|
||||||
'bet9' => 0,
|
|
||||||
'bet10' => 0,
|
|
||||||
'bet11' => 0,
|
|
||||||
'bet12' => 0,
|
|
||||||
'bet13' => 0,
|
|
||||||
'bet14' => 0,
|
|
||||||
'bet15' => 0
|
|
||||||
], true);
|
|
||||||
$db->query('TRUNCATE TABLE tournament');
|
$db->query('TRUNCATE TABLE tournament');
|
||||||
|
|
||||||
$opener = $db->queryFirstField('SELECT `general`.`name` FROM `general` JOIN `nation` ON `general`.`nation` = `nation`.`nation` WHERE `general`.`officer_level` = 12 AND `nation`.`level` = 7 ORDER BY rand() LIMIT 1');
|
$opener = $db->queryFirstField('SELECT `general`.`name` FROM `general` JOIN `nation` ON `general`.`nation` = `nation`.`nation` WHERE `general`.`officer_level` = 12 AND `nation`.`level` = 7 ORDER BY rand() LIMIT 1');
|
||||||
@@ -416,44 +412,90 @@ function startTournament($auto, $type)
|
|||||||
pushGlobalHistoryLog($history, $admin['year'], $admin['month']);
|
pushGlobalHistoryLog($history, $admin['year'], $admin['month']);
|
||||||
}
|
}
|
||||||
|
|
||||||
function startBetting()
|
function getDummyBettingInfo(string $tnmt_type): BettingInfo
|
||||||
|
{
|
||||||
|
return new BettingInfo(
|
||||||
|
id: 0,
|
||||||
|
type: 'tournament',
|
||||||
|
name: $tnmt_type,
|
||||||
|
finished: true,
|
||||||
|
selectCnt: 1,
|
||||||
|
reqInheritancePoint: false,
|
||||||
|
openYearMonth: 0,
|
||||||
|
closeYearMonth: 0,
|
||||||
|
candidates: []
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
function startBetting($type, $unit)
|
||||||
{
|
{
|
||||||
$db = DB::db();
|
$db = DB::db();
|
||||||
$gameStor = KVStorage::getStorage($db, 'game_env');
|
$gameStor = KVStorage::getStorage($db, 'game_env');
|
||||||
[$year, $month, $startyear] = $gameStor->getValuesAsArray(['year', 'month', 'startyear']);
|
[$year, $month, $startyear, $turnterm] = $gameStor->getValuesAsArray(['year', 'month', 'startyear', 'turnterm']);
|
||||||
pushGlobalHistoryLog([
|
pushGlobalHistoryLog([
|
||||||
"<S>◆</>{$year}년 {$month}월:<B><b>【대회】</b></>우승자를 예상하는 <C>내기</>가 진행중입니다! 호사가의 참여를 기다립니다!"
|
"<S>◆</>{$year}년 {$month}월:<B><b>【대회】</b></>우승자를 예상하는 <C>내기</>가 진행중입니다! 호사가의 참여를 기다립니다!"
|
||||||
], $year, $month);
|
], $year, $month);
|
||||||
|
|
||||||
|
[$typeText, $statName, $statKey] = [
|
||||||
|
['전력전', '종능', 'total'],
|
||||||
|
['통솔전', '통솔', 'leadership'],
|
||||||
|
['일기토', '무력', 'strength'],
|
||||||
|
['설전', '지력', 'intel'],
|
||||||
|
][$type];
|
||||||
|
|
||||||
|
$bettingID = Betting::genNextBettingID();
|
||||||
|
|
||||||
|
|
||||||
|
//어차피 강제로 닫을 것이므로 크게 신경쓰지 않는다.
|
||||||
|
$openYearMonth = Util::joinYearMonth($year, $month);
|
||||||
|
$closeYearMonth = $openYearMonth + 120;
|
||||||
|
|
||||||
|
/** @var \sammo\DTO\SelectItem[] */
|
||||||
|
$candidates = [];
|
||||||
|
|
||||||
|
$generalList = $db->query('SELECT no,npc,name,win,leadership,strength,intel,leadership+strength+intel as total from tournament where grp>=20 order by grp, grp_no LIMIT 16');
|
||||||
|
foreach ($generalList as $idx => $general) {
|
||||||
|
if ($general['no'] <= 0) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
$general['idx'] = $idx;
|
||||||
|
$candidates[$general['no']] = new \sammo\DTO\SelectItem(
|
||||||
|
title: $general['name'],
|
||||||
|
info: "{$statName}: {$general[$statKey]}",
|
||||||
|
aux: $general
|
||||||
|
);
|
||||||
|
}
|
||||||
|
$candidateCnt = count($candidates);
|
||||||
|
|
||||||
|
Betting::openBetting(new BettingInfo(
|
||||||
|
id: $bettingID,
|
||||||
|
type: 'tournament',
|
||||||
|
name: $typeText,
|
||||||
|
finished: false,
|
||||||
|
selectCnt: 1,
|
||||||
|
reqInheritancePoint: false,
|
||||||
|
openYearMonth: $openYearMonth,
|
||||||
|
closeYearMonth: $closeYearMonth,
|
||||||
|
candidates: $candidates,
|
||||||
|
));
|
||||||
|
|
||||||
|
$betting = new Betting($bettingID);
|
||||||
|
|
||||||
|
$gameStor->last_tournament_betting_id = $bettingID;
|
||||||
|
|
||||||
$betGold = Util::valueFit(floor((3 + $year - $startyear) * 0.334) * 10, 10);
|
$betGold = Util::valueFit(floor((3 + $year - $startyear) * 0.334) * 10, 10);
|
||||||
|
|
||||||
$npcList = $db->queryFirstColumn('SELECT no FROM general WHERE npc >= 2 AND gold >= (500 + %i)', $betGold);
|
$npcList = $db->queryFirstColumn('SELECT no FROM general WHERE npc >= 2 AND gold >= (500 + %i)', $betGold);
|
||||||
$npcBet = [];
|
$npcBet = [];
|
||||||
$betSum = [
|
|
||||||
0, 0, 0, 0, 0, 0, 0, 0,
|
|
||||||
0, 0, 0, 0, 0, 0, 0, 0,
|
|
||||||
];
|
|
||||||
|
|
||||||
|
$targetList = array_keys($candidates);
|
||||||
foreach ($npcList as $npcID) {
|
foreach ($npcList as $npcID) {
|
||||||
$target = Util::randRangeInt(0, 15);
|
$target = Util::choiceRandom($targetList);
|
||||||
$betSum[$target] += $betGold;
|
|
||||||
$npcBet[] = [$npcID, $target];
|
$npcBet[] = [$npcID, $target];
|
||||||
}
|
}
|
||||||
|
|
||||||
$db->update('general', [
|
|
||||||
'gold' => $db->sqleval('gold - %i', $betGold),
|
|
||||||
], 'no IN %li', $npcList);
|
|
||||||
foreach ($npcBet as [$npcID, $betTarget]) {
|
foreach ($npcBet as [$npcID, $betTarget]) {
|
||||||
$targetKey = "bet{$betTarget}";
|
$betting->bet($npcID, null, [$betTarget], $betGold);
|
||||||
$db->update('betting', [
|
|
||||||
"bet{$betTarget}" => $db->sqleval('%b + %i', $targetKey, $betGold),
|
|
||||||
], 'general_id = %i', $npcID);
|
|
||||||
}
|
|
||||||
foreach ($betSum as $betTarget => $betSumGold) {
|
|
||||||
$targetKey = "bet{$betTarget}";
|
|
||||||
$db->update('betting', [
|
|
||||||
"bet{$betTarget}" => $db->sqleval('%b + %i', $targetKey, $betSumGold),
|
|
||||||
], 'general_id = 0');
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -514,19 +556,19 @@ function fillLowGenAll($tnmt_type)
|
|||||||
//자동신청하고, 돈 있고, 아직 참가 안한 장수
|
//자동신청하고, 돈 있고, 아직 참가 안한 장수
|
||||||
$freeJoinerCandidate = [];
|
$freeJoinerCandidate = [];
|
||||||
|
|
||||||
foreach($db->query(
|
foreach ($db->query(
|
||||||
'SELECT no,npc,name,leadership,strength,intel,explevel,horse,weapon,book from general where tnmt=1 and tournament=0',
|
'SELECT no,npc,name,leadership,strength,intel,explevel,horse,weapon,book from general where tnmt=1 and tournament=0',
|
||||||
) as $gen){
|
) as $gen) {
|
||||||
$score = $scoringCandFunction($gen);
|
$score = $scoringCandFunction($gen);
|
||||||
$freeJoinerCandidate[$gen['no']] = [$gen, $score**1.5];
|
$freeJoinerCandidate[$gen['no']] = [$gen, $score ** 1.5];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
$joinersValues = [];
|
$joinersValues = [];
|
||||||
$joinersIdx = [];
|
$joinersIdx = [];
|
||||||
|
|
||||||
foreach(Util::range($toBeFilledCnt) as $_){
|
foreach (Util::range($toBeFilledCnt) as $_) {
|
||||||
if(!$freeJoinerCandidate){
|
if (!$freeJoinerCandidate) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
$general = Util::choiceRandomUsingWeightPair($freeJoinerCandidate);
|
$general = Util::choiceRandomUsingWeightPair($freeJoinerCandidate);
|
||||||
@@ -987,7 +1029,7 @@ function setGift($tnmt_type, $tnmt, $phase)
|
|||||||
$db = DB::db();
|
$db = DB::db();
|
||||||
$gameStor = KVStorage::getStorage($db, 'game_env');
|
$gameStor = KVStorage::getStorage($db, 'game_env');
|
||||||
|
|
||||||
$admin = $gameStor->getValues(['year', 'month', 'develcost']);
|
$admin = $gameStor->getValues(['year', 'month', 'develcost', 'last_tournament_betting_id']);
|
||||||
|
|
||||||
$resultHelper = [];
|
$resultHelper = [];
|
||||||
|
|
||||||
@@ -1143,36 +1185,16 @@ function setGift($tnmt_type, $tnmt, $phase)
|
|||||||
$generalObjList[$generalID]->increaseInheritancePoint('tournament', $general['inheritance_point']);
|
$generalObjList[$generalID]->increaseInheritancePoint('tournament', $general['inheritance_point']);
|
||||||
}
|
}
|
||||||
|
|
||||||
//우승자 번호
|
|
||||||
$winnerGrp = $resultHelper[$winner['no']]['grp'];
|
|
||||||
$winnerGrpNo = $resultHelper[$winner['no']]['grp_no'];
|
|
||||||
$winnerSlot = ($winnerGrp - 20) * 2 + $winnerGrpNo;
|
|
||||||
|
|
||||||
//당첨칸에 베팅한 사람들만
|
//당첨칸에 베팅한 사람들만
|
||||||
$globalBet = $db->queryFirstList('SELECT * FROM betting WHERE general_id = 0');
|
$bettingID = $gameStor->last_tournament_betting_id;
|
||||||
$globalBet = array_splice($globalBet, -16);
|
$betting = new Betting($bettingID);
|
||||||
$globalBetTotal = array_sum($globalBet);
|
$betting->giveReward([$winner['no']]);
|
||||||
$rewardRate = round($globalBetTotal / max($globalBet[$winnerSlot], 1), 2);
|
|
||||||
|
|
||||||
$betKey = "bet{$winnerSlot}";
|
|
||||||
$gambleResult = Util::convertArrayToDict($db->query('SELECT general_id, %b as bet FROM betting WHERE %b > 0 AND general_id > 0', $betKey, $betKey), 'general_id');
|
|
||||||
|
|
||||||
foreach (General::createGeneralObjListFromDB(Util::squeezeFromArray($gambleResult, 'general_id'), ['gold', 'npc'], 1) as $gambler) {
|
|
||||||
$reward = Util::round($gambleResult[$gambler->getID()]['bet'] * $rewardRate);
|
|
||||||
$gambler->increaseVar('gold', $reward);
|
|
||||||
if (($gambler->getNPCType() == 0) || ($gambler->getNPCType() == 1 && $gambler->getRankVar('betgold', 0) > 0)) {
|
|
||||||
$gambler->increaseRankVar('betwingold', $reward);
|
|
||||||
$gambler->increaseRankVar('betwin', 1);
|
|
||||||
}
|
|
||||||
$rewardText = number_format($reward);
|
|
||||||
$gambler->getLogger()->pushGeneralActionLog("<C>{$tp}</> 대회의 베팅 당첨으로 <C>{$rewardText}</>의 <S>금</> 획득!", ActionLogger::EVENT_PLAIN);
|
|
||||||
$gambler->applyDB($db);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function setRefund()
|
function setRefund()
|
||||||
{
|
{
|
||||||
$db = DB::db();
|
$db = DB::db();
|
||||||
|
|
||||||
$gameStor = KVStorage::getStorage($db, 'game_env');
|
$gameStor = KVStorage::getStorage($db, 'game_env');
|
||||||
|
|
||||||
//16강자 명성 돈
|
//16강자 명성 돈
|
||||||
@@ -1183,6 +1205,17 @@ function setRefund()
|
|||||||
], 'no IN %li', $generalIDList);
|
], 'no IN %li', $generalIDList);
|
||||||
|
|
||||||
//베팅금 환수
|
//베팅금 환수
|
||||||
|
$bettingID = $gameStor->last_tournament_betting_id ?? 0;
|
||||||
|
if (!$bettingID == 0) {
|
||||||
|
$betting = new Betting($bettingID);
|
||||||
|
if (!$betting->getInfo()->finished) {
|
||||||
|
$betting->giveReward([-1]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
$db->update(['general', [
|
$db->update(['general', [
|
||||||
'gold' => $db->sqleval('gold + (SELECT bet0+bet1+bet2+bet3+bet4+bet5+bet6+bet7+bet8+bet9+bet10+bet11+bet12+bet13+bet14+bet15 FROM betting WHERE general_id = general.no)')
|
'gold' => $db->sqleval('gold + (SELECT bet0+bet1+bet2+bet3+bet4+bet5+bet6+bet7+bet8+bet9+bet10+bet11+bet12+bet13+bet14+bet15 FROM betting WHERE general_id = general.no)')
|
||||||
]], true);
|
]], true);
|
||||||
|
|||||||
+6
-6
@@ -47,7 +47,7 @@ if ($me['newmsg'] == 1 || $me['newvote'] == 1) {
|
|||||||
], 'owner=%i', $userID);
|
], 'owner=%i', $userID);
|
||||||
}
|
}
|
||||||
|
|
||||||
$plock = boolval($db->queryFirstField('SELECT plock FROM plock LIMIT 1'));
|
$plock = boolval($db->queryFirstField('SELECT plock FROM plock WHERE `type`="GAME" LIMIT 1'));
|
||||||
|
|
||||||
$con = checkLimit($me['con']);
|
$con = checkLimit($me['con']);
|
||||||
if ($con >= 2) {
|
if ($con >= 2) {
|
||||||
@@ -189,11 +189,11 @@ if (!$otherTextInfo) {
|
|||||||
<div class="s-border-t col py-2 col-4 col-md-2">턴당 갱신횟수 : <?= $gameStor->conlimit ?>회</div>
|
<div class="s-border-t col py-2 col-4 col-md-2">턴당 갱신횟수 : <?= $gameStor->conlimit ?>회</div>
|
||||||
<div class="s-border-t col py-2 col-8 col-md-4"><?= info(3) ?></div>
|
<div class="s-border-t col py-2 col-8 col-md-4"><?= info(3) ?></div>
|
||||||
<div class="s-border-t py-2 col col-6 col-md-4">
|
<div class="s-border-t py-2 col col-6 col-md-4">
|
||||||
<?php if ($isTournamentActive) : ?>
|
<?php if ($isTournamentActive) : ?>
|
||||||
↑<span style='color:cyan'><?=(['전력전', '통솔전', '일기토', '설전',])[$gameStor->tnmt_type] ?? '' ?> <?= getTournament($gameStor->tournament) ?> <?= getTournamentTime() ?></span>↑
|
↑<span style='color:cyan'><?= (['전력전', '통솔전', '일기토', '설전',])[$gameStor->tnmt_type] ?? '' ?> <?= getTournament($gameStor->tournament) ?> <?= getTournamentTime() ?></span>↑
|
||||||
<?php else : ?>
|
<?php else : ?>
|
||||||
<span style='color:magenta'>현재 토너먼트 경기 없음</span>
|
<span style='color:magenta'>현재 토너먼트 경기 없음</span>
|
||||||
<?php endif; ?>
|
<?php endif; ?>
|
||||||
</div>
|
</div>
|
||||||
<div class="s-border-t py-2 col col-6 col-md-2">
|
<div class="s-border-t py-2 col col-6 col-md-2">
|
||||||
<div style="display:inline-block;"><?= $plock ? ("<span style='color:magenta;'>동작 시각: " . substr($gameStor->turntime, 5, 14) . "</span>") : ("<span style='color:cyan;'>동작 시각: " . substr($gameStor->turntime, 5, 14) . "</span>") ?></div>
|
<div style="display:inline-block;"><?= $plock ? ("<span style='color:magenta;'>동작 시각: " . substr($gameStor->turntime, 5, 14) . "</span>") : ("<span style='color:cyan;'>동작 시각: " . substr($gameStor->turntime, 5, 14) . "</span>") ?></div>
|
||||||
|
|||||||
@@ -1,76 +0,0 @@
|
|||||||
<?php
|
|
||||||
namespace sammo;
|
|
||||||
|
|
||||||
include "lib.php";
|
|
||||||
include "func.php";
|
|
||||||
|
|
||||||
WebUtil::requireAJAX();
|
|
||||||
|
|
||||||
$betTarget = Util::getPost('target', 'int', -1);
|
|
||||||
$betGold = Util::getPost('amount', 'int', 0);
|
|
||||||
|
|
||||||
|
|
||||||
if($betTarget < 0 || $betTarget >= 16 || $betGold < 10 || $betGold > 1000){
|
|
||||||
Json::die([
|
|
||||||
'result'=>false,
|
|
||||||
'reason'=>'올바르지 않은 입력입니다'
|
|
||||||
]);
|
|
||||||
}
|
|
||||||
|
|
||||||
//로그인 검사
|
|
||||||
$session = Session::requireGameLogin()->setReadOnly();
|
|
||||||
$userID = Session::getUserID();
|
|
||||||
$generalID = $session->generalID;
|
|
||||||
|
|
||||||
$db = DB::db();
|
|
||||||
$gameStor = KVStorage::getStorage($db, 'game_env');
|
|
||||||
|
|
||||||
increaseRefresh("베팅", 1);
|
|
||||||
|
|
||||||
$tournament = $gameStor->tournament;
|
|
||||||
if($tournament != 6) {
|
|
||||||
Json::die([
|
|
||||||
'result'=>false,
|
|
||||||
'reason'=>'베팅 기간이 아닙니다.'
|
|
||||||
]);
|
|
||||||
}
|
|
||||||
|
|
||||||
$myGold = $db->queryFirstField('SELECT gold FROM general WHERE no = %i', $generalID);
|
|
||||||
$bets = $db->queryFirstList('SELECT * FROM betting WHERE general_id = %i', $generalID);
|
|
||||||
$bets = array_splice($bets, -16);
|
|
||||||
$totalBet = array_sum($bets);
|
|
||||||
$oldBet = $bets[$betTarget];
|
|
||||||
|
|
||||||
$targetKey = "bet{$betTarget}";
|
|
||||||
|
|
||||||
if($myGold - $betGold < 500){
|
|
||||||
Json::die([
|
|
||||||
'result'=>false,
|
|
||||||
'reason'=>'여유 자금이 부족합니다.'
|
|
||||||
]);
|
|
||||||
}
|
|
||||||
|
|
||||||
if($betGold + $totalBet > 1000){
|
|
||||||
Json::die([
|
|
||||||
'result'=>false,
|
|
||||||
'reason'=>'베팅 허용 금액을 초과했습니다.'
|
|
||||||
]);
|
|
||||||
}
|
|
||||||
|
|
||||||
$db->update('betting', [
|
|
||||||
$targetKey=>$db->sqleval('%b + %i', $targetKey, $betGold),
|
|
||||||
], 'general_id = %i', $generalID);
|
|
||||||
$db->update('general', [
|
|
||||||
'gold'=>$db->sqleval('gold - %i', $betGold),
|
|
||||||
], 'no = %i', $generalID);
|
|
||||||
$db->update('rank_data', [
|
|
||||||
'value'=>$db->sqleval('value + %i', $betGold)
|
|
||||||
], 'general_id = %i AND type = "betgold"', $generalID);
|
|
||||||
$db->update('betting', [
|
|
||||||
$targetKey=>$db->sqleval('%b + %i', $targetKey, $betGold)
|
|
||||||
], 'general_id = 0');
|
|
||||||
|
|
||||||
Json::die([
|
|
||||||
'result'=>true,
|
|
||||||
'reason'=>'SUCCESS'
|
|
||||||
]);
|
|
||||||
+32
-16
@@ -10,9 +10,10 @@ class Betting
|
|||||||
|
|
||||||
private BettingInfo $info;
|
private BettingInfo $info;
|
||||||
|
|
||||||
public CONST LAST_BETTING_ID_KEY = 'last_betting_id';
|
public const LAST_BETTING_ID_KEY = 'last_betting_id';
|
||||||
|
|
||||||
static public function genNextBettingID(): int{
|
static public function genNextBettingID(): int
|
||||||
|
{
|
||||||
$db = DB::db();
|
$db = DB::db();
|
||||||
|
|
||||||
$gameStor = KVStorage::getStorage($db, 'game_env');
|
$gameStor = KVStorage::getStorage($db, 'game_env');
|
||||||
@@ -24,7 +25,8 @@ class Betting
|
|||||||
return $bettingID;
|
return $bettingID;
|
||||||
}
|
}
|
||||||
|
|
||||||
static public function openBetting(BettingInfo $info){
|
static public function openBetting(BettingInfo $info)
|
||||||
|
{
|
||||||
$db = DB::db();
|
$db = DB::db();
|
||||||
$bettingID = $info->id;
|
$bettingID = $info->id;
|
||||||
$bettingStor = KVStorage::getStorage($db, 'betting');
|
$bettingStor = KVStorage::getStorage($db, 'betting');
|
||||||
@@ -47,7 +49,7 @@ class Betting
|
|||||||
return Json::encode($bettingType);
|
return Json::encode($bettingType);
|
||||||
}
|
}
|
||||||
|
|
||||||
public function purifyBettingKey(array $bettingType, bool $ignoreOver = false): array
|
public function purifyBettingKey(array $bettingType, bool $noValidate = false): array
|
||||||
{
|
{
|
||||||
$selectCnt = $this->info->selectCnt;
|
$selectCnt = $this->info->selectCnt;
|
||||||
sort($bettingType, SORT_NUMERIC);
|
sort($bettingType, SORT_NUMERIC);
|
||||||
@@ -56,17 +58,30 @@ class Betting
|
|||||||
throw new \InvalidArgumentException('중복된 값이 있습니다.');
|
throw new \InvalidArgumentException('중복된 값이 있습니다.');
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($bettingType[0] < 0) {
|
if (!$noValidate) {
|
||||||
throw new \InvalidArgumentException('올바르지 않은 값이 있습니다.(0 미만)' . print_r($bettingType, true));
|
foreach($bettingType as $bettingKey){
|
||||||
}
|
if(!key_exists($bettingKey, $this->info->candidates)){
|
||||||
|
throw new \InvalidArgumentException('올바른 후보가 아닙니다.' . print_r($bettingType, true));
|
||||||
if (!$ignoreOver && Util::array_last($bettingType) >= count($this->info->candidates)) {
|
}
|
||||||
throw new \InvalidArgumentException('올바르지 않은 값이 있습니다.(초과)' . print_r($bettingType, true));
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return $bettingType;
|
return $bettingType;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function closeBetting(): void
|
||||||
|
{
|
||||||
|
$db = DB::db();
|
||||||
|
$bettingStor = KVStorage::getStorage($db, 'betting');
|
||||||
|
$bettingID = $this->info->id;
|
||||||
|
$gameStor = KVStorage::getStorage($db, 'game_env');
|
||||||
|
|
||||||
|
//XXX: 베팅 종료 시점을 '현재 연월'로 하여 강제로 닫는다.
|
||||||
|
[$year, $month] = $gameStor->getValuesAsArray(['year', 'month']);
|
||||||
|
$this->info->closeYearMonth = Util::joinYearMonth($year, $month);
|
||||||
|
$bettingStor->setValue("id_{$bettingID}", $this->info->toArray());
|
||||||
|
}
|
||||||
|
|
||||||
public function convertBettingKey(array $bettingType): string
|
public function convertBettingKey(array $bettingType): string
|
||||||
{
|
{
|
||||||
$bettingType = $this->purifyBettingKey($bettingType);
|
$bettingType = $this->purifyBettingKey($bettingType);
|
||||||
@@ -78,7 +93,8 @@ class Betting
|
|||||||
return $this->info;
|
return $this->info;
|
||||||
}
|
}
|
||||||
|
|
||||||
public function bet(int $generalID, ?int $userID, array $bettingType, int $amount): void{
|
public function bet(int $generalID, ?int $userID, array $bettingType, int $amount): void
|
||||||
|
{
|
||||||
$bettingInfo = $this->info;
|
$bettingInfo = $this->info;
|
||||||
|
|
||||||
if ($bettingInfo->finished) {
|
if ($bettingInfo->finished) {
|
||||||
@@ -107,6 +123,7 @@ class Betting
|
|||||||
throw new \RuntimeException('필요한 선택 수를 채우지 못했습니다.');
|
throw new \RuntimeException('필요한 선택 수를 채우지 못했습니다.');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$resKey = $this->info->reqInheritancePoint?'유산포인트':'금';
|
||||||
$bettingTypeKey = $this->convertBettingKey($bettingType);
|
$bettingTypeKey = $this->convertBettingKey($bettingType);
|
||||||
|
|
||||||
$inheritStor = KVStorage::getStorage($db, "inheritance_{$userID}");
|
$inheritStor = KVStorage::getStorage($db, "inheritance_{$userID}");
|
||||||
@@ -114,7 +131,7 @@ class Betting
|
|||||||
$prevBetAmount = $db->queryFirstField('SELECT sum(amount) FROM ng_betting WHERE betting_id = %i AND user_id = %i', $this->bettingID, $userID) ?? 0;
|
$prevBetAmount = $db->queryFirstField('SELECT sum(amount) FROM ng_betting WHERE betting_id = %i AND user_id = %i', $this->bettingID, $userID) ?? 0;
|
||||||
|
|
||||||
if ($prevBetAmount + $amount > 1000) {
|
if ($prevBetAmount + $amount > 1000) {
|
||||||
throw new \RuntimeException((1000 - $prevBetAmount) . ' 포인트까지만 베팅 가능합니다.');
|
throw new \RuntimeException((1000 - $prevBetAmount) . $resKey.'까지만 베팅 가능합니다.');
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($bettingInfo->reqInheritancePoint) {
|
if ($bettingInfo->reqInheritancePoint) {
|
||||||
@@ -287,8 +304,8 @@ class Betting
|
|||||||
|
|
||||||
//남은 상금은 '당첨자'에게 몰아준다.
|
//남은 상금은 '당첨자'에게 몰아준다.
|
||||||
//당첨자가 아무도 없다면, 0개 맞춘 그룹에게 돌아간다.
|
//당첨자가 아무도 없다면, 0개 맞춘 그룹에게 돌아간다.
|
||||||
if($rewardAmount){
|
if ($rewardAmount) {
|
||||||
foreach(Util::range($selectCnt, -1, -1) as $matchPoint){
|
foreach (Util::range($selectCnt, -1, -1) as $matchPoint) {
|
||||||
if (!key_exists($matchPoint, $rewardAmount)) {
|
if (!key_exists($matchPoint, $rewardAmount)) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
@@ -338,7 +355,7 @@ class Betting
|
|||||||
$previousPoint = ($inheritStor->getValue('previous') ?? [0, 0])[0];
|
$previousPoint = ($inheritStor->getValue('previous') ?? [0, 0])[0];
|
||||||
$nextPoint = $previousPoint + $amount;
|
$nextPoint = $previousPoint + $amount;
|
||||||
$inheritStor->setValue('previous', [$nextPoint, 0]);
|
$inheritStor->setValue('previous', [$nextPoint, 0]);
|
||||||
$inheritStor->invalidateCacheValue('previous');//XXX: 실제로는 previous 값을 사용할 수 없도록 락을 걸어야 한다.
|
$inheritStor->invalidateCacheValue('previous'); //XXX: 실제로는 previous 값을 사용할 수 없도록 락을 걸어야 한다.
|
||||||
|
|
||||||
$amountText = number_format($amount);
|
$amountText = number_format($amount);
|
||||||
$previousPointText = number_format($previousPoint);
|
$previousPointText = number_format($previousPoint);
|
||||||
@@ -368,7 +385,6 @@ class Betting
|
|||||||
foreach ($loggers as $userLogger) {
|
foreach ($loggers as $userLogger) {
|
||||||
$userLogger->flush();
|
$userLogger->flush();
|
||||||
}
|
}
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
$generalList = General::createGeneralObjListFromDB(array_unique(Util::squeezeFromArray($rewardList, 'generalID')), ['gold', 'npc'], 1);
|
$generalList = General::createGeneralObjListFromDB(array_unique(Util::squeezeFromArray($rewardList, 'generalID')), ['gold', 'npc'], 1);
|
||||||
foreach ($rewardList as $rewardItem) {
|
foreach ($rewardList as $rewardItem) {
|
||||||
|
|||||||
@@ -196,6 +196,16 @@ class ResetHelper{
|
|||||||
'plock'=>1,
|
'plock'=>1,
|
||||||
'locktime'=>TimeUtil::now(true)
|
'locktime'=>TimeUtil::now(true)
|
||||||
]);
|
]);
|
||||||
|
$db->insert('plock', [
|
||||||
|
'type'=>'TOURNAMENT',
|
||||||
|
'plock'=>1,
|
||||||
|
'locktime'=>TimeUtil::now(true)
|
||||||
|
]);
|
||||||
|
$db->insert('plock', [
|
||||||
|
'type'=>'ETC',
|
||||||
|
'plock'=>1,
|
||||||
|
'locktime'=>TimeUtil::now(true)
|
||||||
|
]);
|
||||||
|
|
||||||
$prevWinner = $db->queryFirstField('SELECT l12name FROM emperior ORDER BY `no` DESC LIMIT 1');
|
$prevWinner = $db->queryFirstField('SELECT l12name FROM emperior ORDER BY `no` DESC LIMIT 1');
|
||||||
$serverCnt = $db->queryFirstField('SELECT count(*) FROM ng_games') + 1;
|
$serverCnt = $db->queryFirstField('SELECT count(*) FROM ng_games') + 1;
|
||||||
|
|||||||
+13
-23
@@ -4,39 +4,29 @@ import { setAxiosXMLHttpRequest } from '@util/setAxiosXMLHttpRequest';
|
|||||||
import type { InvalidResponse } from '@/defs';
|
import type { InvalidResponse } from '@/defs';
|
||||||
import { convertFormData } from '@util/convertFormData';
|
import { convertFormData } from '@util/convertFormData';
|
||||||
import { unwrap_any } from '@util/unwrap_any';
|
import { unwrap_any } from '@util/unwrap_any';
|
||||||
|
import { SammoAPI } from './SammoAPI';
|
||||||
|
|
||||||
$(function($){
|
declare const staticValues: {
|
||||||
setAxiosXMLHttpRequest();
|
bettingID: number;
|
||||||
|
}
|
||||||
|
|
||||||
$('.submitBtn').on('click', async function(e){
|
$(function ($) {
|
||||||
|
$('.submitBtn').on('click', async function (e) {
|
||||||
e.preventDefault();
|
e.preventDefault();
|
||||||
|
|
||||||
const $this = $(this);
|
const $this = $(this);
|
||||||
const target = parseInt($this.data('target'));
|
const target = parseInt($this.data('target'));
|
||||||
const amount = parseInt(unwrap_any<string>($(`#target_${target}`).val()));
|
const amount = parseInt(unwrap_any<string>($(`#target_${target}`).val()));
|
||||||
|
|
||||||
let result: InvalidResponse;
|
try {
|
||||||
|
await SammoAPI.Betting.Bet({
|
||||||
try{
|
bettingID: staticValues.bettingID,
|
||||||
const response = await axios({
|
bettingType: [target],
|
||||||
url: 'j_betting.php',
|
amount: amount,
|
||||||
responseType: 'json',
|
|
||||||
method: 'post',
|
|
||||||
data: convertFormData({
|
|
||||||
target: target,
|
|
||||||
amount: amount
|
|
||||||
})
|
|
||||||
});
|
});
|
||||||
result = response.data;
|
} catch (e) {
|
||||||
}catch(e){
|
|
||||||
console.error(e);
|
console.error(e);
|
||||||
alert(`에러: ${e}`);
|
alert(`베팅을 실패했습니다: ${e}`);
|
||||||
location.reload();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if(!result.result){
|
|
||||||
alert(`베팅을 실패했습니다: ${result.reason}`);
|
|
||||||
location.reload();
|
location.reload();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -278,7 +278,7 @@ class Session
|
|||||||
|
|
||||||
$deadTime = $nextTurn + $general['killturn'] * $turnterm;
|
$deadTime = $nextTurn + $general['killturn'] * $turnterm;
|
||||||
if ($deadTime < $now && !$isUnited) {
|
if ($deadTime < $now && !$isUnited) {
|
||||||
$locked = $db->queryFirstField('SELECT plock FROM plock LIMIT 1');
|
$locked = $db->queryFirstField('SELECT plock FROM plock WHERE `type` = "GAME" LIMIT 1');
|
||||||
if (!$locked) {
|
if (!$locked) {
|
||||||
if ($result !== null) {
|
if ($result !== null) {
|
||||||
$result = false;
|
$result = false;
|
||||||
|
|||||||
Reference in New Issue
Block a user