Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
3762d9050c
|
||
|
|
75d88d48b6
|
||
|
|
633defcb21
|
@@ -69,5 +69,3 @@ gateway/js/*
|
|||||||
gateway/css/*
|
gateway/css/*
|
||||||
|
|
||||||
*.db-journal
|
*.db-journal
|
||||||
|
|
||||||
d_log/cachegrind.*
|
|
||||||
+5
-2
@@ -15,8 +15,9 @@ return [
|
|||||||
// Note that the **only** effect of choosing `'5.6'` is to infer
|
// Note that the **only** effect of choosing `'5.6'` is to infer
|
||||||
// that functions removed in php 7.0 exist.
|
// that functions removed in php 7.0 exist.
|
||||||
// (See `backward_compatibility_checks` for additional options)
|
// (See `backward_compatibility_checks` for additional options)
|
||||||
"target_php_version" => '8.2',
|
"target_php_version" => '8.1',
|
||||||
"minimum_target_php_version" => '8.2',
|
"minimum_target_php_version" => '8.1',
|
||||||
|
'backward_compatibility_checks ' => true,
|
||||||
'minimum_severity' => \Phan\Issue::SEVERITY_NORMAL,
|
'minimum_severity' => \Phan\Issue::SEVERITY_NORMAL,
|
||||||
|
|
||||||
'file_list' => [
|
'file_list' => [
|
||||||
@@ -28,6 +29,8 @@ return [
|
|||||||
'hwe/_admin1_submit.php',
|
'hwe/_admin1_submit.php',
|
||||||
'hwe/_admin2.php',
|
'hwe/_admin2.php',
|
||||||
'hwe/_admin2_submit.php',
|
'hwe/_admin2_submit.php',
|
||||||
|
'hwe/_admin4.php',
|
||||||
|
'hwe/_admin4_submit.php',
|
||||||
'hwe/_admin5.php',
|
'hwe/_admin5.php',
|
||||||
'hwe/_admin5_submit.php',
|
'hwe/_admin5_submit.php',
|
||||||
'hwe/_admin7.php',
|
'hwe/_admin7.php',
|
||||||
|
|||||||
Vendored
+1
-1
@@ -29,5 +29,5 @@
|
|||||||
"josa",
|
"josa",
|
||||||
"sammo"
|
"sammo"
|
||||||
],
|
],
|
||||||
"editor.tabSize": 4
|
"editor.tabSize": 2
|
||||||
}
|
}
|
||||||
@@ -30,10 +30,10 @@ require(__DIR__ . '/../vendor/autoload.php');
|
|||||||
|
|
||||||
<body>
|
<body>
|
||||||
<div class="container">
|
<div class="container">
|
||||||
<h1 class="row justify-content-lg-center">삼국지 모의전투 HiDCHe 설치</h1>
|
<h1 class="row justify-content-md-center">삼국지 모의전투 HiDCHe 설치</h1>
|
||||||
<div class="row justify-content-lg-center">
|
<div class="row justify-content-md-center">
|
||||||
|
|
||||||
<div class="col col-12 col-lg-10 col-lg-7">
|
<div class="col col-12 col-md-10 col-lg-7">
|
||||||
<div class="card" id="db_form_card" style="display:none">
|
<div class="card" id="db_form_card" style="display:none">
|
||||||
<h3 class="card-header">
|
<h3 class="card-header">
|
||||||
설치(DB 설정)
|
설치(DB 설정)
|
||||||
|
|||||||
+22
-1
@@ -74,7 +74,28 @@ switch ($btn) {
|
|||||||
case "120분턴": $turnterm = 120; break;
|
case "120분턴": $turnterm = 120; break;
|
||||||
default: throw new \Exception("알 수 없는 턴 기간");
|
default: throw new \Exception("알 수 없는 턴 기간");
|
||||||
}
|
}
|
||||||
ServerTool::changeServerTerm($turnterm);
|
$oldunit = $admin['turnterm'] * 60;
|
||||||
|
$unit = $turnterm * 60;
|
||||||
|
|
||||||
|
$unitDiff = $unit / $oldunit;
|
||||||
|
|
||||||
|
$servTurnTime = new \DateTimeImmutable($admin['turntime']);
|
||||||
|
foreach ($db->query('SELECT no,turntime FROM general') as $gen) {
|
||||||
|
$genTurnTime = new \DateTimeImmutable($gen['turntime']);
|
||||||
|
$timeDiff = TimeUtil::DateIntervalToSeconds($genTurnTime->diff($servTurnTime));
|
||||||
|
$timeDiff *= $unitDiff;
|
||||||
|
$newGenTurnTime = $servTurnTime->add(TimeUtil::secondsToDateInterval($timeDiff));
|
||||||
|
|
||||||
|
$db->update('general', [
|
||||||
|
'turntime'=>$newGenTurnTime->format('Y-m-d H:i:s.u')
|
||||||
|
], 'no=%i', $gen['no']);
|
||||||
|
}
|
||||||
|
$turn = ($admin['year'] - $admin['startyear']) * 12 + $admin['month'] - 1;
|
||||||
|
$starttime = $servTurnTime->sub(TimeUtil::secondsToDateInterval($turn * $unit))->format('Y-m-d H:i:s');
|
||||||
|
$starttime = cutTurn($starttime, $turnterm, false);
|
||||||
|
$gameStor->turnterm = $turnterm;
|
||||||
|
$gameStor->starttime = $starttime;
|
||||||
|
pushGlobalHistoryLog(["<R>★</>턴시간이 <C>$btn</>으로 변경됩니다."]);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+11
-11
@@ -33,18 +33,18 @@ $src = MessageTarget::buildQuick($session->generalID);
|
|||||||
$genObjList = [];
|
$genObjList = [];
|
||||||
$env = [];
|
$env = [];
|
||||||
if ($genlist) {
|
if ($genlist) {
|
||||||
$genObjList = General::createObjListFromDB($genlist);
|
$genObjList = General::createGeneralObjListFromDB($genlist);
|
||||||
$env = $gameStor->cacheAll();
|
$env = $gameStor->cacheAll();
|
||||||
}
|
}
|
||||||
switch ($btn) {
|
switch ($btn) {
|
||||||
case "전체 접속허용":
|
case "전체 접속허용":
|
||||||
$db->update('general_access_log', [
|
$db->update('general', [
|
||||||
'refresh_score' => 0
|
'con' => 0
|
||||||
], true);
|
], true);
|
||||||
break;
|
break;
|
||||||
case "전체 접속제한":
|
case "전체 접속제한":
|
||||||
$db->update('general_access_log', [
|
$db->update('general', [
|
||||||
'refresh_score' => 1000
|
'con' => 1000
|
||||||
], true);
|
], true);
|
||||||
break;
|
break;
|
||||||
case "블럭 해제":
|
case "블럭 해제":
|
||||||
@@ -186,14 +186,14 @@ switch ($btn) {
|
|||||||
], '`no` IN %li', $genlist);
|
], '`no` IN %li', $genlist);
|
||||||
break;
|
break;
|
||||||
case "접속 허용":
|
case "접속 허용":
|
||||||
$db->update('general_access_log', [
|
$db->update('general', [
|
||||||
'refresh_score' => 0
|
'con' => 0
|
||||||
], '`general_id` IN %li', $genlist);
|
], '`no` IN %li', $genlist);
|
||||||
break;
|
break;
|
||||||
case "접속 제한":
|
case "접속 제한":
|
||||||
$db->update('general_access_log', [
|
$db->update('general', [
|
||||||
'refresh_score' => 1000
|
'con' => 1000
|
||||||
], '`general_id` IN %li', $genlist);
|
], '`no` IN %li', $genlist);
|
||||||
break;
|
break;
|
||||||
case "메세지 전달":
|
case "메세지 전달":
|
||||||
$text = $msg ?? '';
|
$text = $msg ?? '';
|
||||||
|
|||||||
+133
@@ -0,0 +1,133 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace sammo;
|
||||||
|
|
||||||
|
include "lib.php";
|
||||||
|
include "func.php";
|
||||||
|
//로그인 검사
|
||||||
|
$session = Session::requireGameLogin()->setReadOnly();
|
||||||
|
|
||||||
|
if ($session->userGrade < 5) {
|
||||||
|
die(requireAdminPermissionHTML());
|
||||||
|
}
|
||||||
|
|
||||||
|
$db = DB::db();
|
||||||
|
$gameStor = KVStorage::getStorage($db, 'game_env');
|
||||||
|
|
||||||
|
$conlimit = $gameStor->conlimit;
|
||||||
|
|
||||||
|
$ipGroupList = Util::arrayGroupBy(
|
||||||
|
$db->query(
|
||||||
|
'SELECT name,ip,lastconnect,owner,block,substring_index(ip,".",3) as ip_c from general WHERE ip!="" and npc<2'
|
||||||
|
),
|
||||||
|
'ip_c'
|
||||||
|
);
|
||||||
|
|
||||||
|
function colorBlockedName($general)
|
||||||
|
{
|
||||||
|
if (!$general['blocked']) {
|
||||||
|
return $general['name'];
|
||||||
|
}
|
||||||
|
return "<span style='color:magenta;'>{$general['name']}</span>";
|
||||||
|
}
|
||||||
|
|
||||||
|
?>
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html>
|
||||||
|
|
||||||
|
<head>
|
||||||
|
<title>멀티관리</title>
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
<meta name="color-scheme" content="dark">
|
||||||
|
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
||||||
|
<meta name="viewport" content="width=1024" />
|
||||||
|
<?= WebUtil::printCSS('../d_shared/common.css') ?>
|
||||||
|
<?= WebUtil::printDist('ts', 'common', true) ?>
|
||||||
|
<link rel="stylesheet" type="text/css" href="https://cdn.jsdelivr.net/gh/orioncactus/pretendard/dist/web/static/pretendard.css" />
|
||||||
|
</head>
|
||||||
|
|
||||||
|
<body>
|
||||||
|
<table align=center width=1000 class='tb_layout bg0'>
|
||||||
|
<tr>
|
||||||
|
<td>멀 티 관 리<br><?= backButton() ?></td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
<form name=form1 method=post action=_admin4_submit.php>
|
||||||
|
<table align=center width=1000 class='tb_layout bg0'>
|
||||||
|
<tr>
|
||||||
|
<td width=80 align=center rowspan=3>회원선택<br><br>
|
||||||
|
<font color=cyan>NPC</font><br>
|
||||||
|
<font color=skyblue>NPC유저</font><br>
|
||||||
|
<font color=red>접속제한</font><br><b style=background-color:red;>블럭회원</b>
|
||||||
|
</td>
|
||||||
|
<td width=105 rowspan=3>
|
||||||
|
<?php
|
||||||
|
|
||||||
|
echo "
|
||||||
|
<select name=genlist[] size=20 multiple style='color:white;background-color:black;font-size:14px'>";
|
||||||
|
|
||||||
|
foreach ($db->query('SELECT no,name,npc,block,con from general where ip!=\'\' order by npc,ip') as $general) {
|
||||||
|
$style = "style=;";
|
||||||
|
if ($general['block'] > 0) {
|
||||||
|
$style .= "background-color:red;";
|
||||||
|
}
|
||||||
|
|
||||||
|
$npcColor = getNPCColor($general['npc']);
|
||||||
|
if($npcColor !== null){
|
||||||
|
$style .= "color:{$npcColor};";
|
||||||
|
}
|
||||||
|
|
||||||
|
echo "
|
||||||
|
<option value={$general['no']} $style>{$general['name']}</option>";
|
||||||
|
}
|
||||||
|
|
||||||
|
echo "
|
||||||
|
</select>";
|
||||||
|
?>
|
||||||
|
</td>
|
||||||
|
<td width=100 align=center>블럭</td>
|
||||||
|
<td width=504>
|
||||||
|
<input type=submit name=btn value='블럭 해제'><input type=submit name=btn value='1단계 블럭'><input type=submit name=btn value='2단계 블럭'><input type=submit name=btn value='3단계 블럭'><input type=submit name=btn value='무한삭턴'><br>
|
||||||
|
1단계:발언권, 2단계:턴블럭
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td align=center>강제 사망</td>
|
||||||
|
<td><input type=submit name=btn value='강제 사망'></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td align=center>메세지 전달</td>
|
||||||
|
<td><input type=textarea size=60 maxlength=255 name=msg style=background-color:black;color:white;><input type=submit name=btn value='메세지 전달'></td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
<table align=center width=1000 class='tb_layout bg0'>
|
||||||
|
<tr>
|
||||||
|
<td align=center width=100>장수명</td>
|
||||||
|
<td align=center width=180>최근로그인</td>
|
||||||
|
<td align=center width=129>IP</td>
|
||||||
|
<td align=center width=100>ID</td>
|
||||||
|
</tr>
|
||||||
|
<?php foreach ($ipGroupList as $ipGroupC => $users) : ?>
|
||||||
|
<tr>
|
||||||
|
<td><?= join('<br>', array_map('\sammo\colorBlockedName', $users)) ?></td>
|
||||||
|
<td><?= join('<br>', array_column($users, 'lastconnect')) ?></td>
|
||||||
|
<td><?= join('<br>', array_column($users, 'ip')) ?></td>
|
||||||
|
<td><?= join('<br>', array_column($users, 'owner')) ?></td>
|
||||||
|
</tr>
|
||||||
|
<?php endforeach; ?>
|
||||||
|
</table>
|
||||||
|
<?php
|
||||||
|
//NOTE: password의 md5 해시가 같은지 확인하는 방식으로는 앞으로 잡아낼 수 없다. 폐기
|
||||||
|
?>
|
||||||
|
</form>
|
||||||
|
<table align=center width=1000 class='tb_layout bg0'>
|
||||||
|
<tr>
|
||||||
|
<td><?= backButton() ?></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td><?= banner() ?> </td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
</body>
|
||||||
|
|
||||||
|
</html>
|
||||||
@@ -0,0 +1,86 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace sammo;
|
||||||
|
|
||||||
|
use sammo\Enums\MessageType;
|
||||||
|
|
||||||
|
include "lib.php";
|
||||||
|
include "func.php";
|
||||||
|
//로그인 검사
|
||||||
|
$session = Session::requireGameLogin()->setReadOnly();
|
||||||
|
|
||||||
|
if ($session->userGrade < 5) {
|
||||||
|
header('location:_admin4.php');
|
||||||
|
die();
|
||||||
|
}
|
||||||
|
|
||||||
|
$btn = Util::getPost('btn');
|
||||||
|
$genlist = Util::getPost('genlist', 'array_int');
|
||||||
|
$msg = Util::getPost('msg', 'string', '메시지');
|
||||||
|
|
||||||
|
$db = DB::db();
|
||||||
|
|
||||||
|
//NOTE: 왜 기능이 admin2와 admin4가 같이 있는가?
|
||||||
|
//NOTE: 왜 블럭 시 admin4에선 금쌀을 없애지 않는가?
|
||||||
|
switch ($btn) {
|
||||||
|
case "블럭 해제":
|
||||||
|
DB::db()->query('update general set block=0 where no IN %li', $genlist);
|
||||||
|
break;
|
||||||
|
case "1단계 블럭":
|
||||||
|
$date = TimeUtil::now();
|
||||||
|
$db = DB::db();
|
||||||
|
$db->query('update general set block=1,killturn=24 where no IN %li', $genlist);
|
||||||
|
//FIXME: subquery로 하는게 더 빠를 듯.
|
||||||
|
$uid = $db->queryFirstColumn('select owner from general where no IN %li', $genlist);
|
||||||
|
RootDB::db()->query('update member set block_num=block_num+1,block_date=%s where id IN %ls', $date, $uid);
|
||||||
|
break;
|
||||||
|
case "2단계 블럭":
|
||||||
|
$date = TimeUtil::now();
|
||||||
|
$db = DB::db();
|
||||||
|
$db->query('update general set block=2,killturn=24 where no IN %li', $genlist);
|
||||||
|
$uid = $db->queryFirstColumn('select owner from general where no IN %li', $genlist);
|
||||||
|
RootDB::db()->query('update member set block_num=block_num+1,block_date=%s where id IN %ls', $date, $uid);
|
||||||
|
break;
|
||||||
|
case "3단계 블럭":
|
||||||
|
$date = TimeUtil::now();
|
||||||
|
$db = DB::db();
|
||||||
|
$db->query('update general set block=3,killturn=24 where no IN %li', $genlist);
|
||||||
|
$uid = $db->queryFirstColumn('select owner from general where no IN %li', $genlist);
|
||||||
|
RootDB::db()->query('update member set block_num=block_num+1,block_date=%s where id IN %ls', $date, $uid);
|
||||||
|
break;
|
||||||
|
case "무한삭턴":
|
||||||
|
DB::db()->query('update general set killturn=8000 where no IN %li', $genlist);
|
||||||
|
break;
|
||||||
|
case "강제 사망":
|
||||||
|
$date = TimeUtil::now(true);
|
||||||
|
$db->update('general', [
|
||||||
|
'killturn' => 0,
|
||||||
|
'turntime' => $date,
|
||||||
|
], '`no` IN %li', $genlist);
|
||||||
|
$db->update('general_turn', [
|
||||||
|
'action' => '휴식',
|
||||||
|
'arg' => '{}',
|
||||||
|
'brief' => '휴식'
|
||||||
|
], 'general_id IN %li AND turn_idx = 0', $genlist);
|
||||||
|
break;
|
||||||
|
case "메세지 전달":
|
||||||
|
$date = TimeUtil::now();
|
||||||
|
$src = MessageTarget::buildQuick($session->generalID);
|
||||||
|
foreach($genlist as $generalID){
|
||||||
|
$msgObj = new Message(
|
||||||
|
MessageType::private,
|
||||||
|
$src,
|
||||||
|
MessageTarget::buildQuick($generalID),
|
||||||
|
$msg,
|
||||||
|
new \DateTime(),
|
||||||
|
new \DateTime('9999-12-31'),
|
||||||
|
[]
|
||||||
|
);
|
||||||
|
if ($msgObj) {
|
||||||
|
$msgObj->send(true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
header('location:_admin4.php');
|
||||||
@@ -66,6 +66,8 @@ $sel2[$type2] = "selected";
|
|||||||
<option <?= $sel[8] ?? '' ?> value=8>평무</option>
|
<option <?= $sel[8] ?? '' ?> value=8>평무</option>
|
||||||
<option <?= $sel[9] ?? '' ?> value=9>평지</option>
|
<option <?= $sel[9] ?? '' ?> value=9>평지</option>
|
||||||
<option <?= $sel[10] ?? '' ?> value=10>평Lv</option>
|
<option <?= $sel[10] ?? '' ?> value=10>평Lv</option>
|
||||||
|
<option <?= $sel[11] ?? '' ?> value=11>접속률</option>
|
||||||
|
<option <?= $sel[12] ?? '' ?> value=12>단기접</option>
|
||||||
<option <?= $sel[13] ?? '' ?> value=13>보숙</option>
|
<option <?= $sel[13] ?? '' ?> value=13>보숙</option>
|
||||||
<option <?= $sel[14] ?? '' ?> value=14>궁숙</option>
|
<option <?= $sel[14] ?? '' ?> value=14>궁숙</option>
|
||||||
<option <?= $sel[15] ?? '' ?> value=15>기숙</option>
|
<option <?= $sel[15] ?? '' ?> value=15>기숙</option>
|
||||||
@@ -103,6 +105,8 @@ $sel2[$type2] = "selected";
|
|||||||
<table align=center width=1600 class="tb_layout bg0">
|
<table align=center width=1600 class="tb_layout bg0">
|
||||||
<tr class='bg1'>
|
<tr class='bg1'>
|
||||||
<td align=center>국명</td>
|
<td align=center>국명</td>
|
||||||
|
<td align=center>접률</td>
|
||||||
|
<td align=center>단접</td>
|
||||||
<td align=center>국력</td>
|
<td align=center>국력</td>
|
||||||
<td align=center>장수</td>
|
<td align=center>장수</td>
|
||||||
<td align=center>속령</td>
|
<td align=center>속령</td>
|
||||||
@@ -143,6 +147,8 @@ SELECT
|
|||||||
A.gold,
|
A.gold,
|
||||||
A.rice,
|
A.rice,
|
||||||
COUNT(B.nation) AS gennum,
|
COUNT(B.nation) AS gennum,
|
||||||
|
ROUND(AVG(B.connect), 1) AS connect,
|
||||||
|
ROUND(AVG(B.con), 1) AS con,
|
||||||
ROUND(AVG(B.dex1)) AS dex1,
|
ROUND(AVG(B.dex1)) AS dex1,
|
||||||
ROUND(AVG(B.dex2)) AS dex2,
|
ROUND(AVG(B.dex2)) AS dex2,
|
||||||
ROUND(AVG(B.dex3)) AS dex3,
|
ROUND(AVG(B.dex3)) AS dex3,
|
||||||
@@ -187,6 +193,12 @@ GROUP BY B.nation
|
|||||||
case 10:
|
case 10:
|
||||||
$query .= " order by avg(B.explevel) desc";
|
$query .= " order by avg(B.explevel) desc";
|
||||||
break;
|
break;
|
||||||
|
case 11:
|
||||||
|
$query .= " order by avg(B.connect) desc";
|
||||||
|
break;
|
||||||
|
case 12:
|
||||||
|
$query .= " order by avg(B.con) desc";
|
||||||
|
break;
|
||||||
case 13:
|
case 13:
|
||||||
$query .= " order by avg(B.dex1) desc";
|
$query .= " order by avg(B.dex1) desc";
|
||||||
break;
|
break;
|
||||||
@@ -228,6 +240,8 @@ from city where nation=%i', $nation['nation']);
|
|||||||
echo "
|
echo "
|
||||||
<tr>
|
<tr>
|
||||||
<td align=center style=background-color:{$nation['color']};color:" . newColor($nation['color']) . ";>{$nation['name']}</td>
|
<td align=center style=background-color:{$nation['color']};color:" . newColor($nation['color']) . ";>{$nation['name']}</td>
|
||||||
|
<td align=center> {$nation['connect']} </td>
|
||||||
|
<td align=center> {$nation['con']} </td>
|
||||||
<td align=center> {$nation['power']} </td>
|
<td align=center> {$nation['power']} </td>
|
||||||
<td align=center> {$gen['cnt']} </td>
|
<td align=center> {$gen['cnt']} </td>
|
||||||
<td align=center> {$city['cnt']} </td>
|
<td align=center> {$city['cnt']} </td>
|
||||||
|
|||||||
+1
-3
@@ -2,8 +2,6 @@
|
|||||||
|
|
||||||
namespace sammo;
|
namespace sammo;
|
||||||
|
|
||||||
use sammo\Enums\GeneralQueryMode;
|
|
||||||
|
|
||||||
include "lib.php";
|
include "lib.php";
|
||||||
include "func.php";
|
include "func.php";
|
||||||
|
|
||||||
@@ -76,7 +74,7 @@ if (!$gen) {
|
|||||||
$gen = $generalBasicList[0]['no'];
|
$gen = $generalBasicList[0]['no'];
|
||||||
}
|
}
|
||||||
|
|
||||||
$generalObj = General::createObjFromDB($gen, null, GeneralQueryMode::FullWithAccessLog);
|
$generalObj = General::createGeneralObjFromDB($gen);
|
||||||
|
|
||||||
?>
|
?>
|
||||||
<!DOCTYPE html>
|
<!DOCTYPE html>
|
||||||
|
|||||||
@@ -26,7 +26,7 @@ foreach ($db->queryFirstColumn(
|
|||||||
}
|
}
|
||||||
|
|
||||||
$inheritPointManager = InheritancePointManager::getInstance();
|
$inheritPointManager = InheritancePointManager::getInstance();
|
||||||
foreach(General::createObjListFromDB($db->queryFirstColumn('SELECT `no` FROM general WHERE npc = 0')) as $genObj){
|
foreach(General::createGeneralObjListFromDB($db->queryFirstColumn('SELECT `no` FROM general WHERE npc = 0')) as $genObj){
|
||||||
$inheritPointManager->mergeTotalInheritancePoint($genObj);
|
$inheritPointManager->mergeTotalInheritancePoint($genObj);
|
||||||
$inheritPointManager->applyInheritanceUser($genObj->getVar('owner'));
|
$inheritPointManager->applyInheritanceUser($genObj->getVar('owner'));
|
||||||
}
|
}
|
||||||
+8
-16
@@ -16,13 +16,10 @@ $gameStor = KVStorage::getStorage($db, 'game_env');
|
|||||||
|
|
||||||
increaseRefresh("장수일람", 2);
|
increaseRefresh("장수일람", 2);
|
||||||
|
|
||||||
$me = $db->queryFirstRow(
|
$me = $db->queryFirstRow('SELECT con,turntime FROM general WHERE owner = %i', $userID);
|
||||||
'SELECT refresh_score,turntime FROM `general`
|
|
||||||
LEFT JOIN general_access_log AS l ON `general`.no = l.general_id WHERE owner = %i', $userID
|
|
||||||
);
|
|
||||||
|
|
||||||
$limitState = checkLimit($me['refresh_score']);
|
$con = checkLimit($me['con']);
|
||||||
if ($limitState >= 2) {
|
if ($con >= 2) {
|
||||||
printLimitMsg($me['turntime']);
|
printLimitMsg($me['turntime']);
|
||||||
exit();
|
exit();
|
||||||
}
|
}
|
||||||
@@ -105,7 +102,7 @@ if ($gameStor->isunited) {
|
|||||||
6 => ['dedication', true],
|
6 => ['dedication', true],
|
||||||
7 => ['officer_level', true],
|
7 => ['officer_level', true],
|
||||||
8 => ['killturn', false],
|
8 => ['killturn', false],
|
||||||
9 => ['refresh_score_total', true],
|
9 => ['connect', true],
|
||||||
10 => ['experience', true],
|
10 => ['experience', true],
|
||||||
11 => ['personal', true],
|
11 => ['personal', true],
|
||||||
12 => ['special', true],
|
12 => ['special', true],
|
||||||
@@ -114,12 +111,7 @@ if ($gameStor->isunited) {
|
|||||||
15 => ['npc', true],
|
15 => ['npc', true],
|
||||||
][$type];
|
][$type];
|
||||||
|
|
||||||
$generalList = $db->query(
|
$generalList = $db->query('SELECT owner,no,picture,imgsvr,npc,age,nation,special,special2,personal,name,injury,leadership,strength,intel,experience,dedication,officer_level,killturn,connect from general order by %b %l', $orderKey, $orderDesc ? 'desc' : '');
|
||||||
'SELECT owner,no,picture,imgsvr,npc,age,nation,special,special2,personal,name,injury,leadership,strength,intel,experience,dedication,officer_level,killturn,refresh_score_total
|
|
||||||
FROM `general` LEFT JOIN `general_access_log` ON general.no = general_access_log.general_id order by %b %l',
|
|
||||||
$orderKey,
|
|
||||||
$orderDesc ? 'desc' : ''
|
|
||||||
);
|
|
||||||
|
|
||||||
echo "
|
echo "
|
||||||
<table align=center width=1000 class='tb_layout bg0'>
|
<table align=center width=1000 class='tb_layout bg0'>
|
||||||
@@ -171,7 +163,7 @@ if ($gameStor->isunited) {
|
|||||||
$name = $name . '<br><small>(' . $ownerNameList[$general['owner']] . ')</small>';
|
$name = $name . '<br><small>(' . $ownerNameList[$general['owner']] . ')</small>';
|
||||||
}
|
}
|
||||||
|
|
||||||
$general['refresh_score_total'] = Util::round($general['refresh_score_total'], -1);
|
$general['connect'] = Util::round($general['connect'], -1);
|
||||||
|
|
||||||
$imageTemp = GetImageURL($general['imgsvr']);
|
$imageTemp = GetImageURL($general['imgsvr']);
|
||||||
echo "
|
echo "
|
||||||
@@ -200,8 +192,8 @@ if ($gameStor->isunited) {
|
|||||||
<td align=center>$strength</td>
|
<td align=center>$strength</td>
|
||||||
<td align=center>$intel</td>
|
<td align=center>$intel</td>
|
||||||
<td align=center>{$general['killturn']}</td>
|
<td align=center>{$general['killturn']}</td>
|
||||||
<td align=center>" . $general['refresh_score_total'] ?? 0;
|
<td align=center>{$general['connect']}";
|
||||||
echo "<br>【" . getRefreshScoreText($general['refresh_score_total'] ?? 0) . "】</td>
|
echo "<br>【" . getConnect($general['connect']) . "】</td>
|
||||||
</tr>";
|
</tr>";
|
||||||
}
|
}
|
||||||
echo "
|
echo "
|
||||||
|
|||||||
@@ -13,13 +13,10 @@ $gameStor = KVStorage::getStorage($db, 'game_env');
|
|||||||
$gameStor->cacheValues(['killturn', 'autorun_user', 'turnterm']);
|
$gameStor->cacheValues(['killturn', 'autorun_user', 'turnterm']);
|
||||||
increaseRefresh("세력일람", 2);
|
increaseRefresh("세력일람", 2);
|
||||||
|
|
||||||
$me = $db->queryFirstRow(
|
$me = $db->queryFirstRow('SELECT con, turntime FROM general WHERE owner=%i', $userID);
|
||||||
'SELECT refresh_score, turntime FROM `general`
|
|
||||||
LEFT JOIN general_access_log AS l ON `general`.no = l.general_id WHERE owner=%i', $userID
|
|
||||||
);
|
|
||||||
|
|
||||||
$limitState = checkLimit($me['refresh_score']);
|
$con = checkLimit($me['con']);
|
||||||
if ($limitState >= 2) {
|
if ($con >= 2) {
|
||||||
printLimitMsg($me['turntime']);
|
printLimitMsg($me['turntime']);
|
||||||
exit();
|
exit();
|
||||||
}
|
}
|
||||||
|
|||||||
+39
-31
@@ -2,8 +2,6 @@
|
|||||||
|
|
||||||
namespace sammo;
|
namespace sammo;
|
||||||
|
|
||||||
use sammo\Enums\GeneralAccessLogColumn;
|
|
||||||
|
|
||||||
include "lib.php";
|
include "lib.php";
|
||||||
include "func.php";
|
include "func.php";
|
||||||
|
|
||||||
@@ -12,19 +10,34 @@ $gameStor = KVStorage::getStorage($db, 'game_env');
|
|||||||
|
|
||||||
increaseRefresh("갱신정보", 1);
|
increaseRefresh("갱신정보", 1);
|
||||||
|
|
||||||
$admin = $gameStor->getValues(['year', 'month', 'refresh', 'maxrefresh', 'maxonline', 'recentTraffic']);
|
$admin = $gameStor->getValues(['year', 'month', 'refresh', 'maxrefresh', 'maxonline']);
|
||||||
|
|
||||||
$recentTraffic = $admin['recentTraffic'] ?? [];
|
$log = getRawFileLogRecent(__DIR__ . '/logs/' . UniqueConst::$serverID . '/_traffic.txt', 11, 100);
|
||||||
|
|
||||||
|
$date = [];
|
||||||
|
$year = [];
|
||||||
|
$month = [];
|
||||||
|
$refresh = [];
|
||||||
|
$online = [];
|
||||||
|
|
||||||
$curonline = getOnlineNum();
|
$curonline = getOnlineNum();
|
||||||
|
foreach ($log as $i => $value) {
|
||||||
$recentTraffic[] = [
|
$parse = Json::decode($value);
|
||||||
'year' => $admin['year'],
|
if(is_array($parse) === false){
|
||||||
'month' => $admin['month'],
|
continue;
|
||||||
'refresh' => $admin['refresh'],
|
}
|
||||||
'online' => $curonline,
|
if(count($parse) < 5){
|
||||||
'date' => TimeUtil::now()
|
continue;
|
||||||
];
|
}
|
||||||
|
$date[$i] = $parse[0];
|
||||||
|
$year[$i] = $parse[1];
|
||||||
|
$month[$i] = $parse[2];
|
||||||
|
$refresh[$i] = $parse[3];
|
||||||
|
$online[$i] = $parse[4];
|
||||||
|
}
|
||||||
|
$year[] = $admin['year'];
|
||||||
|
$month[] = $admin['month'];
|
||||||
|
$date[] = TimeUtil::now();
|
||||||
|
|
||||||
if ($admin['maxrefresh'] == 0) {
|
if ($admin['maxrefresh'] == 0) {
|
||||||
$admin['maxrefresh'] = 1;
|
$admin['maxrefresh'] = 1;
|
||||||
@@ -98,13 +111,13 @@ if ($admin['maxonline'] < $curonline) {
|
|||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
<?php
|
<?php
|
||||||
foreach ($recentTraffic as $trafficItem) {
|
$refresh[] = $admin['refresh'];
|
||||||
$value = $trafficItem['refresh'];
|
foreach ($refresh as $i => $value) {
|
||||||
$w = round($value / $admin['maxrefresh'] * 100, 1);
|
$w = round($value / $admin['maxrefresh'] * 100, 1);
|
||||||
$color = getTrafficColor($w);
|
$color = getTrafficColor($w);
|
||||||
$dt = substr($trafficItem['date'], 11, 5); ?>
|
$dt = substr($date[$i], 11, 5); ?>
|
||||||
<tr height=30>
|
<tr height=30>
|
||||||
<td width=100 align=center><?= $trafficItem['year'] ?>년 <?= $trafficItem['month'] ?>월</td>
|
<td width=100 align=center><?= $year[$i] ?>년 <?= $month[$i] ?>월</td>
|
||||||
<td width=60 align=center class='bg2'><?= $dt ?></td>
|
<td width=60 align=center class='bg2'><?= $dt ?></td>
|
||||||
<td width=2 align=center class='bg1'></td>
|
<td width=2 align=center class='bg1'></td>
|
||||||
<td width=320>
|
<td width=320>
|
||||||
@@ -139,13 +152,13 @@ if ($admin['maxonline'] < $curonline) {
|
|||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
<?php
|
<?php
|
||||||
foreach ($recentTraffic as $trafficItem) {
|
$online[] = $curonline;
|
||||||
$value = $trafficItem['online'];
|
foreach ($online as $i => $value) {
|
||||||
$w = round($value / $admin['maxonline'] * 100, 1);
|
$w = round($value / $admin['maxonline'] * 100, 1);
|
||||||
$color = getTrafficColor($w);
|
$color = getTrafficColor($w);
|
||||||
$dt = substr($trafficItem['date'], 11, 5); ?>
|
$dt = substr($date[$i], 11, 5); ?>
|
||||||
<tr height=30>
|
<tr height=30>
|
||||||
<td width=100 align=center><?= $trafficItem['year'] ?>년 <?= $trafficItem['month'] ?>월</td>
|
<td width=100 align=center><?= $year[$i] ?>년 <?= $month[$i] ?>월</td>
|
||||||
<td width=60 align=center class='bg2'><?= $dt ?></td>
|
<td width=60 align=center class='bg2'><?= $dt ?></td>
|
||||||
<td width=2 align=center class='bg1'></td>
|
<td width=2 align=center class='bg1'></td>
|
||||||
<td width=320>
|
<td width=320>
|
||||||
@@ -180,24 +193,19 @@ if ($admin['maxonline'] < $curonline) {
|
|||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
<?php
|
<?php
|
||||||
$totalRefresh = [
|
$max_refresh = $db->queryFirstRow('SELECT sum(refresh) as refresh, sum(`connect`) as `connect` from general');
|
||||||
...$db->queryFirstRow('SELECT sum(`refresh`) as `refresh`, sum(`refresh_score_total`) as `refresh_score_total` from general_access_log'),
|
$max_refresh['name'] = '접속자 총합';
|
||||||
'name' => '접속자 총합'
|
|
||||||
];
|
|
||||||
|
|
||||||
$top5Refresh = $db->query(
|
$refresh_result = array_merge([$max_refresh], $db->query('SELECT `name`,refresh,`connect` FROM general ORDER BY refresh DESC LIMIT 5'));
|
||||||
'SELECT `name`, `log`.`refresh`, `refresh_score_total` FROM `general_access_log` AS `log`
|
|
||||||
INNER JOIN `general` ON `log`.`general_id` = `general`.`no` ORDER BY `log`.`refresh` DESC LIMIT 5'
|
|
||||||
);
|
|
||||||
|
|
||||||
foreach (array_merge([$totalRefresh], $top5Refresh) as $i => $user) {
|
foreach ($refresh_result as $i => $user) {
|
||||||
$w = round($user['refresh'] / max(1, $totalRefresh['refresh']) * 100, 1);
|
$w = round($user['refresh'] / max(1, $max_refresh['refresh']) * 100, 1);
|
||||||
$w2 = round(100 - $w, 1);
|
$w2 = round(100 - $w, 1);
|
||||||
$color = getTrafficColor($w);
|
$color = getTrafficColor($w);
|
||||||
?>
|
?>
|
||||||
<tr>
|
<tr>
|
||||||
<td width=98 align=center><?= $user['name'] ?></td>
|
<td width=98 align=center><?= $user['name'] ?></td>
|
||||||
<td width=98 align=center><?= $user['refresh_score_total'] ?>(<?= $user['refresh'] ?>)</td>
|
<td width=98 align=center><?= $user['connect'] ?>(<?= $user['refresh'] ?>)</td>
|
||||||
<td width=798>
|
<td width=798>
|
||||||
<?php if ($w == 0) : ?>
|
<?php if ($w == 0) : ?>
|
||||||
<?php elseif ($w < 10) : ?>
|
<?php elseif ($w < 10) : ?>
|
||||||
|
|||||||
+11
-16
@@ -2,8 +2,6 @@
|
|||||||
|
|
||||||
namespace sammo;
|
namespace sammo;
|
||||||
|
|
||||||
use sammo\Enums\GeneralLiteQueryMode;
|
|
||||||
use sammo\Enums\GeneralQueryMode;
|
|
||||||
use sammo\Enums\RankColumn;
|
use sammo\Enums\RankColumn;
|
||||||
|
|
||||||
include "lib.php";
|
include "lib.php";
|
||||||
@@ -23,15 +21,12 @@ $generalID = $session->generalID;
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
$me = $db->queryFirstRow(
|
$me = $db->queryFirstRow('SELECT no,tournament,con,turntime from general where owner=%i', $userID);
|
||||||
'SELECT no,tournament,refresh_score,turntime FROM `general`
|
|
||||||
LEFT JOIN general_access_log AS l ON `general`.no = l.general_id where owner=%i', $userID
|
|
||||||
);
|
|
||||||
|
|
||||||
$admin = $gameStor->getValues(['tournament', 'phase', 'tnmt_type', 'turnterm', 'develcost']);
|
$admin = $gameStor->getValues(['tournament', 'phase', 'tnmt_type', 'turnterm', 'develcost']);
|
||||||
$turnTerm = $admin['turnterm'];
|
$turnTerm = $admin['turnterm'];
|
||||||
$limitState = checkLimit($me['refresh_score']);
|
$con = checkLimit($me['con']);
|
||||||
if ($limitState >= 2) {
|
if ($con >= 2) {
|
||||||
printLimitMsg($me['turntime']);
|
printLimitMsg($me['turntime']);
|
||||||
exit();
|
exit();
|
||||||
}
|
}
|
||||||
@@ -112,7 +107,7 @@ if ($str3) {
|
|||||||
?>
|
?>
|
||||||
<!DOCTYPE html>
|
<!DOCTYPE html>
|
||||||
<html>
|
<html>
|
||||||
<?php if ($limitState == 1) {
|
<?php if ($con == 1) {
|
||||||
MessageBox("접속제한이 얼마 남지 않았습니다!");
|
MessageBox("접속제한이 얼마 남지 않았습니다!");
|
||||||
} ?>
|
} ?>
|
||||||
|
|
||||||
@@ -507,28 +502,28 @@ if ($str3) {
|
|||||||
$tournamentType = [
|
$tournamentType = [
|
||||||
'전 력 전' => [
|
'전 력 전' => [
|
||||||
'종합',
|
'종합',
|
||||||
function (GeneralLite $general) {
|
function (General $general) {
|
||||||
return $general->getVar('leadership') + $general->getVar('strength') + $general->getVar('intel');
|
return $general->getVar('leadership') + $general->getVar('strength') + $general->getVar('intel');
|
||||||
},
|
},
|
||||||
'tt',
|
'tt',
|
||||||
],
|
],
|
||||||
'통 솔 전' => [
|
'통 솔 전' => [
|
||||||
'통솔',
|
'통솔',
|
||||||
function (GeneralLite $general) {
|
function (General $general) {
|
||||||
return $general->getVar('leadership');
|
return $general->getVar('leadership');
|
||||||
},
|
},
|
||||||
'tl',
|
'tl',
|
||||||
],
|
],
|
||||||
'일 기 토' => [
|
'일 기 토' => [
|
||||||
'무력',
|
'무력',
|
||||||
function (GeneralLite $general) {
|
function (General $general) {
|
||||||
return $general->getVar('strength');
|
return $general->getVar('strength');
|
||||||
},
|
},
|
||||||
'ts',
|
'ts',
|
||||||
],
|
],
|
||||||
'설 전' => [
|
'설 전' => [
|
||||||
'지력',
|
'지력',
|
||||||
function (GeneralLite $general) {
|
function (General $general) {
|
||||||
return $general->getVar('intel');
|
return $general->getVar('intel');
|
||||||
},
|
},
|
||||||
'ti',
|
'ti',
|
||||||
@@ -565,12 +560,12 @@ if ($str3) {
|
|||||||
$winColumn = RankColumn::from("{$rankColumn}w");
|
$winColumn = RankColumn::from("{$rankColumn}w");
|
||||||
$drawColumn = RankColumn::from("{$rankColumn}d");
|
$drawColumn = RankColumn::from("{$rankColumn}d");
|
||||||
$loseColumn = RankColumn::from("{$rankColumn}l");
|
$loseColumn = RankColumn::from("{$rankColumn}l");
|
||||||
$tournamentRankerList = GeneralLite::createObjListFromDB(
|
$tournamentRankerList = General::createGeneralObjListFromDB(
|
||||||
$db->queryFirstColumn('SELECT general_id FROM rank_data WHERE `type`= %s ORDER BY value DESC LIMIT 40', $gameColumn->value),
|
$db->queryFirstColumn('SELECT general_id FROM rank_data WHERE `type`= %s ORDER BY value DESC LIMIT 40', $gameColumn->value),
|
||||||
[$prizeColumn->value, $gameColumn->value, $winColumn->value, $drawColumn->value, $loseColumn->value, 'leadership', 'strength', 'intel', 'no', 'npc', 'name'],
|
[$prizeColumn->value, $gameColumn->value, $winColumn->value, $drawColumn->value, $loseColumn->value, 'leadership', 'strength', 'intel', 'no', 'npc', 'name'],
|
||||||
GeneralLiteQueryMode::Core
|
0
|
||||||
);
|
);
|
||||||
usort($tournamentRankerList, function (GeneralLite $lhs, GeneralLite $rhs) use ($gameColumn, $winColumn, $drawColumn, $loseColumn) {
|
usort($tournamentRankerList, function (General $lhs, General $rhs) use ($gameColumn, $winColumn, $drawColumn, $loseColumn) {
|
||||||
$result = - ($lhs->getRankVar($gameColumn) <=> $rhs->getRankVar($gameColumn));
|
$result = - ($lhs->getRankVar($gameColumn) <=> $rhs->getRankVar($gameColumn));
|
||||||
if ($result !== 0) return $result;
|
if ($result !== 0) return $result;
|
||||||
$result = - (
|
$result = - (
|
||||||
|
|||||||
@@ -211,7 +211,7 @@ $templates = new \League\Plates\Engine('templates');
|
|||||||
$city['trade'] = "- ";
|
$city['trade'] = "- ";
|
||||||
}
|
}
|
||||||
|
|
||||||
$dbColumns = General::mergeQueryColumn(['npc', 'defence_train', 'no', 'picture', 'imgsvr', 'name', 'injury', 'leadership', 'strength', 'intel', 'officer_level', 'nation', 'crewtype', 'crew', 'train', 'atmos'])[0];
|
$dbColumns = General::mergeQueryColumn(['npc', 'defence_train', 'no', 'picture', 'imgsvr', 'name', 'injury', 'leadership', 'strength', 'intel', 'officer_level', 'nation', 'crewtype', 'crew', 'train', 'atmos'], 2)[0];
|
||||||
if ($showDetailedInfo) {
|
if ($showDetailedInfo) {
|
||||||
$generals = $db->query(
|
$generals = $db->query(
|
||||||
'SELECT %l from general where city=%i order by turntime',
|
'SELECT %l from general where city=%i order by turntime',
|
||||||
@@ -327,7 +327,8 @@ $templates = new \League\Plates\Engine('templates');
|
|||||||
|
|
||||||
if ($ourGeneral && !$isNPC) {
|
if ($ourGeneral && !$isNPC) {
|
||||||
$turnText = [];
|
$turnText = [];
|
||||||
foreach ($generalTurnList[$general['no']] as $turnRawIdx => $turn) {
|
$generalObj = new General($general, null, null, null, null, null, false);
|
||||||
|
foreach ($generalTurnList[$generalObj->getID()] as $turnRawIdx => $turn) {
|
||||||
$turnIdx = $turnRawIdx + 1;
|
$turnIdx = $turnRawIdx + 1;
|
||||||
$turnText[] = "{$turnIdx} : $turn";
|
$turnText[] = "{$turnIdx} : $turn";
|
||||||
}
|
}
|
||||||
|
|||||||
+4
-7
@@ -19,15 +19,12 @@ $gameStor = KVStorage::getStorage($db, 'game_env');
|
|||||||
|
|
||||||
increaseRefresh("암행부", 1);
|
increaseRefresh("암행부", 1);
|
||||||
|
|
||||||
$me = $db->queryFirstRow(
|
$me = $db->queryFirstRow('SELECT no,nation,officer_level,con,turntime,belong,permission,penalty from general where owner=%i', $userID);
|
||||||
'SELECT no,nation,officer_level,refresh_score,turntime,belong,permission,penalty FROM `general`
|
|
||||||
LEFT JOIN general_access_log AS l ON `general`.no = l.general_id WHERE owner=%i', $userID
|
|
||||||
);
|
|
||||||
|
|
||||||
$nationLevel = $db->queryFirstField('SELECT level FROM nation WHERE nation=%i', $me['nation']);
|
$nationLevel = $db->queryFirstField('SELECT level FROM nation WHERE nation=%i', $me['nation']);
|
||||||
|
|
||||||
$limitState = checkLimit($me['refresh_score']);
|
$con = checkLimit($me['con']);
|
||||||
if ($limitState >= 2) {
|
if ($con >= 2) {
|
||||||
printLimitMsg($me['turntime']);
|
printLimitMsg($me['turntime']);
|
||||||
exit();
|
exit();
|
||||||
}
|
}
|
||||||
@@ -48,7 +45,7 @@ $templates = new \League\Plates\Engine('templates');
|
|||||||
?>
|
?>
|
||||||
<!DOCTYPE html>
|
<!DOCTYPE html>
|
||||||
<html>
|
<html>
|
||||||
<?php if ($limitState == 1) {
|
<?php if ($con == 1) {
|
||||||
MessageBox("접속제한이 얼마 남지 않았습니다!");
|
MessageBox("접속제한이 얼마 남지 않았습니다!");
|
||||||
} ?>
|
} ?>
|
||||||
|
|
||||||
|
|||||||
+4
-6
@@ -97,7 +97,7 @@ if ($gameStor->isunited) {
|
|||||||
7 => ['gold', true],
|
7 => ['gold', true],
|
||||||
8 => ['rice', true],
|
8 => ['rice', true],
|
||||||
9 => ['crew', true],
|
9 => ['crew', true],
|
||||||
10 => ['refresh_score_total', true],
|
10 => ['connect', true],
|
||||||
11 => ['personal', true],
|
11 => ['personal', true],
|
||||||
12 => ['special', true],
|
12 => ['special', true],
|
||||||
13 => ['special2', true],
|
13 => ['special2', true],
|
||||||
@@ -105,9 +105,7 @@ if ($gameStor->isunited) {
|
|||||||
15 => ['npc', true],
|
15 => ['npc', true],
|
||||||
][$type];
|
][$type];
|
||||||
|
|
||||||
$generalList = $db->query(
|
$generalList = $db->query('SELECT owner,no,picture,imgsvr,npc,age,nation,special,special2,personal,name,injury,leadership,strength,intel,experience,dedication,officer_level,killturn,connect,gold,rice,crew,belong from general where nation = %i order by %b %l', $me['nation'], $orderKey, $orderDesc ? 'desc' : '');
|
||||||
'SELECT owner,no,picture,imgsvr,npc,age,nation,special,special2,personal,name,injury,leadership,strength,intel,experience,dedication,officer_level,killturn,refresh_score_total,gold,rice,crew,belong
|
|
||||||
FROM `general` LEFT JOIN `general_access_log` ON general.no = general_access_log.general_id where nation = %i order by %b %l', $me['nation'], $orderKey, $orderDesc ? 'desc' : '');
|
|
||||||
|
|
||||||
echo "
|
echo "
|
||||||
<table align=center class='tb_layout bg0'>
|
<table align=center class='tb_layout bg0'>
|
||||||
@@ -175,8 +173,8 @@ if ($gameStor->isunited) {
|
|||||||
<td align=center>" . displayCharInfo($general['personal']) . "</td>
|
<td align=center>" . displayCharInfo($general['personal']) . "</td>
|
||||||
<td align=center>" . displaySpecialDomesticInfo($general['special']) . " / " . displaySpecialWarInfo($general['special2']) . "</td>
|
<td align=center>" . displaySpecialDomesticInfo($general['special']) . " / " . displaySpecialWarInfo($general['special2']) . "</td>
|
||||||
<td align=center>{$general['belong']}</td>
|
<td align=center>{$general['belong']}</td>
|
||||||
<td align=center>". $general['refresh_score_total'] ?? 0;
|
<td align=center>{$general['connect']}";
|
||||||
echo "<br>(" . getRefreshScoreText($general['refresh_score_total'] ?? 0) . ")</td>
|
echo "<br>(" . getConnect($general['connect']) . ")</td>
|
||||||
</tr>";
|
</tr>";
|
||||||
}
|
}
|
||||||
echo "
|
echo "
|
||||||
|
|||||||
+11
-37
@@ -2,10 +2,6 @@
|
|||||||
|
|
||||||
namespace sammo;
|
namespace sammo;
|
||||||
|
|
||||||
use sammo\Enums\GeneralAccessLogColumn;
|
|
||||||
use sammo\Enums\GeneralQueryMode;
|
|
||||||
use sammo\Enums\TableName;
|
|
||||||
|
|
||||||
include "lib.php";
|
include "lib.php";
|
||||||
include "func.php";
|
include "func.php";
|
||||||
|
|
||||||
@@ -24,7 +20,7 @@ $gameStor->cacheValues(['turntime', 'opentime', 'autorun_user', 'npcmode']);
|
|||||||
|
|
||||||
increaseRefresh("내정보", 1);
|
increaseRefresh("내정보", 1);
|
||||||
|
|
||||||
$me = General::createObjFromDB($generalID, null, GeneralQueryMode::FullWithAccessLog);
|
$me = General::createGeneralObjFromDB($generalID);
|
||||||
|
|
||||||
$myset = $me->getVar('myset');
|
$myset = $me->getVar('myset');
|
||||||
if ($myset > 0) {
|
if ($myset > 0) {
|
||||||
@@ -33,15 +29,7 @@ if ($myset > 0) {
|
|||||||
$submit = 'hidden';
|
$submit = 'hidden';
|
||||||
}
|
}
|
||||||
|
|
||||||
$lastRefresh = $db->queryFirstField(
|
$targetTime = addTurn($me->getVar('lastrefresh'), $gameStor->turnterm, GameConst::$minTurnDieOnPrestart);
|
||||||
'SELECT %b FROM %b WHERE %b = %i',
|
|
||||||
GeneralAccessLogColumn::lastRefresh->value,
|
|
||||||
TableName::generalAccessLog->value,
|
|
||||||
GeneralAccessLogColumn::generalID->value,
|
|
||||||
$generalID
|
|
||||||
);
|
|
||||||
|
|
||||||
$targetTime = addTurn($lastRefresh, $gameStor->turnterm, GameConst::$minTurnDieOnPrestart);
|
|
||||||
if ($gameStor->turntime <= $gameStor->opentime) {
|
if ($gameStor->turntime <= $gameStor->opentime) {
|
||||||
//서버 가오픈시 할 수 있는 행동
|
//서버 가오픈시 할 수 있는 행동
|
||||||
if ($me->getNPCType() == 0 && $me->getNationID() == 0) {
|
if ($me->getNPCType() == 0 && $me->getNationID() == 0) {
|
||||||
@@ -51,19 +39,13 @@ if ($gameStor->turntime <= $gameStor->opentime) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($me->getNationID() == 0) {
|
if($me->getNationID() == 0){
|
||||||
$showBuildNationCandidateBtn = true;
|
$showBuildNationCandidateBtn = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
$use_treatment = $me->getAuxVar('use_treatment') ?? 10;
|
$use_treatment = $me->getAuxVar('use_treatment') ?? 10;
|
||||||
$use_auto_nation_turn = $me->getAuxVar('use_auto_nation_turn') ?? 1;
|
$use_auto_nation_turn = $me->getAuxVar('use_auto_nation_turn') ?? 1;
|
||||||
|
|
||||||
$changeDefence999Train = -3;
|
|
||||||
$changeDefence999Atmos = -6;
|
|
||||||
$changeDefence999Train = $me->onCalcDomestic('changeDefenceTrain', "train999", $changeDefence999Train);
|
|
||||||
$changeDefence999Atmos = $me->onCalcDomestic('changeDefenceTrain', "atmos999", $changeDefence999Atmos);
|
|
||||||
|
|
||||||
?>
|
?>
|
||||||
<!DOCTYPE html>
|
<!DOCTYPE html>
|
||||||
<html>
|
<html>
|
||||||
@@ -99,13 +81,13 @@ $changeDefence999Atmos = $me->onCalcDomestic('changeDefenceTrain', "atmos999", $
|
|||||||
<div class="col">내 정 보<br><?= backButton() ?></div>
|
<div class="col">내 정 보<br><?= backButton() ?></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="row gx-0">
|
<div class="row gx-0">
|
||||||
<div class="col col-12 col-lg-6">
|
<div class="col col-12 col-md-6">
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col"><?php generalInfo($me); ?><?php generalInfo2($me); ?></div>
|
<div class="col"><?php generalInfo($me); ?><?php generalInfo2($me); ?></div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="col col-12 col-lg-6">
|
<div class="col col-12 col-md-6">
|
||||||
<div class="row mx-0 gx-0">
|
<div class="row mx-0 gx-0">
|
||||||
<div class="col" style='padding-left:2ch;'>
|
<div class="col" style='padding-left:2ch;'>
|
||||||
토너먼트 【
|
토너먼트 【
|
||||||
@@ -135,10 +117,7 @@ $changeDefence999Atmos = $me->onCalcDomestic('changeDefenceTrain', "atmos999", $
|
|||||||
<?php foreach ([90, 80, 60, 40] as $targetDefenceTrain) : ?>
|
<?php foreach ([90, 80, 60, 40] as $targetDefenceTrain) : ?>
|
||||||
<option value='<?= $targetDefenceTrain ?>' <?= $me->getVar('defence_train') == $targetDefenceTrain ? "selected" : ""; ?>><?= formatDefenceTrain($targetDefenceTrain) ?>(훈사<?= $targetDefenceTrain ?>)</option>
|
<option value='<?= $targetDefenceTrain ?>' <?= $me->getVar('defence_train') == $targetDefenceTrain ? "selected" : ""; ?>><?= formatDefenceTrain($targetDefenceTrain) ?>(훈사<?= $targetDefenceTrain ?>)</option>
|
||||||
<?php endforeach; ?>
|
<?php endforeach; ?>
|
||||||
<option value=999 <?= $me->getVar('defence_train') == 999 ? "selected" : ""; ?>><?= formatDefenceTrain(999) ?>
|
<option value=999 <?= $me->getVar('defence_train') == 999 ? "selected" : ""; ?>><?= formatDefenceTrain(999) ?>[훈련 -3, 사기 -6]</option>
|
||||||
<?php if($changeDefence999Train != 0 || $changeDefence999Train != 0):
|
|
||||||
?>[<?=$changeDefence999Train!=0?"훈련 {$changeDefence999Train},":''?><?=$changeDefence999Atmos!=0?"사기 {$changeDefence999Atmos}":''
|
|
||||||
?>]<?php endif?></option>
|
|
||||||
</select>
|
</select>
|
||||||
】<br><br>
|
】<br><br>
|
||||||
<input type=<?= $submit ?> id='set_my_setting' name=btn style=background-color:<?= GameConst::$basecolor2 ?>;color:white;width:160px;height:30px;font-size:14px; value=설정저장><br>
|
<input type=<?= $submit ?> id='set_my_setting' name=btn style=background-color:<?= GameConst::$basecolor2 ?>;color:white;width:160px;height:30px;font-size:14px; value=설정저장><br>
|
||||||
@@ -160,11 +139,6 @@ $changeDefence999Atmos = $me->onCalcDomestic('changeDefenceTrain', "atmos999", $
|
|||||||
<button type="button" id='buildNationCandidate' style=background-color:<?= GameConst::$basecolor2 ?>;color:white;width:160px;height:30px;font-size:14px;>사전 거병</button><br><br>
|
<button type="button" id='buildNationCandidate' style=background-color:<?= GameConst::$basecolor2 ?>;color:white;width:160px;height:30px;font-size:14px;>사전 거병</button><br><br>
|
||||||
<?php endif; ?>
|
<?php endif; ?>
|
||||||
|
|
||||||
<?php if (GameConst::$availableInstantAction['instantRetreat'] ?? false) : ?>
|
|
||||||
거리 3칸 이내 아국 도시로 즉시 이동<br>
|
|
||||||
<button type="button" id='instantRetreat' style=background-color:<?= GameConst::$basecolor2 ?>;color:white;width:160px;height:30px;font-size:14px;>접경 귀환</button><br><br>
|
|
||||||
<?php endif; ?>
|
|
||||||
|
|
||||||
<?php if ($gameStor->npcmode == 2 && $me->getNPCType() == 0) : ?>
|
<?php if ($gameStor->npcmode == 2 && $me->getNPCType() == 0) : ?>
|
||||||
다른 장수 선택 (<?= substr($me->getAuxVar('next_change') ?? TimeUtil::now(), 0, 19) ?> 부터)<br>
|
다른 장수 선택 (<?= substr($me->getAuxVar('next_change') ?? TimeUtil::now(), 0, 19) ?> 부터)<br>
|
||||||
<a href="select_general_from_pool.php" id='select_general_from_pool'><button type="button" style=background-color:<?= GameConst::$basecolor2 ?>;color:white;width:160px;height:30px;font-size:14px;>다른 장수 선택</button></a><br><br>
|
<a href="select_general_from_pool.php" id='select_general_from_pool'><button type="button" style=background-color:<?= GameConst::$basecolor2 ?>;color:white;width:160px;height:30px;font-size:14px;>다른 장수 선택</button></a><br><br>
|
||||||
@@ -193,7 +167,7 @@ $changeDefence999Atmos = $me->onCalcDomestic('changeDefenceTrain', "atmos999", $
|
|||||||
<div class="row mx-1">
|
<div class="row mx-1">
|
||||||
<div class="btn-group" role="group">
|
<div class="btn-group" role="group">
|
||||||
<?php foreach ($me->getItems() as $itemKey => $item) : ?>
|
<?php foreach ($me->getItems() as $itemKey => $item) : ?>
|
||||||
<button type="button" data-item-type='<?= $itemKey ?>' class="drop-item-btn btn btn-primary <?= $item->getName() == '-' ? 'disabled' : '' ?>"><?= $item->getName() ?></button>
|
<button type="button" data-item-type='<?=$itemKey?>' class="drop-item-btn btn btn-primary <?= $item->getName() == '-' ? 'disabled' : '' ?>"><?= $item->getName() ?></button>
|
||||||
<?php endforeach; ?>
|
<?php endforeach; ?>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -204,7 +178,7 @@ $changeDefence999Atmos = $me->onCalcDomestic('changeDefenceTrain', "atmos999", $
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="col col-12 col-lg-6">
|
<div class="col col-12 col-md-6">
|
||||||
<div class="row gx-0">
|
<div class="row gx-0">
|
||||||
<div class="col bg1 text-center">
|
<div class="col bg1 text-center">
|
||||||
<h4 style='color:skyblue'>개인 기록</h4>
|
<h4 style='color:skyblue'>개인 기록</h4>
|
||||||
@@ -217,7 +191,7 @@ $changeDefence999Atmos = $me->onCalcDomestic('changeDefenceTrain', "atmos999", $
|
|||||||
<button type="button" class="load_old_log btn btn-secondary" data-log_type="generalAction">이전 로그 불러오기</button>
|
<button type="button" class="load_old_log btn btn-secondary" data-log_type="generalAction">이전 로그 불러오기</button>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="col col-12 col-lg-6">
|
<div class="col col-12 col-md-6">
|
||||||
<div class="row gx-0">
|
<div class="row gx-0">
|
||||||
<div class="col bg1 text-center">
|
<div class="col bg1 text-center">
|
||||||
<h4 style='color:orange'>전투 기록</h4>
|
<h4 style='color:orange'>전투 기록</h4>
|
||||||
@@ -231,7 +205,7 @@ $changeDefence999Atmos = $me->onCalcDomestic('changeDefenceTrain', "atmos999", $
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="col col-12 col-lg-6">
|
<div class="col col-12 col-md-6">
|
||||||
<div class="row gx-0">
|
<div class="row gx-0">
|
||||||
<div class="col bg1 text-center">
|
<div class="col bg1 text-center">
|
||||||
<h4 style='color:skyblue'>장수 열전</h4>
|
<h4 style='color:skyblue'>장수 열전</h4>
|
||||||
@@ -241,7 +215,7 @@ $changeDefence999Atmos = $me->onCalcDomestic('changeDefenceTrain', "atmos999", $
|
|||||||
<?= formatHistoryToHTML(getGeneralHistoryLogAll($generalID)) ?>
|
<?= formatHistoryToHTML(getGeneralHistoryLogAll($generalID)) ?>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="col col-12 col-lg-6">
|
<div class="col col-12 col-md-6">
|
||||||
<div class="row gx-0">
|
<div class="row gx-0">
|
||||||
<div class="col bg1 text-center">
|
<div class="col bg1 text-center">
|
||||||
<h4 style='color:orange'>전투 결과</h4>
|
<h4 style='color:orange'>전투 결과</h4>
|
||||||
|
|||||||
@@ -14,16 +14,14 @@ $gameStor = KVStorage::getStorage($db, 'game_env');
|
|||||||
increaseRefresh("토너먼트", 1);
|
increaseRefresh("토너먼트", 1);
|
||||||
TurnExecutionHelper::executeAllCommand();
|
TurnExecutionHelper::executeAllCommand();
|
||||||
|
|
||||||
$me = $db->queryFirstRow(
|
$me = $db->queryFirstRow('select no,tournament,con,turntime from general where owner=%i', $userID);
|
||||||
'SELECT no,tournament,refresh_score,turntime from `general`
|
$generalID = $session->generalID;
|
||||||
LEFT JOIN general_access_log AS l ON `general`.no = l.general_id where owner=%i', $userID
|
|
||||||
);
|
|
||||||
$generalID = $me['no'];
|
|
||||||
$admin = $gameStor->getValues(['tournament', 'phase', 'turnterm', 'tnmt_msg', 'tnmt_type', 'develcost', 'tnmt_trig']);
|
$admin = $gameStor->getValues(['tournament', 'phase', 'turnterm', 'tnmt_msg', 'tnmt_type', 'develcost', 'tnmt_trig']);
|
||||||
$turnTerm = $admin['turnterm'];
|
$turnTerm = $admin['turnterm'];
|
||||||
|
|
||||||
$limitState = checkLimit($me['refresh_score']);
|
$con = checkLimit($me['con']);
|
||||||
if ($limitState >= 2) {
|
if ($con >= 2) {
|
||||||
printLimitMsg($me['turntime']);
|
printLimitMsg($me['turntime']);
|
||||||
exit();
|
exit();
|
||||||
}
|
}
|
||||||
@@ -102,7 +100,7 @@ $globalBetTotal = array_sum($globalBet);
|
|||||||
?>
|
?>
|
||||||
<!DOCTYPE html>
|
<!DOCTYPE html>
|
||||||
<html>
|
<html>
|
||||||
<?php if ($limitState == 1) {
|
<?php if ($con == 1) {
|
||||||
MessageBox("접속제한이 얼마 남지 않았습니다! 제한량이 모자라다면 참여를 해보세요^^");
|
MessageBox("접속제한이 얼마 남지 않았습니다! 제한량이 모자라다면 참여를 해보세요^^");
|
||||||
} ?>
|
} ?>
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +0,0 @@
|
|||||||
<?php
|
|
||||||
namespace sammo;
|
|
||||||
|
|
||||||
class ServerEnv extends ServerDefaultEnv {
|
|
||||||
//ServerEnv 기본값을 변경하고 싶다면 orig를 제거한 복사본을 만들고 수정
|
|
||||||
}
|
|
||||||
+67
-89
@@ -5,9 +5,6 @@ namespace sammo;
|
|||||||
use DateTime;
|
use DateTime;
|
||||||
use Ds\Set;
|
use Ds\Set;
|
||||||
use sammo\Enums\AuctionType;
|
use sammo\Enums\AuctionType;
|
||||||
use sammo\Enums\GeneralAccessLogColumn;
|
|
||||||
use sammo\Enums\GeneralColumn;
|
|
||||||
use sammo\Enums\GeneralQueryMode;
|
|
||||||
use sammo\Enums\InheritanceKey;
|
use sammo\Enums\InheritanceKey;
|
||||||
use sammo\Enums\RankColumn;
|
use sammo\Enums\RankColumn;
|
||||||
|
|
||||||
@@ -106,9 +103,10 @@ function GetImageURL($imgsvr, $filepath = '')
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param null|int $refreshScore 장수의 벌점
|
* @param null|int $con 장수의 벌점
|
||||||
|
* @param null|int $conlimit 최대 벌점
|
||||||
*/
|
*/
|
||||||
function checkLimit($refreshScore = null)
|
function checkLimit($con = null)
|
||||||
{
|
{
|
||||||
$session = Session::getInstance();
|
$session = Session::getInstance();
|
||||||
if ($session->userGrade >= 4) {
|
if ($session->userGrade >= 4) {
|
||||||
@@ -118,15 +116,15 @@ function checkLimit($refreshScore = null)
|
|||||||
$db = DB::db();
|
$db = DB::db();
|
||||||
$gameStor = KVStorage::getStorage($db, 'game_env');
|
$gameStor = KVStorage::getStorage($db, 'game_env');
|
||||||
|
|
||||||
if ($refreshScore === null) {
|
if ($con === null) {
|
||||||
$refreshScore = $db->queryFirstField('SELECT refresh_score FROM general_access_log WHERE `general_id`=%i', Session::getGeneralID());
|
$con = $db->queryFirstField('SELECT con FROM general WHERE `owner`=%i', Session::getUserID());
|
||||||
}
|
}
|
||||||
$refreshLimit = $gameStor->refreshLimit;
|
$conlimit = $gameStor->conlimit;
|
||||||
|
|
||||||
if ($refreshScore > $refreshLimit) {
|
if ($con > $conlimit) {
|
||||||
return 2;
|
return 2;
|
||||||
//접속제한 90%이면 경고문구
|
//접속제한 90%이면 경고문구
|
||||||
} elseif ($refreshScore > $refreshLimit * 0.9) {
|
} elseif ($con > $conlimit * 0.9) {
|
||||||
return 1;
|
return 1;
|
||||||
} else {
|
} else {
|
||||||
return 0;
|
return 0;
|
||||||
@@ -149,7 +147,7 @@ function getRandGenName(RandUtil $rng)
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
function cityInfo(GeneralLite $generalObj)
|
function cityInfo(General $generalObj)
|
||||||
{
|
{
|
||||||
$db = DB::db();
|
$db = DB::db();
|
||||||
|
|
||||||
@@ -644,7 +642,7 @@ function generalInfo(General $generalObj)
|
|||||||
$age = "<font color=red>{$age} 세</font>";
|
$age = "<font color=red>{$age} 세</font>";
|
||||||
}
|
}
|
||||||
|
|
||||||
$refreshScoreTotal = round($generalObj->getAccessLogVar(GeneralAccessLogColumn::refreshScoreTotal) ?? 0, -1);
|
$connectCnt = round($generalObj->getVar('connect'), -1);
|
||||||
$specialDomestic = $generalObj->getVar('special') === GameConst::$defaultSpecialDomestic
|
$specialDomestic = $generalObj->getVar('special') === GameConst::$defaultSpecialDomestic
|
||||||
? "{$generalObj->getVar('specage')}세"
|
? "{$generalObj->getVar('specage')}세"
|
||||||
: "<font color=limegreen>" . displayiActionObjInfo($generalObj->getSpecialDomestic()) . "</font>";
|
: "<font color=limegreen>" . displayiActionObjInfo($generalObj->getSpecialDomestic()) . "</font>";
|
||||||
@@ -753,7 +751,7 @@ function generalInfo(General $generalObj)
|
|||||||
<td style='text-align:center;' class='bg1'><b>부대</b></td>
|
<td style='text-align:center;' class='bg1'><b>부대</b></td>
|
||||||
<td style='text-align:center;' colspan=3>{$troopInfo}</td>
|
<td style='text-align:center;' colspan=3>{$troopInfo}</td>
|
||||||
<td style='text-align:center;' class='bg1'><b>벌점</b></td>
|
<td style='text-align:center;' class='bg1'><b>벌점</b></td>
|
||||||
<td style='text-align:center;' colspan=5>" . getRefreshScoreText($refreshScoreTotal) . " {$refreshScoreTotal}({$generalObj->getAccessLogVar(GeneralAccessLogColumn::refreshScore)})</td>
|
<td style='text-align:center;' colspan=5>" . getConnect($connectCnt) . " {$connectCnt}({$generalObj->getVar('con')})</td>
|
||||||
</tr>
|
</tr>
|
||||||
</table>";
|
</table>";
|
||||||
}
|
}
|
||||||
@@ -1000,69 +998,52 @@ function increaseRefresh($type = "", $cnt = 1)
|
|||||||
$generalID = $session->generalID;
|
$generalID = $session->generalID;
|
||||||
$userGrade = $session->userGrade;
|
$userGrade = $session->userGrade;
|
||||||
|
|
||||||
$dateObj = new \DateTimeImmutable();
|
$date = TimeUtil::now();
|
||||||
$date = TimeUtil::format($dateObj, false);
|
|
||||||
|
|
||||||
$db = DB::db();
|
$db = DB::db();
|
||||||
$gameStor = KVStorage::getStorage($db, 'game_env');
|
$gameStor = KVStorage::getStorage($db, 'game_env');
|
||||||
$isunited = $gameStor->isunited;
|
$isunited = $gameStor->isunited;
|
||||||
$opentime = $gameStor->opentime;
|
$opentime = $gameStor->opentime;
|
||||||
|
|
||||||
if ($userGrade == 6) {
|
if($userGrade == 6){
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if ($isunited == 2) {
|
if($isunited == 2){
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (!$generalID) {
|
if(!$generalID){
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if ($opentime > $date) {
|
if($opentime > $date){
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
$gameStor->refresh = $gameStor->refresh + $cnt; //TODO: +로 증가하는 값은 별도로 분리
|
$gameStor->refresh = $gameStor->refresh + $cnt; //TODO: +로 증가하는 값은 별도로 분리
|
||||||
|
|
||||||
$db->insertUpdate('general_access_log', [
|
$db->update('general', [
|
||||||
GeneralAccessLogColumn::generalID->value => $generalID,
|
'lastrefresh' => $date,
|
||||||
GeneralAccessLogColumn::userID->value => $userID,
|
'con' => $db->sqleval('con + %i', $cnt),
|
||||||
GeneralAccessLogColumn::lastRefresh->value => $date,
|
'connect' => $db->sqleval('connect + %i', $cnt),
|
||||||
GeneralAccessLogColumn::refreshTotal->value => $cnt,
|
'refcnt' => $db->sqleval('refcnt + %i', $cnt),
|
||||||
GeneralAccessLogColumn::refresh->value => $cnt,
|
'refresh' => $db->sqleval('refresh + %i', $cnt)
|
||||||
GeneralAccessLogColumn::refreshScore->value => $cnt,
|
], 'owner=%i', $userID);
|
||||||
GeneralAccessLogColumn::refreshScoreTotal->value => $cnt,
|
|
||||||
], [
|
|
||||||
GeneralAccessLogColumn::lastRefresh->value => $date,
|
|
||||||
GeneralAccessLogColumn::refreshTotal->value => $db->sqleval('%b + %i', GeneralAccessLogColumn::refreshTotal->value, $cnt),
|
|
||||||
GeneralAccessLogColumn::refresh->value => $db->sqleval('%b + %i', GeneralAccessLogColumn::refresh->value, $cnt),
|
|
||||||
GeneralAccessLogColumn::refreshScore->value => $db->sqleval('%b + %i', GeneralAccessLogColumn::refreshScore->value, $cnt),
|
|
||||||
GeneralAccessLogColumn::refreshScoreTotal->value => $db->sqleval('%b + %i', GeneralAccessLogColumn::refreshScoreTotal->value, $cnt),
|
|
||||||
]);
|
|
||||||
|
|
||||||
$serverPath = __DIR__;
|
$date = date('Y_m_d H:i:s');
|
||||||
|
$date2 = substr($date, 0, 10);
|
||||||
$serverID = UniqueConst::$serverID;
|
$online = getOnlineNum();
|
||||||
$logPath = "{$serverPath}/logs/{$serverID}/api_log.db";
|
file_put_contents(
|
||||||
|
__DIR__ . "/logs/" . UniqueConst::$serverID . "/_{$date2}_refresh.txt",
|
||||||
$logDB = FileDB::db($logPath, $serverPath . '/../f_install/sql/api_log.sql');
|
sprintf(
|
||||||
|
"%s, %s, %s, %s, %s, %d\n",
|
||||||
$ip = $_SERVER['REMOTE_ADDR'] ?? 'local';
|
$date,
|
||||||
$date = date('Y-m-d H:i:s');
|
$session->userName,
|
||||||
|
$session->generalName,
|
||||||
$logDB->insert('api_log', [
|
$session->ip,
|
||||||
'user_id' => $session->userID,
|
$type,
|
||||||
'ip' => $ip,
|
$online
|
||||||
'date' => $date,
|
),
|
||||||
'path' => "refresh",
|
FILE_APPEND
|
||||||
'arg' => JSON::encode([
|
);
|
||||||
'type' => $type,
|
|
||||||
]),
|
|
||||||
'aux' => JSON::encode([
|
|
||||||
'generalID' => $generalID,
|
|
||||||
'generalName' => $session->generalName,
|
|
||||||
'userName' => $session->userName,
|
|
||||||
]),
|
|
||||||
]);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function updateTraffic()
|
function updateTraffic()
|
||||||
@@ -1070,9 +1051,12 @@ function updateTraffic()
|
|||||||
$online = getOnlineNum();
|
$online = getOnlineNum();
|
||||||
$db = DB::db();
|
$db = DB::db();
|
||||||
$gameStor = KVStorage::getStorage($db, 'game_env');
|
$gameStor = KVStorage::getStorage($db, 'game_env');
|
||||||
$admin = $gameStor->getValues(['year', 'month', 'refresh', 'maxonline', 'maxrefresh', 'recentTraffic']);
|
$admin = $gameStor->getValues(['year', 'month', 'refresh', 'maxonline', 'maxrefresh']);
|
||||||
/** @var array{year:int,month:int,refresh:int,maxonline:int,maxrefresh:int} $admin */
|
/** @var array{year:int,month:int,refresh:int,maxonline:int,maxrefresh:int} $admin */
|
||||||
|
|
||||||
|
//최다갱신자
|
||||||
|
$user = $db->queryFirstRow('select name,refresh from general order by refresh desc limit 1');
|
||||||
|
|
||||||
if ($admin['maxrefresh'] < $admin['refresh']) {
|
if ($admin['maxrefresh'] < $admin['refresh']) {
|
||||||
$admin['maxrefresh'] = $admin['refresh'];
|
$admin['maxrefresh'] = $admin['refresh'];
|
||||||
}
|
}
|
||||||
@@ -1083,20 +1067,22 @@ function updateTraffic()
|
|||||||
$gameStor->maxrefresh = $admin['maxrefresh'];
|
$gameStor->maxrefresh = $admin['maxrefresh'];
|
||||||
$gameStor->maxonline = $admin['maxonline'];
|
$gameStor->maxonline = $admin['maxonline'];
|
||||||
|
|
||||||
$recentTraffic = $admin['recentTraffic'] ?? [];
|
$db->update('general', ['refresh' => 0], true);
|
||||||
if(count($recentTraffic) >= 5){
|
|
||||||
array_shift($recentTraffic);
|
|
||||||
}
|
|
||||||
$recentTraffic[] = [
|
|
||||||
'year'=>$admin['year'],
|
|
||||||
'month' => $admin['month'],
|
|
||||||
'refresh' => $admin['refresh'],
|
|
||||||
'online' => $online,
|
|
||||||
'date' => TimeUtil::now(),
|
|
||||||
];
|
|
||||||
$gameStor->recentTraffic = $recentTraffic;
|
|
||||||
|
|
||||||
$db->update('general_access_log', ['refresh' => 0], true);
|
$date = TimeUtil::now();
|
||||||
|
//일시|년|월|총갱신|접속자|최다갱신자
|
||||||
|
file_put_contents(
|
||||||
|
__DIR__ . "/logs/" . UniqueConst::$serverID . "/_traffic.txt",
|
||||||
|
Json::encode([
|
||||||
|
$date,
|
||||||
|
$admin['year'],
|
||||||
|
$admin['month'],
|
||||||
|
$admin['refresh'],
|
||||||
|
$online,
|
||||||
|
$user['name'] . "(" . $user['refresh'] . ")"
|
||||||
|
]) . "\n",
|
||||||
|
FILE_APPEND
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
function CheckOverhead()
|
function CheckOverhead()
|
||||||
@@ -1104,13 +1090,13 @@ function CheckOverhead()
|
|||||||
//서버정보
|
//서버정보
|
||||||
$db = DB::db();
|
$db = DB::db();
|
||||||
$gameStor = KVStorage::getStorage($db, 'game_env');
|
$gameStor = KVStorage::getStorage($db, 'game_env');
|
||||||
[$turnterm, $refreshLimit] = $gameStor->getValuesAsArray(['turnterm', 'refreshLimit']);
|
list($turnterm, $conlimit) = $gameStor->getValuesAsArray(['turnterm', 'conlimit']);
|
||||||
|
|
||||||
$nextRefreshLimit = Util::round(pow($turnterm, 0.6) * 3) * 10;
|
$con = Util::round(pow($turnterm, 0.6) * 3) * 10;
|
||||||
|
|
||||||
|
|
||||||
if ($nextRefreshLimit != $refreshLimit) {
|
if ($con != $conlimit) {
|
||||||
$gameStor->refreshLimit = $nextRefreshLimit;
|
$gameStor->conlimit = $con;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1214,16 +1200,7 @@ function updateOnline()
|
|||||||
|
|
||||||
//동접수
|
//동접수
|
||||||
$startTurn = cutTurn($gameStor->turntime, $gameStor->turnterm, false);
|
$startTurn = cutTurn($gameStor->turntime, $gameStor->turnterm, false);
|
||||||
$onlineUser = $db->query(
|
$onlineUser = $db->query('SELECT no,name,nation FROM general WHERE lastrefresh >= %s AND npc < 2', $startTurn);
|
||||||
'SELECT %b, %b, %b FROM `general_access_log` as `log` INNER JOIN `general` ON `log`.%b = `general`.%b WHERE %b >= %s',
|
|
||||||
GeneralColumn::no->value,
|
|
||||||
GeneralColumn::name->value,
|
|
||||||
GeneralColumn::nation->value,
|
|
||||||
GeneralAccessLogColumn::generalID->value,
|
|
||||||
GeneralColumn::no->value,
|
|
||||||
GeneralAccessLogColumn::lastRefresh->value,
|
|
||||||
$startTurn
|
|
||||||
);
|
|
||||||
$onlineNum = count($onlineUser);
|
$onlineNum = count($onlineUser);
|
||||||
$onlineNationUsers = Util::arrayGroupBy($onlineUser, 'nation');
|
$onlineNationUsers = Util::arrayGroupBy($onlineUser, 'nation');
|
||||||
|
|
||||||
@@ -1337,7 +1314,7 @@ function CheckHall($no)
|
|||||||
["betrate", 'calc'],
|
["betrate", 'calc'],
|
||||||
];
|
];
|
||||||
|
|
||||||
$generalObj = General::createObjFromDB($no);
|
$generalObj = General::createGeneralObjFromDB($no, null, 2);
|
||||||
|
|
||||||
$ttw = $generalObj->getRankVar(RankColumn::ttw);
|
$ttw = $generalObj->getRankVar(RankColumn::ttw);
|
||||||
$ttd = $generalObj->getRankVar(RankColumn::ttd);
|
$ttd = $generalObj->getRankVar(RankColumn::ttd);
|
||||||
@@ -1727,13 +1704,14 @@ function deleteNation(General $lord, bool $applyDB): array
|
|||||||
$logger->pushGlobalHistoryLog("<R><b>【멸망】</b></><D><b>{$nationName}</b></>{$josaUn} <R>멸망</>했습니다.");
|
$logger->pushGlobalHistoryLog("<R><b>【멸망】</b></><D><b>{$nationName}</b></>{$josaUn} <R>멸망</>했습니다.");
|
||||||
|
|
||||||
|
|
||||||
$nationGeneralList = General::createObjListFromDB(
|
$nationGeneralList = General::createGeneralObjListFromDB(
|
||||||
$db->queryFirstColumn(
|
$db->queryFirstColumn(
|
||||||
'SELECT `no` FROM general WHERE nation=%i AND no != %i',
|
'SELECT `no` FROM general WHERE nation=%i AND no != %i',
|
||||||
$nationID,
|
$nationID,
|
||||||
$lordID
|
$lordID
|
||||||
),
|
),
|
||||||
['npc', 'owner', 'gold', 'rice', 'experience', 'explevel', 'dedication', 'dedlevel', 'belong', 'aux'],
|
['npc', 'owner', 'gold', 'rice', 'experience', 'explevel', 'dedication', 'dedlevel', 'belong', 'aux'],
|
||||||
|
1
|
||||||
);
|
);
|
||||||
$nationGeneralList[$lordID] = $lord;
|
$nationGeneralList[$lordID] = $lord;
|
||||||
|
|
||||||
@@ -1750,7 +1728,7 @@ function deleteNation(General $lord, bool $applyDB): array
|
|||||||
|
|
||||||
// 전 장수 재야로
|
// 전 장수 재야로
|
||||||
foreach ($nationGeneralList as $general) {
|
foreach ($nationGeneralList as $general) {
|
||||||
if ($general->getNPCType() < 2) {
|
if($general->getNPCType() < 2){
|
||||||
$general->setAuxVar(
|
$general->setAuxVar(
|
||||||
InheritanceKey::max_belong->value,
|
InheritanceKey::max_belong->value,
|
||||||
max(
|
max(
|
||||||
|
|||||||
@@ -350,7 +350,7 @@ function setGeneralCommand(int $generalID, array $rawTurnList, string $command,
|
|||||||
$db = DB::db();
|
$db = DB::db();
|
||||||
$gameStor = KVStorage::getStorage($db, 'game_env');
|
$gameStor = KVStorage::getStorage($db, 'game_env');
|
||||||
$env = $gameStor->getAll();
|
$env = $gameStor->getAll();
|
||||||
$general = General::createObjFromDB($generalID);
|
$general = General::createGeneralObjFromDB($generalID);
|
||||||
|
|
||||||
try{
|
try{
|
||||||
$commandObj = buildGeneralCommandClass($command, $general, $env, $arg);
|
$commandObj = buildGeneralCommandClass($command, $general, $env, $arg);
|
||||||
@@ -425,7 +425,7 @@ function setNationCommand(int $generalID, array $turnList, string $command, ?arr
|
|||||||
$db = DB::db();
|
$db = DB::db();
|
||||||
$gameStor = KVStorage::getStorage($db, 'game_env');
|
$gameStor = KVStorage::getStorage($db, 'game_env');
|
||||||
$env = $gameStor->getAll();
|
$env = $gameStor->getAll();
|
||||||
$general = General::createObjFromDB($generalID);
|
$general = General::createGeneralObjFromDB($generalID);
|
||||||
|
|
||||||
if($general->getVar('officer_level') < 5){
|
if($general->getVar('officer_level') < 5){
|
||||||
return [
|
return [
|
||||||
|
|||||||
+12
-139
@@ -133,19 +133,19 @@ function getNationType(?string $type) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
function getRefreshScoreText($score) {
|
function getConnect($con) {
|
||||||
if($score < 50) $scoreName = '안함';
|
if($con < 50) $conname = '안함';
|
||||||
elseif($score < 100) $scoreName = '무관심';
|
elseif($con < 100) $conname = '무관심';
|
||||||
elseif($score < 200) $scoreName = '가끔';
|
elseif($con < 200) $conname = '가끔';
|
||||||
elseif($score < 400) $scoreName = '보통';
|
elseif($con < 400) $conname = '보통';
|
||||||
elseif($score < 800) $scoreName = '자주';
|
elseif($con < 800) $conname = '자주';
|
||||||
elseif($score < 1600) $scoreName = '열심';
|
elseif($con < 1600) $conname = '열심';
|
||||||
elseif($score < 3200) $scoreName = '중독';
|
elseif($con < 3200) $conname = '중독';
|
||||||
elseif($score < 6400) $scoreName = '폐인';
|
elseif($con < 6400) $conname = '폐인';
|
||||||
elseif($score < 12800) $scoreName = '경고';
|
elseif($con < 12800) $conname = '경고';
|
||||||
else $scoreName = '헐...';
|
else $conname = '헐...';
|
||||||
|
|
||||||
return $scoreName;
|
return $conname;
|
||||||
}
|
}
|
||||||
|
|
||||||
function getNationType2(?string $type) {
|
function getNationType2(?string $type) {
|
||||||
@@ -256,75 +256,6 @@ function buildItemClass(?string $type):BaseItem{
|
|||||||
return $obj;
|
return $obj;
|
||||||
}
|
}
|
||||||
|
|
||||||
function getScenarioEffectClass(?string $type){
|
|
||||||
if($type === null || $type === ''){
|
|
||||||
$type = 'None';
|
|
||||||
}
|
|
||||||
|
|
||||||
static $basePath = __NAMESPACE__.'\\ActionScenarioEffect\\';
|
|
||||||
$classPath = ($basePath.$type);
|
|
||||||
|
|
||||||
if(class_exists($classPath)){
|
|
||||||
return $classPath;
|
|
||||||
}
|
|
||||||
|
|
||||||
$classPath = ($basePath.'che_'.$type);
|
|
||||||
if(class_exists($classPath)){
|
|
||||||
return $classPath;
|
|
||||||
}
|
|
||||||
|
|
||||||
throw new \InvalidArgumentException("{$type}은 시나리오 효과 클래스가 아님");
|
|
||||||
}
|
|
||||||
|
|
||||||
function buildScenarioEffectClass(?string $type):iAction{
|
|
||||||
static $cache = [];
|
|
||||||
if($type === null){
|
|
||||||
$type = 'None';
|
|
||||||
}
|
|
||||||
if(key_exists($type, $cache)){
|
|
||||||
return $cache[$type];
|
|
||||||
}
|
|
||||||
$class = getScenarioEffectClass($type);
|
|
||||||
|
|
||||||
$obj = new $class();
|
|
||||||
$cache[$type]= $obj;
|
|
||||||
return $obj;
|
|
||||||
}
|
|
||||||
|
|
||||||
function getBuffClass(?string $type){
|
|
||||||
if($type === null || $type === ''){
|
|
||||||
$type = 'None';
|
|
||||||
}
|
|
||||||
|
|
||||||
static $basePath = __NAMESPACE__.'\\ActionBuff\\';
|
|
||||||
$classPath = ($basePath.$type);
|
|
||||||
|
|
||||||
if(class_exists($classPath)){
|
|
||||||
return $classPath;
|
|
||||||
}
|
|
||||||
|
|
||||||
$classPath = ($basePath.'che_'.$type);
|
|
||||||
if(class_exists($classPath)){
|
|
||||||
return $classPath;
|
|
||||||
}
|
|
||||||
|
|
||||||
throw new \InvalidArgumentException("{$type}은 버프 클래스가 아님");
|
|
||||||
}
|
|
||||||
function buildBuffClass(?string $type):iAction{
|
|
||||||
static $cache = [];
|
|
||||||
if($type === null){
|
|
||||||
$type = 'None';
|
|
||||||
}
|
|
||||||
if(key_exists($type, $cache)){
|
|
||||||
return $cache[$type];
|
|
||||||
}
|
|
||||||
$class = getBuffClass($type);
|
|
||||||
|
|
||||||
$obj = new $class();
|
|
||||||
$cache[$type]= $obj;
|
|
||||||
return $obj;
|
|
||||||
}
|
|
||||||
|
|
||||||
function getGeneralSpecialDomesticClass(?string $type){
|
function getGeneralSpecialDomesticClass(?string $type){
|
||||||
if($type === null || $type === ''){
|
if($type === null || $type === ''){
|
||||||
$type = GameConst::$defaultSpecialDomestic;
|
$type = GameConst::$defaultSpecialDomestic;
|
||||||
@@ -395,41 +326,6 @@ function buildGeneralSpecialWarClass(?string $type):BaseSpecial{
|
|||||||
return $obj;
|
return $obj;
|
||||||
}
|
}
|
||||||
|
|
||||||
function getActionCrewTypeClass(?string $type){
|
|
||||||
if($type === null || $type === ''){
|
|
||||||
$type = 'None';
|
|
||||||
}
|
|
||||||
|
|
||||||
static $basePath = __NAMESPACE__.'\\ActionCrewType\\';
|
|
||||||
$classPath = ($basePath.$type);
|
|
||||||
|
|
||||||
if(class_exists($classPath)){
|
|
||||||
return $classPath;
|
|
||||||
}
|
|
||||||
|
|
||||||
$classPath = ($basePath.'che_'.$type);
|
|
||||||
if(class_exists($classPath)){
|
|
||||||
return $classPath;
|
|
||||||
}
|
|
||||||
|
|
||||||
throw new \InvalidArgumentException("{$type}은 올바른 병종 효과가 아님");
|
|
||||||
}
|
|
||||||
|
|
||||||
function buildActionCrewTypeClass(?string $type):iAction{
|
|
||||||
static $cache = [];
|
|
||||||
if($type === null){
|
|
||||||
$type = 'None';
|
|
||||||
}
|
|
||||||
if(key_exists($type, $cache)){
|
|
||||||
return $cache[$type];
|
|
||||||
}
|
|
||||||
$class = getActionCrewTypeClass($type);
|
|
||||||
|
|
||||||
$obj = new $class();
|
|
||||||
$cache[$type]= $obj;
|
|
||||||
return $obj;
|
|
||||||
}
|
|
||||||
|
|
||||||
function getGeneralCommandClass(?string $type){
|
function getGeneralCommandClass(?string $type){
|
||||||
if($type === null || $type === ''){
|
if($type === null || $type === ''){
|
||||||
$type = '휴식';
|
$type = '휴식';
|
||||||
@@ -450,27 +346,6 @@ function buildGeneralCommandClass(?string $type, General $generalObj, array $env
|
|||||||
return new $class($generalObj, $env, $arg);
|
return new $class($generalObj, $env, $arg);
|
||||||
}
|
}
|
||||||
|
|
||||||
function getUserActionCommandClass(?string $type){
|
|
||||||
if($type === null || $type === ''){
|
|
||||||
$type = '휴식';
|
|
||||||
}
|
|
||||||
|
|
||||||
static $basePath = __NAMESPACE__.'\\Command\\UserAction\\';
|
|
||||||
$classPath = ($basePath.$type);
|
|
||||||
|
|
||||||
if(class_exists($classPath)){
|
|
||||||
return $classPath;
|
|
||||||
}
|
|
||||||
|
|
||||||
throw new \InvalidArgumentException("{$type}은 올바른 개변 전략 커맨드가 아님");
|
|
||||||
}
|
|
||||||
|
|
||||||
function buildUserActionCommandClass(?string $type, General $generalObj, array $env, $arg = null):Command\UserActionCommand{
|
|
||||||
$class = getUserActionCommandClass($type);
|
|
||||||
return new $class($generalObj, $env, $arg);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
function getNationCommandClass(?string $type){
|
function getNationCommandClass(?string $type){
|
||||||
if($type === null || $type === ''){
|
if($type === null || $type === ''){
|
||||||
$type = '휴식';
|
$type = '휴식';
|
||||||
@@ -667,8 +542,6 @@ function getExpLevel($experience) {
|
|||||||
$level = Util::toInt(sqrt($experience/10));
|
$level = Util::toInt(sqrt($experience/10));
|
||||||
}
|
}
|
||||||
|
|
||||||
$level = Util::clamp($level, 0, GameConst::$maxLevel);
|
|
||||||
|
|
||||||
return $level;
|
return $level;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+7
-36
@@ -202,10 +202,8 @@ function preUpdateMonthly()
|
|||||||
$admin = $gameStor->getValues(['startyear', 'year', 'month']);
|
$admin = $gameStor->getValues(['startyear', 'year', 'month']);
|
||||||
|
|
||||||
//접률감소, 건국제한-1
|
//접률감소, 건국제한-1
|
||||||
$db->update('general_access_log', [
|
|
||||||
'refresh_score_total' => $db->sqleval('floor(refresh_score_total*0.99)'),
|
|
||||||
], true);
|
|
||||||
$db->update('general', [
|
$db->update('general', [
|
||||||
|
'connect' => $db->sqleval('floor(connect*0.99)'),
|
||||||
'makelimit' => $db->sqleval('greatest(0, makelimit - 1)'),
|
'makelimit' => $db->sqleval('greatest(0, makelimit - 1)'),
|
||||||
], true);
|
], true);
|
||||||
//전략제한-1, 외교제한-1, 세율동기화
|
//전략제한-1, 외교제한-1, 세율동기화
|
||||||
@@ -303,6 +301,7 @@ function postUpdateMonthly(RandUtil $rng)
|
|||||||
WHERE g.nation = A.nation)
|
WHERE g.nation = A.nation)
|
||||||
+(select round(sum(dex1+dex2+dex3+dex4+dex5)/1000) from general where nation=A.nation)
|
+(select round(sum(dex1+dex2+dex3+dex4+dex5)/1000) from general where nation=A.nation)
|
||||||
+(select round(sum(experience+dedication)/100) from general where nation=A.nation)
|
+(select round(sum(experience+dedication)/100) from general where nation=A.nation)
|
||||||
|
+(select round(avg(connect)) from general where nation=A.nation)
|
||||||
)/10)
|
)/10)
|
||||||
as power,
|
as power,
|
||||||
(select sum(crew) from general where nation=A.nation) as totalCrew
|
(select sum(crew) from general where nation=A.nation) as totalCrew
|
||||||
@@ -451,7 +450,7 @@ function checkWander(RandUtil $rng)
|
|||||||
|
|
||||||
$wanderers = $db->queryFirstColumn('SELECT general.`no` FROM general LEFT JOIN nation ON general.nation = nation.nation WHERE nation.`level` = 0 AND general.`officer_level` = 12');
|
$wanderers = $db->queryFirstColumn('SELECT general.`no` FROM general LEFT JOIN nation ON general.nation = nation.nation WHERE nation.`level` = 0 AND general.`officer_level` = 12');
|
||||||
|
|
||||||
foreach (General::createObjListFromDB($wanderers) as $wanderer) {
|
foreach (General::createGeneralObjListFromDB($wanderers) as $wanderer) {
|
||||||
$wanderCmd = buildGeneralCommandClass('che_해산', $wanderer, $admin);
|
$wanderCmd = buildGeneralCommandClass('che_해산', $wanderer, $admin);
|
||||||
if ($wanderCmd->hasFullConditionMet()) {
|
if ($wanderCmd->hasFullConditionMet()) {
|
||||||
$logger = $wanderer->getLogger();
|
$logger = $wanderer->getLogger();
|
||||||
@@ -698,7 +697,7 @@ function checkEmperior()
|
|||||||
$db = DB::db();
|
$db = DB::db();
|
||||||
$gameStor = KVStorage::getStorage($db, 'game_env');
|
$gameStor = KVStorage::getStorage($db, 'game_env');
|
||||||
|
|
||||||
$admin = $gameStor->getValues(['year', 'month', 'isunited', 'refreshLimit']);
|
$admin = $gameStor->getValues(['year', 'month', 'isunited', 'conlimit']);
|
||||||
if ($admin['isunited'] != 0) {
|
if ($admin['isunited'] != 0) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -743,7 +742,7 @@ function checkEmperior()
|
|||||||
}
|
}
|
||||||
|
|
||||||
$inheritPointManager = InheritancePointManager::getInstance();
|
$inheritPointManager = InheritancePointManager::getInstance();
|
||||||
$allUserGenerals = General::createObjListFromDB($db->queryFirstColumn('SELECT `no` FROM general WHERE npc < 2'));
|
$allUserGenerals = General::createGeneralObjListFromDB($db->queryFirstColumn('SELECT `no` FROM general WHERE npc < 2'));
|
||||||
foreach ($allUserGenerals as $genObj) {
|
foreach ($allUserGenerals as $genObj) {
|
||||||
if ($genObj->getNationID() == $nationID) {
|
if ($genObj->getNationID() == $nationID) {
|
||||||
if ($genObj->getVar('officer_level') > 4) {
|
if ($genObj->getVar('officer_level') > 4) {
|
||||||
@@ -760,7 +759,7 @@ function checkEmperior()
|
|||||||
}
|
}
|
||||||
|
|
||||||
$gameStor->isunited = 2;
|
$gameStor->isunited = 2;
|
||||||
$gameStor->refreshLimit = $gameStor->refreshLimit * 100;
|
$gameStor->conlimit = $gameStor->conlimit * 100;
|
||||||
|
|
||||||
foreach ($db->queryFirstColumn('SELECT no FROM general WHERE npc<2 AND age>=%i', GameConst::$minPushHallAge) as $hallGeneralNo) {
|
foreach ($db->queryFirstColumn('SELECT no FROM general WHERE npc<2 AND age>=%i', GameConst::$minPushHallAge) as $hallGeneralNo) {
|
||||||
CheckHall($hallGeneralNo);
|
CheckHall($hallGeneralNo);
|
||||||
@@ -772,7 +771,7 @@ function checkEmperior()
|
|||||||
|
|
||||||
$chiefs = Util::convertArrayToDict(
|
$chiefs = Util::convertArrayToDict(
|
||||||
$db->query(
|
$db->query(
|
||||||
'SELECT no,npc,name,picture,belong,officer_level FROM general WHERE nation=%i AND officer_level >= 5',
|
'SELECT no,name,picture,belong,officer_level FROM general WHERE nation=%i AND officer_level >= 5',
|
||||||
$nationID
|
$nationID
|
||||||
),
|
),
|
||||||
'officer_level'
|
'officer_level'
|
||||||
@@ -909,34 +908,6 @@ function checkEmperior()
|
|||||||
|
|
||||||
//연감 월결산
|
//연감 월결산
|
||||||
LogHistory();
|
LogHistory();
|
||||||
|
|
||||||
$availableInvaderGame = false;
|
|
||||||
foreach(CityConst::all() as $city){
|
|
||||||
if($city->level == 4){
|
|
||||||
$availableInvaderGame = true;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if($availableInvaderGame){
|
|
||||||
$invaderMsgCnt = 2;
|
|
||||||
foreach(range(12, 5, -1) as $chiefLevel){
|
|
||||||
if(!key_exists($chiefLevel, $chiefs)){
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
$targetChief = $chiefs[$chiefLevel];
|
|
||||||
if($targetChief['npc'] >= 2){
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
$invaderMsgs = RaiseInvaderMessage::buildRaiseInvaderMessage($targetChief['no']);
|
|
||||||
foreach($invaderMsgs as $invaderMsg){
|
|
||||||
$invaderMsg->send();
|
|
||||||
}
|
|
||||||
$invaderMsgCnt--;
|
|
||||||
if($invaderMsgCnt <= 0){
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function updateMaxDomesticCritical(General $general, $score)
|
function updateMaxDomesticCritical(General $general, $score)
|
||||||
|
|||||||
@@ -148,6 +148,63 @@ function allButton(bool $seizeNPCMode, array $opts = [])
|
|||||||
], $opts));
|
], $opts));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
function commandButton(array $opts = [])
|
||||||
|
{
|
||||||
|
$session = Session::getInstance();
|
||||||
|
$userID = Session::getUserID();
|
||||||
|
if (!$session->isGameLoggedIn()) {
|
||||||
|
return '';
|
||||||
|
}
|
||||||
|
|
||||||
|
$db = DB::db();
|
||||||
|
$me = $db->queryFirstRow("select no,nation,officer_level,belong,permission,penalty from general where owner=%i", $userID);
|
||||||
|
|
||||||
|
$nation = $db->queryFirstRow("select nation,level,color,secretlimit from nation where nation=%i", $me['nation']) ?? [
|
||||||
|
'nation' => 0,
|
||||||
|
'level' => 0,
|
||||||
|
'secretlimit' => 99,
|
||||||
|
'color' => '#000000'
|
||||||
|
];
|
||||||
|
|
||||||
|
$bgColor = $nation['color'] ?? '#000000';
|
||||||
|
$fgColor = newColor($bgColor);
|
||||||
|
|
||||||
|
$templates = new \League\Plates\Engine(__DIR__ . '/templates');
|
||||||
|
$showSecret = false;
|
||||||
|
$permission = checkSecretPermission($me);
|
||||||
|
$btnClassForTournament = $opts['btnClass'];
|
||||||
|
if ($opts['isTournamentApplicationOpen']) {
|
||||||
|
if ($btnClassForTournament != 'dropdown-item') {
|
||||||
|
$btnClassForTournament = 'toolbarButton2';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$btnClassForBetting = $opts['btnClass'];
|
||||||
|
if ($opts['isBettingActive']) {
|
||||||
|
if ($btnClassForTournament != 'dropdown-item') {
|
||||||
|
$btnClassForBetting = 'toolbarButton2';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($permission >= 1) {
|
||||||
|
$showSecret = true;
|
||||||
|
} else if ($me['officer_level'] == 0) {
|
||||||
|
$showSecret = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return $templates->render('commandButton', array_merge([
|
||||||
|
'bgColor' => $bgColor,
|
||||||
|
'fgColor' => $fgColor,
|
||||||
|
'meLevel' => $me['officer_level'],
|
||||||
|
'nationLevel' => $nation['level'],
|
||||||
|
'showSecret' => $showSecret,
|
||||||
|
'permission' => $permission,
|
||||||
|
'btnClassForTournament' => $btnClassForTournament,
|
||||||
|
'btnClassForBetting' => $btnClassForBetting,
|
||||||
|
], $opts));
|
||||||
|
}
|
||||||
|
|
||||||
function formatWounded(int $value, int $wound): string
|
function formatWounded(int $value, int $wound): string
|
||||||
{
|
{
|
||||||
if ($wound == 0) {
|
if ($wound == 0) {
|
||||||
|
|||||||
@@ -364,14 +364,7 @@ function disaster(RandUtil $rng) {
|
|||||||
$logger->flush();
|
$logger->flush();
|
||||||
|
|
||||||
if (!$isGood) {
|
if (!$isGood) {
|
||||||
[$queryColumns,,] = General::mergeQueryColumn();
|
$generalListByCity = Util::arrayGroupBy($db->query('SELECT no, name, nation, city, officer_level, injury, leadership, strength, intel, horse, weapon, book, item, crew, crewtype, atmos, train, special, special2 FROM general WHERE city IN %li', Util::squeezeFromArray($targetCityList, 'city')), 'city');
|
||||||
$generalListByCity = Util::arrayGroupBy(
|
|
||||||
$db->query(
|
|
||||||
'SELECT %l FROM general WHERE city IN %li',
|
|
||||||
Util::formatListOfBackticks($queryColumns),
|
|
||||||
Util::squeezeFromArray($targetCityList, 'city')
|
|
||||||
),
|
|
||||||
'city');
|
|
||||||
//NOTE: 쿼리 1번이지만 복잡하기 vs 쿼리 여러번이지만 조금 더 깔끔하기
|
//NOTE: 쿼리 1번이지만 복잡하기 vs 쿼리 여러번이지만 조금 더 깔끔하기
|
||||||
foreach ($targetCityList as $city) {
|
foreach ($targetCityList as $city) {
|
||||||
$affectRatio = Util::valueFit($city['secu'] / $city['secu_max'] / 0.8, 0, 1);
|
$affectRatio = Util::valueFit($city['secu'] / $city['secu_max'] / 0.8, 0, 1);
|
||||||
@@ -390,7 +383,7 @@ function disaster(RandUtil $rng) {
|
|||||||
|
|
||||||
$generalList = array_map(
|
$generalList = array_map(
|
||||||
function($rawGeneral) use ($city, $year, $month){
|
function($rawGeneral) use ($city, $year, $month){
|
||||||
return new General($rawGeneral, null, null, $city, null, $year, $month, false);
|
return new General($rawGeneral, null, $city, null, $year, $month, false);
|
||||||
},
|
},
|
||||||
$generalListByCity[$city['city']]??[]
|
$generalListByCity[$city['city']]??[]
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -882,7 +882,7 @@ function setGift($tnmt_type, $tnmt, $phase)
|
|||||||
//포상 장수 이름, 금액
|
//포상 장수 이름, 금액
|
||||||
$resultHelper[$generalID]['reward'] += $cost;
|
$resultHelper[$generalID]['reward'] += $cost;
|
||||||
$resultHelper[$generalID]['msg'] = "<span class='ev_highlight'>4강 진출</span>";
|
$resultHelper[$generalID]['msg'] = "<span class='ev_highlight'>4강 진출</span>";
|
||||||
General::createObjFromDB($generalID)->increaseInheritancePoint(InheritanceKey::tournament, 10);
|
General::createGeneralObjFromDB($generalID)->increaseInheritancePoint(InheritanceKey::tournament, 10);
|
||||||
}
|
}
|
||||||
//결승자 명성 돈
|
//결승자 명성 돈
|
||||||
$cost = $admin['develcost'] * 6;
|
$cost = $admin['develcost'] * 6;
|
||||||
@@ -946,7 +946,7 @@ function setGift($tnmt_type, $tnmt, $phase)
|
|||||||
$winnerLogger->pushGlobalHistoryLog("<B><b>【대회】</b></><C>{$tp}</> 대회에서 <Y>{$winner['name']}</>{$josaYiWinner} <C>우승</>, <Y>{$runnerUp['name']}</>{$josaYiRunnerUp} <C>준우승</>을 차지하여 천하에 이름을 떨칩니다!", ActionLogger::EVENT_YEAR_MONTH);
|
$winnerLogger->pushGlobalHistoryLog("<B><b>【대회】</b></><C>{$tp}</> 대회에서 <Y>{$winner['name']}</>{$josaYiWinner} <C>우승</>, <Y>{$runnerUp['name']}</>{$josaYiRunnerUp} <C>준우승</>을 차지하여 천하에 이름을 떨칩니다!", ActionLogger::EVENT_YEAR_MONTH);
|
||||||
$winnerLogger->pushGlobalHistoryLog("<B><b>【대회】</b></><C>{$tp}</> 대회의 <S>우승자</>에게는 <C>{$winnerRewardText}</>, <S>준우승자</>에겐 <C>{$runnerUpRewardText}</>의 <S>상금</>과 약간의 <S>명성</>이 주어집니다!", ActionLogger::EVENT_YEAR_MONTH);
|
$winnerLogger->pushGlobalHistoryLog("<B><b>【대회】</b></><C>{$tp}</> 대회의 <S>우승자</>에게는 <C>{$winnerRewardText}</>, <S>준우승자</>에겐 <C>{$runnerUpRewardText}</>의 <S>상금</>과 약간의 <S>명성</>이 주어집니다!", ActionLogger::EVENT_YEAR_MONTH);
|
||||||
|
|
||||||
$generalObjList = General::createObjListFromDB(array_keys($resultHelper));
|
$generalObjList = General::createGeneralObjListFromDB(array_keys($resultHelper));
|
||||||
|
|
||||||
foreach ($resultHelper as $generalID => $general) {
|
foreach ($resultHelper as $generalID => $general) {
|
||||||
$rewardText = number_format($general['reward']);
|
$rewardText = number_format($general['reward']);
|
||||||
|
|||||||
+2
-2
@@ -39,8 +39,8 @@ if ($session->userGrade < 5 && !$allowReset) {
|
|||||||
|
|
||||||
<body>
|
<body>
|
||||||
<div class="container">
|
<div class="container">
|
||||||
<h1 class="row justify-content-lg-center">삼국지 모의전투 HiDCHe 리셋</h1>
|
<h1 class="row justify-content-md-center">삼국지 모의전투 HiDCHe 리셋</h1>
|
||||||
<div class="row justify-content-lg-center">
|
<div class="row justify-content-md-center">
|
||||||
|
|
||||||
<div class="col col-lg-8">
|
<div class="col col-lg-8">
|
||||||
<div class="card" id="game_form_card">
|
<div class="card" id="game_form_card">
|
||||||
|
|||||||
+2
-2
@@ -32,8 +32,8 @@ if ($session->userGrade == 5) {
|
|||||||
|
|
||||||
<body>
|
<body>
|
||||||
<div class="container" style="min-width:720px;">
|
<div class="container" style="min-width:720px;">
|
||||||
<h1 class="row justify-content-lg-center">삼국지 모의전투 HiDCHe 리셋</h1>
|
<h1 class="row justify-content-md-center">삼국지 모의전투 HiDCHe 리셋</h1>
|
||||||
<div class="row justify-content-lg-center">
|
<div class="row justify-content-md-center">
|
||||||
|
|
||||||
<div class="col col-lg-8">
|
<div class="col col-lg-8">
|
||||||
<div class="card" id="db_form_card">
|
<div class="card" id="db_form_card">
|
||||||
|
|||||||
@@ -17,13 +17,10 @@ $text = Util::getPost('text');
|
|||||||
|
|
||||||
increaseRefresh("회의실", 1);
|
increaseRefresh("회의실", 1);
|
||||||
|
|
||||||
$me = $db->queryFirstRow(
|
$me = $db->queryFirstRow('SELECT no, nation, name, officer_level, permission, con, turntime, belong, penalty, `picture`,`imgsvr` FROM general WHERE owner=%i', $userID);
|
||||||
'SELECT no, nation, name, officer_level, permission, refresh_score, turntime, belong, penalty, `picture`,`imgsvr` FROM `general`
|
|
||||||
LEFT JOIN general_access_log AS l ON `general`.no = l.general_id WHERE owner=%i', $userID
|
|
||||||
);
|
|
||||||
|
|
||||||
$limitState = checkLimit($me['refresh_score']);
|
$con = checkLimit($me['con']);
|
||||||
if ($limitState >= 2) {
|
if ($con >= 2) {
|
||||||
Json::die([
|
Json::die([
|
||||||
'result'=>false,
|
'result'=>false,
|
||||||
'reason'=>'접속 제한입니다.'
|
'reason'=>'접속 제한입니다.'
|
||||||
|
|||||||
@@ -16,13 +16,10 @@ $text = Util::getPost('text');
|
|||||||
|
|
||||||
increaseRefresh("회의실", 1);
|
increaseRefresh("회의실", 1);
|
||||||
|
|
||||||
$me = $db->queryFirstRow(
|
$me = $db->queryFirstRow('SELECT no, nation, name, officer_level, permission, con, turntime, belong, penalty FROM general WHERE owner=%i', $userID);
|
||||||
'SELECT no, nation, name, officer_level, permission, refresh_score, turntime, belong, penalty FROM `general`
|
|
||||||
LEFT JOIN general_access_log AS l ON `general`.no = l.general_id WHERE owner=%i', $userID
|
|
||||||
);
|
|
||||||
|
|
||||||
$limitState = checkLimit($me['refresh_score']);
|
$con = checkLimit($me['con']);
|
||||||
if ($limitState >= 2) {
|
if ($con >= 2) {
|
||||||
Json::die([
|
Json::die([
|
||||||
'result'=>false,
|
'result'=>false,
|
||||||
'reason'=>'접속 제한입니다.'
|
'reason'=>'접속 제한입니다.'
|
||||||
|
|||||||
@@ -16,14 +16,11 @@ $isSecretBoard = Util::getPost('isSecret', 'bool', false);
|
|||||||
|
|
||||||
increaseRefresh("회의실", 1);
|
increaseRefresh("회의실", 1);
|
||||||
|
|
||||||
$me = $db->queryFirstRow(
|
$me = $db->queryFirstRow('SELECT no, nation, officer_level, permission, con, turntime, belong, penalty FROM general WHERE owner=%i', $userID);
|
||||||
'SELECT no, nation, officer_level, permission, refresh_score, turntime, belong, penalty FROM `general`
|
|
||||||
LEFT JOIN general_access_log AS l ON `general`.no = l.general_id WHERE owner=%i', $userID
|
|
||||||
);
|
|
||||||
|
|
||||||
|
|
||||||
$limitState = checkLimit($me['refresh_score']);
|
$con = checkLimit($me['con']);
|
||||||
if ($limitState >= 2) {
|
if ($con >= 2) {
|
||||||
Json::die([
|
Json::die([
|
||||||
'result'=>false,
|
'result'=>false,
|
||||||
'reason'=>'접속 제한입니다.'
|
'reason'=>'접속 제한입니다.'
|
||||||
@@ -75,3 +72,4 @@ Json::die([
|
|||||||
'articles'=>$articles,
|
'articles'=>$articles,
|
||||||
'reason'=>'success'
|
'reason'=>'success'
|
||||||
]);
|
]);
|
||||||
|
|
||||||
|
|||||||
@@ -17,13 +17,10 @@ $letterNo = Util::getPost('letterNo', 'int');
|
|||||||
|
|
||||||
increaseRefresh("외교부", 1);
|
increaseRefresh("외교부", 1);
|
||||||
|
|
||||||
$me = $db->queryFirstRow(
|
$me = $db->queryFirstRow('SELECT no, name, nation, officer_level, permission, con, turntime, belong, penalty, picture, imgsvr FROM general WHERE owner=%i', $userID);
|
||||||
'SELECT no, name, nation, officer_level, permission, refresh_score, turntime, belong, penalty, picture, imgsvr FROM `general`
|
|
||||||
LEFT JOIN general_access_log AS l ON `general`.no = l.general_id WHERE owner=%i', $userID
|
|
||||||
);
|
|
||||||
|
|
||||||
$limitState = checkLimit($me['refresh_score']);
|
$con = checkLimit($me['con']);
|
||||||
if ($limitState >= 2) {
|
if ($con >= 2) {
|
||||||
Json::die([
|
Json::die([
|
||||||
'result'=>false,
|
'result'=>false,
|
||||||
'reason'=>'접속 제한입니다.'
|
'reason'=>'접속 제한입니다.'
|
||||||
|
|||||||
@@ -16,14 +16,11 @@ $isSecretBoard = Util::getPost('isSecret', 'bool', false);
|
|||||||
|
|
||||||
increaseRefresh("외교부", 1);
|
increaseRefresh("외교부", 1);
|
||||||
|
|
||||||
$me = $db->queryFirstRow(
|
$me = $db->queryFirstRow('SELECT no, nation, officer_level, permission, con, turntime, belong, penalty FROM general WHERE owner=%i', $userID);
|
||||||
'SELECT no, nation, officer_level, permission, refresh_score, turntime, belong, penalty FROM `general`
|
|
||||||
LEFT JOIN general_access_log AS l ON `general`.no = l.general_id WHERE owner=%i', $userID
|
|
||||||
);
|
|
||||||
|
|
||||||
|
|
||||||
$limitState = checkLimit($me['refresh_score']);
|
$con = checkLimit($me['con']);
|
||||||
if ($limitState >= 2) {
|
if ($con >= 2) {
|
||||||
Json::die([
|
Json::die([
|
||||||
'result'=>false,
|
'result'=>false,
|
||||||
'reason'=>'접속 제한입니다.'
|
'reason'=>'접속 제한입니다.'
|
||||||
@@ -86,3 +83,4 @@ Json::die([
|
|||||||
'myNationID'=>$me['nation'],
|
'myNationID'=>$me['nation'],
|
||||||
'reason'=>'success'
|
'reason'=>'success'
|
||||||
]);
|
]);
|
||||||
|
|
||||||
|
|||||||
@@ -22,13 +22,10 @@ $reason = Util::getPost('reason', 'string', '');
|
|||||||
|
|
||||||
increaseRefresh("외교부", 1);
|
increaseRefresh("외교부", 1);
|
||||||
|
|
||||||
$me = $db->queryFirstRow(
|
$me = $db->queryFirstRow('SELECT no, name, nation, officer_level, permission, con, turntime, belong, penalty, picture, imgsvr FROM general WHERE owner=%i', $userID);
|
||||||
'SELECT no, name, nation, officer_level, permission, refresh_score, turntime, belong, penalty, picture, imgsvr FROM `general`
|
|
||||||
LEFT JOIN general_access_log AS l ON `general`.no = l.general_id WHERE owner=%i', $userID
|
|
||||||
);
|
|
||||||
|
|
||||||
$limitState = checkLimit($me['refresh_score']);
|
$con = checkLimit($me['con']);
|
||||||
if ($limitState >= 2) {
|
if ($con >= 2) {
|
||||||
Json::die([
|
Json::die([
|
||||||
'result'=>false,
|
'result'=>false,
|
||||||
'reason'=>'접속 제한입니다.'
|
'reason'=>'접속 제한입니다.'
|
||||||
|
|||||||
@@ -17,13 +17,10 @@ $letterNo = Util::getPost('letterNo', 'int');
|
|||||||
|
|
||||||
increaseRefresh("외교부", 1);
|
increaseRefresh("외교부", 1);
|
||||||
|
|
||||||
$me = $db->queryFirstRow(
|
$me = $db->queryFirstRow('SELECT no, name, nation, officer_level, permission, con, turntime, belong, penalty, picture, imgsvr FROM general WHERE owner=%i', $userID);
|
||||||
'SELECT no, name, nation, officer_level, permission, refresh_score, turntime, belong, penalty, picture, imgsvr FROM `general`
|
|
||||||
LEFT JOIN general_access_log AS l ON `general`.no = l.general_id WHERE owner=%i', $userID
|
|
||||||
);
|
|
||||||
|
|
||||||
$limitState = checkLimit($me['refresh_score']);
|
$con = checkLimit($me['con']);
|
||||||
if ($limitState >= 2) {
|
if ($con >= 2) {
|
||||||
Json::die([
|
Json::die([
|
||||||
'result'=>false,
|
'result'=>false,
|
||||||
'reason'=>'접속 제한입니다.'
|
'reason'=>'접속 제한입니다.'
|
||||||
|
|||||||
@@ -24,13 +24,10 @@ if($prevNo < 1){
|
|||||||
$prevNo = null;
|
$prevNo = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
$me = $db->queryFirstRow(
|
$me = $db->queryFirstRow('SELECT no, name, nation, officer_level, permission, con, turntime, belong, penalty, picture, imgsvr FROM general WHERE owner=%i', $userID);
|
||||||
'SELECT no, name, nation, officer_level, permission, refresh_score, turntime, belong, penalty, picture, imgsvr FROM `general`
|
|
||||||
LEFT JOIN general_access_log AS l ON `general`.no = l.general_id WHERE owner=%i', $userID
|
|
||||||
);
|
|
||||||
|
|
||||||
$limitState = checkLimit($me['refresh_score']);
|
$con = checkLimit($me['con']);
|
||||||
if ($limitState >= 2) {
|
if ($con >= 2) {
|
||||||
Json::die([
|
Json::die([
|
||||||
'result'=>false,
|
'result'=>false,
|
||||||
'reason'=>'접속 제한입니다.'
|
'reason'=>'접속 제한입니다.'
|
||||||
|
|||||||
@@ -33,15 +33,12 @@ if($generalID <= 0 || $reqTo <= 0){
|
|||||||
|
|
||||||
$db = DB::db();
|
$db = DB::db();
|
||||||
|
|
||||||
$me = $db->queryFirstRow(
|
$me = $db->queryFirstRow('SELECT no,nation,officer_level,con,turntime,belong,permission,penalty from general where owner=%i', $userID);
|
||||||
'SELECT no,nation,officer_level,refresh_score,turntime,belong,permission,penalty FROM `general`
|
|
||||||
LEFT JOIN general_access_log AS l ON `general`.no = l.general_id WHERE owner=%i', $userID
|
|
||||||
);
|
|
||||||
$nationID = $me['nation'];
|
$nationID = $me['nation'];
|
||||||
|
|
||||||
|
|
||||||
$limitState = checkLimit($me['refresh_score']);
|
$con = checkLimit($me['con']);
|
||||||
if ($limitState >= 2) {
|
if ($con >= 2) {
|
||||||
Json::die([
|
Json::die([
|
||||||
'result'=>false,
|
'result'=>false,
|
||||||
'reason'=>'접속 제한입니다.'
|
'reason'=>'접속 제한입니다.'
|
||||||
|
|||||||
+14
-22
@@ -199,25 +199,17 @@ if($reserve_open){
|
|||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
|
|
||||||
try{
|
Json::die(ResetHelper::buildScenario(
|
||||||
Json::die(ResetHelper::buildScenario(
|
$turnterm,
|
||||||
$turnterm,
|
$sync,
|
||||||
$sync,
|
$scenario,
|
||||||
$scenario,
|
$fiction,
|
||||||
$fiction,
|
$extend,
|
||||||
$extend,
|
$block_general_create,
|
||||||
$block_general_create,
|
$npcmode,
|
||||||
$npcmode,
|
$show_img_level,
|
||||||
$show_img_level,
|
!!$tournament_trig,
|
||||||
!!$tournament_trig,
|
$join_mode,
|
||||||
$join_mode,
|
TimeUtil::now(),
|
||||||
TimeUtil::now(),
|
$autorun_user
|
||||||
$autorun_user
|
));
|
||||||
));
|
|
||||||
}
|
|
||||||
catch(\Exception $e){
|
|
||||||
Json::die([
|
|
||||||
'result'=>false,
|
|
||||||
'reason'=>$e->getMessage()
|
|
||||||
]);
|
|
||||||
}
|
|
||||||
@@ -1,8 +1,6 @@
|
|||||||
<?php
|
<?php
|
||||||
namespace sammo;
|
namespace sammo;
|
||||||
|
|
||||||
use sammo\Enums\GeneralLiteQueryMode;
|
|
||||||
use sammo\Enums\GeneralQueryMode;
|
|
||||||
use sammo\Enums\MessageType;
|
use sammo\Enums\MessageType;
|
||||||
|
|
||||||
include "lib.php";
|
include "lib.php";
|
||||||
@@ -47,7 +45,12 @@ if($destGeneralID==0){
|
|||||||
$general->setVar('nation', $nationID);
|
$general->setVar('nation', $nationID);
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
$general = General::createObjFromDB($destGeneralID);
|
$general = General::createGeneralObjFromDB($destGeneralID, [
|
||||||
|
'name', 'leadership', 'strength', 'intel', 'gold','rice',
|
||||||
|
'troop','officer_level','npc','picture','imgsvr',
|
||||||
|
'permission','penalty','belong', 'crewtype',
|
||||||
|
'experience', 'dedication', 'betray', 'dedlevel', 'explevel', 'makelimit', 'aux',
|
||||||
|
], 1);
|
||||||
|
|
||||||
if($general instanceof DummyGeneral){
|
if($general instanceof DummyGeneral){
|
||||||
Json::die([
|
Json::die([
|
||||||
|
|||||||
@@ -1,8 +1,6 @@
|
|||||||
<?php
|
<?php
|
||||||
namespace sammo;
|
namespace sammo;
|
||||||
|
|
||||||
use sammo\Enums\GeneralAccessLogColumn;
|
|
||||||
|
|
||||||
include "lib.php";
|
include "lib.php";
|
||||||
include "func.php";
|
include "func.php";
|
||||||
|
|
||||||
@@ -88,11 +86,6 @@ $db->update('general', [
|
|||||||
'owner'=>$userID,
|
'owner'=>$userID,
|
||||||
'aux'=>Json::encode($genAux)
|
'aux'=>Json::encode($genAux)
|
||||||
], 'owner <= 0 AND npc = 2 AND no = %i', $pick);
|
], 'owner <= 0 AND npc = 2 AND no = %i', $pick);
|
||||||
$db->insertIgnore('general_access_log', [
|
|
||||||
GeneralAccessLogColumn::generalID->value => $pick,
|
|
||||||
GeneralAccessLogColumn::userID->value => $userID,
|
|
||||||
GeneralAccessLogColumn::lastRefresh->value => $now,
|
|
||||||
]);
|
|
||||||
|
|
||||||
if(!$db->affectedRows()){
|
if(!$db->affectedRows()){
|
||||||
Json::die([
|
Json::die([
|
||||||
|
|||||||
@@ -36,19 +36,15 @@ if($tnmt < 0 || $tnmt > 1){
|
|||||||
}
|
}
|
||||||
|
|
||||||
$db = DB::db();
|
$db = DB::db();
|
||||||
$me = General::createObjFromDB($generalID);
|
$me = General::createGeneralObjFromDB($generalID);
|
||||||
|
|
||||||
|
|
||||||
if($defence_train !== $me->getVar('defence_train')){
|
if($defence_train !== $me->getVar('defence_train')){
|
||||||
if($defence_train == 999){
|
if($defence_train == 999){
|
||||||
$me->increaseVar('myset', -1);
|
$me->increaseVar('myset', -1);
|
||||||
$me->setVar('defence_train', $defence_train);
|
$me->setVar('defence_train', $defence_train);
|
||||||
$affectedTrain = -3;
|
$me->increaseVarWithLimit('train', -3, 20);
|
||||||
$affectedAtmos = -6;
|
$me->increaseVarWithLimit('atmos', -6, 20);
|
||||||
$affectedTrain = $me->onCalcDomestic('changeDefenceTrain', "train{$defence_train}", $affectedTrain);
|
|
||||||
$affectedAtmos = $me->onCalcDomestic('changeDefenceTrain', "atmos{$defence_train}", $affectedAtmos);
|
|
||||||
$me->increaseVarWithLimit('train', $affectedTrain, 20, GameConst::$maxTrainByWar);
|
|
||||||
$me->increaseVarWithLimit('atmos', $affectedAtmos, 20, GameConst::$maxAtmosByWar);
|
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
$me->increaseVar('myset', -1);
|
$me->increaseVar('myset', -1);
|
||||||
|
|||||||
@@ -39,10 +39,7 @@ if (!$data || !is_array($data)) {
|
|||||||
|
|
||||||
$db = DB::db();
|
$db = DB::db();
|
||||||
|
|
||||||
$me = $db->queryFirstRow(
|
$me = $db->queryFirstRow('SELECT no, name, npc, nation, city, officer_level, con, turntime, belong, permission, penalty FROM general WHERE owner=%i', $userID);
|
||||||
'SELECT no, name, npc, nation, city, officer_level, refresh_score, turntime, belong, permission, penalty FROM `general`
|
|
||||||
LEFT JOIN general_access_log AS l ON `general`.no = l.general_id WHERE owner=%i', $userID
|
|
||||||
);
|
|
||||||
|
|
||||||
|
|
||||||
$nationID = $me['nation'];
|
$nationID = $me['nation'];
|
||||||
|
|||||||
+223
-280
@@ -1,5 +1,4 @@
|
|||||||
<?php
|
<?php
|
||||||
|
|
||||||
namespace sammo;
|
namespace sammo;
|
||||||
|
|
||||||
use Ds\Map;
|
use Ds\Map;
|
||||||
@@ -16,48 +15,48 @@ $userID = Session::getUserID();
|
|||||||
increaseRefresh("시뮬레이터", 0);
|
increaseRefresh("시뮬레이터", 0);
|
||||||
|
|
||||||
$query = Util::getPost('query');
|
$query = Util::getPost('query');
|
||||||
if ($query === null) {
|
if($query === null){
|
||||||
Json::die([
|
Json::die([
|
||||||
'result' => false,
|
'result'=>false,
|
||||||
'reason' => '입력값이 없습니다.'
|
'reason'=>'입력값이 없습니다.'
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
|
|
||||||
$action = Util::getPost('action');
|
$action = Util::getPost('action');
|
||||||
if ($action === null || !in_array($action, ['reorder', 'battle'])) {
|
if($action === null || !in_array($action, ['reorder', 'battle'])){
|
||||||
Json::die([
|
Json::die([
|
||||||
'result' => false,
|
'result'=>false,
|
||||||
'reason' => '원하는 동작이 지정되지 않았습니다.'
|
'reason'=>'원하는 동작이 지정되지 않았습니다.'
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
|
|
||||||
$query = Json::decode($query);
|
$query = Json::decode($query);
|
||||||
if ($query === null) {
|
if($query === null){
|
||||||
Json::die([
|
Json::die([
|
||||||
'result' => false,
|
'result'=>false,
|
||||||
'reason' => '올바르지 않은 JSON입니다.'
|
'reason'=>'올바르지 않은 JSON입니다.'
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
|
|
||||||
$defaultCheck = [
|
$defaultCheck = [
|
||||||
'required' => [
|
'required'=>[
|
||||||
'attackerGeneral', 'attackerCity', 'attackerNation',
|
'attackerGeneral', 'attackerCity', 'attackerNation',
|
||||||
'defenderGenerals', 'defenderCity', 'defenderNation',
|
'defenderGenerals', 'defenderCity', 'defenderNation',
|
||||||
'year', 'month', 'repeatCnt'
|
'year', 'month', 'repeatCnt'
|
||||||
],
|
],
|
||||||
'integer' => [
|
'integer'=>[
|
||||||
'year', 'month', 'repeatCnt'
|
'year','month','repeatCnt'
|
||||||
],
|
],
|
||||||
'between' => [
|
'between'=>[
|
||||||
['month', [1, 12]]
|
['month', [1, 12]]
|
||||||
],
|
],
|
||||||
'in' => [
|
'in'=>[
|
||||||
['repeatCnt', [1, 1000]]
|
['repeatCnt', [1, 1000]]
|
||||||
],
|
],
|
||||||
'min' => [
|
'min'=>[
|
||||||
['year', 0]
|
['year', 0]
|
||||||
],
|
],
|
||||||
'array' => [
|
'array'=>[
|
||||||
'attackerGeneral', 'attackerCity', 'attackerNation',
|
'attackerGeneral', 'attackerCity', 'attackerNation',
|
||||||
'defenderGenerals', 'defenderCity', 'defenderNation'
|
'defenderGenerals', 'defenderCity', 'defenderNation'
|
||||||
],
|
],
|
||||||
@@ -65,10 +64,10 @@ $defaultCheck = [
|
|||||||
|
|
||||||
$v = new Validator($query);
|
$v = new Validator($query);
|
||||||
$v->rules($defaultCheck);
|
$v->rules($defaultCheck);
|
||||||
if (!$v->validate()) {
|
if(!$v->validate()){
|
||||||
Json::die([
|
Json::die([
|
||||||
'result' => false,
|
'result'=>false,
|
||||||
'reason' => $v->errorStr()
|
'reason'=>$v->errorStr()
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -87,110 +86,20 @@ $rawDefenderNation = $query['defenderNation'];
|
|||||||
|
|
||||||
$warSeed = $query['seed'] ?? '';
|
$warSeed = $query['seed'] ?? '';
|
||||||
|
|
||||||
$cityCheck = [
|
|
||||||
'required' => [
|
|
||||||
'city', 'nation', 'supply', 'name',
|
|
||||||
'pop', 'agri', 'comm', 'secu', 'def', 'wall',
|
|
||||||
'trust', 'level',
|
|
||||||
'pop_max', 'agri_max', 'comm_max', 'secu_max', 'def_max', 'wall_max',
|
|
||||||
'dead', 'state', 'conflict',
|
|
||||||
],
|
|
||||||
'numeric' => [
|
|
||||||
'pop', 'agri', 'comm', 'secu', 'def', 'wall', 'trust', 'dead'
|
|
||||||
],
|
|
||||||
'integer' => [
|
|
||||||
'city', 'nation', 'supply',
|
|
||||||
'pop_max', 'agri_max', 'comm_max', 'secu_max', 'def_max', 'wall_max',
|
|
||||||
'state',
|
|
||||||
],
|
|
||||||
'min' => [
|
|
||||||
['def', 0],
|
|
||||||
['wall', 0],
|
|
||||||
['trust', 0],
|
|
||||||
['pop', 0],
|
|
||||||
['comm', 0],
|
|
||||||
['secu', 0],
|
|
||||||
['city', 1],
|
|
||||||
['nation', 0]
|
|
||||||
],
|
|
||||||
'in' => [
|
|
||||||
['level', array_keys(getCityLevelList())]
|
|
||||||
]
|
|
||||||
];
|
|
||||||
|
|
||||||
$v = new Validator($rawAttackerCity);
|
|
||||||
$v->rules($cityCheck);
|
|
||||||
if (!$v->validate()) {
|
|
||||||
Json::die([
|
|
||||||
'result' => false,
|
|
||||||
'reason' => '[출병도시]' . $v->errorStr()
|
|
||||||
]);
|
|
||||||
}
|
|
||||||
|
|
||||||
$v = new Validator($rawDefenderCity);
|
|
||||||
$v->rules($cityCheck);
|
|
||||||
if (!$v->validate()) {
|
|
||||||
Json::die([
|
|
||||||
'result' => false,
|
|
||||||
'reason' => '[수비도시]' . $v->errorStr()
|
|
||||||
]);
|
|
||||||
}
|
|
||||||
|
|
||||||
$nationCheck = [
|
|
||||||
'required' => [
|
|
||||||
'type', 'tech', 'level', 'capital',
|
|
||||||
'nation', 'name', 'gold', 'rice', 'gennum'
|
|
||||||
],
|
|
||||||
'integer' => [
|
|
||||||
'level', 'capital', 'nation', 'gennum',
|
|
||||||
],
|
|
||||||
'numeric' => [
|
|
||||||
'tech', 'gold', 'rice'
|
|
||||||
],
|
|
||||||
'min' => [
|
|
||||||
['tech', 0],
|
|
||||||
['gold', 0],
|
|
||||||
['rice', 0],
|
|
||||||
['gennum', 1],
|
|
||||||
],
|
|
||||||
'in' => [
|
|
||||||
['type', GameConst::$availableNationType],
|
|
||||||
['level', array_keys(getNationLevelList())]
|
|
||||||
]
|
|
||||||
];
|
|
||||||
|
|
||||||
$v = new Validator($rawAttackerNation);
|
|
||||||
$v->rules($nationCheck);
|
|
||||||
if (!$v->validate()) {
|
|
||||||
Json::die([
|
|
||||||
'result' => false,
|
|
||||||
'reason' => '[출병국]' . $v->errorStr()
|
|
||||||
]);
|
|
||||||
}
|
|
||||||
|
|
||||||
$v = new Validator($rawDefenderNation);
|
|
||||||
$v->rules($nationCheck);
|
|
||||||
if (!$v->validate()) {
|
|
||||||
Json::die([
|
|
||||||
'result' => false,
|
|
||||||
'reason' => '[수비국]' . $v->errorStr()
|
|
||||||
]);
|
|
||||||
}
|
|
||||||
|
|
||||||
$generalCheck = [
|
$generalCheck = [
|
||||||
'required' => [
|
'required'=>[
|
||||||
'no', 'name', 'nation', 'turntime', 'personal', 'special2', 'crew', 'crewtype', 'atmos', 'train',
|
'no', 'name', 'nation', 'turntime', 'personal', 'special2', 'crew', 'crewtype', 'atmos', 'train',
|
||||||
'intel', 'intel_exp', 'book', 'strength', 'strength_exp', 'weapon', 'injury', 'leadership', 'leadership_exp', 'horse', 'item',
|
'intel', 'intel_exp', 'book', 'strength', 'strength_exp', 'weapon', 'injury', 'leadership', 'leadership_exp', 'horse', 'item',
|
||||||
'explevel', 'experience', 'dedication', 'officer_level', 'officer_city', 'gold', 'rice', 'dex1', 'dex2', 'dex3', 'dex4', 'dex5',
|
'explevel', 'experience', 'dedication', 'officer_level', 'officer_city', 'gold', 'rice', 'dex1', 'dex2', 'dex3', 'dex4', 'dex5',
|
||||||
'recent_war', 'warnum', 'killnum', 'killcrew',
|
'recent_war', 'warnum', 'killnum', 'killcrew',
|
||||||
],
|
],
|
||||||
'integer' => [
|
'integer'=>[
|
||||||
'no', 'nation', 'crew', 'crewtype', 'atmos', 'train',
|
'no', 'nation', 'crew', 'crewtype', 'atmos', 'train',
|
||||||
'intel', 'intel_exp', 'strength', 'strength_exp', 'injury', 'leadership', 'leadership_exp',
|
'intel', 'intel_exp', 'strength', 'strength_exp', 'injury', 'leadership', 'leadership_exp',
|
||||||
'explevel', 'experience', 'dedication', 'officer_level', 'officer_city', 'gold', 'rice', 'dex1', 'dex2', 'dex3', 'dex4', 'dex5',
|
'explevel', 'experience', 'dedication', 'officer_level', 'officer_city', 'gold', 'rice', 'dex1', 'dex2', 'dex3', 'dex4', 'dex5',
|
||||||
'warnum', 'killnum', 'killcrew',
|
'warnum', 'killnum', 'killcrew',
|
||||||
],
|
],
|
||||||
'min' => [
|
'min'=>[
|
||||||
['no', 1],
|
['no', 1],
|
||||||
['nation', 1],
|
['nation', 1],
|
||||||
['crew', 0],
|
['crew', 0],
|
||||||
@@ -209,14 +118,14 @@ $generalCheck = [
|
|||||||
['killnum', 0],
|
['killnum', 0],
|
||||||
['killcrew', 0],
|
['killcrew', 0],
|
||||||
],
|
],
|
||||||
'between' => [
|
'between'=>[
|
||||||
['train', [40, GameConst::$maxTrainByWar]],
|
['train', [40, GameConst::$maxTrainByWar]],
|
||||||
['atmos', [40, GameConst::$maxAtmosByWar]],
|
['atmos', [40, GameConst::$maxAtmosByWar]],
|
||||||
['explevel', [0, 300]],
|
['explevel', [0, 300]],
|
||||||
['injury', [0, 80]],
|
['injury', [0, 80]],
|
||||||
['officer_level', [1, 12]]
|
['officer_level', [1, 12]]
|
||||||
],
|
],
|
||||||
'in' => [
|
'in'=>[
|
||||||
['personal', array_merge(GameConst::$availablePersonality, GameConst::$optionalPersonality)],
|
['personal', array_merge(GameConst::$availablePersonality, GameConst::$optionalPersonality)],
|
||||||
['special2', array_merge(GameConst::$availableSpecialWar, GameConst::$optionalSpecialWar)],
|
['special2', array_merge(GameConst::$availableSpecialWar, GameConst::$optionalSpecialWar)],
|
||||||
['crewtype', array_keys(GameUnitConst::all())],
|
['crewtype', array_keys(GameUnitConst::all())],
|
||||||
@@ -225,11 +134,11 @@ $generalCheck = [
|
|||||||
['book', array_merge(array_keys(GameConst::$allItems['book']), ['None'])],
|
['book', array_merge(array_keys(GameConst::$allItems['book']), ['None'])],
|
||||||
['item', array_merge(array_keys(GameConst::$allItems['item']), ['None'])],
|
['item', array_merge(array_keys(GameConst::$allItems['item']), ['None'])],
|
||||||
],
|
],
|
||||||
'array' => ['inheritBuff'],
|
'array'=>['inheritBuff'],
|
||||||
];
|
];
|
||||||
|
|
||||||
$inheritBuffCheck = [
|
$inheritBuffCheck = [
|
||||||
'between' => [
|
'between'=>[
|
||||||
[TriggerInheritBuff::WAR_AVOID_RATIO, [0, 5]],
|
[TriggerInheritBuff::WAR_AVOID_RATIO, [0, 5]],
|
||||||
[TriggerInheritBuff::WAR_CRITICAL_RATIO, [0, 5]],
|
[TriggerInheritBuff::WAR_CRITICAL_RATIO, [0, 5]],
|
||||||
[TriggerInheritBuff::WAR_MAGIC_TRIAL_PROB, [0, 5]],
|
[TriggerInheritBuff::WAR_MAGIC_TRIAL_PROB, [0, 5]],
|
||||||
@@ -240,67 +149,49 @@ $inheritBuffCheck = [
|
|||||||
]
|
]
|
||||||
];
|
];
|
||||||
|
|
||||||
if(!$warSeed){
|
|
||||||
$warSeed = bin2hex(random_bytes(16));
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
$repeatCnt = 1;
|
|
||||||
}
|
|
||||||
$tmpRNG = new RandUtil(new LiteHashDRBG($warSeed));
|
|
||||||
|
|
||||||
$v = new Validator($rawAttacker);
|
$v = new Validator($rawAttacker);
|
||||||
$v->rules($generalCheck);
|
$v->rules($generalCheck);
|
||||||
if (!$v->validate()) {
|
if(!$v->validate()){
|
||||||
Json::die([
|
Json::die([
|
||||||
'result' => false,
|
'result'=>false,
|
||||||
'reason' => '[출병자]' . $v->errorStr()
|
'reason'=>'[출병자]'.$v->errorStr()
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
$rawAttacker['aux'] = [];
|
$rawAttacker['aux'] = [];
|
||||||
if (key_exists('inheritBuff', $rawAttacker)) {
|
if(key_exists('inheritBuff', $rawAttacker)){
|
||||||
$v = new Validator($rawAttacker['inheritBuff']);
|
$v = new Validator($rawAttacker['inheritBuff']);
|
||||||
$v->rules($inheritBuffCheck);
|
$v->rules($inheritBuffCheck);
|
||||||
if (!$v->validate()) {
|
if(!$v->validate()){
|
||||||
Json::die([
|
Json::die([
|
||||||
'result' => false,
|
'result'=>false,
|
||||||
'reason' => '[출병자]' . $v->errorStr()
|
'reason'=>'[출병자]'.$v->errorStr()
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
$rawAttacker['aux']['inheritBuff'] = $rawAttacker['inheritBuff'];
|
$rawAttacker['aux']['inheritBuff'] = $rawAttacker['inheritBuff'];
|
||||||
}
|
}
|
||||||
$rawAttacker['aux'] = Json::encode($rawAttacker['aux']);
|
$rawAttacker['aux'] = Json::encode($rawAttacker['aux']);
|
||||||
$rawAttacker['owner'] = 0;
|
$rawAttacker['owner'] = 0;
|
||||||
$attackerGeneral = new General($rawAttacker, extractRankVar($rawAttacker), null, $rawAttackerCity, $rawAttackerNation, $year, $month);
|
|
||||||
$attacker = new WarUnitGeneral(
|
|
||||||
$tmpRNG,
|
|
||||||
$attackerGeneral,
|
|
||||||
$rawAttackerNation,
|
|
||||||
true
|
|
||||||
);
|
|
||||||
|
|
||||||
|
|
||||||
/** @var WarUnit[] */
|
|
||||||
$defenderList = [];
|
$defenderList = [];
|
||||||
|
foreach($rawDefenderList as $idx=>$rawDefenderGeneral){
|
||||||
foreach ($rawDefenderList as $idx => $rawDefenderGeneral) {
|
|
||||||
$v = new Validator($rawDefenderGeneral);
|
$v = new Validator($rawDefenderGeneral);
|
||||||
$v->rules($generalCheck);
|
$v->rules($generalCheck);
|
||||||
if (!$v->validate()) {
|
if(!$v->validate()){
|
||||||
$idx += 1;
|
$idx+=1;
|
||||||
Json::die([
|
Json::die([
|
||||||
'result' => false,
|
'result'=>false,
|
||||||
'reason' => "[수비자{$idx}]" . $v->errorStr()
|
'reason'=>"[수비자{$idx}]".$v->errorStr()
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
$rawDefenderGeneral['aux'] = [];
|
$rawDefenderGeneral['aux'] = [];
|
||||||
if (key_exists('inheritBuff', $rawDefenderGeneral)) {
|
if(key_exists('inheritBuff', $rawDefenderGeneral)){
|
||||||
$v = new Validator($rawDefenderGeneral['inheritBuff']);
|
$v = new Validator($rawDefenderGeneral['inheritBuff']);
|
||||||
$v->rules($inheritBuffCheck);
|
$v->rules($inheritBuffCheck);
|
||||||
if (!$v->validate()) {
|
if(!$v->validate()){
|
||||||
$idx += 1;
|
$idx+=1;
|
||||||
Json::die([
|
Json::die([
|
||||||
'result' => false,
|
'result'=>false,
|
||||||
'reason' => "[수비자{$idx}]" . $v->errorStr()
|
'reason'=>"[수비자{$idx}]".$v->errorStr()
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
$rawDefenderGeneral['aux']['inheritBuff'] = $rawDefenderGeneral['inheritBuff'];
|
$rawDefenderGeneral['aux']['inheritBuff'] = $rawDefenderGeneral['inheritBuff'];
|
||||||
@@ -308,54 +199,135 @@ foreach ($rawDefenderList as $idx => $rawDefenderGeneral) {
|
|||||||
$rawDefenderGeneral['aux'] = Json::encode($rawDefenderGeneral['aux']);
|
$rawDefenderGeneral['aux'] = Json::encode($rawDefenderGeneral['aux']);
|
||||||
$rawDefenderGeneral['owner'] = 0;
|
$rawDefenderGeneral['owner'] = 0;
|
||||||
|
|
||||||
$defenderGeneral = new General($rawDefenderGeneral, extractRankVar($rawDefenderGeneral), null, $rawDefenderCity, $rawAttackerNation, $year, $month, true);
|
$defenderList[] = new General($rawDefenderGeneral, extractRankVar($rawDefenderGeneral), $rawDefenderCity, $rawAttackerNation, $year, $month, true);
|
||||||
|
|
||||||
$defenderList[] = new WarUnitGeneral(
|
|
||||||
$tmpRNG,
|
|
||||||
$defenderGeneral,
|
|
||||||
$rawDefenderNation,
|
|
||||||
false
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($action == 'reorder') {
|
|
||||||
$noRng = NoRNG::rngInstance();
|
|
||||||
|
|
||||||
usort($defenderList, function (WarUnit $lhs, WarUnit $rhs) use ($attacker) {
|
$cityCheck = [
|
||||||
return - (extractBattleOrder($lhs, $attacker) <=> extractBattleOrder($rhs, $attacker));
|
'required'=>[
|
||||||
});
|
'city', 'nation', 'supply', 'name',
|
||||||
|
'pop', 'agri', 'comm', 'secu', 'def', 'wall',
|
||||||
$order = [];
|
'trust', 'level',
|
||||||
foreach ($defenderList as $defender) {
|
'pop_max', 'agri_max', 'comm_max', 'secu_max', 'def_max', 'wall_max',
|
||||||
$order[] = $defender->getGeneral()->getID();
|
'dead', 'state', 'conflict',
|
||||||
}
|
],
|
||||||
|
'numeric'=>[
|
||||||
|
'pop', 'agri', 'comm', 'secu', 'def', 'wall', 'trust', 'dead'
|
||||||
|
],
|
||||||
|
'integer'=>[
|
||||||
|
'city', 'nation', 'supply',
|
||||||
|
'pop_max', 'agri_max', 'comm_max', 'secu_max', 'def_max', 'wall_max',
|
||||||
|
'state',
|
||||||
|
],
|
||||||
|
'min'=>[
|
||||||
|
['def', 0],
|
||||||
|
['wall', 0],
|
||||||
|
['trust', 0],
|
||||||
|
['pop', 0],
|
||||||
|
['comm', 0],
|
||||||
|
['secu', 0],
|
||||||
|
['city', 1],
|
||||||
|
['nation', 0]
|
||||||
|
],
|
||||||
|
'in'=>[
|
||||||
|
['level', array_keys(getCityLevelList())]
|
||||||
|
]
|
||||||
|
];
|
||||||
|
|
||||||
|
$v = new Validator($rawAttackerCity);
|
||||||
|
$v->rules($cityCheck);
|
||||||
|
if(!$v->validate()){
|
||||||
Json::die([
|
Json::die([
|
||||||
'result' => true,
|
'result'=>false,
|
||||||
'reason' => 'success',
|
'reason'=>'[출병도시]'.$v->errorStr()
|
||||||
'order' => $order
|
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
|
|
||||||
$rawDefenderList = [];
|
$v = new Validator($rawDefenderCity);
|
||||||
foreach($defenderList as $unit){
|
$v->rules($cityCheck);
|
||||||
if(extractBattleOrder($unit, $attacker) <= 0){
|
if(!$v->validate()){
|
||||||
continue;
|
Json::die([
|
||||||
}
|
'result'=>false,
|
||||||
$rawDefenderList[] = $unit->getRaw();
|
'reason'=>'[수비도시]'.$v->errorStr()
|
||||||
|
]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$nationCheck = [
|
||||||
|
'required'=>[
|
||||||
|
'type', 'tech', 'level', 'capital',
|
||||||
|
'nation', 'name', 'gold', 'rice', 'gennum'
|
||||||
|
],
|
||||||
|
'integer'=>[
|
||||||
|
'level', 'capital', 'nation', 'gennum',
|
||||||
|
],
|
||||||
|
'numeric'=>[
|
||||||
|
'tech', 'gold', 'rice'
|
||||||
|
],
|
||||||
|
'min'=>[
|
||||||
|
['tech', 0],
|
||||||
|
['gold', 0],
|
||||||
|
['rice', 0],
|
||||||
|
['gennum', 1],
|
||||||
|
],
|
||||||
|
'in'=>[
|
||||||
|
['type', GameConst::$availableNationType],
|
||||||
|
['level', array_keys(getNationLevelList())]
|
||||||
|
]
|
||||||
|
];
|
||||||
|
|
||||||
|
$v = new Validator($rawAttackerNation);
|
||||||
|
$v->rules($nationCheck);
|
||||||
|
if(!$v->validate()){
|
||||||
|
Json::die([
|
||||||
|
'result'=>false,
|
||||||
|
'reason'=>'[출병국]'.$v->errorStr()
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
|
||||||
|
$v = new Validator($rawDefenderNation);
|
||||||
|
$v->rules($nationCheck);
|
||||||
|
if(!$v->validate()){
|
||||||
|
Json::die([
|
||||||
|
'result'=>false,
|
||||||
|
'reason'=>'[수비국]'.$v->errorStr()
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
|
||||||
|
if($action == 'reorder'){
|
||||||
|
usort($defenderList, function(General $lhs, General $rhs){
|
||||||
|
return -(extractBattleOrder($lhs) <=> extractBattleOrder($rhs));
|
||||||
|
});
|
||||||
|
|
||||||
|
$order = [];
|
||||||
|
foreach($defenderList as $defenderGeneral){
|
||||||
|
$order[] = $defenderGeneral->getID();
|
||||||
|
}
|
||||||
|
|
||||||
|
Json::die([
|
||||||
|
'result'=>true,
|
||||||
|
'reason'=>'success',
|
||||||
|
'order'=>$order
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
|
||||||
|
usort($defenderList, function(General $lhs, General $rhs){
|
||||||
|
return -(extractBattleOrder($lhs) <=> extractBattleOrder($rhs));
|
||||||
|
});
|
||||||
|
|
||||||
|
$rawDefenderList = array_map(function(General $general){
|
||||||
|
return $general->getRaw();
|
||||||
|
}, $defenderList);
|
||||||
unset($defenderList);
|
unset($defenderList);
|
||||||
|
|
||||||
$db = DB::db();
|
$db = DB::db();
|
||||||
$gameStor = KVStorage::getStorage($db, 'game_env');
|
$gameStor = KVStorage::getStorage($db, 'game_env');
|
||||||
$startYear = $gameStor->startyear;
|
$startYear = $gameStor->startyear;
|
||||||
|
|
||||||
function extractRankVar(array $rawVal): Map
|
function extractRankVar(array $rawVal):Map{
|
||||||
{
|
|
||||||
$rankVars = new Map;
|
$rankVars = new Map;
|
||||||
foreach ($rawVal as $rawKey => $rawVal) {
|
foreach($rawVal as $rawKey=>$rawVal){
|
||||||
$key = RankColumn::tryFrom($rawKey);
|
$key = RankColumn::tryFrom($rawKey);
|
||||||
if ($key === null) {
|
if($key === null){
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
$rankVars[$key] = $rawVal;
|
$rankVars[$key] = $rawVal;
|
||||||
@@ -364,104 +336,80 @@ function extractRankVar(array $rawVal): Map
|
|||||||
}
|
}
|
||||||
|
|
||||||
function simulateBattle(
|
function simulateBattle(
|
||||||
$rawAttacker,
|
$rawAttacker, $rawAttackerCity, $rawAttackerNation,
|
||||||
$rawAttackerCity,
|
$rawDefenderList, $rawDefenderCity, $rawDefenderNation,
|
||||||
$rawAttackerNation,
|
$startYear, $year, $month, $warSeed
|
||||||
$rawDefenderList,
|
){
|
||||||
$rawDefenderCity,
|
|
||||||
$rawDefenderNation,
|
|
||||||
$startYear,
|
|
||||||
$year,
|
|
||||||
$month,
|
|
||||||
$warSeed
|
|
||||||
) {
|
|
||||||
|
|
||||||
if (!$warSeed) {
|
if(!$warSeed){
|
||||||
$warSeed = bin2hex(random_bytes(16));
|
$warSeed = bin2hex(random_bytes(16));
|
||||||
}
|
}
|
||||||
|
|
||||||
$warRng = new RandUtil(new LiteHashDRBG($warSeed));
|
$warRng = new RandUtil(new LiteHashDRBG($warSeed));
|
||||||
|
|
||||||
$attackerGeneral = new General($rawAttacker, extractRankVar($rawAttacker), null, $rawAttackerCity, $rawAttackerNation, $year, $month);
|
|
||||||
$attacker = new WarUnitGeneral(
|
$attacker = new WarUnitGeneral(
|
||||||
$warRng,
|
$warRng,
|
||||||
$attackerGeneral,
|
new General($rawAttacker, extractRankVar($rawAttacker), $rawAttackerCity, $rawAttackerNation, $year, $month),
|
||||||
$rawAttackerNation,
|
$rawAttackerNation,
|
||||||
true
|
true
|
||||||
);
|
);
|
||||||
$city = new WarUnitCity($warRng, $rawDefenderCity, $rawDefenderNation, $year, $month, $startYear);
|
$city = new WarUnitCity($warRng, $rawDefenderCity, $rawDefenderNation, $year, $month, $startYear);
|
||||||
|
|
||||||
/** @var WarUnit[] */
|
$iterDefender = new \ArrayIterator($rawDefenderList);
|
||||||
$defenderList = [];
|
|
||||||
|
|
||||||
foreach ($rawDefenderList as $rawDefenderGeneral) {
|
|
||||||
$defenderGeneral = new General($rawDefenderGeneral, extractRankVar($rawDefenderGeneral), null, $rawDefenderCity, $rawAttackerNation, $year, $month, true);
|
|
||||||
|
|
||||||
$defenderList[] = new WarUnitGeneral(
|
|
||||||
$warRng,
|
|
||||||
$defenderGeneral,
|
|
||||||
$rawDefenderNation,
|
|
||||||
false
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
if(count($defenderList) && extractBattleOrder($city, $attacker) > 0){
|
|
||||||
$defenderList[] = $city;
|
|
||||||
}
|
|
||||||
|
|
||||||
usort($defenderList, function (WarUnit $lhs, WarUnit $rhs) use ($attacker) {
|
|
||||||
return - (extractBattleOrder($lhs, $attacker) <=> extractBattleOrder($rhs, $attacker));
|
|
||||||
});
|
|
||||||
|
|
||||||
$iterDefender = new \ArrayIterator($defenderList);
|
|
||||||
$iterDefender->rewind();
|
$iterDefender->rewind();
|
||||||
|
|
||||||
$battleResult = [];
|
$battleResult = [];
|
||||||
|
|
||||||
$attackerRice = $attacker->getGeneral()->getVar('rice');
|
$attackerRice = $rawAttacker['rice'];
|
||||||
$defenderRice = 0;
|
$defenderRice = 0;
|
||||||
|
|
||||||
$getNextDefender = function (?WarUnit $prevDefender, bool $reqNext)
|
$getNextDefender = function(?WarUnit $prevDefender, bool $reqNext)
|
||||||
use ($iterDefender, &$battleResult, &$defenderRice, $attacker): ?WarUnit {
|
use ($warRng, $iterDefender, $rawDefenderCity, $rawDefenderNation, $year, $month, &$battleResult, &$defenderRice) {
|
||||||
if ($prevDefender !== null) {
|
if($prevDefender !== null){
|
||||||
$prevDefender->getLogger()->rollback();
|
$prevDefender->getLogger()->rollback();
|
||||||
$battleResult[] = $prevDefender;
|
$battleResult[] = $prevDefender;
|
||||||
if ($prevDefender instanceof WarUnitGeneral) {
|
if($prevDefender instanceof WarUnitGeneral){
|
||||||
$defenderRice -= $prevDefender->getVar('rice');
|
$defenderRice -= $prevDefender->getVar('rice');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!$reqNext) {
|
if(!$reqNext){
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!$iterDefender->valid()) {
|
if(!$iterDefender->valid()){
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
/** @var WarUnit */
|
$defenderObj = new General($iterDefender->current(), extractRankVar($iterDefender->current()), $rawDefenderCity, $rawDefenderNation, $year, $month);
|
||||||
$defender = $iterDefender->current();
|
if(extractBattleOrder($defenderObj) <= 0){
|
||||||
|
|
||||||
if (extractBattleOrder($defender, $attacker) <= 0) {
|
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
if($defender instanceof WarUnitGeneral){
|
$defenderRice += $defenderObj->getVar('rice');
|
||||||
$defenderRice += $defender->getVar('rice');
|
|
||||||
}
|
|
||||||
|
|
||||||
|
$retVal = new WarUnitGeneral(
|
||||||
|
$warRng,
|
||||||
|
$defenderObj,
|
||||||
|
$rawDefenderNation,
|
||||||
|
false
|
||||||
|
);
|
||||||
$iterDefender->next();
|
$iterDefender->next();
|
||||||
return $defender;
|
return $retVal;
|
||||||
};
|
};
|
||||||
|
|
||||||
$conquerCity = processWar_NG($warSeed, $attacker, $getNextDefender, $city);
|
$conquerCity = processWar_NG($warSeed, $attacker, $getNextDefender, $city, $year - $startYear);
|
||||||
|
|
||||||
|
$rawDefenderCity = $city->getRaw();
|
||||||
|
$updateAttackerNation = [];
|
||||||
|
$updateDefenderNation = [];
|
||||||
|
|
||||||
$attackerRice -= $attacker->getVar('rice');
|
$attackerRice -= $attacker->getVar('rice');
|
||||||
|
|
||||||
if ($city->getPhase() > 0) {
|
if($city->getPhase() > 0){
|
||||||
$rice = $city->getKilled() / 100 * 0.8;
|
$rice = $city->getKilled() / 100 * 0.8;
|
||||||
$rice *= $city->getCrewType()->rice;
|
$rice *= $city->getCrewType()->rice;
|
||||||
$rice *= getTechCost($city->getRawNation()['tech']);
|
$rice *= getTechCost($rawDefenderNation['tech']);
|
||||||
$rice *= $city->getCityTrainAtmos() / 100 - 0.2;
|
$rice *= $city->getCityTrainAtmos() / 100 - 0.2;
|
||||||
Util::setRound($rice);
|
Util::setRound($rice);
|
||||||
|
|
||||||
@@ -469,8 +417,8 @@ function simulateBattle(
|
|||||||
}
|
}
|
||||||
|
|
||||||
$totalDead = $attacker->getKilled() + $attacker->getDead();
|
$totalDead = $attacker->getKilled() + $attacker->getDead();
|
||||||
//$attackerCityDead = $totalDead * 0.4;
|
$attackerCityDead = $totalDead * 0.4;
|
||||||
//$defenderCityDead = $totalDead * 0.6;
|
$defenderCityDead = $totalDead * 0.6;
|
||||||
|
|
||||||
return [$attacker, $city, $battleResult, $conquerCity, $attackerRice, $defenderRice];
|
return [$attacker, $city, $battleResult, $conquerCity, $attackerRice, $defenderRice];
|
||||||
}
|
}
|
||||||
@@ -496,26 +444,18 @@ $avgWar = 0;
|
|||||||
$attackerActivatedSkills = [];
|
$attackerActivatedSkills = [];
|
||||||
$defendersActivatedSkills = [];
|
$defendersActivatedSkills = [];
|
||||||
|
|
||||||
|
if($warSeed){
|
||||||
|
$repeatCnt = 1;
|
||||||
|
}
|
||||||
|
|
||||||
foreach (Util::range($repeatCnt) as $repeatIdx) {
|
foreach(Util::range($repeatCnt) as $repeatIdx){
|
||||||
if($repeatIdx > 0){
|
|
||||||
$warSeed = bin2hex(random_bytes(16));
|
|
||||||
}
|
|
||||||
|
|
||||||
/** @var WarUnit $attacker */
|
/** @var WarUnit $attacker */
|
||||||
[$attacker, $city, $battleResult, $conquerCity, $attackerRice, $defenderRice] = simulateBattle(
|
[$attacker, $city, $battleResult, $conquerCity, $attackerRice, $defenderRice] = simulateBattle(
|
||||||
$rawAttacker,
|
$rawAttacker, $rawAttackerCity, $rawAttackerNation,
|
||||||
$rawAttackerCity,
|
$rawDefenderList, $rawDefenderCity, $rawDefenderNation,
|
||||||
$rawAttackerNation,
|
$startYear, $year, $month, $warSeed
|
||||||
$rawDefenderList,
|
|
||||||
$rawDefenderCity,
|
|
||||||
$rawDefenderNation,
|
|
||||||
$startYear,
|
|
||||||
$year,
|
|
||||||
$month,
|
|
||||||
$warSeed
|
|
||||||
);
|
);
|
||||||
$lastWarLog = Util::mapWithKey(function ($key, $values) {
|
$lastWarLog = Util::mapWithKey(function($key, $values){
|
||||||
return ConvertLog(join('<br>', $values));
|
return ConvertLog(join('<br>', $values));
|
||||||
}, $attacker->getLogger()->rollback());
|
}, $attacker->getLogger()->rollback());
|
||||||
|
|
||||||
@@ -538,45 +478,48 @@ foreach (Util::range($repeatCnt) as $repeatIdx) {
|
|||||||
|
|
||||||
$avgWar += count($battleResult) / $repeatCnt;
|
$avgWar += count($battleResult) / $repeatCnt;
|
||||||
|
|
||||||
foreach ($attacker->getActivatedSkillLog() as $skillName => $skillCnt) {
|
foreach($attacker->getActivatedSkillLog() as $skillName => $skillCnt){
|
||||||
if (!key_exists($skillName, $attackerActivatedSkills)) {
|
if(!key_exists($skillName, $attackerActivatedSkills)){
|
||||||
$attackerActivatedSkills[$skillName] = $skillCnt / $repeatCnt;
|
$attackerActivatedSkills[$skillName] = $skillCnt / $repeatCnt;
|
||||||
} else {
|
}
|
||||||
|
else{
|
||||||
$attackerActivatedSkills[$skillName] += $skillCnt / $repeatCnt;
|
$attackerActivatedSkills[$skillName] += $skillCnt / $repeatCnt;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
foreach ($battleResult as $idx => $defender) {
|
foreach($battleResult as $idx=>$defender){
|
||||||
while ($idx >= count($defendersActivatedSkills)) {
|
while($idx >= count($defendersActivatedSkills)){
|
||||||
$defendersActivatedSkills[] = [];
|
$defendersActivatedSkills[] = [];
|
||||||
}
|
}
|
||||||
|
|
||||||
$activatedSkills = &$defendersActivatedSkills[$idx];
|
$activatedSkills = &$defendersActivatedSkills[$idx];
|
||||||
foreach ($defender->getActivatedSkillLog() as $skillName => $skillCnt) {
|
foreach($defender->getActivatedSkillLog() as $skillName => $skillCnt){
|
||||||
if (!key_exists($skillName, $activatedSkills)) {
|
if(!key_exists($skillName, $activatedSkills)){
|
||||||
$activatedSkills[$skillName] = $skillCnt / $repeatCnt;
|
$activatedSkills[$skillName] = $skillCnt / $repeatCnt;
|
||||||
} else {
|
}
|
||||||
|
else{
|
||||||
$activatedSkills[$skillName] += $skillCnt / $repeatCnt;
|
$activatedSkills[$skillName] += $skillCnt / $repeatCnt;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Json::die([
|
Json::die([
|
||||||
'result' => true,
|
'result'=>true,
|
||||||
'datetime' => $rawAttacker['turntime'],
|
'datetime'=>$rawAttacker['turntime'],
|
||||||
'reason' => 'success',
|
'reason'=>'success',
|
||||||
'lastWarLog' => $lastWarLog,
|
'lastWarLog'=>$lastWarLog,
|
||||||
'avgWar' => $avgWar,
|
'avgWar'=>$avgWar,
|
||||||
'phase' => $avgPhase,
|
'phase'=>$avgPhase,
|
||||||
'killed' => $attackerKilled,
|
'killed'=>$attackerKilled,
|
||||||
'maxKilled' => $attackerMaxKilled,
|
'maxKilled'=>$attackerMaxKilled,
|
||||||
'minKilled' => $attackerMinKilled,
|
'minKilled'=>$attackerMinKilled,
|
||||||
'dead' => $attackerDead,
|
'dead'=>$attackerDead,
|
||||||
'maxDead' => $attackerMaxDead,
|
'maxDead'=>$attackerMaxDead,
|
||||||
'minDead' => $attackerMinDead,
|
'minDead'=>$attackerMinDead,
|
||||||
'attackerRice' => $attackerAvgRice,
|
'attackerRice'=>$attackerAvgRice,
|
||||||
'defenderRice' => $defenderAvgRice,
|
'defenderRice'=>$defenderAvgRice,
|
||||||
'attackerSkills' => $attackerActivatedSkills,
|
'attackerSkills'=>$attackerActivatedSkills,
|
||||||
'defendersSkills' => $defendersActivatedSkills,
|
'defendersSkills'=>$defendersActivatedSkills,
|
||||||
]);
|
]);
|
||||||
|
|||||||
@@ -66,7 +66,7 @@ if(!$ownerInfo){
|
|||||||
$info = Json::decode($info);
|
$info = Json::decode($info);
|
||||||
|
|
||||||
|
|
||||||
$generalObj = General::createObjFromDB($generalID);
|
$generalObj = General::createGeneralObjFromDB($generalID);
|
||||||
$oldGeneralName = $generalObj->getName();
|
$oldGeneralName = $generalObj->getName();
|
||||||
$db->update('select_pool', [
|
$db->update('select_pool', [
|
||||||
'general_id'=>-$generalID,
|
'general_id'=>-$generalID,
|
||||||
|
|||||||
+53
-30
@@ -3,7 +3,6 @@
|
|||||||
namespace sammo;
|
namespace sammo;
|
||||||
|
|
||||||
use sammo\DTO\VoteInfo;
|
use sammo\DTO\VoteInfo;
|
||||||
use sammo\Enums\GeneralQueryMode;
|
|
||||||
|
|
||||||
include "lib.php";
|
include "lib.php";
|
||||||
include "func.php";
|
include "func.php";
|
||||||
@@ -30,8 +29,7 @@ if (!$session->isGameLoggedIn()) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
$me = $db->queryFirstRow(
|
$me = $db->queryFirstRow(
|
||||||
'SELECT no,refresh_score,turntime,newmsg,newvote,`officer_level` FROM `general`
|
'SELECT no,con,turntime,newmsg,newvote,`officer_level` from general where owner = %i',
|
||||||
LEFT JOIN general_access_log AS l ON `general`.no = l.general_id WHERE owner = %i',
|
|
||||||
$userID
|
$userID
|
||||||
);
|
);
|
||||||
|
|
||||||
@@ -53,13 +51,13 @@ if ($me['newmsg'] == 1 || $me['newvote'] == 1) {
|
|||||||
|
|
||||||
$plock = boolval($db->queryFirstField('SELECT plock FROM plock WHERE `type`="GAME" LIMIT 1'));
|
$plock = boolval($db->queryFirstField('SELECT plock FROM plock WHERE `type`="GAME" LIMIT 1'));
|
||||||
|
|
||||||
$limitState = checkLimit($me['refresh_score']);
|
$con = checkLimit($me['con']);
|
||||||
if ($limitState >= 2) {
|
if ($con >= 2) {
|
||||||
printLimitMsg($me['turntime']);
|
printLimitMsg($me['turntime']);
|
||||||
exit();
|
exit();
|
||||||
}
|
}
|
||||||
|
|
||||||
$generalObj = General::createObjFromDB($me['no'], null, GeneralQueryMode::FullWithAccessLog);
|
$generalObj = General::createGeneralObjFromDB($me['no']);
|
||||||
$generalObj->setRawCity($db->queryFirstRow('SELECT * FROM city WHERE city = %i', $generalObj->getCityID()));
|
$generalObj->setRawCity($db->queryFirstRow('SELECT * FROM city WHERE city = %i', $generalObj->getCityID()));
|
||||||
$scenario = $gameStor->scenario_text;
|
$scenario = $gameStor->scenario_text;
|
||||||
|
|
||||||
@@ -182,44 +180,44 @@ if ($lastVoteID) {
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="row center gx-0">
|
<div class="row center gx-0">
|
||||||
<div class="s-border-t col py-2 col-8 col-lg-4" style="color:<?= $color ?>;">
|
<div class="s-border-t col py-2 col-8 col-md-4" style="color:<?= $color ?>;">
|
||||||
<?= $scenario ?>
|
<?= $scenario ?>
|
||||||
</div>
|
</div>
|
||||||
<div class="s-border-t col py-2 col-4 col-lg-2" style="color:<?= $color ?>;">
|
<div class="s-border-t col py-2 col-4 col-md-2" style="color:<?= $color ?>;">
|
||||||
NPC 수, 상성 : <?= $extend ?>,<?= $fiction ?>
|
NPC 수, 상성 : <?= $extend ?>,<?= $fiction ?>
|
||||||
</div>
|
</div>
|
||||||
<div class="s-border-t col py-2 col-4 col-lg-2" style="color:<?= $color ?>;">
|
<div class="s-border-t col py-2 col-4 col-md-2" style="color:<?= $color ?>;">
|
||||||
NPC선택 : <?= $npcmode ?>
|
NPC선택 : <?= $npcmode ?>
|
||||||
</div>
|
</div>
|
||||||
<div class="s-border-t col py-2 col-4 col-lg-2" style="color:<?= $color ?>;">
|
<div class="s-border-t col py-2 col-4 col-md-2" style="color:<?= $color ?>;">
|
||||||
토너먼트 : <?= getTournamentTermText($gameStor->turnterm) ?>
|
토너먼트 : <?= getTournamentTermText($gameStor->turnterm) ?>
|
||||||
</div>
|
</div>
|
||||||
<div class="s-border-t col py-2 col-4 col-lg-2" style="color:<?= $color ?>;">
|
<div class="s-border-t col py-2 col-4 col-md-2" style="color:<?= $color ?>;">
|
||||||
기타 설정: <?= $otherTextInfo ?>
|
기타 설정: <?= $otherTextInfo ?>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="s-border-t col py-2 col-8 col-lg-4"><?= info(2) ?></div>
|
<div class="s-border-t col py-2 col-8 col-md-4"><?= info(2) ?></div>
|
||||||
<div class="s-border-t col py-2 col-4 col-lg-2">전체 접속자 수 : <?= $gameStor->online_user_cnt ?> 명</div>
|
<div class="s-border-t col py-2 col-4 col-md-2">전체 접속자 수 : <?= $gameStor->online_user_cnt ?> 명</div>
|
||||||
<div class="s-border-t col py-2 col-4 col-lg-2">턴당 갱신횟수 : <?= $gameStor->refreshLimit ?>회</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-lg-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-lg-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-lg-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>
|
||||||
</div>
|
</div>
|
||||||
<div class="s-border-t py-2 col col-6 col-lg-2">
|
<div class="s-border-t py-2 col col-6 col-md-2">
|
||||||
<?php if ($auctionCount > 0) : ?>
|
<?php if ($auctionCount > 0) : ?>
|
||||||
<span style='color:cyan'><?= $auctionCount ?>건</span> 거래 진행중
|
<span style='color:cyan'><?= $auctionCount ?>건</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-lg-4 vote-cell">
|
<div class="s-border-t py-2 col col-6 col-md-4 vote-cell">
|
||||||
<?php
|
<?php
|
||||||
?>
|
?>
|
||||||
<?php if ($lastVote === null) : ?>
|
<?php if ($lastVote === null) : ?>
|
||||||
@@ -285,6 +283,19 @@ if ($lastVoteID) {
|
|||||||
<div id="general-position"><?php generalInfo($generalObj); ?></div>
|
<div id="general-position"><?php generalInfo($generalObj); ?></div>
|
||||||
<div id="generalCommandButton" class="row gx-0">
|
<div id="generalCommandButton" class="row gx-0">
|
||||||
<div class="buttonPlate bg2">
|
<div class="buttonPlate bg2">
|
||||||
|
<?= commandButton([
|
||||||
|
'splitBtnBegin' => '<div class="btn-group">',
|
||||||
|
'splitBtnEnd' => '</div>',
|
||||||
|
'splitZoneSign' => '<button type="button" class="btn btn-sammo-nation dropdown-toggle dropdown-toggle-split" data-bs-toggle="dropdown" aria-expanded="false"><span class="visually-hidden">Toggle Dropdown</span></button>',
|
||||||
|
'splitZoneBegin' => '<ul class="dropdown-menu dropdown-menu-end">',
|
||||||
|
'splitZoneEnd' => '</ul>',
|
||||||
|
'splitSubBtnBegin' => '<li>',
|
||||||
|
'splitSubBtnEnd' => '</li>',
|
||||||
|
'btnClass' => 'btn btn-sammo-nation',
|
||||||
|
'btnSplitClass' => 'dropdown-item',
|
||||||
|
'isTournamentApplicationOpen' => $isTournamentApplicationOpen,
|
||||||
|
'isBettingActive' => $isBettingActive
|
||||||
|
])
|
||||||
?></div>
|
?></div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -299,11 +310,11 @@ if ($lastVoteID) {
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="row gx-0">
|
<div class="row gx-0">
|
||||||
<div class="col-lg-6" id="general_public_record-position">
|
<div class="col-md-6" id="general_public_record-position">
|
||||||
<div class="bg1 center s-border-tb"><b>장수 동향</b></div>
|
<div class="bg1 center s-border-tb"><b>장수 동향</b></div>
|
||||||
<div id="general_public_record" style="text-align:left;"><?= formatHistoryToHTML(getGlobalActionLogRecent(15)) ?></div>
|
<div id="general_public_record" style="text-align:left;"><?= formatHistoryToHTML(getGlobalActionLogRecent(15)) ?></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="col-lg-6" id="general_log-position">
|
<div class="col-md-6" id="general_log-position">
|
||||||
<div class="bg1 center s-border-tb"><b>개인 기록</b></div>
|
<div class="bg1 center s-border-tb"><b>개인 기록</b></div>
|
||||||
<div id="general_log" style="text-align:left;"><?= formatHistoryToHTML(getGeneralActionLogRecent($me['no'], 15)) ?></div>
|
<div id="general_log" style="text-align:left;"><?= formatHistoryToHTML(getGeneralActionLogRecent($me['no'], 15)) ?></div>
|
||||||
</div>
|
</div>
|
||||||
@@ -317,34 +328,34 @@ if ($lastVoteID) {
|
|||||||
|
|
||||||
<div id="message_board" class="row gx-0">
|
<div id="message_board" class="row gx-0">
|
||||||
<div class="message_input_form bg0 gx-0 row">
|
<div class="message_input_form bg0 gx-0 row">
|
||||||
<div id="mailbox_list-col" class="col-6 col-lg-2 d-grid">
|
<div id="mailbox_list-col" class="col-6 col-md-2 d-grid">
|
||||||
<select id="mailbox_list" size="1" class="form-control bg-dark text-white">
|
<select id="mailbox_list" size="1" class="form-control bg-dark text-white">
|
||||||
</select>
|
</select>
|
||||||
</div>
|
</div>
|
||||||
<div id="msg_input-col" class="col-12 col-lg-8 d-grid">
|
<div id="msg_input-col" class="col-12 col-md-8 d-grid">
|
||||||
<input type="text" id="msg_input" maxlength="99" class="form-control">
|
<input type="text" id="msg_input" maxlength="99" class="form-control">
|
||||||
</div>
|
</div>
|
||||||
<div id="msg_submit-col" class="col-6 col-lg-2 d-grid"><button id="msg_submit" class="btn btn-primary">서신전달&갱신</button></div>
|
<div id="msg_submit-col" class="col-6 col-md-2 d-grid"><button id="msg_submit" class="btn btn-primary">서신전달&갱신</button></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="col-lg-6 board_side bg0"><a id="public_talk_position"></a>
|
<div class="col-md-6 board_side bg0"><a id="public_talk_position"></a>
|
||||||
<div class="board_header bg0">전체 메시지(최고99자)</div>
|
<div class="board_header bg0">전체 메시지(최고99자)</div>
|
||||||
<section class="public_message">
|
<section class="public_message">
|
||||||
<div class="d-grid"><button type="button" class="load_old_message btn btn-secondary" data-msg_type="public">이전 메시지 불러오기</button></div>
|
<div class="d-grid"><button type="button" class="load_old_message btn btn-secondary" data-msg_type="public">이전 메시지 불러오기</button></div>
|
||||||
</section>
|
</section>
|
||||||
</div>
|
</div>
|
||||||
<div class="col-lg-6 board_side bg0"><a id="national_talk_position"></a>
|
<div class="col-md-6 board_side bg0"><a id="national_talk_position"></a>
|
||||||
<div class="board_header bg0">국가 메시지(최고99자)</div>
|
<div class="board_header bg0">국가 메시지(최고99자)</div>
|
||||||
<section class="national_message">
|
<section class="national_message">
|
||||||
<div class="d-grid"><button type="button" class="load_old_message btn btn-secondary" data-msg_type="national">이전 메시지 불러오기</button></div>
|
<div class="d-grid"><button type="button" class="load_old_message btn btn-secondary" data-msg_type="national">이전 메시지 불러오기</button></div>
|
||||||
</section>
|
</section>
|
||||||
</div>
|
</div>
|
||||||
<div class="col-lg-6 board_side bg0"><a id="private_talk_position"></a>
|
<div class="col-md-6 board_side bg0"><a id="private_talk_position"></a>
|
||||||
<div class="board_header bg0">개인 메시지(최고99자)</div>
|
<div class="board_header bg0">개인 메시지(최고99자)</div>
|
||||||
<section class="private_message">
|
<section class="private_message">
|
||||||
<div class="d-grid"><button type="button" class="load_old_message btn btn-secondary" data-msg_type="private">이전 메시지 불러오기</button></div>
|
<div class="d-grid"><button type="button" class="load_old_message btn btn-secondary" data-msg_type="private">이전 메시지 불러오기</button></div>
|
||||||
</section>
|
</section>
|
||||||
</div>
|
</div>
|
||||||
<div class="col-lg-6 board_side bg0"><a id="diplomacy_talk_position"></a>
|
<div class="col-md-6 board_side bg0"><a id="diplomacy_talk_position"></a>
|
||||||
<div class="board_header bg0">외교 메시지(최고99자)</div>
|
<div class="board_header bg0">외교 메시지(최고99자)</div>
|
||||||
<section class="diplomacy_message">
|
<section class="diplomacy_message">
|
||||||
<div class="d-grid"><button type="button" class="load_old_message btn btn-secondary" data-msg_type="diplomacy">이전 메시지 불러오기</button></div>
|
<div class="d-grid"><button type="button" class="load_old_message btn btn-secondary" data-msg_type="diplomacy">이전 메시지 불러오기</button></div>
|
||||||
@@ -356,7 +367,7 @@ if ($lastVoteID) {
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<?php
|
<?php
|
||||||
if ($limitState == 1) {
|
if ($con == 1) {
|
||||||
MessageBox("접속제한이 얼마 남지 않았습니다!");
|
MessageBox("접속제한이 얼마 남지 않았습니다!");
|
||||||
}
|
}
|
||||||
if ($me['newmsg'] == 1) {
|
if ($me['newmsg'] == 1) {
|
||||||
@@ -368,7 +379,7 @@ if ($lastVoteID) {
|
|||||||
}
|
}
|
||||||
?>
|
?>
|
||||||
</div>
|
</div>
|
||||||
<nav class="navbar navbar-expand fixed-bottom navbar-dark bg-dark d-sm-block d-lg-none p-0" id="navbar500">
|
<nav class="navbar navbar-expand fixed-bottom navbar-dark bg-dark d-sm-block d-md-none p-0" id="navbar500">
|
||||||
<div class="container-fluid px-0">
|
<div class="container-fluid px-0">
|
||||||
<div class="collapse navbar-collapse">
|
<div class="collapse navbar-collapse">
|
||||||
<ul class="navbar-nav me-auto mx-auto">
|
<ul class="navbar-nav me-auto mx-auto">
|
||||||
@@ -385,6 +396,18 @@ if ($lastVoteID) {
|
|||||||
국가 메뉴
|
국가 메뉴
|
||||||
</div>
|
</div>
|
||||||
<ul class="dropdown-menu" aria-labelledby="navbarNation" id="navbarNationItems">
|
<ul class="dropdown-menu" aria-labelledby="navbarNation" id="navbarNationItems">
|
||||||
|
<?= commandButton([
|
||||||
|
'btnBegin' => '<li>',
|
||||||
|
'btnEnd' => '</li>',
|
||||||
|
'splitMainBegin' => '<div class="d-none">',
|
||||||
|
'splitMainEnd' => '</div>',
|
||||||
|
'splitSubBtnBegin' => '<li>',
|
||||||
|
'splitSubBtnEnd' => '</li>',
|
||||||
|
'btnClass' => 'dropdown-item',
|
||||||
|
'btnSplitClass' => 'dropdown-item',
|
||||||
|
'isTournamentApplicationOpen' => $isTournamentApplicationOpen,
|
||||||
|
'isBettingActive' => $isBettingActive
|
||||||
|
]) ?>
|
||||||
</ul>
|
</ul>
|
||||||
</li>
|
</li>
|
||||||
<li class="nav-item dropup">
|
<li class="nav-item dropup">
|
||||||
|
|||||||
+38
-90
@@ -3,7 +3,6 @@
|
|||||||
namespace sammo;
|
namespace sammo;
|
||||||
|
|
||||||
use sammo\Enums\EventTarget;
|
use sammo\Enums\EventTarget;
|
||||||
use sammo\Enums\GeneralQueryMode;
|
|
||||||
|
|
||||||
function processWar(string $warSeed, General $attackerGeneral, array $rawAttackerNation, array $rawDefenderCity)
|
function processWar(string $warSeed, General $attackerGeneral, array $rawAttackerNation, array $rawDefenderCity)
|
||||||
{
|
{
|
||||||
@@ -37,33 +36,17 @@ function processWar(string $warSeed, General $attackerGeneral, array $rawAttacke
|
|||||||
|
|
||||||
$city = new WarUnitCity($rng, $rawDefenderCity, $rawDefenderNation, $year, $month, $startYear);
|
$city = new WarUnitCity($rng, $rawDefenderCity, $rawDefenderNation, $year, $month, $startYear);
|
||||||
|
|
||||||
$defenderCityGeneralIDList = $db->queryFirstColumn('SELECT no FROM general WHERE nation=%i AND city=%i AND nation!=0', $city->getVar('nation'), $city->getVar('city'));
|
$defenderIDList = $db->queryFirstColumn('SELECT no FROM general WHERE nation=%i AND city=%i AND nation!=0 and crew > 0 and rice>(crew/100) and train>=defence_train and atmos>=defence_train', $city->getVar('nation'), $city->getVar('city'));
|
||||||
$defenderCityGeneralList = General::createObjListFromDB($defenderCityGeneralIDList, null);
|
$defenderList = General::createGeneralObjListFromDB($defenderIDList, null, 2);
|
||||||
|
|
||||||
/** @var WarUnit[] */
|
usort($defenderList, function (General $lhs, General $rhs) {
|
||||||
$defenderList = [];
|
return - (extractBattleOrder($lhs) <=> extractBattleOrder($rhs));
|
||||||
foreach($defenderCityGeneralList as $defenderGeneral){
|
|
||||||
$defenderGeneral->setRawCity($rawDefenderCity);
|
|
||||||
$defenderCandidate = new WarUnitGeneral($rng, $defenderGeneral, $rawDefenderNation, false);
|
|
||||||
if(extractBattleOrder($defenderCandidate, $attacker) <= 0){
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
$defenderList[] = $defenderCandidate;
|
|
||||||
}
|
|
||||||
|
|
||||||
if(count($defenderList) && extractBattleOrder($city, $attacker) > 0){
|
|
||||||
$defenderList[] = $city;
|
|
||||||
}
|
|
||||||
|
|
||||||
usort($defenderList, function (WarUnit $lhs, WarUnit $rhs) use ($attacker) {
|
|
||||||
return - (extractBattleOrder($lhs, $attacker) <=> extractBattleOrder($rhs, $attacker));
|
|
||||||
});
|
});
|
||||||
|
|
||||||
$iterDefender = new \ArrayIterator($defenderList);
|
$iterDefender = new \ArrayIterator($defenderList);
|
||||||
$iterDefender->rewind();
|
$iterDefender->rewind();
|
||||||
|
|
||||||
$getNextDefender = function (?WarUnit $prevDefender, bool $reqNext) use ($iterDefender, $db, $attacker) {
|
$getNextDefender = function (?WarUnit $prevDefender, bool $reqNext) use ($rng, $iterDefender, $rawDefenderNation, $rawDefenderCity, $db) {
|
||||||
if ($prevDefender !== null) {
|
if ($prevDefender !== null) {
|
||||||
$prevDefender->applyDB($db);
|
$prevDefender->applyDB($db);
|
||||||
}
|
}
|
||||||
@@ -76,16 +59,24 @@ function processWar(string $warSeed, General $attackerGeneral, array $rawAttacke
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
/** @var WarUnit */
|
|
||||||
$nextDefender = $iterDefender->current();
|
$nextDefender = $iterDefender->current();
|
||||||
if (extractBattleOrder($nextDefender, $attacker) <= 0) {
|
$nextDefender->setRawCity($rawDefenderCity);
|
||||||
|
if (extractBattleOrder($nextDefender) <= 0) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
$retVal = new WarUnitGeneral(
|
||||||
|
$rng,
|
||||||
|
$nextDefender,
|
||||||
|
$rawDefenderNation,
|
||||||
|
false
|
||||||
|
);
|
||||||
$iterDefender->next();
|
$iterDefender->next();
|
||||||
return $nextDefender;
|
return $retVal;
|
||||||
};
|
};
|
||||||
|
|
||||||
$conquerCity = processWar_NG($warSeed, $attacker, $getNextDefender, $city);
|
$conquerCity = processWar_NG($warSeed, $attacker, $getNextDefender, $city, $year - $startYear);
|
||||||
|
|
||||||
$attacker->applyDB($db);
|
$attacker->applyDB($db);
|
||||||
|
|
||||||
@@ -186,20 +177,11 @@ function processWar(string $warSeed, General $attackerGeneral, array $rawAttacke
|
|||||||
'year' => $year,
|
'year' => $year,
|
||||||
'month' => $month,
|
'month' => $month,
|
||||||
'join_mode' => $joinMode,
|
'join_mode' => $joinMode,
|
||||||
], $attacker->getGeneral(), $city->getRaw(), $defenderCityGeneralList);
|
], $attacker->getGeneral(), $city->getRaw());
|
||||||
}
|
}
|
||||||
|
|
||||||
function extractBattleOrder(WarUnit $defender, WarUnit $attacker)
|
function extractBattleOrder(General $general)
|
||||||
{
|
{
|
||||||
if($defender instanceof WarUnitCity){
|
|
||||||
if(!($attacker instanceof WarUnitGeneral)){
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
$attackerGeneral = $attacker->getGeneral();
|
|
||||||
return $attackerGeneral->onCalcOpposeStat($defender->getGeneral(), 'cityBattleOrder', -1);
|
|
||||||
}
|
|
||||||
|
|
||||||
$general = $defender->getGeneral();
|
|
||||||
if ($general->getVar('crew') == 0) {
|
if ($general->getVar('crew') == 0) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@@ -222,10 +204,7 @@ function extractBattleOrder(WarUnit $defender, WarUnit $attacker)
|
|||||||
$totalStat = ($realStat + $fullStat) / 2;
|
$totalStat = ($realStat + $fullStat) / 2;
|
||||||
|
|
||||||
$totalCrew = $general->getVar('crew') / 1000000 * (($general->getVar('train') * $general->getVar('atmos')) ** 1.5);
|
$totalCrew = $general->getVar('crew') / 1000000 * (($general->getVar('train') * $general->getVar('atmos')) ** 1.5);
|
||||||
$value = $totalStat + $totalCrew / 100;
|
return $totalStat + $totalCrew / 100;
|
||||||
$value = $general->onCalcStat($general, 'battleOrder', $value, ['attacker' => $attacker->getGeneral()]);
|
|
||||||
$value = $attacker->getGeneral()->onCalcOpposeStat($general, 'battleOrder', $value, ['attacker' => $attacker->getGeneral()]);
|
|
||||||
return $value;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function processWar_NG(
|
function processWar_NG(
|
||||||
@@ -233,6 +212,7 @@ function processWar_NG(
|
|||||||
WarUnitGeneral $attacker,
|
WarUnitGeneral $attacker,
|
||||||
callable $getNextDefender,
|
callable $getNextDefender,
|
||||||
WarUnitCity $city,
|
WarUnitCity $city,
|
||||||
|
int $relYear
|
||||||
): bool {
|
): bool {
|
||||||
$templates = new \League\Plates\Engine(__DIR__ . '/templates');
|
$templates = new \League\Plates\Engine(__DIR__ . '/templates');
|
||||||
|
|
||||||
@@ -245,7 +225,6 @@ function processWar_NG(
|
|||||||
$attackerNationUpdate = [];
|
$attackerNationUpdate = [];
|
||||||
$defenderNationUpdate = [];
|
$defenderNationUpdate = [];
|
||||||
|
|
||||||
/** @var WarUnit */
|
|
||||||
$defender = ($getNextDefender)(null, true);
|
$defender = ($getNextDefender)(null, true);
|
||||||
$conquerCity = false;
|
$conquerCity = false;
|
||||||
|
|
||||||
@@ -261,7 +240,6 @@ function processWar_NG(
|
|||||||
$logWritten = false;
|
$logWritten = false;
|
||||||
if ($defender === null) {
|
if ($defender === null) {
|
||||||
$defender = $city;
|
$defender = $city;
|
||||||
$defender->setSiege();
|
|
||||||
|
|
||||||
if ($city->getNationVar('rice') <= 0 && $city->getVar('supply')) {
|
if ($city->getNationVar('rice') <= 0 && $city->getVar('supply')) {
|
||||||
//병량 패퇴
|
//병량 패퇴
|
||||||
@@ -428,28 +406,21 @@ function processWar_NG(
|
|||||||
$attacker->logBattleResult();
|
$attacker->logBattleResult();
|
||||||
$defender->logBattleResult();
|
$defender->logBattleResult();
|
||||||
|
|
||||||
if (!($defender instanceof WarUnitCity) || $defender->isSiege()){
|
$attacker->addWin();
|
||||||
$attacker->addWin();
|
$defender->addLose();
|
||||||
$defender->addLose();
|
|
||||||
|
|
||||||
$attacker->tryWound();
|
$attacker->tryWound();
|
||||||
$defender->tryWound();
|
$defender->tryWound();
|
||||||
|
|
||||||
if ($defender === $city) {
|
if ($defender === $city) {
|
||||||
$attacker->addLevelExp(1000);
|
$attacker->addLevelExp(1000);
|
||||||
$conquerCity = true;
|
$conquerCity = true;
|
||||||
break;
|
break;
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
$josaYi = JosaUtil::pick($defender->getCrewTypeName(), '이');
|
$josaYi = JosaUtil::pick($defender->getCrewTypeName(), '이');
|
||||||
|
|
||||||
if ($defender instanceof WarUnitCity && !$defender->isSiege()){
|
if ($noRice) {
|
||||||
//실제 공성을 위해 다시 초기화
|
|
||||||
$defender->setOppose(null);
|
|
||||||
}
|
|
||||||
else if ($noRice) {
|
|
||||||
$logger->pushGlobalActionLog("<Y>{$defender->getName()}</>의 {$defender->getCrewTypeName()}{$josaYi} 패퇴했습니다.");
|
$logger->pushGlobalActionLog("<Y>{$defender->getName()}</>의 {$defender->getCrewTypeName()}{$josaYi} 패퇴했습니다.");
|
||||||
$attacker->getLogger()->pushGeneralActionLog("<Y>{$defender->getName()}</>의 {$defender->getCrewTypeName()}{$josaYi} 패퇴했습니다.", ActionLogger::PLAIN);
|
$attacker->getLogger()->pushGeneralActionLog("<Y>{$defender->getName()}</>의 {$defender->getCrewTypeName()}{$josaYi} 패퇴했습니다.", ActionLogger::PLAIN);
|
||||||
$defender->getLogger()->pushGeneralActionLog("군량 부족으로 패퇴합니다.", ActionLogger::PLAIN);
|
$defender->getLogger()->pushGeneralActionLog("군량 부족으로 패퇴합니다.", ActionLogger::PLAIN);
|
||||||
@@ -484,18 +455,12 @@ function processWar_NG(
|
|||||||
$attacker->finishBattle();
|
$attacker->finishBattle();
|
||||||
$defender->finishBattle();
|
$defender->finishBattle();
|
||||||
|
|
||||||
if($city->getDead() || $defender instanceof WarUnitCity){
|
if ($defender instanceof WarUnitCity) {
|
||||||
if($city !== $defender){
|
$newConflict = $defender->addConflict();
|
||||||
$city->setOppose($attacker);
|
|
||||||
$city->setSiege();
|
|
||||||
$city->finishBattle();
|
|
||||||
}
|
|
||||||
|
|
||||||
$newConflict = $city->addConflict();
|
|
||||||
if ($newConflict) {
|
if ($newConflict) {
|
||||||
$nationName = $attacker->getNationVar('name');
|
$nationName = $attacker->getNationVar('name');
|
||||||
$josaYi = JosaUtil::pick($nationName, '이');
|
$josaYi = JosaUtil::pick($nationName, '이');
|
||||||
$logger->pushGlobalHistoryLog("<M><b>【분쟁】</b></><D><b>{$nationName}</b></>{$josaYi} <G><b>{$city->getName()}</b></> 공략에 가담하여 분쟁이 발생하고 있습니다.");
|
$logger->pushGlobalHistoryLog("<M><b>【분쟁】</b></><D><b>{$nationName}</b></>{$josaYi} <G><b>{$defender->getName()}</b></> 공략에 가담하여 분쟁이 발생하고 있습니다.");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -532,9 +497,8 @@ function getConquerNation($city): int
|
|||||||
return Util::array_first_key($conflict);
|
return Util::array_first_key($conflict);
|
||||||
}
|
}
|
||||||
|
|
||||||
function ConquerCity(array $admin, General $general, array $city, array $defenderCityGeneralList)
|
function ConquerCity(array $admin, General $general, array $city)
|
||||||
{
|
{
|
||||||
/** @var General[] $defenderCityGeneralList */
|
|
||||||
$db = DB::db();
|
$db = DB::db();
|
||||||
|
|
||||||
$year = $admin['year'];
|
$year = $admin['year'];
|
||||||
@@ -589,21 +553,6 @@ function ConquerCity(array $admin, General $general, array $city, array $defende
|
|||||||
if(TurnExecutionHelper::runEventHandler($db, $gameStor, EventTarget::OccupyCity)){
|
if(TurnExecutionHelper::runEventHandler($db, $gameStor, EventTarget::OccupyCity)){
|
||||||
$gameStor->cacheAll();
|
$gameStor->cacheAll();
|
||||||
}
|
}
|
||||||
$rng = new RandUtil(new LiteHashDRBG(Util::simpleSerialize(
|
|
||||||
UniqueConst::$hiddenSeed,
|
|
||||||
'ConquerCity',
|
|
||||||
$year,
|
|
||||||
$month,
|
|
||||||
$attackerNationID,
|
|
||||||
$attackerID,
|
|
||||||
$cityID
|
|
||||||
)));
|
|
||||||
foreach($defenderCityGeneralList as $defenderCityGeneral){
|
|
||||||
$defenderCityGeneral->onArbitraryAction($defenderCityGeneral, $rng, 'ConquerCity', null, [
|
|
||||||
'attacker' => $general
|
|
||||||
]);
|
|
||||||
$defenderCityGeneral->applyDB($db);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// 국가 멸망시
|
// 국가 멸망시
|
||||||
@@ -615,10 +564,10 @@ function ConquerCity(array $admin, General $general, array $city, array $defende
|
|||||||
|
|
||||||
$lord = new General($db->queryFirstRow(
|
$lord = new General($db->queryFirstRow(
|
||||||
'SELECT %l FROM general WHERE nation = %i AND officer_level = %i LIMIT 1',
|
'SELECT %l FROM general WHERE nation = %i AND officer_level = %i LIMIT 1',
|
||||||
Util::formatListOfBackticks(General::mergeQueryColumn()[0]),
|
Util::formatListOfBackticks(General::mergeQueryColumn(['npc', 'gold', 'rice', 'experience', 'explevel', 'belong', 'dedication', 'dedlevel', 'aux'], 1)[0]),
|
||||||
$defenderNationID,
|
$defenderNationID,
|
||||||
12
|
12
|
||||||
), null, null, $city, $loseNation, $year, $month);
|
), null, $city, $loseNation, $year, $month, false);
|
||||||
|
|
||||||
$josaUl = JosaUtil::pick($defenderNationName, '을');
|
$josaUl = JosaUtil::pick($defenderNationName, '을');
|
||||||
$attackerLogger->pushNationalHistoryLog("<D><b>{$defenderNationName}</b></>{$josaUl} 정복");
|
$attackerLogger->pushNationalHistoryLog("<D><b>{$defenderNationName}</b></>{$josaUl} 정복");
|
||||||
@@ -715,12 +664,11 @@ function ConquerCity(array $admin, General $general, array $city, array $defende
|
|||||||
$minCity = findNextCapital($cityID, $defenderNationID);
|
$minCity = findNextCapital($cityID, $defenderNationID);
|
||||||
|
|
||||||
$minCityName = CityConst::byID($minCity)->name;
|
$minCityName = CityConst::byID($minCity)->name;
|
||||||
$josaRo = JosaUtil::pick($minCityName, '로');
|
|
||||||
|
|
||||||
$josaYi = JosaUtil::pick($defenderNationName, '이');
|
$josaYi = JosaUtil::pick($defenderNationName, '이');
|
||||||
$attackerLogger->pushGlobalHistoryLog("<M><b>【긴급천도】</b></><D><b>{$defenderNationName}</b></>{$josaYi} 수도가 함락되어 <G><b>$minCityName</b></>{$josaRo} 긴급천도하였습니다.");
|
$attackerLogger->pushGlobalHistoryLog("<M><b>【긴급천도】</b></><D><b>{$defenderNationName}</b></>{$josaYi} 수도가 함락되어 <G><b>$minCityName</b></>으로 긴급천도하였습니다.");
|
||||||
|
|
||||||
$moveLog = "수도가 함락되어 <G><b>$minCityName</b></>{$josaRo} <M>긴급천도</>합니다.";
|
$moveLog = "수도가 함락되어 <G><b>$minCityName</b></>으로 <M>긴급천도</>합니다.";
|
||||||
//아국 수뇌부에게 로그 전달
|
//아국 수뇌부에게 로그 전달
|
||||||
foreach ($db->queryFirstColumn(
|
foreach ($db->queryFirstColumn(
|
||||||
'SELECT no FROM general WHERE nation=%i AND officer_level>=5',
|
'SELECT no FROM general WHERE nation=%i AND officer_level>=5',
|
||||||
|
|||||||
@@ -39,7 +39,7 @@ class BidBuyRiceAuction extends \sammo\BaseAPI
|
|||||||
$amount = $this->args['amount'];
|
$amount = $this->args['amount'];
|
||||||
|
|
||||||
$generalID = $session->generalID;
|
$generalID = $session->generalID;
|
||||||
$general = General::createObjFromDB($generalID);
|
$general = General::createGeneralObjFromDB($generalID);
|
||||||
$auction = new AuctionBuyRice($auctionID, $general);
|
$auction = new AuctionBuyRice($auctionID, $general);
|
||||||
$result = $auction->bid($amount, true);
|
$result = $auction->bid($amount, true);
|
||||||
|
|
||||||
|
|||||||
@@ -38,7 +38,7 @@ class BidSellRiceAuction extends \sammo\BaseAPI
|
|||||||
$amount = $this->args['amount'];
|
$amount = $this->args['amount'];
|
||||||
|
|
||||||
$generalID = $session->generalID;
|
$generalID = $session->generalID;
|
||||||
$general = General::createObjFromDB($generalID);
|
$general = General::createGeneralObjFromDB($generalID);
|
||||||
$auction = new AuctionSellRice($auctionID, $general);
|
$auction = new AuctionSellRice($auctionID, $general);
|
||||||
$result = $auction->bid($amount, true);
|
$result = $auction->bid($amount, true);
|
||||||
|
|
||||||
|
|||||||
@@ -41,7 +41,7 @@ class BidUniqueAuction extends \sammo\BaseAPI
|
|||||||
$tryExtendCloseDate = $this->args['extendCloseDate'] ?? false;
|
$tryExtendCloseDate = $this->args['extendCloseDate'] ?? false;
|
||||||
|
|
||||||
$generalID = $session->generalID;
|
$generalID = $session->generalID;
|
||||||
$general = General::createObjFromDB($generalID);
|
$general = General::createGeneralObjFromDB($generalID);
|
||||||
$auction = new AuctionUniqueItem($auctionID, $general);
|
$auction = new AuctionUniqueItem($auctionID, $general);
|
||||||
$result = $auction->bid($amount, $tryExtendCloseDate);
|
$result = $auction->bid($amount, $tryExtendCloseDate);
|
||||||
|
|
||||||
|
|||||||
@@ -10,7 +10,6 @@ use sammo\DTO\AuctionBidItem;
|
|||||||
use sammo\DTO\AuctionInfo;
|
use sammo\DTO\AuctionInfo;
|
||||||
use sammo\Enums\APIRecoveryType;
|
use sammo\Enums\APIRecoveryType;
|
||||||
use sammo\Enums\AuctionType;
|
use sammo\Enums\AuctionType;
|
||||||
use sammo\Enums\GeneralQueryMode;
|
|
||||||
use sammo\Enums\InheritanceKey;
|
use sammo\Enums\InheritanceKey;
|
||||||
use sammo\InheritancePointManager;
|
use sammo\InheritancePointManager;
|
||||||
use sammo\TimeUtil;
|
use sammo\TimeUtil;
|
||||||
@@ -77,7 +76,7 @@ class GetUniqueItemAuctionDetail extends \sammo\BaseAPI
|
|||||||
$inheritMgr = InheritancePointManager::getInstance();
|
$inheritMgr = InheritancePointManager::getInstance();
|
||||||
//preveious라서 column을 최대한 비울 수 있다.
|
//preveious라서 column을 최대한 비울 수 있다.
|
||||||
$remainPoint = $inheritMgr->getInheritancePoint(
|
$remainPoint = $inheritMgr->getInheritancePoint(
|
||||||
General::createObjFromDB($generalID),
|
General::createGeneralObjFromDB($generalID, ['owner'], 0),
|
||||||
InheritanceKey::previous
|
InheritanceKey::previous
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|||||||
@@ -66,7 +66,7 @@ class OpenBuyRiceAuction extends \sammo\BaseAPI
|
|||||||
$finishBidAmount = $this->args['finishBidAmount'];
|
$finishBidAmount = $this->args['finishBidAmount'];
|
||||||
$generalID = $session->generalID;
|
$generalID = $session->generalID;
|
||||||
|
|
||||||
$general = General::createObjFromDB($generalID);
|
$general = General::createGeneralObjFromDB($generalID);
|
||||||
|
|
||||||
$db = DB::db();
|
$db = DB::db();
|
||||||
$gameStor = KVStorage::getStorage($db, 'game_env');
|
$gameStor = KVStorage::getStorage($db, 'game_env');
|
||||||
|
|||||||
@@ -66,7 +66,7 @@ class OpenSellRiceAuction extends \sammo\BaseAPI
|
|||||||
$finishBidAmount = $this->args['finishBidAmount'];
|
$finishBidAmount = $this->args['finishBidAmount'];
|
||||||
$generalID = $session->generalID;
|
$generalID = $session->generalID;
|
||||||
|
|
||||||
$general = General::createObjFromDB($generalID);
|
$general = General::createGeneralObjFromDB($generalID);
|
||||||
|
|
||||||
$db = DB::db();
|
$db = DB::db();
|
||||||
$gameStor = KVStorage::getStorage($db, 'game_env');
|
$gameStor = KVStorage::getStorage($db, 'game_env');
|
||||||
|
|||||||
@@ -57,7 +57,7 @@ class OpenUniqueAuction extends \sammo\BaseAPI
|
|||||||
$generalID = $session->generalID;
|
$generalID = $session->generalID;
|
||||||
|
|
||||||
$itemObj = buildItemClass($itemID);
|
$itemObj = buildItemClass($itemID);
|
||||||
$general = General::createObjFromDB($generalID);
|
$general = General::createGeneralObjFromDB($generalID);
|
||||||
|
|
||||||
$db = DB::db();
|
$db = DB::db();
|
||||||
$gameStor = KVStorage::getStorage($db, 'game_env');
|
$gameStor = KVStorage::getStorage($db, 'game_env');
|
||||||
|
|||||||
@@ -42,12 +42,9 @@ class GetBettingList extends \sammo\BaseAPI
|
|||||||
$bettingStor = KVStorage::getStorage($db, 'betting');
|
$bettingStor = KVStorage::getStorage($db, 'betting');
|
||||||
$userID = $session->userID;
|
$userID = $session->userID;
|
||||||
|
|
||||||
$me = $db->queryFirstRow(
|
$me = $db->queryFirstRow('SELECT no,nation,officer_level,con,turntime,belong,penalty,permission FROM general WHERE owner=%i', $userID);
|
||||||
'SELECT no,nation,officer_level,refresh_score,turntime,belong,penalty,permission FROM `general`
|
$con = checkLimit($me['con']);
|
||||||
LEFT JOIN general_access_log AS l ON `general`.no = l.general_id WHERE owner=%i', $userID
|
if ($con >= 2) {
|
||||||
);
|
|
||||||
$limitState = checkLimit($me['refresh_score']);
|
|
||||||
if ($limitState >= 2) {
|
|
||||||
return "접속 제한중입니다.";
|
return "접속 제한중입니다.";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,332 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace sammo\API\City;
|
||||||
|
|
||||||
|
use ArrayObject;
|
||||||
|
use Ds\Set;
|
||||||
|
use sammo\CityConst;
|
||||||
|
use sammo\DB;
|
||||||
|
use sammo\Enums\APIRecoveryType;
|
||||||
|
use sammo\General;
|
||||||
|
use sammo\Json;
|
||||||
|
use sammo\Session;
|
||||||
|
use sammo\Util;
|
||||||
|
use sammo\Validator;
|
||||||
|
|
||||||
|
use function sammo\calcLeadershipBonus;
|
||||||
|
use function sammo\checkLimit;
|
||||||
|
use function sammo\checkSecretPermission;
|
||||||
|
use function sammo\getAllNationStaticInfo;
|
||||||
|
use function sammo\getBillByLevel;
|
||||||
|
use function sammo\getDedLevelText;
|
||||||
|
use function sammo\getHonor;
|
||||||
|
use function sammo\getNationStaticInfo;
|
||||||
|
use function sammo\getOfficerLevelText;
|
||||||
|
use function sammo\increaseRefresh;
|
||||||
|
|
||||||
|
class GetCityInfo extends \sammo\BaseAPI
|
||||||
|
{
|
||||||
|
const FAR_CITY = 0;
|
||||||
|
const NEAR_CITY = 1;
|
||||||
|
const ON_CITY = 2;
|
||||||
|
const OUR_NATION = 3;
|
||||||
|
|
||||||
|
static $viewColumns = [
|
||||||
|
'no' => self::NEAR_CITY,
|
||||||
|
'name' => self::NEAR_CITY,
|
||||||
|
'nation' => self::NEAR_CITY,
|
||||||
|
'npc' => self::NEAR_CITY,
|
||||||
|
'injury' => self::NEAR_CITY,
|
||||||
|
'leadership' => self::NEAR_CITY,
|
||||||
|
'strength' => self::NEAR_CITY,
|
||||||
|
'intel' => self::NEAR_CITY,
|
||||||
|
|
||||||
|
'picture' => self::NEAR_CITY,
|
||||||
|
'imgsvr' => self::NEAR_CITY,
|
||||||
|
|
||||||
|
'city' => self::NEAR_CITY,
|
||||||
|
|
||||||
|
'officer_level' => self::NEAR_CITY,
|
||||||
|
'officer_city' => self::NEAR_CITY,
|
||||||
|
'defence_train' => self::OUR_NATION,
|
||||||
|
'crewtype' => self::OUR_NATION,
|
||||||
|
'crew' => self::ON_CITY,
|
||||||
|
'train' => self::OUR_NATION,
|
||||||
|
'atmos' => self::OUR_NATION,
|
||||||
|
];
|
||||||
|
|
||||||
|
static $columnRemap = [
|
||||||
|
'nation' => 'nationID',
|
||||||
|
];
|
||||||
|
|
||||||
|
static $customViewColumns = [
|
||||||
|
'officerLevel' => self::NEAR_CITY,
|
||||||
|
'officerLevelText' => self::NEAR_CITY,
|
||||||
|
'lbonus' => self::NEAR_CITY,
|
||||||
|
'reservedCommand' => self::OUR_NATION,
|
||||||
|
'isOurNation' => self::NEAR_CITY,
|
||||||
|
];
|
||||||
|
|
||||||
|
public function validateArgs(): ?string
|
||||||
|
{
|
||||||
|
$v = new Validator($this->args);
|
||||||
|
$v->rule('int', 'troopID');
|
||||||
|
|
||||||
|
if (!$v->validate()) {
|
||||||
|
return $v->errorStr();
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getRequiredSessionMode(): int
|
||||||
|
{
|
||||||
|
return static::REQ_GAME_LOGIN | static::REQ_READ_ONLY;
|
||||||
|
}
|
||||||
|
|
||||||
|
private function getOfficerLevel($rawGeneral)
|
||||||
|
{
|
||||||
|
$level = $rawGeneral['officer_level'];
|
||||||
|
return $level;
|
||||||
|
}
|
||||||
|
|
||||||
|
private function filterCity(array $rawCity, int $showLevel)
|
||||||
|
{
|
||||||
|
$cityID = $rawCity['city'];
|
||||||
|
$db = DB::db();
|
||||||
|
|
||||||
|
$officerList = $db->query(
|
||||||
|
'SELECT no, npc, name, nation, picture, imgsvr FROM general WHERE city = %i AND 2 <= officer_level AND officer_level <= 4',
|
||||||
|
$cityID
|
||||||
|
);
|
||||||
|
|
||||||
|
$filteredCity = [
|
||||||
|
'city' => $cityID,
|
||||||
|
'name' => $rawCity['name'],
|
||||||
|
'level' => $rawCity['level'],
|
||||||
|
'nation' => $rawCity['nation'],
|
||||||
|
'supply' => $rawCity['supply'],
|
||||||
|
'pop_max' => $rawCity['pop_max'],
|
||||||
|
'agri_max' => $rawCity['agri_max'],
|
||||||
|
'comm_max' => $rawCity['comm_max'],
|
||||||
|
'secu_max' => $rawCity['secu_max'],
|
||||||
|
'trade' => $rawCity['trade'],
|
||||||
|
'def_max' => $rawCity['def_max'],
|
||||||
|
'wall_max' => $rawCity['wall_max'],
|
||||||
|
'region' => $rawCity['region'],
|
||||||
|
'officerList' => $officerList,
|
||||||
|
];
|
||||||
|
|
||||||
|
if ($showLevel >= self::ON_CITY) {
|
||||||
|
$filteredCity = array_merge($filteredCity, [
|
||||||
|
'pop' => $rawCity['pop'],
|
||||||
|
'agri' => $rawCity['agri'],
|
||||||
|
'comm' => $rawCity['comm'],
|
||||||
|
'secu' => $rawCity['secu'],
|
||||||
|
'def' => $rawCity['def'],
|
||||||
|
'wall' => $rawCity['wall'],
|
||||||
|
'officer_set' => $rawCity['officer_set'],
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
|
||||||
|
return $filteredCity;
|
||||||
|
}
|
||||||
|
|
||||||
|
private function getGeneralList(int $cityID, int $nationID, int $showLevel)
|
||||||
|
{
|
||||||
|
if ($showLevel == self::FAR_CITY) {
|
||||||
|
return [
|
||||||
|
'column' => [],
|
||||||
|
'list' => []
|
||||||
|
];
|
||||||
|
}
|
||||||
|
$db = DB::db();
|
||||||
|
|
||||||
|
$nationStaticList = getAllNationStaticInfo();
|
||||||
|
|
||||||
|
$rawGeneralList = Util::convertArrayToDict($db->query('SELECT %l from general WHERE city = %i ORDER BY turntime ASC', Util::formatListOfBackticks(array_keys(static::$viewColumns)), $cityID), 'no');
|
||||||
|
$ourNationGeneralIDList = new Set();
|
||||||
|
foreach ($rawGeneralList as $rawGeneral) {
|
||||||
|
if ($rawGeneral['nation'] == $nationID) {
|
||||||
|
$ourNationGeneralIDList->add($rawGeneral['no']);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$reservedCommand = [];
|
||||||
|
$reservedCommandTargetGeneralIDList = [];
|
||||||
|
|
||||||
|
foreach ($rawGeneralList as $rawGeneral) {
|
||||||
|
if ($rawGeneral['nation'] != $nationID) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if ($rawGeneral['npc'] < 2) {
|
||||||
|
$reservedCommandTargetGeneralIDList[$rawGeneral['no']] = $rawGeneral['no'];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($reservedCommandTargetGeneralIDList) {
|
||||||
|
$rawTurnList = $db->query(
|
||||||
|
'SELECT general_id, turn_idx, action, arg, brief FROM general_turn WHERE general_id IN %li AND turn_idx < 5 ORDER BY general_id asc, turn_idx asc',
|
||||||
|
array_values($reservedCommandTargetGeneralIDList)
|
||||||
|
);
|
||||||
|
|
||||||
|
foreach ($rawTurnList as $rawTurn) {
|
||||||
|
[
|
||||||
|
'general_id' => $generalID,
|
||||||
|
'action' => $action,
|
||||||
|
'arg' => $arg,
|
||||||
|
'brief' => $brief,
|
||||||
|
] = $rawTurn;
|
||||||
|
if (!key_exists($generalID, $reservedCommand)) {
|
||||||
|
$reservedCommand[$generalID] = [];
|
||||||
|
}
|
||||||
|
$reservedCommand[$generalID][] = [
|
||||||
|
'action' => $action,
|
||||||
|
'arg' => $arg,
|
||||||
|
'brief' => $brief
|
||||||
|
];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$specialViewFilter = [
|
||||||
|
'officerLevel' => fn ($rawGeneral) => $this->getOfficerLevel($rawGeneral),
|
||||||
|
'officerLevelText' => fn ($rawGeneral) => getOfficerLevelText($this->getOfficerLevel($rawGeneral), $nationStaticList[$rawGeneral['nation']]['level']),
|
||||||
|
'lbonus' => fn ($rawGeneral) => calcLeadershipBonus($rawGeneral['officer_level'], $nationStaticList[$rawGeneral['nation']]['level']),
|
||||||
|
'reservedCommand' => fn ($rawGeneral) => $reservedCommand[$rawGeneral['no']] ?? null,
|
||||||
|
'isOurNation' => fn ($rawGeneral) => $rawGeneral['nation'] == $nationID,
|
||||||
|
];
|
||||||
|
|
||||||
|
$showFullColumn = $showLevel == self::OUR_NATION || $ourNationGeneralIDList->count() > 0;
|
||||||
|
|
||||||
|
$resultColumns = [];
|
||||||
|
foreach (static::$viewColumns as $column => $reqShowLevel) {
|
||||||
|
if (!$showFullColumn && $reqShowLevel > $showLevel) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (key_exists($column, static::$columnRemap)) {
|
||||||
|
$newColumn = static::$columnRemap[$column];
|
||||||
|
if ($newColumn !== null) {
|
||||||
|
$resultColumns[$newColumn] = $column;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
$resultColumns[$column] = $column;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach (static::$customViewColumns as $column => $reqShowLevel) {
|
||||||
|
if (!$showFullColumn && $reqShowLevel > $showLevel) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
$resultColumns[$column] = $column;
|
||||||
|
}
|
||||||
|
|
||||||
|
$generalList = [];
|
||||||
|
foreach ($rawGeneralList as $rawGeneral) {
|
||||||
|
$item = [];
|
||||||
|
foreach ($resultColumns as $column) {
|
||||||
|
$reqShowLevel = static::$viewColumns[$column];
|
||||||
|
|
||||||
|
if ($rawGeneral['nation'] != $nationID && $reqShowLevel == self::OUR_NATION) {
|
||||||
|
$item[] = null;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (key_exists($column, $specialViewFilter)) {
|
||||||
|
$value = $specialViewFilter[$column]($rawGeneral);
|
||||||
|
} else {
|
||||||
|
$value = $rawGeneral[$column];
|
||||||
|
}
|
||||||
|
$item[] = $value;
|
||||||
|
}
|
||||||
|
|
||||||
|
$generalList[] = $item;
|
||||||
|
}
|
||||||
|
return [
|
||||||
|
'column' => array_keys($resultColumns),
|
||||||
|
'list' => $generalList,
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
private function calcShowLevel(int $cityID, int $currentCityID, int $nationID, Set $cityList, bool $isSpyPresent): int
|
||||||
|
{
|
||||||
|
$db = DB::db();
|
||||||
|
if ($cityList->contains($currentCityID)) {
|
||||||
|
return self::OUR_NATION;
|
||||||
|
}
|
||||||
|
if ($cityID == $currentCityID) {
|
||||||
|
return self::ON_CITY;
|
||||||
|
}
|
||||||
|
if ($isSpyPresent) {
|
||||||
|
return self::ON_CITY;
|
||||||
|
}
|
||||||
|
|
||||||
|
$existsGeneralID = $db->queryFirstField(
|
||||||
|
'SELECT no FROM general WHERE city = %i AND nation = %i LIMIT 1',
|
||||||
|
$cityID,
|
||||||
|
$nationID
|
||||||
|
);
|
||||||
|
|
||||||
|
if ($existsGeneralID) {
|
||||||
|
return self::ON_CITY;
|
||||||
|
}
|
||||||
|
|
||||||
|
$cityConstObj = CityConst::byID($cityID);
|
||||||
|
|
||||||
|
$nearCityIDList = array_keys($cityConstObj->path);
|
||||||
|
foreach ($nearCityIDList as $nearCityID) {
|
||||||
|
if ($cityList->contains($nearCityID)) {
|
||||||
|
return self::NEAR_CITY;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return self::FAR_CITY;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function launch(Session $session, ?\DateTimeInterface $modifiedSince, ?string $reqEtag): null | string | array | APIRecoveryType
|
||||||
|
{
|
||||||
|
increaseRefresh("도시정보", 1);
|
||||||
|
|
||||||
|
$db = DB::db();
|
||||||
|
|
||||||
|
$gameStor = \sammo\KVStorage::getStorage($db, 'game_env');
|
||||||
|
$lastExecuted = $gameStor->getValue('turntime');
|
||||||
|
|
||||||
|
$me = $db->queryFirstRow('SELECT con, turntime, belong, city, nation, officer_level, permission, penalty FROM general WHERE owner=%i', $session->getUserID());
|
||||||
|
|
||||||
|
if (key_exists('cityID', $this->args)) {
|
||||||
|
$cityID = (int)$this->args['cityID'];
|
||||||
|
} else {
|
||||||
|
$cityID = $me['city'];
|
||||||
|
}
|
||||||
|
|
||||||
|
$con = checkLimit($me['con']);
|
||||||
|
if ($con >= 2) {
|
||||||
|
return '접속 제한중입니다. 1턴 이내에 너무 많은 갱신을 하셨습니다.';
|
||||||
|
}
|
||||||
|
|
||||||
|
$nationID = $me['nation'];
|
||||||
|
$currentCityID = $me['city'];
|
||||||
|
//TODO: 조건 조사
|
||||||
|
|
||||||
|
$cityList = new Set($db->queryFirstColumn('SELECT city FROM city WHERE nation=%i', $nationID));
|
||||||
|
|
||||||
|
$spyList = JSON::decode($db->queryFirstField('SELECT spy FROM nation WHERE nation=%i', $nationID));
|
||||||
|
$showLevel = $this->calcShowLevel($cityID, $currentCityID, $nationID, $cityList, key_exists($cityID, $spyList));
|
||||||
|
|
||||||
|
$rawCity = $db->queryFirstRow('SELECT * FROM city WHERE city=%i', $cityID);
|
||||||
|
$filteredCity = $this->filterCity($rawCity, $showLevel);
|
||||||
|
|
||||||
|
$result = [
|
||||||
|
'result' => true,
|
||||||
|
'lastExcuted' => $lastExecuted,
|
||||||
|
'cityInfo' => $filteredCity,
|
||||||
|
'spyList' => $spyList,
|
||||||
|
'nationCityList' => $cityList->toArray(),
|
||||||
|
'myGeneralID' => $session->generalID,
|
||||||
|
'currentCityID' => $currentCityID,
|
||||||
|
'showLevel' => $showLevel,
|
||||||
|
'cityGeneralList' => $this->getGeneralList($cityID, $nationID, $showLevel)
|
||||||
|
];
|
||||||
|
|
||||||
|
return $result;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,48 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
namespace sammo\API\Command;
|
|
||||||
|
|
||||||
use sammo\Session;
|
|
||||||
use DateTimeInterface;
|
|
||||||
use sammo\Command\UserActionCommand;
|
|
||||||
use sammo\DB;
|
|
||||||
use sammo\Enums\APIRecoveryType;
|
|
||||||
use sammo\Json;
|
|
||||||
use sammo\KVStorage;
|
|
||||||
use sammo\TimeUtil;
|
|
||||||
use sammo\DTO\UserAction;
|
|
||||||
|
|
||||||
use function sammo\cutTurn;
|
|
||||||
|
|
||||||
class GetReservedUserAction extends \sammo\BaseAPI
|
|
||||||
{
|
|
||||||
public function validateArgs(): ?string
|
|
||||||
{
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
public function getRequiredSessionMode(): int
|
|
||||||
{
|
|
||||||
return static::REQ_GAME_LOGIN | static::REQ_READ_ONLY;
|
|
||||||
}
|
|
||||||
|
|
||||||
public function launch(Session $session, ?DateTimeInterface $modifiedSince, ?string $reqEtag): null | string | array | APIRecoveryType
|
|
||||||
{
|
|
||||||
$db = DB::db();
|
|
||||||
$generalID = $session->generalID;
|
|
||||||
|
|
||||||
$userActionKey = UserActionCommand::USER_ACTION_KEY;
|
|
||||||
|
|
||||||
$rawUserActions = $db->queryFirstField('SELECT JSON_QUERY(`aux`, %s) FROM general WHERE no=%i', "$.{$userActionKey}", $generalID);
|
|
||||||
if($rawUserActions === null){
|
|
||||||
$rawUserActions = '{}';
|
|
||||||
}
|
|
||||||
|
|
||||||
$userActions = UserAction::fromArray(Json::decode($rawUserActions));
|
|
||||||
|
|
||||||
return [
|
|
||||||
'result' => true,
|
|
||||||
'userActions' => $userActions->toArray(),
|
|
||||||
];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,91 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
namespace sammo\API\Command;
|
|
||||||
|
|
||||||
use sammo\Session;
|
|
||||||
use DateTimeInterface;
|
|
||||||
use sammo\Command\UserActionCommand;
|
|
||||||
use sammo\DB;
|
|
||||||
use sammo\DTO\UserAction;
|
|
||||||
use sammo\DTO\UserActionItem;
|
|
||||||
use sammo\Enums\APIRecoveryType;
|
|
||||||
use sammo\GameConst;
|
|
||||||
use sammo\General;
|
|
||||||
use sammo\Json;
|
|
||||||
use sammo\KVStorage;
|
|
||||||
use sammo\Util;
|
|
||||||
use sammo\Validator;
|
|
||||||
|
|
||||||
use function sammo\buildUserActionCommandClass;
|
|
||||||
use function sammo\setGeneralCommand;
|
|
||||||
|
|
||||||
class ReserveUserAction extends \sammo\BaseAPI
|
|
||||||
{
|
|
||||||
public function validateArgs(): ?string
|
|
||||||
{
|
|
||||||
$v = new Validator($this->args);
|
|
||||||
$v->rule('required', [
|
|
||||||
'turnIdx',
|
|
||||||
'action'
|
|
||||||
])
|
|
||||||
->rule('int', 'turnIdx')
|
|
||||||
->rule('max', 'turnIdx', GameConst::$maxTurn)
|
|
||||||
->rule('min', 'turnIdx', 0)
|
|
||||||
->rule('lengthMin', 'action', 1);
|
|
||||||
if (!$v->validate()) {
|
|
||||||
return $v->errorStr();
|
|
||||||
}
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
public function getRequiredSessionMode(): int
|
|
||||||
{
|
|
||||||
return static::REQ_GAME_LOGIN | static::REQ_READ_ONLY;
|
|
||||||
}
|
|
||||||
|
|
||||||
public function launch(Session $session, ?DateTimeInterface $modifiedSince, ?string $reqEtag): null | string | array | APIRecoveryType
|
|
||||||
{
|
|
||||||
$turnIdx = $this->args['turnIdx'];
|
|
||||||
$action = $this->args['action'];
|
|
||||||
|
|
||||||
$userActionKey = UserActionCommand::USER_ACTION_KEY;
|
|
||||||
|
|
||||||
if($turnIdx < 0 || $turnIdx >= GameConst::$maxTurn){
|
|
||||||
return '올바르지 않은 턴입니다.';
|
|
||||||
}
|
|
||||||
|
|
||||||
if(!in_array($action, Util::array_flatten(GameConst::$availableUserActionCommand))){
|
|
||||||
return '사용할 수 없는 커맨드입니다.';
|
|
||||||
}
|
|
||||||
|
|
||||||
$db = DB::db();
|
|
||||||
$generalID = $session->generalID;
|
|
||||||
$rawUserActions = $db->queryFirstField('SELECT JSON_QUERY(`aux`, %s) FROM general WHERE no=%i', "$.{$userActionKey}", $generalID);
|
|
||||||
if(!$rawUserActions){
|
|
||||||
$rawUserActions = '{}';
|
|
||||||
}
|
|
||||||
|
|
||||||
$tmp = Json::decode($rawUserActions);
|
|
||||||
$userActions = UserAction::fromArray($tmp);
|
|
||||||
|
|
||||||
|
|
||||||
$gameStor = KVStorage::getStorage($db, 'game_env');
|
|
||||||
$gameStor->cacheAll();
|
|
||||||
$general = General::createObjFromDB($generalID);
|
|
||||||
|
|
||||||
$item = buildUserActionCommandClass($action, $general, $gameStor->getAll());
|
|
||||||
$userActions->reserved[$turnIdx] = new UserActionItem(
|
|
||||||
$item->getRawClassName(),
|
|
||||||
$item->getBrief(),
|
|
||||||
null,
|
|
||||||
);
|
|
||||||
|
|
||||||
$db->update('general', [
|
|
||||||
'aux' => $db->sqleval('JSON_SET(`aux`, %s, JSON_EXTRACT(%s, "$"))', "$.{$userActionKey}", Json::encode($userActions->toArray())),
|
|
||||||
], 'no=%i', $generalID);
|
|
||||||
|
|
||||||
return [
|
|
||||||
'result' => true,
|
|
||||||
];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -39,7 +39,7 @@ class BuildNationCandidate extends \sammo\BaseAPI
|
|||||||
$gameStor = KVStorage::getStorage($db, 'game_env');
|
$gameStor = KVStorage::getStorage($db, 'game_env');
|
||||||
$gameStor->cacheValues(['opentime', 'turntime']);
|
$gameStor->cacheValues(['opentime', 'turntime']);
|
||||||
|
|
||||||
$general = $db->queryFirstRow('SELECT no,name,nation,owner_name,npc FROM general WHERE owner=%i', $userID);
|
$general = $db->queryFirstRow('SELECT no,name,nation,owner_name,npc,lastrefresh FROM general WHERE owner=%i', $userID);
|
||||||
|
|
||||||
if (!$general) {
|
if (!$general) {
|
||||||
return '장수가 없습니다';
|
return '장수가 없습니다';
|
||||||
@@ -59,7 +59,7 @@ class BuildNationCandidate extends \sammo\BaseAPI
|
|||||||
|
|
||||||
$env = $gameStor->getAll();
|
$env = $gameStor->getAll();
|
||||||
|
|
||||||
$generalObj = General::createObjFromDB($general['no']);
|
$generalObj = General::createGeneralObjFromDB($general['no']);
|
||||||
|
|
||||||
$validCmd = false;
|
$validCmd = false;
|
||||||
foreach(GameConst::$availableGeneralCommand as $cmdList){
|
foreach(GameConst::$availableGeneralCommand as $cmdList){
|
||||||
|
|||||||
@@ -5,7 +5,6 @@ namespace sammo\API\General;
|
|||||||
use sammo\DB;
|
use sammo\DB;
|
||||||
use sammo\DummyGeneral;
|
use sammo\DummyGeneral;
|
||||||
use sammo\Enums\APIRecoveryType;
|
use sammo\Enums\APIRecoveryType;
|
||||||
use sammo\Enums\GeneralAccessLogColumn;
|
|
||||||
use sammo\GameConst;
|
use sammo\GameConst;
|
||||||
use sammo\Session;
|
use sammo\Session;
|
||||||
use sammo\General;
|
use sammo\General;
|
||||||
@@ -38,13 +37,7 @@ class DieOnPrestart extends \sammo\BaseAPI
|
|||||||
$gameStor = KVStorage::getStorage($db, 'game_env');
|
$gameStor = KVStorage::getStorage($db, 'game_env');
|
||||||
$gameStor->cacheValues(['turnterm', 'opentime', 'turntime', 'year', 'month']);
|
$gameStor->cacheValues(['turnterm', 'opentime', 'turntime', 'year', 'month']);
|
||||||
|
|
||||||
$general = $db->queryFirstRow('SELECT no,name,nation,owner_name,npc FROM general WHERE owner=%i AND npc = 0', $userID);
|
$general = $db->queryFirstRow('SELECT no,name,nation,owner_name,npc,lastrefresh FROM general WHERE owner=%i AND npc = 0', $userID);
|
||||||
$lastRefresh = $db->queryFirstField(
|
|
||||||
'SELECT %b FROM general_access_log WHERE %b = %i',
|
|
||||||
GeneralAccessLogColumn::lastRefresh->value,
|
|
||||||
GeneralAccessLogColumn::generalID->value,
|
|
||||||
$general['no']
|
|
||||||
);
|
|
||||||
|
|
||||||
if (!$general) {
|
if (!$general) {
|
||||||
return '장수가 없습니다';
|
return '장수가 없습니다';
|
||||||
@@ -62,13 +55,13 @@ class DieOnPrestart extends \sammo\BaseAPI
|
|||||||
}
|
}
|
||||||
|
|
||||||
//서버 가오픈시 할 수 있는 행동
|
//서버 가오픈시 할 수 있는 행동
|
||||||
$targetTime = addTurn($lastRefresh, $gameStor->turnterm, GameConst::$minTurnDieOnPrestart);
|
$targetTime = addTurn($general['lastrefresh'], $gameStor->turnterm, GameConst::$minTurnDieOnPrestart);
|
||||||
if ($targetTime > TimeUtil::now()) {
|
if ($targetTime > TimeUtil::now()) {
|
||||||
$targetTimeShort = substr($targetTime, 0, 19);
|
$targetTimeShort = substr($targetTime, 0, 19);
|
||||||
return "아직 삭제할 수 없습니다. {$targetTimeShort} 부터 가능합니다.";
|
return "아직 삭제할 수 없습니다. {$targetTimeShort} 부터 가능합니다.";
|
||||||
}
|
}
|
||||||
|
|
||||||
$generalObj = General::createObjFromDB($general['no']);
|
$generalObj = General::createGeneralObjFromDB($general['no']);
|
||||||
if ($generalObj instanceof DummyGeneral) {
|
if ($generalObj instanceof DummyGeneral) {
|
||||||
trigger_error("올바르지 않은 삭제 프로세스 $userID", E_USER_WARNING);
|
trigger_error("올바르지 않은 삭제 프로세스 $userID", E_USER_WARNING);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -37,7 +37,7 @@ class DropItem extends \sammo\BaseAPI
|
|||||||
public function launch(Session $session, ?\DateTimeInterface $modifiedSince, ?string $reqEtag): null | string | array | APIRecoveryType
|
public function launch(Session $session, ?\DateTimeInterface $modifiedSince, ?string $reqEtag): null | string | array | APIRecoveryType
|
||||||
{
|
{
|
||||||
$generalID = $session->generalID;
|
$generalID = $session->generalID;
|
||||||
$me = General::createObjFromDB($generalID);
|
$me = General::createGeneralObjFromDB($generalID);
|
||||||
|
|
||||||
$itemType = $this->args['itemType'];
|
$itemType = $this->args['itemType'];
|
||||||
$item = $me->getItem($itemType);
|
$item = $me->getItem($itemType);
|
||||||
|
|||||||
@@ -21,7 +21,7 @@ class GetCommandTable extends \sammo\BaseAPI{
|
|||||||
public function launch(Session $session, ?\DateTimeInterface $modifiedSince, ?string $reqEtag): null | string | array | APIRecoveryType
|
public function launch(Session $session, ?\DateTimeInterface $modifiedSince, ?string $reqEtag): null | string | array | APIRecoveryType
|
||||||
{
|
{
|
||||||
$generalID = $session->generalID;
|
$generalID = $session->generalID;
|
||||||
$me = General::createObjFromDB($generalID);
|
$me = General::createGeneralObjFromDB($generalID);
|
||||||
$commandTable = getCommandTable($me);
|
$commandTable = getCommandTable($me);
|
||||||
|
|
||||||
return [
|
return [
|
||||||
|
|||||||
@@ -5,16 +5,11 @@ namespace sammo\API\General;
|
|||||||
use DateTimeInterface;
|
use DateTimeInterface;
|
||||||
use MeekroDB;
|
use MeekroDB;
|
||||||
use sammo\CityConst;
|
use sammo\CityConst;
|
||||||
use sammo\Command\UserActionCommand;
|
|
||||||
use sammo\DB;
|
use sammo\DB;
|
||||||
use sammo\DTO\UserAction;
|
|
||||||
use sammo\DTO\VoteInfo;
|
use sammo\DTO\VoteInfo;
|
||||||
use sammo\Enums\APIRecoveryType;
|
use sammo\Enums\APIRecoveryType;
|
||||||
use sammo\Enums\CityColumn;
|
use sammo\Enums\CityColumn;
|
||||||
use sammo\Enums\GeneralAccessLogColumn;
|
|
||||||
use sammo\Enums\GeneralAuxKey;
|
|
||||||
use sammo\Enums\GeneralColumn;
|
use sammo\Enums\GeneralColumn;
|
||||||
use sammo\Enums\GeneralQueryMode;
|
|
||||||
use sammo\Enums\RankColumn;
|
use sammo\Enums\RankColumn;
|
||||||
use sammo\GameConst;
|
use sammo\GameConst;
|
||||||
use sammo\General;
|
use sammo\General;
|
||||||
@@ -30,7 +25,6 @@ use function sammo\buildNationCommandClass;
|
|||||||
use function sammo\checkLimit;
|
use function sammo\checkLimit;
|
||||||
use function sammo\getTournamentTermText;
|
use function sammo\getTournamentTermText;
|
||||||
use function sammo\buildNationTypeClass;
|
use function sammo\buildNationTypeClass;
|
||||||
use function sammo\buildUserActionCommandClass;
|
|
||||||
use function sammo\calcLeadershipBonus;
|
use function sammo\calcLeadershipBonus;
|
||||||
use function sammo\checkSecretPermission;
|
use function sammo\checkSecretPermission;
|
||||||
use function sammo\getBillByLevel;
|
use function sammo\getBillByLevel;
|
||||||
@@ -105,8 +99,7 @@ class GetFrontInfo extends \sammo\BaseAPI
|
|||||||
return $history;
|
return $history;
|
||||||
}
|
}
|
||||||
|
|
||||||
private function generateRecentRecord(int $generalID)
|
private function generateRecentRecord(int $generalID){
|
||||||
{
|
|
||||||
$db = DB::db();
|
$db = DB::db();
|
||||||
|
|
||||||
$gameStor = KVStorage::getStorage($db, 'game_env');
|
$gameStor = KVStorage::getStorage($db, 'game_env');
|
||||||
@@ -180,7 +173,7 @@ class GetFrontInfo extends \sammo\BaseAPI
|
|||||||
'online_nation', 'online_user_cnt',
|
'online_nation', 'online_user_cnt',
|
||||||
'year', 'month', 'startyear',
|
'year', 'month', 'startyear',
|
||||||
'maxgeneral',
|
'maxgeneral',
|
||||||
'refreshLimit',
|
'conlimit',
|
||||||
'server_cnt',
|
'server_cnt',
|
||||||
]);
|
]);
|
||||||
|
|
||||||
@@ -252,7 +245,7 @@ class GetFrontInfo extends \sammo\BaseAPI
|
|||||||
$nationID
|
$nationID
|
||||||
);
|
);
|
||||||
|
|
||||||
if ($nationPopulation['cityCnt'] == 0) {
|
if($nationPopulation['cityCnt'] == 0){
|
||||||
$nationPopulation = [
|
$nationPopulation = [
|
||||||
'cityCnt' => 0,
|
'cityCnt' => 0,
|
||||||
'now' => 0,
|
'now' => 0,
|
||||||
@@ -366,8 +359,6 @@ class GetFrontInfo extends \sammo\BaseAPI
|
|||||||
|
|
||||||
public function generateGeneralInfo(MeekroDB $db, General $general, array $rawNation): array
|
public function generateGeneralInfo(MeekroDB $db, General $general, array $rawNation): array
|
||||||
{
|
{
|
||||||
$gameStor = KVStorage::getStorage($db, 'game_env');
|
|
||||||
$admin = $gameStor->getAll(true);
|
|
||||||
|
|
||||||
$permission = checkSecretPermission($general->getRaw());
|
$permission = checkSecretPermission($general->getRaw());
|
||||||
|
|
||||||
@@ -392,8 +383,7 @@ class GetFrontInfo extends \sammo\BaseAPI
|
|||||||
'specialWar' => $general->getVar(GeneralColumn::special2), // GameObjClassKey;
|
'specialWar' => $general->getVar(GeneralColumn::special2), // GameObjClassKey;
|
||||||
'personal' => $general->getVar(GeneralColumn::personal), // GameObjClassKey;
|
'personal' => $general->getVar(GeneralColumn::personal), // GameObjClassKey;
|
||||||
'belong' => $general->getVar(GeneralColumn::belong), // number;
|
'belong' => $general->getVar(GeneralColumn::belong), // number;
|
||||||
|
'connect' => $general->getVar(GeneralColumn::connect), // number;
|
||||||
'refreshScoreTotal' => $general->getAccessLogVar(GeneralAccessLogColumn::refreshScoreTotal, 0), // number;
|
|
||||||
|
|
||||||
'officerLevel' => $general->getVar(GeneralColumn::officer_level), // number;
|
'officerLevel' => $general->getVar(GeneralColumn::officer_level), // number;
|
||||||
'officerLevelText' => getOfficerLevelText($general->getVar(GeneralColumn::officer_level), $rawNation['level']), // string;
|
'officerLevelText' => getOfficerLevelText($general->getVar(GeneralColumn::officer_level), $rawNation['level']), // string;
|
||||||
@@ -410,7 +400,7 @@ class GetFrontInfo extends \sammo\BaseAPI
|
|||||||
'troop' => $general->getVar(GeneralColumn::troop), // number;
|
'troop' => $general->getVar(GeneralColumn::troop), // number;
|
||||||
//P0 End
|
//P0 End
|
||||||
|
|
||||||
'refreshScore' => $general->getAccessLogVar(GeneralAccessLogColumn::refreshScore, 0), // number;
|
'con' => $general->getVar(GeneralColumn::con), // number;
|
||||||
'specage' => $general->getVar(GeneralColumn::specage), // number;
|
'specage' => $general->getVar(GeneralColumn::specage), // number;
|
||||||
'specage2' => $general->getVar(GeneralColumn::specage2), // number;
|
'specage2' => $general->getVar(GeneralColumn::specage2), // number;
|
||||||
'leadership_exp' => $general->getVar(GeneralColumn::leadership_exp), // number;
|
'leadership_exp' => $general->getVar(GeneralColumn::leadership_exp), // number;
|
||||||
@@ -450,21 +440,6 @@ class GetFrontInfo extends \sammo\BaseAPI
|
|||||||
'permission' => $permission,
|
'permission' => $permission,
|
||||||
];
|
];
|
||||||
|
|
||||||
$rawUserAction = $general->getAuxVar(UserActionCommand::USER_ACTION_KEY) ?? [];
|
|
||||||
$userAction = UserAction::fromArray($rawUserAction);
|
|
||||||
$impossibleUserAction = [];
|
|
||||||
$yearMonth = Util::joinYearMonth($admin['year'], $admin['month']);
|
|
||||||
|
|
||||||
if ($userAction->nextAvailableTurn) {
|
|
||||||
foreach ($userAction->nextAvailableTurn as $command => $nextAvailableTurn) {
|
|
||||||
if ($nextAvailableTurn > $yearMonth) {
|
|
||||||
$impossibleUserAction[] = [$command, $nextAvailableTurn - $yearMonth];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
$result['impossibleUserAction'] = $impossibleUserAction;
|
|
||||||
|
|
||||||
$nationID = $general->getNationID();
|
$nationID = $general->getNationID();
|
||||||
$troopID = $general->getVar(GeneralColumn::troop);
|
$troopID = $general->getVar(GeneralColumn::troop);
|
||||||
if (!$troopID) {
|
if (!$troopID) {
|
||||||
@@ -505,7 +480,6 @@ class GetFrontInfo extends \sammo\BaseAPI
|
|||||||
'name' => $troopName,
|
'name' => $troopName,
|
||||||
];
|
];
|
||||||
|
|
||||||
|
|
||||||
return $result;
|
return $result;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -557,12 +531,12 @@ class GetFrontInfo extends \sammo\BaseAPI
|
|||||||
{
|
{
|
||||||
$generalID = $session->generalID;
|
$generalID = $session->generalID;
|
||||||
//NOTE: 이 경우 staticNation 정보를 조회한다.
|
//NOTE: 이 경우 staticNation 정보를 조회한다.
|
||||||
$general = General::createObjFromDB($generalID, null, GeneralQueryMode::FullWithAccessLog);
|
$general = General::createGeneralObjFromDB($generalID);
|
||||||
$nationID = $general->getNationID();
|
$nationID = $general->getNationID();
|
||||||
$cityID = $general->getCityID();
|
$cityID = $general->getCityID();
|
||||||
|
|
||||||
$limitState = checkLimit($general->getAccessLogVar(GeneralAccessLogColumn::refreshScore, 0));
|
$con = checkLimit($general->getVar('con'));
|
||||||
if ($limitState >= 2) {
|
if ($con >= 2) {
|
||||||
return [
|
return [
|
||||||
'result' => false,
|
'result' => false,
|
||||||
'reason' => '접속 제한중입니다.',
|
'reason' => '접속 제한중입니다.',
|
||||||
@@ -599,7 +573,7 @@ class GetFrontInfo extends \sammo\BaseAPI
|
|||||||
|
|
||||||
if ($globalInfo['lastVote']) {
|
if ($globalInfo['lastVote']) {
|
||||||
$myLastVoteID = $db->queryFirstField('SELECT vote_id FROM vote WHERE general_id = %i ORDER BY vote_id DESC LIMIT 1', $generalID);
|
$myLastVoteID = $db->queryFirstField('SELECT vote_id FROM vote WHERE general_id = %i ORDER BY vote_id DESC LIMIT 1', $generalID);
|
||||||
if ($myLastVoteID) {
|
if($myLastVoteID) {
|
||||||
$auxInfo['myLastVote'] = $myLastVoteID;
|
$auxInfo['myLastVote'] = $myLastVoteID;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,68 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
namespace sammo\API\General;
|
|
||||||
|
|
||||||
use sammo\DB;
|
|
||||||
use sammo\Enums\APIRecoveryType;
|
|
||||||
use sammo\GameConst;
|
|
||||||
use sammo\General;
|
|
||||||
use sammo\Session;
|
|
||||||
use sammo\KVStorage;
|
|
||||||
use sammo\Util;
|
|
||||||
|
|
||||||
use function sammo\buildUserActionCommandClass;
|
|
||||||
|
|
||||||
class GetUserActionCommandTable extends \sammo\BaseAPI
|
|
||||||
{
|
|
||||||
public function validateArgs(): ?string
|
|
||||||
{
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
public function getRequiredSessionMode(): int
|
|
||||||
{
|
|
||||||
return static::REQ_GAME_LOGIN | static::REQ_READ_ONLY;
|
|
||||||
}
|
|
||||||
|
|
||||||
public function launch(Session $session, ?\DateTimeInterface $modifiedSince, ?string $reqEtag): null | string | array | APIRecoveryType
|
|
||||||
{
|
|
||||||
$generalID = $session->generalID;
|
|
||||||
|
|
||||||
$db = DB::db();
|
|
||||||
$gameStor = KVStorage::getStorage($db, 'game_env');
|
|
||||||
$gameStor->turnOnCache();
|
|
||||||
$env = $gameStor->getAll();
|
|
||||||
|
|
||||||
|
|
||||||
$general = General::createObjFromDB($generalID);
|
|
||||||
|
|
||||||
$commandTable = [];
|
|
||||||
foreach (GameConst::$availableUserActionCommand as $commandCategory => $commandList) {
|
|
||||||
$subList = [];
|
|
||||||
foreach ($commandList as $commandClassName) {
|
|
||||||
$commandObj = buildUserActionCommandClass($commandClassName, $general, $env);
|
|
||||||
if (!$commandObj->canDisplay()) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
$subList[] = [
|
|
||||||
'value' => Util::getClassNameFromObj($commandObj),
|
|
||||||
'compensation' => $commandObj->getCompensationStyle(),
|
|
||||||
'possible' => $commandObj->hasMinConditionMet(),
|
|
||||||
'title' => $commandObj->getCommandDetailTitle(),
|
|
||||||
'simpleName' => $commandObj->getName(),
|
|
||||||
'reqArg' => $commandObj::$reqArg,
|
|
||||||
];
|
|
||||||
}
|
|
||||||
|
|
||||||
$commandTable[] = [
|
|
||||||
'category' => $commandCategory,
|
|
||||||
'values' => $subList
|
|
||||||
];
|
|
||||||
}
|
|
||||||
|
|
||||||
return [
|
|
||||||
'result' => true,
|
|
||||||
'commandTable' => $commandTable,
|
|
||||||
];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,81 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
namespace sammo\API\General;
|
|
||||||
|
|
||||||
use sammo\DB;
|
|
||||||
use sammo\DummyGeneral;
|
|
||||||
use sammo\Enums\APIRecoveryType;
|
|
||||||
use sammo\Enums\GeneralAccessLogColumn;
|
|
||||||
use sammo\GameConst;
|
|
||||||
use sammo\Session;
|
|
||||||
use sammo\General;
|
|
||||||
use sammo\JosaUtil;
|
|
||||||
use sammo\KVStorage;
|
|
||||||
use sammo\LiteHashDRBG;
|
|
||||||
use sammo\RandUtil;
|
|
||||||
use sammo\TimeUtil;
|
|
||||||
use sammo\UniqueConst;
|
|
||||||
use sammo\Util;
|
|
||||||
|
|
||||||
use function sammo\addTurn;
|
|
||||||
use function sammo\buildGeneralCommandClass;
|
|
||||||
use function sammo\increaseRefresh;
|
|
||||||
|
|
||||||
class InstantRetreat extends \sammo\BaseAPI
|
|
||||||
{
|
|
||||||
public function validateArgs(): ?string
|
|
||||||
{
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
public function getRequiredSessionMode(): int
|
|
||||||
{
|
|
||||||
return static::REQ_GAME_LOGIN;
|
|
||||||
}
|
|
||||||
|
|
||||||
public function launch(Session $session, ?\DateTimeInterface $modifiedSince, ?string $reqEtag): null | string | array | APIRecoveryType
|
|
||||||
{
|
|
||||||
|
|
||||||
if(!(GameConst::$availableInstantAction['instantRetreat'] ?? false)){
|
|
||||||
return '접경귀환을 사용할 수 없는 시나리오입니다.';
|
|
||||||
}
|
|
||||||
|
|
||||||
$db = DB::db();
|
|
||||||
$gameStor = KVStorage::getStorage($db, 'game_env');
|
|
||||||
$gameStor->cacheAll();
|
|
||||||
|
|
||||||
$general = General::createObjFromDB($session->generalID);
|
|
||||||
|
|
||||||
if (!$general) {
|
|
||||||
return '장수가 없습니다';
|
|
||||||
}
|
|
||||||
|
|
||||||
increaseRefresh("접경귀환", 1);
|
|
||||||
|
|
||||||
$commandObj = buildGeneralCommandClass('che_접경귀환', $general, $gameStor->getAll(true));
|
|
||||||
$logger = $general->getLogger();
|
|
||||||
|
|
||||||
if (!$commandObj->hasFullConditionMet()) {
|
|
||||||
$logger->pushGeneralActionLog($commandObj->getFailString());
|
|
||||||
$reason = $commandObj->getFailString();
|
|
||||||
return $reason;
|
|
||||||
}
|
|
||||||
|
|
||||||
$result = $commandObj->run(new RandUtil(
|
|
||||||
new LiteHashDRBG(Util::simpleSerialize(
|
|
||||||
UniqueConst::$hiddenSeed,
|
|
||||||
'InstantRetreat',
|
|
||||||
$general->getID(),
|
|
||||||
$gameStor->year,
|
|
||||||
$gameStor->month,
|
|
||||||
$general->getCityID(),
|
|
||||||
))
|
|
||||||
));
|
|
||||||
|
|
||||||
if (!$result) {
|
|
||||||
return '가까운 아국 도시가 없습니다.';
|
|
||||||
}
|
|
||||||
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -8,7 +8,6 @@ use sammo\Auction;
|
|||||||
use sammo\CityConst;
|
use sammo\CityConst;
|
||||||
use sammo\DB;
|
use sammo\DB;
|
||||||
use sammo\Enums\APIRecoveryType;
|
use sammo\Enums\APIRecoveryType;
|
||||||
use sammo\Enums\GeneralAccessLogColumn;
|
|
||||||
use sammo\Enums\RankColumn;
|
use sammo\Enums\RankColumn;
|
||||||
use sammo\GameConst;
|
use sammo\GameConst;
|
||||||
use sammo\GameUnitConst;
|
use sammo\GameUnitConst;
|
||||||
@@ -415,6 +414,8 @@ class Join extends \sammo\BaseAPI
|
|||||||
'officer_level' => 0,
|
'officer_level' => 0,
|
||||||
'turntime' => $turntime,
|
'turntime' => $turntime,
|
||||||
'killturn' => 6,
|
'killturn' => 6,
|
||||||
|
'lastconnect' => $now,
|
||||||
|
'lastrefresh' => $now,
|
||||||
'crewtype' => GameUnitConst::DEFAULT_CREWTYPE,
|
'crewtype' => GameUnitConst::DEFAULT_CREWTYPE,
|
||||||
'makelimit' => 0,
|
'makelimit' => 0,
|
||||||
'betray' => $betray,
|
'betray' => $betray,
|
||||||
@@ -427,11 +428,6 @@ class Join extends \sammo\BaseAPI
|
|||||||
'special2' => $special2
|
'special2' => $special2
|
||||||
]);
|
]);
|
||||||
$generalID = $db->insertId();
|
$generalID = $db->insertId();
|
||||||
$db->insert('general_access_log', [
|
|
||||||
GeneralAccessLogColumn::generalID->value => $generalID,
|
|
||||||
GeneralAccessLogColumn::userID->value => $userID,
|
|
||||||
GeneralAccessLogColumn::lastRefresh->value => $now,
|
|
||||||
]);
|
|
||||||
|
|
||||||
if($blockCustomGeneralName){
|
if($blockCustomGeneralName){
|
||||||
//XXX: 클래스가 이게 맞나?
|
//XXX: 클래스가 이게 맞나?
|
||||||
|
|||||||
@@ -42,12 +42,9 @@ class GeneralList extends \sammo\BaseAPI
|
|||||||
$userID = $session->userID;
|
$userID = $session->userID;
|
||||||
if ($session->isGameLoggedIn()) {
|
if ($session->isGameLoggedIn()) {
|
||||||
increaseRefresh("장수일람", 2);
|
increaseRefresh("장수일람", 2);
|
||||||
$me = $db->queryFirstRow(
|
$me = $db->queryFirstRow('SELECT con, turntime FROM general WHERE owner=%i', $userID);
|
||||||
'SELECT refresh_score, turntime FROM `general`
|
$con = checkLimit($me['con']);
|
||||||
LEFT JOIN general_access_log AS l ON `general`.no = l.general_id WHERE owner=%i', $userID
|
if ($con >= 2) {
|
||||||
);
|
|
||||||
$limitState = checkLimit($me['refresh_score']);
|
|
||||||
if ($limitState >= 2) {
|
|
||||||
return '접속 제한중입니다. 1턴 이내에 너무 많은 갱신을 하셨습니다.';
|
return '접속 제한중입니다. 1턴 이내에 너무 많은 갱신을 하셨습니다.';
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
@@ -65,8 +62,7 @@ class GeneralList extends \sammo\BaseAPI
|
|||||||
$session->setReadOnly();
|
$session->setReadOnly();
|
||||||
|
|
||||||
|
|
||||||
$rawGeneralList = $db->queryAllLists(
|
$rawGeneralList = $db->queryAllLists('SELECT owner,no,picture,imgsvr,npc,age,nation,special,special2,personal,name,owner_name as ownerName,injury,leadership,strength,intel,experience,dedication,officer_level,killturn,connect from general');
|
||||||
'SELECT owner,no,picture,imgsvr,npc,age,nation,special,special2,personal,name,owner_name as ownerName,injury,leadership,strength,intel,experience,dedication,officer_level,killturn,refresh_score_total from `general` LEFT JOIN `general_access_log` ON general.no = general_access_log.general_id');
|
|
||||||
|
|
||||||
$ownerNameList = [];
|
$ownerNameList = [];
|
||||||
if ($gameStor->isunited) {
|
if ($gameStor->isunited) {
|
||||||
@@ -77,7 +73,7 @@ class GeneralList extends \sammo\BaseAPI
|
|||||||
|
|
||||||
$generalList = [];
|
$generalList = [];
|
||||||
foreach ($rawGeneralList as $rawGeneral) {
|
foreach ($rawGeneralList as $rawGeneral) {
|
||||||
[$owner, $no, $picture, $imgsvr, $npc, $age, $nation, $special, $special2, $personal, $name, $ownerName, $injury, $leadership, $strength, $intel, $experience, $dedication, $officerLevel, $killturn, $refreshScoreTotal] = $rawGeneral;
|
[$owner, $no, $picture, $imgsvr, $npc, $age, $nation, $special, $special2, $personal, $name, $ownerName, $injury, $leadership, $strength, $intel, $experience, $dedication, $officerLevel, $killturn, $connectCnt] = $rawGeneral;
|
||||||
|
|
||||||
if (key_exists($owner, $ownerNameList)) {
|
if (key_exists($owner, $ownerNameList)) {
|
||||||
$ownerName = $ownerNameList[$owner];
|
$ownerName = $ownerNameList[$owner];
|
||||||
@@ -108,7 +104,7 @@ class GeneralList extends \sammo\BaseAPI
|
|||||||
getDed($dedication),
|
getDed($dedication),
|
||||||
getOfficerLevelText($officerLevel, $nationArr['level']),
|
getOfficerLevelText($officerLevel, $nationArr['level']),
|
||||||
$killturn,
|
$killturn,
|
||||||
$refreshScoreTotal ?: 0,
|
$connectCnt
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -133,8 +129,6 @@ class GeneralList extends \sammo\BaseAPI
|
|||||||
'honorText',
|
'honorText',
|
||||||
'dedLevelText',
|
'dedLevelText',
|
||||||
'officerLevelText',
|
'officerLevelText',
|
||||||
'killturn',
|
|
||||||
'refreshScoreTotal',
|
|
||||||
];
|
];
|
||||||
|
|
||||||
$result = [
|
$result = [
|
||||||
|
|||||||
@@ -148,16 +148,13 @@ class GetHistory extends \sammo\BaseAPI
|
|||||||
}
|
}
|
||||||
increaseRefresh("연감", 1);
|
increaseRefresh("연감", 1);
|
||||||
|
|
||||||
$me = $db->queryFirstRow(
|
$me = $db->queryFirstRow('SELECT con, turntime FROM general WHERE owner = %i', $session->userID);
|
||||||
'SELECT refresh_score, turntime FROM `general`
|
|
||||||
LEFT JOIN general_access_log AS l ON `general`.no = l.general_id WHERE owner = %i', $session->userID
|
|
||||||
);
|
|
||||||
if (!$me) {
|
if (!$me) {
|
||||||
return '장수가 사망했습니다.';
|
return '장수가 사망했습니다.';
|
||||||
}
|
}
|
||||||
|
|
||||||
$limitState = checkLimit($me['refresh_score']);
|
$con = checkLimit($me['con']);
|
||||||
if ($limitState >= 2) {
|
if ($con >= 2) {
|
||||||
return templateLimitMsg($me['turntime']);
|
return templateLimitMsg($me['turntime']);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -49,7 +49,7 @@ class BuyHiddenBuff extends \sammo\BaseAPI
|
|||||||
$type = $this->args['type'];
|
$type = $this->args['type'];
|
||||||
$level = $this->args['level'];
|
$level = $this->args['level'];
|
||||||
|
|
||||||
$general = General::createObjFromDB($generalID);
|
$general = General::createGeneralObjFromDB($generalID);
|
||||||
if ($userID != $general->getVar('owner')) {
|
if ($userID != $general->getVar('owner')) {
|
||||||
return '로그인 상태가 이상합니다. 다시 로그인해 주세요.';
|
return '로그인 상태가 이상합니다. 다시 로그인해 주세요.';
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -31,7 +31,7 @@ class BuyRandomUnique extends \sammo\BaseAPI
|
|||||||
$userID = $session->userID;
|
$userID = $session->userID;
|
||||||
$generalID = $session->generalID;
|
$generalID = $session->generalID;
|
||||||
|
|
||||||
$general = General::createObjFromDB($generalID);
|
$general = General::createGeneralObjFromDB($generalID);
|
||||||
if($userID != $general->getVar('owner')){
|
if($userID != $general->getVar('owner')){
|
||||||
return '로그인 상태가 이상합니다. 다시 로그인해 주세요.';
|
return '로그인 상태가 이상합니다. 다시 로그인해 주세요.';
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -31,7 +31,7 @@ class ResetSpecialWar extends \sammo\BaseAPI
|
|||||||
$userID = $session->userID;
|
$userID = $session->userID;
|
||||||
$generalID = $session->generalID;
|
$generalID = $session->generalID;
|
||||||
|
|
||||||
$general = General::createObjFromDB($generalID);
|
$general = General::createGeneralObjFromDB($generalID);
|
||||||
if ($userID != $general->getVar('owner')) {
|
if ($userID != $general->getVar('owner')) {
|
||||||
return '로그인 상태가 이상합니다. 다시 로그인해 주세요.';
|
return '로그인 상태가 이상합니다. 다시 로그인해 주세요.';
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -36,7 +36,7 @@ class ResetTurnTime extends \sammo\BaseAPI
|
|||||||
$userID = $session->userID;
|
$userID = $session->userID;
|
||||||
$generalID = $session->generalID;
|
$generalID = $session->generalID;
|
||||||
|
|
||||||
$general = General::createObjFromDB($generalID);
|
$general = General::createGeneralObjFromDB($generalID);
|
||||||
if ($userID != $general->getVar('owner')) {
|
if ($userID != $general->getVar('owner')) {
|
||||||
return '로그인 상태가 이상합니다. 다시 로그인해 주세요.';
|
return '로그인 상태가 이상합니다. 다시 로그인해 주세요.';
|
||||||
}
|
}
|
||||||
@@ -52,7 +52,7 @@ class ResetTurnTime extends \sammo\BaseAPI
|
|||||||
|
|
||||||
$db = DB::db();
|
$db = DB::db();
|
||||||
$gameStor = KVStorage::getStorage($db, 'game_env');
|
$gameStor = KVStorage::getStorage($db, 'game_env');
|
||||||
if ($gameStor->isunited) {
|
if($gameStor->isunited){
|
||||||
return '이미 천하가 통일되었습니다.';
|
return '이미 천하가 통일되었습니다.';
|
||||||
}
|
}
|
||||||
$inheritStor = KVStorage::getStorage($db, "inheritance_{$userID}");
|
$inheritStor = KVStorage::getStorage($db, "inheritance_{$userID}");
|
||||||
@@ -62,25 +62,36 @@ class ResetTurnTime extends \sammo\BaseAPI
|
|||||||
}
|
}
|
||||||
|
|
||||||
$gameStor = KVStorage::getStorage($db, 'game_env');
|
$gameStor = KVStorage::getStorage($db, 'game_env');
|
||||||
$turnTerm = $gameStor->getValue('turnterm');
|
[$turnTerm, $serverTurnTime] = $gameStor->getValuesAsArray(['turnterm', 'turntime']);
|
||||||
|
|
||||||
$currTurnTime = new DateTimeImmutable($general->getTurnTime());
|
$currTurnTime = new DateTimeImmutable($general->getTurnTime());
|
||||||
|
$serverTurnTimeObj = new DateTimeImmutable($serverTurnTime);
|
||||||
|
|
||||||
$rng = new RandUtil(new LiteHashDRBG(Util::simpleSerialize(
|
$rng = new RandUtil(new LiteHashDRBG(Util::simpleSerialize(
|
||||||
UniqueConst::$hiddenSeed,
|
UniqueConst::$hiddenSeed,
|
||||||
'ResetTurnTime',
|
'ResetTurnTime',
|
||||||
$userID,
|
$userID,
|
||||||
$general->getAuxVar('nextTurnTimeBase') ?? $general->getTurnTime()
|
$general->getTurnTime()
|
||||||
)));
|
)));
|
||||||
|
|
||||||
$afterTurn = $rng->nextFloat1() * $turnTerm * 60;
|
$afterTurn = $rng->nextRange($turnTerm * -60 / 2, $turnTerm * 60 / 2);
|
||||||
|
|
||||||
$userLogger = new UserLogger($userID);
|
$userLogger = new UserLogger($userID);
|
||||||
$userLogger->push(sprintf("{$reqPoint} 포인트로 턴 시간을 바꾸어 다다음 턴부터 %02d:%02d 적용", intdiv(Util::toInt($afterTurn), 60), $afterTurn % 60), "inheritPoint");
|
if($afterTurn >= 0){
|
||||||
|
$userLogger->push(sprintf("{$reqPoint} 포인트로 턴 시간을 바꾼 결과 %02d:%02d 뒤로 밀림", intdiv(Util::toInt($afterTurn), 60), $afterTurn%60), "inheritPoint");
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
$userLogger->push(sprintf("{$reqPoint} 포인트로 턴 시간을 바꾼 결과 %02d:%02d 앞으로 당김", intdiv(Util::toInt(-$afterTurn), 60), (-$afterTurn)%60), "inheritPoint");
|
||||||
|
}
|
||||||
$userLogger->flush();
|
$userLogger->flush();
|
||||||
|
|
||||||
|
$turnTime = $currTurnTime->add(TimeUtil::secondsToDateInterval($afterTurn));
|
||||||
|
if ($turnTime <= $serverTurnTimeObj && $serverTurnTimeObj <= $currTurnTime) {
|
||||||
|
$turnTime = $turnTime->add(TimeUtil::secondsToDateInterval($turnTerm * 60));
|
||||||
|
}
|
||||||
|
|
||||||
|
$general->setVar('turntime', TimeUtil::format($turnTime, true));
|
||||||
$general->setAuxVar('inheritResetTurnTime', $nextLevel);
|
$general->setAuxVar('inheritResetTurnTime', $nextLevel);
|
||||||
$general->setAuxVar('nextTurnTimeBase', $afterTurn);
|
|
||||||
$inheritStor->setValue('previous', [$previousPoint - $reqPoint, null]);
|
$inheritStor->setValue('previous', [$previousPoint - $reqPoint, null]);
|
||||||
$general->increaseRankVar(RankColumn::inherit_point_spent_dynamic, $reqPoint);
|
$general->increaseRankVar(RankColumn::inherit_point_spent_dynamic, $reqPoint);
|
||||||
$general->applyDB($db);
|
$general->applyDB($db);
|
||||||
|
|||||||
@@ -44,7 +44,7 @@ class SetNextSpecialWar extends \sammo\BaseAPI
|
|||||||
|
|
||||||
$type = $this->args['type'];
|
$type = $this->args['type'];
|
||||||
|
|
||||||
$general = General::createObjFromDB($generalID);
|
$general = General::createGeneralObjFromDB($generalID);
|
||||||
if ($userID != $general->getVar('owner')) {
|
if ($userID != $general->getVar('owner')) {
|
||||||
return '로그인 상태가 이상합니다. 다시 로그인해 주세요.';
|
return '로그인 상태가 이상합니다. 다시 로그인해 주세요.';
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -75,7 +75,7 @@ class GetOldMessage extends \sammo\BaseAPI
|
|||||||
|
|
||||||
|
|
||||||
$db = DB::db();
|
$db = DB::db();
|
||||||
$me = $db->queryFirstRow('SELECT `no`,`name`,`nation`,`officer_level`,`picture`,`imgsvr`,penalty,permission FROM general WHERE `owner`=%i', $userID);
|
$me = $db->queryFirstRow('SELECT `no`,`name`,`nation`,`officer_level`,`con`,`picture`,`imgsvr`,penalty,permission FROM general WHERE `owner`=%i', $userID);
|
||||||
|
|
||||||
if ($me === null) {
|
if ($me === null) {
|
||||||
return '장수가 사망했습니다.';
|
return '장수가 사망했습니다.';
|
||||||
|
|||||||
@@ -73,7 +73,7 @@ class GetRecentMessage extends \sammo\BaseAPI
|
|||||||
|
|
||||||
|
|
||||||
$db = DB::db();
|
$db = DB::db();
|
||||||
$me = $db->queryFirstRow('SELECT `no`,`name`,`nation`,`officer_level`,`picture`,`imgsvr`,penalty,permission FROM general WHERE `owner`=%i', $userID);
|
$me = $db->queryFirstRow('SELECT `no`,`name`,`nation`,`officer_level`,`con`,`picture`,`imgsvr`,penalty,permission FROM general WHERE `owner`=%i', $userID);
|
||||||
|
|
||||||
if ($me === null) {
|
if ($me === null) {
|
||||||
return '장수가 사망했습니다.';
|
return '장수가 사망했습니다.';
|
||||||
|
|||||||
@@ -108,7 +108,7 @@ class SendMessage extends \sammo\BaseAPI
|
|||||||
$unlimited = new \DateTime('9999-12-31');
|
$unlimited = new \DateTime('9999-12-31');
|
||||||
|
|
||||||
$db = DB::db();
|
$db = DB::db();
|
||||||
$destUser = $db->queryFirstRow('SELECT `no`,`name`,`nation`,`officer_level`,`picture`,`imgsvr`,permission,penalty FROM general WHERE `no`=%i', $destGeneralID);
|
$destUser = $db->queryFirstRow('SELECT `no`,`name`,`nation`,`officer_level`,`con`,`picture`,`imgsvr`,permission,penalty FROM general WHERE `no`=%i', $destGeneralID);
|
||||||
|
|
||||||
if (!$destUser) {
|
if (!$destUser) {
|
||||||
return '존재하지 않는 유저입니다.';
|
return '존재하지 않는 유저입니다.';
|
||||||
@@ -160,18 +160,15 @@ class SendMessage extends \sammo\BaseAPI
|
|||||||
}
|
}
|
||||||
|
|
||||||
$db = DB::db();
|
$db = DB::db();
|
||||||
$me = $db->queryFirstRow(
|
$me = $db->queryFirstRow('SELECT `no`,`name`,`nation`,`officer_level`,`con`,`picture`,`imgsvr`,penalty,permission,belong FROM general WHERE `owner`=%i', $userID);
|
||||||
'SELECT `no`,`name`,`nation`,`officer_level`,`refresh_score`,`picture`,`imgsvr`,penalty,permission,belong FROM `general`
|
|
||||||
LEFT JOIN general_access_log AS l ON `general`.no = l.general_id WHERE `owner`=%i', $userID
|
|
||||||
);
|
|
||||||
|
|
||||||
if (!$me) {
|
if (!$me) {
|
||||||
$session->logoutGame();
|
$session->logoutGame();
|
||||||
return '장수가 없습니다.';
|
return '장수가 없습니다.';
|
||||||
}
|
}
|
||||||
|
|
||||||
$limitState = checkLimit($me['refresh_score']);
|
$con = checkLimit($me['con']);
|
||||||
if ($limitState >= 2) {
|
if ($con >= 2) {
|
||||||
return '접속 제한입니다.';
|
return '접속 제한입니다.';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -3,14 +3,9 @@
|
|||||||
namespace sammo\API\Nation;
|
namespace sammo\API\Nation;
|
||||||
|
|
||||||
use ArrayObject;
|
use ArrayObject;
|
||||||
use sammo\Command\UserActionCommand;
|
|
||||||
use sammo\DB;
|
use sammo\DB;
|
||||||
use sammo\DTO\UserAction;
|
|
||||||
use sammo\Enums\APIRecoveryType;
|
use sammo\Enums\APIRecoveryType;
|
||||||
use sammo\Enums\GeneralLiteQueryMode;
|
|
||||||
use sammo\Enums\GeneralQueryMode;
|
|
||||||
use sammo\General;
|
use sammo\General;
|
||||||
use sammo\GeneralLite;
|
|
||||||
use sammo\Session;
|
use sammo\Session;
|
||||||
use sammo\Util;
|
use sammo\Util;
|
||||||
|
|
||||||
@@ -49,10 +44,12 @@ class GeneralList extends \sammo\BaseAPI
|
|||||||
'special2' => 0,
|
'special2' => 0,
|
||||||
'personal' => 0,
|
'personal' => 0,
|
||||||
'belong' => 0,
|
'belong' => 0,
|
||||||
|
'connect' => 0,
|
||||||
|
|
||||||
'troop' => 0,
|
'troop' => 0,
|
||||||
'city' => 0,
|
'city' => 0,
|
||||||
|
|
||||||
|
'con' => 1,
|
||||||
'specage' => 0,
|
'specage' => 0,
|
||||||
'specage2' => 0,
|
'specage2' => 0,
|
||||||
'leadership_exp' => 1,
|
'leadership_exp' => 1,
|
||||||
@@ -86,11 +83,6 @@ class GeneralList extends \sammo\BaseAPI
|
|||||||
|
|
||||||
'owner_name' => 9, //안씀.
|
'owner_name' => 9, //안씀.
|
||||||
|
|
||||||
|
|
||||||
//accessLog
|
|
||||||
'refresh_score_total' => 0,
|
|
||||||
'refresh_score' => 1,
|
|
||||||
|
|
||||||
//RANK
|
//RANK
|
||||||
'warnum' => 1,
|
'warnum' => 1,
|
||||||
'killnum' => 1,
|
'killnum' => 1,
|
||||||
@@ -103,8 +95,6 @@ class GeneralList extends \sammo\BaseAPI
|
|||||||
static $columnRemap = [
|
static $columnRemap = [
|
||||||
'special' => 'specialDomestic',
|
'special' => 'specialDomestic',
|
||||||
'special2' => 'specialWar',
|
'special2' => 'specialWar',
|
||||||
'refresh_score_total' => 'refreshScoreTotal',
|
|
||||||
'refresh_score' => 'refreshScore',
|
|
||||||
'aux' => null,
|
'aux' => null,
|
||||||
];
|
];
|
||||||
|
|
||||||
@@ -119,9 +109,6 @@ class GeneralList extends \sammo\BaseAPI
|
|||||||
'reservedCommand' => 1,
|
'reservedCommand' => 1,
|
||||||
|
|
||||||
'autorun_limit' => 1,
|
'autorun_limit' => 1,
|
||||||
|
|
||||||
'impossibleUserAction' => 1,
|
|
||||||
'reservedUserAction' => 1,
|
|
||||||
];
|
];
|
||||||
|
|
||||||
public function validateArgs(): ?string
|
public function validateArgs(): ?string
|
||||||
@@ -156,13 +143,9 @@ class GeneralList extends \sammo\BaseAPI
|
|||||||
$gameStor = \sammo\KVStorage::getStorage($db, 'game_env');
|
$gameStor = \sammo\KVStorage::getStorage($db, 'game_env');
|
||||||
$env = $gameStor->getValues(['year', 'month', 'turntime', 'turnterm', 'autorun_user', 'killturn']);
|
$env = $gameStor->getValues(['year', 'month', 'turntime', 'turnterm', 'autorun_user', 'killturn']);
|
||||||
|
|
||||||
$me = $db->queryFirstRow(
|
$me = $db->queryFirstRow('SELECT con, turntime, belong, nation, officer_level, permission, penalty FROM general WHERE owner=%i', $session->getUserID());
|
||||||
'SELECT refresh_score, turntime, belong, nation, officer_level, permission, penalty FROM `general`
|
$con = checkLimit($me['con']);
|
||||||
LEFT JOIN general_access_log AS l ON `general`.no = l.general_id WHERE owner=%i',
|
if ($con >= 2) {
|
||||||
$session->getUserID()
|
|
||||||
);
|
|
||||||
$limitState = checkLimit($me['refresh_score']);
|
|
||||||
if ($limitState >= 2) {
|
|
||||||
return '접속 제한중입니다. 1턴 이내에 너무 많은 갱신을 하셨습니다.';
|
return '접속 제한중입니다. 1턴 이내에 너무 많은 갱신을 하셨습니다.';
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -173,18 +156,9 @@ class GeneralList extends \sammo\BaseAPI
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
[$queryColumns, $rankColumns, $accessLogColumns] = GeneralLite::mergeQueryColumn(array_keys(static::$viewColumns), GeneralLiteQueryMode::Lite);
|
[$queryColumns, $rankColumns] = General::mergeQueryColumn(array_keys(static::$viewColumns), 1);
|
||||||
|
|
||||||
$rawGeneralList = Util::convertArrayToDict(
|
$rawGeneralList = Util::convertArrayToDict($db->query('SELECT %l from general WHERE nation = %i ORDER BY turntime ASC', Util::formatListOfBackticks($queryColumns), $nationID), 'no');
|
||||||
$db->query(
|
|
||||||
'SELECT %l, %l from `general` LEFT JOIN general_access_log
|
|
||||||
ON `general`.`no` = general_access_log.general_id WHERE nation = %i ORDER BY turntime ASC',
|
|
||||||
Util::formatListOfBackticks($queryColumns),
|
|
||||||
Util::formatListOfBackticks($accessLogColumns),
|
|
||||||
$nationID
|
|
||||||
),
|
|
||||||
'no'
|
|
||||||
);
|
|
||||||
|
|
||||||
/** @var ArrayObject[] */
|
/** @var ArrayObject[] */
|
||||||
$troops = [];
|
$troops = [];
|
||||||
@@ -205,19 +179,19 @@ class GeneralList extends \sammo\BaseAPI
|
|||||||
if ($this->permission >= 1 || count($troops)) {
|
if ($this->permission >= 1 || count($troops)) {
|
||||||
$reservedCommandTargetGeneralIDList = [];
|
$reservedCommandTargetGeneralIDList = [];
|
||||||
|
|
||||||
if ($this->permission >= 1) {
|
if($this->permission >= 1){
|
||||||
foreach ($rawGeneralList as $rawGeneral) {
|
foreach ($rawGeneralList as $rawGeneral) {
|
||||||
if ($rawGeneral['npc'] < 2) {
|
if ($rawGeneral['npc'] < 2) {
|
||||||
$reservedCommandTargetGeneralIDList[$rawGeneral['no']] = $rawGeneral['no'];
|
$reservedCommandTargetGeneralIDList[$rawGeneral['no']] = $rawGeneral['no'];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
foreach ($troops as $troop) {
|
foreach($troops as $troop){
|
||||||
$reservedCommandTargetGeneralIDList[$troop['id']] = $troop['id'];
|
$reservedCommandTargetGeneralIDList[$troop['id']] = $troop['id'];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
if ($reservedCommandTargetGeneralIDList) {
|
if($reservedCommandTargetGeneralIDList){
|
||||||
$rawTurnList = $db->query(
|
$rawTurnList = $db->query(
|
||||||
'SELECT general_id, turn_idx, action, arg, brief FROM general_turn WHERE general_id IN %li AND turn_idx < 5 ORDER BY general_id asc, turn_idx asc',
|
'SELECT general_id, turn_idx, action, arg, brief FROM general_turn WHERE general_id IN %li AND turn_idx < 5 ORDER BY general_id asc, turn_idx asc',
|
||||||
array_values($reservedCommandTargetGeneralIDList)
|
array_values($reservedCommandTargetGeneralIDList)
|
||||||
@@ -275,50 +249,6 @@ class GeneralList extends \sammo\BaseAPI
|
|||||||
'bill' => fn ($rawGeneral) => getBillByLevel($rawGeneral['dedlevel']),
|
'bill' => fn ($rawGeneral) => getBillByLevel($rawGeneral['dedlevel']),
|
||||||
'reservedCommand' => fn ($rawGeneral) => $reservedCommand[$rawGeneral['no']] ?? null,
|
'reservedCommand' => fn ($rawGeneral) => $reservedCommand[$rawGeneral['no']] ?? null,
|
||||||
'autorun_limit' => fn ($rawGeneral) => ($rawGeneral['aux'] ?? [])['autorun_limit'] ?? 0,
|
'autorun_limit' => fn ($rawGeneral) => ($rawGeneral['aux'] ?? [])['autorun_limit'] ?? 0,
|
||||||
'impossibleUserAction' => function ($rawGeneral) use ($env) {
|
|
||||||
$rawUserAction = ($rawGeneral['aux'] ?? [])[UserActionCommand::USER_ACTION_KEY] ?? [];
|
|
||||||
$userAction = UserAction::fromArray($rawUserAction);
|
|
||||||
$impossibleUserAction = [];
|
|
||||||
$yearMonth = Util::joinYearMonth($env['year'], $env['month']);
|
|
||||||
|
|
||||||
if ($userAction->nextAvailableTurn) {
|
|
||||||
foreach ($userAction->nextAvailableTurn as $command => $nextAvailableTurn) {
|
|
||||||
if ($nextAvailableTurn > $yearMonth) {
|
|
||||||
$impossibleUserAction[] = [$command, $nextAvailableTurn - $yearMonth];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return $impossibleUserAction;
|
|
||||||
},
|
|
||||||
'reservedUserAction' => function ($rawGeneral) use ($env) {
|
|
||||||
$rawUserAction = ($rawGeneral['aux'] ?? [])[UserActionCommand::USER_ACTION_KEY] ?? [];
|
|
||||||
$userAction = UserAction::fromArray($rawUserAction);
|
|
||||||
$reservedUserAction = [];
|
|
||||||
|
|
||||||
$emptyTurnObj = [
|
|
||||||
'brief' => '휴식',
|
|
||||||
'action' => '휴식',
|
|
||||||
'arg' => [],
|
|
||||||
];
|
|
||||||
|
|
||||||
for($i = 0; $i < 5; $i++){
|
|
||||||
$reservedUserAction[] = $emptyTurnObj;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ($userAction->reserved) {
|
|
||||||
foreach ($userAction->reserved as $turnIdx => $reserved) {
|
|
||||||
if($turnIdx >= 5){
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
$reservedUserAction[$turnIdx] = [
|
|
||||||
'brief' => $reserved->brief,
|
|
||||||
'action' => $reserved->command,
|
|
||||||
'arg' => [],
|
|
||||||
];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return $reservedUserAction;
|
|
||||||
},
|
|
||||||
];
|
];
|
||||||
|
|
||||||
foreach ($rankColumns as $rankKey) {
|
foreach ($rankColumns as $rankKey) {
|
||||||
@@ -348,11 +278,11 @@ class GeneralList extends \sammo\BaseAPI
|
|||||||
$resultColumns[$column] = $column;
|
$resultColumns[$column] = $column;
|
||||||
}
|
}
|
||||||
|
|
||||||
foreach ($troops as $troop) {
|
foreach ($troops as $troop){
|
||||||
$troopLeaderID = $troop['id'];
|
$troopLeaderID = $troop['id'];
|
||||||
$troop['reservedCommand'] = array_map(function ($turnObj) {
|
$troop['reservedCommand'] = array_map(function($turnObj){
|
||||||
$brief = $turnObj['brief'];
|
$brief = $turnObj['brief'];
|
||||||
if ($brief == '집합') {
|
if($brief == '집합'){
|
||||||
return $brief;
|
return $brief;
|
||||||
}
|
}
|
||||||
return '-';
|
return '-';
|
||||||
|
|||||||
@@ -109,12 +109,10 @@ class GetGeneralLog extends \sammo\BaseAPI
|
|||||||
$reqTo = $this->args['reqTo'] ?? null;
|
$reqTo = $this->args['reqTo'] ?? null;
|
||||||
|
|
||||||
$db = DB::db();
|
$db = DB::db();
|
||||||
$me = $db->queryFirstRow(
|
$me = $db->queryFirstRow('SELECT no,nation,officer_level,con,turntime,belong,permission,penalty from general where owner=%i', $userID);
|
||||||
'SELECT no,nation,officer_level,refresh_score,turntime,belong,permission,penalty FROM `general`
|
|
||||||
LEFT JOIN general_access_log AS l ON `general`.no = l.general_id WHERE owner=%i', $userID);
|
|
||||||
|
|
||||||
$limitState = checkLimit($me['refresh_score']);
|
$con = checkLimit($me['con']);
|
||||||
if ($limitState >= 2) {
|
if ($con >= 2) {
|
||||||
return '접속 제한입니다.';
|
return '접속 제한입니다.';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -4,7 +4,6 @@ namespace sammo\API\Nation;
|
|||||||
|
|
||||||
use sammo\DB;
|
use sammo\DB;
|
||||||
use sammo\Enums\APIRecoveryType;
|
use sammo\Enums\APIRecoveryType;
|
||||||
use sammo\Enums\GeneralQueryMode;
|
|
||||||
use sammo\GameConst;
|
use sammo\GameConst;
|
||||||
use sammo\General;
|
use sammo\General;
|
||||||
use sammo\KVStorage;
|
use sammo\KVStorage;
|
||||||
@@ -14,6 +13,14 @@ use sammo\Util;
|
|||||||
use sammo\Validator;
|
use sammo\Validator;
|
||||||
|
|
||||||
use function sammo\buildNationCommandClass;
|
use function sammo\buildNationCommandClass;
|
||||||
|
use function sammo\checkLimit;
|
||||||
|
use function sammo\checkSecretPermission;
|
||||||
|
use function sammo\getBattleDetailLogMore;
|
||||||
|
use function sammo\getBattleResultMore;
|
||||||
|
use function sammo\getBattleResultRecent;
|
||||||
|
use function sammo\getGeneralActionLogMore;
|
||||||
|
use function sammo\getGeneralActionLogRecent;
|
||||||
|
use function sammo\getGeneralHistoryLogAll;
|
||||||
use function sammo\getNationStaticInfo;
|
use function sammo\getNationStaticInfo;
|
||||||
|
|
||||||
class GetNationInfo extends \sammo\BaseAPI
|
class GetNationInfo extends \sammo\BaseAPI
|
||||||
@@ -58,7 +65,7 @@ class GetNationInfo extends \sammo\BaseAPI
|
|||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
$generalObj = General::createObjFromDB($session->generalID);
|
$generalObj = General::createGeneralObjFromDB($session->generalID, null, 1);
|
||||||
|
|
||||||
$gameStor = KVStorage::getStorage($db, 'game_env');
|
$gameStor = KVStorage::getStorage($db, 'game_env');
|
||||||
$gameEnv = $gameStor->getValues(['year', 'month', 'startyear']);
|
$gameEnv = $gameStor->getValues(['year', 'month', 'startyear']);
|
||||||
|
|||||||
@@ -6,13 +6,11 @@ use sammo\Session;
|
|||||||
use DateTimeInterface;
|
use DateTimeInterface;
|
||||||
use sammo\DB;
|
use sammo\DB;
|
||||||
use sammo\Enums\APIRecoveryType;
|
use sammo\Enums\APIRecoveryType;
|
||||||
use sammo\Enums\GeneralQueryMode;
|
|
||||||
use sammo\GameConst;
|
use sammo\GameConst;
|
||||||
use sammo\General;
|
use sammo\General;
|
||||||
use sammo\Json;
|
use sammo\Json;
|
||||||
use sammo\KVStorage;
|
use sammo\KVStorage;
|
||||||
use sammo\TimeUtil;
|
use sammo\TimeUtil;
|
||||||
use sammo\Util;
|
|
||||||
|
|
||||||
use function sammo\checkLimit;
|
use function sammo\checkLimit;
|
||||||
use function sammo\checkSecretPermission;
|
use function sammo\checkSecretPermission;
|
||||||
@@ -41,16 +39,12 @@ class GetReservedCommand extends \sammo\BaseAPI
|
|||||||
$gameStor = KVStorage::getStorage($db, 'game_env');
|
$gameStor = KVStorage::getStorage($db, 'game_env');
|
||||||
$userID = $session->userID;
|
$userID = $session->userID;
|
||||||
|
|
||||||
$me = $db->queryFirstRow(
|
$me = $db->queryFirstRow('SELECT no,nation,officer_level,con,turntime,belong,penalty,permission FROM general WHERE owner=%i', $userID);
|
||||||
'SELECT no,nation,officer_level,refresh_score,turntime,belong,penalty,permission FROM `general`
|
|
||||||
LEFT JOIN general_access_log AS l ON `general`.no = l.general_id WHERE owner=%i',
|
|
||||||
$userID
|
|
||||||
);
|
|
||||||
|
|
||||||
$nationLevel = $db->queryFirstField('SELECT level FROM nation WHERE nation = %i', $me['nation']);
|
$nationLevel = $db->queryFirstField('SELECT level FROM nation WHERE nation = %i', $me['nation']);
|
||||||
$nationID = $me['nation'];
|
$nationID = $me['nation'];
|
||||||
$limitState = checkLimit($me['refresh_score']);
|
$con = checkLimit($me['con']);
|
||||||
if ($limitState >= 2) {
|
if ($con >= 2) {
|
||||||
return "접속 제한중입니다. 1턴 이내에 너무 많은 갱신을 하셨습니다. (다음 갱신 가능 시각 : {$me['turntime']})";
|
return "접속 제한중입니다. 1턴 이내에 너무 많은 갱신을 하셨습니다. (다음 갱신 가능 시각 : {$me['turntime']})";
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -64,12 +58,8 @@ class GetReservedCommand extends \sammo\BaseAPI
|
|||||||
[$turnTerm, $year, $month, $lastExecute] = $gameStor->getValuesAsArray(['turnterm', 'year', 'month', 'turntime']);
|
[$turnTerm, $year, $month, $lastExecute] = $gameStor->getValuesAsArray(['turnterm', 'year', 'month', 'turntime']);
|
||||||
|
|
||||||
$generals = [];
|
$generals = [];
|
||||||
foreach ($db->query(
|
foreach ($db->query('SELECT no,name,turntime,npc,city,nation,officer_level FROM general WHERE nation = %i AND officer_level >= 5', $nationID) as $rawGeneral) {
|
||||||
'SELECT %l FROM general WHERE nation = %i AND officer_level >= 5',
|
$generals[$rawGeneral['officer_level']] = new General($rawGeneral, null, null, null, $year, $month, false);
|
||||||
Util::formatListOfBackticks(General::mergeQueryColumn()[0]),
|
|
||||||
$nationID
|
|
||||||
) as $rawGeneral) {
|
|
||||||
$generals[$rawGeneral['officer_level']] = new General($rawGeneral, null, null, null, null, $year, $month, false);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
$nationTurnList = [];
|
$nationTurnList = [];
|
||||||
@@ -119,7 +109,7 @@ class GetReservedCommand extends \sammo\BaseAPI
|
|||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
$generalObj = General::createObjFromDB($session->generalID);
|
$generalObj = General::createGeneralObjFromDB($session->generalID);
|
||||||
|
|
||||||
|
|
||||||
return [
|
return [
|
||||||
|
|||||||
@@ -6,10 +6,7 @@ use DateTimeInterface;
|
|||||||
use sammo\DB;
|
use sammo\DB;
|
||||||
use sammo\DTO\VoteComment;
|
use sammo\DTO\VoteComment;
|
||||||
use sammo\Enums\APIRecoveryType;
|
use sammo\Enums\APIRecoveryType;
|
||||||
use sammo\Enums\GeneralLiteQueryMode;
|
|
||||||
use sammo\Enums\GeneralQueryMode;
|
|
||||||
use sammo\General;
|
use sammo\General;
|
||||||
use sammo\GeneralLite;
|
|
||||||
use sammo\Session;
|
use sammo\Session;
|
||||||
use sammo\TimeUtil;
|
use sammo\TimeUtil;
|
||||||
use sammo\Validator;
|
use sammo\Validator;
|
||||||
@@ -43,7 +40,7 @@ class AddComment extends \sammo\BaseAPI
|
|||||||
$text = mb_substr($this->args['text'], 0, 200);
|
$text = mb_substr($this->args['text'], 0, 200);
|
||||||
|
|
||||||
$generalID = $session->generalID;
|
$generalID = $session->generalID;
|
||||||
$general = GeneralLite::createObjFromDB($generalID, null, GeneralLiteQueryMode::Core);
|
$general = General::createGeneralObjFromDB($generalID, [], 0);
|
||||||
$generalName = $general->getName();
|
$generalName = $general->getName();
|
||||||
$nationID = $general->getNationID();
|
$nationID = $general->getNationID();
|
||||||
$nationName = $general->getStaticNation()['name'];
|
$nationName = $general->getStaticNation()['name'];
|
||||||
|
|||||||
@@ -6,7 +6,6 @@ use DateTimeInterface;
|
|||||||
use sammo\DB;
|
use sammo\DB;
|
||||||
use sammo\DTO\VoteInfo;
|
use sammo\DTO\VoteInfo;
|
||||||
use sammo\Enums\APIRecoveryType;
|
use sammo\Enums\APIRecoveryType;
|
||||||
use sammo\Enums\GeneralQueryMode;
|
|
||||||
use sammo\General;
|
use sammo\General;
|
||||||
use sammo\Json;
|
use sammo\Json;
|
||||||
use sammo\KVStorage;
|
use sammo\KVStorage;
|
||||||
@@ -106,7 +105,7 @@ class Vote extends \sammo\BaseAPI
|
|||||||
$gameStor = KVStorage::getStorage($db, 'game_env');
|
$gameStor = KVStorage::getStorage($db, 'game_env');
|
||||||
$voteReward = $gameStor->getValue('develcost') * 5;
|
$voteReward = $gameStor->getValue('develcost') * 5;
|
||||||
|
|
||||||
$general = General::createObjFromDB($generalID, null, GeneralQueryMode::Full);
|
$general = General::createGeneralObjFromDB($generalID, ['gold', 'horse', 'weapon', 'book', 'item', 'npc', 'imgsvr', 'picture', 'aux'], 2);
|
||||||
$general->increaseVar('gold', $voteReward);
|
$general->increaseVar('gold', $voteReward);
|
||||||
$uniqueRng = new RandUtil(new LiteHashDRBG(Util::simpleSerialize(
|
$uniqueRng = new RandUtil(new LiteHashDRBG(Util::simpleSerialize(
|
||||||
UniqueConst::$hiddenSeed,
|
UniqueConst::$hiddenSeed,
|
||||||
|
|||||||
@@ -1,19 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
namespace sammo\ActionBuff;
|
|
||||||
|
|
||||||
use sammo\General;
|
|
||||||
use \sammo\iAction;
|
|
||||||
|
|
||||||
class g65_계략성공 implements iAction
|
|
||||||
{
|
|
||||||
use \sammo\DefaultAction;
|
|
||||||
|
|
||||||
function onCalcDomestic(string $turnType, string $varType, float $value, $aux = null): float
|
|
||||||
{
|
|
||||||
if($turnType == '계략'){
|
|
||||||
if($varType == 'success') return $value + 20;
|
|
||||||
}
|
|
||||||
return $value;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,21 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
namespace sammo\ActionBuff;
|
|
||||||
|
|
||||||
use sammo\General;
|
|
||||||
use \sammo\iAction;
|
|
||||||
|
|
||||||
class g65_내정성공 implements iAction
|
|
||||||
{
|
|
||||||
use \sammo\DefaultAction;
|
|
||||||
|
|
||||||
static protected $target = ['상업', '농업', '치안', '기술', '인구', '성벽', '수비', '민심'];
|
|
||||||
|
|
||||||
function onCalcDomestic(string $turnType, string $varType, float $value, $aux = null): float
|
|
||||||
{
|
|
||||||
if ($varType == 'success' && in_array($turnType, static::$target)) {
|
|
||||||
return $value + 1;
|
|
||||||
}
|
|
||||||
return $value;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,19 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
namespace sammo\ActionBuff;
|
|
||||||
|
|
||||||
use sammo\General;
|
|
||||||
use \sammo\iAction;
|
|
||||||
|
|
||||||
class g65_사기40 implements iAction
|
|
||||||
{
|
|
||||||
use \sammo\DefaultAction;
|
|
||||||
|
|
||||||
function onCalcStat(General $general, string $statName, $value, $aux = null)
|
|
||||||
{
|
|
||||||
if ($statName == 'bonusAtmos') {
|
|
||||||
return $value + 40;
|
|
||||||
}
|
|
||||||
return $value;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,60 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
namespace sammo\ActionBuff;
|
|
||||||
|
|
||||||
use sammo\GameUnitConst;
|
|
||||||
use sammo\General;
|
|
||||||
use \sammo\iAction;
|
|
||||||
|
|
||||||
class g65_전투순위보정 implements iAction
|
|
||||||
{
|
|
||||||
use \sammo\DefaultAction;
|
|
||||||
|
|
||||||
function onCalcStat(General $defender, string $statName, $value, $aux = null)
|
|
||||||
{
|
|
||||||
//방어자 입장에서 coef가 높다면 전투순위를 높인다.
|
|
||||||
if ($statName == 'battleOrder') {
|
|
||||||
if ($aux === null) throw new \RuntimeException('전투순위보정에 필요한 aux가 없습니다.');
|
|
||||||
/** @var General */
|
|
||||||
$attacker = $aux['attacker'];
|
|
||||||
$defenderCrewType = $defender->getCrewTypeObj();
|
|
||||||
$attackerCrewType = $attacker->getCrewTypeObj();
|
|
||||||
|
|
||||||
$attackerCoef = $attackerCrewType->getAttackCoef($defenderCrewType) * $defenderCrewType->getDefenceCoef($attackerCrewType);
|
|
||||||
$defenderCoef = $defenderCrewType->getAttackCoef($attackerCrewType) * $attackerCrewType->getDefenceCoef($defenderCrewType);
|
|
||||||
|
|
||||||
if ($attackerCoef < $defenderCoef) {
|
|
||||||
return $value * 4;
|
|
||||||
} else if ($attackerCoef > $defenderCoef) {
|
|
||||||
return $value / 2;
|
|
||||||
} else if ($attackerCrewType->armType == $defenderCrewType->armType) {
|
|
||||||
return $value * 2;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return $value;
|
|
||||||
}
|
|
||||||
|
|
||||||
function onCalcOpposeStat(General $defender, string $statName, $value, $aux = null)
|
|
||||||
{
|
|
||||||
//공격자 입장에서 coef가 높다면 전투순위를 높인다.
|
|
||||||
if ($statName == 'battleOrder') {
|
|
||||||
if ($aux === null) throw new \RuntimeException('전투순위보정에 필요한 aux가 없습니다.');
|
|
||||||
/** @var General */
|
|
||||||
$attacker = $aux['attacker'];
|
|
||||||
$defenderCrewType = $defender->getCrewTypeObj();
|
|
||||||
$attackerCrewType = $attacker->getCrewTypeObj();
|
|
||||||
|
|
||||||
$attackerCoef = $attackerCrewType->getAttackCoef($defenderCrewType) * $defenderCrewType->getDefenceCoef($attackerCrewType);
|
|
||||||
$defenderCoef = $defenderCrewType->getAttackCoef($attackerCrewType) * $attackerCrewType->getDefenceCoef($defenderCrewType);
|
|
||||||
|
|
||||||
if ($attackerCoef > $defenderCoef) {
|
|
||||||
return $value * 4;
|
|
||||||
} else if ($attackerCoef < $defenderCoef) {
|
|
||||||
return $value / 2;
|
|
||||||
} else if ($attackerCrewType->armType == $defenderCrewType->armType) {
|
|
||||||
return $value * 2;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return $value;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,19 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
namespace sammo\ActionBuff;
|
|
||||||
|
|
||||||
use \sammo\iAction;
|
|
||||||
|
|
||||||
class g65_징병비용무시 implements iAction
|
|
||||||
{
|
|
||||||
use \sammo\DefaultAction;
|
|
||||||
|
|
||||||
public function onCalcDomestic(string $turnType, string $varType, float $value, $aux = null): float
|
|
||||||
{
|
|
||||||
if ($varType == 'cost' && in_array($turnType, ['징병', '모병'])) {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
return $value;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,19 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
namespace sammo\ActionBuff;
|
|
||||||
|
|
||||||
use \sammo\iAction;
|
|
||||||
|
|
||||||
class g65_징병인구무시 implements iAction
|
|
||||||
{
|
|
||||||
use \sammo\DefaultAction;
|
|
||||||
|
|
||||||
public function onCalcDomestic(string $turnType, string $varType, float $value, $aux = null): float
|
|
||||||
{
|
|
||||||
if ($turnType == '징집인구' && $varType == 'score') {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
return $value;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,12 +0,0 @@
|
|||||||
<?php
|
|
||||||
namespace sammo\ActionCrewType;
|
|
||||||
use \sammo\iAction;
|
|
||||||
use \sammo\General;
|
|
||||||
|
|
||||||
class None implements iAction{
|
|
||||||
use \sammo\DefaultAction;
|
|
||||||
|
|
||||||
protected $id = -1;
|
|
||||||
protected $name = '-';
|
|
||||||
protected $info = '';
|
|
||||||
}
|
|
||||||
@@ -1,20 +0,0 @@
|
|||||||
<?php
|
|
||||||
namespace sammo\ActionCrewType;
|
|
||||||
use \sammo\iAction;
|
|
||||||
use \sammo\General;
|
|
||||||
|
|
||||||
class che_성벽선제 implements iAction{
|
|
||||||
use \sammo\DefaultAction;
|
|
||||||
|
|
||||||
protected $name = '성벽선제';
|
|
||||||
protected $info = '전투 가능한 성벽이라면 선제공격을 합니다.';
|
|
||||||
|
|
||||||
public function onCalcOpposeStat(General $general, string $statName, $value, $aux = null)
|
|
||||||
{
|
|
||||||
if($statName == 'cityBattleOrder'){
|
|
||||||
// battleOrder는 스탯과 유사한 수치를 가지므로, 아주 충분히 높은값을 설정한다.
|
|
||||||
return 10000;
|
|
||||||
}
|
|
||||||
return $value;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -21,7 +21,7 @@ class che_무기_02_단궁 extends \sammo\BaseStatItem{
|
|||||||
public function getBattlePhaseSkillTriggerList(WarUnit $unit):?WarUnitTriggerCaller{
|
public function getBattlePhaseSkillTriggerList(WarUnit $unit):?WarUnitTriggerCaller{
|
||||||
return new WarUnitTriggerCaller(
|
return new WarUnitTriggerCaller(
|
||||||
new che_저격시도($unit, che_저격시도::TYPE_ITEM + che_저격시도::TYPE_DEDUP_TYPE_BASE * 102, 0.01, 10, 30),
|
new che_저격시도($unit, che_저격시도::TYPE_ITEM + che_저격시도::TYPE_DEDUP_TYPE_BASE * 102, 0.01, 10, 30),
|
||||||
new che_저격발동($unit, che_저격시도::TYPE_ITEM + che_저격시도::TYPE_DEDUP_TYPE_BASE * 102)
|
new che_저격발동($unit, che_저격발동::TYPE_ITEM)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -20,7 +20,7 @@ class che_무기_07_맥궁 extends \sammo\BaseStatItem{
|
|||||||
public function getBattlePhaseSkillTriggerList(WarUnit $unit):?WarUnitTriggerCaller{
|
public function getBattlePhaseSkillTriggerList(WarUnit $unit):?WarUnitTriggerCaller{
|
||||||
return new WarUnitTriggerCaller(
|
return new WarUnitTriggerCaller(
|
||||||
new che_저격시도($unit, che_저격시도::TYPE_ITEM + che_저격시도::TYPE_DEDUP_TYPE_BASE * 107, 0.2, 20, 40),
|
new che_저격시도($unit, che_저격시도::TYPE_ITEM + che_저격시도::TYPE_DEDUP_TYPE_BASE * 107, 0.2, 20, 40),
|
||||||
new che_저격발동($unit, che_저격시도::TYPE_ITEM + che_저격시도::TYPE_DEDUP_TYPE_BASE * 107)
|
new che_저격발동($unit, che_저격발동::TYPE_ITEM)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -20,7 +20,7 @@ class che_무기_09_동호비궁 extends \sammo\BaseStatItem{
|
|||||||
public function getBattlePhaseSkillTriggerList(WarUnit $unit):?WarUnitTriggerCaller{
|
public function getBattlePhaseSkillTriggerList(WarUnit $unit):?WarUnitTriggerCaller{
|
||||||
return new WarUnitTriggerCaller(
|
return new WarUnitTriggerCaller(
|
||||||
new che_저격시도($unit, che_저격시도::TYPE_ITEM + che_저격시도::TYPE_DEDUP_TYPE_BASE * 109, 0.2, 20, 40, 20),
|
new che_저격시도($unit, che_저격시도::TYPE_ITEM + che_저격시도::TYPE_DEDUP_TYPE_BASE * 109, 0.2, 20, 40, 20),
|
||||||
new che_저격발동($unit, che_저격시도::TYPE_ITEM + che_저격시도::TYPE_DEDUP_TYPE_BASE * 109)
|
new che_저격발동($unit, che_저격발동::TYPE_ITEM)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -20,7 +20,7 @@ class che_무기_11_이광궁 extends \sammo\BaseStatItem{
|
|||||||
public function getBattlePhaseSkillTriggerList(WarUnit $unit):?WarUnitTriggerCaller{
|
public function getBattlePhaseSkillTriggerList(WarUnit $unit):?WarUnitTriggerCaller{
|
||||||
return new WarUnitTriggerCaller(
|
return new WarUnitTriggerCaller(
|
||||||
new che_저격시도($unit, che_저격시도::TYPE_ITEM + che_저격시도::TYPE_DEDUP_TYPE_BASE * 111, 0.10, 20, 40, 10),
|
new che_저격시도($unit, che_저격시도::TYPE_ITEM + che_저격시도::TYPE_DEDUP_TYPE_BASE * 111, 0.10, 20, 40, 10),
|
||||||
new che_저격발동($unit, che_저격시도::TYPE_ITEM + che_저격시도::TYPE_DEDUP_TYPE_BASE * 111)
|
new che_저격발동($unit, che_저격발동::TYPE_ITEM)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -20,7 +20,7 @@ class che_무기_13_양유기궁 extends \sammo\BaseStatItem{
|
|||||||
public function getBattlePhaseSkillTriggerList(WarUnit $unit):?WarUnitTriggerCaller{
|
public function getBattlePhaseSkillTriggerList(WarUnit $unit):?WarUnitTriggerCaller{
|
||||||
return new WarUnitTriggerCaller(
|
return new WarUnitTriggerCaller(
|
||||||
new che_저격시도($unit, che_저격시도::TYPE_ITEM + che_저격시도::TYPE_DEDUP_TYPE_BASE * 113, 0.1, 20, 40, 10),
|
new che_저격시도($unit, che_저격시도::TYPE_ITEM + che_저격시도::TYPE_DEDUP_TYPE_BASE * 113, 0.1, 20, 40, 10),
|
||||||
new che_저격발동($unit, che_저격시도::TYPE_ITEM + che_저격시도::TYPE_DEDUP_TYPE_BASE * 113)
|
new che_저격발동($unit, che_저격발동::TYPE_ITEM)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -21,7 +21,7 @@ class che_저격_매화수전 extends \sammo\BaseItem{
|
|||||||
public function getBattlePhaseSkillTriggerList(WarUnit $unit):?WarUnitTriggerCaller{
|
public function getBattlePhaseSkillTriggerList(WarUnit $unit):?WarUnitTriggerCaller{
|
||||||
return new WarUnitTriggerCaller(
|
return new WarUnitTriggerCaller(
|
||||||
new che_저격시도($unit, che_저격시도::TYPE_ITEM+BaseWarUnitTrigger::TYPE_DEDUP_TYPE_BASE*304, 0.5, 20, 40),
|
new che_저격시도($unit, che_저격시도::TYPE_ITEM+BaseWarUnitTrigger::TYPE_DEDUP_TYPE_BASE*304, 0.5, 20, 40),
|
||||||
new che_저격발동($unit, che_저격시도::TYPE_ITEM+BaseWarUnitTrigger::TYPE_DEDUP_TYPE_BASE*304)
|
new che_저격발동($unit, che_저격발동::TYPE_ITEM)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -21,7 +21,7 @@ class che_저격_비도 extends \sammo\BaseItem{
|
|||||||
public function getBattlePhaseSkillTriggerList(WarUnit $unit):?WarUnitTriggerCaller{
|
public function getBattlePhaseSkillTriggerList(WarUnit $unit):?WarUnitTriggerCaller{
|
||||||
return new WarUnitTriggerCaller(
|
return new WarUnitTriggerCaller(
|
||||||
new che_저격시도($unit, che_저격시도::TYPE_ITEM+BaseWarUnitTrigger::TYPE_DEDUP_TYPE_BASE*305, 0.5, 20, 40),
|
new che_저격시도($unit, che_저격시도::TYPE_ITEM+BaseWarUnitTrigger::TYPE_DEDUP_TYPE_BASE*305, 0.5, 20, 40),
|
||||||
new che_저격발동($unit, che_저격시도::TYPE_ITEM+BaseWarUnitTrigger::TYPE_DEDUP_TYPE_BASE*305)
|
new che_저격발동($unit, che_저격발동::TYPE_ITEM)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -18,7 +18,7 @@ class che_저격_수극 extends \sammo\BaseItem{
|
|||||||
protected $buyable = true;
|
protected $buyable = true;
|
||||||
protected $reqSecu = 1000;
|
protected $reqSecu = 1000;
|
||||||
|
|
||||||
public function getBattlePhaseSkillTriggerList(WarUnit $unit):?WarUnitTriggerCaller{
|
public function getBattleInitSkillTriggerList(WarUnit $unit):?WarUnitTriggerCaller{
|
||||||
return new WarUnitTriggerCaller(
|
return new WarUnitTriggerCaller(
|
||||||
new che_저격시도($unit, BaseWarUnitTrigger::TYPE_CONSUMABLE_ITEM, 1, 20, 40),
|
new che_저격시도($unit, BaseWarUnitTrigger::TYPE_CONSUMABLE_ITEM, 1, 20, 40),
|
||||||
new che_저격발동($unit, BaseWarUnitTrigger::TYPE_CONSUMABLE_ITEM)
|
new che_저격발동($unit, BaseWarUnitTrigger::TYPE_CONSUMABLE_ITEM)
|
||||||
|
|||||||
@@ -31,7 +31,7 @@ class che_병가 extends \sammo\BaseNation{
|
|||||||
|
|
||||||
public function onCalcNationalIncome(string $type, $amount):int{
|
public function onCalcNationalIncome(string $type, $amount):int{
|
||||||
if($type == 'pop' && $amount > 0){
|
if($type == 'pop' && $amount > 0){
|
||||||
return $amount * 0.8;
|
return Util::toInt($amount * 0.8);
|
||||||
}
|
}
|
||||||
|
|
||||||
return $amount;
|
return $amount;
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user