feat,wip: 기존 거래장 코드 정리
This commit is contained in:
+2
-2
@@ -52,7 +52,7 @@ switch ($btn) {
|
||||
], true);
|
||||
$db->update('ng_auction', [
|
||||
'close_date' => $db->sqleval('DATE_SUB(close_date, INTERVAL %i MINUTE)', $minute)
|
||||
], true);
|
||||
], 'finished = 0');
|
||||
if ($locked) {
|
||||
unlock();
|
||||
}
|
||||
@@ -80,7 +80,7 @@ switch ($btn) {
|
||||
], true);
|
||||
$db->update('ng_auction', [
|
||||
'close_date' => $db->sqleval('DATE_ADD(close_date, INTERVAL %i MINUTE)', $minute)
|
||||
], true);
|
||||
], 'finished = 0');
|
||||
if ($locked) {
|
||||
unlock();
|
||||
}
|
||||
|
||||
@@ -1,306 +0,0 @@
|
||||
<?php
|
||||
|
||||
namespace sammo;
|
||||
|
||||
include "lib.php";
|
||||
include "func.php";
|
||||
|
||||
$msg = Util::getReq('msg');
|
||||
$msg2 = Util::getReq('msg2');
|
||||
|
||||
//로그인 검사
|
||||
$session = Session::requireGameLogin()->setReadOnly();
|
||||
$userID = Session::getUserID();
|
||||
|
||||
$db = DB::db();
|
||||
$gameStor = KVStorage::getStorage($db, 'game_env');
|
||||
|
||||
increaseRefresh("거래장", 2);
|
||||
|
||||
$me = $db->queryFirstRow('SELECT no,special,con,turntime from general where owner=%i', $userID);
|
||||
|
||||
$con = checkLimit($me['con']);
|
||||
if ($con >= 2) {
|
||||
printLimitMsg($me['turntime']);
|
||||
exit();
|
||||
}
|
||||
|
||||
$tradeCount = $db->queryFirstField('SELECT count(no) FROM auction WHERE no1=%i', $me['no']);
|
||||
$bidCount = $db->queryFirstField('SELECT count(no) FROM auction where no2=%i', $me['no']);
|
||||
|
||||
$btCount = $tradeCount + $bidCount;
|
||||
|
||||
if ($session->userGrade >= 5 || $btCount < 1) {
|
||||
$btn = "submit";
|
||||
} else {
|
||||
$btn = "hidden";
|
||||
}
|
||||
|
||||
if ($msg == "") {
|
||||
$msg = "-";
|
||||
}
|
||||
if ($msg2 == "") {
|
||||
$msg2 = "-";
|
||||
}
|
||||
?>
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
|
||||
<head>
|
||||
<title><?= UniqueConst::$serverName ?>: 거래장</title>
|
||||
<meta charset="UTF-8">
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
||||
<meta name="viewport" content="width=1024" />
|
||||
<?= WebUtil::printJS('../d_shared/common_path.js') ?>
|
||||
<?= 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" />
|
||||
<?= WebUtil::printDist('ts', ['common']) ?>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<table align=center width=1000 class='tb_layout bg0'>
|
||||
<tr>
|
||||
<td>거 래 장<br><?= closeButton() ?></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td align=center class='bg2'>
|
||||
<font color=orange size=6><b>거 래 장</b></font><input type=button value='갱신' onclick="location.replace('b_auction.php')">
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
<table align=center width=1000 class='tb_layout bg0'>
|
||||
<form method=post action=c_auction.php>
|
||||
<tr>
|
||||
<td colspan=11 align=center bgcolor=orange>
|
||||
<font size=5>팝 니 다</font>
|
||||
</td>
|
||||
</tr>
|
||||
<tr align=center class='bg1'>
|
||||
<td width=68>거래번호</td>
|
||||
<td width=48>선택</td>
|
||||
<td width=98>판매자</td>
|
||||
<td width=118>물품</td>
|
||||
<td width=88>수량</td>
|
||||
<td width=88>시작판매가</td>
|
||||
<td width=88>현재판매가</td>
|
||||
<td width=88>즉시판매가</td>
|
||||
<td width=48>단가</td>
|
||||
<td width=98>구매 예정자</td>
|
||||
<td width=148>거래종료</td>
|
||||
</tr>
|
||||
<?php
|
||||
$chk = 0;
|
||||
foreach ($db->query('SELECT * from auction where type=0 order by expire') as $auction) {
|
||||
$radio = "";
|
||||
$alert = "";
|
||||
$alert2 = "";
|
||||
if ($auction['no1'] == $me['no']) {
|
||||
$radio = " disabled";
|
||||
} elseif ($auction['no2'] > 0 && $auction['amount'] * 2 <= $auction['value']) {
|
||||
$radio = " disabled";
|
||||
$alert = "<font color=red>";
|
||||
$alert2 = "</font>";
|
||||
} elseif ($auction['no2'] > 0 && $auction['topv'] <= $auction['value']) {
|
||||
$radio = " disabled";
|
||||
$alert = "<font color=red>";
|
||||
$alert2 = "</font>";
|
||||
} elseif ($chk == 0) {
|
||||
$radio = " checked";
|
||||
$chk = 1;
|
||||
}
|
||||
$pv = round($auction['value'] * 100 / $auction['amount']) / 100 + 0.001;
|
||||
$pv = substr((string)$pv, 0, 4);
|
||||
|
||||
echo "
|
||||
<tr align=center>
|
||||
<td>{$auction['no']}</td>
|
||||
<td><input type=radio name=sel value={$auction['no']}{$radio}></td>
|
||||
<td>{$auction['name1']}</td>
|
||||
<td>쌀</td>
|
||||
<td>{$auction['amount']}</td>
|
||||
<td>금 {$auction['cost']}</td>
|
||||
<td>{$alert}금 {$auction['value']}{$alert2}</td>
|
||||
<td>{$alert}금 {$auction['topv']}{$alert2}</td>
|
||||
<td>{$alert}{$pv}{$alert2}</td>
|
||||
<td>{$alert}{$auction['name2']}{$alert2}</td>
|
||||
<td>{$auction['expire']}</td>
|
||||
</tr>
|
||||
";
|
||||
}
|
||||
?>
|
||||
<tr height=25>
|
||||
<td align=center class='bg1'>등록결과</td>
|
||||
<td colspan=10><?= ConvertLog($msg) ?></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td align=center class='bg1'>입찰등록</td>
|
||||
<td colspan=10>
|
||||
지불할 금액: <input type=text style=color:white;background-color:black; size=6 maxlength=6 name=value>
|
||||
<input type=<?= $btn ?> name=btn value='구매시도' onclick='return confirm("정말 입찰하시겠습니까?");'>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td align=center class='bg1'>거래등록</td>
|
||||
<td colspan=10>
|
||||
종료: <input type=text style=color:white;background-color:black; size=2 maxlength=2 name=term value=12>턴 후
|
||||
물품: 쌀
|
||||
판매량: <input type=text style=color:white;background-color:black; size=5 maxlength=5 name=amount value=1000>
|
||||
시작가: <input type=text style=color:white;background-color:black; size=5 maxlength=5 name=cost value=500>
|
||||
즉구가: <input type=text style=color:white;background-color:black; size=5 maxlength=5 name=topv value=2000>
|
||||
<input type=<?= $btn ?> name=btn value='판매' onclick='return confirm("정말 판매하시겠습니까?");'>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td colspan=11>
|
||||
ㆍ<font color=cyan>Hint</font>) 거래자가 판매(물품 판매, 금 수령), 입찰자가 구매(물품 구입, 금 지불).<br>
|
||||
ㆍ<font color=cyan>Hint</font>) 단가가 1.00보다 높을수록 판매자 유리.<br>
|
||||
ㆍ<font color=cyan>Hint</font>) 단가가 1.00보다 낮을수록 입찰자 유리.<br>
|
||||
</td>
|
||||
</tr>
|
||||
</form>
|
||||
</table>
|
||||
<br>
|
||||
<table align=center width=1000 class='tb_layout bg0'>
|
||||
<form method=post action=c_auction.php>
|
||||
<tr>
|
||||
<td colspan=11 align=center bgcolor=skyblue>
|
||||
<font size=5>삽 니 다</font>
|
||||
</td>
|
||||
</tr>
|
||||
<tr align=center class='bg1'>
|
||||
<td width=68>거래번호</td>
|
||||
<td width=48>선택</td>
|
||||
<td width=98>구매자</td>
|
||||
<td width=118>물품</td>
|
||||
<td width=88>수량</td>
|
||||
<td width=88>시작구매가</td>
|
||||
<td width=88>현재구매가</td>
|
||||
<td width=88>즉시구매가</td>
|
||||
<td width=48>단가</td>
|
||||
<td width=98>판매 예정자</td>
|
||||
<td width=148>거래종료</td>
|
||||
</tr>
|
||||
<?php
|
||||
$chk = 0;
|
||||
foreach ($db->query('SELECT * from auction where type=1 order by expire') as $auction) {
|
||||
$radio = "";
|
||||
$alert = "";
|
||||
$alert2 = "";
|
||||
if ($auction['no1'] == $me['no']) {
|
||||
$radio = " disabled";
|
||||
} elseif ($auction['no2'] > 0 && $auction['amount'] >= $auction['value'] * 2) {
|
||||
$radio = " disabled";
|
||||
$alert = "<font color=red>";
|
||||
$alert2 = "</font>";
|
||||
} elseif ($auction['no2'] > 0 && $auction['topv'] >= $auction['value']) {
|
||||
$radio = " disabled";
|
||||
$alert = "<font color=red>";
|
||||
$alert2 = "</font>";
|
||||
} elseif ($chk == 0) {
|
||||
$radio = " checked";
|
||||
$chk = 1;
|
||||
}
|
||||
$pv = round($auction['value'] * 100 / $auction['amount']) / 100 + 0.001;
|
||||
$pv = substr((string)$pv, 0, 4);
|
||||
echo "
|
||||
<tr align=center>
|
||||
<td>{$auction['no']}</td>
|
||||
<td><input type=radio name=sel value={$auction['no']}{$radio}></td>
|
||||
<td>{$auction['name1']}</td>
|
||||
<td>쌀</td>
|
||||
<td>{$auction['amount']}</td>
|
||||
<td>금 {$auction['cost']}</td>
|
||||
<td>{$alert}금 {$auction['value']}{$alert2}</td>
|
||||
<td>{$alert}금 {$auction['topv']}{$alert2}</td>
|
||||
<td>{$alert}{$pv}{$alert2}</td>
|
||||
<td>{$alert}{$auction['name2']}{$alert2}</td>
|
||||
<td>{$auction['expire']}</td>
|
||||
</tr>
|
||||
";
|
||||
}
|
||||
?>
|
||||
<tr height=25>
|
||||
<td align=center class='bg1'>등록결과</td>
|
||||
<td colspan=10><?= ConvertLog($msg2) ?></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td align=center class='bg1'>입찰등록</td>
|
||||
<td colspan=10>
|
||||
수령할 금액: <input type=text style=color:white;background-color:black; size=6 maxlength=6 name=value>
|
||||
<input type=<?= $btn ?> name=btn value='판매시도' onclick='return confirm("정말 입찰하시겠습니까?");'>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td align=center class='bg1'>거래등록</td>
|
||||
<td colspan=10>
|
||||
종료: <input type=text style=color:white;background-color:black; size=2 maxlength=2 name=term value=12>턴 후
|
||||
물품: 쌀
|
||||
구입량: <input type=text style=color:white;background-color:black; size=5 maxlength=5 name=amount value=1000>
|
||||
시작가: <input type=text style=color:white;background-color:black; size=5 maxlength=5 name=cost value=2000>
|
||||
즉구가: <input type=text style=color:white;background-color:black; size=5 maxlength=5 name=topv value=500>
|
||||
<input type=<?= $btn ?> name=btn value='구매' onclick='return confirm("정말 구매하시겠습니까?");'>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td colspan=11>
|
||||
ㆍ<font color=cyan>Hint</font>) 거래자가 구매(물품 구매, 금 지불), 입찰자가 판매(물품 판매, 금 수령).<br>
|
||||
ㆍ<font color=cyan>Hint</font>) 단가가 1.00보다 낮을수록 구매자 유리.<br>
|
||||
ㆍ<font color=cyan>Hint</font>) 단가가 1.00보다 높을수록 입찰자 유리.<br>
|
||||
</td>
|
||||
</tr>
|
||||
</form>
|
||||
</table>
|
||||
<br>
|
||||
<table align=center width=1000 class='tb_layout bg0'>
|
||||
<tr>
|
||||
<td align=center class='bg2'>
|
||||
<font size=5>최 근 기 록</font>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<?= getAuctionLogRecent(20) ?>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td align=center class='bg2'>
|
||||
<font size=5>도 움 말</font>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<font color=white size=2>
|
||||
ㆍ판매거래는 거래자가 판매할 물품을 거래하면, 구입을 희망하는 사람이 현재가보다 높게 입찰하여 구입하는 방식입니다.<br>
|
||||
ㆍ<font color=cyan>Hint</font>) 쌀이 귀한 경우는 입찰자가 많아서 자연스레 단가가 오르게 됩니다. (해당 물품을 사려는 가격이 오름)<br>
|
||||
ㆍ<font color=cyan>Hint</font>) 쌀이 흔한 경우는 초기 가격을 낮게 책정해야 판매가 가능할 겁니다.<br>
|
||||
ㆍ구매거래는 거래자가 구입할 물품을 거래하면, 판매를 희망하는 사람이 현재가보다 낮게 입찰하여 판매하는 방식입니다.<br>
|
||||
ㆍ<font color=cyan>Hint</font>) 쌀이 흔한 경우는 입찰자가 많아서 자연스레 단가가 내리게 됩니다. (해당 물품을 팔려는 가격이 내림)<br>
|
||||
ㆍ<font color=cyan>Hint</font>) 쌀이 귀한 경우는 초기 가격을 높게 책정해야 구입이 가능할 겁니다.<br>
|
||||
ㆍ마감임박때 입찰하는 경우 입찰후 1턴 후로 종료시간이 연장됩니다.<br>
|
||||
ㆍ즉시구매가로 입찰하는 경우 입찰후 1턴 후로 종료시간이 결정됩니다.<br>
|
||||
ㆍ악용 방지를 위해 50% ~ 200%의 가격에서 거래시작이 가능합니다.<br>
|
||||
ㆍ악용 방지를 위해 즉시판매가는 110% 이상, 즉시구매가는 90% 이하의 시세로 가능합니다.<br>
|
||||
ㆍ악용 방지를 위해 즉시판매가는 시작판매가의 110% 이상, 즉시구매가는 시작구매가의 90% 이하로 가능합니다.<br>
|
||||
ㆍ1인당 도합 1건의 거래와 입찰이 가능합니다.<br>
|
||||
ㆍ기본금쌀 1000은 거래에 사용되지 못합니다.<br>
|
||||
ㆍ유찰될 때는 거래 과실자에게 거래금의 1%가 벌금으로 부과됩니다.<br>
|
||||
ㆍ<font color=magenta>10단위로 거래가 가능합니다. 1자리는 반올림 처리 됩니다.</font><br>
|
||||
ㆍ<font color=red>★ 최고가 거래 ★</font> 혹은 <font color=red>★ 최저가 거래 ★</font> 는 암거래 및 악용의 가능성이니 감시 부탁드립니다.<br>
|
||||
ㆍ거래와 입찰은 취소가 불가능하니 주의하세요!<br>
|
||||
ㆍ<font color=cyan>Hint</font>) 단가는 금/쌀로 쌀1을 거래하기 위한 금의 양입니다.<br>
|
||||
ㆍ<font color=cyan>Hint</font>) 단가가 높으면(>1.00) 쌀이 비싸므로 판매가 이득입니다.<br>
|
||||
ㆍ<font color=cyan>Hint</font>) 단가가 낮으면(<1.00) 금이 비싸므로 구매가 이득입니다.<br>
|
||||
ㆍ즐거운 거래!
|
||||
</font>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><?= closeButton() ?></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><?= banner() ?> </td>
|
||||
</tr>
|
||||
</table>
|
||||
</body>
|
||||
|
||||
</html>
|
||||
@@ -1,247 +0,0 @@
|
||||
<?php
|
||||
namespace sammo;
|
||||
|
||||
include "lib.php";
|
||||
include "func.php";
|
||||
|
||||
$v = new Validator($_POST + $_GET);
|
||||
$v->rule('integer', [
|
||||
'amount',
|
||||
'cost',
|
||||
'topv',
|
||||
'value',
|
||||
'term',
|
||||
'sel'
|
||||
]);
|
||||
|
||||
$btn = Util::getPost('btn');
|
||||
$amount = Util::getPost('amount', 'int');
|
||||
$cost = Util::getPost('cost', 'int');
|
||||
$topv = Util::getPost('topv', 'int');
|
||||
$value = Util::getPost('value', 'int');
|
||||
$term = Util::getPost('term', 'int');
|
||||
$sel = Util::getPost('sel', 'int');
|
||||
|
||||
$msg = '';
|
||||
$msg2 = '';
|
||||
|
||||
|
||||
//로그인 검사
|
||||
$session = Session::requireGameLogin()->setReadOnly();
|
||||
$userID = Session::getUserID();
|
||||
|
||||
$db = DB::db();
|
||||
$gameStor = KVStorage::getStorage($db, 'game_env');
|
||||
|
||||
increaseRefresh("입찰", 1);
|
||||
|
||||
$turnterm = $gameStor->turnterm;
|
||||
|
||||
$me = $db->queryFirstRow('SELECT no,name,gold,rice,special from general where owner=%i', $userID);
|
||||
|
||||
$tradeCount = $db->queryFirstField('SELECT count(no) FROM auction WHERE no1=%i', $me['no']);
|
||||
$bidCount = $db->queryFirstField('SELECT count(no) FROM auction WHERE no2=%i', $me['no']);
|
||||
|
||||
$btCount = $tradeCount + $bidCount;
|
||||
|
||||
$unit = $turnterm * 60;
|
||||
|
||||
$amount = Util::round($amount, -1);
|
||||
$cost = Util::round($cost, -1);
|
||||
$topv = Util::round($topv, -1);
|
||||
$value = Util::round($value, -1);
|
||||
if ($term > 24) {
|
||||
$term = 24;
|
||||
}
|
||||
|
||||
$valid = 1;
|
||||
if ($session->userGrade >= 5 || $btCount < 1) {
|
||||
} else {
|
||||
$msg = "ㆍ<span class='ev_warning'>더이상 등록할 수 없습니다.</span>";
|
||||
$msg2 = "ㆍ<span class='ev_warning'>더이상 등록할 수 없습니다.</span>";
|
||||
$valid = 0;
|
||||
$btn = "hidden";
|
||||
}
|
||||
|
||||
if ($btn == "판매") {
|
||||
if ($term < 0 || $term > 24) {
|
||||
$msg = "ㆍ<span class='ev_warning'>종료기한은 1 ~ 24 턴 이어야 합니다.</span>";
|
||||
$valid = 0;
|
||||
}
|
||||
if ($amount < 100 || $amount > 10000) {
|
||||
$msg = "ㆍ<span class='ev_warning'>거래량은 100 ~ 10000 이어야 합니다.</span>";
|
||||
$valid = 0;
|
||||
}
|
||||
if ($cost > $amount * 2 || $cost * 2 < $amount) {
|
||||
$msg = "ㆍ<span class='ev_warning'>시작판매가는 50% ~ 200% 이어야 합니다.</span>";
|
||||
$valid = 0;
|
||||
}
|
||||
if ($topv * 10 < $amount * 11 || $topv > $amount * 2) {
|
||||
$msg = "ㆍ<span class='ev_warning'>즉시판매가는 110% ~ 200% 이어야 합니다.</span>";
|
||||
$valid = 0;
|
||||
}
|
||||
if ($topv * 10 < $cost * 11) {
|
||||
$msg = "ㆍ<span class='ev_warning'>즉시판매가는 시작판매가의 110% 이상이어야 합니다.</span>";
|
||||
$valid = 0;
|
||||
}
|
||||
if ($amount > $me['rice'] - GameConst::$defaultRice) {
|
||||
$msg = "ㆍ<span class='ev_warning'>기본 군량 ".GameConst::$defaultRice."은 거래할 수 없습니다.</span>";
|
||||
$valid = 0;
|
||||
}
|
||||
if ($valid == 1) {
|
||||
$msg = "ㆍ<span class='ev_success'>등록 성공.</span>";
|
||||
$date = date("Y-m-d H:i:s", strtotime(date("Y-m-d H:i:s")) + $unit * $term);
|
||||
$db->insert('auction', [
|
||||
'type'=>0,
|
||||
'no1'=>$me['no'],
|
||||
'name1'=>$me['name'],
|
||||
'amount'=>$amount,
|
||||
'cost'=>$cost,
|
||||
'value'=>$cost,
|
||||
'topv'=>$topv,
|
||||
'expire'=>$date
|
||||
]);
|
||||
}
|
||||
} elseif ($btn == "구매시도") {
|
||||
$auction = $db->queryFirstRow('SELECT no2,value,topv,expire,amount FROM auction WHERE no=%i LIMIT 1', $sel);
|
||||
|
||||
if ($value == $auction['topv']) {
|
||||
$valid = 2;
|
||||
}
|
||||
if (!$auction) {
|
||||
$msg = "ㆍ<span class='ev_warning'>종료된 거래입니다.</span>";
|
||||
$valid = 0;
|
||||
}
|
||||
if ($auction['no2'] > 0 && $value <= $auction['value']) {
|
||||
$msg = "ㆍ<span class='ev_warning'>현재판매가보다 높게 입찰해야 합니다.</span>";
|
||||
$valid = 0;
|
||||
}
|
||||
if ($value < $auction['value']) {
|
||||
$msg = "ㆍ<span class='ev_warning'>현재판매가보다 높게 입찰해야 합니다.</span>";
|
||||
$valid = 0;
|
||||
}
|
||||
if ($value > $auction['topv']) {
|
||||
$msg = "ㆍ<span class='ev_warning'>즉시판매가보다 높을 수 없습니다.</span>";
|
||||
$valid = 0;
|
||||
}
|
||||
if ($value > $me['gold'] - GameConst::$defaultGold) {
|
||||
$msg = "ㆍ<span class='ev_warning'>기본 자금 ".GameConst::$defaultGold."은 거래할 수 없습니다.</span>";
|
||||
$valid = 0;
|
||||
}
|
||||
if ($valid == 1) {
|
||||
$msg = "ㆍ<span class='ev_success'>입찰 성공.</span> 거래완료는 빨라도 현재로부터 1턴 뒤입니다.";
|
||||
$date = date("Y-m-d H:i:s", strtotime(date("Y-m-d H:i:s")) + $unit);
|
||||
if ($auction['expire'] > $date) {
|
||||
$date = $auction['expire'];
|
||||
}
|
||||
|
||||
$db->update('auction', [
|
||||
'value'=>$value,
|
||||
'no2'=>$me['no'],
|
||||
'name2'=>$me['name'],
|
||||
'expire'=>$date,
|
||||
], 'no=%i', $sel);
|
||||
} elseif ($valid == 2) {
|
||||
$msg = "ㆍ<span class='ev_success'>즉시판매 성공.</span> 거래완료는 빨라도 현재로부터 1턴 뒤입니다.";
|
||||
$date = date("Y-m-d H:i:s", strtotime(date("Y-m-d H:i:s")) + $unit);
|
||||
|
||||
$db->update('auction', [
|
||||
'value'=>$value,
|
||||
'no2'=>$me['no'],
|
||||
'name2'=>$me['name'],
|
||||
'expire'=>$date,
|
||||
], 'no=%i', $sel);
|
||||
}
|
||||
} elseif ($btn == "구매") {
|
||||
if ($term < 0 || $term > 24) {
|
||||
$msg2 = "ㆍ<span class='ev_warning'>종료기한은 1 ~ 24 턴 이어야 합니다.</span>";
|
||||
$valid = 0;
|
||||
}
|
||||
if ($amount < 100 || $amount > 10000) {
|
||||
$msg2 = "ㆍ<span class='ev_warning'>거래량은 100 ~ 10000 이어야 합니다.</span>";
|
||||
$valid = 0;
|
||||
}
|
||||
if ($cost > $amount * 2 || $cost * 2 < $amount) {
|
||||
$msg2 = "ㆍ<span class='ev_warning'>시작구매가는 50% ~ 200% 이어야 합니다.</span>";
|
||||
$valid = 0;
|
||||
}
|
||||
if ($topv < $amount * 0.5 || $topv > $amount * 0.9) {
|
||||
$msg2 = "ㆍ<span class='ev_warning'>즉시구매가는 50% ~ 90% 이어야 합니다.</span>";
|
||||
$valid = 0;
|
||||
}
|
||||
if ($topv > $cost * 0.9) {
|
||||
$msg2 = "ㆍ<span class='ev_warning'>즉시구매가는 시작구매가의 90% 이하이어야 합니다.</span>";
|
||||
$valid = 0;
|
||||
}
|
||||
if ($cost > $me['gold'] - GameConst::$defaultGold) {
|
||||
$msg2 = "ㆍ<span class='ev_warning'>기본 자금 ".GameConst::$defaultGold."은 거래할 수 없습니다.</span>";
|
||||
$valid = 0;
|
||||
}
|
||||
if ($valid == 1) {
|
||||
$msg2 = "ㆍ<span class='ev_success'>등록 성공.</span>";
|
||||
$date = date("Y-m-d H:i:s", strtotime(date("Y-m-d H:i:s")) + $unit * $term);
|
||||
|
||||
$db->insert('auction', [
|
||||
'type'=>1,
|
||||
'no1'=>$me['no'],
|
||||
'name1'=>$me['name'],
|
||||
'amount'=>$amount,
|
||||
'cost'=>$cost,
|
||||
'value'=>$cost,
|
||||
'topv'=>$topv,
|
||||
'expire'=>$date
|
||||
]);
|
||||
}
|
||||
} elseif ($btn == "판매시도") {
|
||||
$auction = $db->queryFirstRow('SELECT no2,value,topv,expire,amount FROM auction WHERE no=%i LIMIT 1', $sel);
|
||||
|
||||
if ($value == $auction['topv']) {
|
||||
$valid = 2;
|
||||
}
|
||||
if (!$auction) {
|
||||
$msg2 = "ㆍ<span class='ev_warning'>종료된 거래입니다.</span>";
|
||||
$valid = 0;
|
||||
}
|
||||
if ($auction['no2'] > 0 && $value >= $auction['value']) {
|
||||
$msg2 = "ㆍ<span class='ev_warning'>현재구매가보다 낮게 입찰해야 합니다.</span>";
|
||||
$valid = 0;
|
||||
}
|
||||
if ($value > $auction['value']) {
|
||||
$msg2 = "ㆍ<span class='ev_warning'>현재구매가보다 낮게 입찰해야 합니다.</span>";
|
||||
$valid = 0;
|
||||
}
|
||||
if ($value < $auction['topv']) {
|
||||
$msg2 = "ㆍ<span class='ev_warning'>즉시구매가보다 낮을 수 없습니다.</span>";
|
||||
$valid = 0;
|
||||
}
|
||||
if ($value > $me['rice'] - GameConst::$defaultRice) {
|
||||
$msg2 = "ㆍ<span class='ev_warning'>기본 군량 ".GameConst::$defaultRice."은 거래할 수 없습니다.</span>";
|
||||
$valid = 0;
|
||||
}
|
||||
if ($valid == 1) {
|
||||
$msg2 = "ㆍ<span class='ev_success'>입찰 성공.</span> 거래완료는 빨라도 현재로부터 1턴 뒤입니다.";
|
||||
$date = date("Y-m-d H:i:s", strtotime(date("Y-m-d H:i:s")) + $unit);
|
||||
if ($auction['expire'] > $date) {
|
||||
$date = $auction['expire'];
|
||||
}
|
||||
|
||||
$db->update('auction', [
|
||||
'value'=>$value,
|
||||
'no2'=>$me['no'],
|
||||
'name2'=>$me['name'],
|
||||
'expire'=>$date,
|
||||
], 'no=%i', $sel);
|
||||
} elseif ($valid == 2) {
|
||||
$msg2 = "ㆍ<span class='ev_success'>즉시구매 성공.</span> 거래완료는 빨라도 현재로부터 1턴 뒤입니다.";
|
||||
$date = date("Y-m-d H:i:s", strtotime(date("Y-m-d H:i:s")) + $unit);
|
||||
|
||||
$db->update('auction', [
|
||||
'value'=>$value,
|
||||
'no2'=>$me['no'],
|
||||
'name2'=>$me['name'],
|
||||
'expire'=>$date,
|
||||
], 'no=%i', $sel);
|
||||
}
|
||||
}
|
||||
|
||||
Submit("b_auction.php", $msg, $msg2);
|
||||
+1
-1
@@ -1207,7 +1207,7 @@ function checkDelay()
|
||||
], 'turntime<=DATE_ADD(turntime, INTERVAL %i MINUTE)', $term);
|
||||
$db->update('ng_auction', [
|
||||
'close_date' => $db->sqleval('DATE_ADD(close_date, INTERVAL %i MINUTE)', $minute)
|
||||
], true);
|
||||
], 'finished = 0');
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
+27
-43
@@ -7,39 +7,25 @@ use sammo\Enums\AuctionType;
|
||||
function registerAuction(RandUtil $rng)
|
||||
{
|
||||
$db = DB::db();
|
||||
$gameStor = KVStorage::getStorage($db, 'game_env');
|
||||
|
||||
$admin = $gameStor->getValues(['startyear', 'year', 'month', 'turnterm']);
|
||||
|
||||
$unit = 60 * $admin['turnterm'];
|
||||
|
||||
// 장수들 평금,평쌀
|
||||
$general = $db->queryFirstRow('SELECT avg(gold) as gold, avg(rice) as rice,max(gold) as maxgold from general where npc<2');
|
||||
[$avgGold, $avgRice] = $db->queryFirstList('SELECT avg(gold), avg(rice) from general where npc<2');
|
||||
$avgGold = Util::valueFit($avgGold, 1000, 20000);
|
||||
$avgRice = Util::valueFit($avgRice, 1000, 20000);
|
||||
|
||||
if ($general['gold'] < 1000) {
|
||||
$general['gold'] = 1000;
|
||||
}
|
||||
if ($general['gold'] > 20000) {
|
||||
$general['gold'] = 20000;
|
||||
}
|
||||
if ($general['rice'] < 1000) {
|
||||
$general['rice'] = 1000;
|
||||
}
|
||||
if ($general['rice'] > 20000) {
|
||||
$general['rice'] = 20000;
|
||||
}
|
||||
$neutralAuctionCnt = Util::convertPairArrayToDict($db->queryAllLists(
|
||||
'SELECT `type`, count(*) FROM ng_auction WHERE `type` IN %s AND `host_general_id`=0 GROUP BY `type`',
|
||||
[AuctionType::BuyRice->value, AuctionType::SellRice->value],
|
||||
));
|
||||
|
||||
$count = $db->queryFirstField('SELECT count(*) FROM auction WHERE type=0 AND no1=0');
|
||||
$count += 5;
|
||||
|
||||
$dummyGeneral = AuctionBasicResource::genDummy();
|
||||
$neutralbuyRiceCnt = $neutralAuctionCnt[AuctionType::BuyRice->value];
|
||||
|
||||
// 판매건 등록
|
||||
if ($rng->nextBool(1 / $count)) {
|
||||
if ($rng->nextBool(1 / ($neutralbuyRiceCnt + 5))) {
|
||||
//평균 쌀의 5% ~ 25%
|
||||
$mul = $rng->nextRangeInt(1, 5);
|
||||
$amount = $general['rice'] / 20 * $mul;
|
||||
$cost = $general['gold'] / 20 * 0.9 * $mul;
|
||||
$amount = $avgRice / 20 * $mul;
|
||||
$cost = $avgGold / 20 * 0.9 * $mul;
|
||||
$topv = $amount * 2;
|
||||
$cost = Util::valueFit($cost, $amount * 0.8, $amount * 1.2);
|
||||
|
||||
@@ -48,18 +34,18 @@ function registerAuction(RandUtil $rng)
|
||||
$topv = Util::round($topv, -1);
|
||||
|
||||
$term = $rng->nextRangeInt(3, 12);
|
||||
$dummyGeneral = AuctionBasicResource::genDummy();
|
||||
AuctionBuyRice::openResourceAuction($dummyGeneral, $amount, $term, $cost, $topv);
|
||||
}
|
||||
|
||||
$count = $db->queryFirstField('SELECT count(*) FROM auction WHERE type=1 AND no1=0');
|
||||
$count += 5;
|
||||
$neutralSellRiceCnt = $neutralAuctionCnt[AuctionType::SellRice->value];
|
||||
// 구매건 등록
|
||||
if ($rng->nextBool(1 / $count)) {
|
||||
if ($rng->nextBool(1 / ($neutralSellRiceCnt + 5))) {
|
||||
//평균 쌀의 5% ~ 25%
|
||||
$mul = $rng->nextRangeInt(1, 5);
|
||||
$amount = $general['rice'] / 20 * $mul;
|
||||
$cost = $general['gold'] / 20 * 1.1 * $mul;
|
||||
$topv = $amount * 0.5;
|
||||
$amount = $avgGold / 20 * $mul;
|
||||
$cost = $avgRice / 20 * 1.1 * $mul;
|
||||
$topv = $amount * 2;
|
||||
$cost = Util::valueFit($cost, $amount * 0.8, $amount * 1.2);
|
||||
|
||||
$amount = Util::round($amount, -1);
|
||||
@@ -67,6 +53,7 @@ function registerAuction(RandUtil $rng)
|
||||
$topv = Util::round($topv, -1);
|
||||
|
||||
$term = $rng->nextRangeInt(3, 12);
|
||||
$dummyGeneral = AuctionBasicResource::genDummy();
|
||||
AuctionSellRice::openResourceAuction($dummyGeneral, $amount, $term, $cost, $topv);
|
||||
}
|
||||
}
|
||||
@@ -74,32 +61,29 @@ function registerAuction(RandUtil $rng)
|
||||
function processAuction()
|
||||
{
|
||||
$db = DB::db();
|
||||
$gameStor = KVStorage::getStorage($db, 'game_env');
|
||||
|
||||
$now = TimeUtil::now();
|
||||
[$year, $month] = $gameStor->getValuesAsArray(['year', 'month']);
|
||||
|
||||
$admin = $gameStor->getValues(['year', 'month']);
|
||||
|
||||
|
||||
$auctionList = $db->queryFirstColumn(
|
||||
'SELECT id, `type` FROM ng_auction WHERE `type` IN %ls AND `close_date` <= %s',
|
||||
[AuctionType::BuyRice->value, AuctionType::SellRice->value],
|
||||
'SELECT id, `type` FROM ng_auction WHERE `close_date` <= %s AND finished = 0',
|
||||
$now
|
||||
);
|
||||
|
||||
if(!$auctionList){
|
||||
if (!$auctionList) {
|
||||
return;
|
||||
}
|
||||
|
||||
$dummyGeneral = AuctionBasicResource::genDummy();
|
||||
foreach($auctionList as [$auctionID, $rawAuctionType]) {
|
||||
foreach ($auctionList as [$auctionID, $rawAuctionType]) {
|
||||
$auctionType = AuctionType::from($rawAuctionType);
|
||||
if($auctionType === AuctionType::BuyRice){
|
||||
if ($auctionType === AuctionType::BuyRice) {
|
||||
$auction = new AuctionBuyRice($auctionID, $dummyGeneral);
|
||||
}
|
||||
else{
|
||||
} else if ($auctionType === AuctionType::SellRice) {
|
||||
$auction = new AuctionSellRice($auctionID, $dummyGeneral);
|
||||
} else if ($auctionType === AuctionType::UniqueItem) {
|
||||
$auction = new AuctionUniqueItem($auctionID, $dummyGeneral);
|
||||
} else {
|
||||
throw new \Exception('Unknown auction type');
|
||||
}
|
||||
$auction->tryFinish();
|
||||
}
|
||||
|
||||
+1
-1
@@ -88,7 +88,7 @@ $color = "cyan";
|
||||
$serverName = UniqueConst::$serverName;
|
||||
$serverCnt = $gameStor->server_cnt;
|
||||
|
||||
$auctionCount = $db->queryFirstField('SELECT count(`no`) FROM auction');
|
||||
$auctionCount = $db->queryFirstField('SELECT count(*) FROM ng_auction WHERE finished = 0');
|
||||
$isTournamentActive = $gameStor->tournament > 0;
|
||||
$isTournamentApplicationOpen = $gameStor->tournament == 1;
|
||||
$isBettingActive = $gameStor->tournament == 6;
|
||||
|
||||
@@ -13,8 +13,6 @@ use \sammo\{
|
||||
use \sammo\Constraint\Constraint;
|
||||
use \sammo\Constraint\ConstraintHelper;
|
||||
|
||||
use function sammo\tryRollbackInheritUniqueItem;
|
||||
|
||||
class che_NPC능동 extends Command\GeneralCommand{
|
||||
static protected $actionName = 'NPC능동';
|
||||
|
||||
@@ -98,7 +96,6 @@ class che_NPC능동 extends Command\GeneralCommand{
|
||||
|
||||
$this->setResultTurn(new LastTurn(static::getName(), $this->arg));
|
||||
}
|
||||
tryRollbackInheritUniqueItem($rng, $general);
|
||||
$general->applyDB($db);
|
||||
|
||||
return true;
|
||||
|
||||
@@ -15,8 +15,6 @@ use \sammo\Constraint\Constraint;
|
||||
use \sammo\Constraint\ConstraintHelper;
|
||||
use sammo\Enums\InheritanceKey;
|
||||
|
||||
use function sammo\tryRollbackInheritUniqueItem;
|
||||
|
||||
class che_모반시도 extends Command\GeneralCommand{
|
||||
static protected $actionName = '모반시도';
|
||||
|
||||
@@ -99,7 +97,6 @@ class che_모반시도 extends Command\GeneralCommand{
|
||||
$this->setResultTurn(new LastTurn(static::getName(), $this->arg));
|
||||
$general->increaseInheritancePoint(InheritanceKey::active_action, 1);
|
||||
$general->checkStatChange();
|
||||
tryRollbackInheritUniqueItem($rng, $general);
|
||||
$general->applyDB($db);
|
||||
$lordGeneral->applyDB($db);
|
||||
|
||||
|
||||
@@ -17,7 +17,6 @@ use sammo\Enums\InheritanceKey;
|
||||
|
||||
use function sammo\DeleteConflict;
|
||||
use function sammo\refreshNationStaticInfo;
|
||||
use function sammo\tryRollbackInheritUniqueItem;
|
||||
|
||||
class che_방랑 extends Command\GeneralCommand{
|
||||
static protected $actionName = '방랑';
|
||||
@@ -125,7 +124,6 @@ class che_방랑 extends Command\GeneralCommand{
|
||||
refreshNationStaticInfo();
|
||||
$general->increaseInheritancePoint(InheritanceKey::active_action, 1);
|
||||
$this->setResultTurn(new LastTurn(static::getName(), $this->arg));
|
||||
tryRollbackInheritUniqueItem($rng, $general);
|
||||
$general->applyDB($db);
|
||||
|
||||
return true;
|
||||
|
||||
@@ -21,8 +21,6 @@ use \sammo\Constraint\Constraint;
|
||||
use \sammo\Constraint\ConstraintHelper;
|
||||
use sammo\Enums\InheritanceKey;
|
||||
|
||||
use function sammo\tryRollbackInheritUniqueItem;
|
||||
|
||||
class che_선양 extends Command\GeneralCommand
|
||||
{
|
||||
static protected $actionName = '선양';
|
||||
@@ -139,7 +137,6 @@ class che_선양 extends Command\GeneralCommand
|
||||
$general->increaseInheritancePoint(InheritanceKey::active_action, 1);
|
||||
$this->setResultTurn(new LastTurn(static::getName(), $this->arg));
|
||||
$general->checkStatChange();
|
||||
tryRollbackInheritUniqueItem($rng, $general);
|
||||
$general->applyDB($db);
|
||||
$destGeneral->applyDB($db);
|
||||
|
||||
|
||||
@@ -13,8 +13,6 @@ use \sammo\{
|
||||
use \sammo\Constraint\Constraint;
|
||||
use \sammo\Constraint\ConstraintHelper;
|
||||
|
||||
use function sammo\tryRollbackInheritUniqueItem;
|
||||
|
||||
class che_소집해제 extends Command\GeneralCommand{
|
||||
static protected $actionName = '소집해제';
|
||||
|
||||
@@ -82,7 +80,6 @@ class che_소집해제 extends Command\GeneralCommand{
|
||||
$general->addDedication($ded);
|
||||
$this->setResultTurn(new LastTurn(static::getName(), $this->arg));
|
||||
$general->checkStatChange();
|
||||
tryRollbackInheritUniqueItem($rng, $general);
|
||||
$general->applyDB($db);
|
||||
|
||||
return true;
|
||||
|
||||
@@ -13,8 +13,6 @@ use \sammo\{
|
||||
use \sammo\Constraint\Constraint;
|
||||
use \sammo\Constraint\ConstraintHelper;
|
||||
|
||||
use function sammo\tryRollbackInheritUniqueItem;
|
||||
|
||||
class che_요양 extends Command\GeneralCommand{
|
||||
static protected $actionName = '요양';
|
||||
|
||||
@@ -71,7 +69,6 @@ class che_요양 extends Command\GeneralCommand{
|
||||
$general->addDedication($ded);
|
||||
$this->setResultTurn(new LastTurn(static::getName(), $this->arg));
|
||||
$general->checkStatChange();
|
||||
tryRollbackInheritUniqueItem($rng, $general);
|
||||
$general->applyDB($db);
|
||||
|
||||
return true;
|
||||
|
||||
@@ -12,7 +12,6 @@ use \sammo\Command;
|
||||
use \sammo\Json;
|
||||
|
||||
use function \sammo\searchDistance;
|
||||
use function sammo\tryRollbackInheritUniqueItem;
|
||||
|
||||
use \sammo\Constraint\ConstraintHelper;
|
||||
use sammo\CityConst;
|
||||
@@ -214,7 +213,6 @@ class che_첩보 extends Command\GeneralCommand
|
||||
$general->increaseVar('leadership_exp', 1);
|
||||
$this->setResultTurn(new LastTurn(static::getName(), $this->arg));
|
||||
$general->checkStatChange();
|
||||
tryRollbackInheritUniqueItem($rng, $general);
|
||||
$general->applyDB($db);
|
||||
|
||||
return true;
|
||||
|
||||
@@ -15,8 +15,6 @@ use \sammo\Constraint\ConstraintHelper;
|
||||
use sammo\CityConst;
|
||||
use sammo\Enums\InheritanceKey;
|
||||
|
||||
use function sammo\tryRollbackInheritUniqueItem;
|
||||
|
||||
class che_하야 extends Command\GeneralCommand{
|
||||
static protected $actionName = '하야';
|
||||
|
||||
@@ -118,7 +116,6 @@ class che_하야 extends Command\GeneralCommand{
|
||||
|
||||
$this->setResultTurn(new LastTurn(static::getName(), $this->arg));
|
||||
$general->checkStatChange();
|
||||
tryRollbackInheritUniqueItem($rng, $general);
|
||||
$general->applyDB($db);
|
||||
|
||||
return true;
|
||||
|
||||
@@ -20,7 +20,6 @@ use sammo\Event\EventHandler;
|
||||
|
||||
use function sammo\refreshNationStaticInfo;
|
||||
use function sammo\deleteNation;
|
||||
use function sammo\tryRollbackInheritUniqueItem;
|
||||
|
||||
class che_해산 extends Command\GeneralCommand{
|
||||
static protected $actionName = '해산';
|
||||
@@ -99,7 +98,6 @@ class che_해산 extends Command\GeneralCommand{
|
||||
$oldGeneral->setVar('makelimit', 12);
|
||||
$oldGeneral->applyDB($db);
|
||||
}
|
||||
tryRollbackInheritUniqueItem($rng, $general);
|
||||
$general->applyDB($db);
|
||||
|
||||
// 이벤트 핸들러 동작
|
||||
|
||||
@@ -12,7 +12,6 @@ use \sammo\LastTurn;
|
||||
use \sammo\Command;
|
||||
|
||||
use function \sammo\searchDistance;
|
||||
use function sammo\tryRollbackInheritUniqueItem;
|
||||
|
||||
use \sammo\Constraint\ConstraintHelper;
|
||||
use sammo\CityConst;
|
||||
@@ -296,7 +295,6 @@ class che_화계 extends Command\GeneralCommand
|
||||
|
||||
$this->setResultTurn(new LastTurn(static::getName(), $this->arg));
|
||||
$general->checkStatChange();
|
||||
tryRollbackInheritUniqueItem($rng, $general);
|
||||
$general->applyDB($db);
|
||||
return false;
|
||||
}
|
||||
@@ -330,7 +328,6 @@ class che_화계 extends Command\GeneralCommand
|
||||
$general->increaseRankVar(RankColumn::firenum, 1);
|
||||
$this->setResultTurn(new LastTurn(static::getName(), $this->arg));
|
||||
$general->checkStatChange();
|
||||
tryRollbackInheritUniqueItem($rng, $general);
|
||||
$general->applyDB($db);
|
||||
|
||||
return true;
|
||||
|
||||
@@ -7,8 +7,6 @@ use \sammo\JosaUtil;
|
||||
use \sammo\LastTurn;
|
||||
use \sammo\DB;
|
||||
|
||||
use function sammo\tryRollbackInheritUniqueItem;
|
||||
|
||||
class 휴식 extends Command\GeneralCommand{
|
||||
static protected $actionName = '휴식';
|
||||
|
||||
@@ -41,7 +39,6 @@ class 휴식 extends Command\GeneralCommand{
|
||||
$logger->pushGeneralActionLog("아무것도 실행하지 않았습니다. <1>$date</>");
|
||||
|
||||
$this->setResultTurn(new LastTurn());
|
||||
tryRollbackInheritUniqueItem($rng, $general);
|
||||
$general->applyDB(DB::db());
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -32,9 +32,6 @@ DROP TABLE IF EXISTS ng_diplomacy;
|
||||
# 토너먼트 테이블 삭제
|
||||
DROP TABLE IF EXISTS tournament;
|
||||
|
||||
# 거래 테이블 삭제
|
||||
DROP TABLE IF EXISTS auction;
|
||||
|
||||
# 통계 테이블 삭제
|
||||
DROP TABLE IF EXISTS statistic;
|
||||
|
||||
|
||||
@@ -441,23 +441,6 @@ CREATE TABLE `tournament` (
|
||||
INDEX `grp` (`grp`, `grp_no`)
|
||||
) COLLATE = 'utf8mb4_general_ci' ENGINE = Aria;
|
||||
##############################
|
||||
## 거래 테이블
|
||||
##############################
|
||||
create table `auction` (
|
||||
`no` int(6) not null auto_increment,
|
||||
`type` int(6) default 0,
|
||||
`no1` int(6) default 0,
|
||||
`name1` varchar(64) default '-',
|
||||
`amount` int(6) default 0,
|
||||
`cost` int(6) default 0,
|
||||
`value` int(6) default 0,
|
||||
`topv` int(6) default 0,
|
||||
`no2` int(6) default 0,
|
||||
`name2` varchar(64) default '-',
|
||||
`expire` datetime,
|
||||
PRIMARY KEY (`no`)
|
||||
) COLLATE = 'utf8mb4_general_ci' ENGINE = Aria;
|
||||
##############################
|
||||
## 통계 테이블
|
||||
##############################
|
||||
CREATE TABLE `statistic` (
|
||||
|
||||
Reference in New Issue
Block a user