forked from devsam/core
Compare commits
145
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
f6dc7f49e2 | ||
|
|
c1f105226f
|
||
|
|
cecab2b0cf
|
||
|
|
39f4e89b03
|
||
|
|
83f595a27a
|
||
|
|
b0db11544d
|
||
|
|
8e3551cb11
|
||
|
|
61d99a3043
|
||
|
|
fe80deff0c | ||
|
|
536c00f5a8 | ||
|
|
66ed8635dd | ||
|
|
311c485cec | ||
|
|
5b5cf4e6d3 | ||
|
|
428ec0d0ed | ||
|
|
96c5f987d6 | ||
|
|
f0ae28b087 | ||
|
|
fa4a266d77 | ||
|
|
32e854858e
|
||
|
|
f13371e679 | ||
|
|
2420f594a6
|
||
|
|
b7b0a1050c
|
||
|
|
d2a90157b9
|
||
|
|
a32cb3a2c0
|
||
|
|
7c0a3a6955
|
||
|
|
7d2e2945a1 | ||
|
|
dc526c7359 | ||
|
|
6c4cb484da | ||
|
|
d41246de9d | ||
|
|
6d40783224
|
||
|
|
6eb6014e80
|
||
|
|
103cf3f882
|
||
|
|
5969e0c82b
|
||
|
|
945f9027dd
|
||
|
|
0bf3145042
|
||
|
|
905669755f
|
||
|
|
57b12e8c04
|
||
|
|
eccd883edc
|
||
|
|
895b134cd0
|
||
|
|
7258573e4d
|
||
|
|
cbdfa6f6fc
|
||
|
|
ed25c58410
|
||
|
|
16cfa46864
|
||
|
|
e54a0a6668
|
||
|
|
eb545724ea
|
||
|
|
7858b48bad
|
||
|
|
a4ed41edbe
|
||
|
|
b5a9e52c43
|
||
|
|
c6166d3295
|
||
|
|
9520d29109
|
||
|
|
3edfff146e | ||
|
|
38416ccdf8
|
||
|
|
eeb5eabd12
|
||
|
|
41273f97db
|
||
|
|
0e23677e1b | ||
|
|
0f085c7f36
|
||
|
|
bd90076441
|
||
|
|
1801bdf55b
|
||
|
|
f27f0edfb6
|
||
|
|
02f23e7db4
|
||
|
|
9871e24811 | ||
|
|
a7dac2ce15 | ||
|
|
ed1d2cbf0d | ||
|
|
06ca32802b
|
||
|
|
568b45f93a
|
||
|
|
1ca07286a4
|
||
|
|
376aed9787
|
||
|
|
246751b4dd
|
||
|
|
7f3a9d69ca
|
||
|
|
a4106f6242
|
||
|
|
f233e8241e | ||
|
|
79dedea47c
|
||
|
|
e106a6a3cf
|
||
|
|
ee3d84d7b0
|
||
|
|
b4f197b7d8
|
||
|
|
e3c89a37aa
|
||
|
|
ad0770d1be
|
||
|
|
161ed97a34
|
||
|
|
f66008da56
|
||
|
|
6b400f76cf
|
||
|
|
758ae06fd9
|
||
|
|
49429e1e7e
|
||
|
|
c9dd873019
|
||
|
|
3ae49456b1
|
||
|
|
9bf7bd0fda
|
||
|
|
a9b51977d4
|
||
|
|
50408ed516
|
||
|
|
b0cdf3ccb5
|
||
|
|
ea80b85b33
|
||
|
|
39ca3e2bb9
|
||
|
|
f8cc0c9c92
|
||
|
|
7a9ef6454c
|
||
|
|
d48c27dccb
|
||
|
|
5a565c2678
|
||
|
|
1e0875ae73
|
||
|
|
33759d24e5
|
||
|
|
033e75de5c
|
||
|
|
f2f8374fd4 | ||
|
|
e891525d56
|
||
|
|
93bc8304ce | ||
|
|
d4218f409c | ||
|
|
462de95866
|
||
|
|
dad477ed14
|
||
|
|
660258f715
|
||
|
|
9f6c7d9489
|
||
|
|
de17d87f47
|
||
|
|
f8ebcf91b1
|
||
|
|
d25d414057
|
||
|
|
96a9254bf8
|
||
|
|
96643567d4 | ||
|
|
0a6db3d21f | ||
|
|
8a4cbbb976
|
||
|
|
696ba0b341
|
||
|
|
4efcbaed6a
|
||
|
|
eda5ecb124
|
||
|
|
0ef69178a5
|
||
|
|
5596eca326
|
||
|
|
af2dec7e2c
|
||
|
|
435dae801f
|
||
|
|
320c8191dc
|
||
|
|
803e18e3c3
|
||
|
|
fbac218c34
|
||
|
|
2e6ea3a00d
|
||
|
|
1f8812c939
|
||
|
|
44c2323883
|
||
|
|
82fb532e4b
|
||
|
|
ae6ca5c1ec
|
||
|
|
30ac7da4d7
|
||
|
|
8c30634fd1
|
||
|
|
59761743dc
|
||
|
|
5952dba533
|
||
|
|
2518ac021d
|
||
|
|
e656c1e567
|
||
|
|
b89c045f85
|
||
|
|
d347054ad0
|
||
|
|
3ebc44ea5a
|
||
|
|
57c8c3f6a4
|
||
|
|
fee769714d
|
||
|
|
9fcb24533a
|
||
|
|
1061632290
|
||
|
|
7dc297a266
|
||
|
|
f019a642a2
|
||
|
|
5554ac3003
|
||
|
|
7f9ad8b7d5
|
||
|
|
82af3a2e2d | ||
|
|
7a4fcb30dc
|
@@ -69,3 +69,5 @@ gateway/js/*
|
||||
gateway/css/*
|
||||
|
||||
*.db-journal
|
||||
|
||||
d_log/cachegrind.*
|
||||
+2
-5
@@ -15,9 +15,8 @@ return [
|
||||
// Note that the **only** effect of choosing `'5.6'` is to infer
|
||||
// that functions removed in php 7.0 exist.
|
||||
// (See `backward_compatibility_checks` for additional options)
|
||||
"target_php_version" => '8.1',
|
||||
"minimum_target_php_version" => '8.1',
|
||||
'backward_compatibility_checks ' => true,
|
||||
"target_php_version" => '8.2',
|
||||
"minimum_target_php_version" => '8.2',
|
||||
'minimum_severity' => \Phan\Issue::SEVERITY_NORMAL,
|
||||
|
||||
'file_list' => [
|
||||
@@ -29,8 +28,6 @@ return [
|
||||
'hwe/_admin1_submit.php',
|
||||
'hwe/_admin2.php',
|
||||
'hwe/_admin2_submit.php',
|
||||
'hwe/_admin4.php',
|
||||
'hwe/_admin4_submit.php',
|
||||
'hwe/_admin5.php',
|
||||
'hwe/_admin5_submit.php',
|
||||
'hwe/_admin7.php',
|
||||
|
||||
Vendored
+1
-1
@@ -29,5 +29,5 @@
|
||||
"josa",
|
||||
"sammo"
|
||||
],
|
||||
"editor.tabSize": 2
|
||||
"editor.tabSize": 4
|
||||
}
|
||||
@@ -30,10 +30,10 @@ require(__DIR__ . '/../vendor/autoload.php');
|
||||
|
||||
<body>
|
||||
<div class="container">
|
||||
<h1 class="row justify-content-md-center">삼국지 모의전투 HiDCHe 설치</h1>
|
||||
<div class="row justify-content-md-center">
|
||||
<h1 class="row justify-content-lg-center">삼국지 모의전투 HiDCHe 설치</h1>
|
||||
<div class="row justify-content-lg-center">
|
||||
|
||||
<div class="col col-12 col-md-10 col-lg-7">
|
||||
<div class="col col-12 col-lg-10 col-lg-7">
|
||||
<div class="card" id="db_form_card" style="display:none">
|
||||
<h3 class="card-header">
|
||||
설치(DB 설정)
|
||||
|
||||
+1
-22
@@ -74,28 +74,7 @@ switch ($btn) {
|
||||
case "120분턴": $turnterm = 120; break;
|
||||
default: throw new \Exception("알 수 없는 턴 기간");
|
||||
}
|
||||
$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</>으로 변경됩니다."]);
|
||||
ServerTool::changeServerTerm($turnterm);
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
+11
-11
@@ -33,18 +33,18 @@ $src = MessageTarget::buildQuick($session->generalID);
|
||||
$genObjList = [];
|
||||
$env = [];
|
||||
if ($genlist) {
|
||||
$genObjList = General::createGeneralObjListFromDB($genlist);
|
||||
$genObjList = General::createObjListFromDB($genlist);
|
||||
$env = $gameStor->cacheAll();
|
||||
}
|
||||
switch ($btn) {
|
||||
case "전체 접속허용":
|
||||
$db->update('general', [
|
||||
'con' => 0
|
||||
$db->update('general_access_log', [
|
||||
'refresh_score' => 0
|
||||
], true);
|
||||
break;
|
||||
case "전체 접속제한":
|
||||
$db->update('general', [
|
||||
'con' => 1000
|
||||
$db->update('general_access_log', [
|
||||
'refresh_score' => 1000
|
||||
], true);
|
||||
break;
|
||||
case "블럭 해제":
|
||||
@@ -186,14 +186,14 @@ switch ($btn) {
|
||||
], '`no` IN %li', $genlist);
|
||||
break;
|
||||
case "접속 허용":
|
||||
$db->update('general', [
|
||||
'con' => 0
|
||||
], '`no` IN %li', $genlist);
|
||||
$db->update('general_access_log', [
|
||||
'refresh_score' => 0
|
||||
], '`general_id` IN %li', $genlist);
|
||||
break;
|
||||
case "접속 제한":
|
||||
$db->update('general', [
|
||||
'con' => 1000
|
||||
], '`no` IN %li', $genlist);
|
||||
$db->update('general_access_log', [
|
||||
'refresh_score' => 1000
|
||||
], '`general_id` IN %li', $genlist);
|
||||
break;
|
||||
case "메세지 전달":
|
||||
$text = $msg ?? '';
|
||||
|
||||
-133
@@ -1,133 +0,0 @@
|
||||
<?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>
|
||||
@@ -1,86 +0,0 @@
|
||||
<?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,8 +66,6 @@ $sel2[$type2] = "selected";
|
||||
<option <?= $sel[8] ?? '' ?> value=8>평무</option>
|
||||
<option <?= $sel[9] ?? '' ?> value=9>평지</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[14] ?? '' ?> value=14>궁숙</option>
|
||||
<option <?= $sel[15] ?? '' ?> value=15>기숙</option>
|
||||
@@ -105,8 +103,6 @@ $sel2[$type2] = "selected";
|
||||
<table align=center width=1600 class="tb_layout bg0">
|
||||
<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>
|
||||
@@ -147,8 +143,6 @@ SELECT
|
||||
A.gold,
|
||||
A.rice,
|
||||
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.dex2)) AS dex2,
|
||||
ROUND(AVG(B.dex3)) AS dex3,
|
||||
@@ -193,12 +187,6 @@ GROUP BY B.nation
|
||||
case 10:
|
||||
$query .= " order by avg(B.explevel) desc";
|
||||
break;
|
||||
case 11:
|
||||
$query .= " order by avg(B.connect) desc";
|
||||
break;
|
||||
case 12:
|
||||
$query .= " order by avg(B.con) desc";
|
||||
break;
|
||||
case 13:
|
||||
$query .= " order by avg(B.dex1) desc";
|
||||
break;
|
||||
@@ -240,8 +228,6 @@ from city where nation=%i', $nation['nation']);
|
||||
echo "
|
||||
<tr>
|
||||
<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> {$gen['cnt']} </td>
|
||||
<td align=center> {$city['cnt']} </td>
|
||||
|
||||
+3
-1
@@ -2,6 +2,8 @@
|
||||
|
||||
namespace sammo;
|
||||
|
||||
use sammo\Enums\GeneralQueryMode;
|
||||
|
||||
include "lib.php";
|
||||
include "func.php";
|
||||
|
||||
@@ -74,7 +76,7 @@ if (!$gen) {
|
||||
$gen = $generalBasicList[0]['no'];
|
||||
}
|
||||
|
||||
$generalObj = General::createGeneralObjFromDB($gen);
|
||||
$generalObj = General::createObjFromDB($gen, null, GeneralQueryMode::FullWithAccessLog);
|
||||
|
||||
?>
|
||||
<!DOCTYPE html>
|
||||
|
||||
@@ -26,7 +26,7 @@ foreach ($db->queryFirstColumn(
|
||||
}
|
||||
|
||||
$inheritPointManager = InheritancePointManager::getInstance();
|
||||
foreach(General::createGeneralObjListFromDB($db->queryFirstColumn('SELECT `no` FROM general WHERE npc = 0')) as $genObj){
|
||||
foreach(General::createObjListFromDB($db->queryFirstColumn('SELECT `no` FROM general WHERE npc = 0')) as $genObj){
|
||||
$inheritPointManager->mergeTotalInheritancePoint($genObj);
|
||||
$inheritPointManager->applyInheritanceUser($genObj->getVar('owner'));
|
||||
}
|
||||
+16
-8
@@ -16,10 +16,13 @@ $gameStor = KVStorage::getStorage($db, 'game_env');
|
||||
|
||||
increaseRefresh("장수일람", 2);
|
||||
|
||||
$me = $db->queryFirstRow('SELECT con,turntime FROM general WHERE owner = %i', $userID);
|
||||
$me = $db->queryFirstRow(
|
||||
'SELECT refresh_score,turntime FROM `general`
|
||||
LEFT JOIN general_access_log AS l ON `general`.no = l.general_id WHERE owner = %i', $userID
|
||||
);
|
||||
|
||||
$con = checkLimit($me['con']);
|
||||
if ($con >= 2) {
|
||||
$limitState = checkLimit($me['refresh_score']);
|
||||
if ($limitState >= 2) {
|
||||
printLimitMsg($me['turntime']);
|
||||
exit();
|
||||
}
|
||||
@@ -102,7 +105,7 @@ if ($gameStor->isunited) {
|
||||
6 => ['dedication', true],
|
||||
7 => ['officer_level', true],
|
||||
8 => ['killturn', false],
|
||||
9 => ['connect', true],
|
||||
9 => ['refresh_score_total', true],
|
||||
10 => ['experience', true],
|
||||
11 => ['personal', true],
|
||||
12 => ['special', true],
|
||||
@@ -111,7 +114,12 @@ if ($gameStor->isunited) {
|
||||
15 => ['npc', true],
|
||||
][$type];
|
||||
|
||||
$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' : '');
|
||||
$generalList = $db->query(
|
||||
'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 "
|
||||
<table align=center width=1000 class='tb_layout bg0'>
|
||||
@@ -163,7 +171,7 @@ if ($gameStor->isunited) {
|
||||
$name = $name . '<br><small>(' . $ownerNameList[$general['owner']] . ')</small>';
|
||||
}
|
||||
|
||||
$general['connect'] = Util::round($general['connect'], -1);
|
||||
$general['refresh_score_total'] = Util::round($general['refresh_score_total'], -1);
|
||||
|
||||
$imageTemp = GetImageURL($general['imgsvr']);
|
||||
echo "
|
||||
@@ -192,8 +200,8 @@ if ($gameStor->isunited) {
|
||||
<td align=center>$strength</td>
|
||||
<td align=center>$intel</td>
|
||||
<td align=center>{$general['killturn']}</td>
|
||||
<td align=center>{$general['connect']}";
|
||||
echo "<br>【" . getConnect($general['connect']) . "】</td>
|
||||
<td align=center>" . $general['refresh_score_total'] ?? 0;
|
||||
echo "<br>【" . getRefreshScoreText($general['refresh_score_total'] ?? 0) . "】</td>
|
||||
</tr>";
|
||||
}
|
||||
echo "
|
||||
|
||||
@@ -13,10 +13,13 @@ $gameStor = KVStorage::getStorage($db, 'game_env');
|
||||
$gameStor->cacheValues(['killturn', 'autorun_user', 'turnterm']);
|
||||
increaseRefresh("세력일람", 2);
|
||||
|
||||
$me = $db->queryFirstRow('SELECT con, turntime FROM general WHERE owner=%i', $userID);
|
||||
$me = $db->queryFirstRow(
|
||||
'SELECT refresh_score, turntime FROM `general`
|
||||
LEFT JOIN general_access_log AS l ON `general`.no = l.general_id WHERE owner=%i', $userID
|
||||
);
|
||||
|
||||
$con = checkLimit($me['con']);
|
||||
if ($con >= 2) {
|
||||
$limitState = checkLimit($me['refresh_score']);
|
||||
if ($limitState >= 2) {
|
||||
printLimitMsg($me['turntime']);
|
||||
exit();
|
||||
}
|
||||
|
||||
+31
-39
@@ -2,6 +2,8 @@
|
||||
|
||||
namespace sammo;
|
||||
|
||||
use sammo\Enums\GeneralAccessLogColumn;
|
||||
|
||||
include "lib.php";
|
||||
include "func.php";
|
||||
|
||||
@@ -10,34 +12,19 @@ $gameStor = KVStorage::getStorage($db, 'game_env');
|
||||
|
||||
increaseRefresh("갱신정보", 1);
|
||||
|
||||
$admin = $gameStor->getValues(['year', 'month', 'refresh', 'maxrefresh', 'maxonline']);
|
||||
$admin = $gameStor->getValues(['year', 'month', 'refresh', 'maxrefresh', 'maxonline', 'recentTraffic']);
|
||||
|
||||
$log = getRawFileLogRecent(__DIR__ . '/logs/' . UniqueConst::$serverID . '/_traffic.txt', 11, 100);
|
||||
|
||||
$date = [];
|
||||
$year = [];
|
||||
$month = [];
|
||||
$refresh = [];
|
||||
$online = [];
|
||||
$recentTraffic = $admin['recentTraffic'] ?? [];
|
||||
|
||||
$curonline = getOnlineNum();
|
||||
foreach ($log as $i => $value) {
|
||||
$parse = Json::decode($value);
|
||||
if(is_array($parse) === false){
|
||||
continue;
|
||||
}
|
||||
if(count($parse) < 5){
|
||||
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();
|
||||
|
||||
$recentTraffic[] = [
|
||||
'year' => $admin['year'],
|
||||
'month' => $admin['month'],
|
||||
'refresh' => $admin['refresh'],
|
||||
'online' => $curonline,
|
||||
'date' => TimeUtil::now()
|
||||
];
|
||||
|
||||
if ($admin['maxrefresh'] == 0) {
|
||||
$admin['maxrefresh'] = 1;
|
||||
@@ -111,13 +98,13 @@ if ($admin['maxonline'] < $curonline) {
|
||||
</td>
|
||||
</tr>
|
||||
<?php
|
||||
$refresh[] = $admin['refresh'];
|
||||
foreach ($refresh as $i => $value) {
|
||||
foreach ($recentTraffic as $trafficItem) {
|
||||
$value = $trafficItem['refresh'];
|
||||
$w = round($value / $admin['maxrefresh'] * 100, 1);
|
||||
$color = getTrafficColor($w);
|
||||
$dt = substr($date[$i], 11, 5); ?>
|
||||
$dt = substr($trafficItem['date'], 11, 5); ?>
|
||||
<tr height=30>
|
||||
<td width=100 align=center><?= $year[$i] ?>년 <?= $month[$i] ?>월</td>
|
||||
<td width=100 align=center><?= $trafficItem['year'] ?>년 <?= $trafficItem['month'] ?>월</td>
|
||||
<td width=60 align=center class='bg2'><?= $dt ?></td>
|
||||
<td width=2 align=center class='bg1'></td>
|
||||
<td width=320>
|
||||
@@ -152,13 +139,13 @@ if ($admin['maxonline'] < $curonline) {
|
||||
</td>
|
||||
</tr>
|
||||
<?php
|
||||
$online[] = $curonline;
|
||||
foreach ($online as $i => $value) {
|
||||
foreach ($recentTraffic as $trafficItem) {
|
||||
$value = $trafficItem['online'];
|
||||
$w = round($value / $admin['maxonline'] * 100, 1);
|
||||
$color = getTrafficColor($w);
|
||||
$dt = substr($date[$i], 11, 5); ?>
|
||||
$dt = substr($trafficItem['date'], 11, 5); ?>
|
||||
<tr height=30>
|
||||
<td width=100 align=center><?= $year[$i] ?>년 <?= $month[$i] ?>월</td>
|
||||
<td width=100 align=center><?= $trafficItem['year'] ?>년 <?= $trafficItem['month'] ?>월</td>
|
||||
<td width=60 align=center class='bg2'><?= $dt ?></td>
|
||||
<td width=2 align=center class='bg1'></td>
|
||||
<td width=320>
|
||||
@@ -193,19 +180,24 @@ if ($admin['maxonline'] < $curonline) {
|
||||
</td>
|
||||
</tr>
|
||||
<?php
|
||||
$max_refresh = $db->queryFirstRow('SELECT sum(refresh) as refresh, sum(`connect`) as `connect` from general');
|
||||
$max_refresh['name'] = '접속자 총합';
|
||||
$totalRefresh = [
|
||||
...$db->queryFirstRow('SELECT sum(`refresh`) as `refresh`, sum(`refresh_score_total`) as `refresh_score_total` from general_access_log'),
|
||||
'name' => '접속자 총합'
|
||||
];
|
||||
|
||||
$refresh_result = array_merge([$max_refresh], $db->query('SELECT `name`,refresh,`connect` FROM general ORDER BY refresh DESC LIMIT 5'));
|
||||
$top5Refresh = $db->query(
|
||||
'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 ($refresh_result as $i => $user) {
|
||||
$w = round($user['refresh'] / max(1, $max_refresh['refresh']) * 100, 1);
|
||||
foreach (array_merge([$totalRefresh], $top5Refresh) as $i => $user) {
|
||||
$w = round($user['refresh'] / max(1, $totalRefresh['refresh']) * 100, 1);
|
||||
$w2 = round(100 - $w, 1);
|
||||
$color = getTrafficColor($w);
|
||||
?>
|
||||
<tr>
|
||||
<td width=98 align=center><?= $user['name'] ?></td>
|
||||
<td width=98 align=center><?= $user['connect'] ?>(<?= $user['refresh'] ?>)</td>
|
||||
<td width=98 align=center><?= $user['refresh_score_total'] ?>(<?= $user['refresh'] ?>)</td>
|
||||
<td width=798>
|
||||
<?php if ($w == 0) : ?>
|
||||
<?php elseif ($w < 10) : ?>
|
||||
|
||||
+16
-11
@@ -2,6 +2,8 @@
|
||||
|
||||
namespace sammo;
|
||||
|
||||
use sammo\Enums\GeneralLiteQueryMode;
|
||||
use sammo\Enums\GeneralQueryMode;
|
||||
use sammo\Enums\RankColumn;
|
||||
|
||||
include "lib.php";
|
||||
@@ -21,12 +23,15 @@ $generalID = $session->generalID;
|
||||
|
||||
|
||||
|
||||
$me = $db->queryFirstRow('SELECT no,tournament,con,turntime from general where owner=%i', $userID);
|
||||
$me = $db->queryFirstRow(
|
||||
'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']);
|
||||
$turnTerm = $admin['turnterm'];
|
||||
$con = checkLimit($me['con']);
|
||||
if ($con >= 2) {
|
||||
$limitState = checkLimit($me['refresh_score']);
|
||||
if ($limitState >= 2) {
|
||||
printLimitMsg($me['turntime']);
|
||||
exit();
|
||||
}
|
||||
@@ -107,7 +112,7 @@ if ($str3) {
|
||||
?>
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<?php if ($con == 1) {
|
||||
<?php if ($limitState == 1) {
|
||||
MessageBox("접속제한이 얼마 남지 않았습니다!");
|
||||
} ?>
|
||||
|
||||
@@ -502,28 +507,28 @@ if ($str3) {
|
||||
$tournamentType = [
|
||||
'전 력 전' => [
|
||||
'종합',
|
||||
function (General $general) {
|
||||
function (GeneralLite $general) {
|
||||
return $general->getVar('leadership') + $general->getVar('strength') + $general->getVar('intel');
|
||||
},
|
||||
'tt',
|
||||
],
|
||||
'통 솔 전' => [
|
||||
'통솔',
|
||||
function (General $general) {
|
||||
function (GeneralLite $general) {
|
||||
return $general->getVar('leadership');
|
||||
},
|
||||
'tl',
|
||||
],
|
||||
'일 기 토' => [
|
||||
'무력',
|
||||
function (General $general) {
|
||||
function (GeneralLite $general) {
|
||||
return $general->getVar('strength');
|
||||
},
|
||||
'ts',
|
||||
],
|
||||
'설 전' => [
|
||||
'지력',
|
||||
function (General $general) {
|
||||
function (GeneralLite $general) {
|
||||
return $general->getVar('intel');
|
||||
},
|
||||
'ti',
|
||||
@@ -560,12 +565,12 @@ if ($str3) {
|
||||
$winColumn = RankColumn::from("{$rankColumn}w");
|
||||
$drawColumn = RankColumn::from("{$rankColumn}d");
|
||||
$loseColumn = RankColumn::from("{$rankColumn}l");
|
||||
$tournamentRankerList = General::createGeneralObjListFromDB(
|
||||
$tournamentRankerList = GeneralLite::createObjListFromDB(
|
||||
$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'],
|
||||
0
|
||||
GeneralLiteQueryMode::Core
|
||||
);
|
||||
usort($tournamentRankerList, function (General $lhs, General $rhs) use ($gameColumn, $winColumn, $drawColumn, $loseColumn) {
|
||||
usort($tournamentRankerList, function (GeneralLite $lhs, GeneralLite $rhs) use ($gameColumn, $winColumn, $drawColumn, $loseColumn) {
|
||||
$result = - ($lhs->getRankVar($gameColumn) <=> $rhs->getRankVar($gameColumn));
|
||||
if ($result !== 0) return $result;
|
||||
$result = - (
|
||||
|
||||
@@ -211,7 +211,7 @@ $templates = new \League\Plates\Engine('templates');
|
||||
$city['trade'] = "- ";
|
||||
}
|
||||
|
||||
$dbColumns = General::mergeQueryColumn(['npc', 'defence_train', 'no', 'picture', 'imgsvr', 'name', 'injury', 'leadership', 'strength', 'intel', 'officer_level', 'nation', 'crewtype', 'crew', 'train', 'atmos'], 2)[0];
|
||||
$dbColumns = General::mergeQueryColumn(['npc', 'defence_train', 'no', 'picture', 'imgsvr', 'name', 'injury', 'leadership', 'strength', 'intel', 'officer_level', 'nation', 'crewtype', 'crew', 'train', 'atmos'])[0];
|
||||
if ($showDetailedInfo) {
|
||||
$generals = $db->query(
|
||||
'SELECT %l from general where city=%i order by turntime',
|
||||
@@ -327,8 +327,7 @@ $templates = new \League\Plates\Engine('templates');
|
||||
|
||||
if ($ourGeneral && !$isNPC) {
|
||||
$turnText = [];
|
||||
$generalObj = new General($general, null, null, null, null, null, false);
|
||||
foreach ($generalTurnList[$generalObj->getID()] as $turnRawIdx => $turn) {
|
||||
foreach ($generalTurnList[$general['no']] as $turnRawIdx => $turn) {
|
||||
$turnIdx = $turnRawIdx + 1;
|
||||
$turnText[] = "{$turnIdx} : $turn";
|
||||
}
|
||||
|
||||
+7
-4
@@ -19,12 +19,15 @@ $gameStor = KVStorage::getStorage($db, 'game_env');
|
||||
|
||||
increaseRefresh("암행부", 1);
|
||||
|
||||
$me = $db->queryFirstRow('SELECT no,nation,officer_level,con,turntime,belong,permission,penalty from general where owner=%i', $userID);
|
||||
$me = $db->queryFirstRow(
|
||||
'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']);
|
||||
|
||||
$con = checkLimit($me['con']);
|
||||
if ($con >= 2) {
|
||||
$limitState = checkLimit($me['refresh_score']);
|
||||
if ($limitState >= 2) {
|
||||
printLimitMsg($me['turntime']);
|
||||
exit();
|
||||
}
|
||||
@@ -45,7 +48,7 @@ $templates = new \League\Plates\Engine('templates');
|
||||
?>
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<?php if ($con == 1) {
|
||||
<?php if ($limitState == 1) {
|
||||
MessageBox("접속제한이 얼마 남지 않았습니다!");
|
||||
} ?>
|
||||
|
||||
|
||||
+6
-4
@@ -97,7 +97,7 @@ if ($gameStor->isunited) {
|
||||
7 => ['gold', true],
|
||||
8 => ['rice', true],
|
||||
9 => ['crew', true],
|
||||
10 => ['connect', true],
|
||||
10 => ['refresh_score_total', true],
|
||||
11 => ['personal', true],
|
||||
12 => ['special', true],
|
||||
13 => ['special2', true],
|
||||
@@ -105,7 +105,9 @@ if ($gameStor->isunited) {
|
||||
15 => ['npc', true],
|
||||
][$type];
|
||||
|
||||
$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' : '');
|
||||
$generalList = $db->query(
|
||||
'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 "
|
||||
<table align=center class='tb_layout bg0'>
|
||||
@@ -173,8 +175,8 @@ if ($gameStor->isunited) {
|
||||
<td align=center>" . displayCharInfo($general['personal']) . "</td>
|
||||
<td align=center>" . displaySpecialDomesticInfo($general['special']) . " / " . displaySpecialWarInfo($general['special2']) . "</td>
|
||||
<td align=center>{$general['belong']}</td>
|
||||
<td align=center>{$general['connect']}";
|
||||
echo "<br>(" . getConnect($general['connect']) . ")</td>
|
||||
<td align=center>". $general['refresh_score_total'] ?? 0;
|
||||
echo "<br>(" . getRefreshScoreText($general['refresh_score_total'] ?? 0) . ")</td>
|
||||
</tr>";
|
||||
}
|
||||
echo "
|
||||
|
||||
+37
-11
@@ -2,6 +2,10 @@
|
||||
|
||||
namespace sammo;
|
||||
|
||||
use sammo\Enums\GeneralAccessLogColumn;
|
||||
use sammo\Enums\GeneralQueryMode;
|
||||
use sammo\Enums\TableName;
|
||||
|
||||
include "lib.php";
|
||||
include "func.php";
|
||||
|
||||
@@ -20,7 +24,7 @@ $gameStor->cacheValues(['turntime', 'opentime', 'autorun_user', 'npcmode']);
|
||||
|
||||
increaseRefresh("내정보", 1);
|
||||
|
||||
$me = General::createGeneralObjFromDB($generalID);
|
||||
$me = General::createObjFromDB($generalID, null, GeneralQueryMode::FullWithAccessLog);
|
||||
|
||||
$myset = $me->getVar('myset');
|
||||
if ($myset > 0) {
|
||||
@@ -29,7 +33,15 @@ if ($myset > 0) {
|
||||
$submit = 'hidden';
|
||||
}
|
||||
|
||||
$targetTime = addTurn($me->getVar('lastrefresh'), $gameStor->turnterm, GameConst::$minTurnDieOnPrestart);
|
||||
$lastRefresh = $db->queryFirstField(
|
||||
'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 ($me->getNPCType() == 0 && $me->getNationID() == 0) {
|
||||
@@ -39,13 +51,19 @@ if ($gameStor->turntime <= $gameStor->opentime) {
|
||||
}
|
||||
}
|
||||
|
||||
if($me->getNationID() == 0){
|
||||
if ($me->getNationID() == 0) {
|
||||
$showBuildNationCandidateBtn = true;
|
||||
}
|
||||
}
|
||||
|
||||
$use_treatment = $me->getAuxVar('use_treatment') ?? 10;
|
||||
$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>
|
||||
<html>
|
||||
@@ -81,13 +99,13 @@ $use_auto_nation_turn = $me->getAuxVar('use_auto_nation_turn') ?? 1;
|
||||
<div class="col">내 정 보<br><?= backButton() ?></div>
|
||||
</div>
|
||||
<div class="row gx-0">
|
||||
<div class="col col-12 col-md-6">
|
||||
<div class="col col-12 col-lg-6">
|
||||
<div class="row">
|
||||
<div class="col"><?php generalInfo($me); ?><?php generalInfo2($me); ?></div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="col col-12 col-md-6">
|
||||
<div class="col col-12 col-lg-6">
|
||||
<div class="row mx-0 gx-0">
|
||||
<div class="col" style='padding-left:2ch;'>
|
||||
토너먼트 【
|
||||
@@ -117,7 +135,10 @@ $use_auto_nation_turn = $me->getAuxVar('use_auto_nation_turn') ?? 1;
|
||||
<?php foreach ([90, 80, 60, 40] as $targetDefenceTrain) : ?>
|
||||
<option value='<?= $targetDefenceTrain ?>' <?= $me->getVar('defence_train') == $targetDefenceTrain ? "selected" : ""; ?>><?= formatDefenceTrain($targetDefenceTrain) ?>(훈사<?= $targetDefenceTrain ?>)</option>
|
||||
<?php endforeach; ?>
|
||||
<option value=999 <?= $me->getVar('defence_train') == 999 ? "selected" : ""; ?>><?= formatDefenceTrain(999) ?>[훈련 -3, 사기 -6]</option>
|
||||
<option value=999 <?= $me->getVar('defence_train') == 999 ? "selected" : ""; ?>><?= formatDefenceTrain(999) ?>
|
||||
<?php if($changeDefence999Train != 0 || $changeDefence999Train != 0):
|
||||
?>[<?=$changeDefence999Train!=0?"훈련 {$changeDefence999Train},":''?><?=$changeDefence999Atmos!=0?"사기 {$changeDefence999Atmos}":''
|
||||
?>]<?php endif?></option>
|
||||
</select>
|
||||
】<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>
|
||||
@@ -139,6 +160,11 @@ $use_auto_nation_turn = $me->getAuxVar('use_auto_nation_turn') ?? 1;
|
||||
<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 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) : ?>
|
||||
다른 장수 선택 (<?= 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>
|
||||
@@ -167,7 +193,7 @@ $use_auto_nation_turn = $me->getAuxVar('use_auto_nation_turn') ?? 1;
|
||||
<div class="row mx-1">
|
||||
<div class="btn-group" role="group">
|
||||
<?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; ?>
|
||||
</div>
|
||||
</div>
|
||||
@@ -178,7 +204,7 @@ $use_auto_nation_turn = $me->getAuxVar('use_auto_nation_turn') ?? 1;
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col col-12 col-md-6">
|
||||
<div class="col col-12 col-lg-6">
|
||||
<div class="row gx-0">
|
||||
<div class="col bg1 text-center">
|
||||
<h4 style='color:skyblue'>개인 기록</h4>
|
||||
@@ -191,7 +217,7 @@ $use_auto_nation_turn = $me->getAuxVar('use_auto_nation_turn') ?? 1;
|
||||
<button type="button" class="load_old_log btn btn-secondary" data-log_type="generalAction">이전 로그 불러오기</button>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col col-12 col-md-6">
|
||||
<div class="col col-12 col-lg-6">
|
||||
<div class="row gx-0">
|
||||
<div class="col bg1 text-center">
|
||||
<h4 style='color:orange'>전투 기록</h4>
|
||||
@@ -205,7 +231,7 @@ $use_auto_nation_turn = $me->getAuxVar('use_auto_nation_turn') ?? 1;
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="col col-12 col-md-6">
|
||||
<div class="col col-12 col-lg-6">
|
||||
<div class="row gx-0">
|
||||
<div class="col bg1 text-center">
|
||||
<h4 style='color:skyblue'>장수 열전</h4>
|
||||
@@ -215,7 +241,7 @@ $use_auto_nation_turn = $me->getAuxVar('use_auto_nation_turn') ?? 1;
|
||||
<?= formatHistoryToHTML(getGeneralHistoryLogAll($generalID)) ?>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col col-12 col-md-6">
|
||||
<div class="col col-12 col-lg-6">
|
||||
<div class="row gx-0">
|
||||
<div class="col bg1 text-center">
|
||||
<h4 style='color:orange'>전투 결과</h4>
|
||||
|
||||
@@ -14,14 +14,16 @@ $gameStor = KVStorage::getStorage($db, 'game_env');
|
||||
increaseRefresh("토너먼트", 1);
|
||||
TurnExecutionHelper::executeAllCommand();
|
||||
|
||||
$me = $db->queryFirstRow('select no,tournament,con,turntime from general where owner=%i', $userID);
|
||||
$generalID = $session->generalID;
|
||||
|
||||
$me = $db->queryFirstRow(
|
||||
'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
|
||||
);
|
||||
$generalID = $me['no'];
|
||||
$admin = $gameStor->getValues(['tournament', 'phase', 'turnterm', 'tnmt_msg', 'tnmt_type', 'develcost', 'tnmt_trig']);
|
||||
$turnTerm = $admin['turnterm'];
|
||||
|
||||
$con = checkLimit($me['con']);
|
||||
if ($con >= 2) {
|
||||
$limitState = checkLimit($me['refresh_score']);
|
||||
if ($limitState >= 2) {
|
||||
printLimitMsg($me['turntime']);
|
||||
exit();
|
||||
}
|
||||
@@ -100,7 +102,7 @@ $globalBetTotal = array_sum($globalBet);
|
||||
?>
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<?php if ($con == 1) {
|
||||
<?php if ($limitState == 1) {
|
||||
MessageBox("접속제한이 얼마 남지 않았습니다! 제한량이 모자라다면 참여를 해보세요^^");
|
||||
} ?>
|
||||
|
||||
|
||||
@@ -0,0 +1,6 @@
|
||||
<?php
|
||||
namespace sammo;
|
||||
|
||||
class ServerEnv extends ServerDefaultEnv {
|
||||
//ServerEnv 기본값을 변경하고 싶다면 orig를 제거한 복사본을 만들고 수정
|
||||
}
|
||||
+89
-67
@@ -5,6 +5,9 @@ namespace sammo;
|
||||
use DateTime;
|
||||
use Ds\Set;
|
||||
use sammo\Enums\AuctionType;
|
||||
use sammo\Enums\GeneralAccessLogColumn;
|
||||
use sammo\Enums\GeneralColumn;
|
||||
use sammo\Enums\GeneralQueryMode;
|
||||
use sammo\Enums\InheritanceKey;
|
||||
use sammo\Enums\RankColumn;
|
||||
|
||||
@@ -103,10 +106,9 @@ function GetImageURL($imgsvr, $filepath = '')
|
||||
}
|
||||
|
||||
/**
|
||||
* @param null|int $con 장수의 벌점
|
||||
* @param null|int $conlimit 최대 벌점
|
||||
* @param null|int $refreshScore 장수의 벌점
|
||||
*/
|
||||
function checkLimit($con = null)
|
||||
function checkLimit($refreshScore = null)
|
||||
{
|
||||
$session = Session::getInstance();
|
||||
if ($session->userGrade >= 4) {
|
||||
@@ -116,15 +118,15 @@ function checkLimit($con = null)
|
||||
$db = DB::db();
|
||||
$gameStor = KVStorage::getStorage($db, 'game_env');
|
||||
|
||||
if ($con === null) {
|
||||
$con = $db->queryFirstField('SELECT con FROM general WHERE `owner`=%i', Session::getUserID());
|
||||
if ($refreshScore === null) {
|
||||
$refreshScore = $db->queryFirstField('SELECT refresh_score FROM general_access_log WHERE `general_id`=%i', Session::getGeneralID());
|
||||
}
|
||||
$conlimit = $gameStor->conlimit;
|
||||
$refreshLimit = $gameStor->refreshLimit;
|
||||
|
||||
if ($con > $conlimit) {
|
||||
if ($refreshScore > $refreshLimit) {
|
||||
return 2;
|
||||
//접속제한 90%이면 경고문구
|
||||
} elseif ($con > $conlimit * 0.9) {
|
||||
} elseif ($refreshScore > $refreshLimit * 0.9) {
|
||||
return 1;
|
||||
} else {
|
||||
return 0;
|
||||
@@ -147,7 +149,7 @@ function getRandGenName(RandUtil $rng)
|
||||
|
||||
|
||||
|
||||
function cityInfo(General $generalObj)
|
||||
function cityInfo(GeneralLite $generalObj)
|
||||
{
|
||||
$db = DB::db();
|
||||
|
||||
@@ -642,7 +644,7 @@ function generalInfo(General $generalObj)
|
||||
$age = "<font color=red>{$age} 세</font>";
|
||||
}
|
||||
|
||||
$connectCnt = round($generalObj->getVar('connect'), -1);
|
||||
$refreshScoreTotal = round($generalObj->getAccessLogVar(GeneralAccessLogColumn::refreshScoreTotal) ?? 0, -1);
|
||||
$specialDomestic = $generalObj->getVar('special') === GameConst::$defaultSpecialDomestic
|
||||
? "{$generalObj->getVar('specage')}세"
|
||||
: "<font color=limegreen>" . displayiActionObjInfo($generalObj->getSpecialDomestic()) . "</font>";
|
||||
@@ -751,7 +753,7 @@ function generalInfo(General $generalObj)
|
||||
<td style='text-align:center;' class='bg1'><b>부대</b></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;' colspan=5>" . getConnect($connectCnt) . " {$connectCnt}({$generalObj->getVar('con')})</td>
|
||||
<td style='text-align:center;' colspan=5>" . getRefreshScoreText($refreshScoreTotal) . " {$refreshScoreTotal}({$generalObj->getAccessLogVar(GeneralAccessLogColumn::refreshScore)})</td>
|
||||
</tr>
|
||||
</table>";
|
||||
}
|
||||
@@ -998,52 +1000,69 @@ function increaseRefresh($type = "", $cnt = 1)
|
||||
$generalID = $session->generalID;
|
||||
$userGrade = $session->userGrade;
|
||||
|
||||
$date = TimeUtil::now();
|
||||
$dateObj = new \DateTimeImmutable();
|
||||
$date = TimeUtil::format($dateObj, false);
|
||||
|
||||
$db = DB::db();
|
||||
$gameStor = KVStorage::getStorage($db, 'game_env');
|
||||
$isunited = $gameStor->isunited;
|
||||
$opentime = $gameStor->opentime;
|
||||
|
||||
if($userGrade == 6){
|
||||
if ($userGrade == 6) {
|
||||
return;
|
||||
}
|
||||
if($isunited == 2){
|
||||
if ($isunited == 2) {
|
||||
return;
|
||||
}
|
||||
if(!$generalID){
|
||||
if (!$generalID) {
|
||||
return;
|
||||
}
|
||||
if($opentime > $date){
|
||||
if ($opentime > $date) {
|
||||
return;
|
||||
}
|
||||
|
||||
$gameStor->refresh = $gameStor->refresh + $cnt; //TODO: +로 증가하는 값은 별도로 분리
|
||||
|
||||
$db->update('general', [
|
||||
'lastrefresh' => $date,
|
||||
'con' => $db->sqleval('con + %i', $cnt),
|
||||
'connect' => $db->sqleval('connect + %i', $cnt),
|
||||
'refcnt' => $db->sqleval('refcnt + %i', $cnt),
|
||||
'refresh' => $db->sqleval('refresh + %i', $cnt)
|
||||
], 'owner=%i', $userID);
|
||||
$db->insertUpdate('general_access_log', [
|
||||
GeneralAccessLogColumn::generalID->value => $generalID,
|
||||
GeneralAccessLogColumn::userID->value => $userID,
|
||||
GeneralAccessLogColumn::lastRefresh->value => $date,
|
||||
GeneralAccessLogColumn::refreshTotal->value => $cnt,
|
||||
GeneralAccessLogColumn::refresh->value => $cnt,
|
||||
GeneralAccessLogColumn::refreshScore->value => $cnt,
|
||||
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),
|
||||
]);
|
||||
|
||||
$date = date('Y_m_d H:i:s');
|
||||
$date2 = substr($date, 0, 10);
|
||||
$online = getOnlineNum();
|
||||
file_put_contents(
|
||||
__DIR__ . "/logs/" . UniqueConst::$serverID . "/_{$date2}_refresh.txt",
|
||||
sprintf(
|
||||
"%s, %s, %s, %s, %s, %d\n",
|
||||
$date,
|
||||
$session->userName,
|
||||
$session->generalName,
|
||||
$session->ip,
|
||||
$type,
|
||||
$online
|
||||
),
|
||||
FILE_APPEND
|
||||
);
|
||||
$serverPath = __DIR__;
|
||||
|
||||
$serverID = UniqueConst::$serverID;
|
||||
$logPath = "{$serverPath}/logs/{$serverID}/api_log.db";
|
||||
|
||||
$logDB = FileDB::db($logPath, $serverPath . '/../f_install/sql/api_log.sql');
|
||||
|
||||
$ip = $_SERVER['REMOTE_ADDR'] ?? 'local';
|
||||
$date = date('Y-m-d H:i:s');
|
||||
|
||||
$logDB->insert('api_log', [
|
||||
'user_id' => $session->userID,
|
||||
'ip' => $ip,
|
||||
'date' => $date,
|
||||
'path' => "refresh",
|
||||
'arg' => JSON::encode([
|
||||
'type' => $type,
|
||||
]),
|
||||
'aux' => JSON::encode([
|
||||
'generalID' => $generalID,
|
||||
'generalName' => $session->generalName,
|
||||
'userName' => $session->userName,
|
||||
]),
|
||||
]);
|
||||
}
|
||||
|
||||
function updateTraffic()
|
||||
@@ -1051,12 +1070,9 @@ function updateTraffic()
|
||||
$online = getOnlineNum();
|
||||
$db = DB::db();
|
||||
$gameStor = KVStorage::getStorage($db, 'game_env');
|
||||
$admin = $gameStor->getValues(['year', 'month', 'refresh', 'maxonline', 'maxrefresh']);
|
||||
$admin = $gameStor->getValues(['year', 'month', 'refresh', 'maxonline', 'maxrefresh', 'recentTraffic']);
|
||||
/** @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']) {
|
||||
$admin['maxrefresh'] = $admin['refresh'];
|
||||
}
|
||||
@@ -1067,22 +1083,20 @@ function updateTraffic()
|
||||
$gameStor->maxrefresh = $admin['maxrefresh'];
|
||||
$gameStor->maxonline = $admin['maxonline'];
|
||||
|
||||
$db->update('general', ['refresh' => 0], true);
|
||||
$recentTraffic = $admin['recentTraffic'] ?? [];
|
||||
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;
|
||||
|
||||
$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
|
||||
);
|
||||
$db->update('general_access_log', ['refresh' => 0], true);
|
||||
}
|
||||
|
||||
function CheckOverhead()
|
||||
@@ -1090,13 +1104,13 @@ function CheckOverhead()
|
||||
//서버정보
|
||||
$db = DB::db();
|
||||
$gameStor = KVStorage::getStorage($db, 'game_env');
|
||||
list($turnterm, $conlimit) = $gameStor->getValuesAsArray(['turnterm', 'conlimit']);
|
||||
[$turnterm, $refreshLimit] = $gameStor->getValuesAsArray(['turnterm', 'refreshLimit']);
|
||||
|
||||
$con = Util::round(pow($turnterm, 0.6) * 3) * 10;
|
||||
$nextRefreshLimit = Util::round(pow($turnterm, 0.6) * 3) * 10;
|
||||
|
||||
|
||||
if ($con != $conlimit) {
|
||||
$gameStor->conlimit = $con;
|
||||
if ($nextRefreshLimit != $refreshLimit) {
|
||||
$gameStor->refreshLimit = $nextRefreshLimit;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1200,7 +1214,16 @@ function updateOnline()
|
||||
|
||||
//동접수
|
||||
$startTurn = cutTurn($gameStor->turntime, $gameStor->turnterm, false);
|
||||
$onlineUser = $db->query('SELECT no,name,nation FROM general WHERE lastrefresh >= %s AND npc < 2', $startTurn);
|
||||
$onlineUser = $db->query(
|
||||
'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);
|
||||
$onlineNationUsers = Util::arrayGroupBy($onlineUser, 'nation');
|
||||
|
||||
@@ -1314,7 +1337,7 @@ function CheckHall($no)
|
||||
["betrate", 'calc'],
|
||||
];
|
||||
|
||||
$generalObj = General::createGeneralObjFromDB($no, null, 2);
|
||||
$generalObj = General::createObjFromDB($no);
|
||||
|
||||
$ttw = $generalObj->getRankVar(RankColumn::ttw);
|
||||
$ttd = $generalObj->getRankVar(RankColumn::ttd);
|
||||
@@ -1704,14 +1727,13 @@ function deleteNation(General $lord, bool $applyDB): array
|
||||
$logger->pushGlobalHistoryLog("<R><b>【멸망】</b></><D><b>{$nationName}</b></>{$josaUn} <R>멸망</>했습니다.");
|
||||
|
||||
|
||||
$nationGeneralList = General::createGeneralObjListFromDB(
|
||||
$nationGeneralList = General::createObjListFromDB(
|
||||
$db->queryFirstColumn(
|
||||
'SELECT `no` FROM general WHERE nation=%i AND no != %i',
|
||||
$nationID,
|
||||
$lordID
|
||||
),
|
||||
['npc', 'owner', 'gold', 'rice', 'experience', 'explevel', 'dedication', 'dedlevel', 'belong', 'aux'],
|
||||
1
|
||||
);
|
||||
$nationGeneralList[$lordID] = $lord;
|
||||
|
||||
@@ -1728,7 +1750,7 @@ function deleteNation(General $lord, bool $applyDB): array
|
||||
|
||||
// 전 장수 재야로
|
||||
foreach ($nationGeneralList as $general) {
|
||||
if($general->getNPCType() < 2){
|
||||
if ($general->getNPCType() < 2) {
|
||||
$general->setAuxVar(
|
||||
InheritanceKey::max_belong->value,
|
||||
max(
|
||||
|
||||
@@ -350,7 +350,7 @@ function setGeneralCommand(int $generalID, array $rawTurnList, string $command,
|
||||
$db = DB::db();
|
||||
$gameStor = KVStorage::getStorage($db, 'game_env');
|
||||
$env = $gameStor->getAll();
|
||||
$general = General::createGeneralObjFromDB($generalID);
|
||||
$general = General::createObjFromDB($generalID);
|
||||
|
||||
try{
|
||||
$commandObj = buildGeneralCommandClass($command, $general, $env, $arg);
|
||||
@@ -425,7 +425,7 @@ function setNationCommand(int $generalID, array $turnList, string $command, ?arr
|
||||
$db = DB::db();
|
||||
$gameStor = KVStorage::getStorage($db, 'game_env');
|
||||
$env = $gameStor->getAll();
|
||||
$general = General::createGeneralObjFromDB($generalID);
|
||||
$general = General::createObjFromDB($generalID);
|
||||
|
||||
if($general->getVar('officer_level') < 5){
|
||||
return [
|
||||
|
||||
+47
-12
@@ -133,19 +133,19 @@ function getNationType(?string $type) {
|
||||
}
|
||||
|
||||
|
||||
function getConnect($con) {
|
||||
if($con < 50) $conname = '안함';
|
||||
elseif($con < 100) $conname = '무관심';
|
||||
elseif($con < 200) $conname = '가끔';
|
||||
elseif($con < 400) $conname = '보통';
|
||||
elseif($con < 800) $conname = '자주';
|
||||
elseif($con < 1600) $conname = '열심';
|
||||
elseif($con < 3200) $conname = '중독';
|
||||
elseif($con < 6400) $conname = '폐인';
|
||||
elseif($con < 12800) $conname = '경고';
|
||||
else $conname = '헐...';
|
||||
function getRefreshScoreText($score) {
|
||||
if($score < 50) $scoreName = '안함';
|
||||
elseif($score < 100) $scoreName = '무관심';
|
||||
elseif($score < 200) $scoreName = '가끔';
|
||||
elseif($score < 400) $scoreName = '보통';
|
||||
elseif($score < 800) $scoreName = '자주';
|
||||
elseif($score < 1600) $scoreName = '열심';
|
||||
elseif($score < 3200) $scoreName = '중독';
|
||||
elseif($score < 6400) $scoreName = '폐인';
|
||||
elseif($score < 12800) $scoreName = '경고';
|
||||
else $scoreName = '헐...';
|
||||
|
||||
return $conname;
|
||||
return $scoreName;
|
||||
}
|
||||
|
||||
function getNationType2(?string $type) {
|
||||
@@ -256,6 +256,41 @@ function buildItemClass(?string $type):BaseItem{
|
||||
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 getGeneralSpecialDomesticClass(?string $type){
|
||||
if($type === null || $type === ''){
|
||||
$type = GameConst::$defaultSpecialDomestic;
|
||||
|
||||
+36
-7
@@ -202,8 +202,10 @@ function preUpdateMonthly()
|
||||
$admin = $gameStor->getValues(['startyear', 'year', 'month']);
|
||||
|
||||
//접률감소, 건국제한-1
|
||||
$db->update('general_access_log', [
|
||||
'refresh_score_total' => $db->sqleval('floor(refresh_score_total*0.99)'),
|
||||
], true);
|
||||
$db->update('general', [
|
||||
'connect' => $db->sqleval('floor(connect*0.99)'),
|
||||
'makelimit' => $db->sqleval('greatest(0, makelimit - 1)'),
|
||||
], true);
|
||||
//전략제한-1, 외교제한-1, 세율동기화
|
||||
@@ -301,7 +303,6 @@ function postUpdateMonthly(RandUtil $rng)
|
||||
WHERE g.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(avg(connect)) from general where nation=A.nation)
|
||||
)/10)
|
||||
as power,
|
||||
(select sum(crew) from general where nation=A.nation) as totalCrew
|
||||
@@ -450,7 +451,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');
|
||||
|
||||
foreach (General::createGeneralObjListFromDB($wanderers) as $wanderer) {
|
||||
foreach (General::createObjListFromDB($wanderers) as $wanderer) {
|
||||
$wanderCmd = buildGeneralCommandClass('che_해산', $wanderer, $admin);
|
||||
if ($wanderCmd->hasFullConditionMet()) {
|
||||
$logger = $wanderer->getLogger();
|
||||
@@ -697,7 +698,7 @@ function checkEmperior()
|
||||
$db = DB::db();
|
||||
$gameStor = KVStorage::getStorage($db, 'game_env');
|
||||
|
||||
$admin = $gameStor->getValues(['year', 'month', 'isunited', 'conlimit']);
|
||||
$admin = $gameStor->getValues(['year', 'month', 'isunited', 'refreshLimit']);
|
||||
if ($admin['isunited'] != 0) {
|
||||
return;
|
||||
}
|
||||
@@ -742,7 +743,7 @@ function checkEmperior()
|
||||
}
|
||||
|
||||
$inheritPointManager = InheritancePointManager::getInstance();
|
||||
$allUserGenerals = General::createGeneralObjListFromDB($db->queryFirstColumn('SELECT `no` FROM general WHERE npc < 2'));
|
||||
$allUserGenerals = General::createObjListFromDB($db->queryFirstColumn('SELECT `no` FROM general WHERE npc < 2'));
|
||||
foreach ($allUserGenerals as $genObj) {
|
||||
if ($genObj->getNationID() == $nationID) {
|
||||
if ($genObj->getVar('officer_level') > 4) {
|
||||
@@ -759,7 +760,7 @@ function checkEmperior()
|
||||
}
|
||||
|
||||
$gameStor->isunited = 2;
|
||||
$gameStor->conlimit = $gameStor->conlimit * 100;
|
||||
$gameStor->refreshLimit = $gameStor->refreshLimit * 100;
|
||||
|
||||
foreach ($db->queryFirstColumn('SELECT no FROM general WHERE npc<2 AND age>=%i', GameConst::$minPushHallAge) as $hallGeneralNo) {
|
||||
CheckHall($hallGeneralNo);
|
||||
@@ -771,7 +772,7 @@ function checkEmperior()
|
||||
|
||||
$chiefs = Util::convertArrayToDict(
|
||||
$db->query(
|
||||
'SELECT no,name,picture,belong,officer_level FROM general WHERE nation=%i AND officer_level >= 5',
|
||||
'SELECT no,npc,name,picture,belong,officer_level FROM general WHERE nation=%i AND officer_level >= 5',
|
||||
$nationID
|
||||
),
|
||||
'officer_level'
|
||||
@@ -908,6 +909,34 @@ function checkEmperior()
|
||||
|
||||
//연감 월결산
|
||||
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)
|
||||
|
||||
@@ -148,63 +148,6 @@ function allButton(bool $seizeNPCMode, array $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
|
||||
{
|
||||
if ($wound == 0) {
|
||||
|
||||
@@ -364,7 +364,14 @@ function disaster(RandUtil $rng) {
|
||||
$logger->flush();
|
||||
|
||||
if (!$isGood) {
|
||||
$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');
|
||||
[$queryColumns,,] = General::mergeQueryColumn();
|
||||
$generalListByCity = Util::arrayGroupBy(
|
||||
$db->query(
|
||||
'SELECT %l FROM general WHERE city IN %li',
|
||||
Util::formatListOfBackticks($queryColumns),
|
||||
Util::squeezeFromArray($targetCityList, 'city')
|
||||
),
|
||||
'city');
|
||||
//NOTE: 쿼리 1번이지만 복잡하기 vs 쿼리 여러번이지만 조금 더 깔끔하기
|
||||
foreach ($targetCityList as $city) {
|
||||
$affectRatio = Util::valueFit($city['secu'] / $city['secu_max'] / 0.8, 0, 1);
|
||||
@@ -383,7 +390,7 @@ function disaster(RandUtil $rng) {
|
||||
|
||||
$generalList = array_map(
|
||||
function($rawGeneral) use ($city, $year, $month){
|
||||
return new General($rawGeneral, null, $city, null, $year, $month, false);
|
||||
return new General($rawGeneral, null, null, $city, null, $year, $month, false);
|
||||
},
|
||||
$generalListByCity[$city['city']]??[]
|
||||
);
|
||||
|
||||
@@ -882,7 +882,7 @@ function setGift($tnmt_type, $tnmt, $phase)
|
||||
//포상 장수 이름, 금액
|
||||
$resultHelper[$generalID]['reward'] += $cost;
|
||||
$resultHelper[$generalID]['msg'] = "<span class='ev_highlight'>4강 진출</span>";
|
||||
General::createGeneralObjFromDB($generalID)->increaseInheritancePoint(InheritanceKey::tournament, 10);
|
||||
General::createObjFromDB($generalID)->increaseInheritancePoint(InheritanceKey::tournament, 10);
|
||||
}
|
||||
//결승자 명성 돈
|
||||
$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}</> 대회의 <S>우승자</>에게는 <C>{$winnerRewardText}</>, <S>준우승자</>에겐 <C>{$runnerUpRewardText}</>의 <S>상금</>과 약간의 <S>명성</>이 주어집니다!", ActionLogger::EVENT_YEAR_MONTH);
|
||||
|
||||
$generalObjList = General::createGeneralObjListFromDB(array_keys($resultHelper));
|
||||
$generalObjList = General::createObjListFromDB(array_keys($resultHelper));
|
||||
|
||||
foreach ($resultHelper as $generalID => $general) {
|
||||
$rewardText = number_format($general['reward']);
|
||||
|
||||
+2
-2
@@ -39,8 +39,8 @@ if ($session->userGrade < 5 && !$allowReset) {
|
||||
|
||||
<body>
|
||||
<div class="container">
|
||||
<h1 class="row justify-content-md-center">삼국지 모의전투 HiDCHe 리셋</h1>
|
||||
<div class="row justify-content-md-center">
|
||||
<h1 class="row justify-content-lg-center">삼국지 모의전투 HiDCHe 리셋</h1>
|
||||
<div class="row justify-content-lg-center">
|
||||
|
||||
<div class="col col-lg-8">
|
||||
<div class="card" id="game_form_card">
|
||||
|
||||
+2
-2
@@ -32,8 +32,8 @@ if ($session->userGrade == 5) {
|
||||
|
||||
<body>
|
||||
<div class="container" style="min-width:720px;">
|
||||
<h1 class="row justify-content-md-center">삼국지 모의전투 HiDCHe 리셋</h1>
|
||||
<div class="row justify-content-md-center">
|
||||
<h1 class="row justify-content-lg-center">삼국지 모의전투 HiDCHe 리셋</h1>
|
||||
<div class="row justify-content-lg-center">
|
||||
|
||||
<div class="col col-lg-8">
|
||||
<div class="card" id="db_form_card">
|
||||
|
||||
@@ -17,10 +17,13 @@ $text = Util::getPost('text');
|
||||
|
||||
increaseRefresh("회의실", 1);
|
||||
|
||||
$me = $db->queryFirstRow('SELECT no, nation, name, officer_level, permission, con, turntime, belong, penalty, `picture`,`imgsvr` FROM general WHERE owner=%i', $userID);
|
||||
$me = $db->queryFirstRow(
|
||||
'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
|
||||
);
|
||||
|
||||
$con = checkLimit($me['con']);
|
||||
if ($con >= 2) {
|
||||
$limitState = checkLimit($me['refresh_score']);
|
||||
if ($limitState >= 2) {
|
||||
Json::die([
|
||||
'result'=>false,
|
||||
'reason'=>'접속 제한입니다.'
|
||||
@@ -50,7 +53,7 @@ if($permission < 0){
|
||||
'result'=>false,
|
||||
'reason'=>'국가에 소속되어있지 않습니다.'
|
||||
]);
|
||||
|
||||
|
||||
}
|
||||
else if ($isSecretBoard && $permission < 2) {
|
||||
Json::die([
|
||||
|
||||
@@ -16,10 +16,13 @@ $text = Util::getPost('text');
|
||||
|
||||
increaseRefresh("회의실", 1);
|
||||
|
||||
$me = $db->queryFirstRow('SELECT no, nation, name, officer_level, permission, con, turntime, belong, penalty FROM general WHERE owner=%i', $userID);
|
||||
$me = $db->queryFirstRow(
|
||||
'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
|
||||
);
|
||||
|
||||
$con = checkLimit($me['con']);
|
||||
if ($con >= 2) {
|
||||
$limitState = checkLimit($me['refresh_score']);
|
||||
if ($limitState >= 2) {
|
||||
Json::die([
|
||||
'result'=>false,
|
||||
'reason'=>'접속 제한입니다.'
|
||||
@@ -58,7 +61,7 @@ if($permission < 0){
|
||||
'result'=>false,
|
||||
'reason'=>'국가에 소속되어있지 않습니다.'
|
||||
]);
|
||||
|
||||
|
||||
}
|
||||
else if ($isSecretBoard && $permission < 2) {
|
||||
Json::die([
|
||||
|
||||
@@ -16,11 +16,14 @@ $isSecretBoard = Util::getPost('isSecret', 'bool', false);
|
||||
|
||||
increaseRefresh("회의실", 1);
|
||||
|
||||
$me = $db->queryFirstRow('SELECT no, nation, officer_level, permission, con, turntime, belong, penalty FROM general WHERE owner=%i', $userID);
|
||||
$me = $db->queryFirstRow(
|
||||
'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
|
||||
);
|
||||
|
||||
|
||||
$con = checkLimit($me['con']);
|
||||
if ($con >= 2) {
|
||||
$limitState = checkLimit($me['refresh_score']);
|
||||
if ($limitState >= 2) {
|
||||
Json::die([
|
||||
'result'=>false,
|
||||
'reason'=>'접속 제한입니다.'
|
||||
@@ -33,7 +36,7 @@ if($permission < 0){
|
||||
'result'=>false,
|
||||
'reason'=>'국가에 소속되어있지 않습니다.'
|
||||
]);
|
||||
|
||||
|
||||
}
|
||||
else if ($isSecretBoard && $permission < 2) {
|
||||
Json::die([
|
||||
@@ -72,4 +75,3 @@ Json::die([
|
||||
'articles'=>$articles,
|
||||
'reason'=>'success'
|
||||
]);
|
||||
|
||||
|
||||
@@ -17,10 +17,13 @@ $letterNo = Util::getPost('letterNo', 'int');
|
||||
|
||||
increaseRefresh("외교부", 1);
|
||||
|
||||
$me = $db->queryFirstRow('SELECT no, name, nation, officer_level, permission, con, turntime, belong, penalty, picture, imgsvr FROM general WHERE owner=%i', $userID);
|
||||
$me = $db->queryFirstRow(
|
||||
'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
|
||||
);
|
||||
|
||||
$con = checkLimit($me['con']);
|
||||
if ($con >= 2) {
|
||||
$limitState = checkLimit($me['refresh_score']);
|
||||
if ($limitState >= 2) {
|
||||
Json::die([
|
||||
'result'=>false,
|
||||
'reason'=>'접속 제한입니다.'
|
||||
|
||||
@@ -16,11 +16,14 @@ $isSecretBoard = Util::getPost('isSecret', 'bool', false);
|
||||
|
||||
increaseRefresh("외교부", 1);
|
||||
|
||||
$me = $db->queryFirstRow('SELECT no, nation, officer_level, permission, con, turntime, belong, penalty FROM general WHERE owner=%i', $userID);
|
||||
$me = $db->queryFirstRow(
|
||||
'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
|
||||
);
|
||||
|
||||
|
||||
$con = checkLimit($me['con']);
|
||||
if ($con >= 2) {
|
||||
$limitState = checkLimit($me['refresh_score']);
|
||||
if ($limitState >= 2) {
|
||||
Json::die([
|
||||
'result'=>false,
|
||||
'reason'=>'접속 제한입니다.'
|
||||
@@ -33,7 +36,7 @@ if($permission < 0){
|
||||
'result'=>false,
|
||||
'reason'=>'국가에 소속되어있지 않습니다.'
|
||||
]);
|
||||
|
||||
|
||||
}
|
||||
|
||||
$letters = [];
|
||||
@@ -83,4 +86,3 @@ Json::die([
|
||||
'myNationID'=>$me['nation'],
|
||||
'reason'=>'success'
|
||||
]);
|
||||
|
||||
|
||||
@@ -22,10 +22,13 @@ $reason = Util::getPost('reason', 'string', '');
|
||||
|
||||
increaseRefresh("외교부", 1);
|
||||
|
||||
$me = $db->queryFirstRow('SELECT no, name, nation, officer_level, permission, con, turntime, belong, penalty, picture, imgsvr FROM general WHERE owner=%i', $userID);
|
||||
$me = $db->queryFirstRow(
|
||||
'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
|
||||
);
|
||||
|
||||
$con = checkLimit($me['con']);
|
||||
if ($con >= 2) {
|
||||
$limitState = checkLimit($me['refresh_score']);
|
||||
if ($limitState >= 2) {
|
||||
Json::die([
|
||||
'result'=>false,
|
||||
'reason'=>'접속 제한입니다.'
|
||||
|
||||
@@ -17,10 +17,13 @@ $letterNo = Util::getPost('letterNo', 'int');
|
||||
|
||||
increaseRefresh("외교부", 1);
|
||||
|
||||
$me = $db->queryFirstRow('SELECT no, name, nation, officer_level, permission, con, turntime, belong, penalty, picture, imgsvr FROM general WHERE owner=%i', $userID);
|
||||
$me = $db->queryFirstRow(
|
||||
'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
|
||||
);
|
||||
|
||||
$con = checkLimit($me['con']);
|
||||
if ($con >= 2) {
|
||||
$limitState = checkLimit($me['refresh_score']);
|
||||
if ($limitState >= 2) {
|
||||
Json::die([
|
||||
'result'=>false,
|
||||
'reason'=>'접속 제한입니다.'
|
||||
|
||||
@@ -24,10 +24,13 @@ if($prevNo < 1){
|
||||
$prevNo = null;
|
||||
}
|
||||
|
||||
$me = $db->queryFirstRow('SELECT no, name, nation, officer_level, permission, con, turntime, belong, penalty, picture, imgsvr FROM general WHERE owner=%i', $userID);
|
||||
$me = $db->queryFirstRow(
|
||||
'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
|
||||
);
|
||||
|
||||
$con = checkLimit($me['con']);
|
||||
if ($con >= 2) {
|
||||
$limitState = checkLimit($me['refresh_score']);
|
||||
if ($limitState >= 2) {
|
||||
Json::die([
|
||||
'result'=>false,
|
||||
'reason'=>'접속 제한입니다.'
|
||||
|
||||
@@ -33,12 +33,15 @@ if($generalID <= 0 || $reqTo <= 0){
|
||||
|
||||
$db = DB::db();
|
||||
|
||||
$me = $db->queryFirstRow('SELECT no,nation,officer_level,con,turntime,belong,permission,penalty from general where owner=%i', $userID);
|
||||
$me = $db->queryFirstRow(
|
||||
'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'];
|
||||
|
||||
|
||||
$con = checkLimit($me['con']);
|
||||
if ($con >= 2) {
|
||||
$limitState = checkLimit($me['refresh_score']);
|
||||
if ($limitState >= 2) {
|
||||
Json::die([
|
||||
'result'=>false,
|
||||
'reason'=>'접속 제한입니다.'
|
||||
@@ -61,7 +64,7 @@ if($generalID !== $targetID){
|
||||
'reason'=>'권한이 부족합니다. 수뇌부가 아니거나 사관년도가 부족합니다.'
|
||||
]);
|
||||
}
|
||||
|
||||
|
||||
if($testGeneralNationID !== $nationID){
|
||||
Json::die([
|
||||
'result'=>false,
|
||||
|
||||
+22
-14
@@ -199,17 +199,25 @@ if($reserve_open){
|
||||
]);
|
||||
}
|
||||
|
||||
Json::die(ResetHelper::buildScenario(
|
||||
$turnterm,
|
||||
$sync,
|
||||
$scenario,
|
||||
$fiction,
|
||||
$extend,
|
||||
$block_general_create,
|
||||
$npcmode,
|
||||
$show_img_level,
|
||||
!!$tournament_trig,
|
||||
$join_mode,
|
||||
TimeUtil::now(),
|
||||
$autorun_user
|
||||
));
|
||||
try{
|
||||
Json::die(ResetHelper::buildScenario(
|
||||
$turnterm,
|
||||
$sync,
|
||||
$scenario,
|
||||
$fiction,
|
||||
$extend,
|
||||
$block_general_create,
|
||||
$npcmode,
|
||||
$show_img_level,
|
||||
!!$tournament_trig,
|
||||
$join_mode,
|
||||
TimeUtil::now(),
|
||||
$autorun_user
|
||||
));
|
||||
}
|
||||
catch(\Exception $e){
|
||||
Json::die([
|
||||
'result'=>false,
|
||||
'reason'=>$e->getMessage()
|
||||
]);
|
||||
}
|
||||
@@ -1,6 +1,8 @@
|
||||
<?php
|
||||
namespace sammo;
|
||||
|
||||
use sammo\Enums\GeneralLiteQueryMode;
|
||||
use sammo\Enums\GeneralQueryMode;
|
||||
use sammo\Enums\MessageType;
|
||||
|
||||
include "lib.php";
|
||||
@@ -45,12 +47,7 @@ if($destGeneralID==0){
|
||||
$general->setVar('nation', $nationID);
|
||||
}
|
||||
else{
|
||||
$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);
|
||||
$general = General::createObjFromDB($destGeneralID);
|
||||
|
||||
if($general instanceof DummyGeneral){
|
||||
Json::die([
|
||||
|
||||
@@ -1,6 +1,8 @@
|
||||
<?php
|
||||
namespace sammo;
|
||||
|
||||
use sammo\Enums\GeneralAccessLogColumn;
|
||||
|
||||
include "lib.php";
|
||||
include "func.php";
|
||||
|
||||
@@ -86,6 +88,11 @@ $db->update('general', [
|
||||
'owner'=>$userID,
|
||||
'aux'=>Json::encode($genAux)
|
||||
], '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()){
|
||||
Json::die([
|
||||
|
||||
@@ -36,15 +36,19 @@ if($tnmt < 0 || $tnmt > 1){
|
||||
}
|
||||
|
||||
$db = DB::db();
|
||||
$me = General::createGeneralObjFromDB($generalID);
|
||||
$me = General::createObjFromDB($generalID);
|
||||
|
||||
|
||||
if($defence_train !== $me->getVar('defence_train')){
|
||||
if($defence_train == 999){
|
||||
$me->increaseVar('myset', -1);
|
||||
$me->setVar('defence_train', $defence_train);
|
||||
$me->increaseVarWithLimit('train', -3, 20);
|
||||
$me->increaseVarWithLimit('atmos', -6, 20);
|
||||
$affectedTrain = -3;
|
||||
$affectedAtmos = -6;
|
||||
$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{
|
||||
$me->increaseVar('myset', -1);
|
||||
|
||||
@@ -39,7 +39,10 @@ if (!$data || !is_array($data)) {
|
||||
|
||||
$db = DB::db();
|
||||
|
||||
$me = $db->queryFirstRow('SELECT no, name, npc, nation, city, officer_level, con, turntime, belong, permission, penalty FROM general WHERE owner=%i', $userID);
|
||||
$me = $db->queryFirstRow(
|
||||
'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'];
|
||||
|
||||
@@ -270,7 +270,7 @@ if (key_exists('inheritBuff', $rawAttacker)) {
|
||||
}
|
||||
$rawAttacker['aux'] = Json::encode($rawAttacker['aux']);
|
||||
$rawAttacker['owner'] = 0;
|
||||
$attackerGeneral = new General($rawAttacker, extractRankVar($rawAttacker), $rawAttackerCity, $rawAttackerNation, $year, $month);
|
||||
$attackerGeneral = new General($rawAttacker, extractRankVar($rawAttacker), null, $rawAttackerCity, $rawAttackerNation, $year, $month);
|
||||
$attacker = new WarUnitGeneral(
|
||||
$tmpRNG,
|
||||
$attackerGeneral,
|
||||
@@ -308,7 +308,7 @@ foreach ($rawDefenderList as $idx => $rawDefenderGeneral) {
|
||||
$rawDefenderGeneral['aux'] = Json::encode($rawDefenderGeneral['aux']);
|
||||
$rawDefenderGeneral['owner'] = 0;
|
||||
|
||||
$defenderGeneral = new General($rawDefenderGeneral, extractRankVar($rawDefenderGeneral), $rawDefenderCity, $rawAttackerNation, $year, $month, true);
|
||||
$defenderGeneral = new General($rawDefenderGeneral, extractRankVar($rawDefenderGeneral), null, $rawDefenderCity, $rawAttackerNation, $year, $month, true);
|
||||
|
||||
$defenderList[] = new WarUnitGeneral(
|
||||
$tmpRNG,
|
||||
@@ -382,7 +382,7 @@ function simulateBattle(
|
||||
|
||||
$warRng = new RandUtil(new LiteHashDRBG($warSeed));
|
||||
|
||||
$attackerGeneral = new General($rawAttacker, extractRankVar($rawAttacker), $rawAttackerCity, $rawAttackerNation, $year, $month);
|
||||
$attackerGeneral = new General($rawAttacker, extractRankVar($rawAttacker), null, $rawAttackerCity, $rawAttackerNation, $year, $month);
|
||||
$attacker = new WarUnitGeneral(
|
||||
$warRng,
|
||||
$attackerGeneral,
|
||||
@@ -395,7 +395,7 @@ function simulateBattle(
|
||||
$defenderList = [];
|
||||
|
||||
foreach ($rawDefenderList as $rawDefenderGeneral) {
|
||||
$defenderGeneral = new General($rawDefenderGeneral, extractRankVar($rawDefenderGeneral), $rawDefenderCity, $rawAttackerNation, $year, $month, true);
|
||||
$defenderGeneral = new General($rawDefenderGeneral, extractRankVar($rawDefenderGeneral), null, $rawDefenderCity, $rawAttackerNation, $year, $month, true);
|
||||
|
||||
$defenderList[] = new WarUnitGeneral(
|
||||
$warRng,
|
||||
|
||||
@@ -66,7 +66,7 @@ if(!$ownerInfo){
|
||||
$info = Json::decode($info);
|
||||
|
||||
|
||||
$generalObj = General::createGeneralObjFromDB($generalID);
|
||||
$generalObj = General::createObjFromDB($generalID);
|
||||
$oldGeneralName = $generalObj->getName();
|
||||
$db->update('select_pool', [
|
||||
'general_id'=>-$generalID,
|
||||
|
||||
+30
-53
@@ -3,6 +3,7 @@
|
||||
namespace sammo;
|
||||
|
||||
use sammo\DTO\VoteInfo;
|
||||
use sammo\Enums\GeneralQueryMode;
|
||||
|
||||
include "lib.php";
|
||||
include "func.php";
|
||||
@@ -29,7 +30,8 @@ if (!$session->isGameLoggedIn()) {
|
||||
}
|
||||
|
||||
$me = $db->queryFirstRow(
|
||||
'SELECT no,con,turntime,newmsg,newvote,`officer_level` from general where owner = %i',
|
||||
'SELECT no,refresh_score,turntime,newmsg,newvote,`officer_level` FROM `general`
|
||||
LEFT JOIN general_access_log AS l ON `general`.no = l.general_id WHERE owner = %i',
|
||||
$userID
|
||||
);
|
||||
|
||||
@@ -51,13 +53,13 @@ if ($me['newmsg'] == 1 || $me['newvote'] == 1) {
|
||||
|
||||
$plock = boolval($db->queryFirstField('SELECT plock FROM plock WHERE `type`="GAME" LIMIT 1'));
|
||||
|
||||
$con = checkLimit($me['con']);
|
||||
if ($con >= 2) {
|
||||
$limitState = checkLimit($me['refresh_score']);
|
||||
if ($limitState >= 2) {
|
||||
printLimitMsg($me['turntime']);
|
||||
exit();
|
||||
}
|
||||
|
||||
$generalObj = General::createGeneralObjFromDB($me['no']);
|
||||
$generalObj = General::createObjFromDB($me['no'], null, GeneralQueryMode::FullWithAccessLog);
|
||||
$generalObj->setRawCity($db->queryFirstRow('SELECT * FROM city WHERE city = %i', $generalObj->getCityID()));
|
||||
$scenario = $gameStor->scenario_text;
|
||||
|
||||
@@ -180,44 +182,44 @@ if ($lastVoteID) {
|
||||
</div>
|
||||
|
||||
<div class="row center gx-0">
|
||||
<div class="s-border-t col py-2 col-8 col-md-4" style="color:<?= $color ?>;">
|
||||
<div class="s-border-t col py-2 col-8 col-lg-4" style="color:<?= $color ?>;">
|
||||
<?= $scenario ?>
|
||||
</div>
|
||||
<div class="s-border-t col py-2 col-4 col-md-2" style="color:<?= $color ?>;">
|
||||
<div class="s-border-t col py-2 col-4 col-lg-2" style="color:<?= $color ?>;">
|
||||
NPC 수, 상성 : <?= $extend ?>,<?= $fiction ?>
|
||||
</div>
|
||||
<div class="s-border-t col py-2 col-4 col-md-2" style="color:<?= $color ?>;">
|
||||
<div class="s-border-t col py-2 col-4 col-lg-2" style="color:<?= $color ?>;">
|
||||
NPC선택 : <?= $npcmode ?>
|
||||
</div>
|
||||
<div class="s-border-t col py-2 col-4 col-md-2" style="color:<?= $color ?>;">
|
||||
<div class="s-border-t col py-2 col-4 col-lg-2" style="color:<?= $color ?>;">
|
||||
토너먼트 : <?= getTournamentTermText($gameStor->turnterm) ?>
|
||||
</div>
|
||||
<div class="s-border-t col py-2 col-4 col-md-2" style="color:<?= $color ?>;">
|
||||
<div class="s-border-t col py-2 col-4 col-lg-2" style="color:<?= $color ?>;">
|
||||
기타 설정: <?= $otherTextInfo ?>
|
||||
</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-md-2">전체 접속자 수 : <?= $gameStor->online_user_cnt ?> 명</div>
|
||||
<div class="s-border-t col py-2 col-4 col-md-2">턴당 갱신횟수 : <?= $gameStor->conlimit ?>회</div>
|
||||
<div class="s-border-t col py-2 col-8 col-md-4"><?= info(3) ?></div>
|
||||
<div class="s-border-t py-2 col col-6 col-md-4">
|
||||
<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-4 col-lg-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-8 col-lg-4"><?= info(3) ?></div>
|
||||
<div class="s-border-t py-2 col col-6 col-lg-4">
|
||||
<?php if ($isTournamentActive) : ?>
|
||||
↑<span style='color:cyan'><?= (['전력전', '통솔전', '일기토', '설전',])[$gameStor->tnmt_type] ?? '' ?> <?= getTournament($gameStor->tournament) ?> <?= getTournamentTime() ?></span>↑
|
||||
<?php else : ?>
|
||||
<span style='color:magenta'>현재 토너먼트 경기 없음</span>
|
||||
<?php endif; ?>
|
||||
</div>
|
||||
<div class="s-border-t py-2 col col-6 col-md-2">
|
||||
<div class="s-border-t py-2 col col-6 col-lg-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>
|
||||
<div class="s-border-t py-2 col col-6 col-md-2">
|
||||
<div class="s-border-t py-2 col col-6 col-lg-2">
|
||||
<?php if ($auctionCount > 0) : ?>
|
||||
<span style='color:cyan'><?= $auctionCount ?>건</span> 거래 진행중
|
||||
<?php else : ?>
|
||||
<span style='color:magenta'>진행중 거래 없음</span>
|
||||
<?php endif; ?>
|
||||
</div>
|
||||
<div class="s-border-t py-2 col col-6 col-md-4 vote-cell">
|
||||
<div class="s-border-t py-2 col col-6 col-lg-4 vote-cell">
|
||||
<?php
|
||||
?>
|
||||
<?php if ($lastVote === null) : ?>
|
||||
@@ -283,19 +285,6 @@ if ($lastVoteID) {
|
||||
<div id="general-position"><?php generalInfo($generalObj); ?></div>
|
||||
<div id="generalCommandButton" class="row gx-0">
|
||||
<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>
|
||||
@@ -310,11 +299,11 @@ if ($lastVoteID) {
|
||||
</div>
|
||||
</div>
|
||||
<div class="row gx-0">
|
||||
<div class="col-md-6" id="general_public_record-position">
|
||||
<div class="col-lg-6" id="general_public_record-position">
|
||||
<div class="bg1 center s-border-tb"><b>장수 동향</b></div>
|
||||
<div id="general_public_record" style="text-align:left;"><?= formatHistoryToHTML(getGlobalActionLogRecent(15)) ?></div>
|
||||
</div>
|
||||
<div class="col-md-6" id="general_log-position">
|
||||
<div class="col-lg-6" id="general_log-position">
|
||||
<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>
|
||||
@@ -328,34 +317,34 @@ if ($lastVoteID) {
|
||||
|
||||
<div id="message_board" class="row gx-0">
|
||||
<div class="message_input_form bg0 gx-0 row">
|
||||
<div id="mailbox_list-col" class="col-6 col-md-2 d-grid">
|
||||
<div id="mailbox_list-col" class="col-6 col-lg-2 d-grid">
|
||||
<select id="mailbox_list" size="1" class="form-control bg-dark text-white">
|
||||
</select>
|
||||
</div>
|
||||
<div id="msg_input-col" class="col-12 col-md-8 d-grid">
|
||||
<div id="msg_input-col" class="col-12 col-lg-8 d-grid">
|
||||
<input type="text" id="msg_input" maxlength="99" class="form-control">
|
||||
</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 id="msg_submit-col" class="col-6 col-lg-2 d-grid"><button id="msg_submit" class="btn btn-primary">서신전달&갱신</button></div>
|
||||
</div>
|
||||
<div class="col-md-6 board_side bg0"><a id="public_talk_position"></a>
|
||||
<div class="col-lg-6 board_side bg0"><a id="public_talk_position"></a>
|
||||
<div class="board_header bg0">전체 메시지(최고99자)</div>
|
||||
<section class="public_message">
|
||||
<div class="d-grid"><button type="button" class="load_old_message btn btn-secondary" data-msg_type="public">이전 메시지 불러오기</button></div>
|
||||
</section>
|
||||
</div>
|
||||
<div class="col-md-6 board_side bg0"><a id="national_talk_position"></a>
|
||||
<div class="col-lg-6 board_side bg0"><a id="national_talk_position"></a>
|
||||
<div class="board_header bg0">국가 메시지(최고99자)</div>
|
||||
<section class="national_message">
|
||||
<div class="d-grid"><button type="button" class="load_old_message btn btn-secondary" data-msg_type="national">이전 메시지 불러오기</button></div>
|
||||
</section>
|
||||
</div>
|
||||
<div class="col-md-6 board_side bg0"><a id="private_talk_position"></a>
|
||||
<div class="col-lg-6 board_side bg0"><a id="private_talk_position"></a>
|
||||
<div class="board_header bg0">개인 메시지(최고99자)</div>
|
||||
<section class="private_message">
|
||||
<div class="d-grid"><button type="button" class="load_old_message btn btn-secondary" data-msg_type="private">이전 메시지 불러오기</button></div>
|
||||
</section>
|
||||
</div>
|
||||
<div class="col-md-6 board_side bg0"><a id="diplomacy_talk_position"></a>
|
||||
<div class="col-lg-6 board_side bg0"><a id="diplomacy_talk_position"></a>
|
||||
<div class="board_header bg0">외교 메시지(최고99자)</div>
|
||||
<section class="diplomacy_message">
|
||||
<div class="d-grid"><button type="button" class="load_old_message btn btn-secondary" data-msg_type="diplomacy">이전 메시지 불러오기</button></div>
|
||||
@@ -367,7 +356,7 @@ if ($lastVoteID) {
|
||||
</div>
|
||||
</div>
|
||||
<?php
|
||||
if ($con == 1) {
|
||||
if ($limitState == 1) {
|
||||
MessageBox("접속제한이 얼마 남지 않았습니다!");
|
||||
}
|
||||
if ($me['newmsg'] == 1) {
|
||||
@@ -379,7 +368,7 @@ if ($lastVoteID) {
|
||||
}
|
||||
?>
|
||||
</div>
|
||||
<nav class="navbar navbar-expand fixed-bottom navbar-dark bg-dark d-sm-block d-md-none p-0" id="navbar500">
|
||||
<nav class="navbar navbar-expand fixed-bottom navbar-dark bg-dark d-sm-block d-lg-none p-0" id="navbar500">
|
||||
<div class="container-fluid px-0">
|
||||
<div class="collapse navbar-collapse">
|
||||
<ul class="navbar-nav me-auto mx-auto">
|
||||
@@ -396,18 +385,6 @@ if ($lastVoteID) {
|
||||
국가 메뉴
|
||||
</div>
|
||||
<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>
|
||||
</li>
|
||||
<li class="nav-item dropup">
|
||||
|
||||
+36
-17
@@ -3,6 +3,7 @@
|
||||
namespace sammo;
|
||||
|
||||
use sammo\Enums\EventTarget;
|
||||
use sammo\Enums\GeneralQueryMode;
|
||||
|
||||
function processWar(string $warSeed, General $attackerGeneral, array $rawAttackerNation, array $rawDefenderCity)
|
||||
{
|
||||
@@ -36,13 +37,13 @@ function processWar(string $warSeed, General $attackerGeneral, array $rawAttacke
|
||||
|
||||
$city = new WarUnitCity($rng, $rawDefenderCity, $rawDefenderNation, $year, $month, $startYear);
|
||||
|
||||
$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'));
|
||||
$defenderGeneralList = General::createGeneralObjListFromDB($defenderIDList, null, 2);
|
||||
$defenderCityGeneralIDList = $db->queryFirstColumn('SELECT no FROM general WHERE nation=%i AND city=%i AND nation!=0', $city->getVar('nation'), $city->getVar('city'));
|
||||
$defenderCityGeneralList = General::createObjListFromDB($defenderCityGeneralIDList, null);
|
||||
|
||||
/** @var WarUnit[] */
|
||||
$defenderList = [];
|
||||
foreach($defenderGeneralList as $defenderGeneral){
|
||||
|
||||
foreach($defenderCityGeneralList as $defenderGeneral){
|
||||
$defenderGeneral->setRawCity($rawDefenderCity);
|
||||
$defenderCandidate = new WarUnitGeneral($rng, $defenderGeneral, $rawDefenderNation, false);
|
||||
if(extractBattleOrder($defenderCandidate, $attacker) <= 0){
|
||||
continue;
|
||||
@@ -185,7 +186,7 @@ function processWar(string $warSeed, General $attackerGeneral, array $rawAttacke
|
||||
'year' => $year,
|
||||
'month' => $month,
|
||||
'join_mode' => $joinMode,
|
||||
], $attacker->getGeneral(), $city->getRaw());
|
||||
], $attacker->getGeneral(), $city->getRaw(), $defenderCityGeneralList);
|
||||
}
|
||||
|
||||
function extractBattleOrder(WarUnit $defender, WarUnit $attacker)
|
||||
@@ -480,17 +481,18 @@ function processWar_NG(
|
||||
$attacker->finishBattle();
|
||||
$defender->finishBattle();
|
||||
|
||||
if($city->getDead()){
|
||||
$city->setSiege();
|
||||
$city->finishBattle();
|
||||
}
|
||||
if($city->getDead() || $defender instanceof WarUnitCity){
|
||||
if($city !== $defender){
|
||||
$city->setOppose($attacker);
|
||||
$city->setSiege();
|
||||
$city->finishBattle();
|
||||
}
|
||||
|
||||
if ($defender instanceof WarUnitCity) {
|
||||
$newConflict = $defender->addConflict();
|
||||
$newConflict = $city->addConflict();
|
||||
if ($newConflict) {
|
||||
$nationName = $attacker->getNationVar('name');
|
||||
$josaYi = JosaUtil::pick($nationName, '이');
|
||||
$logger->pushGlobalHistoryLog("<M><b>【분쟁】</b></><D><b>{$nationName}</b></>{$josaYi} <G><b>{$defender->getName()}</b></> 공략에 가담하여 분쟁이 발생하고 있습니다.");
|
||||
$logger->pushGlobalHistoryLog("<M><b>【분쟁】</b></><D><b>{$nationName}</b></>{$josaYi} <G><b>{$city->getName()}</b></> 공략에 가담하여 분쟁이 발생하고 있습니다.");
|
||||
}
|
||||
}
|
||||
|
||||
@@ -527,8 +529,9 @@ function getConquerNation($city): int
|
||||
return Util::array_first_key($conflict);
|
||||
}
|
||||
|
||||
function ConquerCity(array $admin, General $general, array $city)
|
||||
function ConquerCity(array $admin, General $general, array $city, array $defenderCityGeneralList)
|
||||
{
|
||||
/** @var General[] $defenderCityGeneralList */
|
||||
$db = DB::db();
|
||||
|
||||
$year = $admin['year'];
|
||||
@@ -583,6 +586,21 @@ function ConquerCity(array $admin, General $general, array $city)
|
||||
if(TurnExecutionHelper::runEventHandler($db, $gameStor, EventTarget::OccupyCity)){
|
||||
$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);
|
||||
}
|
||||
|
||||
|
||||
// 국가 멸망시
|
||||
@@ -594,10 +612,10 @@ function ConquerCity(array $admin, General $general, array $city)
|
||||
|
||||
$lord = new General($db->queryFirstRow(
|
||||
'SELECT %l FROM general WHERE nation = %i AND officer_level = %i LIMIT 1',
|
||||
Util::formatListOfBackticks(General::mergeQueryColumn(['npc', 'gold', 'rice', 'experience', 'explevel', 'belong', 'dedication', 'dedlevel', 'aux'], 1)[0]),
|
||||
Util::formatListOfBackticks(General::mergeQueryColumn()[0]),
|
||||
$defenderNationID,
|
||||
12
|
||||
), null, $city, $loseNation, $year, $month, false);
|
||||
), null, null, $city, $loseNation, $year, $month);
|
||||
|
||||
$josaUl = JosaUtil::pick($defenderNationName, '을');
|
||||
$attackerLogger->pushNationalHistoryLog("<D><b>{$defenderNationName}</b></>{$josaUl} 정복");
|
||||
@@ -694,11 +712,12 @@ function ConquerCity(array $admin, General $general, array $city)
|
||||
$minCity = findNextCapital($cityID, $defenderNationID);
|
||||
|
||||
$minCityName = CityConst::byID($minCity)->name;
|
||||
$josaRo = JosaUtil::pick($minCityName, '로');
|
||||
|
||||
$josaYi = JosaUtil::pick($defenderNationName, '이');
|
||||
$attackerLogger->pushGlobalHistoryLog("<M><b>【긴급천도】</b></><D><b>{$defenderNationName}</b></>{$josaYi} 수도가 함락되어 <G><b>$minCityName</b></>으로 긴급천도하였습니다.");
|
||||
$attackerLogger->pushGlobalHistoryLog("<M><b>【긴급천도】</b></><D><b>{$defenderNationName}</b></>{$josaYi} 수도가 함락되어 <G><b>$minCityName</b></>{$josaRo} 긴급천도하였습니다.");
|
||||
|
||||
$moveLog = "수도가 함락되어 <G><b>$minCityName</b></>으로 <M>긴급천도</>합니다.";
|
||||
$moveLog = "수도가 함락되어 <G><b>$minCityName</b></>{$josaRo} <M>긴급천도</>합니다.";
|
||||
//아국 수뇌부에게 로그 전달
|
||||
foreach ($db->queryFirstColumn(
|
||||
'SELECT no FROM general WHERE nation=%i AND officer_level>=5',
|
||||
|
||||
@@ -39,7 +39,7 @@ class BidBuyRiceAuction extends \sammo\BaseAPI
|
||||
$amount = $this->args['amount'];
|
||||
|
||||
$generalID = $session->generalID;
|
||||
$general = General::createGeneralObjFromDB($generalID);
|
||||
$general = General::createObjFromDB($generalID);
|
||||
$auction = new AuctionBuyRice($auctionID, $general);
|
||||
$result = $auction->bid($amount, true);
|
||||
|
||||
|
||||
@@ -38,7 +38,7 @@ class BidSellRiceAuction extends \sammo\BaseAPI
|
||||
$amount = $this->args['amount'];
|
||||
|
||||
$generalID = $session->generalID;
|
||||
$general = General::createGeneralObjFromDB($generalID);
|
||||
$general = General::createObjFromDB($generalID);
|
||||
$auction = new AuctionSellRice($auctionID, $general);
|
||||
$result = $auction->bid($amount, true);
|
||||
|
||||
|
||||
@@ -41,7 +41,7 @@ class BidUniqueAuction extends \sammo\BaseAPI
|
||||
$tryExtendCloseDate = $this->args['extendCloseDate'] ?? false;
|
||||
|
||||
$generalID = $session->generalID;
|
||||
$general = General::createGeneralObjFromDB($generalID);
|
||||
$general = General::createObjFromDB($generalID);
|
||||
$auction = new AuctionUniqueItem($auctionID, $general);
|
||||
$result = $auction->bid($amount, $tryExtendCloseDate);
|
||||
|
||||
|
||||
@@ -10,6 +10,7 @@ use sammo\DTO\AuctionBidItem;
|
||||
use sammo\DTO\AuctionInfo;
|
||||
use sammo\Enums\APIRecoveryType;
|
||||
use sammo\Enums\AuctionType;
|
||||
use sammo\Enums\GeneralQueryMode;
|
||||
use sammo\Enums\InheritanceKey;
|
||||
use sammo\InheritancePointManager;
|
||||
use sammo\TimeUtil;
|
||||
@@ -76,7 +77,7 @@ class GetUniqueItemAuctionDetail extends \sammo\BaseAPI
|
||||
$inheritMgr = InheritancePointManager::getInstance();
|
||||
//preveious라서 column을 최대한 비울 수 있다.
|
||||
$remainPoint = $inheritMgr->getInheritancePoint(
|
||||
General::createGeneralObjFromDB($generalID, ['owner'], 0),
|
||||
General::createObjFromDB($generalID),
|
||||
InheritanceKey::previous
|
||||
);
|
||||
|
||||
|
||||
@@ -66,7 +66,7 @@ class OpenBuyRiceAuction extends \sammo\BaseAPI
|
||||
$finishBidAmount = $this->args['finishBidAmount'];
|
||||
$generalID = $session->generalID;
|
||||
|
||||
$general = General::createGeneralObjFromDB($generalID);
|
||||
$general = General::createObjFromDB($generalID);
|
||||
|
||||
$db = DB::db();
|
||||
$gameStor = KVStorage::getStorage($db, 'game_env');
|
||||
|
||||
@@ -66,7 +66,7 @@ class OpenSellRiceAuction extends \sammo\BaseAPI
|
||||
$finishBidAmount = $this->args['finishBidAmount'];
|
||||
$generalID = $session->generalID;
|
||||
|
||||
$general = General::createGeneralObjFromDB($generalID);
|
||||
$general = General::createObjFromDB($generalID);
|
||||
|
||||
$db = DB::db();
|
||||
$gameStor = KVStorage::getStorage($db, 'game_env');
|
||||
|
||||
@@ -57,7 +57,7 @@ class OpenUniqueAuction extends \sammo\BaseAPI
|
||||
$generalID = $session->generalID;
|
||||
|
||||
$itemObj = buildItemClass($itemID);
|
||||
$general = General::createGeneralObjFromDB($generalID);
|
||||
$general = General::createObjFromDB($generalID);
|
||||
|
||||
$db = DB::db();
|
||||
$gameStor = KVStorage::getStorage($db, 'game_env');
|
||||
|
||||
@@ -42,9 +42,12 @@ class GetBettingList extends \sammo\BaseAPI
|
||||
$bettingStor = KVStorage::getStorage($db, 'betting');
|
||||
$userID = $session->userID;
|
||||
|
||||
$me = $db->queryFirstRow('SELECT no,nation,officer_level,con,turntime,belong,penalty,permission FROM general WHERE owner=%i', $userID);
|
||||
$con = checkLimit($me['con']);
|
||||
if ($con >= 2) {
|
||||
$me = $db->queryFirstRow(
|
||||
'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
|
||||
);
|
||||
$limitState = checkLimit($me['refresh_score']);
|
||||
if ($limitState >= 2) {
|
||||
return "접속 제한중입니다.";
|
||||
}
|
||||
|
||||
|
||||
@@ -39,7 +39,7 @@ class BuildNationCandidate extends \sammo\BaseAPI
|
||||
$gameStor = KVStorage::getStorage($db, 'game_env');
|
||||
$gameStor->cacheValues(['opentime', 'turntime']);
|
||||
|
||||
$general = $db->queryFirstRow('SELECT no,name,nation,owner_name,npc,lastrefresh FROM general WHERE owner=%i', $userID);
|
||||
$general = $db->queryFirstRow('SELECT no,name,nation,owner_name,npc FROM general WHERE owner=%i', $userID);
|
||||
|
||||
if (!$general) {
|
||||
return '장수가 없습니다';
|
||||
@@ -59,7 +59,7 @@ class BuildNationCandidate extends \sammo\BaseAPI
|
||||
|
||||
$env = $gameStor->getAll();
|
||||
|
||||
$generalObj = General::createGeneralObjFromDB($general['no']);
|
||||
$generalObj = General::createObjFromDB($general['no']);
|
||||
|
||||
$validCmd = false;
|
||||
foreach(GameConst::$availableGeneralCommand as $cmdList){
|
||||
|
||||
@@ -5,6 +5,7 @@ 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;
|
||||
@@ -37,7 +38,13 @@ class DieOnPrestart extends \sammo\BaseAPI
|
||||
$gameStor = KVStorage::getStorage($db, 'game_env');
|
||||
$gameStor->cacheValues(['turnterm', 'opentime', 'turntime', 'year', 'month']);
|
||||
|
||||
$general = $db->queryFirstRow('SELECT no,name,nation,owner_name,npc,lastrefresh FROM general WHERE owner=%i AND npc = 0', $userID);
|
||||
$general = $db->queryFirstRow('SELECT no,name,nation,owner_name,npc 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) {
|
||||
return '장수가 없습니다';
|
||||
@@ -55,13 +62,13 @@ class DieOnPrestart extends \sammo\BaseAPI
|
||||
}
|
||||
|
||||
//서버 가오픈시 할 수 있는 행동
|
||||
$targetTime = addTurn($general['lastrefresh'], $gameStor->turnterm, GameConst::$minTurnDieOnPrestart);
|
||||
$targetTime = addTurn($lastRefresh, $gameStor->turnterm, GameConst::$minTurnDieOnPrestart);
|
||||
if ($targetTime > TimeUtil::now()) {
|
||||
$targetTimeShort = substr($targetTime, 0, 19);
|
||||
return "아직 삭제할 수 없습니다. {$targetTimeShort} 부터 가능합니다.";
|
||||
}
|
||||
|
||||
$generalObj = General::createGeneralObjFromDB($general['no']);
|
||||
$generalObj = General::createObjFromDB($general['no']);
|
||||
if ($generalObj instanceof DummyGeneral) {
|
||||
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
|
||||
{
|
||||
$generalID = $session->generalID;
|
||||
$me = General::createGeneralObjFromDB($generalID);
|
||||
$me = General::createObjFromDB($generalID);
|
||||
|
||||
$itemType = $this->args['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
|
||||
{
|
||||
$generalID = $session->generalID;
|
||||
$me = General::createGeneralObjFromDB($generalID);
|
||||
$me = General::createObjFromDB($generalID);
|
||||
$commandTable = getCommandTable($me);
|
||||
|
||||
return [
|
||||
|
||||
@@ -9,7 +9,9 @@ use sammo\DB;
|
||||
use sammo\DTO\VoteInfo;
|
||||
use sammo\Enums\APIRecoveryType;
|
||||
use sammo\Enums\CityColumn;
|
||||
use sammo\Enums\GeneralAccessLogColumn;
|
||||
use sammo\Enums\GeneralColumn;
|
||||
use sammo\Enums\GeneralQueryMode;
|
||||
use sammo\Enums\RankColumn;
|
||||
use sammo\GameConst;
|
||||
use sammo\General;
|
||||
@@ -173,7 +175,7 @@ class GetFrontInfo extends \sammo\BaseAPI
|
||||
'online_nation', 'online_user_cnt',
|
||||
'year', 'month', 'startyear',
|
||||
'maxgeneral',
|
||||
'conlimit',
|
||||
'refreshLimit',
|
||||
'server_cnt',
|
||||
]);
|
||||
|
||||
@@ -383,7 +385,8 @@ class GetFrontInfo extends \sammo\BaseAPI
|
||||
'specialWar' => $general->getVar(GeneralColumn::special2), // GameObjClassKey;
|
||||
'personal' => $general->getVar(GeneralColumn::personal), // GameObjClassKey;
|
||||
'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;
|
||||
'officerLevelText' => getOfficerLevelText($general->getVar(GeneralColumn::officer_level), $rawNation['level']), // string;
|
||||
@@ -400,7 +403,7 @@ class GetFrontInfo extends \sammo\BaseAPI
|
||||
'troop' => $general->getVar(GeneralColumn::troop), // number;
|
||||
//P0 End
|
||||
|
||||
'con' => $general->getVar(GeneralColumn::con), // number;
|
||||
'refreshScore' => $general->getAccessLogVar(GeneralAccessLogColumn::refreshScore, 0), // number;
|
||||
'specage' => $general->getVar(GeneralColumn::specage), // number;
|
||||
'specage2' => $general->getVar(GeneralColumn::specage2), // number;
|
||||
'leadership_exp' => $general->getVar(GeneralColumn::leadership_exp), // number;
|
||||
@@ -531,12 +534,12 @@ class GetFrontInfo extends \sammo\BaseAPI
|
||||
{
|
||||
$generalID = $session->generalID;
|
||||
//NOTE: 이 경우 staticNation 정보를 조회한다.
|
||||
$general = General::createGeneralObjFromDB($generalID);
|
||||
$general = General::createObjFromDB($generalID, null, GeneralQueryMode::FullWithAccessLog);
|
||||
$nationID = $general->getNationID();
|
||||
$cityID = $general->getCityID();
|
||||
|
||||
$con = checkLimit($general->getVar('con'));
|
||||
if ($con >= 2) {
|
||||
$limitState = checkLimit($general->getAccessLogVar(GeneralAccessLogColumn::refreshScore, 0));
|
||||
if ($limitState >= 2) {
|
||||
return [
|
||||
'result' => false,
|
||||
'reason' => '접속 제한중입니다.',
|
||||
|
||||
@@ -0,0 +1,81 @@
|
||||
<?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,6 +8,7 @@ use sammo\Auction;
|
||||
use sammo\CityConst;
|
||||
use sammo\DB;
|
||||
use sammo\Enums\APIRecoveryType;
|
||||
use sammo\Enums\GeneralAccessLogColumn;
|
||||
use sammo\Enums\RankColumn;
|
||||
use sammo\GameConst;
|
||||
use sammo\GameUnitConst;
|
||||
@@ -414,8 +415,6 @@ class Join extends \sammo\BaseAPI
|
||||
'officer_level' => 0,
|
||||
'turntime' => $turntime,
|
||||
'killturn' => 6,
|
||||
'lastconnect' => $now,
|
||||
'lastrefresh' => $now,
|
||||
'crewtype' => GameUnitConst::DEFAULT_CREWTYPE,
|
||||
'makelimit' => 0,
|
||||
'betray' => $betray,
|
||||
@@ -428,6 +427,11 @@ class Join extends \sammo\BaseAPI
|
||||
'special2' => $special2
|
||||
]);
|
||||
$generalID = $db->insertId();
|
||||
$db->insert('general_access_log', [
|
||||
GeneralAccessLogColumn::generalID->value => $generalID,
|
||||
GeneralAccessLogColumn::userID->value => $userID,
|
||||
GeneralAccessLogColumn::lastRefresh->value => $now,
|
||||
]);
|
||||
|
||||
if($blockCustomGeneralName){
|
||||
//XXX: 클래스가 이게 맞나?
|
||||
|
||||
@@ -42,9 +42,12 @@ class GeneralList extends \sammo\BaseAPI
|
||||
$userID = $session->userID;
|
||||
if ($session->isGameLoggedIn()) {
|
||||
increaseRefresh("장수일람", 2);
|
||||
$me = $db->queryFirstRow('SELECT con, turntime FROM general WHERE owner=%i', $userID);
|
||||
$con = checkLimit($me['con']);
|
||||
if ($con >= 2) {
|
||||
$me = $db->queryFirstRow(
|
||||
'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']);
|
||||
if ($limitState >= 2) {
|
||||
return '접속 제한중입니다. 1턴 이내에 너무 많은 갱신을 하셨습니다.';
|
||||
}
|
||||
} else {
|
||||
@@ -62,7 +65,8 @@ class GeneralList extends \sammo\BaseAPI
|
||||
$session->setReadOnly();
|
||||
|
||||
|
||||
$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');
|
||||
$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,refresh_score_total from `general` LEFT JOIN `general_access_log` ON general.no = general_access_log.general_id');
|
||||
|
||||
$ownerNameList = [];
|
||||
if ($gameStor->isunited) {
|
||||
@@ -73,7 +77,7 @@ class GeneralList extends \sammo\BaseAPI
|
||||
|
||||
$generalList = [];
|
||||
foreach ($rawGeneralList as $rawGeneral) {
|
||||
[$owner, $no, $picture, $imgsvr, $npc, $age, $nation, $special, $special2, $personal, $name, $ownerName, $injury, $leadership, $strength, $intel, $experience, $dedication, $officerLevel, $killturn, $connectCnt] = $rawGeneral;
|
||||
[$owner, $no, $picture, $imgsvr, $npc, $age, $nation, $special, $special2, $personal, $name, $ownerName, $injury, $leadership, $strength, $intel, $experience, $dedication, $officerLevel, $killturn, $refreshScoreTotal] = $rawGeneral;
|
||||
|
||||
if (key_exists($owner, $ownerNameList)) {
|
||||
$ownerName = $ownerNameList[$owner];
|
||||
@@ -104,7 +108,7 @@ class GeneralList extends \sammo\BaseAPI
|
||||
getDed($dedication),
|
||||
getOfficerLevelText($officerLevel, $nationArr['level']),
|
||||
$killturn,
|
||||
$connectCnt
|
||||
$refreshScoreTotal ?: 0,
|
||||
];
|
||||
}
|
||||
|
||||
@@ -129,6 +133,8 @@ class GeneralList extends \sammo\BaseAPI
|
||||
'honorText',
|
||||
'dedLevelText',
|
||||
'officerLevelText',
|
||||
'killturn',
|
||||
'refreshScoreTotal',
|
||||
];
|
||||
|
||||
$result = [
|
||||
|
||||
@@ -148,13 +148,16 @@ class GetHistory extends \sammo\BaseAPI
|
||||
}
|
||||
increaseRefresh("연감", 1);
|
||||
|
||||
$me = $db->queryFirstRow('SELECT con, turntime FROM general WHERE owner = %i', $session->userID);
|
||||
$me = $db->queryFirstRow(
|
||||
'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) {
|
||||
return '장수가 사망했습니다.';
|
||||
}
|
||||
|
||||
$con = checkLimit($me['con']);
|
||||
if ($con >= 2) {
|
||||
$limitState = checkLimit($me['refresh_score']);
|
||||
if ($limitState >= 2) {
|
||||
return templateLimitMsg($me['turntime']);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -49,7 +49,7 @@ class BuyHiddenBuff extends \sammo\BaseAPI
|
||||
$type = $this->args['type'];
|
||||
$level = $this->args['level'];
|
||||
|
||||
$general = General::createGeneralObjFromDB($generalID);
|
||||
$general = General::createObjFromDB($generalID);
|
||||
if ($userID != $general->getVar('owner')) {
|
||||
return '로그인 상태가 이상합니다. 다시 로그인해 주세요.';
|
||||
}
|
||||
|
||||
@@ -31,7 +31,7 @@ class BuyRandomUnique extends \sammo\BaseAPI
|
||||
$userID = $session->userID;
|
||||
$generalID = $session->generalID;
|
||||
|
||||
$general = General::createGeneralObjFromDB($generalID);
|
||||
$general = General::createObjFromDB($generalID);
|
||||
if($userID != $general->getVar('owner')){
|
||||
return '로그인 상태가 이상합니다. 다시 로그인해 주세요.';
|
||||
}
|
||||
|
||||
@@ -31,7 +31,7 @@ class ResetSpecialWar extends \sammo\BaseAPI
|
||||
$userID = $session->userID;
|
||||
$generalID = $session->generalID;
|
||||
|
||||
$general = General::createGeneralObjFromDB($generalID);
|
||||
$general = General::createObjFromDB($generalID);
|
||||
if ($userID != $general->getVar('owner')) {
|
||||
return '로그인 상태가 이상합니다. 다시 로그인해 주세요.';
|
||||
}
|
||||
|
||||
@@ -36,7 +36,7 @@ class ResetTurnTime extends \sammo\BaseAPI
|
||||
$userID = $session->userID;
|
||||
$generalID = $session->generalID;
|
||||
|
||||
$general = General::createGeneralObjFromDB($generalID);
|
||||
$general = General::createObjFromDB($generalID);
|
||||
if ($userID != $general->getVar('owner')) {
|
||||
return '로그인 상태가 이상합니다. 다시 로그인해 주세요.';
|
||||
}
|
||||
@@ -52,7 +52,7 @@ class ResetTurnTime extends \sammo\BaseAPI
|
||||
|
||||
$db = DB::db();
|
||||
$gameStor = KVStorage::getStorage($db, 'game_env');
|
||||
if($gameStor->isunited){
|
||||
if ($gameStor->isunited) {
|
||||
return '이미 천하가 통일되었습니다.';
|
||||
}
|
||||
$inheritStor = KVStorage::getStorage($db, "inheritance_{$userID}");
|
||||
@@ -62,36 +62,25 @@ class ResetTurnTime extends \sammo\BaseAPI
|
||||
}
|
||||
|
||||
$gameStor = KVStorage::getStorage($db, 'game_env');
|
||||
[$turnTerm, $serverTurnTime] = $gameStor->getValuesAsArray(['turnterm', 'turntime']);
|
||||
$turnTerm = $gameStor->getValue('turnterm');
|
||||
|
||||
$currTurnTime = new DateTimeImmutable($general->getTurnTime());
|
||||
$serverTurnTimeObj = new DateTimeImmutable($serverTurnTime);
|
||||
|
||||
$rng = new RandUtil(new LiteHashDRBG(Util::simpleSerialize(
|
||||
UniqueConst::$hiddenSeed,
|
||||
'ResetTurnTime',
|
||||
$userID,
|
||||
$general->getTurnTime()
|
||||
$general->getAuxVar('nextTurnTimeBase') ?? $general->getTurnTime()
|
||||
)));
|
||||
|
||||
$afterTurn = $rng->nextRange($turnTerm * -60 / 2, $turnTerm * 60 / 2);
|
||||
$afterTurn = $rng->nextFloat1() * $turnTerm * 60;
|
||||
|
||||
$userLogger = new UserLogger($userID);
|
||||
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->push(sprintf("{$reqPoint} 포인트로 턴 시간을 바꾸어 다다음 턴부터 %02d:%02d 적용", intdiv(Util::toInt($afterTurn), 60), $afterTurn % 60), "inheritPoint");
|
||||
$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('nextTurnTimeBase', $afterTurn);
|
||||
$inheritStor->setValue('previous', [$previousPoint - $reqPoint, null]);
|
||||
$general->increaseRankVar(RankColumn::inherit_point_spent_dynamic, $reqPoint);
|
||||
$general->applyDB($db);
|
||||
|
||||
@@ -44,7 +44,7 @@ class SetNextSpecialWar extends \sammo\BaseAPI
|
||||
|
||||
$type = $this->args['type'];
|
||||
|
||||
$general = General::createGeneralObjFromDB($generalID);
|
||||
$general = General::createObjFromDB($generalID);
|
||||
if ($userID != $general->getVar('owner')) {
|
||||
return '로그인 상태가 이상합니다. 다시 로그인해 주세요.';
|
||||
}
|
||||
|
||||
@@ -75,7 +75,7 @@ class GetOldMessage extends \sammo\BaseAPI
|
||||
|
||||
|
||||
$db = DB::db();
|
||||
$me = $db->queryFirstRow('SELECT `no`,`name`,`nation`,`officer_level`,`con`,`picture`,`imgsvr`,penalty,permission FROM general WHERE `owner`=%i', $userID);
|
||||
$me = $db->queryFirstRow('SELECT `no`,`name`,`nation`,`officer_level`,`picture`,`imgsvr`,penalty,permission FROM general WHERE `owner`=%i', $userID);
|
||||
|
||||
if ($me === null) {
|
||||
return '장수가 사망했습니다.';
|
||||
|
||||
@@ -73,7 +73,7 @@ class GetRecentMessage extends \sammo\BaseAPI
|
||||
|
||||
|
||||
$db = DB::db();
|
||||
$me = $db->queryFirstRow('SELECT `no`,`name`,`nation`,`officer_level`,`con`,`picture`,`imgsvr`,penalty,permission FROM general WHERE `owner`=%i', $userID);
|
||||
$me = $db->queryFirstRow('SELECT `no`,`name`,`nation`,`officer_level`,`picture`,`imgsvr`,penalty,permission FROM general WHERE `owner`=%i', $userID);
|
||||
|
||||
if ($me === null) {
|
||||
return '장수가 사망했습니다.';
|
||||
|
||||
@@ -108,7 +108,7 @@ class SendMessage extends \sammo\BaseAPI
|
||||
$unlimited = new \DateTime('9999-12-31');
|
||||
|
||||
$db = DB::db();
|
||||
$destUser = $db->queryFirstRow('SELECT `no`,`name`,`nation`,`officer_level`,`con`,`picture`,`imgsvr`,permission,penalty FROM general WHERE `no`=%i', $destGeneralID);
|
||||
$destUser = $db->queryFirstRow('SELECT `no`,`name`,`nation`,`officer_level`,`picture`,`imgsvr`,permission,penalty FROM general WHERE `no`=%i', $destGeneralID);
|
||||
|
||||
if (!$destUser) {
|
||||
return '존재하지 않는 유저입니다.';
|
||||
@@ -160,15 +160,18 @@ class SendMessage extends \sammo\BaseAPI
|
||||
}
|
||||
|
||||
$db = DB::db();
|
||||
$me = $db->queryFirstRow('SELECT `no`,`name`,`nation`,`officer_level`,`con`,`picture`,`imgsvr`,penalty,permission,belong FROM general WHERE `owner`=%i', $userID);
|
||||
$me = $db->queryFirstRow(
|
||||
'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) {
|
||||
$session->logoutGame();
|
||||
return '장수가 없습니다.';
|
||||
}
|
||||
|
||||
$con = checkLimit($me['con']);
|
||||
if ($con >= 2) {
|
||||
$limitState = checkLimit($me['refresh_score']);
|
||||
if ($limitState >= 2) {
|
||||
return '접속 제한입니다.';
|
||||
}
|
||||
|
||||
|
||||
@@ -5,7 +5,10 @@ namespace sammo\API\Nation;
|
||||
use ArrayObject;
|
||||
use sammo\DB;
|
||||
use sammo\Enums\APIRecoveryType;
|
||||
use sammo\Enums\GeneralLiteQueryMode;
|
||||
use sammo\Enums\GeneralQueryMode;
|
||||
use sammo\General;
|
||||
use sammo\GeneralLite;
|
||||
use sammo\Session;
|
||||
use sammo\Util;
|
||||
|
||||
@@ -44,12 +47,10 @@ class GeneralList extends \sammo\BaseAPI
|
||||
'special2' => 0,
|
||||
'personal' => 0,
|
||||
'belong' => 0,
|
||||
'connect' => 0,
|
||||
|
||||
'troop' => 0,
|
||||
'city' => 0,
|
||||
|
||||
'con' => 1,
|
||||
'specage' => 0,
|
||||
'specage2' => 0,
|
||||
'leadership_exp' => 1,
|
||||
@@ -83,6 +84,11 @@ class GeneralList extends \sammo\BaseAPI
|
||||
|
||||
'owner_name' => 9, //안씀.
|
||||
|
||||
|
||||
//accessLog
|
||||
'refresh_score_total' => 0,
|
||||
'refresh_score' => 1,
|
||||
|
||||
//RANK
|
||||
'warnum' => 1,
|
||||
'killnum' => 1,
|
||||
@@ -95,6 +101,8 @@ class GeneralList extends \sammo\BaseAPI
|
||||
static $columnRemap = [
|
||||
'special' => 'specialDomestic',
|
||||
'special2' => 'specialWar',
|
||||
'refresh_score_total' => 'refreshScoreTotal',
|
||||
'refresh_score' => 'refreshScore',
|
||||
'aux' => null,
|
||||
];
|
||||
|
||||
@@ -143,9 +151,12 @@ class GeneralList extends \sammo\BaseAPI
|
||||
$gameStor = \sammo\KVStorage::getStorage($db, 'game_env');
|
||||
$env = $gameStor->getValues(['year', 'month', 'turntime', 'turnterm', 'autorun_user', 'killturn']);
|
||||
|
||||
$me = $db->queryFirstRow('SELECT con, turntime, belong, nation, officer_level, permission, penalty FROM general WHERE owner=%i', $session->getUserID());
|
||||
$con = checkLimit($me['con']);
|
||||
if ($con >= 2) {
|
||||
$me = $db->queryFirstRow(
|
||||
'SELECT refresh_score, turntime, belong, nation, officer_level, permission, penalty FROM `general`
|
||||
LEFT JOIN general_access_log AS l ON `general`.no = l.general_id WHERE owner=%i', $session->getUserID()
|
||||
);
|
||||
$limitState = checkLimit($me['refresh_score']);
|
||||
if ($limitState >= 2) {
|
||||
return '접속 제한중입니다. 1턴 이내에 너무 많은 갱신을 하셨습니다.';
|
||||
}
|
||||
|
||||
@@ -156,9 +167,18 @@ class GeneralList extends \sammo\BaseAPI
|
||||
|
||||
|
||||
|
||||
[$queryColumns, $rankColumns] = General::mergeQueryColumn(array_keys(static::$viewColumns), 1);
|
||||
[$queryColumns, $rankColumns, $accessLogColumns] = GeneralLite::mergeQueryColumn(array_keys(static::$viewColumns), GeneralLiteQueryMode::Lite);
|
||||
|
||||
$rawGeneralList = Util::convertArrayToDict($db->query('SELECT %l from general WHERE nation = %i ORDER BY turntime ASC', Util::formatListOfBackticks($queryColumns), $nationID), 'no');
|
||||
$rawGeneralList = Util::convertArrayToDict(
|
||||
$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[] */
|
||||
$troops = [];
|
||||
@@ -179,19 +199,19 @@ class GeneralList extends \sammo\BaseAPI
|
||||
if ($this->permission >= 1 || count($troops)) {
|
||||
$reservedCommandTargetGeneralIDList = [];
|
||||
|
||||
if($this->permission >= 1){
|
||||
if ($this->permission >= 1) {
|
||||
foreach ($rawGeneralList as $rawGeneral) {
|
||||
if ($rawGeneral['npc'] < 2) {
|
||||
$reservedCommandTargetGeneralIDList[$rawGeneral['no']] = $rawGeneral['no'];
|
||||
}
|
||||
}
|
||||
}
|
||||
foreach($troops as $troop){
|
||||
foreach ($troops as $troop) {
|
||||
$reservedCommandTargetGeneralIDList[$troop['id']] = $troop['id'];
|
||||
}
|
||||
|
||||
|
||||
if($reservedCommandTargetGeneralIDList){
|
||||
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)
|
||||
@@ -278,11 +298,11 @@ class GeneralList extends \sammo\BaseAPI
|
||||
$resultColumns[$column] = $column;
|
||||
}
|
||||
|
||||
foreach ($troops as $troop){
|
||||
foreach ($troops as $troop) {
|
||||
$troopLeaderID = $troop['id'];
|
||||
$troop['reservedCommand'] = array_map(function($turnObj){
|
||||
$troop['reservedCommand'] = array_map(function ($turnObj) {
|
||||
$brief = $turnObj['brief'];
|
||||
if($brief == '집합'){
|
||||
if ($brief == '집합') {
|
||||
return $brief;
|
||||
}
|
||||
return '-';
|
||||
|
||||
@@ -109,10 +109,12 @@ class GetGeneralLog extends \sammo\BaseAPI
|
||||
$reqTo = $this->args['reqTo'] ?? null;
|
||||
|
||||
$db = DB::db();
|
||||
$me = $db->queryFirstRow('SELECT no,nation,officer_level,con,turntime,belong,permission,penalty from general where owner=%i', $userID);
|
||||
$me = $db->queryFirstRow(
|
||||
'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);
|
||||
|
||||
$con = checkLimit($me['con']);
|
||||
if ($con >= 2) {
|
||||
$limitState = checkLimit($me['refresh_score']);
|
||||
if ($limitState >= 2) {
|
||||
return '접속 제한입니다.';
|
||||
}
|
||||
|
||||
|
||||
@@ -4,6 +4,7 @@ namespace sammo\API\Nation;
|
||||
|
||||
use sammo\DB;
|
||||
use sammo\Enums\APIRecoveryType;
|
||||
use sammo\Enums\GeneralQueryMode;
|
||||
use sammo\GameConst;
|
||||
use sammo\General;
|
||||
use sammo\KVStorage;
|
||||
@@ -13,14 +14,6 @@ use sammo\Util;
|
||||
use sammo\Validator;
|
||||
|
||||
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;
|
||||
|
||||
class GetNationInfo extends \sammo\BaseAPI
|
||||
@@ -65,7 +58,7 @@ class GetNationInfo extends \sammo\BaseAPI
|
||||
];
|
||||
}
|
||||
|
||||
$generalObj = General::createGeneralObjFromDB($session->generalID, null, 1);
|
||||
$generalObj = General::createObjFromDB($session->generalID);
|
||||
|
||||
$gameStor = KVStorage::getStorage($db, 'game_env');
|
||||
$gameEnv = $gameStor->getValues(['year', 'month', 'startyear']);
|
||||
|
||||
@@ -6,11 +6,13 @@ use sammo\Session;
|
||||
use DateTimeInterface;
|
||||
use sammo\DB;
|
||||
use sammo\Enums\APIRecoveryType;
|
||||
use sammo\Enums\GeneralQueryMode;
|
||||
use sammo\GameConst;
|
||||
use sammo\General;
|
||||
use sammo\Json;
|
||||
use sammo\KVStorage;
|
||||
use sammo\TimeUtil;
|
||||
use sammo\Util;
|
||||
|
||||
use function sammo\checkLimit;
|
||||
use function sammo\checkSecretPermission;
|
||||
@@ -39,12 +41,16 @@ class GetReservedCommand extends \sammo\BaseAPI
|
||||
$gameStor = KVStorage::getStorage($db, 'game_env');
|
||||
$userID = $session->userID;
|
||||
|
||||
$me = $db->queryFirstRow('SELECT no,nation,officer_level,con,turntime,belong,penalty,permission FROM general WHERE owner=%i', $userID);
|
||||
$me = $db->queryFirstRow(
|
||||
'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']);
|
||||
$nationID = $me['nation'];
|
||||
$con = checkLimit($me['con']);
|
||||
if ($con >= 2) {
|
||||
$limitState = checkLimit($me['refresh_score']);
|
||||
if ($limitState >= 2) {
|
||||
return "접속 제한중입니다. 1턴 이내에 너무 많은 갱신을 하셨습니다. (다음 갱신 가능 시각 : {$me['turntime']})";
|
||||
}
|
||||
|
||||
@@ -58,8 +64,12 @@ class GetReservedCommand extends \sammo\BaseAPI
|
||||
[$turnTerm, $year, $month, $lastExecute] = $gameStor->getValuesAsArray(['turnterm', 'year', 'month', 'turntime']);
|
||||
|
||||
$generals = [];
|
||||
foreach ($db->query('SELECT no,name,turntime,npc,city,nation,officer_level FROM general WHERE nation = %i AND officer_level >= 5', $nationID) as $rawGeneral) {
|
||||
$generals[$rawGeneral['officer_level']] = new General($rawGeneral, null, null, null, $year, $month, false);
|
||||
foreach ($db->query(
|
||||
'SELECT %l FROM general WHERE nation = %i AND officer_level >= 5',
|
||||
Util::formatListOfBackticks(General::mergeQueryColumn()[0]),
|
||||
$nationID
|
||||
) as $rawGeneral) {
|
||||
$generals[$rawGeneral['officer_level']] = new General($rawGeneral, null, null, null, null, $year, $month, false);
|
||||
}
|
||||
|
||||
$nationTurnList = [];
|
||||
@@ -109,7 +119,7 @@ class GetReservedCommand extends \sammo\BaseAPI
|
||||
];
|
||||
}
|
||||
|
||||
$generalObj = General::createGeneralObjFromDB($session->generalID);
|
||||
$generalObj = General::createObjFromDB($session->generalID);
|
||||
|
||||
|
||||
return [
|
||||
|
||||
@@ -6,7 +6,10 @@ use DateTimeInterface;
|
||||
use sammo\DB;
|
||||
use sammo\DTO\VoteComment;
|
||||
use sammo\Enums\APIRecoveryType;
|
||||
use sammo\Enums\GeneralLiteQueryMode;
|
||||
use sammo\Enums\GeneralQueryMode;
|
||||
use sammo\General;
|
||||
use sammo\GeneralLite;
|
||||
use sammo\Session;
|
||||
use sammo\TimeUtil;
|
||||
use sammo\Validator;
|
||||
@@ -40,7 +43,7 @@ class AddComment extends \sammo\BaseAPI
|
||||
$text = mb_substr($this->args['text'], 0, 200);
|
||||
|
||||
$generalID = $session->generalID;
|
||||
$general = General::createGeneralObjFromDB($generalID, [], 0);
|
||||
$general = GeneralLite::createObjFromDB($generalID, null, GeneralLiteQueryMode::Core);
|
||||
$generalName = $general->getName();
|
||||
$nationID = $general->getNationID();
|
||||
$nationName = $general->getStaticNation()['name'];
|
||||
|
||||
@@ -6,6 +6,7 @@ use DateTimeInterface;
|
||||
use sammo\DB;
|
||||
use sammo\DTO\VoteInfo;
|
||||
use sammo\Enums\APIRecoveryType;
|
||||
use sammo\Enums\GeneralQueryMode;
|
||||
use sammo\General;
|
||||
use sammo\Json;
|
||||
use sammo\KVStorage;
|
||||
@@ -105,7 +106,7 @@ class Vote extends \sammo\BaseAPI
|
||||
$gameStor = KVStorage::getStorage($db, 'game_env');
|
||||
$voteReward = $gameStor->getValue('develcost') * 5;
|
||||
|
||||
$general = General::createGeneralObjFromDB($generalID, ['gold', 'horse', 'weapon', 'book', 'item', 'npc', 'imgsvr', 'picture', 'aux'], 2);
|
||||
$general = General::createObjFromDB($generalID, null, GeneralQueryMode::Full);
|
||||
$general->increaseVar('gold', $voteReward);
|
||||
$uniqueRng = new RandUtil(new LiteHashDRBG(Util::simpleSerialize(
|
||||
UniqueConst::$hiddenSeed,
|
||||
|
||||
@@ -21,7 +21,7 @@ class che_무기_02_단궁 extends \sammo\BaseStatItem{
|
||||
public function getBattlePhaseSkillTriggerList(WarUnit $unit):?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)
|
||||
new che_저격발동($unit, che_저격시도::TYPE_ITEM + che_저격시도::TYPE_DEDUP_TYPE_BASE * 102)
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -20,7 +20,7 @@ class che_무기_07_맥궁 extends \sammo\BaseStatItem{
|
||||
public function getBattlePhaseSkillTriggerList(WarUnit $unit):?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)
|
||||
new che_저격발동($unit, che_저격시도::TYPE_ITEM + che_저격시도::TYPE_DEDUP_TYPE_BASE * 107)
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -20,7 +20,7 @@ class che_무기_09_동호비궁 extends \sammo\BaseStatItem{
|
||||
public function getBattlePhaseSkillTriggerList(WarUnit $unit):?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)
|
||||
new che_저격발동($unit, che_저격시도::TYPE_ITEM + che_저격시도::TYPE_DEDUP_TYPE_BASE * 109)
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -20,7 +20,7 @@ class che_무기_11_이광궁 extends \sammo\BaseStatItem{
|
||||
public function getBattlePhaseSkillTriggerList(WarUnit $unit):?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)
|
||||
new che_저격발동($unit, che_저격시도::TYPE_ITEM + che_저격시도::TYPE_DEDUP_TYPE_BASE * 111)
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -20,7 +20,7 @@ class che_무기_13_양유기궁 extends \sammo\BaseStatItem{
|
||||
public function getBattlePhaseSkillTriggerList(WarUnit $unit):?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)
|
||||
new che_저격발동($unit, che_저격시도::TYPE_ITEM + che_저격시도::TYPE_DEDUP_TYPE_BASE * 113)
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -21,7 +21,7 @@ class che_저격_매화수전 extends \sammo\BaseItem{
|
||||
public function getBattlePhaseSkillTriggerList(WarUnit $unit):?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)
|
||||
new che_저격발동($unit, che_저격시도::TYPE_ITEM+BaseWarUnitTrigger::TYPE_DEDUP_TYPE_BASE*304)
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -21,7 +21,7 @@ class che_저격_비도 extends \sammo\BaseItem{
|
||||
public function getBattlePhaseSkillTriggerList(WarUnit $unit):?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)
|
||||
new che_저격발동($unit, che_저격시도::TYPE_ITEM+BaseWarUnitTrigger::TYPE_DEDUP_TYPE_BASE*305)
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -18,7 +18,7 @@ class che_저격_수극 extends \sammo\BaseItem{
|
||||
protected $buyable = true;
|
||||
protected $reqSecu = 1000;
|
||||
|
||||
public function getBattleInitSkillTriggerList(WarUnit $unit):?WarUnitTriggerCaller{
|
||||
public function getBattlePhaseSkillTriggerList(WarUnit $unit):?WarUnitTriggerCaller{
|
||||
return new WarUnitTriggerCaller(
|
||||
new che_저격시도($unit, BaseWarUnitTrigger::TYPE_CONSUMABLE_ITEM, 1, 20, 40),
|
||||
new che_저격발동($unit, BaseWarUnitTrigger::TYPE_CONSUMABLE_ITEM)
|
||||
|
||||
@@ -25,15 +25,15 @@ class che_병가 extends \sammo\BaseNation{
|
||||
if($varType == 'score') return $value * 0.9;
|
||||
if($varType == 'cost') return $value * 1.2;
|
||||
}
|
||||
|
||||
|
||||
return $value;
|
||||
}
|
||||
|
||||
public function onCalcNationalIncome(string $type, $amount):int{
|
||||
if($type == 'pop' && $amount > 0){
|
||||
return Util::toInt($amount * 0.8);
|
||||
return $amount * 0.8;
|
||||
}
|
||||
|
||||
|
||||
return $amount;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,12 @@
|
||||
<?php
|
||||
namespace sammo\ActionScenarioEffect;
|
||||
use \sammo\iAction;
|
||||
use \sammo\General;
|
||||
|
||||
class None implements iAction{
|
||||
use \sammo\DefaultAction;
|
||||
|
||||
protected $id = -1;
|
||||
protected $name = '-';
|
||||
protected $info = '';
|
||||
}
|
||||
@@ -0,0 +1,44 @@
|
||||
<?php
|
||||
|
||||
namespace sammo\ActionScenarioEffect;
|
||||
|
||||
use \sammo\iAction;
|
||||
use sammo\WarUnit;
|
||||
use sammo\WarUnitCity;
|
||||
use sammo\WarUnitTrigger\che_전멸시페이즈증가;
|
||||
use sammo\WarUnitTriggerCaller;
|
||||
|
||||
class event_StrongAttacker implements iAction
|
||||
{
|
||||
use \sammo\DefaultAction;
|
||||
|
||||
public function getWarPowerMultiplier(WarUnit $unit): array
|
||||
{
|
||||
if ($unit instanceof WarUnitCity) {
|
||||
return [1, 1];
|
||||
}
|
||||
if ($unit->getOppose() instanceof WarUnitCity) {
|
||||
return [1, 1];
|
||||
}
|
||||
|
||||
if ($unit->isAttacker()) {
|
||||
return [1.4, 0.7143];
|
||||
}
|
||||
return [1, 1];
|
||||
}
|
||||
|
||||
public function onCalcDomestic(string $turnType, string $varType, float $value, $aux = null): float
|
||||
{
|
||||
if ($turnType == 'changeDefenceTrain') {
|
||||
return 0;
|
||||
}
|
||||
return $value;
|
||||
}
|
||||
|
||||
public function getBattlePhaseSkillTriggerList(\sammo\WarUnit $unit): ?WarUnitTriggerCaller
|
||||
{
|
||||
return new WarUnitTriggerCaller(
|
||||
new che_전멸시페이즈증가($unit),
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -25,7 +25,7 @@ class che_event_저격 extends \sammo\BaseSpecial{
|
||||
public function getBattlePhaseSkillTriggerList(WarUnit $unit):?WarUnitTriggerCaller{
|
||||
return new WarUnitTriggerCaller(
|
||||
new che_저격시도($unit, che_저격시도::TYPE_NONE, 0.5, 20, 40),
|
||||
new che_저격발동($unit)
|
||||
new che_저격발동($unit, che_저격시도::TYPE_NONE)
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -218,7 +218,7 @@ abstract class Auction
|
||||
if ($bidItem->generalID === $this->general->getID()) {
|
||||
$oldBidder = $this->general;
|
||||
} else {
|
||||
$oldBidder = General::createGeneralObjFromDB($bidItem->generalID);
|
||||
$oldBidder = General::createObjFromDB($bidItem->generalID);
|
||||
}
|
||||
|
||||
if ($this->info->reqResource === ResourceType::inheritancePoint) {
|
||||
@@ -267,7 +267,7 @@ abstract class Auction
|
||||
if ($isRollback) {
|
||||
$highestBid = $this->getHighestBid();
|
||||
if ($highestBid !== null) {
|
||||
$this->refundBid($highestBid, "{$this->info->id}번 {$this->info->detail->title} 경매가 취소되었습니다.");
|
||||
$this->refundBid($highestBid, "{$this->info->id}번 {$this->info->detail->title}가 취소되었습니다.");
|
||||
}
|
||||
$this->rollbackAuction();
|
||||
}
|
||||
@@ -485,7 +485,7 @@ abstract class Auction
|
||||
}
|
||||
}
|
||||
|
||||
$bidder = General::createGeneralObjFromDB($highestBid->generalID);
|
||||
$bidder = General::createObjFromDB($highestBid->generalID);
|
||||
$failReason = $this->finishAuction($highestBid, $bidder);
|
||||
if ($failReason === null) {
|
||||
$this->closeAuction();
|
||||
|
||||
@@ -116,7 +116,7 @@ abstract class AuctionBasicResource extends Auction
|
||||
} else if ($this->info->hostGeneralID == 0) {
|
||||
$auctionHost = $this->genDummy();
|
||||
} else {
|
||||
$auctionHost = General::createGeneralObjFromDB($this->info->hostGeneralID);
|
||||
$auctionHost = General::createObjFromDB($this->info->hostGeneralID);
|
||||
}
|
||||
|
||||
$hostRes = static::$hostRes;
|
||||
@@ -164,7 +164,7 @@ abstract class AuctionBasicResource extends Auction
|
||||
} else if ($this->info->hostGeneralID == 0) {
|
||||
$auctionHost = $this->genDummy();
|
||||
} else {
|
||||
$auctionHost = General::createGeneralObjFromDB($this->info->hostGeneralID);
|
||||
$auctionHost = General::createObjFromDB($this->info->hostGeneralID);
|
||||
}
|
||||
|
||||
$highestBid = $this->getHighestBid();
|
||||
@@ -175,7 +175,7 @@ abstract class AuctionBasicResource extends Auction
|
||||
if ($this->general->getID() === $highestBid->generalID) {
|
||||
$bidder = $this->general;
|
||||
} else {
|
||||
$bidder = General::createGeneralObjFromDB($highestBid->generalID);
|
||||
$bidder = General::createObjFromDB($highestBid->generalID);
|
||||
}
|
||||
|
||||
$hostRes = static::$hostRes;
|
||||
|
||||
@@ -19,7 +19,7 @@ class AutorunGeneralPolicy{
|
||||
static $소집해제 = '소집해제';
|
||||
|
||||
static $출병 = '출병';
|
||||
|
||||
|
||||
//static $NPC증여 = 'NPC증여';
|
||||
static $NPC헌납 = 'NPC헌납';
|
||||
static $NPC사망대비 = 'NPC사망대비';
|
||||
@@ -31,12 +31,12 @@ class AutorunGeneralPolicy{
|
||||
static $귀환 = '귀환';
|
||||
//static $전투이동 = '전투이동';
|
||||
//static $내정이동 = '내정이동';
|
||||
|
||||
|
||||
static $국가선택 = '국가선택';
|
||||
static $집합 = '집합';
|
||||
static $건국 = '건국';
|
||||
static $선양 = '선양';
|
||||
|
||||
|
||||
|
||||
|
||||
static public array $default_priority = [
|
||||
@@ -74,7 +74,7 @@ class AutorunGeneralPolicy{
|
||||
public $can소집해제 = true;
|
||||
|
||||
public $can출병 = true;
|
||||
|
||||
|
||||
//public $canNPC증여 = true;
|
||||
public $canNPC헌납 = true;
|
||||
|
||||
@@ -91,7 +91,7 @@ class AutorunGeneralPolicy{
|
||||
|
||||
public array $priority;
|
||||
|
||||
function doNPCState(General $general){
|
||||
function doNPCState(GeneralBase $general){
|
||||
$npc = $general->getNPCType();
|
||||
$nationID = $general->getNationID();
|
||||
|
||||
@@ -115,7 +115,7 @@ class AutorunGeneralPolicy{
|
||||
|
||||
}
|
||||
|
||||
function __construct(General $general, $aiOptions, ?array $nationPolicy, ?array $serverPolicy, array $nation, array $env){
|
||||
function __construct(GeneralBase $general, $aiOptions, ?array $nationPolicy, ?array $serverPolicy, array $nation, array $env){
|
||||
$this->priority = static::$default_priority;
|
||||
|
||||
if($serverPolicy && key_exists('priority', $serverPolicy)){
|
||||
@@ -165,7 +165,7 @@ class AutorunGeneralPolicy{
|
||||
$this->can전투준비 = false;
|
||||
|
||||
$this->can출병 = false;
|
||||
|
||||
|
||||
//$this->canNPC증여 = false;
|
||||
$this->canNPC헌납 = false;
|
||||
|
||||
@@ -194,9 +194,9 @@ class AutorunGeneralPolicy{
|
||||
$this->can금쌀구매 = true;
|
||||
$this->can상인무시 = true;
|
||||
break;
|
||||
case 'recruit_high':
|
||||
case 'recruit_high':
|
||||
$this->can모병 = true;
|
||||
case 'recruit':
|
||||
case 'recruit':
|
||||
$this->can징병 = true;
|
||||
$this->can소집해제 = true;
|
||||
$this->can금쌀구매 = true;
|
||||
|
||||
@@ -179,7 +179,7 @@ class AutorunNationPolicy {
|
||||
'cureThreshold'=>10,
|
||||
];
|
||||
|
||||
function __construct(General $general, $aiOptions, ?array $nationPolicy, ?array $serverPolicy, array $nation, array $env)
|
||||
function __construct(GeneralBase $general, $aiOptions, ?array $nationPolicy, ?array $serverPolicy, array $nation, array $env)
|
||||
{
|
||||
foreach(static::$defaultPolicy as $policy=>$value){
|
||||
$this->{$policy} = $value;
|
||||
|
||||
@@ -5,6 +5,8 @@ namespace sammo;
|
||||
use Ds\Map;
|
||||
use sammo\DTO\BettingInfo;
|
||||
use sammo\DTO\BettingItem;
|
||||
use sammo\Enums\GeneralQueryMode;
|
||||
use sammo\Enums\InheritanceKey;
|
||||
use sammo\Enums\RankColumn;
|
||||
|
||||
class Betting
|
||||
@@ -350,6 +352,8 @@ class Betting
|
||||
|
||||
$db = DB::db();
|
||||
|
||||
$pointManager = InheritancePointManager::getInstance();
|
||||
|
||||
if ($this->info->reqInheritancePoint) {
|
||||
/** @var Map<int,UserLogger> */
|
||||
$loggers = new Map();
|
||||
@@ -361,11 +365,8 @@ class Betting
|
||||
$userID = $rewardItem['userID'];
|
||||
$amount = $rewardItem['amount'];
|
||||
|
||||
$inheritStor = KVStorage::getStorage($db, "inheritance_{$userID}");
|
||||
$previousPoint = ($inheritStor->getValue('previous') ?? [0, 0])[0];
|
||||
$nextPoint = $previousPoint + $amount;
|
||||
$inheritStor->setValue('previous', [$nextPoint, 0]);
|
||||
$inheritStor->invalidateCacheValue('previous'); //XXX: 실제로는 previous 값을 사용할 수 없도록 락을 걸어야 한다.
|
||||
$nextPoint = $pointManager->increaseInheritancePointRaw($userID, InheritanceKey::previous, $amount);
|
||||
$previousPoint = $nextPoint - $amount;//역산
|
||||
|
||||
$generalID = $rewardItem['generalID'];
|
||||
$db->update('rank_data', [
|
||||
@@ -401,7 +402,7 @@ class Betting
|
||||
$userLogger->flush();
|
||||
}
|
||||
} else {
|
||||
$generalList = General::createGeneralObjListFromDB(array_unique(Util::squeezeFromArray($rewardList, 'generalID')), ['gold', 'npc', 'betgold'], 1);
|
||||
$generalList = General::createObjListFromDB(array_unique(Util::squeezeFromArray($rewardList, 'generalID')));
|
||||
foreach ($rewardList as $rewardItem) {
|
||||
$gambler = $generalList[$rewardItem['generalID']];
|
||||
$reward = Util::round($rewardItem['amount']);
|
||||
|
||||
@@ -7,11 +7,7 @@ use \sammo\{
|
||||
Util,
|
||||
JosaUtil,
|
||||
General,
|
||||
DummyGeneral,
|
||||
ActionLogger,
|
||||
GameConst,
|
||||
LastTurn,
|
||||
GameUnitConst,
|
||||
Command,
|
||||
ScoutMessage
|
||||
};
|
||||
@@ -21,7 +17,7 @@ use function \sammo\getNationStaticInfo;
|
||||
use function sammo\tryUniqueItemLottery;
|
||||
|
||||
use \sammo\Constraint\ConstraintHelper;
|
||||
|
||||
use sammo\Enums\GeneralQueryMode;
|
||||
|
||||
class che_등용 extends Command\GeneralCommand
|
||||
{
|
||||
@@ -77,7 +73,7 @@ class che_등용 extends Command\GeneralCommand
|
||||
|
||||
protected function initWithArg()
|
||||
{
|
||||
$destGeneral = General::createGeneralObjFromDB($this->arg['destGeneralID'], ['nation', 'experience', 'dedication'], 0);
|
||||
$destGeneral = General::createObjFromDB($this->arg['destGeneralID']);
|
||||
$this->setDestGeneral($destGeneral);
|
||||
|
||||
[$reqGold, $reqRice] = $this->getCost();
|
||||
|
||||
@@ -68,7 +68,7 @@ class che_등용수락 extends Command\GeneralCommand{
|
||||
|
||||
protected function initWithArg()
|
||||
{
|
||||
$destGeneral = General::createGeneralObjFromDB($this->arg['destGeneralID'], null, 2);
|
||||
$destGeneral = General::createObjFromDB($this->arg['destGeneralID'], null);
|
||||
$this->setDestGeneral($destGeneral);
|
||||
$this->setDestNation($this->arg['destNationID'], ['gennum', 'scout']);
|
||||
|
||||
@@ -77,6 +77,7 @@ class che_등용수락 extends Command\GeneralCommand{
|
||||
$this->fullConditionConstraints=[
|
||||
ConstraintHelper::ReqEnvValue('join_mode', '!=', 'onlyRandom', '랜덤 임관만 가능합니다'),
|
||||
ConstraintHelper::ExistsDestNation(),
|
||||
ConstraintHelper::BeNeutral(),
|
||||
ConstraintHelper::AllowJoinDestNation($relYear),
|
||||
ConstraintHelper::ReqDestNationValue('level', '국가규모', '>', 0, '방랑군에는 임관할 수 없습니다.'),
|
||||
ConstraintHelper::DifferentDestNation(),
|
||||
@@ -168,7 +169,7 @@ class che_등용수락 extends Command\GeneralCommand{
|
||||
$logger->pushGeneralActionLog("<D>{$destNationName}</>{$josaRo} 망명하여 수도로 이동합니다.");
|
||||
$destLogger->pushGeneralActionLog("<Y>{$generalName}</> 등용에 성공했습니다.");
|
||||
|
||||
$logger->pushGeneralHistoryLog("<D>{$destNationName}</>{$josaRo} 망명");
|
||||
$logger->pushGeneralHistoryLog("<D><b>{$destNationName}</b></>{$josaRo} 망명");
|
||||
$destLogger->pushGeneralHistoryLog("<Y>{$generalName}</> 등용에 성공");
|
||||
|
||||
$logger->pushGlobalActionLog("<Y>{$generalName}</>{$josaYi} <D><b>{$destNationName}</b></>{$josaRo} <S>망명</>하였습니다.");
|
||||
@@ -211,4 +212,4 @@ class che_등용수락 extends Command\GeneralCommand{
|
||||
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -67,7 +67,7 @@ class che_모반시도 extends Command\GeneralCommand{
|
||||
|
||||
$lordID = $db->queryFirstField('SELECT no FROM general WHERE nation = %i AND officer_level = 12', $nationID);
|
||||
|
||||
$lordGeneral = General::createGeneralObjFromDB($lordID);
|
||||
$lordGeneral = General::createObjFromDB($lordID);
|
||||
|
||||
$generalName = $general->getName();
|
||||
$lordName = $lordGeneral->getName();
|
||||
|
||||
@@ -19,6 +19,7 @@ use function\sammo\tryUniqueItemLottery;
|
||||
|
||||
use \sammo\Constraint\Constraint;
|
||||
use \sammo\Constraint\ConstraintHelper;
|
||||
use sammo\Enums\GeneralQueryMode;
|
||||
use sammo\Enums\InheritanceKey;
|
||||
|
||||
class che_선양 extends Command\GeneralCommand
|
||||
@@ -65,7 +66,7 @@ class che_선양 extends Command\GeneralCommand
|
||||
|
||||
protected function initWithArg()
|
||||
{
|
||||
$destGeneral = General::createGeneralObjFromDB($this->arg['destGeneralID'], ['gold', 'nation'], 1);
|
||||
$destGeneral = General::createObjFromDB($this->arg['destGeneralID']);
|
||||
$this->setDestGeneral($destGeneral);
|
||||
|
||||
$this->fullConditionConstraints = [
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user