Files
core/hwe/func_auction.php
T
Hide_D dd38344319 feat,refac: 경매장 재설계, 유니크 경매장 구현 (#221)
- 경매장을 모든 입찰 기록이 남는 새로운 경매장 로직으로 변경
  - ng_auction, ng_auction_bid
    - DTO 사용
  - 상회입찰 시 개인메시지로 알림
- 기존의 '배경에서 조용히 이루어지는' 유니크 입찰을 공개된 유니크 경매장으로 변경
  - 종료 기간 명시
    - 종료 기간에 가까워질때 입찰하면 자동 연장
    - 최대 연장기간 있음
  - 유니크 제한인 경우 24턴 연장
  - 중원정세에서 '보물수배'로 알림

Reviewed-on: https://storage.hided.net/gitea/devsam/core/pulls/221
2022-06-09 01:21:55 +09:00

91 lines
3.0 KiB
PHP

<?php
namespace sammo;
use sammo\Enums\AuctionType;
function registerAuction(RandUtil $rng)
{
$db = DB::db();
// 장수들 평금,평쌀
[$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);
$neutralAuctionCnt = Util::convertPairArrayToDict($db->queryAllLists(
'SELECT `type`, count(*) FROM ng_auction WHERE `type` IN %ls AND `host_general_id`=0 GROUP BY `type`',
[AuctionType::BuyRice->value, AuctionType::SellRice->value],
));
$neutralbuyRiceCnt = $neutralAuctionCnt[AuctionType::BuyRice->value];
// 판매건 등록
if ($rng->nextBool(1 / ($neutralbuyRiceCnt + 5))) {
//평균 쌀의 5% ~ 25%
$mul = $rng->nextRangeInt(1, 5);
$amount = $avgRice / 20 * $mul;
$cost = $avgGold / 20 * 0.9 * $mul;
$topv = $amount * 2;
$cost = Util::valueFit($cost, $amount * 0.8, $amount * 1.2);
$amount = Util::round($amount, -1);
$cost = Util::round($cost, -1);
$topv = Util::round($topv, -1);
$term = $rng->nextRangeInt(3, 12);
$dummyGeneral = AuctionBasicResource::genDummy();
AuctionBuyRice::openResourceAuction($dummyGeneral, $amount, $term, $cost, $topv);
}
$neutralSellRiceCnt = $neutralAuctionCnt[AuctionType::SellRice->value];
// 구매건 등록
if ($rng->nextBool(1 / ($neutralSellRiceCnt + 5))) {
//평균 쌀의 5% ~ 25%
$mul = $rng->nextRangeInt(1, 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);
$cost = Util::round($cost, -1);
$topv = Util::round($topv, -1);
$term = $rng->nextRangeInt(3, 12);
$dummyGeneral = AuctionBasicResource::genDummy();
AuctionSellRice::openResourceAuction($dummyGeneral, $amount, $term, $cost, $topv);
}
}
function processAuction()
{
$db = DB::db();
$now = TimeUtil::now();
$auctionList = $db->queryAllLists(
'SELECT id, `type` FROM ng_auction WHERE `close_date` <= %s AND finished = 0',
$now
);
if (!$auctionList) {
return;
}
$dummyGeneral = AuctionBasicResource::genDummy();
foreach ($auctionList as [$auctionID, $rawAuctionType]) {
$auctionType = AuctionType::from($rawAuctionType);
if ($auctionType === AuctionType::BuyRice) {
$auction = new AuctionBuyRice($auctionID, $dummyGeneral);
} 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();
}
}