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'); 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; } $count = $db->queryFirstField('SELECT count(*) FROM auction WHERE type=0 AND no1=0'); $count += 5; // 판매건 등록 if(Util::randBool(1/$count)) { //평균 쌀의 5% ~ 25% $mul = rand() % 5 + 1; $amount = $general['rice'] / 20 * $mul; $cost = $general['gold'] / 20 * 0.9 * $mul; $topv = $amount * 2; if($cost <= $amount*0.8) { $cost = $amount*0.8; } if($cost >= $amount*1.2) { $cost = $amount*1.2; } $amount = Util::round($amount, -1); $cost = Util::round($cost, -1); $topv = Util::round($topv, -1); $term = 3 + rand() % 10; $date = date("Y-m-d H:i:s", strtotime(date("Y-m-d H:i:s")) + $unit * $term); $db->insert('auction', [ 'type'=>0, 'no1'=>0, 'name1'=>'ⓝ상인', 'amount'=>$amount, 'cost'=>$cost, 'value'=>$cost, 'topv'=>$topv, 'expire'=>$date ]); } $count = $db->queryFirstField('SELECT count(*) FROM auction WHERE type=1 AND no1=0'); $count += 5; // 구매건 등록 if(Util::randBool(1/$count)) { //평균 쌀의 5% ~ 25% $mul = Util::randRangeInt(1, 5); $amount = $general['rice'] / 20 * $mul; $cost = $general['gold'] / 20 * 1.1 * $mul; $topv = $amount * 0.5; if($cost <= $amount*0.8) { $cost = $amount*0.8; } if($cost >= $amount*1.2) { $cost = $amount*1.2; } $amount = Util::round($amount, -1); $cost = Util::round($cost, -1); $topv = Util::round($topv, -1); $term = Util::randRangeInt(3, 12); $date = date("Y-m-d H:i:s", strtotime(date("Y-m-d H:i:s")) + $unit * $term); $db->insert('auction', [ 'type'=>1, 'no1'=>0, 'name1'=>'ⓝ상인', 'amount'=>$amount, 'cost'=>$cost, 'value'=>$cost, 'topv'=>$topv, 'expire'=>$date ]); } } function processAuction() { $db = DB::db(); $gameStor = KVStorage::getStorage($db, 'game_env'); $date = TimeUtil::now(); [$year, $month] = $gameStor->getValuesAsArray(['year', 'month']); $admin = $gameStor->getValues(['year', 'month']); foreach($db->query('SELECT * from auction where expire<=%s', $date) as $auction){ $josaYi1 = JosaUtil::pick($auction['name1'], '이'); $josaYi2 = JosaUtil::pick($auction['name2'], '이'); // 쌀 처리 if($auction['no2'] == 0) { // 상인건수가 아닌것만 출력 if($auction['no1'] != 0) { $traderID = $db->queryFirstField('SELECT no FROM general WHERE no=%i', $auction['no1']); $logger = new ActionLogger($traderID, 0, $year, $month); $logger->pushGeneralActionLog("입찰자 부재로 {$auction['no']}번 거래 유찰!", ActionLogger::EVENT_PLAIN); $logger->flush(); $auctionLog = []; if($auction['type'] == 0) { $josaUlRice = JosaUtil::pick($auction['amount'], '을'); $auctionLog[] = "◆{$admin['year']}년 {$admin['month']}월, {$auction['no']}번 판매 유찰 : {$auction['name1']}{$josaYi1} 쌀 {$auction['amount']}{$josaUlRice} 판매, 그러나 입찰자 부재"; } else { $josaUlRice = JosaUtil::pick($auction['amount'], '을'); $auctionLog[] = "◆{$admin['year']}년 {$admin['month']}월, {$auction['no']}번 구매 유찰 : {$auction['name1']}{$josaYi1} 쌀 {$auction['amount']}{$josaUlRice} 구매, 그러나 입찰자 부재"; } pushAuctionLog($auctionLog); } continue; } if($auction['no1'] == 0) { $trader = [ 'no'=>0, 'name'=>'ⓝ상인', 'gold'=>99999, 'rice'=>99999 ]; } else { $trader = $db->queryFirstRow('SELECT no,name,gold,rice from general where no=%i', $auction['no1']); } $bidder = $db->queryFirstRow('SELECT no,name,gold,rice from general where no=%i', $auction['no2']); $traderLogger = new ActionLogger($trader['no'], 0, $year, $month, false); $bidderLogger = new ActionLogger($bidder['no'], 0, $year, $month, false); $auctionLog = []; //판매거래 if($auction['type'] == 0) { if($auction['amount'] > $trader['rice'] - 1000) { $gold = Util::round($auction['value'] * 0.01); $db->update('general', [ 'gold'=>Util::valueFit($trader['gold'] - $gold, 0) ], 'no=%i', $trader['no']); $josaUlRice = JosaUtil::pick($auction['amount'], '을'); $josaRo = JosaUtil::pick($auction['value'], '로'); $traderLogger->pushGeneralActionLog("판매자의 군량 부족으로 {$auction['no']}번 거래 유찰! 벌금 {$gold}", ActionLogger::EVENT_PLAIN); $bidderLogger->pushGeneralActionLog("판매자의 군량 부족으로 {$auction['no']}번 거래 유찰!", ActionLogger::EVENT_PLAIN); $auctionLog[0] = "◆{$admin['year']}년 {$admin['month']}월, {$auction['no']}번 판매 유찰 : {$auction['name1']}{$josaYi1} 쌀 {$auction['amount']}{$josaUlRice} 판매, {$auction['name2']}{$josaYi2} 금 {$auction['value']}{$josaRo} 입찰, 그러나 판매자 군량부족, 벌금 {$gold}"; } elseif($auction['value'] > $bidder['gold'] - 1000) { $gold = Util::round($auction['value'] * 0.01); $db->update('general', [ 'gold'=>Util::valueFit($bidder['gold'] - $gold, 0) ], 'no=%i', $bidder['no']); $josaUlRice = JosaUtil::pick($auction['amount'], '을'); $josaRo = JosaUtil::pick($auction['value'], '로'); $traderLogger->pushGeneralActionLog("입찰자의 자금 부족으로 {$auction['no']}번 거래 유찰!", ActionLogger::EVENT_PLAIN); $bidderLogger->pushGeneralActionLog("입찰자의 자금 부족으로 {$auction['no']}번 거래 유찰! 벌금 {$gold}", ActionLogger::EVENT_PLAIN); $auctionLog[0] = "◆{$admin['year']}년 {$admin['month']}월, {$auction['no']}번 판매 유찰 : {$auction['name1']}{$josaYi1} 쌀 {$auction['amount']}{$josaUlRice} 판매, {$auction['name2']}{$josaYi2} 금 {$auction['value']}{$josaRo} 입찰, 그러나 입찰자 자금부족, 벌금 {$gold}"; } else { $josaUlGold = JosaUtil::pick($auction['value'], '을'); $josaUlRice = JosaUtil::pick($auction['amount'], '을'); $josaRo = JosaUtil::pick($auction['value'], '로'); $traderLogger->pushGeneralActionLog("{$auction['no']}번 거래 성사로 쌀 {$auction['amount']}{$josaUlRice} 판매, 금 {$auction['value']}{$josaUlGold} 획득!", ActionLogger::EVENT_PLAIN); $bidderLogger->pushGeneralActionLog("{$auction['no']}번 거래 성사로 금 {$auction['value']}{$josaUlGold} 지불, 쌀 {$auction['amount']}{$josaUlRice} 구입!", ActionLogger::EVENT_PLAIN); $auctionLog[0] = "◆{$admin['year']}년 {$admin['month']}월, {$auction['no']}번 판매 성사 : {$auction['name1']}{$josaYi1} 쌀 {$auction['amount']}{$josaUlRice} 판매, {$auction['name2']}{$josaYi2} 금 {$auction['value']}{$josaRo} 구매"; if($auction['value'] >= $auction['amount'] * 2) { $auctionLog[0] .= " ★ 최고가 거래 ★"; } elseif($auction['value'] >= $auction['topv']) { $auctionLog[0] .= " ★ 즉시구매가 거래 ★"; } elseif($auction['value'] * 2 <= $auction['amount']) { $auctionLog[0] .= " ★ 최저가 거래 ★"; } $db->update('general', [ 'gold'=>$db->sqleval('gold + %i', $auction['value']), 'rice'=>$db->sqleval('rice - %i', $auction['amount']), ], 'no=%i', $auction['no1']); $db->update('general', [ 'gold'=>$db->sqleval('gold - %i', $auction['value']), 'rice'=>$db->sqleval('rice + %i', $auction['amount']), ], 'no=%i', $auction['no2']); } pushAuctionLog($auctionLog); //구매거래 } else { if($auction['amount'] > $bidder['rice'] - 1000) { $gold = Util::round($auction['value'] * 0.01); $db->update('general', [ 'gold'=>Util::valueFit($bidder['gold'] - $gold, 0) ], 'no=%i', $bidder['no']); $josaUlRice = JosaUtil::pick($auction['amount'], '을'); $josaRo = JosaUtil::pick($auction['value'], '로'); $traderLogger->pushGeneralActionLog("입찰자의 군량 부족으로 {$auction['no']}번 거래 유찰!", ActionLogger::EVENT_PLAIN); $bidderLogger->pushGeneralActionLog("입찰자의 군량 부족으로 {$auction['no']}번 거래 유찰! 벌금 {$gold}", ActionLogger::EVENT_PLAIN); $auctionLog[0] = "◆{$admin['year']}년 {$admin['month']}월, {$auction['no']}번 구매 유찰 : {$auction['name1']}{$josaYi1} 쌀 {$auction['amount']}{$josaUlRice} 구매, {$auction['name2']}{$josaYi2} 금 {$auction['value']}{$josaRo} 입찰, 그러나 입찰자 군량부족, 벌금 {$gold}"; } elseif($auction['value'] > $trader['gold'] - 1000) { $gold = Util::round($auction['value'] * 0.01); $db->update('general', [ 'gold'=>Util::valueFit($trader['gold'] - $gold, 0) ], 'no=%i', $trader['no']); $josaUlRice = JosaUtil::pick($auction['amount'], '을'); $josaRo = JosaUtil::pick($auction['value'], '로'); $traderLogger->pushGeneralActionLog("구매자의 자금 부족으로 {$auction['no']}번 거래 유찰! 벌금 {$gold}", ActionLogger::EVENT_PLAIN); $bidderLogger->pushGeneralActionLog("구매자의 자금 부족으로 {$auction['no']}번 거래 유찰!", ActionLogger::EVENT_PLAIN); $auctionLog[0] = "◆{$admin['year']}년 {$admin['month']}월, {$auction['no']}번 구매 유찰 : {$auction['name1']}{$josaYi1} 쌀 {$auction['amount']}{$josaUlRice} 구매, {$auction['name2']}{$josaYi2} 금 {$auction['value']}{$josaRo} 입찰, 그러나 구매자 자금부족, 벌금 {$gold}"; } else { $josaUlGold = JosaUtil::pick($auction['value'], '을'); $josaUlRice = JosaUtil::pick($auction['amount'], '을'); $josaRo = JosaUtil::pick($auction['value'], '로'); $traderLogger->pushGeneralActionLog( "{$auction['no']}번 거래 성사로 금 {$auction['value']}{$josaUlGold} 지불, 쌀 {$auction['amount']}{$josaUlRice} 구입!", ActionLogger::EVENT_PLAIN ); $bidderLogger->pushGeneralActionLog("{$auction['no']}번 거래 성사로 쌀 {$auction['amount']}{$josaUlRice} 판매, 금 {$auction['value']}{$josaUlGold} 획득!", ActionLogger::EVENT_PLAIN); $auctionLog[0] = "◆{$admin['year']}년 {$admin['month']}월, {$auction['no']}번 구매 성사 : {$auction['name1']}{$josaYi1} 쌀 {$auction['amount']}{$josaUlRice} 구매, {$auction['name2']}{$josaYi2} 금 {$auction['value']}{$josaRo} 판매"; if($auction['value'] >= $auction['amount'] * 2) { $auctionLog[0] .= " ★ 최고가 거래 ★"; } elseif($auction['value'] * 2 <= $auction['amount']) { $auctionLog[0] .= " ★ 최저가 거래 ★"; } elseif($auction['value'] <= $auction['topv']) { $auctionLog[0] .= " ★ 즉시구매가 거래 ★"; } $db->update('general', [ 'gold'=>$db->sqleval('gold - %i', $auction['value']), 'rice'=>$db->sqleval('rice + %i', $auction['amount']), ], 'no=%i', $auction['no1']); $db->update('general', [ 'gold'=>$db->sqleval('gold + %i', $auction['value']), 'rice'=>$db->sqleval('rice - %i', $auction['amount']), ], 'no=%i', $auction['no2']); } $traderLogger->flush(); $bidderLogger->flush(); pushAuctionLog($auctionLog); } $traderLogger->flush(); $bidderLogger->flush(); } $db->delete('auction', 'expire <= %s', $date); }