Compare commits

...
42 Commits
Author SHA1 Message Date
Hide_D 7864fe1e0f misc: 토너먼트, 베팅장 버튼을 약간 더 크게 2022-07-06 23:09:37 +09:00
Hide_D fe08fe0e2e fix: 누락된 스탯 유니크 설명 수정 2022-07-06 22:57:15 +09:00
Hide_D 87775a9471 game: 회피 발동시 피해 감소량을 1/5에서 1/6으로 버프 2022-07-06 22:52:20 +09:00
Hide_D 8089457aa8 game: 도구 유니크 밸런스 수정 2022-07-06 22:50:54 +09:00
Hide_D e443f92ddb fix: 초반 내정 기간에 NPC가 다중 선포가 가능한 버그 수정 2022-07-06 22:45:18 +09:00
Hide_D cb65666600 misc: 메인페이지 하단 바 높이를 약간 높임 2022-07-06 22:40:16 +09:00
Hide_D 6ed174e5dc game: 모반시도 삭제 2022-07-05 23:13:25 +09:00
Hide_D dd7f0ef3bf fix: 거병 커맨드가 막힌 없는 경우 사전 거병도 불가 2022-07-05 23:12:49 +09:00
Hide_D ec8e43a2a9 fix: 서버 목록에서 목록이 긴 경우에도 아이콘이 하나만 2022-07-05 23:05:11 +09:00
Hide_D a83b6b55cd feat: 천통국 내기 오픈시 메시지로 알림 2022-07-05 23:02:54 +09:00
Hide_D d43f15e096 fix: 빙의장도 사전 거병이 가능해야함 2022-07-05 22:39:40 +09:00
Hide_D e09fdefa68 feat,game: 사전 거병 기능 추가
- 건국은 게임 개시 2턴째부터 가능
2022-07-05 22:23:23 +09:00
Hide_D 2b483749bc game: 유산 포인트로 도시와 턴 시간을 동시에 설정할 수 없도록 변경 2022-07-05 20:18:02 +09:00
Hide_D 048d71920c fix: 변수명 수정 2022-07-05 19:29:58 +09:00
Hide_D 47366086d5 feat: 군주/외교권자에게 부대명 변경 기능 부여 2022-07-05 00:46:45 +09:00
Hide_D f9a73be82b game,refac: 토너먼트 진행 시간을 턴 시간에 맞춤(최소 5초) 2022-07-04 23:59:04 +09:00
Hide_D e7918469e5 refac: Util::valueFit을 Util::clamp로 2022-07-04 23:25:44 +09:00
Hide_D 687559a1a3 refac: 장수 삭제를 api로 이동 2022-07-02 02:43:10 +09:00
Hide_D 398c11e607 misc: 금액 선택에서 '+만' 활성화 2022-06-25 13:09:57 +09:00
Hide_D 191544d28b game: 삼모시네마틱유니버스 시나리오 업데이트 2022-06-25 13:06:25 +09:00
Hide_D 647c2439e3 feat: 유산 목록에서 로그를 더 가져올 수 있음 2022-06-25 12:22:25 +09:00
Hide_D da2a6f347a game: 도시 정보의 장수 순서를 실제 서버 실행 시간으로 변경 2022-06-24 21:49:02 +09:00
Hide_D dca341f35e fix: 연산단위 최소값 지정 2022-06-15 23:11:07 +09:00
Hide_D d38ddcd79e fix: 피장파장에서 모든 국가에(불가)가 나타나는 버그 2022-06-15 22:34:32 +09:00
Hide_D 03675349d8 fix: 사기진작 커맨드가 금소모를 하지 않음 2022-06-15 00:35:40 +09:00
Hide_D 72768ba7b5 fix: 경매 로그 마저 수정 2022-06-14 22:31:01 +09:00
Hide_D a5477db6b6 fix: 거래 완료시 메시지가 반대로 뜨는 버그 수정 2022-06-14 22:19:23 +09:00
Hide_D c146e8587b feat: 명장일람에 진행중인 유니크 경매 표시 2022-06-12 17:52:02 +09:00
Hide_D 24b65b0395 fix: 금쌀 경매장에 최근 로그 없음 2022-06-12 01:50:33 +09:00
Hide_D 2f42691d2b fix: 연감에 전투 시드가 겉으로 드러남 2022-06-11 15:09:35 +09:00
Hide_D ea619bd693 misc: 인사부에서 추방을 가장 아래로 2022-06-11 14:39:57 +09:00
Hide_D 35a56e74bb refac: 금쌀 경매장 UI 2022-06-11 03:53:30 +09:00
Hide_D 6fb2358161 refac: 유니크 경매 UI 수정 2022-06-10 02:07:05 +09:00
Hide_D a039fb871b fix: CreateManyNPC에서 모든 m장 사망년도가 같은 버그 수정 2022-06-10 00:49:47 +09:00
Hide_D a19da6cda5 fix: 경매장 갱신 버튼 2022-06-10 00:43:47 +09:00
Hide_D e5ba980865 fix: 종료된 유니크 경매 입찰시 버그 2022-06-10 00:38:34 +09:00
Hide_D f95ee8fab8 fix: 경매에서 이미 소지 수가 찬 유니크 획득 가능한 문제 수정 2022-06-09 22:28:51 +09:00
Hide_D 120706ef3f misc: 경매장 진입로를 금/쌀, 유니크로 2원화 2022-06-09 16:16:58 +09:00
Hide_D 58da20f276 fix: 동일 부위 유니크 소유시, '1턴' 연장하도록 수정 2022-06-09 15:49:13 +09:00
Hide_D 64af68e2d6 fix: 유니크 경매 시 종류 제한 계산 버그 2022-06-09 02:03:38 +09:00
Hide_D 76a8740644 fix: 유니크 경매시 10포인트 더 높아야 함 2022-06-09 01:53:19 +09:00
Hide_D 0863fafec0 fix: 경매가 시작후 3개월이 아니라 4개월로 설정됨 2022-06-09 01:49:22 +09:00
75 changed files with 2452 additions and 1809 deletions
-1
View File
@@ -83,7 +83,6 @@ return [
'hwe/j_board_article_add.php', 'hwe/j_board_article_add.php',
'hwe/j_board_comment_add.php', 'hwe/j_board_comment_add.php',
'hwe/j_board_get_articles.php', 'hwe/j_board_get_articles.php',
'hwe/j_die_immediately.php',
'hwe/j_diplomacy_destroy_letter.php', 'hwe/j_diplomacy_destroy_letter.php',
'hwe/j_diplomacy_get_letter.php', 'hwe/j_diplomacy_get_letter.php',
'hwe/j_diplomacy_respond_letter.php', 'hwe/j_diplomacy_respond_letter.php',
+29
View File
@@ -2,7 +2,9 @@
namespace sammo; namespace sammo;
use Ds\Set;
use sammo\Enums\RankColumn; use sammo\Enums\RankColumn;
use sammo\Enums\AuctionType;
include "lib.php"; include "lib.php";
include "func.php"; include "func.php";
@@ -19,6 +21,7 @@ $gameStor = KVStorage::getStorage($db, 'game_env');
increaseRefresh("명장일람", 1); increaseRefresh("명장일람", 1);
$templates = new \League\Plates\Engine(__DIR__ . '/templates'); $templates = new \League\Plates\Engine(__DIR__ . '/templates');
?> ?>
<!DOCTYPE html> <!DOCTYPE html>
<html> <html>
@@ -326,6 +329,32 @@ $templates = new \League\Plates\Engine(__DIR__ . '/templates');
} }
} }
$dummyAuctionGeneral = [
'nation' => 0,
'no' => 0,
'ownerName' => '',
'pictureFullPath' => GetImageURL(0) . "/default.jpg",
'name' => '경매중',
'bgColor' => '#00582c',
'fgColor' => 'white',
'nationName' => '-',
];
foreach ($db->queryFirstColumn(
'SELECT `target` FROM ng_auction WHERE `finished` = 0 AND `type` = %s',
AuctionType::UniqueItem->value
) as $itemClassName) {
if(key_exists($itemClassName, $itemOwners)) {
$itemOwners[$itemClassName][] = $dummyAuctionGeneral;
}
else{
$itemOwners[$itemClassName] = [$dummyAuctionGeneral];
}
}
foreach (GameConst::$allItems as $itemType => $itemList) { foreach (GameConst::$allItems as $itemType => $itemList) {
$itemNameType = $itemTypes[$itemType]; $itemNameType = $itemTypes[$itemType];
$itemList = array_reverse($itemList, true); $itemList = array_reverse($itemList, true);
+8 -8
View File
@@ -23,8 +23,8 @@ $generalID = $session->generalID;
$me = $db->queryFirstRow('SELECT no,tournament,con,turntime from general where owner=%i', $userID); $me = $db->queryFirstRow('SELECT no,tournament,con,turntime from general where owner=%i', $userID);
$admin = $gameStor->getValues(['tournament', 'phase', 'tnmt_type', 'develcost']); $admin = $gameStor->getValues(['tournament', 'phase', 'tnmt_type', 'turnterm', 'develcost']);
$turnTerm = $admin['turnterm'];
$con = checkLimit($me['con']); $con = checkLimit($me['con']);
if ($con >= 2) { if ($con >= 2) {
printLimitMsg($me['turntime']); printLimitMsg($me['turntime']);
@@ -99,7 +99,7 @@ $str2 = getTournamentTime();
if ($str2) { if ($str2) {
$str2 = ', ' . $str2; $str2 = ', ' . $str2;
} }
$str3 = getTournamentTermText(); $str3 = getTournamentTermText($turnTerm);
if ($str3) { if ($str3) {
$str3 = ', ' . $str3; $str3 = ', ' . $str3;
} }
@@ -135,7 +135,7 @@ if ($str3) {
</table> </table>
<table align=center width=1120 class='tb_layout bg0'> <table align=center width=1120 class='tb_layout bg0'>
<tr> <tr>
<td colspan=16><input type=button value='갱신' onclick='location.reload()'></td> <td colspan=16><button type="button" class="btn btn-secondary" onclick='location.reload()'>갱신</button></td>
</tr> </tr>
<tr> <tr>
<td colspan=16 align=center> <td colspan=16 align=center>
@@ -441,13 +441,13 @@ if ($str3) {
if ($admin['tournament'] == 6) { if ($admin['tournament'] == 6) {
echo " echo "
<tr align=center>"; <tr align=center style='height:2.5em;'>";
foreach (range(0, 15) as $i) { foreach (range(0, 15) as $i) {
$key = $keyMap[$i] ?? -1; $key = $keyMap[$i] ?? -1;
echo " echo "
<td> <td>
<select size=1 id='target_{$key}' style=color:white;background-color:black;> <select size=1 id='target_{$key}' style='color:white;background-color:black;padding:0.2rem 0.1rem;'>
<option style=color:white; value=10>금10</option> <option style=color:white; value=10>금10</option>
<option style=color:white; value=20>금20</option> <option style=color:white; value=20>금20</option>
<option style=color:white; value=50>금50</option> <option style=color:white; value=50>금50</option>
@@ -461,12 +461,12 @@ if ($str3) {
echo " echo "
</tr> </tr>
<tr align=center>"; <tr align=center style='height:2.2em;'>";
foreach (range(0, 15) as $i) { foreach (range(0, 15) as $i) {
$key = $keyMap[$i] ?? -1; $key = $keyMap[$i] ?? -1;
echo " echo "
<td><input type=button class='submitBtn' data-target='{$key}' value=베팅! style=width:100%;color:white;background-color:black;></td>"; <td><input type=button class='submitBtn' data-target='{$key}' value=베팅! style='width:100%;color:white;padding:0.2rem 0.1rem;background-color:black;'></td>";
} }
echo "</tr>"; echo "</tr>";
+4 -2
View File
@@ -13,9 +13,11 @@ $userID = Session::getUserID();
$userGrade = Session::getUserGrade(); $userGrade = Session::getUserGrade();
$db = DB::db(); $db = DB::db();
$gameStor = KVStorage::getStorage($db, 'game_env');
increaseRefresh("현재도시", 1); increaseRefresh("현재도시", 1);
$lastExecute = substr($gameStor->turntime, 5, 14);
$me = $db->queryFirstRow('SELECT no,nation,officer_level,city from general where owner=%i', $userID); $me = $db->queryFirstRow('SELECT no,nation,officer_level,city from general where owner=%i', $userID);
$myNation = $db->queryFirstRow('SELECT nation,level,spy FROM nation WHERE nation=%i', $me['nation']) ?? [ $myNation = $db->queryFirstRow('SELECT nation,level,spy FROM nation WHERE nation=%i', $me['nation']) ?? [
'nation' => 0, 'nation' => 0,
@@ -446,7 +448,7 @@ $templates = new \League\Plates\Engine('templates');
<table align=center width=1000 class='tb_layout bg2'> <table align=center width=1000 class='tb_layout bg2'>
<tr> <tr>
<td colspan=11 align=center style='color:<?= newColor($cityNation['color']) ?>; background:<?= $cityNation['color'] ?>'>【 <?= CityConst::$regionMap[$city['region']] ?> | <?= CityConst::$levelMap[$city['level']] ?> 】 <?= $city['name'] ?></td> <td colspan=11 align=center style='color:<?= newColor($cityNation['color']) ?>; background:<?= $cityNation['color'] ?>'>【 <?= CityConst::$regionMap[$city['region']] ?> | <?= CityConst::$levelMap[$city['level']] ?> 】 <?= $city['name'] ?></td>
<td style='color:<?= newColor($cityNation['color']) ?>; background:<?= $cityNation['color'] ?>' class='center'><?= date('m-d H:i:s') ?></td> <td style='color:<?= newColor($cityNation['color']) ?>; background:<?= $cityNation['color'] ?>' class='center'><?= $lastExecute ?></td>
</tr> </tr>
<tr> <tr>
<td align=center width=48 class=bg1>주민</td> <td align=center width=48 class=bg1>주민</td>
+47 -48
View File
@@ -25,6 +25,17 @@ if ($meLevel == 0) {
$nation = $db->queryFirstRow('SELECT nation,name,level,color,chief_set from nation where nation=%i', $nationID); //국가정보 $nation = $db->queryFirstRow('SELECT nation,name,level,color,chief_set from nation where nation=%i', $nationID); //국가정보
if ($meLevel >= 5) {
$candidateStrength = $db->query('SELECT no,name,officer_level,city,npc from general where nation=%i and officer_level!=12 and strength>=%i order by npc,binary(name)', $nationID, GameConst::$chiefStatMin);
$candidateIntel = $db->query('SELECT no,name,officer_level,city,npc from general where nation=%i and officer_level!=12 and intel>=%i order by npc,binary(name)', $nationID, GameConst::$chiefStatMin);
$candidateAny = $db->query('SELECT no,name,officer_level,city,npc,leadership,strength,intel,killturn from general where nation=%i and officer_level!=12 order by npc,binary(name)', $nationID); //추방 때문에 조금 더 김
} else {
$candidateStrength = [];
$candidateIntel = [];
$candidateAny = [];
}
?> ?>
<!DOCTYPE html> <!DOCTYPE html>
<html> <html>
@@ -180,61 +191,21 @@ $nation = $db->queryFirstRow('SELECT nation,name,level,color,chief_set from nati
<td colspan=5><?= $eaglestr ?></td> <td colspan=5><?= $eaglestr ?></td>
</tr> </tr>
</table> </table>
<table align=center width=1000 class='tb_layout bg0'> <table align=center width=1000 class='tb_layout bg0'>
<tr> <tr>
<td colspan=6 height=5></td> <td colspan=4 height=5></td>
</tr> </tr>
<tr> <tr>
<td colspan=2 align=center bgcolor=red>추 방</td> <td colspan=4 align=center bgcolor=blue>수 뇌 부 임 명</td>
</tr> </tr>
<tr> <tr>
<td width=498 align=right class='bg1'>대상 장수</td> <?php $officerLevelText = getOfficerLevelText(11, $nation['level']); ?>
<td width=498> <td width=98 align=right class='bg1'><?= getOfficerLevelText(12, $nation['level']) ?></td>
<td width=398><?= $level[12]['name'] ?> 【<?= CityConst::byID($level[12]['city'])->name ?>】</td>
<td width=98 align=right class='bg1'><?= $officerLevelText ?></td>
<td width=398>
<?php <?php
if ($meLevel >= 5) {
$candidateStrength = $db->query('SELECT no,name,officer_level,city,npc from general where nation=%i and officer_level!=12 and strength>=%i order by npc,binary(name)', $nationID, GameConst::$chiefStatMin);
$candidateIntel = $db->query('SELECT no,name,officer_level,city,npc from general where nation=%i and officer_level!=12 and intel>=%i order by npc,binary(name)', $nationID, GameConst::$chiefStatMin);
$candidateAny = $db->query('SELECT no,name,officer_level,city,npc,leadership,strength,intel,killturn from general where nation=%i and officer_level!=12 order by npc,binary(name)', $nationID); //추방 때문에 조금 더 김
} else {
$candidateStrength = [];
$candidateIntel = [];
$candidateAny = [];
}
if ($meLevel >= 5 && !isOfficerSet($nation['chief_set'], $meLevel)) {
echo "
<select id='genlist_kick' size=1 style=color:white;background-color:black;>";
foreach ($candidateAny as $general) {
if ($general['no'] === $me['no']) {
continue;
}
echo "
<option data-officer_level='{$general['officer_level']}' data-name='{$general['name']}' value={$general['no']}>{$general['name']} <small>({$general['leadership']}/{$general['strength']}/{$general['intel']}, {$general['killturn']}턴)</small></option>";
}
echo "
</select>
<input type=$btn id='btn_kick' value=추방>";
}
$officerLevelText = getOfficerLevelText(11, $nation['level']);
echo "
</td>
</tr>
</table>
<table align=center width=1000 class='tb_layout bg0'>
<tr><td colspan=4 height=5></td></tr>
<tr><td colspan=4 align=center bgcolor=blue>수 뇌 부 임 명</td></tr>
<tr>
<td width=98 align=right class='bg1'>" . getOfficerLevelText(12, $nation['level']) . "</td>
<td width=398>{$level[12]['name']} 【" . CityConst::byID($level[12]['city'])->name . "】</td>
<td width=98 align=right class='bg1'>{$officerLevelText}</td>
<td width=398>
";
if ($meLevel >= 5 && !isOfficerSet($nation['chief_set'], 11)) { if ($meLevel >= 5 && !isOfficerSet($nation['chief_set'], 11)) {
echo " echo "
<select id='genlist_11' size=1 maxlength=15 style=color:white;background-color:black;> <select id='genlist_11' size=1 maxlength=15 style=color:white;background-color:black;>
@@ -553,6 +524,34 @@ $nation = $db->queryFirstRow('SELECT nation,name,level,color,chief_set from nati
<td colspan=5>※ <font color=orange>노란색</font>은 변경 불가능, 하얀색은 변경 가능 관직입니다.</td> <td colspan=5>※ <font color=orange>노란색</font>은 변경 불가능, 하얀색은 변경 가능 관직입니다.</td>
</tr> </tr>
</table> </table>
<table align=center width=1000 class='tb_layout bg0'>
<tr>
<td colspan=6 height=5></td>
</tr>
<tr>
<td colspan=2 align=center bgcolor=red>추 방</td>
</tr>
<tr>
<td width=498 align=right class='bg1'>대상 장수</td>
<td width=498>
<?php
if ($meLevel >= 5 && !isOfficerSet($nation['chief_set'], $meLevel)) : ?>
<select id='genlist_kick' size=1 style=color:white;background-color:black;>";
<?php foreach ($candidateAny as $general) : ?>
<?php if ($general['no'] === $me['no']) {
continue;
}
?>
<option data-officer_level='<?= $general['officer_level'] ?>' data-name='<?= $general['name'] ?>' value='<?= $general['no'] ?>'><?= $general['name'] ?> <small>(<?= $general['leadership'] ?>/<?= $general['strength'] ?>/<?= $general['intel'] ?>, <?= $general['killturn'] ?>턴)</small></option>
<?php endforeach; ?>
</select>
<input type=<?= $btn ?> id='btn_kick' value=추방>
<?php endif; ?>
</td>
</tr>
</table>
<br> <br>
<table align=center width=1000 class='tb_layout bg0'> <table align=center width=1000 class='tb_layout bg0'>
<tr> <tr>
+18 -8
View File
@@ -5,8 +5,9 @@ namespace sammo;
include "lib.php"; include "lib.php";
include "func.php"; include "func.php";
$showDieImmediatelyBtn = false; $showDieOnPrestartBtn = false;
$availableDieImmediately = false; $showBuildNationCandidateBtn = false;
$availableDieOnPrestart = false;
//로그인 검사 //로그인 검사
$session = Session::requireGameLogin()->setReadOnly(); $session = Session::requireGameLogin()->setReadOnly();
@@ -31,12 +32,16 @@ if ($myset > 0) {
$targetTime = addTurn($me->getVar('lastrefresh'), $gameStor->turnterm, 2); $targetTime = addTurn($me->getVar('lastrefresh'), $gameStor->turnterm, 2);
if ($gameStor->turntime <= $gameStor->opentime) { if ($gameStor->turntime <= $gameStor->opentime) {
//서버 가오픈시 할 수 있는 행동 //서버 가오픈시 할 수 있는 행동
if ($me->getNPCType() == 0) { if ($me->getNPCType() == 0 && $me->getNationID() == 0) {
$showDieImmediatelyBtn = true; $showDieOnPrestartBtn = true;
if ($targetTime <= TimeUtil::now()) { if ($targetTime <= TimeUtil::now()) {
$availableDieImmediately = true; $availableDieOnPrestart = true;
} }
} }
if($me->getNationID() == 0){
$showBuildNationCandidateBtn = true;
}
} }
$use_treatment = $me->getAuxVar('use_treatment') ?? 10; $use_treatment = $me->getAuxVar('use_treatment') ?? 10;
@@ -51,7 +56,7 @@ $use_auto_nation_turn = $me->getAuxVar('use_auto_nation_turn') ?? 1;
<meta name="viewport" content="width=500" /> <meta name="viewport" content="width=500" />
<title><?= UniqueConst::$serverName ?>: 내정보</title> <title><?= UniqueConst::$serverName ?>: 내정보</title>
<?= WebUtil::printStaticValues([ <?= WebUtil::printStaticValues([
'availableDieImmediately' => $availableDieImmediately, 'availableDieOnPrestart' => $availableDieOnPrestart,
'staticValues' => [ 'staticValues' => [
'items' => Util::mapWithKey(fn (string $key, BaseItem $item) => [ 'items' => Util::mapWithKey(fn (string $key, BaseItem $item) => [
'name' => $item->getName(), 'name' => $item->getName(),
@@ -122,9 +127,14 @@ $use_auto_nation_turn = $me->getAuxVar('use_auto_nation_turn') ?? 1;
<!--빙의 해제용 삭턴 조절<br> <!--빙의 해제용 삭턴 조절<br>
<a href="b_myPage.php?detachNPC=1"><button type="button" style=background-color:<?= GameConst::$basecolor2 ?>;color:white;width:160px;height:30px;font-size:14px;>빙의 해체 요청</button></a>--> <a href="b_myPage.php?detachNPC=1"><button type="button" style=background-color:<?= GameConst::$basecolor2 ?>;color:white;width:160px;height:30px;font-size:14px;>빙의 해체 요청</button></a>-->
<?php if ($showDieImmediatelyBtn) : ?> <?php if ($showDieOnPrestartBtn) : ?>
가오픈 기간 내 장수 삭제 (<?= substr($targetTime, 0, 19) ?> 부터)<br> 가오픈 기간 내 장수 삭제 (<?= substr($targetTime, 0, 19) ?> 부터)<br>
<a href="c_die_immediately.php" id='die_immediately'><button type="button" style=background-color:<?= GameConst::$basecolor2 ?>;color:white;width:160px;height:30px;font-size:14px;>장수 삭제</button></a><br><br> <button type="button" id='dieOnPrestart' style=background-color:<?= GameConst::$basecolor2 ?>;color:white;width:160px;height:30px;font-size:14px;>장수 삭제</button><br><br>
<?php endif; ?>
<?php if ($showBuildNationCandidateBtn) : ?>
서버 개시 이전 거병(2턴부터 건국 가능)<br>
<button type="button" id='buildNationCandidate' style=background-color:<?= GameConst::$basecolor2 ?>;color:white;width:160px;height:30px;font-size:14px;>사전 거병</button><br><br>
<?php endif; ?> <?php endif; ?>
<?php if ($gameStor->npcmode == 2 && $me->getNPCType() == 0) : ?> <?php if ($gameStor->npcmode == 2 && $me->getNPCType() == 0) : ?>
+67 -114
View File
@@ -17,7 +17,8 @@ TurnExecutionHelper::executeAllCommand();
$me = $db->queryFirstRow('select no,tournament,con,turntime from general where owner=%i', $userID); $me = $db->queryFirstRow('select no,tournament,con,turntime from general where owner=%i', $userID);
$generalID = $session->generalID; $generalID = $session->generalID;
$admin = $gameStor->getValues(['tournament', 'phase', 'tnmt_msg', 'tnmt_type', 'develcost', 'tnmt_trig']); $admin = $gameStor->getValues(['tournament', 'phase', 'turnterm', 'tnmt_msg', 'tnmt_type', 'develcost', 'tnmt_trig']);
$turnTerm = $admin['turnterm'];
$con = checkLimit($me['con']); $con = checkLimit($me['con']);
if ($con >= 2) { if ($con >= 2) {
@@ -120,128 +121,80 @@ $globalBetTotal = array_sum($globalBet);
</tr> </tr>
</table> </table>
<table align=center class='tb_layout bg0'> <table align=center class='tb_layout bg0'>
<?php <?php if ($session->userGrade >= 5) : ?>
if ($session->userGrade >= 5) { <form method=post action=c_tournament.php>
$sel = []; <tr>
echo " <td colspan=8><input type=textarea size=150 style=color:white;background-color:black; name=msg><input type=submit name=btn value='메시지'></td>
<form method=post action=c_tournament.php> </tr>
<tr><td colspan=8><input type=textarea size=150 style=color:white;background-color:black; name=msg><input type=submit name=btn value='메시지'></td></tr> <tr>
<tr><td colspan=8> <td colspan=8>
<input type=button value='갱신' onclick='location.reload()'>"; <button type="button" class="btn btn-secondary" onclick='location.reload()'>갱신</button>
<?php if ($admin['tournament'] == 0) : ?>
<select name=auto size=1 style=color:white;background-color:black;>
<option style=color:white; value=0 <?= !$admin['tnmt_trig'] ? 'selected' : '' ?>>수동진행</option>
<option style=color:white; value=1 <?= $admin['tnmt_trig'] ? 'selected' : '' ?>>자동진행</option>
</select>
<input type=submit name=btn value='자동개최설정'>
<?php else : ?>
<input type=submit name=btn value='중단' onclick='return confirm("진짜 중단하시겠습니까?")'>
<?php endif; ?>
switch ($admin['tnmt_trig']) {
case 0:
$sel[0] = "selected";
break;
case 1:
$sel[1] = "selected";
break;
case 2:
$sel[2] = "selected";
break;
case 3:
$sel[3] = "selected";
break;
case 4:
$sel[4] = "selected";
break;
case 5:
$sel[5] = "selected";
break;
case 6:
$sel[6] = "selected";
break;
case 7:
$sel[7] = "selected";
break;
}
if ($admin['tournament'] == 0) { <?php switch ($admin['tournament']) {
?> case 1:
<select name=auto size=1 style=color:white;background-color:black;> echo "<input type=submit name=btn value='랜덤투입'>";
<option style=color:white; value=0>수동진행</option> echo "<input type=submit name=btn value='랜덤전부투입'>";
<option style=color:white; value=1>12분 05일</option> break;
<option style=color:white; value=2>07분 10시</option> case 2:
<option style=color:white; value=3>03분 04시</option> echo "<input type=submit name=btn value='예선'><input type=submit name=btn value='예선전부'>";
<option style=color:white; value=4>01분 82분</option> break;
<option style=color:white; value=5>30초 41분</option> case 3:
<option style=color:white; value=6>15초 21분</option> echo "<input type=submit name=btn value='추첨'><input type=submit name=btn value='추첨전부'>";
<option style=color:white; value=7>05초 07분</option> break;
</select> case 4:
<select name=type size=1 style=color:white;background-color:black;> echo "<input type=submit name=btn value='본선'><input type=submit name=btn value='본선전부'>";
<option style=color:white; value=0>전력전</option> break;
<option style=color:white; value=1>통솔전</option> case 5:
<option style=color:white; value=2>일기토</option> echo "<input type=submit name=btn value='배정'>";
<option style=color:white; value=3>설전</option> break;
</select> case 6:
<input type=submit name=btn value='개최'> echo "<input type=submit name=btn value='베팅마감'>";
<select name=trig size=1 style=color:white;background-color:black;> break;
<option style=color:white; value=0 <?= $sel[0] ?? '' ?>>수동진행</option> case 7:
<option style=color:white; value=1 <?= $sel[1] ?? '' ?>>12분 05일</option> echo "<input type=submit name=btn value='16강'>";
<option style=color:white; value=2 <?= $sel[2] ?? '' ?>>07분 10시</option> break;
<option style=color:white; value=3 <?= $sel[3] ?? '' ?>>03분 04시</option> case 8:
<option style=color:white; value=4 <?= $sel[4] ?? '' ?>>01분 82분</option> echo "<input type=submit name=btn value='8강'>";
<option style=color:white; value=5 <?= $sel[5] ?? '' ?>>30초 41분</option> break;
<option style=color:white; value=6 <?= $sel[6] ?? '' ?>>15초 21분</option> case 9:
<option style=color:white; value=7 <?= $sel[7] ?? '' ?>>05초 07분</option> echo "<input type=submit name=btn value='4강'>";
</select> break;
<input type=submit name=btn value='자동개최설정'> case 10:
<input type=submit name=btn value='포상'> echo "<input type=submit name=btn value='결승'>";
<input type=submit name=btn value='회수'> break;
<?php } ?>
} else {
echo "<input type=submit name=btn value='중단' onclick='return confirm(\"진짜 중단하시겠습니까?\")'>";
}
switch ($admin['tournament']) { </td>
case 1: </tr>
echo "<input type=submit name=btn value='랜덤투입'>"; </form>
echo "<input type=submit name=btn value='랜덤전부투입'>"; <?php elseif ($me['no'] > 0 && $me['tournament'] == 0 && $admin['tournament'] == 1) : ?>
break; <form method=post action=c_tournament.php>
case 2: <tr>
echo "<input type=submit name=btn value='예선'><input type=submit name=btn value='예선전부'>"; <td colspan=8><button type="button" class="btn btn-secondary" onclick='location.reload()'>갱신</button><button type="submit" class="btn btn-sammo-base2" onclick='return confirm("참가비 금<?= $admin['develcost'] ?>이 필요합니다. 참가하시겠습니까?")'>참가</button><input type='hidden' name='btn' value='참가'/></td>
break; </tr>
case 3: </form>
echo "<input type=submit name=btn value='추첨'><input type=submit name=btn value='추첨전부'>"; <?php else : ?>
break; <tr>
case 4: <td colspan=8><button type="button" class="btn btn-secondary" onclick='location.reload()'>갱신</button></td>
echo "<input type=submit name=btn value='본선'><input type=submit name=btn value='본선전부'>"; </tr>
break; <?php endif;
case 5:
echo "<input type=submit name=btn value='배정'>";
break;
case 6:
echo "<input type=submit name=btn value='베팅마감'>";
break;
case 7:
echo "<input type=submit name=btn value='16강'>";
break;
case 8:
echo "<input type=submit name=btn value='8강'>";
break;
case 9:
echo "<input type=submit name=btn value='4강'>";
break;
case 10:
echo "<input type=submit name=btn value='결승'>";
break;
}
echo "
</td></tr>
</form>";
} elseif ($me['no'] > 0 && $me['tournament'] == 0 && $admin['tournament'] == 1) {
echo "<form method=post action=c_tournament.php><tr><td colspan=8><input type=button value='갱신' onclick='location.reload()'><input type=submit name=btn value='참가' onclick='return confirm(\"참가비 금{$admin['develcost']}이 필요합니다. 참가하시겠습니까?\")'></td></tr></form>";
} else {
echo "<tr><td colspan=8><input type=button value='갱신' onclick='location.reload()'></td></tr>";
}
$str1 = getTournament($admin['tournament']); $str1 = getTournament($admin['tournament']);
$str2 = getTournamentTime(); $str2 = getTournamentTime();
if ($str2) { if ($str2) {
$str2 = ', ' . $str2; $str2 = ', ' . $str2;
} }
$str3 = getTournamentTermText(); $str3 = getTournamentTermText($turnTerm);
if ($str3) { if ($str3) {
$str3 = ', ' . $str3; $str3 = ', ' . $str3;
} }
+33 -12
View File
@@ -12,7 +12,8 @@ $db = DB::db();
increaseRefresh("부대편성", 1); increaseRefresh("부대편성", 1);
$me = $db->queryFirstRow('SELECT no,nation,troop FROM general WHERE owner=%i', $userID); $me = $db->queryFirstRow('SELECT no,nation,troop,`officer_level`,permission,penalty FROM general WHERE owner=%i', $userID);
$permission = checkSecretPermission($me, false);
$troops = []; $troops = [];
foreach ($db->query('SELECT troop_leader,name FROM troop WHERE nation = %i', $me['nation']) as $rawTroop) { foreach ($db->query('SELECT troop_leader,name FROM troop WHERE nation = %i', $me['nation']) as $rawTroop) {
@@ -204,17 +205,37 @@ uasort($troops, function ($lhs, $rhs) {
</table> </table>
<br> <br>
<table width=1000 class='tb_layout bg0'> <div class="row">
<tr> <?php if($me['troop'] == 0): ?>
<td width=80 class='bg1'>부 대 명</td> <div class="col-6"><?php /*TODO: 모바일 */ ?>
<td width=130><input type=text style=color:white;background-color:black; size=18 maxlength=18 id='nameplate'></td> <div class="row gx-0 bg0">
<?php if ($me['troop'] == 0) : ?> <div class="bg1 col d-grid"><span class="align-self-center center">부대명</span></div>
<td><input type=button id='btnCreateTroop' value='부 대 창 설'></td> <div class="col d-grid"><input type=text style=color:white;background-color:black; size=18 maxlength=18 id='newTroopName'></div>
<?php else : ?> <div class="col d-grid"><button type='button' id="btnCreateTroop" class='btn btn-sm btn-secondary'>부대 창설</button></div>
<td><input type=button id='btnChangeTroopName' value='부 대 변 경'></td> </div>
<?php endif; ?> </div>
</tr> <?php endif; ?>
</table> <?php if($troops && ($me['troop'] == $me['no'] || $permission == 4)): ?>
<div class="col-6">
<div class="row gx-0 bg0">
<div class="bg1 col d-grid"><span class="align-self-center center">부대명</span></div>
<div class="col d-grid"><select class="form-select" id="changeNameTroopID">
<?php if($permission != 4): ?>
<option value="<?=$me['troop']?>"><?=$troops[$me['troop']]['name']?></option>
<?php else: ?>
<?php foreach ($troops as $troopNo => $troop): ?>
<option value="<?=$troopNo?>"><?=$troop['name']?></option>
<?php endforeach; ?>
<?php endif; ?>
</select>
</div>
<div class="col d-grid"><input type=text style=color:white;background-color:black; size=18 maxlength=18 id='changeTroopName'></div>
<div class="col d-grid"><button type='button' id="btnChangeTroopName" class='btn btn-sm btn-secondary'>이름 변경</button></div>
</div>
</div>
<?php endif; ?>
</div>
<table width=1000 class='tb_layout bg0'> <table width=1000 class='tb_layout bg0'>
<tr> <tr>
+2 -2
View File
@@ -113,11 +113,11 @@ if($session->userGrade < 5) {
} }
if($btn == "자동개최설정") { if($btn == "자동개최설정") {
$gameStor->tnmt_trig = $trig; $gameStor->tnmt_trig = !!$trig;
} elseif($btn == "개최") { } elseif($btn == "개최") {
startTournament($auto, $type); startTournament($auto, $type);
} elseif($btn == "중단") { } elseif($btn == "중단") {
$gameStor->tnmt_auto = 0; $gameStor->tnmt_auto = false;
$gameStor->tournament = 0; $gameStor->tournament = 0;
$gameStor->phase = 0; $gameStor->phase = 0;
} elseif($btn == "랜덤투입") { } elseif($btn == "랜덤투입") {
+2 -2
View File
@@ -1358,7 +1358,7 @@ function triggerTournament(RandUtil $rng)
if ($tournament != 0) { if ($tournament != 0) {
return; return;
} }
if ($tnmt_trig == 0) { if (!$tnmt_trig) {
return; return;
} }
if (!$rng->nextBool(0.4)) { if (!$rng->nextBool(0.4)) {
@@ -1374,7 +1374,7 @@ function triggerTournament(RandUtil $rng)
$tnmt_type = array_pop($tnmt_pattern); $tnmt_type = array_pop($tnmt_pattern);
$gameStor->setValue('tnmt_pattern', $tnmt_pattern); $gameStor->setValue('tnmt_pattern', $tnmt_pattern);
startTournament($tnmt_trig, $tnmt_type); startTournament($tnmt_type);
} }
function CheckHall($no) function CheckHall($no)
+22 -77
View File
@@ -5,17 +5,25 @@ namespace sammo;
use sammo\DTO\BettingInfo; use sammo\DTO\BettingInfo;
use sammo\Enums\InheritanceKey; use sammo\Enums\InheritanceKey;
/**
* @param int $turnTerm 서버 턴 단위
* @return int 토너먼트 초 단위
*/
function calcTournamentTerm(int $turnTerm): int{
return Util::valueFit($turnTerm, 5, 120);
}
function processTournament() function processTournament()
{ {
$db = DB::db(); $db = DB::db();
$gameStor = KVStorage::getStorage($db, 'game_env'); $gameStor = KVStorage::getStorage($db, 'game_env');
$admin = $gameStor->getValues(['tournament', 'phase', 'tnmt_type', 'tnmt_auto', 'tnmt_time', 'last_tournament_betting_id']); $admin = $gameStor->getValues(['tournament', 'phase', 'tnmt_type', 'tnmt_auto', 'tnmt_time', 'turnterm', 'last_tournament_betting_id']);
$now = new \DateTime(); $now = new \DateTime();
$offset = $now->getTimestamp() - (new \DateTime($admin['tnmt_time']))->getTimestamp(); $offset = $now->getTimestamp() - (new \DateTime($admin['tnmt_time']))->getTimestamp();
//수동일땐 무시 //수동일땐 무시
if ($admin['tnmt_auto'] == 0) { if (!$admin['tnmt_auto']) {
return; return;
} }
@@ -28,18 +36,7 @@ function processTournament()
} }
//현시간이 스탬프 지나친경우 //현시간이 스탬프 지나친경우
$unit = [ $unit = calcTournamentTerm($admin['turnterm']);
1 => 720,
2 => 420,
3 => 180,
4 => 60,
5 => 30,
6 => 15,
7 => 5,
][$admin['tnmt_auto']] ?? null;
if($unit === null){
throw new MustNotBeReachedException();
}
//업데이트 횟수 //업데이트 횟수
$iter = intdiv($offset, $unit) + 1; $iter = intdiv($offset, $unit) + 1;
@@ -123,10 +120,7 @@ function processTournament()
//베팅은 무조건 60페이즈후 진행(최대 1시간) //베팅은 무조건 60페이즈후 진행(최대 1시간)
if ($tnmt == 6) { if ($tnmt == 6) {
$betTerm = $unit * 60; $betTerm = Util::valueFit($unit * 60, null, 3600);
if ($betTerm > 3600) {
$betTerm = 3600;
}
//처리 초 더한 날짜 //처리 초 더한 날짜
$dt = date("Y-m-d H:i:s", strtotime($admin['tnmt_time']) + $unit * $i + $betTerm); $dt = date("Y-m-d H:i:s", strtotime($admin['tnmt_time']) + $unit * $i + $betTerm);
$gameStor->tournament = $tnmt; $gameStor->tournament = $tnmt;
@@ -134,20 +128,6 @@ function processTournament()
$gameStor->tnmt_time = $dt; $gameStor->tnmt_time = $dt;
return; return;
} }
if ($admin['tnmt_auto'] == 1) {
//처리 초 더한 날짜
$dt = date("Y-m-d H:i:s", strtotime($admin['tnmt_time']) + $unit * $i);
$hr = substr($dt, 11, 2);
//지정시간대 넘어가면 중단 20~24시
if ($hr < 20) {
$dt = substr($dt, 0, 11) . "20:00:00";
$gameStor->tournament = $tnmt;
$gameStor->phase = $phase;
$gameStor->tnmt_time = $dt;
return;
}
}
} }
$second = $unit * $iter; $second = $unit * $iter;
@@ -156,35 +136,9 @@ function processTournament()
$gameStor->tnmt_time = (new \DateTimeImmutable($admin['tnmt_time']))->add(new \DateInterval("PT{$second}S"))->format('Y-m-d H:i:s'); $gameStor->tnmt_time = (new \DateTimeImmutable($admin['tnmt_time']))->add(new \DateInterval("PT{$second}S"))->format('Y-m-d H:i:s');
} }
function getTournamentTerm(): ?int function getTournamentTermText(int $turnTerm)
{ {
$db = DB::db(); $term = calcTournamentTerm($turnTerm);
$gameStor = KVStorage::getStorage($db, 'game_env');
$tnmt_auto = $gameStor->tnmt_auto;
if ($tnmt_auto === null) {
$tnmt_auto = $gameStor->tnmt_trig;
}
return [
0 => null,
1 => 12 * 60,
2 => 7 * 60,
3 => 3 * 60,
4 => 1 * 60,
5 => 30,
6 => 15,
7 => 5,
][$tnmt_auto] ?? null;
}
function getTournamentTermText()
{
$term = getTournamentTerm();
if ($term === null) {
return '수동';
}
if ($term % 60 === 0) { if ($term % 60 === 0) {
$termMin = intdiv($term, 60); $termMin = intdiv($term, 60);
@@ -320,26 +274,18 @@ function printFighting($tournament, $phase)
} }
} }
function startTournament($auto, $type) function startTournament($type)
{ {
$db = DB::db(); $db = DB::db();
$gameStor = KVStorage::getStorage($db, 'game_env'); $gameStor = KVStorage::getStorage($db, 'game_env');
eraseTnmtFightLogAll(); eraseTnmtFightLogAll();
$unit = [ $admin = $gameStor->getValues(['year', 'month', 'turnterm']);
1 => 60, $turnTerm = $admin['turnterm'];
2 => 60, $unit = calcTournamentTerm($turnTerm);
3 => 60,
4 => 60,
5 => 30,
6 => 15,
7 => 5,
][$auto] ?? 60;
$admin = $gameStor->getValues(['year', 'month']); $gameStor->tnmt_auto = true;
$gameStor->tnmt_auto = $auto;
$gameStor->tnmt_time = (new \DateTimeImmutable())->add(new \DateInterval("PT{$unit}M"))->format('Y-m-d H:i:s'); $gameStor->tnmt_time = (new \DateTimeImmutable())->add(new \DateInterval("PT{$unit}M"))->format('Y-m-d H:i:s');
$gameStor->tournament = 1; $gameStor->tournament = 1;
$gameStor->tnmt_type = $type; $gameStor->tnmt_type = $type;
@@ -392,7 +338,7 @@ function getDummyBettingInfo(string $tnmt_type): BettingInfo
); );
} }
function startBetting($type, $unit) function startBetting($type)
{ {
$db = DB::db(); $db = DB::db();
$gameStor = KVStorage::getStorage($db, 'game_env'); $gameStor = KVStorage::getStorage($db, 'game_env');
@@ -431,7 +377,6 @@ function startBetting($type, $unit)
aux: $general aux: $general
); );
} }
$candidateCnt = count($candidates);
Betting::openBetting(new BettingInfo( Betting::openBetting(new BettingInfo(
id: $bettingID, id: $bettingID,
@@ -982,7 +927,7 @@ function setGift($tnmt_type, $tnmt, $phase)
} }
//자동진행 끝 //자동진행 끝
$gameStor->tnmt_auto = 0; $gameStor->tnmt_auto = false;
//장수열전 기록 //장수열전 기록
/** @var ActionLogger */ /** @var ActionLogger */
@@ -1041,7 +986,7 @@ function setRefund()
} }
//자동진행 끝 //자동진행 끝
$gameStor->tnmt_auto = 0; $gameStor->tnmt_auto = false;
} }
//10차이 1.1, 50 차이 1.17, 100차이 1.2 //10차이 1.1, 50 차이 1.17, 100차이 1.2
+30 -5
View File
@@ -114,10 +114,10 @@ if (!$otherTextInfo) {
$lastVoteID = $gameStor->lastVote; $lastVoteID = $gameStor->lastVote;
$lastVote = null; $lastVote = null;
if($lastVoteID){ if ($lastVoteID) {
$voteStor = KVStorage::getStorage($db, 'vote'); $voteStor = KVStorage::getStorage($db, 'vote');
$lastVote = VoteInfo::fromArray($voteStor->getValue("vote_{$lastVoteID}")); $lastVote = VoteInfo::fromArray($voteStor->getValue("vote_{$lastVoteID}"));
if($lastVote->endDate && $lastVote->endDate < TimeUtil::now()){ if ($lastVote->endDate && $lastVote->endDate < TimeUtil::now()) {
$lastVote = null; $lastVote = null;
} }
} }
@@ -190,7 +190,7 @@ if($lastVoteID){
NPC선택 : <?= $npcmode ?> NPC선택 : <?= $npcmode ?>
</div> </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-md-2" style="color:<?= $color ?>;">
토너먼트 : <?= getTournamentTermText() ?> 토너먼트 : <?= getTournamentTermText($gameStor->turnterm) ?>
</div> </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-md-2" style="color:<?= $color ?>;">
기타 설정: <?= $otherTextInfo ?> 기타 설정: <?= $otherTextInfo ?>
@@ -282,7 +282,21 @@ if($lastVoteID){
<div id="nation-position"><?php myNationInfo($generalObj); ?></div> <div id="nation-position"><?php myNationInfo($generalObj); ?></div>
<div id="general-position"><?php generalInfo($generalObj); ?></div> <div id="general-position"><?php generalInfo($generalObj); ?></div>
<div id="generalCommandButton" class="row gx-0"> <div id="generalCommandButton" class="row gx-0">
<div class="buttonPlate bg2"><?= commandButton(['btnClass' => 'btn btn-sammo-nation', 'isTournamentApplicationOpen' => $isTournamentApplicationOpen, 'isBettingActive' => $isBettingActive]) ?></div> <div class="buttonPlate bg2">
<?= commandButton([
'splitBtnBegin' => '<div class="btn-group">',
'splitBtnEnd' => '</div>',
'splitZoneSign' => '<button type="button" class="btn btn-sammo-nation dropdown-toggle dropdown-toggle-split" data-bs-toggle="dropdown" aria-expanded="false"><span class="visually-hidden">Toggle Dropdown</span></button>',
'splitZoneBegin' => '<ul class="dropdown-menu dropdown-menu-end">',
'splitZoneEnd' => '</ul>',
'splitSubBtnBegin' => '<li>',
'splitSubBtnEnd' => '</li>',
'btnClass' => 'btn btn-sammo-nation',
'btnSplitClass' => 'dropdown-item',
'isTournamentApplicationOpen' => $isTournamentApplicationOpen,
'isBettingActive' => $isBettingActive
])
?></div>
</div> </div>
</div> </div>
</div> </div>
@@ -382,7 +396,18 @@ if($lastVoteID){
국가 메뉴 국가 메뉴
</div> </div>
<ul class="dropdown-menu" aria-labelledby="navbarNation" id="navbarNationItems"> <ul class="dropdown-menu" aria-labelledby="navbarNation" id="navbarNationItems">
<?= commandButton(['btnBegin' => '<li>', 'btnEnd' => '</li>', 'btnClass' => 'dropdown-item', 'isTournamentApplicationOpen' => $isTournamentApplicationOpen, 'isBettingActive' => $isBettingActive]) ?> <?= commandButton([
'btnBegin' => '<li>',
'btnEnd' => '</li>',
'splitMainBegin' => '<div class="d-none">',
'splitMainEnd' => '</div>',
'splitSubBtnBegin' => '<li>',
'splitSubBtnEnd' => '</li>',
'btnClass' => 'dropdown-item',
'btnSplitClass' => 'dropdown-item',
'isTournamentApplicationOpen' => $isTournamentApplicationOpen,
'isBettingActive' => $isBettingActive
]) ?>
</ul> </ul>
</li> </li>
<li class="nav-item dropup"> <li class="nav-item dropup">
+3 -9
View File
@@ -194,17 +194,11 @@ if ($session->userGrade < 5 && !$allowReset) {
</div> </div>
<div class="form-group row"> <div class="form-group row">
<label for="tournament_trig" class="col-sm-3 col-form-label"><span class="text-nowrap">토너먼트 자동 시작</span> <span class="text-nowrap">경기 단위</span></label> <label for="tournament_trig" class="col-sm-3 col-form-label"><span class="text-nowrap">토너먼트 자동 시작</span></label>
<div class="col-sm-9" id="tournament_trig"> <div class="col-sm-9" id="tournament_trig">
<div id="tournament_trig" class="btn-group-toggle btn-group flex-wrap" data-bs-toggle="buttons"> <div id="tournament_trig" class="btn-group-toggle btn-group flex-wrap" data-bs-toggle="buttons">
<input type="radio" class="btn-check" id="tournament_trig_0" name="tournament_trig" value="0"><label for="tournament_trig_0" class="btn btn-secondary w-25">안함</label> <input type="radio" class="btn-check" id="tournament_trig_0" name="tournament_trig" value="0"><label for="tournament_trig_0" class="btn btn-secondary w-25">수동</label>
<input type="radio" class="btn-check" id="tournament_trig_1" name="tournament_trig" value="1"><label for="tournament_trig_1" class="btn btn-secondary w-25">12분(총 5일)</label> <input type="radio" class="btn-check" id="tournament_trig_1" name="tournament_trig" checked value="1"><label for="tournament_trig_1" class="btn btn-secondary w-25">자동</label>
<input type="radio" class="btn-check" id="tournament_trig_2" name="tournament_trig" value="2"><label for="tournament_trig_2" class="btn btn-secondary w-25">7분(총 10시간)</label>
<input type="radio" class="btn-check" id="tournament_trig_3" name="tournament_trig" value="3"><label for="tournament_trig_3" class="btn btn-secondary w-25">3분(총 4시간)</label>
<input type="radio" class="btn-check" id="tournament_trig_4" name="tournament_trig" value="4" checked><label for="tournament_trig_4" class="btn btn-secondary w-25">1분(총 82분)</label>
<input type="radio" class="btn-check" id="tournament_trig_5" name="tournament_trig" value="5"><label for="tournament_trig_5" class="btn btn-secondary w-25">30초(총 41분)</label>
<input type="radio" class="btn-check" id="tournament_trig_6" name="tournament_trig" value="6"><label for="tournament_trig_6" class="btn btn-secondary w-25">15초(총 21분)</label>
<input type="radio" class="btn-check" id="tournament_trig_7" name="tournament_trig" value="7"><label for="tournament_trig_7" class="btn btn-secondary w-25">5초(총 7분)</label>
</div> </div>
</div> </div>
</div> </div>
+2 -2
View File
@@ -56,7 +56,7 @@ else if(
$status = 'closed'; $status = 'closed';
} }
else if( else if(
$isUnited > 0 && $isUnited > 0 &&
$now->getTimestamp() - $lastTurn->getTimestamp() > ($reservedDate->getTimestamp() - $now->getTimestamp()) * 2 $now->getTimestamp() - $lastTurn->getTimestamp() > ($reservedDate->getTimestamp() - $now->getTimestamp()) * 2
){ ){
//천통 & 비정지 상태 & 2/3 넘음 //천통 & 비정지 상태 & 2/3 넘음
@@ -88,7 +88,7 @@ $result = ResetHelper::buildScenario(
$options['block_general_create'], $options['block_general_create'],
$options['npcmode'], $options['npcmode'],
$options['show_img_level'], $options['show_img_level'],
$options['tournament_trig'], !!$options['tournament_trig'],
$options['join_mode'], $options['join_mode'],
$options['starttime'], $options['starttime'],
$options['autorun_user']?:null $options['autorun_user']?:null
-61
View File
@@ -1,61 +0,0 @@
<?php
namespace sammo;
include "lib.php";
include "func.php";
WebUtil::requireAJAX();
$availableDieImmediately = false;
//로그인 검사
$session = Session::requireGameLogin();
$userID = Session::getUserID();
$db = DB::db();
$gameStor = KVStorage::getStorage($db, 'game_env');
$general = $db->queryFirstRow('SELECT no,name,owner_name,npc,lastrefresh FROM general WHERE owner=%i AND npc = 0', $userID);
if(!$general){
Json::die([
'result'=>false,
'reason'=>'장수가 없습니다.'
]);
}
increaseRefresh("장수 삭제", 1);
$gameStor->cacheValues(['turnterm', 'opentime', 'turntime', 'year', 'month']);
if($gameStor->turntime > $gameStor->opentime){
Json::die([
'result'=>false,
'reason'=>'이미 서버가 시작되었습니다.'
]);
}
$targetTime = addTurn($general['lastrefresh'], $gameStor->turnterm, 2);
if($targetTime > TimeUtil::now()){
$targetTimeShort = substr($targetTime, 0, 19);
Json::die([
'result'=>false,
'reason'=>"아직 삭제할 수 없습니다. {$targetTimeShort} 부터 가능합니다."
]);
}
$generalObj = General::createGeneralObjFromDB($general['no']);
if($generalObj instanceof DummyGeneral){
trigger_error("올바르지 않은 삭제 프로세스 $userID", E_USER_WARNING);
}
$generalName = $generalObj->getName();
$josaYi = JosaUtil::pick($generalName, '이');
$generalObj->kill($db, true, "<Y>{$generalName}</>{$josaYi} 이 홀연히 모습을 <R>감추었습니다</>");
$session->logoutGame();
Json::die([
'result'=>true,
'reason'=>'success'
]);
+2 -2
View File
@@ -111,7 +111,7 @@ $extend = (int)$_POST['extend'];
$npcmode = (int)$_POST['npcmode']; $npcmode = (int)$_POST['npcmode'];
$block_general_create = (bool)$_POST['block_general_create']; $block_general_create = (bool)$_POST['block_general_create'];
$show_img_level = (int)$_POST['show_img_level']; $show_img_level = (int)$_POST['show_img_level'];
$tournament_trig = (int)$_POST['tournament_trig']; $tournament_trig = !!(int)$_POST['tournament_trig'];
$join_mode = $_POST['join_mode']; $join_mode = $_POST['join_mode'];
$autorun_user_minutes = (int)$_POST['autorun_user_minutes']; $autorun_user_minutes = (int)$_POST['autorun_user_minutes'];
$autorun_user_options = []; $autorun_user_options = [];
@@ -208,7 +208,7 @@ Json::die(ResetHelper::buildScenario(
$block_general_create, $block_general_create,
$npcmode, $npcmode,
$show_img_level, $show_img_level,
$tournament_trig, !!$tournament_trig,
$join_mode, $join_mode,
TimeUtil::now(), TimeUtil::now(),
$autorun_user $autorun_user
-26
View File
@@ -53,32 +53,6 @@ if($action == '부대창설'){
]); ]);
} }
if($action == '부대변경'){
$name = StringUtil::neutralize($name);
if(!$name){
Json::die([
'result'=>false,
'reason'=>'부대 이름이 없습니다.'
]);
}
$db->update('troop', [
'name'=>$name
], 'troop_leader=%i',$generalID);
if($db->affectedRows() == 0){
Json::die([
'result'=>false,
'reason'=>'부대장이 아닙니다.'
]);
}
Json::die([
'result'=>true,
'reason'=>'success'
]);
}
if($action == '부대추방'){ if($action == '부대추방'){
if (!$gen){ if (!$gen){
Json::die([ Json::die([
@@ -9,8 +9,11 @@ use sammo\DB;
use sammo\DTO\AuctionBidItem; use sammo\DTO\AuctionBidItem;
use sammo\DTO\AuctionInfo; use sammo\DTO\AuctionInfo;
use sammo\Enums\AuctionType; use sammo\Enums\AuctionType;
use sammo\Enums\InheritanceKey;
use sammo\InheritancePointManager;
use sammo\TimeUtil; use sammo\TimeUtil;
use sammo\Validator; use sammo\Validator;
use sammo\General;
class GetUniqueItemAuctionDetail extends \sammo\BaseAPI class GetUniqueItemAuctionDetail extends \sammo\BaseAPI
{ {
@@ -69,6 +72,13 @@ class GetUniqueItemAuctionDetail extends \sammo\BaseAPI
]; ];
} }
$inheritMgr = InheritancePointManager::getInstance();
//preveious라서 column을 최대한 비울 수 있다.
$remainPoint = $inheritMgr->getInheritancePoint(
General::createGeneralObjFromDB($generalID, ['owner'], 0),
InheritanceKey::previous
);
$obfuscatedName = AuctionUniqueItem::genObfuscatedName($generalID); $obfuscatedName = AuctionUniqueItem::genObfuscatedName($generalID);
return [ return [
@@ -86,6 +96,7 @@ class GetUniqueItemAuctionDetail extends \sammo\BaseAPI
], ],
'bidList' => $responseBid, 'bidList' => $responseBid,
'obfuscatedName' => $obfuscatedName, 'obfuscatedName' => $obfuscatedName,
'remainPoint' => $remainPoint,
]; ];
} }
} }
+1 -1
View File
@@ -73,7 +73,7 @@ class OpenBuyRiceAuction extends \sammo\BaseAPI
$initYearMonth = Util::joinYearMonth($initYear, $initMonth); $initYearMonth = Util::joinYearMonth($initYear, $initMonth);
$yearMonth = Util::joinYearMonth($year, $month); $yearMonth = Util::joinYearMonth($year, $month);
if($yearMonth <= $initYearMonth + 3){ if($yearMonth < $initYearMonth + 3){
return '시작 후 3개월이 지나야 경매를 열 수 있습니다.'; return '시작 후 3개월이 지나야 경매를 열 수 있습니다.';
} }
@@ -73,7 +73,7 @@ class OpenSellRiceAuction extends \sammo\BaseAPI
$initYearMonth = Util::joinYearMonth($initYear, $initMonth); $initYearMonth = Util::joinYearMonth($initYear, $initMonth);
$yearMonth = Util::joinYearMonth($year, $month); $yearMonth = Util::joinYearMonth($year, $month);
if($yearMonth <= $initYearMonth + 3){ if($yearMonth < $initYearMonth + 3){
return '시작 후 3개월이 지나야 경매를 열 수 있습니다.'; return '시작 후 3개월이 지나야 경매를 열 수 있습니다.';
} }
+1 -1
View File
@@ -64,7 +64,7 @@ class OpenUniqueAuction extends \sammo\BaseAPI
$initYearMonth = Util::joinYearMonth($initYear, $initMonth); $initYearMonth = Util::joinYearMonth($initYear, $initMonth);
$yearMonth = Util::joinYearMonth($year, $month); $yearMonth = Util::joinYearMonth($year, $month);
if($yearMonth <= $initYearMonth + 3){ if($yearMonth < $initYearMonth + 3){
return '시작 후 3개월이 지나야 경매를 열 수 있습니다.'; return '시작 후 3개월이 지나야 경매를 열 수 있습니다.';
} }
@@ -0,0 +1,94 @@
<?php
namespace sammo\API\General;
use sammo\Command\General\che_거병;
use sammo\DB;
use sammo\Validator;
use sammo\Session;
use sammo\GameConst;
use sammo\General;
use sammo\JosaUtil;
use sammo\KVStorage;
use sammo\LiteHashDRBG;
use sammo\RandUtil;
use sammo\UniqueConst;
use sammo\Util;
use function sammo\increaseRefresh;
class BuildNationCandidate 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)
{
$userID = $session->userID;
$db = DB::db();
$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);
if (!$general) {
return '장수가 없습니다';
}
$generalID = $general['no'];
increaseRefresh("사전 거병", 1);
if ($gameStor->turntime > $gameStor->opentime) {
return '게임이 시작되었습니다.';
}
if ($general['nation'] != 0) {
return '이미 국가에 소속되어있습니다.';
}
$env = $gameStor->getAll();
$generalObj = General::createGeneralObjFromDB($general['no']);
$validCmd = false;
foreach(GameConst::$availableGeneralCommand as $cmdList){
if(in_array('che_거병', $cmdList)){
$validCmd = true;
break;
}
}
if(!$validCmd){
return '거병할 수 없는 모드입니다.';
}
$cmd = new che_거병($generalObj, $env);
$failReason = $cmd->testFullConditionMet();
if ($failReason !== null) {
return $failReason;
}
$rng = new RandUtil(new LiteHashDRBG(Util::simpleSerialize(
UniqueConst::$hiddenSeed,
'BuildNationCandidate',
$generalID,
)));
$result = $cmd->run($rng);
if(!$result){
return '거병을 실패했습니다.';
}
return null;
}
}
+75
View File
@@ -0,0 +1,75 @@
<?php
namespace sammo\API\General;
use sammo\DB;
use sammo\DummyGeneral;
use sammo\Session;
use sammo\General;
use sammo\JosaUtil;
use sammo\KVStorage;
use sammo\TimeUtil;
use function sammo\addTurn;
use function sammo\increaseRefresh;
class DieOnPrestart 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)
{
//로그인 검사
$userID = $session->userID;
$db = DB::db();
$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);
if (!$general) {
return '장수가 없습니다';
}
increaseRefresh("장수 삭제", 1);
if ($gameStor->turntime > $gameStor->opentime) {
return '게임이 시작되었습니다.';
}
if ($general['nation'] != 0){
return '이미 국가에 소속되어있습니다.';
}
//서버 가오픈시 할 수 있는 행동
$targetTime = addTurn($general['lastrefresh'], $gameStor->turnterm, 2);
if ($targetTime > TimeUtil::now()) {
$targetTimeShort = substr($targetTime, 0, 19);
return "아직 삭제할 수 없습니다. {$targetTimeShort} 부터 가능합니다.";
}
$generalObj = General::createGeneralObjFromDB($general['no']);
if ($generalObj instanceof DummyGeneral) {
trigger_error("올바르지 않은 삭제 프로세스 $userID", E_USER_WARNING);
}
$generalName = $generalObj->getName();
$josaYi = JosaUtil::pick($generalName, '이');
$generalObj->kill($db, true, "<Y>{$generalName}</>{$josaYi} 이 홀연히 모습을 <R>감추었습니다</>");
$session->logoutGame();
return null;
}
}
+5
View File
@@ -75,6 +75,7 @@ class Join extends \sammo\BaseAPI
if (!$v->validate()) { if (!$v->validate()) {
return $v->errorStr(); return $v->errorStr();
} }
return null; return null;
} }
@@ -104,6 +105,10 @@ class Join extends \sammo\BaseAPI
$inheritCity = $this->args['inheritCity'] ?? null; $inheritCity = $this->args['inheritCity'] ?? null;
$inheritBonusStat = $this->args['inheritBonusStat'] ?? null; $inheritBonusStat = $this->args['inheritBonusStat'] ?? null;
if($inheritTurntime !== null && $inheritCity !== null){
return '턴과 도시를 동시에 지정할 수 없습니다.';
}
$rootDB = RootDB::db(); $rootDB = RootDB::db();
//회원 테이블에서 정보확인 //회원 테이블에서 정보확인
$member = $rootDB->queryFirstRow('SELECT `no`, id, picture, grade, `name`, imgsvr FROM member WHERE no=%i', $userID); $member = $rootDB->queryFirstRow('SELECT `no`, id, picture, grade, `name`, imgsvr FROM member WHERE no=%i', $userID);
@@ -0,0 +1,40 @@
<?php
namespace sammo\API\InheritAction;
use DateTimeInterface;
use sammo\DB;
use sammo\Session;
use sammo\Validator;
use sammo\Util;
class GetMoreLog extends \sammo\BaseAPI
{
public function validateArgs(): ?string
{
$v = new Validator($this->args);
$v->rule('integer', 'lastID');
if (!$v->validate()) {
return $v->errorStr();
}
$this->args['lastID'] = Util::toInt($this->args['lastID']);
return null;
}
function getRequiredSessionMode(): int
{
return static::REQ_GAME_LOGIN | static::REQ_READ_ONLY;
}
function launch(Session $session, ?DateTimeInterface $modifiedSince, ?string $reqEtag)
{
$userID = $session->userID;
$lastID = $this->args['lastID'];
$db = DB::db();
$lastInheritPointLogs = $db->query('SELECT id, server_id, year, month, date, text FROM user_record WHERE log_type = %s AND `user_id` = %i AND id < %i ORDER BY id desc LIMIT 30', "inheritPoint", $userID, $lastID);
return [
'result'=> true,
'log' => $lastInheritPointLogs,
];
}
}
+65
View File
@@ -0,0 +1,65 @@
<?php
namespace sammo\API\Nation;
use sammo\Session;
use DateTimeInterface;
use sammo\DB;
use sammo\StringUtil;
use sammo\Validator;
use function sammo\checkSecretPermission;
class SetTroopName extends \sammo\BaseAPI
{
public function validateArgs(): ?string
{
$v = new Validator($this->args);
$v->rule('required', [
'troopID',
'troopName',
])
->rule('stringWidthBetween', 'troopName', 1, 18)
->rule('integer', 'troopID');
if (!$v->validate()) {
return $v->errorStr();
}
return null;
}
public function getRequiredSessionMode(): int
{
return static::REQ_GAME_LOGIN | static::REQ_READ_ONLY;
}
public function launch(Session $session, ?DateTimeInterface $modifiedSince, ?string $reqEtag)
{
$userID = $session->userID;
$db = DB::db();
$me = $db->queryFirstRow('SELECT `no`,nation,`officer_level`,permission,penalty FROM general WHERE `owner`=%i', $userID);
$permission = checkSecretPermission($me, false);
$troopID = $this->args['troopID'];
$generalID = $me['no'];
if($generalID != $troopID && $permission < 4){
return "권한이 부족합니다.";
}
$troopName = StringUtil::neutralize($this->args['troopName']);
if(!$troopName){
return '부대 이름이 없습니다.';
}
$nationID = $me['nation'];
$db->update('troop', [
'name'=>$troopName
], 'troop_leader=%i AND `nation`=%i',$troopID, $nationID);
if($db->affectedRows() == 0){
return '부대가 없습니다.';
}
return null;
}
}
@@ -7,13 +7,13 @@ class che_간파_노군입산부 extends \sammo\BaseItem{
protected $rawName = '노군입산부'; protected $rawName = '노군입산부';
protected $name = '노군입산부(간파)'; protected $name = '노군입산부(간파)';
protected $info = '[전투] 상대 회피 확률 -30%p, 상대 필살 확률 -10%p'; protected $info = '[전투] 상대 회피 확률 -25%p, 상대 필살 확률 -10%p';
protected $cost = 200; protected $cost = 200;
protected $consumable = false; protected $consumable = false;
public function onCalcOpposeStat(General $general, string $statName, $value, $aux=null){ public function onCalcOpposeStat(General $general, string $statName, $value, $aux=null){
if($statName === 'warAvoidRatio'){ if($statName === 'warAvoidRatio'){
return $value - 0.30; return $value - 0.25;
} }
if($statName === 'warCriticalRatio'){ if($statName === 'warCriticalRatio'){
return $value - 0.10; return $value - 0.10;
@@ -12,10 +12,15 @@ class che_격노_구정신단경 extends \sammo\BaseItem{
protected $rawName = '구정신단경'; protected $rawName = '구정신단경';
protected $name = '구정신단경(격노)'; protected $name = '구정신단경(격노)';
protected $info = '[전투] 상대방 필살 시 격노(필살) 발동, 회피 시도시 25% 확률로 격노 발동, 공격 시 일정 확률로 진노(1페이즈 추가)'; protected $info = '[전투] 상대방 필살 시 격노(필살) 발동, 회피 시도시 25% 확률로 격노 발동, 공격 시 일정 확률로 진노(1페이즈 추가), 격노마다 대미지 5% 추가 중첩';
protected $cost = 200; protected $cost = 200;
protected $consumable = false; protected $consumable = false;
public function getWarPowerMultiplier(WarUnit $unit):array{
$activatedCnt = $unit->hasActivatedSkillOnLog('격노');
return [1 + 0.05*$activatedCnt, 1];
}
public function getBattlePhaseSkillTriggerList(WarUnit $unit):?WarUnitTriggerCaller{ public function getBattlePhaseSkillTriggerList(WarUnit $unit):?WarUnitTriggerCaller{
return new WarUnitTriggerCaller( return new WarUnitTriggerCaller(
new che_격노시도($unit, che_격노시도::TYPE_ITEM), new che_격노시도($unit, che_격노시도::TYPE_ITEM),
@@ -8,13 +8,13 @@ class che_내정_납금박산로 extends \sammo\BaseItem{
protected $rawName = '납금박산로'; protected $rawName = '납금박산로';
protected $name = '납금박산로(내정)'; protected $name = '납금박산로(내정)';
protected $info = '[내정] 내정 성공률 +20%p'; protected $info = '[내정] 내정 성공률 +15%p';
protected $cost = 200; protected $cost = 200;
protected $consumable = false; protected $consumable = false;
public function onCalcStrategic(string $turnType, string $varType, $value){ public function onCalcStrategic(string $turnType, string $varType, $value){
if(in_array($turnType, ['상업', '농업', '기술', '성벽', '수비', '치안', '민심', '인구'])){ if(in_array($turnType, ['상업', '농업', '기술', '성벽', '수비', '치안', '민심', '인구'])){
if($varType == 'success') return $value + 0.2; if($varType == 'success') return $value + 0.15;
} }
return $value; return $value;
} }
@@ -12,7 +12,7 @@ class che_능력치_무력_두강주 extends \sammo\BaseItem{
protected $rawName = '두강주'; protected $rawName = '두강주';
protected $name = '두강주(무력)'; protected $name = '두강주(무력)';
protected $info = '[능력치] 무력 +5 +(5년마다 +1)'; protected $info = '[능력치] 무력 +5 +(4년마다 +1)';
protected $cost = 200; protected $cost = 200;
protected $consumable = false; protected $consumable = false;
@@ -21,7 +21,7 @@ class che_능력치_무력_두강주 extends \sammo\BaseItem{
$gameStor = KVStorage::getStorage(DB::db(), 'game_env'); $gameStor = KVStorage::getStorage(DB::db(), 'game_env');
[$year, $startYear] = $gameStor->getValuesAsArray(['year', 'startyear']); [$year, $startYear] = $gameStor->getValuesAsArray(['year', 'startyear']);
$relYear = $year - $startYear; $relYear = $year - $startYear;
return $value + 5 + Util::valueFit(intdiv($relYear, 5), 0, GameConst::$maxTechLevel); return $value + 5 + Util::valueFit(intdiv($relYear, 4), 0, GameConst::$maxTechLevel);
} }
return $value; return $value;
} }
@@ -12,7 +12,7 @@ class che_능력치_지력_이강주 extends \sammo\BaseItem{
protected $rawName = '이강주'; protected $rawName = '이강주';
protected $name = '이강주(지력)'; protected $name = '이강주(지력)';
protected $info = '[능력치] 지력 +5 +(5년마다 +1)'; protected $info = '[능력치] 지력 +5 +(4년마다 +1)';
protected $cost = 200; protected $cost = 200;
protected $consumable = false; protected $consumable = false;
@@ -21,7 +21,7 @@ class che_능력치_지력_이강주 extends \sammo\BaseItem{
$gameStor = KVStorage::getStorage(DB::db(), 'game_env'); $gameStor = KVStorage::getStorage(DB::db(), 'game_env');
[$year, $startYear] = $gameStor->getValuesAsArray(['year', 'startyear']); [$year, $startYear] = $gameStor->getValuesAsArray(['year', 'startyear']);
$relYear = $year - $startYear; $relYear = $year - $startYear;
return $value + 5 + Util::valueFit(intdiv($relYear, 5), 0, GameConst::$maxTechLevel); return $value + 5 + Util::valueFit(intdiv($relYear, 4), 0, GameConst::$maxTechLevel);
} }
return $value; return $value;
} }
@@ -12,7 +12,7 @@ class che_능력치_통솔_보령압주 extends \sammo\BaseItem{
protected $rawName = '보령압주'; protected $rawName = '보령압주';
protected $name = '보령압주(통솔)'; protected $name = '보령압주(통솔)';
protected $info = '[능력치] 통솔 +5 +(5년마다 +1)'; protected $info = '[능력치] 통솔 +5 +(4년마다 +1)';
protected $cost = 200; protected $cost = 200;
protected $consumable = false; protected $consumable = false;
@@ -21,7 +21,7 @@ class che_능력치_통솔_보령압주 extends \sammo\BaseItem{
$gameStor = KVStorage::getStorage(DB::db(), 'game_env'); $gameStor = KVStorage::getStorage(DB::db(), 'game_env');
[$year, $startYear] = $gameStor->getValuesAsArray(['year', 'startyear']); [$year, $startYear] = $gameStor->getValuesAsArray(['year', 'startyear']);
$relYear = $year - $startYear; $relYear = $year - $startYear;
return $value + 5 + Util::valueFit(intdiv($relYear, 5), 0, GameConst::$maxTechLevel); return $value + 5 + Util::valueFit(intdiv($relYear, 4), 0, GameConst::$maxTechLevel);
} }
return $value; return $value;
} }
+2 -2
View File
@@ -7,13 +7,13 @@ class che_명성_구석 extends \sammo\BaseItem{
protected $rawName = '구석'; protected $rawName = '구석';
protected $name = '구석(명성)'; protected $name = '구석(명성)';
protected $info = '명성 +15%'; protected $info = '명성 +20%';
protected $cost = 200; protected $cost = 200;
protected $consumable = false; protected $consumable = false;
public function onCalcStat(General $general, string $statName, $value, $aux=null){ public function onCalcStat(General $general, string $statName, $value, $aux=null){
if($statName == 'experience'){ if($statName == 'experience'){
return $value * 1.15; return $value * 1.20;
} }
return $value; return $value;
} }
+2 -2
View File
@@ -14,7 +14,7 @@ class che_불굴_상편 extends \sammo\BaseItem
protected $rawName = '상편'; protected $rawName = '상편';
protected $name = '상편(불굴)'; protected $name = '상편(불굴)';
protected $info = '[전투] 남은 병력이 적을수록 공격력 증가. 최대 +50%'; protected $info = '[전투] 남은 병력이 적을수록 공격력 증가. 최대 +60%';
protected $cost = 200; protected $cost = 200;
protected $consumable = false; protected $consumable = false;
@@ -25,7 +25,7 @@ class che_불굴_상편 extends \sammo\BaseItem
$crewRatio = Util::valueFit($crew / ($leadership * 100), 0, 1); $crewRatio = Util::valueFit($crew / ($leadership * 100), 0, 1);
return new WarUnitTriggerCaller( return new WarUnitTriggerCaller(
new 전투력보정($unit, 1 + 0.5 * (1 - $crewRatio)) new 전투력보정($unit, 1 + 0.6 * (1 - $crewRatio))
); );
} }
} }
+2 -2
View File
@@ -7,13 +7,13 @@ class che_숙련_동작 extends \sammo\BaseItem{
protected $rawName = '동작'; protected $rawName = '동작';
protected $name = '동작(숙련)'; protected $name = '동작(숙련)';
protected $info = '숙련 +15%'; protected $info = '숙련 +20%';
protected $cost = 200; protected $cost = 200;
protected $consumable = false; protected $consumable = false;
public function onCalcStat(General $general, string $statName, $value, $aux=null){ public function onCalcStat(General $general, string $statName, $value, $aux=null){
if($statName == 'addDex'){ if($statName == 'addDex'){
return $value * 1.15; return $value * 1.20;
} }
return $value; return $value;
} }
@@ -8,13 +8,13 @@ class che_전략_평만지장도 extends \sammo\BaseItem{
protected $rawName = '평만지장도'; protected $rawName = '평만지장도';
protected $name = '평만지장도(전략)'; protected $name = '평만지장도(전략)';
protected $info = '[전략] 국가전략 사용시 재사용 대기 기간 -15%'; protected $info = '[전략] 국가전략 사용시 재사용 대기 기간 -20%';
protected $cost = 200; protected $cost = 200;
protected $consumable = false; protected $consumable = false;
public function onCalcStrategic(string $turnType, string $varType, $value){ public function onCalcStrategic(string $turnType, string $varType, $value){
if($varType == 'delay'){ if($varType == 'delay'){
return Util::round($value * 0.85); return Util::round($value * 0.80);
} }
return $value; return $value;
} }
@@ -7,17 +7,17 @@ use sammo\WarUnitTrigger\che_저지발동;
use sammo\WarUnitTrigger\WarActivateSkills; use sammo\WarUnitTrigger\WarActivateSkills;
use sammo\WarUnitTriggerCaller; use sammo\WarUnitTriggerCaller;
class che_반계저지_박혁론 extends \sammo\BaseItem{ class che_진압_박혁론 extends \sammo\BaseItem{
protected $rawName = '박혁론'; protected $rawName = '박혁론';
protected $name = '박혁론(반계저지)'; protected $name = '박혁론(진압)';
protected $info = '[전투] 상대의 계략 되돌림 불가'; protected $info = '[전투] 상대의 계략 되돌림, 격노 불가';
protected $cost = 200; protected $cost = 200;
protected $consumable = false; protected $consumable = false;
public function getBattlePhaseSkillTriggerList(WarUnit $unit):?WarUnitTriggerCaller{ public function getBattlePhaseSkillTriggerList(WarUnit $unit):?WarUnitTriggerCaller{
return new WarUnitTriggerCaller( return new WarUnitTriggerCaller(
new WarActivateSkills($unit, BaseWarUnitTrigger::TYPE_NONE, false, '반계불가'), new WarActivateSkills($unit, BaseWarUnitTrigger::TYPE_NONE, false, '반계불가', '격노불가'),
); );
} }
} }
+2 -2
View File
@@ -9,13 +9,13 @@ class che_징병_낙주 extends \sammo\BaseItem{
protected $rawName = '낙주'; protected $rawName = '낙주';
protected $name = '낙주(징병)'; protected $name = '낙주(징병)';
protected $info = '[군사] 징·모병비 -50%, 통솔 순수 능력치 보정 +15%'; protected $info = '[군사] 징·모병비 -30%, 통솔 순수 능력치 보정 +15%';
protected $cost = 200; protected $cost = 200;
protected $consumable = false; protected $consumable = false;
public function onCalcDomestic(string $turnType, string $varType, float $value, $aux=null):float{ public function onCalcDomestic(string $turnType, string $varType, float $value, $aux=null):float{
if(in_array($turnType, ['징병', '모병'])){ if(in_array($turnType, ['징병', '모병'])){
if($varType == 'cost') return $value * 0.5; if($varType == 'cost') return $value * 0.7;
} }
return $value; return $value;
@@ -7,13 +7,13 @@ class che_필살_둔갑천서 extends \sammo\BaseItem{
protected $rawName = '둔갑천서'; protected $rawName = '둔갑천서';
protected $name = '둔갑천서(필살)'; protected $name = '둔갑천서(필살)';
protected $info = '[전투] 필살 확률 +25%p'; protected $info = '[전투] 필살 확률 +20%p';
protected $cost = 200; protected $cost = 200;
protected $consumable = false; protected $consumable = false;
public function onCalcStat(General $general, string $statName, $value, $aux=null){ public function onCalcStat(General $general, string $statName, $value, $aux=null){
if($statName === 'warCriticalRatio'){ if($statName === 'warCriticalRatio'){
return $value + 0.25; return $value + 0.20;
} }
return $value; return $value;
} }
+2 -2
View File
@@ -281,8 +281,8 @@ abstract class Auction
$general = $this->general; $general = $this->general;
$highestBid = $this->getHighestBid(); $highestBid = $this->getHighestBid();
if ($highestBid !== null && $amount <= $highestBid->amount) { if ($highestBid !== null && $amount < $highestBid->amount + 10) {
return '현재입찰가보다 높게 입찰해야 합니다.'; return '현재입찰가보다 10 포인트 높게 입찰해야 합니다.';
} }
$myPrevBid = $this->getMyPrevBid(); $myPrevBid = $this->getMyPrevBid();
+13 -5
View File
@@ -124,6 +124,13 @@ abstract class AuctionBasicResource extends Auction
$auctionHost->increaseVar($hostRes->value, $this->info->detail->amount); $auctionHost->increaseVar($hostRes->value, $this->info->detail->amount);
$auctionHost->applyDB(DB::db()); $auctionHost->applyDB(DB::db());
if($this->info->hostGeneralID != 0){
$josaYiHost = JosaUtil::pick($auctionHost->getName(), '이');
$auctionAmount = $this->info->detail->amount;
$auctionLog = "{$this->auctionID}{$hostResName} 경매 <M>유찰</> : <Y>{$auctionHost->getName()}</>{$josaYiHost} {$hostResName} <C>{$auctionAmount}</> 판매, 그러나 입찰자 부재";
pushAuctionLog($auctionHost->getLogger()->formatText($auctionLog, ActionLogger::EVENT_PLAIN));
}
$staticNation = $auctionHost->getStaticNation(); $staticNation = $auctionHost->getStaticNation();
$src = new MessageTarget(0, '', 0, 'System', '#000000'); $src = new MessageTarget(0, '', 0, 'System', '#000000');
$dest = new MessageTarget( $dest = new MessageTarget(
@@ -187,11 +194,11 @@ abstract class AuctionBasicResource extends Auction
$auctionID = $this->info->id; $auctionID = $this->info->id;
$auctionHost->getLogger()->pushGeneralActionLog( $auctionHost->getLogger()->pushGeneralActionLog(
"{$auctionID}번 거래 <C>성사</>로 {$bidderResName} <C>{$bidAmount}</>{$josaUlBidder} 지불, {$hostResName} <C>{$auctionAmount}</>{$josaUlHost} 획득!", "{$auctionID}번 거래 <C>성사</>로 {$hostResName} <C>{$auctionAmount}</>{$josaUlHost} 판매, {$bidderResName} <C>{$bidAmount}</>{$josaUlBidder} 획득!",
ActionLogger::EVENT_PLAIN ActionLogger::EVENT_PLAIN
); );
$bidder->getLogger()->pushGeneralActionLog( $bidder->getLogger()->pushGeneralActionLog(
"{$auctionID}번 거래 <C>성사</>로 {$hostResName} <C>{$auctionAmount}</>{$josaUlHost} 판매, {$bidderResName} <C>{$bidAmount}</>{$josaUlBidder} 획득!", "{$auctionID}번 거래 <C>성사</>로 {$bidderResName} <C>{$bidAmount}</>{$josaUlBidder} 지불, {$hostResName} <C>{$auctionAmount}</>{$josaUlHost} 획득!",
ActionLogger::EVENT_PLAIN ActionLogger::EVENT_PLAIN
); );
@@ -199,13 +206,14 @@ abstract class AuctionBasicResource extends Auction
$josaYiBidder = JosaUtil::pick($bidder->getName(), '이'); $josaYiBidder = JosaUtil::pick($bidder->getName(), '이');
$auctionLog = []; $auctionLog = [];
$auctionLog[] = "{$auctionID}{$hostResName} 경매 <C>성사</> : <Y>{$auctionHost->getName()}</>{$josaYiHost} {$hostResName} <C>{$auctionAmount}</> 판매, <Y>{$bidder->getName()}</>{$josaYiBidder} <C>{$bidAmount}</> 구매"; $josaRoBidder = JosaUtil::pick($bidAmount, '로');
$auctionLog[] = "{$auctionID}{$hostResName} 경매 <C>성사</> : <Y>{$auctionHost->getName()}</>{$josaYiHost} {$hostResName} <C>{$auctionAmount}</> 판매, <Y>{$bidder->getName()}</>{$josaYiBidder} {$bidderResName} <C>{$bidAmount}</>{$josaRoBidder} 구매";
if ($highestBid->amount === $this->info->detail->finishBidAmount) { if ($highestBid->amount === $this->info->detail->finishBidAmount) {
$auctionLog[0] .= ' <M>★ 즉시구매가 거래 ★</>'; $auctionLog[0] .= ' <M>★ 마감가 거래 ★</>';
} else if ($highestBid->amount === $this->info->detail->startBidAmount) { } else if ($highestBid->amount === $this->info->detail->startBidAmount) {
$auctionLog[0] .= " <R>★ 최가 거래 ★</>"; $auctionLog[0] .= " <R>★ 최가 거래 ★</>";
} }
pushAuctionLog(array_map( pushAuctionLog(array_map(
+49 -14
View File
@@ -52,6 +52,17 @@ class AuctionUniqueItem extends Auction
return '아직 경매가 끝나지 않았습니다.'; return '아직 경매가 끝나지 않았습니다.';
} }
$availableCnt = 0;
foreach(GameConst::$allItems as $itemType => $itemList){
$availableCnt += $itemList[$itemKey] ?? 0;
$availableCnt -= $db->queryFirstField('SELECT count(*) FROM `general` WHERE %b = %s', $itemType, $itemKey);
}
if($availableCnt <= 0){
return '그 유니크를 더 얻을 수 없습니다.';
}
$gameStor = KVStorage::getStorage($db, 'game_env'); $gameStor = KVStorage::getStorage($db, 'game_env');
$now = new DateTimeImmutable(); $now = new DateTimeImmutable();
@@ -118,6 +129,10 @@ class AuctionUniqueItem extends Auction
public function bid(int $amount, bool $tryExtendCloseDate): ?string public function bid(int $amount, bool $tryExtendCloseDate): ?string
{ {
if($this->info->finished){
return '경매가 종료되었습니다.';
}
$db = DB::db(); $db = DB::db();
/** @var AuctionInfo[] */ /** @var AuctionInfo[] */
$openUniqueAuctions = array_map(fn ($raw) => AuctionInfo::fromArray($raw), $db->query( $openUniqueAuctions = array_map(fn ($raw) => AuctionInfo::fromArray($raw), $db->query(
@@ -126,21 +141,28 @@ class AuctionUniqueItem extends Auction
) ?? []); ) ?? []);
$auctionIDList = []; $auctionIDList = [];
foreach($openUniqueAuctions as $auction){ foreach ($openUniqueAuctions as $auction) {
$auctionIDList[] = $auction->id; $auctionIDList[] = $auction->id;
} }
$db = DB::db(); $db = DB::db();
$rawHighestBids = Util::convertArrayToDict($db->query( if($auctionIDList){
'SELECT bid.* FROM `ng_auction_bid` bid INNER JOIN ( $rawHighestBids = Util::convertArrayToDict($db->query(
SELECT `auction_id`, MAX(`amount`) as `max_amount` 'SELECT bid.* FROM `ng_auction_bid` bid INNER JOIN (
FROM `ng_auction_bid` SELECT `auction_id`, MAX(`amount`) as `max_amount`
WHERE `auction_id` IN %li FROM `ng_auction_bid`
GROUP BY `auction_id` WHERE `auction_id` IN %li
ORDER BY `amount` GROUP BY `auction_id`
) AS max_bid ORDER BY `amount`
ON bid.`auction_id` = max_bid.`auction_id` AND bid.`amount` = max_bid.`max_amount`', ) AS max_bid
$auctionIDList, ON bid.`auction_id` = max_bid.`auction_id` AND bid.`amount` = max_bid.`max_amount`',
) ?? [], 'auction_id'); $auctionIDList,
) ?? [], 'auction_id');
}
else{
$rawHighestBids = [];
}
/** @var array<int,AuctionBidItem> */ /** @var array<int,AuctionBidItem> */
$highestBids = Util::mapWithKey( $highestBids = Util::mapWithKey(
fn ($auctionID, $bid) => AuctionBidItem::fromArray($bid), fn ($auctionID, $bid) => AuctionBidItem::fromArray($bid),
@@ -149,13 +171,13 @@ class AuctionUniqueItem extends Auction
$itemCode = $this->info->target; $itemCode = $this->info->target;
if($itemCode === null){ if ($itemCode === null) {
throw new \Exception('아이템 코드가 없습니다.'); throw new \Exception('아이템 코드가 없습니다.');
} }
$bidItemTypes = new Set(); $bidItemTypes = new Set();
foreach (GameConst::$allItems as $itemType => $itemList) { foreach (GameConst::$allItems as $itemType => $itemList) {
if (key_exists($itemCode, $itemList) && $itemList[$itemCode] <= 0) { if (($itemList[$itemCode] ?? 0) <= 0) {
continue; continue;
} }
$bidItemTypes->add($itemType); $bidItemTypes->add($itemType);
@@ -234,6 +256,7 @@ class AuctionUniqueItem extends Auction
return '유니크 아이템 소유 제한 상태입니다. 종료 시간이 연장됩니다.'; return '유니크 아이템 소유 제한 상태입니다. 종료 시간이 연장됩니다.';
} }
$isExtendCloseDateRequired = false;
foreach (GameConst::$allItems as $itemType => $itemList) { foreach (GameConst::$allItems as $itemType => $itemList) {
//아직은 그런 경우는 없지만 동일 유니크를 여러 부위에 장착할 수 있을지도 모름 //아직은 그런 경우는 없지만 동일 유니크를 여러 부위에 장착할 수 있을지도 모름
if (!key_exists($itemKey, $itemList)) { if (!key_exists($itemKey, $itemList)) {
@@ -243,11 +266,13 @@ class AuctionUniqueItem extends Auction
$ownItem = $general->getItem($itemType); $ownItem = $general->getItem($itemType);
if ($ownItem->getRawClassName() == $itemKey) { if ($ownItem->getRawClassName() == $itemKey) {
//FIXME: 이 경우에는 환불이 되던가 해야함. //FIXME: 이 경우에는 환불이 되던가 해야함.
$isExtendCloseDateRequired = true;
$reasons[] = '이미 그 유니크를 가지고 있습니다.'; $reasons[] = '이미 그 유니크를 가지고 있습니다.';
continue; continue;
} }
if (!$ownItem->isBuyable()) { if (!$ownItem->isBuyable()) {
$isExtendCloseDateRequired = true;
$reasons[] = '이미 다른 유니크를 가지고 있습니다.'; $reasons[] = '이미 다른 유니크를 가지고 있습니다.';
continue; continue;
} }
@@ -263,6 +288,16 @@ class AuctionUniqueItem extends Auction
} }
if (!$availableItemTypes) { if (!$availableItemTypes) {
if ($isExtendCloseDateRequired) {
$turnTerm = $gameStor->getValue('turnterm');
//동일 부위 제한에 걸렸다면 자동 연장
$extendedCloseDate = $this->info->closeDate->add(TimeUtil::secondsToDateInterval(
max(static::MIN_EXTENSION_MINUTES_LIMIT_BY_BID, $turnTerm * static::COEFF_EXTENSION_MINUTES_LIMIT_BY_BID) * 60
));
$this->extendCloseDate($extendedCloseDate, true);
$this->extendLatestBidCloseDate(null);
}
return join(' ', $reasons); return join(' ', $reasons);
} }
+11 -1
View File
@@ -139,6 +139,16 @@ class che_건국 extends Command\GeneralCommand
$general = $this->generalObj; $general = $this->generalObj;
$date = $general->getTurnTime($general::TURNTIME_HM); $date = $general->getTurnTime($general::TURNTIME_HM);
$generalName = $general->getName(); $generalName = $general->getName();
$logger = $general->getLogger();
$initYearMonth = Util::joinYearMonth($env['init_year'], $env['init_month']);
$yearMonth = Util::joinYearMonth($env['year'], $env['month']);
if($yearMonth <= $initYearMonth){
$logger->pushGeneralActionLog("다음 턴부터 건국할 수 있습니다. <1>$date</>");
$this->alternative = new che_인재탐색($general, $this->env, null);
return false;
}
$josaYi = JosaUtil::pick($generalName, '이'); $josaYi = JosaUtil::pick($generalName, '이');
$nationName = $this->arg['nationName']; $nationName = $this->arg['nationName'];
@@ -149,7 +159,7 @@ class che_건국 extends Command\GeneralCommand
$josaUl = JosaUtil::pick($nationName, '을'); $josaUl = JosaUtil::pick($nationName, '을');
$logger = $general->getLogger();
$nationTypeClass = buildNationTypeClass($nationType); $nationTypeClass = buildNationTypeClass($nationType);
$nationTypeName = $nationTypeClass->getName(); $nationTypeName = $nationTypeClass->getName();
@@ -98,6 +98,9 @@ class che_사기진작 extends Command\GeneralCommand{
$general->addDex($general->getCrewTypeObj(), $score, false); $general->addDex($general->getCrewTypeObj(), $score, false);
[$reqGold,] = $this->getCost();
$general->increaseVarWithLimit('gold', -$reqGold, 0);
$general->addExperience($exp); $general->addExperience($exp);
$general->addDedication($ded); $general->addDedication($ded);
$general->increaseVar('leadership_exp', 1); $general->increaseVar('leadership_exp', 1);
+35 -20
View File
@@ -243,30 +243,14 @@ class che_피장파장 extends Command\NationCommand
{ {
$generalObj = $this->generalObj; $generalObj = $this->generalObj;
$nationID = $generalObj->getNationID(); $nationID = $generalObj->getNationID();
$nationList = [];
$testTurn = new LastTurn($this->getName(), null, $this->getPreReqTurn());
foreach (getAllNationStaticInfo() as $destNation) {
$testCommand = new static($generalObj, $this->env, $testTurn, ['destNationID' => $destNation['nation']]);
$nationTarget = [
'id' => $destNation['nation'],
'name' => $destNation['name'],
'color' => $destNation['color'],
'power' => $destNation['power'],
];
if (!$testCommand->hasFullConditionMet()) {
$nationTarget['notAvailable'] = true;
}
if ($destNation['nation'] == $nationID) {
$nationTarget['notAvailable'] = true;
}
$nationList[] = $nationTarget;
}
$testTurn = new LastTurn($this->getName(), null, null);
$availableCommandTypeList = []; $availableCommandTypeList = [];
$currYearMonth = Util::joinYearMonth($this->env['year'], $this->env['month']); $currYearMonth = Util::joinYearMonth($this->env['year'], $this->env['month']);
$oneAvailableCommandName = null;
foreach (GameConst::$availableChiefCommand['전략'] as $commandType) { foreach (GameConst::$availableChiefCommand['전략'] as $commandType) {
$cmd = buildNationCommandClass($commandType, $generalObj, $this->env, new LastTurn()); $cmd = buildNationCommandClass($commandType, $generalObj, $this->env, new LastTurn());
$cmdName = $cmd->getName(); $cmdName = $cmd->getName();
@@ -276,9 +260,40 @@ class che_피장파장 extends Command\NationCommand
if ($nextAvailableTurn !== null && $currYearMonth < $nextAvailableTurn) { if ($nextAvailableTurn !== null && $currYearMonth < $nextAvailableTurn) {
$remainTurn = $nextAvailableTurn - $currYearMonth; $remainTurn = $nextAvailableTurn - $currYearMonth;
} }
else{
$oneAvailableCommandName = $cmd->getRawClassName();
}
$availableCommandTypeList[$commandType] = ['name' => $cmdName, 'remainTurn' => $remainTurn]; $availableCommandTypeList[$commandType] = ['name' => $cmdName, 'remainTurn' => $remainTurn];
} }
$nationList = [];
foreach (getAllNationStaticInfo() as $destNation) {
$nationTarget = [
'id' => $destNation['nation'],
'name' => $destNation['name'],
'color' => $destNation['color'],
'power' => $destNation['power'],
];
if($oneAvailableCommandName === null){
$nationTarget['notAvailable'] = true;
}
else if ($destNation['nation'] == $nationID) {
$nationTarget['notAvailable'] = true;
}
else {
$testCommand = new static($generalObj, $this->env, $testTurn, [
'destNationID' => $destNation['nation'],
'commandType' => $oneAvailableCommandName
]);
if (!$testCommand->hasFullConditionMet()) {
$nationTarget['notAvailable'] = true;
}
}
$nationList[] = $nationTarget;
}
return [ return [
'procRes' => [ 'procRes' => [
'nationList' => $nationList, 'nationList' => $nationList,
+3 -3
View File
@@ -33,12 +33,12 @@ class CreateManyNPC extends \sammo\Event\Action
$env['year'], $env['year'],
$env['month'] $env['month']
))); )));
$age = $rng->nextRangeInt(20, 25);
$birthYear = $env['year'] - $age;
$deathYear = $env['year'] + $rng->nextRangeInt(10, 60);
$result = []; $result = [];
foreach (pickGeneralFromPool(DB::db(), $rng, 0, $cnt) as $pickedNPC) { foreach (pickGeneralFromPool(DB::db(), $rng, 0, $cnt) as $pickedNPC) {
$age = $rng->nextRangeInt(20, 25);
$birthYear = $env['year'] - $age;
$deathYear = $env['year'] + $rng->nextRangeInt(10, 50);
$newNPC = $pickedNPC->getGeneralBuilder(); $newNPC = $pickedNPC->getGeneralBuilder();
$newNPC->setNationID(0) $newNPC->setNationID(0)
->setNPCType(3) ->setNPCType(3)
+33 -2
View File
@@ -2,6 +2,7 @@
namespace sammo\Event\Action; namespace sammo\Event\Action;
use DateTime;
use sammo\Betting; use sammo\Betting;
use \sammo\GameConst; use \sammo\GameConst;
use \sammo\Util; use \sammo\Util;
@@ -10,8 +11,12 @@ use sammo\DTO\BettingInfo;
use sammo\DTO\SelectItem; use sammo\DTO\SelectItem;
use sammo\Json; use sammo\Json;
use sammo\KVStorage; use sammo\KVStorage;
use sammo\Message;
use sammo\MessageTarget;
use function sammo\getAllNationStaticInfo; use function sammo\getAllNationStaticInfo;
use function sammo\GetImageURL;
use function sammo\getNationStaticInfo;
class OpenNationBetting extends \sammo\Event\Action class OpenNationBetting extends \sammo\Event\Action
{ {
@@ -50,8 +55,8 @@ class OpenNationBetting extends \sammo\Event\Action
$candidates = []; $candidates = [];
$nations = getAllNationStaticInfo(); $nations = getAllNationStaticInfo();
uasort($nations, function($lhs, $rhs){ uasort($nations, function ($lhs, $rhs) {
return -($lhs['power'] <=> $rhs['power']); return - ($lhs['power'] <=> $rhs['power']);
}); });
foreach ($nations as $nationRaw) { foreach ($nations as $nationRaw) {
@@ -117,6 +122,32 @@ class OpenNationBetting extends \sammo\Event\Action
} }
$logger->flush(); $logger->flush();
$now = new DateTime();
$text = "새로운 {$name} 내기가 열렸습니다. 천통국 베팅란을 확인해주세요.";
$src = new MessageTarget(0, '', 0, 'System', '#000000');
foreach ($db->query('SELECT `no`, `name`, `nation`, `imgsvr`, `picture` FROM `general` WHERE `npc` <= 1') as $general) {
$generalID = $general['no'];
$staticNation = getNationStaticInfo($general['nation']);
$dest = new MessageTarget(
$generalID,
$general['name'],
$general['nation'],
$staticNation['name'],
$staticNation['color'],
GetImageURL($general['imgsvr'], $general['picture'])
);
$msg = new Message(
Message::MSGTYPE_PRIVATE,
$src,
$dest,
$text,
$now,
new DateTime('9999-12-31'),
[]
);
$msg->send(true);
}
return [__CLASS__, true]; return [__CLASS__, true];
} }
+1 -2
View File
@@ -261,7 +261,7 @@ class GameConstBase
'che_저격_매화수전' => 1, 'che_저격_비도'=>1, 'che_위압_조목삭' => 1, 'che_공성_묵자' => 1, 'che_저격_매화수전' => 1, 'che_저격_비도'=>1, 'che_위압_조목삭' => 1, 'che_공성_묵자' => 1,
'che_집중_전국책' => 1, 'che_환술_논어집해' => 1, 'che_집중_전국책' => 1, 'che_환술_논어집해' => 1,
'che_반계저지_박혁론' => 1, 'che_부적_태현청생부' => 1, 'che_저지_삼황내문' => 1, 'che_진압_박혁론' => 1, 'che_부적_태현청생부' => 1, 'che_저지_삼황내문' => 1,
'che_행동_서촉지형도' => 1, 'che_간파_노군입산부' => 1, 'che_불굴_상편' => 1, 'che_행동_서촉지형도' => 1, 'che_간파_노군입산부' => 1, 'che_불굴_상편' => 1,
'che_약탈_옥벽' => 1, 'che_약탈_옥벽' => 1,
@@ -334,7 +334,6 @@ class GameConstBase
'che_건국', 'che_건국',
'che_선양', 'che_선양',
'che_해산', 'che_해산',
'che_모반시도',
] ]
]; ];
+6 -6
View File
@@ -200,7 +200,12 @@ class GeneralAI
$yearMonth = Util::joinYearMonth($env['year'], $env['month']); $yearMonth = Util::joinYearMonth($env['year'], $env['month']);
if ($yearMonth <= Util::joinYearMonth($env['startyear'] + 2, 5)) { $warTarget = $db->queryAllLists(
'SELECT you, state, term FROM diplomacy WHERE me = %i AND state IN (0, 1)',
$nationID
);
if (!$warTarget && $yearMonth <= Util::joinYearMonth($env['startyear'] + 2, 5)) {
$this->dipState = self::d평화; $this->dipState = self::d평화;
$this->attackable = false; $this->attackable = false;
return; return;
@@ -210,11 +215,6 @@ class GeneralAI
// 공격가능도시 있으면 // 공격가능도시 있으면
$this->attackable = !!$frontStatus; $this->attackable = !!$frontStatus;
$warTarget = $db->queryAllLists(
'SELECT you, state, term FROM diplomacy WHERE me = %i AND state IN (0, 1)',
$nationID
);
$onWar = 0; $onWar = 0;
$onWarReady = 0; $onWarReady = 0;
$onWarYet = 0; $onWarYet = 0;
+1 -8
View File
@@ -163,7 +163,7 @@ class ResetHelper{
bool $block_general_create, bool $block_general_create,
int $npcmode, int $npcmode,
int $show_img_level, int $show_img_level,
int $tournament_trig, bool $tournament_trig,
string $join_mode, string $join_mode,
string $turntime, string $turntime,
?array $autorun_user ?array $autorun_user
@@ -176,13 +176,6 @@ class ResetHelper{
]; ];
} }
if($tournament_trig < 0 || $tournament_trig > 7){
return [
'result'=>false,
'reason'=>'올바르지 않은 토너먼트 주기입니다.'
];
}
$clearResult = self::clearDB(); $clearResult = self::clearDB();
if(!$clearResult['result']){ if(!$clearResult['result']){
return $clearResult; return $clearResult;
@@ -20,7 +20,7 @@ class che_회피발동 extends BaseWarUnitTrigger{
$oppose->getLogger()->pushGeneralBattleDetailLog("상대가 <R>회피</>했다!</>", ActionLogger::PLAIN); $oppose->getLogger()->pushGeneralBattleDetailLog("상대가 <R>회피</>했다!</>", ActionLogger::PLAIN);
$self->getLogger()->pushGeneralBattleDetailLog("<C>회피</>했다!</>", ActionLogger::PLAIN); $self->getLogger()->pushGeneralBattleDetailLog("<C>회피</>했다!</>", ActionLogger::PLAIN);
$oppose->multiplyWarPowerMultiply(0.2); $oppose->multiplyWarPowerMultiply(1/6);
return true; return true;
} }
+880 -879
View File
@@ -16,885 +16,886 @@
], ],
"diplomacy":[], "diplomacy":[],
"general":[ "general":[
[0, "아회남", null, 0, null, 65, 74, 26, 0, 160, 300, null, null], [0, "아회남", null, 0, null, 65, 74, 26, 0, 160, 300, null, null],
[0, "이적", null, 0, null, 40, 24, 84, 0, 160, 300, null, null], [0, "이적", null, 0, null, 40, 24, 84, 0, 160, 300, null, null],
[0, "윤상", null, 0, null, 51, 44, 62, 0, 160, 300, null, null], [0, "윤상", null, 0, null, 51, 44, 62, 0, 160, 300, null, null],
[0, "윤묵", null, 0, null, 26, 15, 66, 0, 160, 300, null, null], [0, "윤묵", null, 0, null, 26, 15, 66, 0, 160, 300, null, null],
[0, "우금", null, 0, null, 85, 82, 62, 0, 160, 300, null, null], [0, "우금", null, 0, null, 85, 82, 62, 0, 160, 300, null, null],
[0, "위관", null, 0, null, 69, 46, 79, 0, 160, 300, null, null], [0, "위관", null, 0, null, 69, 46, 79, 0, 160, 300, null, null],
[0, "원윤", null, 0, null, 32, 14, 39, 0, 160, 300, null, null], [0, "원윤", null, 0, null, 32, 14, 39, 0, 160, 300, null, null],
[0, "원희", null, 0, null, 66, 43, 63, 0, 160, 300, null, null], [0, "원희", null, 0, null, 66, 43, 63, 0, 160, 300, null, null],
[0, "염행", null, 0, null, 78, 90, 58, 0, 160, 300, null, null], [0, "염행", null, 0, null, 78, 90, 58, 0, 160, 300, null, null],
[0, "염유", null, 0, null, 71, 50, 71, 0, 160, 300, null, null], [0, "염유", null, 0, null, 71, 50, 71, 0, 160, 300, null, null],
[0, "원술", null, 0, null, 76, 55, 75, 0, 160, 300, null, null], [0, "원술", null, 0, null, 76, 55, 75, 0, 160, 300, null, null],
[0, "원상", null, 0, null, 63, 75, 42, 0, 160, 300, null, null], [0, "원상", null, 0, null, 63, 75, 42, 0, 160, 300, null, null],
[0, "원소", null, 0, null, 90, 62, 81, 0, 160, 300, null, null], [0, "원소", null, 0, null, 90, 62, 81, 0, 160, 300, null, null],
[0, "염상", null, 0, null, 40, 27, 71, 0, 160, 300, null, null], [0, "염상", null, 0, null, 40, 27, 71, 0, 160, 300, null, null],
[0, "원담", null, 0, null, 60, 78, 30, 0, 160, 300, null, null], [0, "원담", null, 0, null, 60, 78, 30, 0, 160, 300, null, null],
[0, "염포", null, 0, null, 40, 25, 82, 0, 160, 300, null, null], [0, "염포", null, 0, null, 40, 25, 82, 0, 160, 300, null, null],
[0, "왕위", null, 0, null, 60, 70, 48, 0, 160, 300, null, null], [0, "왕위", null, 0, null, 60, 70, 48, 0, 160, 300, null, null],
[0, "왕윤", null, 0, null, 26, 6, 68, 0, 160, 300, null, null], [0, "왕윤", null, 0, null, 26, 6, 68, 0, 160, 300, null, null],
[0, "왕항", null, 0, null, 76, 43, 61, 0, 160, 300, null, null], [0, "왕항", null, 0, null, 76, 43, 61, 0, 160, 300, null, null],
[0, "왕찬", null, 0, null, 15, 3, 79, 0, 160, 300, null, null], [0, "왕찬", null, 0, null, 15, 3, 79, 0, 160, 300, null, null],
[0, "왕수", null, 0, null, 54, 27, 77, 0, 160, 300, null, null], [0, "왕수", null, 0, null, 54, 27, 77, 0, 160, 300, null, null],
[0, "왕숙", null, 0, null, 36, 22, 76, 0, 160, 300, null, null], [0, "왕숙", null, 0, null, 36, 22, 76, 0, 160, 300, null, null],
[0, "왕준", null, 0, null, 85, 64, 84, 0, 160, 300, null, null], [0, "왕준", null, 0, null, 85, 64, 84, 0, 160, 300, null, null],
[0, "왕쌍", null, 0, null, 67, 88, 19, 0, 160, 300, null, null], [0, "왕쌍", null, 0, null, 67, 88, 19, 0, 160, 300, null, null],
[0, "왕창", null, 0, null, 74, 57, 79, 0, 160, 300, null, null], [0, "왕창", null, 0, null, 74, 57, 79, 0, 160, 300, null, null],
[0, "왕평", null, 0, null, 88, 81, 61, 0, 160, 300, null, null], [0, "왕평", null, 0, null, 88, 81, 61, 0, 160, 300, null, null],
[0, "왕보", null, 0, null, 62, 41, 79, 0, 160, 300, null, null], [0, "왕보", null, 0, null, 62, 41, 79, 0, 160, 300, null, null],
[0, "왕문", null, 0, null, 65, 64, 31, 0, 160, 300, null, null], [0, "왕문", null, 0, null, 65, 64, 31, 0, 160, 300, null, null],
[0, "왕릉", null, 0, null, 74, 50, 71, 0, 160, 300, null, null], [0, "왕릉", null, 0, null, 74, 50, 71, 0, 160, 300, null, null],
[0, "왕루", null, 0, null, 28, 30, 79, 0, 160, 300, null, null], [0, "왕루", null, 0, null, 28, 30, 79, 0, 160, 300, null, null],
[0, "왕랑", null, 0, null, 47, 35, 79, 0, 160, 300, null, null], [0, "왕랑", null, 0, null, 47, 35, 79, 0, 160, 300, null, null],
[0, "온회", null, 0, null, 62, 36, 74, 0, 160, 300, null, null], [0, "온회", null, 0, null, 62, 36, 74, 0, 160, 300, null, null],
[0, "하안", null, 0, null, 15, 30, 72, 0, 160, 300, null, null], [0, "하안", null, 0, null, 15, 30, 72, 0, 160, 300, null, null],
[0, "괴월", null, 0, null, 50, 38, 85, 0, 160, 300, null, null], [0, "괴월", null, 0, null, 50, 38, 85, 0, 160, 300, null, null],
[0, "괴량", null, 0, null, 68, 33, 88, 0, 160, 300, null, null], [0, "괴량", null, 0, null, 68, 33, 88, 0, 160, 300, null, null],
[0, "가화", null, 0, null, 49, 65, 41, 0, 160, 300, null, null], [0, "가화", null, 0, null, 49, 65, 41, 0, 160, 300, null, null],
[0, "가규", null, 0, null, 78, 61, 84, 0, 160, 300, null, null], [0, "가규", null, 0, null, 78, 61, 84, 0, 160, 300, null, null],
[0, "하의", null, 0, null, 56, 69, 36, 0, 160, 300, null, null], [0, "하의", null, 0, null, 56, 69, 36, 0, 160, 300, null, null],
[0, "화흠", null, 0, null, 51, 33, 88, 0, 160, 300, null, null], [0, "화흠", null, 0, null, 51, 33, 88, 0, 160, 300, null, null],
[0, "가후", null, 0, null, 71, 40, 98, 0, 160, 300, null, null], [0, "가후", null, 0, null, 71, 40, 98, 0, 160, 300, null, null],
[0, "곽가", null, 0, null, 70, 41, 97, 0, 160, 300, null, null], [0, "곽가", null, 0, null, 70, 41, 97, 0, 160, 300, null, null],
[0, "악환", null, 0, null, 65, 80, 42, 0, 160, 300, null, null], [0, "악환", null, 0, null, 65, 80, 42, 0, 160, 300, null, null],
[0, "곽사", null, 0, null, 64, 76, 13, 0, 160, 300, null, null], [0, "곽사", null, 0, null, 64, 76, 13, 0, 160, 300, null, null],
[0, "악취", null, 0, null, 53, 66, 61, 0, 160, 300, null, null], [0, "악취", null, 0, null, 53, 66, 61, 0, 160, 300, null, null],
[0, "곽준", null, 0, null, 73, 52, 73, 0, 160, 300, null, null], [0, "곽준", null, 0, null, 73, 52, 73, 0, 160, 300, null, null],
[0, "학소", null, 0, null, 88, 63, 83, 0, 160, 300, null, null], [0, "학소", null, 0, null, 88, 63, 83, 0, 160, 300, null, null],
[0, "악진", null, 0, null, 80, 85, 56, 0, 160, 300, null, null], [0, "악진", null, 0, null, 80, 85, 56, 0, 160, 300, null, null],
[0, "곽도", null, 0, null, 62, 50, 82, 0, 160, 300, null, null], [0, "곽도", null, 0, null, 62, 50, 82, 0, 160, 300, null, null],
[0, "학맹", null, 0, null, 62, 67, 42, 0, 160, 300, null, null], [0, "학맹", null, 0, null, 62, 67, 42, 0, 160, 300, null, null],
[0, "곽유지", null, 0, null, 28, 9, 69, 0, 160, 300, null, null], [0, "곽유지", null, 0, null, 28, 9, 69, 0, 160, 300, null, null],
[0, "곽익", null, 0, null, 73, 69, 69, 0, 160, 300, null, null], [0, "곽익", null, 0, null, 73, 69, 69, 0, 160, 300, null, null],
[0, "곽회", null, 0, null, 90, 66, 85, 0, 160, 300, null, null], [0, "곽회", null, 0, null, 90, 66, 85, 0, 160, 300, null, null],
[0, "하후위", null, 0, null, 71, 73, 49, 0, 160, 300, null, null], [0, "하후위", null, 0, null, 71, 73, 49, 0, 160, 300, null, null],
[0, "하후연", null, 0, null, 95, 92, 72, 0, 160, 300, null, null], [0, "하후연", null, 0, null, 95, 92, 72, 0, 160, 300, null, null],
[0, "하후은", null, 0, null, 63, 72, 53, 0, 160, 300, null, null], [0, "하후은", null, 0, null, 63, 72, 53, 0, 160, 300, null, null],
[0, "하후화", null, 0, null, 48, 51, 71, 0, 160, 300, null, null], [0, "하후화", null, 0, null, 48, 51, 71, 0, 160, 300, null, null],
[0, "하후혜", null, 0, null, 50, 44, 76, 0, 160, 300, null, null], [0, "하후혜", null, 0, null, 50, 44, 76, 0, 160, 300, null, null],
[0, "하후현", null, 0, null, 54, 39, 76, 0, 160, 300, null, null], [0, "하후현", null, 0, null, 54, 39, 76, 0, 160, 300, null, null],
[0, "하후상", null, 0, null, 79, 55, 75, 0, 160, 300, null, null], [0, "하후상", null, 0, null, 79, 55, 75, 0, 160, 300, null, null],
[0, "하후덕", null, 0, null, 69, 73, 32, 0, 160, 300, null, null], [0, "하후덕", null, 0, null, 69, 73, 32, 0, 160, 300, null, null],
[0, "하후돈", null, 0, null, 91, 88, 68, 0, 160, 300, null, null], [0, "하후돈", null, 0, null, 91, 88, 68, 0, 160, 300, null, null],
[0, "하후패", null, 0, null, 79, 85, 63, 0, 160, 300, null, null], [0, "하후패", null, 0, null, 79, 85, 63, 0, 160, 300, null, null],
[0, "하후무", null, 0, null, 20, 7, 4, 0, 160, 300, null, null], [0, "하후무", null, 0, null, 20, 7, 4, 0, 160, 300, null, null],
[0, "가충", null, 0, null, 54, 31, 89, 0, 160, 300, null, null], [0, "가충", null, 0, null, 54, 31, 89, 0, 160, 300, null, null],
[0, "하진", null, 0, null, 68, 54, 75, 0, 160, 300, null, null], [0, "하진", null, 0, null, 68, 54, 75, 0, 160, 300, null, null],
[0, "화웅", null, 0, null, 78, 90, 55, 0, 160, 300, null, null], [0, "화웅", null, 0, null, 78, 90, 55, 0, 160, 300, null, null],
[0, "한윤", null, 0, null, 26, 29, 65, 0, 160, 300, null, null], [0, "한윤", null, 0, null, 26, 29, 65, 0, 160, 300, null, null],
[0, "관우", null, 0, null, 96, 99, 76, 0, 160, 300, null, null], [0, "관우", null, 0, null, 96, 99, 76, 0, 160, 300, null, null],
[0, "환계", null, 0, null, 25, 26, 68, 0, 160, 300, null, null], [0, "환계", null, 0, null, 25, 26, 68, 0, 160, 300, null, null],
[0, "관해", null, 0, null, 70, 82, 10, 0, 160, 300, null, null], [0, "관해", null, 0, null, 70, 82, 10, 0, 160, 300, null, null],
[0, "관구검", null, 0, null, 84, 86, 62, 0, 160, 300, null, null], [0, "관구검", null, 0, null, 84, 86, 62, 0, 160, 300, null, null],
[0, "한현", null, 0, null, 22, 33, 7, 0, 160, 300, null, null], [0, "한현", null, 0, null, 22, 33, 7, 0, 160, 300, null, null],
[0, "한호", null, 0, null, 73, 61, 84, 0, 160, 300, null, null], [0, "한호", null, 0, null, 73, 61, 84, 0, 160, 300, null, null],
[0, "관흥", null, 0, null, 76, 84, 62, 0, 160, 300, null, null], [0, "관흥", null, 0, null, 76, 84, 62, 0, 160, 300, null, null],
[0, "관색", null, 0, null, 74, 83, 56, 0, 160, 300, null, null], [0, "관색", null, 0, null, 74, 83, 56, 0, 160, 300, null, null],
[0, "한수", null, 0, null, 78, 58, 79, 0, 160, 300, null, null], [0, "한수", null, 0, null, 78, 58, 79, 0, 160, 300, null, null],
[0, "한숭", null, 0, null, 25, 15, 71, 0, 160, 300, null, null], [0, "한숭", null, 0, null, 25, 15, 71, 0, 160, 300, null, null],
[0, "관정", null, 0, null, 36, 52, 73, 0, 160, 300, null, null], [0, "관정", null, 0, null, 36, 52, 73, 0, 160, 300, null, null],
[0, "한섬", null, 0, null, 69, 66, 36, 0, 160, 300, null, null], [0, "한섬", null, 0, null, 69, 66, 36, 0, 160, 300, null, null],
[0, "감택", null, 0, null, 51, 49, 83, 0, 160, 300, null, null], [0, "감택", null, 0, null, 51, 49, 83, 0, 160, 300, null, null],
[0, "한충", null, 0, null, 64, 67, 18, 0, 160, 300, null, null], [0, "한충", null, 0, null, 64, 67, 18, 0, 160, 300, null, null],
[0, "한당", null, 0, null, 76, 85, 61, 0, 160, 300, null, null], [0, "한당", null, 0, null, 76, 85, 61, 0, 160, 300, null, null],
[0, "한덕", null, 0, null, 63, 76, 25, 0, 160, 300, null, null], [0, "한덕", null, 0, null, 63, 76, 25, 0, 160, 300, null, null],
[0, "감녕", null, 0, null, 92, 95, 74, 0, 160, 300, null, null], [0, "감녕", null, 0, null, 92, 95, 74, 0, 160, 300, null, null],
[0, "한복", null, 0, null, 28, 3, 27, 0, 160, 300, null, null], [0, "한복", null, 0, null, 28, 3, 27, 0, 160, 300, null, null],
[0, "관평", null, 0, null, 78, 82, 60, 0, 160, 300, null, null], [0, "관평", null, 0, null, 78, 82, 60, 0, 160, 300, null, null],
[0, "간옹", null, 0, null, 20, 32, 75, 0, 160, 300, null, null], [0, "간옹", null, 0, null, 20, 32, 75, 0, 160, 300, null, null],
[0, "안량", null, 0, null, 88, 96, 43, 0, 160, 300, null, null], [0, "안량", null, 0, null, 88, 96, 43, 0, 160, 300, null, null],
[0, "위연", null, 0, null, 91, 90, 70, 0, 160, 300, null, null], [0, "위연", null, 0, null, 91, 90, 70, 0, 160, 300, null, null],
[0, "국의", null, 0, null, 84, 78, 51, 0, 160, 300, null, null], [0, "국의", null, 0, null, 84, 78, 51, 0, 160, 300, null, null],
[0, "희지재", null, 0, null, 63, 35, 91, 0, 160, 300, null, null], [0, "희지재", null, 0, null, 63, 35, 91, 0, 160, 300, null, null],
[0, "위속", null, 0, null, 67, 78, 31, 0, 160, 300, null, null], [0, "위속", null, 0, null, 67, 78, 31, 0, 160, 300, null, null],
[0, "위유", null, 0, null, 46, 29, 74, 0, 160, 300, null, null], [0, "위유", null, 0, null, 46, 29, 74, 0, 160, 300, null, null],
[0, "우금2", null, 0, null, 72, 79, 38, 0, 160, 300, null, null], [0, "우금2", null, 0, null, 72, 79, 38, 0, 160, 300, null, null],
[0, "우보", null, 0, null, 38, 60, 21, 0, 160, 300, null, null], [0, "우보", null, 0, null, 38, 60, 21, 0, 160, 300, null, null],
[0, "강유", null, 0, null, 92, 72, 93, 0, 160, 300, null, null], [0, "강유", null, 0, null, 92, 72, 93, 0, 160, 300, null, null],
[0, "공지", null, 0, null, 43, 53, 62, 0, 160, 300, null, null], [0, "공지", null, 0, null, 43, 53, 62, 0, 160, 300, null, null],
[0, "교유", null, 0, null, 64, 69, 38, 0, 160, 300, null, null], [0, "교유", null, 0, null, 64, 69, 38, 0, 160, 300, null, null],
[0, "공도", null, 0, null, 59, 70, 23, 0, 160, 300, null, null], [0, "공도", null, 0, null, 59, 70, 23, 0, 160, 300, null, null],
[0, "허공", null, 0, null, 44, 66, 64, 0, 160, 300, null, null], [0, "허공", null, 0, null, 44, 66, 64, 0, 160, 300, null, null],
[0, "허정", null, 0, null, 23, 5, 68, 0, 160, 300, null, null], [0, "허정", null, 0, null, 23, 5, 68, 0, 160, 300, null, null],
[0, "허저", null, 0, null, 74, 97, 36, 0, 160, 300, null, null], [0, "허저", null, 0, null, 74, 97, 36, 0, 160, 300, null, null],
[0, "허유", null, 0, null, 36, 21, 80, 0, 160, 300, null, null], [0, "허유", null, 0, null, 36, 21, 80, 0, 160, 300, null, null],
[0, "기령", null, 0, null, 85, 84, 51, 0, 160, 300, null, null], [0, "기령", null, 0, null, 85, 84, 51, 0, 160, 300, null, null],
[0, "김의", null, 0, null, 32, 38, 65, 0, 160, 300, null, null], [0, "김의", null, 0, null, 32, 38, 65, 0, 160, 300, null, null],
[0, "김배삼결", null, 0, null, 64, 76, 19, 0, 160, 300, null, null], [0, "김배삼결", null, 0, null, 64, 76, 19, 0, 160, 300, null, null],
[0, "김선", null, 0, null, 52, 68, 13, 0, 160, 300, null, null], [0, "김선", null, 0, null, 52, 68, 13, 0, 160, 300, null, null],
[0, "우번", null, 0, null, 46, 46, 87, 0, 160, 300, null, null], [0, "우번", null, 0, null, 46, 46, 87, 0, 160, 300, null, null],
[0, "형도영", null, 0, null, 69, 79, 41, 0, 160, 300, null, null], [0, "형도영", null, 0, null, 69, 79, 41, 0, 160, 300, null, null],
[0, "엄안", null, 0, null, 82, 83, 62, 0, 160, 300, null, null], [0, "엄안", null, 0, null, 82, 83, 62, 0, 160, 300, null, null],
[0, "엄망", null, 0, null, 68, 71, 40, 0, 160, 300, null, null], [0, "엄망", null, 0, null, 68, 71, 40, 0, 160, 300, null, null],
[0, "엄준", null, 0, null, 41, 12, 71, 0, 160, 300, null, null], [0, "엄준", null, 0, null, 41, 12, 71, 0, 160, 300, null, null],
[0, "엄정", null, 0, null, 50, 55, 39, 0, 160, 300, null, null], [0, "엄정", null, 0, null, 50, 55, 39, 0, 160, 300, null, null],
[0, "엄백호", null, 0, null, 67, 70, 42, 0, 160, 300, null, null], [0, "엄백호", null, 0, null, 67, 70, 42, 0, 160, 300, null, null],
[0, "엄여", null, 0, null, 61, 78, 44, 0, 160, 300, null, null], [0, "엄여", null, 0, null, 61, 78, 44, 0, 160, 300, null, null],
[0, "오의", null, 0, null, 79, 73, 53, 0, 160, 300, null, null], [0, "오의", null, 0, null, 79, 73, 53, 0, 160, 300, null, null],
[0, "황개", null, 0, null, 80, 86, 64, 0, 160, 300, null, null], [0, "황개", null, 0, null, 80, 86, 64, 0, 160, 300, null, null],
[0, "고간", null, 0, null, 74, 56, 38, 0, 160, 300, null, null], [0, "고간", null, 0, null, 74, 56, 38, 0, 160, 300, null, null],
[0, "황권", null, 0, null, 75, 59, 88, 0, 160, 300, null, null], [0, "황권", null, 0, null, 75, 59, 88, 0, 160, 300, null, null],
[0, "고유", null, 0, null, 57, 43, 72, 0, 160, 300, null, null], [0, "고유", null, 0, null, 57, 43, 72, 0, 160, 300, null, null],
[0, "고순", null, 0, null, 87, 89, 60, 0, 160, 300, null, null], [0, "고순", null, 0, null, 87, 89, 60, 0, 160, 300, null, null],
[0, "고상", null, 0, null, 68, 68, 53, 0, 160, 300, null, null], [0, "고상", null, 0, null, 68, 68, 53, 0, 160, 300, null, null],
[0, "고승", null, 0, null, 67, 73, 41, 0, 160, 300, null, null], [0, "고승", null, 0, null, 67, 73, 41, 0, 160, 300, null, null],
[0, "후성", null, 0, null, 74, 75, 54, 0, 160, 300, null, null], [0, "후성", null, 0, null, 74, 75, 54, 0, 160, 300, null, null],
[0, "후선", null, 0, null, 63, 66, 34, 0, 160, 300, null, null], [0, "후선", null, 0, null, 63, 66, 34, 0, 160, 300, null, null],
[0, "황조", null, 0, null, 81, 66, 48, 0, 160, 300, null, null], [0, "황조", null, 0, null, 81, 66, 48, 0, 160, 300, null, null],
[0, "공손월", null, 0, null, 74, 72, 47, 0, 160, 300, null, null], [0, "공손월", null, 0, null, 74, 72, 47, 0, 160, 300, null, null],
[0, "공손연", null, 0, null, 65, 70, 49, 0, 160, 300, null, null], [0, "공손연", null, 0, null, 65, 70, 49, 0, 160, 300, null, null],
[0, "공손공", null, 0, null, 39, 17, 69, 0, 160, 300, null, null], [0, "공손공", null, 0, null, 39, 17, 69, 0, 160, 300, null, null],
[0, "공손강", null, 0, null, 72, 66, 46, 0, 160, 300, null, null], [0, "공손강", null, 0, null, 72, 66, 46, 0, 160, 300, null, null],
[0, "공손찬", null, 0, null, 86, 82, 62, 0, 160, 300, null, null], [0, "공손찬", null, 0, null, 86, 82, 62, 0, 160, 300, null, null],
[0, "공손속", null, 0, null, 63, 68, 46, 0, 160, 300, null, null], [0, "공손속", null, 0, null, 63, 68, 46, 0, 160, 300, null, null],
[0, "공손도", null, 0, null, 67, 71, 49, 0, 160, 300, null, null], [0, "공손도", null, 0, null, 67, 71, 49, 0, 160, 300, null, null],
[0, "공손범", null, 0, null, 73, 69, 49, 0, 160, 300, null, null], [0, "공손범", null, 0, null, 73, 69, 49, 0, 160, 300, null, null],
[0, "황충", null, 0, null, 88, 96, 65, 0, 160, 300, null, null], [0, "황충", null, 0, null, 88, 96, 65, 0, 160, 300, null, null],
[0, "고정", null, 0, null, 55, 63, 43, 0, 160, 300, null, null], [0, "고정", null, 0, null, 55, 63, 43, 0, 160, 300, null, null],
[0, "고패", null, 0, null, 66, 48, 69, 0, 160, 300, null, null], [0, "고패", null, 0, null, 66, 48, 69, 0, 160, 300, null, null],
[0, "황보숭", null, 0, null, 91, 61, 82, 0, 160, 300, null, null], [0, "황보숭", null, 0, null, 91, 61, 82, 0, 160, 300, null, null],
[0, "공융", null, 0, null, 30, 5, 73, 0, 160, 300, null, null], [0, "공융", null, 0, null, 30, 5, 73, 0, 160, 300, null, null],
[0, "고람", null, 0, null, 76, 82, 60, 0, 160, 300, null, null], [0, "고람", null, 0, null, 76, 82, 60, 0, 160, 300, null, null],
[0, "오경", null, 0, null, 69, 66, 45, 0, 160, 300, null, null], [0, "오경", null, 0, null, 69, 66, 45, 0, 160, 300, null, null],
[0, "호거아", null, 0, null, 70, 82, 41, 0, 160, 300, null, null], [0, "호거아", null, 0, null, 70, 82, 41, 0, 160, 300, null, null],
[0, "호진", null, 0, null, 65, 74, 12, 0, 160, 300, null, null], [0, "호진", null, 0, null, 65, 74, 12, 0, 160, 300, null, null],
[0, "올돌골", null, 0, null, 79, 86, 11, 0, 160, 300, null, null], [0, "올돌골", null, 0, null, 79, 86, 11, 0, 160, 300, null, null],
[0, "호반", null, 0, null, 55, 55, 59, 0, 160, 300, null, null], [0, "호반", null, 0, null, 55, 55, 59, 0, 160, 300, null, null],
[0, "오반", null, 0, null, 74, 71, 50, 0, 160, 300, null, null], [0, "오반", null, 0, null, 74, 71, 50, 0, 160, 300, null, null],
[0, "고옹", null, 0, null, 52, 18, 81, 0, 160, 300, null, null], [0, "고옹", null, 0, null, 52, 18, 81, 0, 160, 300, null, null],
[0, "오란", null, 0, null, 68, 80, 35, 0, 160, 300, null, null], [0, "오란", null, 0, null, 68, 80, 35, 0, 160, 300, null, null],
[0, "채화", null, 0, null, 39, 50, 1, 0, 160, 300, null, null], [0, "채화", null, 0, null, 39, 50, 1, 0, 160, 300, null, null],
[0, "채중", null, 0, null, 40, 54, 2, 0, 160, 300, null, null], [0, "채중", null, 0, null, 40, 54, 2, 0, 160, 300, null, null],
[0, "채모", null, 0, null, 70, 55, 77, 0, 160, 300, null, null], [0, "채모", null, 0, null, 70, 55, 77, 0, 160, 300, null, null],
[0, "착융", null, 0, null, 60, 69, 38, 0, 160, 300, null, null], [0, "착융", null, 0, null, 60, 69, 38, 0, 160, 300, null, null],
[0, "사마의", null, 0, null, 99, 63, 98, 0, 160, 300, null, null], [0, "사마의", null, 0, null, 99, 63, 98, 0, 160, 300, null, null],
[0, "사마염", null, 0, null, 69, 59, 77, 0, 160, 300, null, null], [0, "사마염", null, 0, null, 69, 59, 77, 0, 160, 300, null, null],
[0, "사마사", null, 0, null, 84, 64, 89, 0, 160, 300, null, null], [0, "사마사", null, 0, null, 84, 64, 89, 0, 160, 300, null, null],
[0, "사마소", null, 0, null, 85, 57, 88, 0, 160, 300, null, null], [0, "사마소", null, 0, null, 85, 57, 88, 0, 160, 300, null, null],
[0, "사마부", null, 0, null, 70, 37, 77, 0, 160, 300, null, null], [0, "사마부", null, 0, null, 70, 37, 77, 0, 160, 300, null, null],
[0, "사마랑", null, 0, null, 20, 21, 72, 0, 160, 300, null, null], [0, "사마랑", null, 0, null, 20, 21, 72, 0, 160, 300, null, null],
[0, "사마가", null, 0, null, 66, 84, 25, 0, 160, 300, null, null], [0, "사마가", null, 0, null, 66, 84, 25, 0, 160, 300, null, null],
[0, "주흔", null, 0, null, 65, 51, 73, 0, 160, 300, null, null], [0, "주흔", null, 0, null, 65, 51, 73, 0, 160, 300, null, null],
[0, "주앙", null, 0, null, 74, 65, 48, 0, 160, 300, null, null], [0, "주앙", null, 0, null, 74, 65, 48, 0, 160, 300, null, null],
[0, "주지", null, 0, null, 73, 85, 41, 0, 160, 300, null, null], [0, "주지", null, 0, null, 73, 85, 41, 0, 160, 300, null, null],
[0, "주창", null, 0, null, 68, 77, 42, 0, 160, 300, null, null], [0, "주창", null, 0, null, 68, 77, 42, 0, 160, 300, null, null],
[0, "주태", null, 0, null, 84, 90, 48, 0, 160, 300, null, null], [0, "주태", null, 0, null, 84, 90, 48, 0, 160, 300, null, null],
[0, "주방", null, 0, null, 52, 41, 80, 0, 160, 300, null, null], [0, "주방", null, 0, null, 52, 41, 80, 0, 160, 300, null, null],
[0, "주유", null, 0, null, 97, 71, 97, 0, 160, 300, null, null], [0, "주유", null, 0, null, 97, 71, 97, 0, 160, 300, null, null],
[0, "주환", null, 0, null, 87, 84, 64, 0, 160, 300, null, null], [0, "주환", null, 0, null, 87, 84, 64, 0, 160, 300, null, null],
[0, "주거", null, 0, null, 77, 57, 72, 0, 160, 300, null, null], [0, "주거", null, 0, null, 77, 57, 72, 0, 160, 300, null, null],
[0, "축융", null, 0, null, 72, 75, 35, 0, 160, 300, null, null], [0, "축융", null, 0, null, 72, 75, 35, 0, 160, 300, null, null],
[0, "주준", null, 0, null, 89, 57, 76, 0, 160, 300, null, null], [0, "주준", null, 0, null, 89, 57, 76, 0, 160, 300, null, null],
[0, "주연", null, 0, null, 86, 75, 57, 0, 160, 300, null, null], [0, "주연", null, 0, null, 86, 75, 57, 0, 160, 300, null, null],
[0, "주치", null, 0, null, 71, 56, 72, 0, 160, 300, null, null], [0, "주치", null, 0, null, 71, 56, 72, 0, 160, 300, null, null],
[0, "주포", null, 0, null, 68, 73, 34, 0, 160, 300, null, null], [0, "주포", null, 0, null, 68, 73, 34, 0, 160, 300, null, null],
[0, "주령", null, 0, null, 78, 73, 53, 0, 160, 300, null, null], [0, "주령", null, 0, null, 78, 73, 53, 0, 160, 300, null, null],
[0, "순욱", null, 0, null, 78, 38, 97, 0, 160, 300, null, null], [0, "순욱", null, 0, null, 78, 38, 97, 0, 160, 300, null, null],
[0, "순우경", null, 0, null, 78, 66, 29, 0, 160, 300, null, null], [0, "순우경", null, 0, null, 78, 66, 29, 0, 160, 300, null, null],
[0, "순심", null, 0, null, 45, 25, 78, 0, 160, 300, null, null], [0, "순심", null, 0, null, 45, 25, 78, 0, 160, 300, null, null],
[0, "순유", null, 0, null, 80, 35, 95, 0, 160, 300, null, null], [0, "순유", null, 0, null, 80, 35, 95, 0, 160, 300, null, null],
[0, "장완", null, 0, null, 78, 34, 89, 0, 160, 300, null, null], [0, "장완", null, 0, null, 78, 34, 89, 0, 160, 300, null, null],
[0, "종회", null, 0, null, 88, 62, 93, 0, 160, 300, null, null], [0, "종회", null, 0, null, 88, 62, 93, 0, 160, 300, null, null],
[0, "장간", null, 0, null, 19, 6, 66, 0, 160, 300, null, null], [0, "장간", null, 0, null, 19, 6, 66, 0, 160, 300, null, null],
[0, "장의거", null, 0, null, 71, 41, 59, 0, 160, 300, null, null], [0, "장의거", null, 0, null, 71, 41, 59, 0, 160, 300, null, null],
[0, "장흠", null, 0, null, 78, 85, 54, 0, 160, 300, null, null], [0, "장흠", null, 0, null, 78, 85, 54, 0, 160, 300, null, null],
[0, "장제3", null, 0, null, 62, 43, 85, 0, 160, 300, null, null], [0, "장제3", null, 0, null, 62, 43, 85, 0, 160, 300, null, null],
[0, "초주", null, 0, null, 16, 3, 67, 0, 160, 300, null, null], [0, "초주", null, 0, null, 16, 3, 67, 0, 160, 300, null, null],
[0, "초촉", null, 0, null, 65, 76, 33, 0, 160, 300, null, null], [0, "초촉", null, 0, null, 65, 76, 33, 0, 160, 300, null, null],
[0, "향총", null, 0, null, 76, 56, 77, 0, 160, 300, null, null], [0, "향총", null, 0, null, 76, 56, 77, 0, 160, 300, null, null],
[0, "종요", null, 0, null, 79, 24, 90, 0, 160, 300, null, null], [0, "종요", null, 0, null, 79, 24, 90, 0, 160, 300, null, null],
[0, "향랑", null, 0, null, 28, 18, 74, 0, 160, 300, null, null], [0, "향랑", null, 0, null, 28, 18, 74, 0, 160, 300, null, null],
[0, "서영", null, 0, null, 92, 80, 62, 0, 160, 300, null, null], [0, "서영", null, 0, null, 92, 80, 62, 0, 160, 300, null, null],
[0, "제갈각", null, 0, null, 72, 47, 90, 0, 160, 300, null, null], [0, "제갈각", null, 0, null, 72, 47, 90, 0, 160, 300, null, null],
[0, "제갈근", null, 0, null, 75, 34, 85, 0, 160, 300, null, null], [0, "제갈근", null, 0, null, 75, 34, 85, 0, 160, 300, null, null],
[0, "제갈균", null, 0, null, 29, 25, 52, 0, 160, 300, null, null], [0, "제갈균", null, 0, null, 29, 25, 52, 0, 160, 300, null, null],
[0, "제갈탄", null, 0, null, 72, 54, 76, 0, 160, 300, null, null], [0, "제갈탄", null, 0, null, 72, 54, 76, 0, 160, 300, null, null],
[0, "제갈량", null, 0, null, 98, 43, 100, 0, 160, 300, null, null], [0, "제갈량", null, 0, null, 98, 43, 100, 0, 160, 300, null, null],
[0, "서황", null, 0, null, 95, 94, 74, 0, 160, 300, null, null], [0, "서황", null, 0, null, 95, 94, 74, 0, 160, 300, null, null],
[0, "서서", null, 0, null, 85, 64, 94, 0, 160, 300, null, null], [0, "서서", null, 0, null, 85, 64, 94, 0, 160, 300, null, null],
[0, "서성", null, 0, null, 86, 81, 61, 0, 160, 300, null, null], [0, "서성", null, 0, null, 86, 81, 61, 0, 160, 300, null, null],
[0, "서막", null, 0, null, 55, 32, 68, 0, 160, 300, null, null], [0, "서막", null, 0, null, 55, 32, 68, 0, 160, 300, null, null],
[0, "신의", null, 0, null, 55, 59, 60, 0, 160, 300, null, null], [0, "신의", null, 0, null, 55, 59, 60, 0, 160, 300, null, null],
[0, "신탐", null, 0, null, 56, 62, 54, 0, 160, 300, null, null], [0, "신탐", null, 0, null, 56, 62, 54, 0, 160, 300, null, null],
[0, "심배", null, 0, null, 80, 60, 84, 0, 160, 300, null, null], [0, "심배", null, 0, null, 80, 60, 84, 0, 160, 300, null, null],
[0, "신비", null, 0, null, 42, 24, 79, 0, 160, 300, null, null], [0, "신비", null, 0, null, 42, 24, 79, 0, 160, 300, null, null],
[0, "신평", null, 0, null, 69, 43, 77, 0, 160, 300, null, null], [0, "신평", null, 0, null, 69, 43, 77, 0, 160, 300, null, null],
[0, "진복", null, 0, null, 31, 7, 73, 0, 160, 300, null, null], [0, "진복", null, 0, null, 31, 7, 73, 0, 160, 300, null, null],
[0, "진랑", null, 0, null, 58, 70, 35, 0, 160, 300, null, null], [0, "진랑", null, 0, null, 58, 70, 35, 0, 160, 300, null, null],
[0, "휴고", null, 0, null, 63, 71, 38, 0, 160, 300, null, null], [0, "휴고", null, 0, null, 63, 71, 38, 0, 160, 300, null, null],
[0, "추단", null, 0, null, 61, 64, 34, 0, 160, 300, null, null], [0, "추단", null, 0, null, 61, 64, 34, 0, 160, 300, null, null],
[0, "성의", null, 0, null, 74, 72, 41, 0, 160, 300, null, null], [0, "성의", null, 0, null, 74, 72, 41, 0, 160, 300, null, null],
[0, "성공영", null, 0, null, 73, 58, 80, 0, 160, 300, null, null], [0, "성공영", null, 0, null, 73, 58, 80, 0, 160, 300, null, null],
[0, "설종", null, 0, null, 34, 16, 73, 0, 160, 300, null, null], [0, "설종", null, 0, null, 34, 16, 73, 0, 160, 300, null, null],
[0, "단경", null, 0, null, 71, 68, 43, 0, 160, 300, null, null], [0, "단경", null, 0, null, 71, 68, 43, 0, 160, 300, null, null],
[0, "전종", null, 0, null, 78, 55, 75, 0, 160, 300, null, null], [0, "전종", null, 0, null, 78, 55, 75, 0, 160, 300, null, null],
[0, "조예", null, 0, null, 72, 52, 82, 0, 160, 300, null, null], [0, "조예", null, 0, null, 72, 52, 82, 0, 160, 300, null, null],
[0, "조휴", null, 0, null, 84, 78, 58, 0, 160, 300, null, null], [0, "조휴", null, 0, null, 84, 78, 58, 0, 160, 300, null, null],
[0, "송헌", null, 0, null, 68, 77, 38, 0, 160, 300, null, null], [0, "송헌", null, 0, null, 68, 77, 38, 0, 160, 300, null, null],
[0, "조앙", null, 0, null, 78, 50, 69, 0, 160, 300, null, null], [0, "조앙", null, 0, null, 78, 50, 69, 0, 160, 300, null, null],
[0, "조홍", null, 0, null, 80, 75, 55, 0, 160, 300, null, null], [0, "조홍", null, 0, null, 80, 75, 55, 0, 160, 300, null, null],
[0, "조순", null, 0, null, 85, 83, 63, 0, 160, 300, null, null], [0, "조순", null, 0, null, 85, 83, 63, 0, 160, 300, null, null],
[0, "조창", null, 0, null, 86, 91, 59, 0, 160, 300, null, null], [0, "조창", null, 0, null, 86, 91, 59, 0, 160, 300, null, null],
[0, "조식", null, 0, null, 45, 22, 86, 0, 160, 300, null, null], [0, "조식", null, 0, null, 45, 22, 86, 0, 160, 300, null, null],
[0, "조진", null, 0, null, 88, 74, 56, 0, 160, 300, null, null], [0, "조진", null, 0, null, 88, 74, 56, 0, 160, 300, null, null],
[0, "조인", null, 0, null, 94, 90, 70, 0, 160, 300, null, null], [0, "조인", null, 0, null, 94, 90, 70, 0, 160, 300, null, null],
[0, "조성", null, 0, null, 54, 74, 38, 0, 160, 300, null, null], [0, "조성", null, 0, null, 54, 74, 38, 0, 160, 300, null, null],
[0, "조조", null, 0, null, 100, 72, 96, 0, 160, 300, null, null], [0, "조조", null, 0, null, 100, 72, 96, 0, 160, 300, null, null],
[0, "조충", null, 0, null, 43, 21, 74, 0, 160, 300, null, null], [0, "조충", null, 0, null, 43, 21, 74, 0, 160, 300, null, null],
[0, "장패", null, 0, null, 78, 86, 53, 0, 160, 300, null, null], [0, "장패", null, 0, null, 78, 86, 53, 0, 160, 300, null, null],
[0, "조비", null, 0, null, 75, 64, 87, 0, 160, 300, null, null], [0, "조비", null, 0, null, 75, 64, 87, 0, 160, 300, null, null],
[0, "조표", null, 0, null, 54, 69, 32, 0, 160, 300, null, null], [0, "조표", null, 0, null, 54, 69, 32, 0, 160, 300, null, null],
[0, "저수", null, 0, null, 86, 46, 95, 0, 160, 300, null, null], [0, "저수", null, 0, null, 86, 46, 95, 0, 160, 300, null, null],
[0, "소비", null, 0, null, 69, 45, 66, 0, 160, 300, null, null], [0, "소비", null, 0, null, 69, 45, 66, 0, 160, 300, null, null],
[0, "조무", null, 0, null, 70, 71, 50, 0, 160, 300, null, null], [0, "조무", null, 0, null, 70, 71, 50, 0, 160, 300, null, null],
[0, "손환", null, 0, null, 82, 56, 76, 0, 160, 300, null, null], [0, "손환", null, 0, null, 82, 56, 76, 0, 160, 300, null, null],
[0, "손견", null, 0, null, 94, 95, 73, 0, 160, 300, null, null], [0, "손견", null, 0, null, 94, 95, 73, 0, 160, 300, null, null],
[0, "손건", null, 0, null, 44, 33, 79, 0, 160, 300, null, null], [0, "손건", null, 0, null, 44, 33, 79, 0, 160, 300, null, null],
[0, "손권", null, 0, null, 86, 61, 81, 0, 160, 300, null, null], [0, "손권", null, 0, null, 86, 61, 81, 0, 160, 300, null, null],
[0, "손교", null, 0, null, 77, 72, 52, 0, 160, 300, null, null], [0, "손교", null, 0, null, 77, 72, 52, 0, 160, 300, null, null],
[0, "손책", null, 0, null, 93, 94, 74, 0, 160, 300, null, null], [0, "손책", null, 0, null, 93, 94, 74, 0, 160, 300, null, null],
[0, "손소", null, 0, null, 82, 79, 59, 0, 160, 300, null, null], [0, "손소", null, 0, null, 82, 79, 59, 0, 160, 300, null, null],
[0, "손정", null, 0, null, 66, 53, 73, 0, 160, 300, null, null], [0, "손정", null, 0, null, 66, 53, 73, 0, 160, 300, null, null],
[0, "손중", null, 0, null, 62, 71, 36, 0, 160, 300, null, null], [0, "손중", null, 0, null, 62, 71, 36, 0, 160, 300, null, null],
[0, "손등", null, 0, null, 62, 37, 79, 0, 160, 300, null, null], [0, "손등", null, 0, null, 62, 37, 79, 0, 160, 300, null, null],
[0, "손유", null, 0, null, 77, 70, 51, 0, 160, 300, null, null], [0, "손유", null, 0, null, 77, 70, 51, 0, 160, 300, null, null],
[0, "손익", null, 0, null, 67, 83, 27, 0, 160, 300, null, null], [0, "손익", null, 0, null, 67, 83, 27, 0, 160, 300, null, null],
[0, "손례", null, 0, null, 78, 81, 59, 0, 160, 300, null, null], [0, "손례", null, 0, null, 78, 81, 59, 0, 160, 300, null, null],
[0, "태사자", null, 0, null, 94, 94, 72, 0, 160, 300, null, null], [0, "태사자", null, 0, null, 94, 94, 72, 0, 160, 300, null, null],
[0, "대래동주", null, 0, null, 51, 53, 54, 0, 160, 300, null, null], [0, "대래동주", null, 0, null, 51, 53, 54, 0, 160, 300, null, null],
[0, "대릉", null, 0, null, 70, 75, 39, 0, 160, 300, null, null], [0, "대릉", null, 0, null, 70, 75, 39, 0, 160, 300, null, null],
[0, "타사대왕", null, 0, null, 62, 48, 70, 0, 160, 300, null, null], [0, "타사대왕", null, 0, null, 62, 48, 70, 0, 160, 300, null, null],
[0, "담웅", null, 0, null, 58, 73, 14, 0, 160, 300, null, null], [0, "담웅", null, 0, null, 58, 73, 14, 0, 160, 300, null, null],
[0, "장윤", null, 0, null, 72, 67, 42, 0, 160, 300, null, null], [0, "장윤", null, 0, null, 72, 67, 42, 0, 160, 300, null, null],
[0, "조운", null, 0, null, 90, 96, 75, 0, 160, 300, null, null], [0, "조운", null, 0, null, 90, 96, 75, 0, 160, 300, null, null],
[0, "장위", null, 0, null, 74, 66, 45, 0, 160, 300, null, null], [0, "장위", null, 0, null, 74, 66, 45, 0, 160, 300, null, null],
[0, "장영", null, 0, null, 75, 74, 41, 0, 160, 300, null, null], [0, "장영", null, 0, null, 75, 74, 41, 0, 160, 300, null, null],
[0, "장연", null, 0, null, 76, 81, 57, 0, 160, 300, null, null], [0, "장연", null, 0, null, 76, 81, 57, 0, 160, 300, null, null],
[0, "장횡", null, 0, null, 59, 70, 23, 0, 160, 300, null, null], [0, "장횡", null, 0, null, 59, 70, 23, 0, 160, 300, null, null],
[0, "장온", null, 0, null, 32, 10, 72, 0, 160, 300, null, null], [0, "장온", null, 0, null, 32, 10, 72, 0, 160, 300, null, null],
[0, "장개", null, 0, null, 34, 66, 8, 0, 160, 300, null, null], [0, "장개", null, 0, null, 34, 66, 8, 0, 160, 300, null, null],
[0, "장각", null, 0, null, 87, 35, 90, 0, 160, 300, null, null], [0, "장각", null, 0, null, 87, 35, 90, 0, 160, 300, null, null],
[0, "장기", null, 0, null, 74, 35, 76, 0, 160, 300, null, null], [0, "장기", null, 0, null, 74, 35, 76, 0, 160, 300, null, null],
[0, "장의", null, 0, null, 79, 55, 75, 0, 160, 300, null, null], [0, "장의", null, 0, null, 79, 55, 75, 0, 160, 300, null, null],
[0, "장훈", null, 0, null, 72, 68, 41, 0, 160, 300, null, null], [0, "장훈", null, 0, null, 72, 68, 41, 0, 160, 300, null, null],
[0, "장굉", null, 0, null, 24, 22, 86, 0, 160, 300, null, null], [0, "장굉", null, 0, null, 24, 22, 86, 0, 160, 300, null, null],
[0, "장합", null, 0, null, 92, 89, 69, 0, 160, 300, null, null], [0, "장합", null, 0, null, 92, 89, 69, 0, 160, 300, null, null],
[0, "조홍2", null, 0, null, 66, 72, 28, 0, 160, 300, null, null], [0, "조홍2", null, 0, null, 66, 72, 28, 0, 160, 300, null, null],
[0, "장제2", null, 0, null, 70, 66, 46, 0, 160, 300, null, null], [0, "장제2", null, 0, null, 70, 66, 46, 0, 160, 300, null, null],
[0, "장수", null, 0, null, 80, 73, 51, 0, 160, 300, null, null], [0, "장수", null, 0, null, 80, 73, 51, 0, 160, 300, null, null],
[0, "장소", null, 0, null, 41, 13, 87, 0, 160, 300, null, null], [0, "장소", null, 0, null, 41, 13, 87, 0, 160, 300, null, null],
[0, "장송", null, 0, null, 40, 6, 85, 0, 160, 300, null, null], [0, "장송", null, 0, null, 40, 6, 85, 0, 160, 300, null, null],
[0, "장임", null, 0, null, 85, 84, 64, 0, 160, 300, null, null], [0, "장임", null, 0, null, 85, 84, 64, 0, 160, 300, null, null],
[0, "장제", null, 0, null, 67, 43, 80, 0, 160, 300, null, null], [0, "장제", null, 0, null, 67, 43, 80, 0, 160, 300, null, null],
[0, "장막", null, 0, null, 52, 53, 71, 0, 160, 300, null, null], [0, "장막", null, 0, null, 52, 53, 71, 0, 160, 300, null, null],
[0, "조범", null, 0, null, 28, 21, 32, 0, 160, 300, null, null], [0, "조범", null, 0, null, 28, 21, 32, 0, 160, 300, null, null],
[0, "장비", null, 0, null, 87, 98, 72, 0, 160, 300, null, null], [0, "장비", null, 0, null, 87, 98, 72, 0, 160, 300, null, null],
[0, "장포", null, 0, null, 78, 84, 48, 0, 160, 300, null, null], [0, "장포", null, 0, null, 78, 84, 48, 0, 160, 300, null, null],
[0, "장보", null, 0, null, 83, 60, 81, 0, 160, 300, null, null], [0, "장보", null, 0, null, 83, 60, 81, 0, 160, 300, null, null],
[0, "장만성", null, 0, null, 75, 81, 45, 0, 160, 300, null, null], [0, "장만성", null, 0, null, 75, 81, 45, 0, 160, 300, null, null],
[0, "장양", null, 0, null, 72, 70, 50, 0, 160, 300, null, null], [0, "장양", null, 0, null, 72, 70, 50, 0, 160, 300, null, null],
[0, "장익", null, 0, null, 75, 55, 76, 0, 160, 300, null, null], [0, "장익", null, 0, null, 75, 55, 76, 0, 160, 300, null, null],
[0, "장료", null, 0, null, 96, 94, 74, 0, 160, 300, null, null], [0, "장료", null, 0, null, 96, 94, 74, 0, 160, 300, null, null],
[0, "장량", null, 0, null, 78, 80, 59, 0, 160, 300, null, null], [0, "장량", null, 0, null, 78, 80, 59, 0, 160, 300, null, null],
[0, "조루", null, 0, null, 70, 43, 68, 0, 160, 300, null, null], [0, "조루", null, 0, null, 70, 43, 68, 0, 160, 300, null, null],
[0, "장로", null, 0, null, 65, 42, 81, 0, 160, 300, null, null], [0, "장로", null, 0, null, 65, 42, 81, 0, 160, 300, null, null],
[0, "진횡", null, 0, null, 64, 63, 26, 0, 160, 300, null, null], [0, "진횡", null, 0, null, 64, 63, 26, 0, 160, 300, null, null],
[0, "진응", null, 0, null, 62, 72, 45, 0, 160, 300, null, null], [0, "진응", null, 0, null, 62, 72, 45, 0, 160, 300, null, null],
[0, "진기", null, 0, null, 58, 65, 43, 0, 160, 300, null, null], [0, "진기", null, 0, null, 58, 65, 43, 0, 160, 300, null, null],
[0, "진궁", null, 0, null, 84, 55, 90, 0, 160, 300, null, null], [0, "진궁", null, 0, null, 84, 55, 90, 0, 160, 300, null, null],
[0, "진교", null, 0, null, 61, 27, 77, 0, 160, 300, null, null], [0, "진교", null, 0, null, 61, 27, 77, 0, 160, 300, null, null],
[0, "진군", null, 0, null, 32, 14, 75, 0, 160, 300, null, null], [0, "진군", null, 0, null, 32, 14, 75, 0, 160, 300, null, null],
[0, "진규", null, 0, null, 30, 4, 82, 0, 160, 300, null, null], [0, "진규", null, 0, null, 30, 4, 82, 0, 160, 300, null, null],
[0, "진식", null, 0, null, 70, 71, 25, 0, 160, 300, null, null], [0, "진식", null, 0, null, 70, 71, 25, 0, 160, 300, null, null],
[0, "진진", null, 0, null, 46, 46, 69, 0, 160, 300, null, null], [0, "진진", null, 0, null, 46, 46, 69, 0, 160, 300, null, null],
[0, "진태", null, 0, null, 86, 68, 89, 0, 160, 300, null, null], [0, "진태", null, 0, null, 86, 68, 89, 0, 160, 300, null, null],
[0, "진등", null, 0, null, 79, 59, 81, 0, 160, 300, null, null], [0, "진등", null, 0, null, 79, 59, 81, 0, 160, 300, null, null],
[0, "진도", null, 0, null, 82, 78, 58, 0, 160, 300, null, null], [0, "진도", null, 0, null, 82, 78, 58, 0, 160, 300, null, null],
[0, "진무", null, 0, null, 76, 87, 43, 0, 160, 300, null, null], [0, "진무", null, 0, null, 76, 87, 43, 0, 160, 300, null, null],
[0, "진란", null, 0, null, 66, 69, 40, 0, 160, 300, null, null], [0, "진란", null, 0, null, 66, 69, 40, 0, 160, 300, null, null],
[0, "진림", null, 0, null, 25, 9, 75, 0, 160, 300, null, null], [0, "진림", null, 0, null, 25, 9, 75, 0, 160, 300, null, null],
[0, "정욱", null, 0, null, 76, 49, 94, 0, 160, 300, null, null], [0, "정욱", null, 0, null, 76, 49, 94, 0, 160, 300, null, null],
[0, "정원지", null, 0, null, 69, 74, 17, 0, 160, 300, null, null], [0, "정원지", null, 0, null, 69, 74, 17, 0, 160, 300, null, null],
[0, "정은", null, 0, null, 69, 73, 40, 0, 160, 300, null, null], [0, "정은", null, 0, null, 69, 73, 40, 0, 160, 300, null, null],
[0, "정원", null, 0, null, 70, 76, 35, 0, 160, 300, null, null], [0, "정원", null, 0, null, 70, 76, 35, 0, 160, 300, null, null],
[0, "정보", null, 0, null, 84, 79, 59, 0, 160, 300, null, null], [0, "정보", null, 0, null, 84, 79, 59, 0, 160, 300, null, null],
[0, "정봉", null, 0, null, 81, 92, 69, 0, 160, 300, null, null], [0, "정봉", null, 0, null, 81, 92, 69, 0, 160, 300, null, null],
[0, "전위", null, 0, null, 79, 98, 42, 0, 160, 300, null, null], [0, "전위", null, 0, null, 79, 98, 42, 0, 160, 300, null, null],
[0, "전해", null, 0, null, 68, 65, 45, 0, 160, 300, null, null], [0, "전해", null, 0, null, 68, 65, 45, 0, 160, 300, null, null],
[0, "전주", null, 0, null, 66, 51, 73, 0, 160, 300, null, null], [0, "전주", null, 0, null, 66, 51, 73, 0, 160, 300, null, null],
[0, "전풍", null, 0, null, 82, 43, 96, 0, 160, 300, null, null], [0, "전풍", null, 0, null, 82, 43, 96, 0, 160, 300, null, null],
[0, "전예", null, 0, null, 93, 85, 66, 0, 160, 300, null, null], [0, "전예", null, 0, null, 93, 85, 66, 0, 160, 300, null, null],
[0, "동윤", null, 0, null, 47, 28, 79, 0, 160, 300, null, null], [0, "동윤", null, 0, null, 47, 28, 79, 0, 160, 300, null, null],
[0, "동화", null, 0, null, 57, 34, 75, 0, 160, 300, null, null], [0, "동화", null, 0, null, 57, 34, 75, 0, 160, 300, null, null],
[0, "등애", null, 0, null, 92, 73, 94, 0, 160, 300, null, null], [0, "등애", null, 0, null, 92, 73, 94, 0, 160, 300, null, null],
[0, "도겸", null, 0, null, 51, 27, 64, 0, 160, 300, null, null], [0, "도겸", null, 0, null, 51, 27, 64, 0, 160, 300, null, null],
[0, "등현", null, 0, null, 61, 73, 45, 0, 160, 300, null, null], [0, "등현", null, 0, null, 61, 73, 45, 0, 160, 300, null, null],
[0, "등지", null, 0, null, 73, 52, 81, 0, 160, 300, null, null], [0, "등지", null, 0, null, 73, 52, 81, 0, 160, 300, null, null],
[0, "동습", null, 0, null, 72, 85, 50, 0, 160, 300, null, null], [0, "동습", null, 0, null, 72, 85, 50, 0, 160, 300, null, null],
[0, "동승", null, 0, null, 56, 53, 65, 0, 160, 300, null, null], [0, "동승", null, 0, null, 56, 53, 65, 0, 160, 300, null, null],
[0, "동소", null, 0, null, 34, 25, 80, 0, 160, 300, null, null], [0, "동소", null, 0, null, 34, 25, 80, 0, 160, 300, null, null],
[0, "동탁", null, 0, null, 91, 87, 67, 0, 160, 300, null, null], [0, "동탁", null, 0, null, 91, 87, 67, 0, 160, 300, null, null],
[0, "동도나", null, 0, null, 68, 73, 31, 0, 160, 300, null, null], [0, "동도나", null, 0, null, 68, 73, 31, 0, 160, 300, null, null],
[0, "동민", null, 0, null, 49, 60, 25, 0, 160, 300, null, null], [0, "동민", null, 0, null, 49, 60, 25, 0, 160, 300, null, null],
[0, "등무", null, 0, null, 61, 75, 29, 0, 160, 300, null, null], [0, "등무", null, 0, null, 61, 75, 29, 0, 160, 300, null, null],
[0, "두기", null, 0, null, 74, 43, 78, 0, 160, 300, null, null], [0, "두기", null, 0, null, 74, 43, 78, 0, 160, 300, null, null],
[0, "두예", null, 0, null, 96, 69, 95, 0, 160, 300, null, null], [0, "두예", null, 0, null, 96, 69, 95, 0, 160, 300, null, null],
[0, "배원소", null, 0, null, 49, 65, 25, 0, 160, 300, null, null], [0, "배원소", null, 0, null, 49, 65, 25, 0, 160, 300, null, null],
[0, "마완", null, 0, null, 71, 74, 16, 0, 160, 300, null, null], [0, "마완", null, 0, null, 71, 74, 16, 0, 160, 300, null, null],
[0, "마휴", null, 0, null, 68, 73, 48, 0, 160, 300, null, null], [0, "마휴", null, 0, null, 68, 73, 48, 0, 160, 300, null, null],
[0, "파재", null, 0, null, 74, 74, 55, 0, 160, 300, null, null], [0, "파재", null, 0, null, 74, 74, 55, 0, 160, 300, null, null],
[0, "마준", null, 0, null, 38, 52, 31, 0, 160, 300, null, null], [0, "마준", null, 0, null, 38, 52, 31, 0, 160, 300, null, null],
[0, "마속", null, 0, null, 61, 59, 84, 0, 160, 300, null, null], [0, "마속", null, 0, null, 61, 59, 84, 0, 160, 300, null, null],
[0, "마대", null, 0, null, 79, 85, 62, 0, 160, 300, null, null], [0, "마대", null, 0, null, 79, 85, 62, 0, 160, 300, null, null],
[0, "마충", null, 0, null, 78, 72, 52, 0, 160, 300, null, null], [0, "마충", null, 0, null, 78, 72, 52, 0, 160, 300, null, null],
[0, "마초", null, 0, null, 86, 97, 44, 0, 160, 300, null, null], [0, "마초", null, 0, null, 86, 97, 44, 0, 160, 300, null, null],
[0, "마철", null, 0, null, 70, 62, 43, 0, 160, 300, null, null], [0, "마철", null, 0, null, 70, 62, 43, 0, 160, 300, null, null],
[0, "마등", null, 0, null, 85, 80, 52, 0, 160, 300, null, null], [0, "마등", null, 0, null, 85, 80, 52, 0, 160, 300, null, null],
[0, "마량", null, 0, null, 53, 23, 85, 0, 160, 300, null, null], [0, "마량", null, 0, null, 53, 23, 85, 0, 160, 300, null, null],
[0, "반준", null, 0, null, 61, 46, 82, 0, 160, 300, null, null], [0, "반준", null, 0, null, 61, 46, 82, 0, 160, 300, null, null],
[0, "반장", null, 0, null, 76, 80, 59, 0, 160, 300, null, null], [0, "반장", null, 0, null, 76, 80, 59, 0, 160, 300, null, null],
[0, "번조", null, 0, null, 66, 73, 31, 0, 160, 300, null, null], [0, "번조", null, 0, null, 66, 73, 31, 0, 160, 300, null, null],
[0, "번능", null, 0, null, 69, 61, 36, 0, 160, 300, null, null], [0, "번능", null, 0, null, 69, 61, 36, 0, 160, 300, null, null],
[0, "반봉", null, 0, null, 56, 77, 4, 0, 160, 300, null, null], [0, "반봉", null, 0, null, 56, 77, 4, 0, 160, 300, null, null],
[0, "비의", null, 0, null, 82, 56, 88, 0, 160, 300, null, null], [0, "비의", null, 0, null, 82, 56, 88, 0, 160, 300, null, null],
[0, "비연", null, 0, null, 60, 66, 21, 0, 160, 300, null, null], [0, "비연", null, 0, null, 60, 66, 21, 0, 160, 300, null, null],
[0, "비시", null, 0, null, 18, 28, 65, 0, 160, 300, null, null], [0, "비시", null, 0, null, 18, 28, 65, 0, 160, 300, null, null],
[0, "미축", null, 0, null, 33, 29, 78, 0, 160, 300, null, null], [0, "미축", null, 0, null, 33, 29, 78, 0, 160, 300, null, null],
[0, "미방", null, 0, null, 54, 61, 32, 0, 160, 300, null, null], [0, "미방", null, 0, null, 54, 61, 32, 0, 160, 300, null, null],
[0, "비요", null, 0, null, 70, 52, 73, 0, 160, 300, null, null], [0, "비요", null, 0, null, 70, 52, 73, 0, 160, 300, null, null],
[0, "무안국", null, 0, null, 70, 79, 34, 0, 160, 300, null, null], [0, "무안국", null, 0, null, 70, 79, 34, 0, 160, 300, null, null],
[0, "풍습", null, 0, null, 72, 71, 39, 0, 160, 300, null, null], [0, "풍습", null, 0, null, 72, 71, 39, 0, 160, 300, null, null],
[0, "부사인", null, 0, null, 46, 63, 37, 0, 160, 300, null, null], [0, "부사인", null, 0, null, 46, 63, 37, 0, 160, 300, null, null],
[0, "부첨", null, 0, null, 73, 85, 62, 0, 160, 300, null, null], [0, "부첨", null, 0, null, 73, 85, 62, 0, 160, 300, null, null],
[0, "부손", null, 0, null, 29, 13, 70, 0, 160, 300, null, null], [0, "부손", null, 0, null, 29, 13, 70, 0, 160, 300, null, null],
[0, "문앙", null, 0, null, 76, 96, 65, 0, 160, 300, null, null], [0, "문앙", null, 0, null, 76, 96, 65, 0, 160, 300, null, null],
[0, "문흠", null, 0, null, 74, 79, 43, 0, 160, 300, null, null], [0, "문흠", null, 0, null, 74, 79, 43, 0, 160, 300, null, null],
[0, "문추", null, 0, null, 87, 95, 49, 0, 160, 300, null, null], [0, "문추", null, 0, null, 87, 95, 49, 0, 160, 300, null, null],
[0, "문빙", null, 0, null, 88, 85, 65, 0, 160, 300, null, null], [0, "문빙", null, 0, null, 88, 85, 65, 0, 160, 300, null, null],
[0, "변희", null, 0, null, 56, 70, 62, 0, 160, 300, null, null], [0, "변희", null, 0, null, 56, 70, 62, 0, 160, 300, null, null],
[0, "망아장", null, 0, null, 45, 79, 3, 0, 160, 300, null, null], [0, "망아장", null, 0, null, 45, 79, 3, 0, 160, 300, null, null],
[0, "봉기", null, 0, null, 56, 48, 84, 0, 160, 300, null, null], [0, "봉기", null, 0, null, 56, 48, 84, 0, 160, 300, null, null],
[0, "방희", null, 0, null, 60, 38, 69, 0, 160, 300, null, null], [0, "방희", null, 0, null, 60, 38, 69, 0, 160, 300, null, null],
[0, "법정", null, 0, null, 82, 47, 94, 0, 160, 300, null, null], [0, "법정", null, 0, null, 82, 47, 94, 0, 160, 300, null, null],
[0, "방통", null, 0, null, 79, 34, 97, 0, 160, 300, null, null], [0, "방통", null, 0, null, 79, 34, 97, 0, 160, 300, null, null],
[0, "방덕", null, 0, null, 89, 94, 70, 0, 160, 300, null, null], [0, "방덕", null, 0, null, 89, 94, 70, 0, 160, 300, null, null],
[0, "포륭", null, 0, null, 58, 76, 49, 0, 160, 300, null, null], [0, "포륭", null, 0, null, 58, 76, 49, 0, 160, 300, null, null],
[0, "목순", null, 0, null, 52, 77, 11, 0, 160, 300, null, null], [0, "목순", null, 0, null, 52, 77, 11, 0, 160, 300, null, null],
[0, "목록대왕", null, 0, null, 65, 71, 39, 0, 160, 300, null, null], [0, "목록대왕", null, 0, null, 65, 71, 39, 0, 160, 300, null, null],
[0, "보즐", null, 0, null, 83, 51, 81, 0, 160, 300, null, null], [0, "보즐", null, 0, null, 83, 51, 81, 0, 160, 300, null, null],
[0, "만총", null, 0, null, 88, 64, 87, 0, 160, 300, null, null], [0, "만총", null, 0, null, 88, 64, 87, 0, 160, 300, null, null],
[0, "모개", null, 0, null, 63, 39, 60, 0, 160, 300, null, null], [0, "모개", null, 0, null, 63, 39, 60, 0, 160, 300, null, null],
[0, "맹획", null, 0, null, 81, 88, 42, 0, 160, 300, null, null], [0, "맹획", null, 0, null, 81, 88, 42, 0, 160, 300, null, null],
[0, "맹체", null, 0, null, 75, 55, 75, 0, 160, 300, null, null], [0, "맹체", null, 0, null, 75, 55, 75, 0, 160, 300, null, null],
[0, "맹우", null, 0, null, 50, 68, 22, 0, 160, 300, null, null], [0, "맹우", null, 0, null, 50, 68, 22, 0, 160, 300, null, null],
[0, "유섭", null, 0, null, 62, 79, 24, 0, 160, 300, null, null], [0, "유섭", null, 0, null, 62, 79, 24, 0, 160, 300, null, null],
[0, "양부", null, 0, null, 62, 48, 68, 0, 160, 300, null, null], [0, "양부", null, 0, null, 62, 48, 68, 0, 160, 300, null, null],
[0, "옹개", null, 0, null, 73, 75, 57, 0, 160, 300, null, null], [0, "옹개", null, 0, null, 73, 75, 57, 0, 160, 300, null, null],
[0, "양의", null, 0, null, 68, 40, 82, 0, 160, 300, null, null], [0, "양의", null, 0, null, 68, 40, 82, 0, 160, 300, null, null],
[0, "양호", null, 0, null, 94, 69, 92, 0, 160, 300, null, null], [0, "양호", null, 0, null, 94, 69, 92, 0, 160, 300, null, null],
[0, "양홍", null, 0, null, 33, 15, 77, 0, 160, 300, null, null], [0, "양홍", null, 0, null, 33, 15, 77, 0, 160, 300, null, null],
[0, "양앙", null, 0, null, 68, 72, 38, 0, 160, 300, null, null], [0, "양앙", null, 0, null, 68, 72, 38, 0, 160, 300, null, null],
[0, "양추", null, 0, null, 52, 65, 40, 0, 160, 300, null, null], [0, "양추", null, 0, null, 52, 65, 40, 0, 160, 300, null, null],
[0, "양수", null, 0, null, 46, 23, 83, 0, 160, 300, null, null], [0, "양수", null, 0, null, 46, 23, 83, 0, 160, 300, null, null],
[0, "양추2", null, 0, null, 67, 64, 44, 0, 160, 300, null, null], [0, "양추2", null, 0, null, 67, 64, 44, 0, 160, 300, null, null],
[0, "양송", null, 0, null, 17, 5, 28, 0, 160, 300, null, null], [0, "양송", null, 0, null, 17, 5, 28, 0, 160, 300, null, null],
[0, "양임", null, 0, null, 70, 78, 56, 0, 160, 300, null, null], [0, "양임", null, 0, null, 70, 78, 56, 0, 160, 300, null, null],
[0, "양조", null, 0, null, 53, 61, 36, 0, 160, 300, null, null], [0, "양조", null, 0, null, 53, 61, 36, 0, 160, 300, null, null],
[0, "양백", null, 0, null, 44, 45, 19, 0, 160, 300, null, null], [0, "양백", null, 0, null, 44, 45, 19, 0, 160, 300, null, null],
[0, "양부2", null, 0, null, 67, 50, 83, 0, 160, 300, null, null], [0, "양부2", null, 0, null, 67, 50, 83, 0, 160, 300, null, null],
[0, "양봉", null, 0, null, 66, 65, 31, 0, 160, 300, null, null], [0, "양봉", null, 0, null, 66, 65, 31, 0, 160, 300, null, null],
[0, "양봉2", null, 0, null, 54, 62, 53, 0, 160, 300, null, null], [0, "양봉2", null, 0, null, 54, 62, 53, 0, 160, 300, null, null],
[0, "뇌동", null, 0, null, 69, 78, 51, 0, 160, 300, null, null], [0, "뇌동", null, 0, null, 69, 78, 51, 0, 160, 300, null, null],
[0, "뇌박", null, 0, null, 62, 70, 36, 0, 160, 300, null, null], [0, "뇌박", null, 0, null, 62, 70, 36, 0, 160, 300, null, null],
[0, "이이", null, 0, null, 63, 77, 19, 0, 160, 300, null, null], [0, "이이", null, 0, null, 63, 77, 19, 0, 160, 300, null, null],
[0, "이회", null, 0, null, 79, 58, 79, 0, 160, 300, null, null], [0, "이회", null, 0, null, 79, 58, 79, 0, 160, 300, null, null],
[0, "이각", null, 0, null, 69, 72, 24, 0, 160, 300, null, null], [0, "이각", null, 0, null, 69, 72, 24, 0, 160, 300, null, null],
[0, "육항", null, 0, null, 94, 68, 93, 0, 160, 300, null, null], [0, "육항", null, 0, null, 94, 68, 93, 0, 160, 300, null, null],
[0, "육적", null, 0, null, 20, 7, 72, 0, 160, 300, null, null], [0, "육적", null, 0, null, 20, 7, 72, 0, 160, 300, null, null],
[0, "육손", null, 0, null, 95, 71, 96, 0, 160, 300, null, null], [0, "육손", null, 0, null, 95, 71, 96, 0, 160, 300, null, null],
[0, "이엄", null, 0, null, 83, 84, 63, 0, 160, 300, null, null], [0, "이엄", null, 0, null, 83, 84, 63, 0, 160, 300, null, null],
[0, "이유", null, 0, null, 61, 26, 93, 0, 160, 300, null, null], [0, "이유", null, 0, null, 61, 26, 93, 0, 160, 300, null, null],
[0, "이숙", null, 0, null, 46, 69, 61, 0, 160, 300, null, null], [0, "이숙", null, 0, null, 46, 69, 61, 0, 160, 300, null, null],
[0, "이통", null, 0, null, 73, 81, 62, 0, 160, 300, null, null], [0, "이통", null, 0, null, 73, 81, 62, 0, 160, 300, null, null],
[0, "이전", null, 0, null, 78, 80, 59, 0, 160, 300, null, null], [0, "이전", null, 0, null, 78, 80, 59, 0, 160, 300, null, null],
[0, "이풍", null, 0, null, 69, 74, 50, 0, 160, 300, null, null], [0, "이풍", null, 0, null, 69, 74, 50, 0, 160, 300, null, null],
[0, "유언", null, 0, null, 61, 38, 80, 0, 160, 300, null, null], [0, "유언", null, 0, null, 61, 38, 80, 0, 160, 300, null, null],
[0, "유괴", null, 0, null, 71, 73, 52, 0, 160, 300, null, null], [0, "유괴", null, 0, null, 71, 73, 52, 0, 160, 300, null, null],
[0, "유기", null, 0, null, 52, 12, 63, 0, 160, 300, null, null], [0, "유기", null, 0, null, 52, 12, 63, 0, 160, 300, null, null],
[0, "유우", null, 0, null, 62, 33, 75, 0, 160, 300, null, null], [0, "유우", null, 0, null, 62, 33, 75, 0, 160, 300, null, null],
[0, "유훈", null, 0, null, 47, 63, 35, 0, 160, 300, null, null], [0, "유훈", null, 0, null, 47, 63, 35, 0, 160, 300, null, null],
[0, "유현", null, 0, null, 54, 66, 51, 0, 160, 300, null, null], [0, "유현", null, 0, null, 54, 66, 51, 0, 160, 300, null, null],
[0, "유순", null, 0, null, 63, 46, 28, 0, 160, 300, null, null], [0, "유순", null, 0, null, 63, 46, 28, 0, 160, 300, null, null],
[0, "유장", null, 0, null, 31, 5, 34, 0, 160, 300, null, null], [0, "유장", null, 0, null, 31, 5, 34, 0, 160, 300, null, null],
[0, "유심", null, 0, null, 60, 48, 70, 0, 160, 300, null, null], [0, "유심", null, 0, null, 60, 48, 70, 0, 160, 300, null, null],
[0, "유선", null, 0, null, 3, 5, 9, 0, 160, 300, null, null], [0, "유선", null, 0, null, 3, 5, 9, 0, 160, 300, null, null],
[0, "유종", null, 0, null, 24, 22, 65, 0, 160, 300, null, null], [0, "유종", null, 0, null, 24, 22, 65, 0, 160, 300, null, null],
[0, "유도", null, 0, null, 25, 23, 26, 0, 160, 300, null, null], [0, "유도", null, 0, null, 25, 23, 26, 0, 160, 300, null, null],
[0, "유파", null, 0, null, 29, 22, 75, 0, 160, 300, null, null], [0, "유파", null, 0, null, 29, 22, 75, 0, 160, 300, null, null],
[0, "유반", null, 0, null, 69, 76, 47, 0, 160, 300, null, null], [0, "유반", null, 0, null, 69, 76, 47, 0, 160, 300, null, null],
[0, "유비", null, 0, null, 88, 78, 59, 0, 160, 300, null, null], [0, "유비", null, 0, null, 88, 78, 59, 0, 160, 300, null, null],
[0, "유표", null, 0, null, 48, 31, 72, 0, 160, 300, null, null], [0, "유표", null, 0, null, 48, 31, 72, 0, 160, 300, null, null],
[0, "유복", null, 0, null, 64, 49, 74, 0, 160, 300, null, null], [0, "유복", null, 0, null, 64, 49, 74, 0, 160, 300, null, null],
[0, "유벽", null, 0, null, 70, 72, 47, 0, 160, 300, null, null], [0, "유벽", null, 0, null, 70, 72, 47, 0, 160, 300, null, null],
[0, "유봉", null, 0, null, 75, 79, 44, 0, 160, 300, null, null], [0, "유봉", null, 0, null, 75, 79, 44, 0, 160, 300, null, null],
[0, "유엽", null, 0, null, 56, 32, 92, 0, 160, 300, null, null], [0, "유엽", null, 0, null, 56, 32, 92, 0, 160, 300, null, null],
[0, "유요", null, 0, null, 62, 67, 46, 0, 160, 300, null, null], [0, "유요", null, 0, null, 62, 67, 46, 0, 160, 300, null, null],
[0, "여위황", null, 0, null, 58, 63, 29, 0, 160, 300, null, null], [0, "여위황", null, 0, null, 58, 63, 29, 0, 160, 300, null, null],
[0, "요화", null, 0, null, 73, 76, 54, 0, 160, 300, null, null], [0, "요화", null, 0, null, 73, 76, 54, 0, 160, 300, null, null],
[0, "양흥", null, 0, null, 61, 65, 19, 0, 160, 300, null, null], [0, "양흥", null, 0, null, 61, 65, 19, 0, 160, 300, null, null],
[0, "양습", null, 0, null, 73, 40, 74, 0, 160, 300, null, null], [0, "양습", null, 0, null, 73, 40, 74, 0, 160, 300, null, null],
[0, "양서", null, 0, null, 56, 62, 66, 0, 160, 300, null, null], [0, "양서", null, 0, null, 56, 62, 66, 0, 160, 300, null, null],
[0, "능조", null, 0, null, 75, 81, 42, 0, 160, 300, null, null], [0, "능조", null, 0, null, 75, 81, 42, 0, 160, 300, null, null],
[0, "능통", null, 0, null, 83, 89, 60, 0, 160, 300, null, null], [0, "능통", null, 0, null, 83, 89, 60, 0, 160, 300, null, null],
[0, "여개", null, 0, null, 53, 30, 67, 0, 160, 300, null, null], [0, "여개", null, 0, null, 53, 30, 67, 0, 160, 300, null, null],
[0, "여건", null, 0, null, 57, 70, 62, 0, 160, 300, null, null], [0, "여건", null, 0, null, 57, 70, 62, 0, 160, 300, null, null],
[0, "여광", null, 0, null, 56, 70, 13, 0, 160, 300, null, null], [0, "여광", null, 0, null, 56, 70, 13, 0, 160, 300, null, null],
[0, "여상", null, 0, null, 54, 71, 12, 0, 160, 300, null, null], [0, "여상", null, 0, null, 54, 71, 12, 0, 160, 300, null, null],
[0, "여대", null, 0, null, 80, 71, 52, 0, 160, 300, null, null], [0, "여대", null, 0, null, 80, 71, 52, 0, 160, 300, null, null],
[0, "여범", null, 0, null, 73, 54, 75, 0, 160, 300, null, null], [0, "여범", null, 0, null, 73, 54, 75, 0, 160, 300, null, null],
[0, "여포", null, 0, null, 89, 100, 42, 0, 160, 300, null, null], [0, "여포", null, 0, null, 89, 100, 42, 0, 160, 300, null, null],
[0, "여몽", null, 0, null, 91, 69, 90, 0, 160, 300, null, null], [0, "여몽", null, 0, null, 91, 69, 90, 0, 160, 300, null, null],
[0, "윤직", null, 0, null, 46, 42, 73, 0, 160, 300, null, null], [0, "윤직", null, 0, null, 46, 42, 73, 0, 160, 300, null, null],
[0, "냉포", null, 0, null, 71, 82, 61, 0, 160, 300, null, null], [0, "냉포", null, 0, null, 71, 82, 61, 0, 160, 300, null, null],
[0, "누규", null, 0, null, 52, 13, 87, 0, 160, 300, null, null], [0, "누규", null, 0, null, 52, 13, 87, 0, 160, 300, null, null],
[0, "노숙", null, 0, null, 89, 56, 93, 0, 160, 300, null, null], [0, "노숙", null, 0, null, 89, 56, 93, 0, 160, 300, null, null],
[0, "노식", null, 0, null, 86, 63, 82, 0, 160, 300, null, null], [0, "노식", null, 0, null, 86, 63, 82, 0, 160, 300, null, null],
[0, "범강", null, 0, null, 49, 50, 36, 0, 160, 300, null, null], [0, "범강", null, 0, null, 49, 50, 36, 0, 160, 300, null, null],
[0, "장달", null, 0, null, 43, 56, 34, 0, 160, 300, null, null], [0, "장달", null, 0, null, 43, 56, 34, 0, 160, 300, null, null],
[0, "규람", null, 0, null, 55, 70, 58, 0, 160, 300, null, null], [0, "규람", null, 0, null, 55, 70, 58, 0, 160, 300, null, null],
[0, "대원", null, 0, null, 38, 32, 68, 0, 160, 300, null, null], [0, "대원", null, 0, null, 38, 32, 68, 0, 160, 300, null, null],
[0, "왕기", null, 0, null, 81, 64, 86, 0, 160, 300, null, null], [0, "왕기", null, 0, null, 81, 64, 86, 0, 160, 300, null, null],
[0, "왕상", null, 0, null, 23, 19, 68, 0, 160, 300, null, null], [0, "왕상", null, 0, null, 23, 19, 68, 0, 160, 300, null, null],
[0, "왕돈", null, 0, null, 60, 66, 46, 0, 160, 300, null, null], [0, "왕돈", null, 0, null, 60, 66, 46, 0, 160, 300, null, null],
[0, "악침", null, 0, null, 73, 75, 43, 0, 160, 300, null, null], [0, "악침", null, 0, null, 73, 75, 43, 0, 160, 300, null, null],
[0, "하제", null, 0, null, 83, 61, 82, 0, 160, 300, null, null], [0, "하제", null, 0, null, 83, 61, 82, 0, 160, 300, null, null],
[0, "환범", null, 0, null, 40, 11, 78, 0, 160, 300, null, null], [0, "환범", null, 0, null, 40, 11, 78, 0, 160, 300, null, null],
[0, "견초", null, 0, null, 72, 79, 57, 0, 160, 300, null, null], [0, "견초", null, 0, null, 72, 79, 57, 0, 160, 300, null, null],
[0, "고당륭", null, 0, null, 35, 24, 76, 0, 160, 300, null, null], [0, "고당륭", null, 0, null, 35, 24, 76, 0, 160, 300, null, null],
[0, "오찬", null, 0, null, 68, 41, 78, 0, 160, 300, null, null], [0, "오찬", null, 0, null, 68, 41, 78, 0, 160, 300, null, null],
[0, "호질", null, 0, null, 73, 46, 74, 0, 160, 300, null, null], [0, "호질", null, 0, null, 73, 46, 74, 0, 160, 300, null, null],
[0, "오질", null, 0, null, 16, 29, 68, 0, 160, 300, null, null], [0, "오질", null, 0, null, 16, 29, 68, 0, 160, 300, null, null],
[0, "호준", null, 0, null, 79, 76, 55, 0, 160, 300, null, null], [0, "호준", null, 0, null, 79, 76, 55, 0, 160, 300, null, null],
[0, "고담", null, 0, null, 53, 23, 77, 0, 160, 300, null, null], [0, "고담", null, 0, null, 53, 23, 77, 0, 160, 300, null, null],
[0, "최림", null, 0, null, 32, 22, 66, 0, 160, 300, null, null], [0, "최림", null, 0, null, 32, 22, 66, 0, 160, 300, null, null],
[0, "사마망", null, 0, null, 78, 58, 83, 0, 160, 300, null, null], [0, "사마망", null, 0, null, 78, 58, 83, 0, 160, 300, null, null],
[0, "주이", null, 0, null, 70, 73, 52, 0, 160, 300, null, null], [0, "주이", null, 0, null, 70, 73, 52, 0, 160, 300, null, null],
[0, "전단", null, 0, null, 67, 64, 39, 0, 160, 300, null, null], [0, "전단", null, 0, null, 67, 64, 39, 0, 160, 300, null, null],
[0, "조우", null, 0, null, 50, 43, 37, 0, 160, 300, null, null], [0, "조우", null, 0, null, 50, 43, 37, 0, 160, 300, null, null],
[0, "조상", null, 0, null, 39, 33, 30, 0, 160, 300, null, null], [0, "조상", null, 0, null, 39, 33, 30, 0, 160, 300, null, null],
[0, "조방", null, 0, null, 20, 14, 27, 0, 160, 300, null, null], [0, "조방", null, 0, null, 20, 14, 27, 0, 160, 300, null, null],
[0, "태사향", null, 0, null, 57, 66, 48, 0, 160, 300, null, null], [0, "태사향", null, 0, null, 57, 66, 48, 0, 160, 300, null, null],
[0, "장휴", null, 0, null, 63, 27, 74, 0, 160, 300, null, null], [0, "장휴", null, 0, null, 63, 27, 74, 0, 160, 300, null, null],
[0, "장호", null, 0, null, 75, 74, 51, 0, 160, 300, null, null], [0, "장호", null, 0, null, 75, 74, 51, 0, 160, 300, null, null],
[0, "조광", null, 0, null, 67, 71, 53, 0, 160, 300, null, null], [0, "조광", null, 0, null, 67, 71, 53, 0, 160, 300, null, null],
[0, "장집", null, 0, null, 76, 29, 80, 0, 160, 300, null, null], [0, "장집", null, 0, null, 76, 29, 80, 0, 160, 300, null, null],
[0, "장승", null, 0, null, 77, 55, 75, 0, 160, 300, null, null], [0, "장승", null, 0, null, 77, 55, 75, 0, 160, 300, null, null],
[0, "장소2", null, 0, null, 23, 56, 31, 0, 160, 300, null, null], [0, "장소2", null, 0, null, 23, 56, 31, 0, 160, 300, null, null],
[0, "조통", null, 0, null, 68, 67, 46, 0, 160, 300, null, null], [0, "조통", null, 0, null, 68, 67, 46, 0, 160, 300, null, null],
[0, "진표", null, 0, null, 66, 42, 74, 0, 160, 300, null, null], [0, "진표", null, 0, null, 66, 42, 74, 0, 160, 300, null, null],
[0, "정무", null, 0, null, 56, 35, 75, 0, 160, 300, null, null], [0, "정무", null, 0, null, 56, 35, 75, 0, 160, 300, null, null],
[0, "정봉2", null, 0, null, 66, 66, 46, 0, 160, 300, null, null], [0, "정봉2", null, 0, null, 66, 66, 46, 0, 160, 300, null, null],
[0, "전만", null, 0, null, 51, 73, 39, 0, 160, 300, null, null], [0, "전만", null, 0, null, 51, 73, 39, 0, 160, 300, null, null],
[0, "마균", null, 0, null, 22, 17, 71, 0, 160, 300, null, null], [0, "마균", null, 0, null, 22, 17, 71, 0, 160, 300, null, null],
[0, "방회", null, 0, null, 69, 75, 49, 0, 160, 300, null, null], [0, "방회", null, 0, null, 69, 75, 49, 0, 160, 300, null, null],
[0, "낙통", null, 0, null, 76, 58, 75, 0, 160, 300, null, null], [0, "낙통", null, 0, null, 76, 58, 75, 0, 160, 300, null, null],
[0, "육개", null, 0, null, 65, 61, 79, 0, 160, 300, null, null], [0, "육개", null, 0, null, 65, 61, 79, 0, 160, 300, null, null],
[0, "유찬", null, 0, null, 78, 81, 59, 0, 160, 300, null, null], [0, "유찬", null, 0, null, 78, 81, 59, 0, 160, 300, null, null],
[0, "유소", null, 0, null, 68, 53, 74, 0, 160, 300, null, null], [0, "유소", null, 0, null, 68, 53, 74, 0, 160, 300, null, null],
[0, "요립", null, 0, null, 32, 15, 76, 0, 160, 300, null, null], [0, "요립", null, 0, null, 32, 15, 76, 0, 160, 300, null, null],
[0, "여거", null, 0, null, 78, 51, 71, 0, 160, 300, null, null], [0, "여거", null, 0, null, 78, 51, 71, 0, 160, 300, null, null],
[0, "제갈첨", null, 0, null, 70, 57, 76, 0, 160, 300, null, null], [0, "제갈첨", null, 0, null, 70, 57, 76, 0, 160, 300, null, null],
[0, "손휴", null, 0, null, 57, 42, 78, 0, 160, 300, null, null], [0, "손휴", null, 0, null, 57, 42, 78, 0, 160, 300, null, null],
[0, "극정", null, 0, null, 42, 23, 68, 0, 160, 300, null, null], [0, "극정", null, 0, null, 42, 23, 68, 0, 160, 300, null, null],
[0, "호분", null, 0, null, 71, 76, 50, 0, 160, 300, null, null], [0, "호분", null, 0, null, 71, 76, 50, 0, 160, 300, null, null],
[0, "손량", null, 0, null, 32, 26, 70, 0, 160, 300, null, null], [0, "손량", null, 0, null, 32, 26, 70, 0, 160, 300, null, null],
[0, "마막", null, 0, null, 34, 12, 44, 0, 160, 300, null, null], [0, "마막", null, 0, null, 34, 12, 44, 0, 160, 300, null, null],
[0, "손호", null, 0, null, 41, 73, 71, 0, 160, 300, null, null], [0, "손호", null, 0, null, 41, 73, 71, 0, 160, 300, null, null],
[0, "조모", null, 0, null, 54, 61, 59, 0, 160, 300, null, null], [0, "조모", null, 0, null, 54, 61, 59, 0, 160, 300, null, null],
[0, "조환", null, 0, null, 30, 28, 30, 0, 160, 300, null, null], [0, "조환", null, 0, null, 30, 28, 30, 0, 160, 300, null, null],
[0, "사마유", null, 0, null, 71, 54, 75, 0, 160, 300, null, null], [0, "사마유", null, 0, null, 71, 54, 75, 0, 160, 300, null, null],
[0, "제갈상", null, 0, null, 64, 79, 62, 0, 160, 300, null, null], [0, "제갈상", null, 0, null, 64, 79, 62, 0, 160, 300, null, null],
[0, "손화", null, 0, null, 31, 39, 68, 0, 160, 300, null, null], [0, "손화", null, 0, null, 31, 39, 68, 0, 160, 300, null, null],
[0, "염우", null, 0, null, 52, 61, 51, 0, 160, 300, null, null], [0, "염우", null, 0, null, 52, 61, 51, 0, 160, 300, null, null],
[0, "왕경", null, 0, null, 67, 49, 71, 0, 160, 300, null, null], [0, "왕경", null, 0, null, 67, 49, 71, 0, 160, 300, null, null],
[0, "왕혼", null, 0, null, 74, 71, 50, 0, 160, 300, null, null], [0, "왕혼", null, 0, null, 74, 71, 50, 0, 160, 300, null, null],
[0, "곽혁", null, 0, null, 33, 29, 70, 0, 160, 300, null, null], [0, "곽혁", null, 0, null, 33, 29, 70, 0, 160, 300, null, null],
[0, "가범", null, 0, null, 60, 50, 73, 0, 160, 300, null, null], [0, "가범", null, 0, null, 60, 50, 73, 0, 160, 300, null, null],
[0, "서질", null, 0, null, 68, 83, 24, 0, 160, 300, null, null], [0, "서질", null, 0, null, 68, 83, 24, 0, 160, 300, null, null],
[0, "손준", null, 0, null, 64, 70, 48, 0, 160, 300, null, null], [0, "손준", null, 0, null, 64, 70, 48, 0, 160, 300, null, null],
[0, "손침", null, 0, null, 58, 55, 65, 0, 160, 300, null, null], [0, "손침", null, 0, null, 58, 55, 65, 0, 160, 300, null, null],
[0, "우사", null, 0, null, 61, 34, 74, 0, 160, 300, null, null], [0, "우사", null, 0, null, 61, 34, 74, 0, 160, 300, null, null],
[0, "진건", null, 0, null, 72, 71, 50, 0, 160, 300, null, null], [0, "진건", null, 0, null, 72, 71, 50, 0, 160, 300, null, null],
[0, "동궐", null, 0, null, 65, 59, 76, 0, 160, 300, null, null], [0, "동궐", null, 0, null, 65, 59, 76, 0, 160, 300, null, null],
[0, "당자", null, 0, null, 61, 71, 50, 0, 160, 300, null, null], [0, "당자", null, 0, null, 61, 71, 50, 0, 160, 300, null, null],
[0, "등충", null, 0, null, 76, 80, 59, 0, 160, 300, null, null], [0, "등충", null, 0, null, 76, 80, 59, 0, 160, 300, null, null],
[0, "황숭", null, 0, null, 67, 50, 72, 0, 160, 300, null, null], [0, "황숭", null, 0, null, 67, 50, 72, 0, 160, 300, null, null],
[0, "화핵", null, 0, null, 20, 24, 71, 0, 160, 300, null, null], [0, "화핵", null, 0, null, 20, 24, 71, 0, 160, 300, null, null],
[0, "허의", null, 0, null, 51, 74, 15, 0, 160, 300, null, null], [0, "허의", null, 0, null, 51, 74, 15, 0, 160, 300, null, null],
[0, "송겸", null, 0, null, 66, 78, 42, 0, 160, 300, null, null], [0, "송겸", null, 0, null, 66, 78, 42, 0, 160, 300, null, null],
[0, "호제", null, 0, null, 57, 39, 68, 0, 160, 300, null, null], [0, "호제", null, 0, null, 57, 39, 68, 0, 160, 300, null, null],
[0, "나헌", null, 0, null, 86, 62, 82, 0, 160, 300, null, null], [0, "나헌", null, 0, null, 86, 62, 82, 0, 160, 300, null, null],
[0, "노숙2", null, 0, null, 73, 53, 74, 0, 160, 300, null, null], [0, "노숙2", null, 0, null, 73, 53, 74, 0, 160, 300, null, null],
[0, "구성", null, 0, null, 63, 70, 38, 0, 160, 300, null, null], [0, "구성", null, 0, null, 63, 70, 38, 0, 160, 300, null, null],
[0, "어부라", null, 0, null, 72, 68, 21, 0, 160, 300, null, null], [0, "어부라", null, 0, null, 72, 68, 21, 0, 160, 300, null, null],
[0, "아하소과", null, 0, null, 61, 76, 13, 0, 160, 300, null, null], [0, "아하소과", null, 0, null, 61, 76, 13, 0, 160, 300, null, null],
[0, "가비능", null, 0, null, 77, 69, 52, 0, 160, 300, null, null], [0, "가비능", null, 0, null, 77, 69, 52, 0, 160, 300, null, null],
[0, "구력거", null, 0, null, 80, 68, 50, 0, 160, 300, null, null], [0, "구력거", null, 0, null, 80, 68, 50, 0, 160, 300, null, null],
[0, "강단", null, 0, null, 65, 83, 48, 0, 160, 300, null, null], [0, "강단", null, 0, null, 65, 83, 48, 0, 160, 300, null, null],
[0, "황란", null, 0, null, 63, 75, 44, 0, 160, 300, null, null], [0, "황란", null, 0, null, 63, 75, 44, 0, 160, 300, null, null],
[0, "호주천", null, 0, null, 70, 71, 40, 0, 160, 300, null, null], [0, "호주천", null, 0, null, 70, 71, 40, 0, 160, 300, null, null],
[0, "종리목", null, 0, null, 84, 61, 82, 0, 160, 300, null, null], [0, "종리목", null, 0, null, 84, 61, 82, 0, 160, 300, null, null],
[0, "제갈교", null, 0, null, 62, 27, 75, 0, 160, 300, null, null], [0, "제갈교", null, 0, null, 62, 27, 75, 0, 160, 300, null, null],
[0, "답돈", null, 0, null, 84, 82, 61, 0, 160, 300, null, null], [0, "답돈", null, 0, null, 84, 82, 61, 0, 160, 300, null, null],
[0, "반임", null, 0, null, 66, 79, 38, 0, 160, 300, null, null], [0, "반임", null, 0, null, 66, 79, 38, 0, 160, 300, null, null],
[0, "보도근", null, 0, null, 64, 73, 50, 0, 160, 300, null, null], [0, "보도근", null, 0, null, 64, 73, 50, 0, 160, 300, null, null],
[0, "미당대왕", null, 0, null, 59, 69, 21, 0, 160, 300, null, null], [0, "미당대왕", null, 0, null, 59, 69, 21, 0, 160, 300, null, null],
[0, "유표2", null, 0, null, 73, 74, 48, 0, 160, 300, null, null], [0, "유표2", null, 0, null, 73, 74, 48, 0, 160, 300, null, null],
[0, "루반", null, 0, null, 65, 76, 39, 0, 160, 300, null, null], [0, "루반", null, 0, null, 65, 76, 39, 0, 160, 300, null, null],
[0, "손관", null, 0, null, 72, 78, 51, 0, 160, 300, null, null], [0, "손관", null, 0, null, 72, 78, 51, 0, 160, 300, null, null],
[0, "곽석", null, 0, null, 59, 71, 48, 0, 160, 300, null, null], [0, "곽석", null, 0, null, 59, 71, 48, 0, 160, 300, null, null],
[0, "주조", null, 0, null, 63, 68, 26, 0, 160, 300, null, null], [0, "주조", null, 0, null, 63, 68, 26, 0, 160, 300, null, null],
[0, "장거", null, 0, null, 79, 75, 56, 0, 160, 300, null, null], [0, "장거", null, 0, null, 79, 75, 56, 0, 160, 300, null, null],
[0, "장순", null, 0, null, 73, 81, 60, 0, 160, 300, null, null], [0, "장순", null, 0, null, 73, 81, 60, 0, 160, 300, null, null],
[0, "철리길", null, 0, null, 77, 70, 52, 0, 160, 300, null, null], [0, "철리길", null, 0, null, 77, 70, 52, 0, 160, 300, null, null],
[0, "주삭", null, 0, null, 54, 60, 50, 0, 160, 300, null, null], [0, "주삭", null, 0, null, 54, 60, 50, 0, 160, 300, null, null],
[0, "황월영", null, 0, null, 46, 33, 78, 0, 160, 300, null, null], [0, "황월영", null, 0, null, 46, 33, 78, 0, 160, 300, null, null],
[0, "채염", null, 0, null, 42, 26, 82, 0, 160, 300, null, null], [0, "채염", null, 0, null, 42, 26, 82, 0, 160, 300, null, null],
[0, "소교", null, 0, null, 23, 15, 78, 0, 160, 300, null, null], [0, "소교", null, 0, null, 23, 15, 78, 0, 160, 300, null, null],
[0, "신헌영", null, 0, null, 65, 35, 90, 0, 160, 300, null, null], [0, "신헌영", null, 0, null, 65, 35, 90, 0, 160, 300, null, null],
[0, "손상향", null, 0, null, 72, 79, 55, 0, 160, 300, null, null], [0, "손상향", null, 0, null, 72, 79, 55, 0, 160, 300, null, null],
[0, "대교", null, 0, null, 22, 30, 78, 0, 160, 300, null, null], [0, "대교", null, 0, null, 22, 30, 78, 0, 160, 300, null, null],
[0, "초선", null, 0, null, 12, 22, 71, 0, 160, 300, null, null], [0, "초선", null, 0, null, 12, 22, 71, 0, 160, 300, null, null],
[0, "교모", null, 0, null, 54, 45, 69, 0, 160, 300, null, null], [0, "교모", null, 0, null, 54, 45, 69, 0, 160, 300, null, null],
[0, "관구수", null, 0, null, 58, 62, 33, 0, 160, 300, null, null], [0, "관구수", null, 0, null, 58, 62, 33, 0, 160, 300, null, null],
[0, "관구전", null, 0, null, 63, 47, 69, 0, 160, 300, null, null], [0, "관구전", null, 0, null, 63, 47, 69, 0, 160, 300, null, null],
[0, "원유", null, 0, null, 56, 40, 73, 0, 160, 300, null, null], [0, "원유", null, 0, null, 56, 40, 73, 0, 160, 300, null, null],
[0, "왕광", null, 0, null, 65, 41, 61, 0, 160, 300, null, null], [0, "왕광", null, 0, null, 65, 41, 61, 0, 160, 300, null, null],
[0, "신창", null, 0, null, 50, 26, 42, 0, 160, 300, null, null], [0, "신창", null, 0, null, 50, 26, 42, 0, 160, 300, null, null],
[0, "사마주", null, 0, null, 61, 40, 61, 0, 160, 300, null, null], [0, "사마주", null, 0, null, 61, 40, 61, 0, 160, 300, null, null],
[0, "양제", null, 0, null, 67, 49, 71, 0, 160, 300, null, null], [0, "양제", null, 0, null, 67, 49, 71, 0, 160, 300, null, null],
[0, "성만", null, 0, null, 61, 68, 46, 0, 160, 300, null, null], [0, "성만", null, 0, null, 61, 68, 46, 0, 160, 300, null, null],
[0, "오연", null, 0, null, 66, 73, 42, 0, 160, 300, null, null], [0, "오연", null, 0, null, 66, 73, 42, 0, 160, 300, null, null],
[0, "맹충", null, 0, null, 47, 28, 72, 0, 160, 300, null, null], [0, "맹충", null, 0, null, 47, 28, 72, 0, 160, 300, null, null],
[0, "잠혼", null, 0, null, 1, 1, 22, 0, 160, 300, null, null], [0, "잠혼", null, 0, null, 1, 1, 22, 0, 160, 300, null, null],
[0, "사정", null, 0, null, 64, 76, 34, 0, 160, 300, null, null], [0, "사정", null, 0, null, 64, 76, 34, 0, 160, 300, null, null],
[0, "심영", null, 0, null, 70, 77, 55, 0, 160, 300, null, null], [0, "심영", null, 0, null, 70, 77, 55, 0, 160, 300, null, null],
[0, "도준", null, 0, null, 65, 66, 46, 0, 160, 300, null, null], [0, "도준", null, 0, null, 65, 66, 46, 0, 160, 300, null, null],
[0, "만욱", null, 0, null, 21, 25, 71, 0, 160, 300, null, null], [0, "만욱", null, 0, null, 21, 25, 71, 0, 160, 300, null, null],
[0, "오언", null, 0, null, 76, 81, 59, 0, 160, 300, null, null], [0, "오언", null, 0, null, 76, 81, 59, 0, 160, 300, null, null],
[0, "위막", null, 0, null, 57, 62, 59, 0, 160, 300, null, null], [0, "위막", null, 0, null, 57, 62, 59, 0, 160, 300, null, null],
[0, "시삭", null, 0, null, 38, 65, 47, 0, 160, 300, null, null], [0, "시삭", null, 0, null, 38, 65, 47, 0, 160, 300, null, null],
[0, "전속", null, 0, null, 47, 60, 55, 0, 160, 300, null, null], [0, "전속", null, 0, null, 47, 60, 55, 0, 160, 300, null, null],
[0, "장화", null, 0, null, 36, 27, 78, 0, 160, 300, null, null], [0, "장화", null, 0, null, 36, 27, 78, 0, 160, 300, null, null],
[0, "오거", null, 0, null, 49, 61, 23, 0, 160, 300, null, null], [0, "오거", null, 0, null, 49, 61, 23, 0, 160, 300, null, null],
[0, "추정", null, 0, null, 70, 46, 66, 0, 160, 300, null, null], [0, "추정", null, 0, null, 70, 46, 66, 0, 160, 300, null, null],
[0, "장특", null, 0, null, 73, 54, 75, 0, 160, 300, null, null], [0, "장특", null, 0, null, 73, 54, 75, 0, 160, 300, null, null],
[0, "곽마", null, 0, null, 68, 71, 47, 0, 160, 300, null, null], [0, "곽마", null, 0, null, 68, 71, 47, 0, 160, 300, null, null],
[0, "석포", null, 0, null, 69, 71, 49, 0, 160, 300, null, null], [0, "석포", null, 0, null, 69, 71, 49, 0, 160, 300, null, null],
[0, "견홍", null, 0, null, 70, 74, 53, 0, 160, 300, null, null], [0, "견홍", null, 0, null, 70, 74, 53, 0, 160, 300, null, null],
[0, "한거자", null, 0, null, 51, 59, 51, 0, 160, 300, null, null], [0, "한거자", null, 0, null, 51, 59, 51, 0, 160, 300, null, null],
[0, "휴원진", null, 0, null, 52, 68, 45, 0, 160, 300, null, null], [0, "휴원진", null, 0, null, 52, 68, 45, 0, 160, 300, null, null],
[0, "곽원", null, 0, null, 66, 73, 36, 0, 160, 300, null, null], [0, "곽원", null, 0, null, 66, 73, 36, 0, 160, 300, null, null],
[0, "계옹", null, 0, null, 63, 52, 33, 0, 160, 300, null, null], [0, "계옹", null, 0, null, 63, 52, 33, 0, 160, 300, null, null],
[0, "이부", null, 0, null, 31, 36, 74, 0, 160, 300, null, null], [0, "이부", null, 0, null, 31, 36, 74, 0, 160, 300, null, null],
[0, "왕업", null, 0, null, 33, 6, 35, 0, 160, 300, null, null], [0, "왕업", null, 0, null, 33, 6, 35, 0, 160, 300, null, null],
[0, "좌혁", null, 0, null, 62, 66, 51, 0, 160, 300, null, null], [0, "좌혁", null, 0, null, 62, 66, 51, 0, 160, 300, null, null],
[0, "화타", null, 0, null, 57, 25, 73, 0, 160, 300, null, null], [0, "화타", null, 0, null, 57, 25, 73, 0, 160, 300, null, null],
[0, "사마휘", null, 0, null, 55, 26, 82, 0, 160, 300, null, null], [0, "사마휘", null, 0, null, 55, 26, 82, 0, 160, 300, null, null],
[0, "우길", null, 0, null, 23, 15, 90, 0, 160, 300, null, null], [0, "우길", null, 0, null, 23, 15, 90, 0, 160, 300, null, null],
[0, "헌제", null, 0, null, 22, 18, 68, 0, 160, 300, null, null], [0, "헌제", null, 0, null, 22, 18, 68, 0, 160, 300, null, null],
[0, "백기", null, 0, null, 100, 88, 69, 0, 160, 300, null, null], [0, "백기", null, 0, null, 100, 88, 69, 0, 160, 300, null, null],
[0, "한신", null, 0, null, 100, 74, 95, 0, 160, 300, null, null], [0, "한신", null, 0, null, 100, 74, 95, 0, 160, 300, null, null],
[0, "악비", null, 0, null, 99, 91, 71, 0, 160, 300, null, null], [0, "악비", null, 0, null, 99, 91, 71, 0, 160, 300, null, null],
[0, "항적", null, 0, null, 99, 100, 65, 0, 160, 300, null, null], [0, "항적", null, 0, null, 99, 100, 65, 0, 160, 300, null, null],
[0, "악의", null, 0, null, 98, 75, 96, 0, 160, 300, null, null], [0, "악의", null, 0, null, 98, 75, 96, 0, 160, 300, null, null],
[0, "영정", null, 0, null, 97, 55, 92, 0, 160, 300, null, null], [0, "영정", null, 0, null, 97, 55, 92, 0, 160, 300, null, null],
[0, "강상", null, 0, null, 94, 49, 100, 0, 160, 300, null, null], [0, "강상", null, 0, null, 94, 49, 100, 0, 160, 300, null, null],
[0, "전단2", null, 0, null, 96, 75, 95, 0, 160, 300, null, null], [0, "전단2", null, 0, null, 96, 75, 95, 0, 160, 300, null, null],
[0, "이목", null, 0, null, 96, 69, 88, 0, 160, 300, null, null], [0, "이목", null, 0, null, 96, 69, 88, 0, 160, 300, null, null],
[0, "염파", null, 0, null, 97, 96, 75, 0, 160, 300, null, null], [0, "염파", null, 0, null, 97, 96, 75, 0, 160, 300, null, null],
[0, "왕전", null, 0, null, 94, 64, 83, 0, 160, 300, null, null], [0, "왕전", null, 0, null, 94, 64, 83, 0, 160, 300, null, null],
[0, "오기", null, 0, null, 94, 66, 95, 0, 160, 300, null, null], [0, "오기", null, 0, null, 94, 66, 95, 0, 160, 300, null, null],
[0, "곽거병", null, 0, null, 93, 92, 53, 0, 160, 300, null, null], [0, "곽거병", null, 0, null, 93, 92, 53, 0, 160, 300, null, null],
[0, "영포", null, 0, null, 82, 91, 54, 0, 160, 300, null, null], [0, "영포", null, 0, null, 82, 91, 54, 0, 160, 300, null, null],
[0, "이신", null, 0, null, 81, 88, 63, 0, 160, 300, null, null], [0, "이신", null, 0, null, 81, 88, 63, 0, 160, 300, null, null],
[0, "몽념", null, 0, null, 87, 86, 65, 0, 160, 300, null, null], [0, "몽념", null, 0, null, 87, 86, 65, 0, 160, 300, null, null],
[0, "전기", null, 0, null, 80, 85, 44, 0, 160, 300, null, null], [0, "전기", null, 0, null, 80, 85, 44, 0, 160, 300, null, null],
[0, "극신", null, 0, null, 76, 83, 42, 0, 160, 300, null, null], [0, "극신", null, 0, null, 76, 83, 42, 0, 160, 300, null, null],
[0, "항연", null, 0, null, 89, 80, 61, 0, 160, 300, null, null], [0, "항연", null, 0, null, 89, 80, 61, 0, 160, 300, null, null],
[0, "인상여", null, 0, null, 69, 38, 96, 0, 160, 300, null, null], [0, "인상여", null, 0, null, 69, 38, 96, 0, 160, 300, null, null],
[0, "장자방", null, 0, null, 72, 40, 100, 0, 160, 300, null, null], [0, "장자방", null, 0, null, 72, 40, 100, 0, 160, 300, null, null],
[0, "관이오", null, 0, null, 85, 64, 99, 0, 160, 300, null, null], [0, "관이오", null, 0, null, 85, 64, 99, 0, 160, 300, null, null],
[0, "손빈", null, 0, null, 83, 22, 98, 0, 160, 300, null, null], [0, "손빈", null, 0, null, 83, 22, 98, 0, 160, 300, null, null],
[0, "소진", null, 0, null, 90, 47, 96, 0, 160, 300, null, null], [0, "소진", null, 0, null, 90, 47, 96, 0, 160, 300, null, null],
[0, "범증", null, 0, null, 68, 24, 94, 0, 160, 300, null, null], [0, "범증", null, 0, null, 68, 24, 94, 0, 160, 300, null, null],
[0, "장의2", null, 0, null, 75, 23, 93, 0, 160, 300, null, null], [0, "장의2", null, 0, null, 75, 23, 93, 0, 160, 300, null, null],
[0, "공구", null, 0, null, 68, 70, 91, 0, 160, 300, null, null], [0, "공구", null, 0, null, 68, 70, 91, 0, 160, 300, null, null],
[0, "소하", null, 0, null, 56, 27, 97, 0, 160, 300, null, null], [0, "소하", null, 0, null, 56, 27, 97, 0, 160, 300, null, null],
[0, "한비", null, 0, null, 49, 18, 97, 0, 160, 300, null, null], [0, "한비", null, 0, null, 49, 18, 97, 0, 160, 300, null, null],
[0, "이사", null, 0, null, 48, 24, 95, 0, 160, 300, null, null], [0, "이사", null, 0, null, 48, 24, 95, 0, 160, 300, null, null],
[0, "전문", null, 0, null, 79, 67, 89, 0, 160, 300, null, null], [0, "전문", null, 0, null, 79, 67, 89, 0, 160, 300, null, null],
[0, "황헐", null, 0, null, 81, 68, 88, 0, 160, 300, null, null], [0, "황헐", null, 0, null, 81, 68, 88, 0, 160, 300, null, null],
[0, "방난", null, 0, null, 88, 95, 66, 0, 160, 300, null, null], [0, "방난", null, 0, null, 88, 95, 66, 0, 160, 300, null, null],
[0, "개섭", null, 0, null, 43, 97, 54, 0, 160, 300, null, null], [0, "개섭", null, 0, null, 43, 97, 54, 0, 160, 300, null, null],
[0, "형가", null, 0, null, 42, 89, 43, 0, 160, 300, null, null], [0, "형가", null, 0, null, 42, 89, 43, 0, 160, 300, null, null],
[0, "유방", null, 0, null, 90, 66, 85, 0, 160, 300, null, null], [0, "유방", null, 0, null, 90, 66, 85, 0, 160, 300, null, null],
[0, "사스케", null, 0, "복양", 109, 43, 118, 0, 160, 300, "출세", "돌격", "언젠가는 제 기록을 넘겨주실 분도 나오길 바랍니다"], [0, "사스케", null, 0, "복양", 109, 43, 118, 0, 160, 300, "출세", "돌격", "언젠가는 제 기록을 넘겨주실 분도 나오길 바랍니다"],
[0, "4水Ke", null, 0, null, 70, 99, 51, 0, 160, 300, null, null], [0, "4水Ke", null, 0, null, 70, 99, 51, 0, 160, 300, null, null],
[0, "나루토", null, 0, null, 80, 100, 6, 0, 160, 300, null, null, "나루토 사스케 싸움 레알 실화냐"], [0, "나루토", null, 0, null, 80, 100, 6, 0, 160, 300, null, null, "나루토 사스케 싸움 레알 실화냐"],
[0, "달스케", null, 0, null, 73, 97, 43, 0, 160, 300, null, null], [0, "달스케", null, 0, null, 73, 97, 43, 0, 160, 300, null, null],
[0, "독스케", null, 0, null, 79, 91, 46, 0, 160, 300, null, null], [0, "독스케", null, 0, null, 79, 91, 46, 0, 160, 300, null, null],
[0, "마스케", null, 0, null, 74, 96, 45, 0, 160, 300, null, null], [0, "마스케", null, 0, null, 74, 96, 45, 0, 160, 300, null, null, "픽스터 트롤링 ON"],
[0, "사람쥐", null, 0, null, 77, 42, 93, 0, 160, 300, null, null, "사람쥐는 위대하고 그 외에 다른 설치류는 없다"], [0, "사람쥐", null, 0, null, 77, 42, 93, 0, 160, 300, null, null, "사람쥐는 위대하고 그 외에 다른 설치류는 없다"],
[0, "사숙개", null, 0, null, 78, 91, 44, 0, 160, 300, null, null], [0, "사숙개", null, 0, null, 78, 91, 44, 0, 160, 300, null, null],
[0, "사스가키", null, 0, null, 71, 99, 47, 0, 160, 300, null, null, "허~접♡"], [0, "사스가키", null, 0, null, 71, 99, 47, 0, 160, 300, null, null, "허~접♡"],
[0, "사스캣", null, 0, null, 70, 48, 99, 0, 160, 300, null, null, "냐옹"], [0, "사스캣", null, 0, null, 70, 48, 99, 0, 160, 300, null, null, "냐옹"],
[0, "사스케롱", null, 0, null, 77, 44, 92, 0, 160, 300, null, null], [0, "사스케롱", null, 0, null, 77, 44, 92, 0, 160, 300, null, null],
[0, "사슥개", null, 0, null, 79, 89, 39, 0, 160, 300, null, null], [0, "사슥개", null, 0, null, 79, 89, 39, 0, 160, 300, null, null],
[0, "사슥게", null, 0, null, 69, 99, 39, 0, 160, 300, null, null], [0, "사슥게", null, 0, null, 69, 99, 39, 0, 160, 300, null, null],
[0, "소숙꺄", null, 0, null, 79, 73, 11, 0, 160, 300, null, null, "ㅗㅜㅑ"], [0, "소숙꺄", null, 0, null, 79, 73, 11, 0, 160, 300, null, null, "ㅗㅜㅑ"],
[0, "스켓맨", null, 0, null, 32, 86, 97, 0, 160, 300, null, null, "암어스켓맨"], [0, "스켓맨", null, 0, null, 32, 86, 97, 0, 160, 300, null, null, "암어스켓맨"],
[0, "쌰쓖꼐", null, 0, null, 75, 43, 94, 0, 160, 300, null, null], [0, "쌰쓖꼐", null, 0, null, 75, 43, 94, 0, 160, 300, null, null],
[0, "앵드케", null, 0, null, 78, 46, 92, 0, 160, 300, null, null, "히힛 오줌 발싸!!"], [0, "앵드케", null, 0, null, 78, 46, 92, 0, 160, 300, null, null, "히힛 오줌 발싸!!"],
[0, "야스케", null, 0, null, 78, 47, 92, 0, 160, 300, null, null, "날 추방했으니 그 복수로 적국에 정보를 팔아 넘겨야겠군요. 그럼 이만."], [0, "야스케", null, 0, null, 78, 47, 92, 0, 160, 300, null, null, "날 추방했으니 그 복수로 적국에 정보를 팔아 넘겨야겠군요. 그럼 이만."],
[0, "오스케", null, 0, null, 77, 41, 93, 0, 160, 300, null, null, "저는 배신자입니다"], [0, "오스케", null, 0, null, 77, 41, 93, 0, 160, 300, null, null, "저는 배신자입니다"],
[0, "유스케", null, 0, null, 76, 46, 94, 0, 160, 300, null, null], [0, "유스케", null, 0, null, 76, 46, 94, 0, 160, 300, null, null],
[0, "일스케", null, 0, null, 11, 11, 1, 0, 160, 300, null, null], [0, "일스케", null, 0, null, 11, 11, 1, 0, 160, 300, null, null],
[0, "이스케", null, 0, null, 22, 2, 22, 0, 160, 300, null, null], [0, "이스케", null, 0, null, 22, 2, 22, 0, 160, 300, null, null],
[0, "삼수케", null, 0, null, 3, 33, 33, 0, 160, 300, null, null, "대학 입시를 3번 치르는 삼수케"], [0, "삼수케", null, 0, null, 3, 33, 33, 0, 160, 300, null, null, "대학 입시를 3번 치르는 삼수케"],
[0, "사시케", null, 0, null, 44, 44, 44, 0, 160, 300, null, null], [0, "사시케", null, 0, null, 44, 44, 44, 0, 160, 300, null, null],
[0, "사륜안", null, 0, null, 72, 49, 98, 0, 160, 300, null, null], [0, "사륜안", null, 0, null, 72, 49, 98, 0, 160, 300, null, null],
[0, "네시", null, 0, "교지", 103, 119, 45, 0, 160, 300, "출세", "필살", "안 자고 싸우면 이겨요"], [0, "사사게", null, 0, null, 76, 95, 43, 0, 160, 300, null, null],
[0, "시", null, 0, null, 77, 43, 92, 0, 160, 300, null, null, "충성!"], [0, "시", null, 0, "교지", 103, 119, 45, 0, 160, 300, "출세", "필살", "안 자고 싸우면 이겨요"],
[0, "시", null, 0, null, 71, 47, 99, 0, 160, 300, null, null, "ㅁㄹ"], [0, "시", null, 0, null, 77, 43, 92, 0, 160, 300, null, null, "충성!"],
[0, "시", null, 0, null, 76, 44, 94, 0, 160, 300, null, null, "ㅅㅇㄹㄹ"], [0, "시", null, 0, null, 71, 47, 99, 0, 160, 300, null, null, "ㄹ"],
[0, "시", null, 0, null, 73, 97, 46, 0, 160, 300, null, null, "안 살리고 죽이면 이겨요"], [0, "시", null, 0, null, 76, 44, 94, 0, 160, 300, null, null, "ㅅㅇㄹㄹ"],
[0, "다섯시", null, 0, null, 75, 95, 45, 0, 160, 300, null, null], [0, "시", null, 0, null, 73, 97, 46, 0, 160, 300, null, null, "안 살리고 죽이면 이겨요"],
[0, "섯시", null, 0, null, 72, 48, 97, 0, 160, 300, null, null], [0, "섯시", null, 0, null, 75, 95, 45, 0, 160, 300, null, null],
[0, "일곱시", null, 0, null, 77, 93, 43, 0, 160, 300, null, null], [0, "여섯시", null, 0, null, 72, 48, 97, 0, 160, 300, null, null],
[0, "여덟시", null, 0, null, 76, 42, 94, 0, 160, 300, null, null], [0, "일곱시", null, 0, null, 77, 93, 43, 0, 160, 300, null, null],
[0, "아홉시", null, 0, null, 74, 44, 96, 0, 160, 300, null, null], [0, "여덟시", null, 0, null, 76, 42, 94, 0, 160, 300, null, null],
[0, "시", null, 0, null, 10, 10, 10, 0, 160, 300, null, null], [0, "아홉시", null, 0, null, 74, 44, 96, 0, 160, 300, null, null],
[0, "열시", null, 0, null, 11, 11, 11, 0, 160, 300, null, null], [0, "열시", null, 0, null, 10, 10, 10, 0, 160, 300, null, null],
[0, "열시", null, 0, null, 12, 12, 12, 0, 160, 300, null, null], [0, "열시", null, 0, null, 11, 11, 11, 0, 160, 300, null, null],
[0, "셀레미", null, 0, "안정", 104, 47, 114, 0, 160, 300, "출세", "환술", "식물키우세요🍀"], [0, "열두시", null, 0, null, 12, 12, 12, 0, 160, 300, null, null],
[0, "몬스테라", null, 0, null, 79, 44, 81, 0, 160, 300, null, null], [0, "셀레미", null, 0, "안정", 104, 47, 114, 0, 160, 300, "출세", "환술", "식물키우세요🍀"],
[0, "아단소니", null, 0, null, 80, 90, 42, 0, 160, 300, null, null, "구멍뿅뿅"], [0, "몬스테라", null, 0, null, 79, 44, 81, 0, 160, 300, null, null],
[0, "마니홋", null, 0, null, 74, 43, 86, 0, 160, 300, null, null], [0, "아단소니", null, 0, null, 80, 90, 42, 0, 160, 300, null, null, "구멍뿅뿅"],
[0, "두비아", null, 0, null, 79, 91, 46, 0, 160, 300, null, null, "크게 키워주실래요?"], [0, "마니홋", null, 0, null, 74, 43, 86, 0, 160, 300, null, null],
[0, "마요이", null, 0, null, 80, 46, 90, 0, 160, 300, null, null, "달팽이 아니고 식물입니다"], [0, "두비아", null, 0, null, 79, 91, 46, 0, 160, 300, null, null, "크게 키워주실래요?"],
[0, "에스쿠엘레토", null, 0, null, 66, 38, 78, 0, 160, 300, null, null], [0, "마요이", null, 0, null, 80, 46, 90, 0, 160, 300, null, null, "달팽이 아니고 식물입니다"],
[0, "라니아타", null, 0, null, 65, 41, 82, 0, 160, 300, null, null], [0, "에스쿠엘레토", null, 0, null, 66, 38, 78, 0, 160, 300, null, null],
[0, "파스타짜넘", null, 0, null, 78, 92, 44, 0, 160, 300, null, null, "빵~덕♡"], [0, "라니아타", null, 0, null, 65, 41, 82, 0, 160, 300, null, null],
[0, "플로우마니", null, 0, null, 76, 43, 94, 0, 160, 300, null, null, "블랙페이스 감상하세요"], [0, "파스타짜넘", null, 0, null, 78, 92, 44, 0, 160, 300, null, null, "빵~덕♡"],
[0, "도메스티컴", null, 0, null, 65, 45, 81, 0, 160, 300, null, null], [0, "플로우마니", null, 0, null, 76, 43, 94, 0, 160, 300, null, null, "블랙페이스 감상하세요"],
[0, "지펠리움", null, 0, null, 69, 91, 55, 0, 160, 300, null, null], [0, "도메스티컴", null, 0, null, 65, 45, 81, 0, 160, 300, null, null],
[0, "버럴막스", null, 0, null, 78, 45, 92, 0, 160, 300, null, null, "정신팔면 괴물을 보실걸요?"], [0, "지펠리움", null, 0, null, 69, 91, 55, 0, 160, 300, null, null],
[0, "테뉴", null, 0, null, 74, 89, 45, 0, 160, 300, null, null], [0, "버럴막스", null, 0, null, 78, 45, 92, 0, 160, 300, null, null, "정신팔면 괴물을 보실걸요?"],
[0, "샤로니에", null, 0, null, 76, 94, 47, 0, 160, 300, null, null, "빨래판 키우세요"], [0, "테뉴", null, 0, null, 74, 89, 45, 0, 160, 300, null, null],
[0, "베루코섬", null, 0, null, 58, 92, 58, 0, 160, 300, null, null], [0, "샤로니에", null, 0, null, 76, 94, 47, 0, 160, 300, null, null, "빨래판 키우세요"],
[0, "소디로이", null, 0, null, 67, 46, 83, 0, 160, 300, null, null], [0, "베루코섬", null, 0, null, 58, 92, 58, 0, 160, 300, null, null],
[0, "브랜티아넘", null, 0, null, 75, 95, 45, 0, 160, 300, null, null, "3촉 합식하시면 이뻐요"], [0, "소디로이", null, 0, null, 67, 46, 83, 0, 160, 300, null, null],
[0, "페페", null, 0, null, 74, 96, 46, 0, 160, 300, null, null, "페페페페펲페페페페페페페페페페페ㅔㅍ페"], [0, "브랜티아넘", null, 0, null, 75, 95, 45, 0, 160, 300, null, null, "3촉 합식하시면 이뻐요"],
[0, "워터코인", null, 0, null, 78, 44, 93, 0, 160, 300, null, null, "코인하세요"], [0, "페페", null, 0, null, 74, 96, 46, 0, 160, 300, null, null, "페페페페펲페페페페페페페페페페페ㅔㅍ페"],
[0, "마제스틱", null, 0, null, 59, 54, 84, 0, 160, 300, null, null], [0, "워터코인", null, 0, null, 78, 44, 93, 0, 160, 300, null, null, "코인하세요"],
[0, "홀타니아넘", null, 0, null, 74, 96, 47, 0, 160, 300, null, null, "토끼귀 끝판왕"], [0, "마제스틱", null, 0, null, 59, 54, 84, 0, 160, 300, null, null],
[0, "서펜스", null, 0, null, 73, 97, 44, 0, 160, 300, null, null, "다시 비싸지고 싶어요"], [0, "홀타니아넘", null, 0, null, 74, 96, 47, 0, 160, 300, null, null, "토끼귀 끝판왕"],
[0, "마크로리자", null, 0, null, 75, 46, 94, 0, 160, 300, null, null, "자구 캐가세요"], [0, "서펜스", null, 0, null, 73, 97, 44, 0, 160, 300, null, null, "다시 비싸지고 싶어요"],
[0, "럭셔리안스", null, 0, null, 66, 35, 89, 0, 160, 300, null, null], [0, "마크로리자", null, 0, null, 75, 46, 94, 0, 160, 300, null, null, "자구 캐가세요"],
[0, "호말로메나", null, 0, null, 68, 43, 82, 0, 160, 300, null, null], [0, "럭셔리안스", null, 0, null, 66, 35, 89, 0, 160, 300, null, null],
[0, "에오스", null, 0, null, 72, 98, 43, 0, 160, 300, null, null, "에이스 오브 스페이드!"], [0, "호말로메나", null, 0, null, 68, 43, 82, 0, 160, 300, null, null],
[0, "벨벳마스크", null, 0, null, 67, 87, 47, 0, 160, 300, null, null], [0, "에오스", null, 0, null, 72, 98, 43, 0, 160, 300, null, null, "에이스 오브 스페이드!"],
[0, "다크마마", null, 0, null, 45, 58, 67, 0, 160, 300, null, null], [0, "벨벳마스크", null, 0, null, 67, 87, 47, 0, 160, 300, null, null],
[0, "미칸", null, 0, null, 71, 99, 42, 0, 160, 300, null, null, "벽에 태워주세요 행잉도 좋아요"], [0, "다크마마", null, 0, null, 45, 58, 67, 0, 160, 300, null, null],
[0, "아이비", null, 0, null, 70, 42, 100, 0, 160, 300, null, null, "반딧불이, 백설공주가 이뻐요"], [0, "미칸", null, 0, null, 71, 99, 42, 0, 160, 300, null, null, "벽에 태워주세요 행잉도 좋아요"],
[0, "도라야끼", null, 0, null, 98, 63, 44, 0, 160, 300, null, null], [0, "아이비", null, 0, null, 70, 42, 100, 0, 160, 300, null, null, "반딧불이, 백설공주가 이뻐요"],
[0, "메그니피컴", null, 0, null, 47, 68, 15, 0, 160, 300, null, null], [0, "도라야끼", null, 0, null, 98, 63, 44, 0, 160, 300, null, null],
[0, "베이치", null, 0, null, 70, 100, 41, 0, 160, 300, null, null, "샤로니에 빨래판 저리가라"], [0, "메그니피컴", null, 0, null, 47, 68, 15, 0, 160, 300, null, null],
[0, "바라오아넘", null, 0, null, 39, 43, 77, 0, 160, 300, null, null, "날렵한 미모!"], [0, "베이치", null, 0, null, 70, 100, 41, 0, 160, 300, null, null, "샤로니에 빨래판 저리가라"],
[0, "포게티그린", null, 0, null, 68, 41, 93, 0, 160, 300, null, null], [0, "바라오아넘", null, 0, null, 39, 43, 77, 0, 160, 300, null, null, "날렵한 미모!"],
[0, "플로리다뷰티", null, 0, null, 71, 45, 99, 0, 160, 300, null, null, "무늬가 나올줄알았지?"], [0, "포게티그린", null, 0, null, 68, 41, 93, 0, 160, 300, null, null],
[0, "스킨답서스", null, 0, null, 62, 86, 59, 0, 160, 300, null, null], [0, "플로리다뷰티", null, 0, null, 71, 45, 99, 0, 160, 300, null, null, "무늬가 나올줄알았지?"],
[0, "호야", null, 0, null, 93, 80, 51, 0, 160, 300, null, null, "호야꿀드새오"], [0, "스킨답서스", null, 0, null, 62, 86, 59, 0, 160, 300, null, null],
[0, "극락조", null, 0, null, 73, 41, 97, 0, 160, 300, null, null, "꽃 피 워 줘"], [0, "호야", null, 0, null, 93, 80, 51, 0, 160, 300, null, null, "호야꿀드새오"],
[0, "여인초", null, 0, null, 75, 95, 43, 0, 160, 300, null, null, "방심하면 커집니다?!"], [0, "극락조", null, 0, null, 73, 41, 97, 0, 160, 300, null, null, "꽃 피 워 줘"],
[0, "제라늄", null, 0, null, 64, 57, 83, 0, 160, 300, null, null], [0, "여인초", null, 0, null, 75, 95, 43, 0, 160, 300, null, null, "방심하면 커집니다?!"],
[0, "베고니아", null, 0, null, 37, 23, 48, 0, 160, 300, null, null], [0, "제라늄", null, 0, null, 64, 57, 83, 0, 160, 300, null, null],
[0, "위시본", null, 0, null, 23, 54, 12, 0, 160, 300, null, null], [0, "베고니아", null, 0, null, 37, 23, 48, 0, 160, 300, null, null],
[0, "박쥐란", null, 0, null, 76, 93, 47, 0, 160, 300, null, null, "걸어키워주세요"], [0, "위시본", null, 0, null, 23, 54, 12, 0, 160, 300, null, null],
[0, "골든드래곤", null, 0, null, 73, 45, 97, 0, 160, 300, null, null, "고가종 3대장 골든바리!"], [0, "박쥐란", null, 0, null, 76, 93, 47, 0, 160, 300, null, null],
[0, "빌리에티에", null, 0, null, 72, 44, 98, 0, 160, 300, null, null, "고가종 3대장 빌리바리!"], [0, "골든드래곤", null, 0, null, 73, 45, 97, 0, 160, 300, null, null, "고가종 3대장 골든바리!"],
[0, "윌리엄씨", null, 0, null, 77, 93, 46, 0, 160, 300, null, null, "고가종 3대장 윌리엄씨바리!"], [0, "빌리에티에", null, 0, null, 72, 44, 98, 0, 160, 300, null, null, "고가종 3대장 빌리바리!"],
[0, "멜라노", null, 0, null, 67, 83, 41, 0, 160, 300, null, null], [0, "윌리엄씨", null, 0, null, 77, 93, 46, 0, 160, 300, null, null, "고가종 3대장 윌리엄씨바리!"],
[0, "기가스", null, 0, null, 76, 43, 94, 0, 160, 300, null, null, "순화지옥일껄요"], [0, "멜라노", null, 0, null, 67, 83, 41, 0, 160, 300, null, null],
[0, "캄포스", null, 0, null, 62, 47, 81, 0, 160, 300, null, null], [0, "기가스", null, 0, null, 76, 43, 94, 0, 160, 300, null, null, "순화지옥일껄요"],
[0, "글로리오섬", null, 0, null, 78, 92, 44, 0, 160, 300, null, null, "남미가 좋아요"], [0, "캄포스", null, 0, null, 62, 47, 81, 0, 160, 300, null, null],
[0, "글로리어스", null, 0, null, 75, 44, 95, 0, 160, 300, null, null, "기어다니기 싫어서 위로 자랄래요"], [0, "글로리오섬", null, 0, null, 78, 92, 44, 0, 160, 300, null, null, "남미가 좋아요"],
[0, "베멜하", null, 0, null, 92, 39, 81, 0, 160, 300, null, null, "잡종이라고 무시하지마세요"], [0, "글로리어스", null, 0, null, 75, 44, 95, 0, 160, 300, null, null, "기어다니기 싫어서 위로 자랄래요"],
[0, "오블리쿠아", null, 0, null, 79, 91, 46, 0, 160, 300, null, null, "이보다 더 큰 구멍은 없다"], [0, "베멜하", null, 0, null, 92, 39, 81, 0, 160, 300, null, null, "잡종이라고 무시하지마세요"],
[0, "라디아튬", null, 0, null, 79, 46, 91, 0, 160, 300, null, null, "마요이랑 헷갈리지마세요"], [0, "오블리쿠아", null, 0, null, 79, 91, 46, 0, 160, 300, null, null, "이보다 더 큰 구멍은 없다"],
[0, "싱고니움", null, 0, null, 68, 56, 84, 0, 160, 300, null, null], [0, "라디아튬", null, 0, null, 79, 46, 91, 0, 160, 300, null, null, "마요이랑 헷갈리지마세요"],
[0, "애기모람", null, 0, null, 80, 44, 90, 0, 160, 300, null, null, "응애"], [0, "싱고니움", null, 0, null, 68, 56, 84, 0, 160, 300, null, null],
[0, "정승필", null, 0, "오", 107, 118, 42, 0, 160, 300, "출세", "견고", "건업만큼은 안된다 이놈들아!"], [0, "애기모람", null, 0, null, 80, 44, 90, 0, 160, 300, null, null, "응애"],
[0, "Faker", null, 0, null, 15, 99, 100, 0, 160, 300, null, "발명", "기부는 저처럼 돈 많은 사람들이 많이 하면 됩니다"], [0, "정승필", null, 0, "오", 107, 118, 42, 0, 160, 300, "출세", "견고", "건업만큼은 안된다 이놈들아!"],
[0, "길가승필메시", null, 0, null, 70, 100, 41, 0, 160, 300, null, null, "길가승필메시, 그는 보호자입니다. 그의 특기는 강한 펀치죠"], [0, "Faker", null, 0, null, 15, 99, 100, 0, 160, 300, null, "발명", "기부는 저처럼 돈 많은 사람들이 많이 하면 됩니다"],
[0, "닥터승필레인지", null, 0, null, 72, 44, 98, 0, 160, 300, null, null], [0, "길가승필메시", null, 0, null, 70, 100, 41, 0, 160, 300, null, null, "길가승필메시, 그는 보호자입니다. 그의 특기는 강한 펀치죠"],
[0, "도르마승필무", null, 0, null, 73, 43, 97, 0, 160, 300, null, null, "모든건 승필 뜻 대로.."], [0, "닥터승필레인지", null, 0, null, 72, 44, 98, 0, 160, 300, null, null],
[0, "로키승필", null, 0, null, 74, 42, 96, 0, 160, 300, null, null], [0, "도르마승필", null, 0, null, 73, 43, 97, 0, 160, 300, null, null, "모든건 승필 뜻 대로.."],
[0, "블랙승필팬서", null, 0, null, 71, 47, 99, 0, 160, 300, null, null, "와칸다 포에버!"], [0, "로키승필", null, 0, null, 74, 42, 96, 0, 160, 300, null, null],
[0, "비전승필", null, 0, null, 69, 41, 101, 0, 160, 300, null, null], [0, "블랙승필팬서", null, 0, null, 71, 47, 99, 0, 160, 300, null, null, "와칸다 포에버!"],
[0, "샹치승필", null, 0, null, 79, 91, 46, 0, 160, 300, null, null], [0, "비전승필", null, 0, null, 69, 41, 101, 0, 160, 300, null, null],
[0, "슈리승필", null, 0, null, 70, 43, 100, 0, 160, 300, null, null, "와칸다 포에버!"], [0, "샹치승필", null, 0, null, 79, 91, 46, 0, 160, 300, null, null],
[0, "스칼렛승필위치", null, 0, null, 76, 45, 94, 0, 160, 300, null, null], [0, "슈리승필", null, 0, null, 70, 43, 100, 0, 160, 300, null, null, "와칸다 포에버!"],
[0, "스파이더승필맨", null, 0, null, 78, 92, 42, 0, 160, 300, null, null], [0, "스칼렛승필위치", null, 0, null, 76, 45, 94, 0, 160, 300, null, null],
[0, "승루트", null, 0, null, 65, 38, 89, 0, 160, 300, null, null, "I'm Seungroot"], [0, "스파이더승필맨", null, 0, null, 78, 92, 42, 0, 160, 300, null, null],
[0, "승필위도우", null, 0, null, 75, 45, 95, 0, 160, 300, null, null], [0, "승루트", null, 0, null, 65, 38, 89, 0, 160, 300, null, null, "I'm Seungroot"],
[0, "승필", null, 0, null, 75, 95, 44, 0, 160, 300, null, null], [0, "승필위도우", null, 0, null, 75, 45, 95, 0, 160, 300, null, null],
[0, "아이언승필", null, 0, null, 70, 46, 100, 0, 160, 300, null, null, "I'm IronSeungpil"], [0, "승필", null, 0, null, 75, 95, 44, 0, 160, 300, null, null],
[0, "앤트승필", null, 0, null, 69, 88, 56, 0, 160, 300, null, null], [0, "아이언승필", null, 0, null, 70, 46, 100, 0, 160, 300, null, null, "I'm IronSeungpil"],
[0, "워승필머신", null, 0, null, 72, 98, 45, 0, 160, 300, null, null], [0, "앤트승필맨", null, 0, null, 69, 88, 56, 0, 160, 300, null, null],
[0, "윈터승필솔져", null, 0, null, 77, 93, 43, 0, 160, 300, null, null], [0, "워승필머신", null, 0, null, 72, 98, 45, 0, 160, 300, null, null],
[0, "정승필실종사건", null, 0, null, 79, 45, 91, 0, 160, 300, null, null, "승필 실종됨 ㄷㄷㄷ"], [0, "윈터승필솔져", null, 0, null, 77, 93, 43, 0, 160, 300, null, null],
[0, "승필", null, 0, null, 80, 44, 90, 0, 160, 300, null, null], [0, "승필실종사건", null, 0, null, 79, 45, 91, 0, 160, 300, null, null, "정승필 실종됨 ㄷㄷㄷㄷ"],
[0, "캡틴승필리카", null, 0, null, 80, 90, 44, 0, 160, 300, null, null], [0, "찐승필", null, 0, null, 80, 44, 90, 0, 160, 300, null, null],
[0, "퀵승필", null, 0, null, 68, 88, 43, 0, 160, 300, null, null], [0, "캡틴승필리카", null, 0, null, 80, 90, 44, 0, 160, 300, null, null],
[0, "타노승필", null, 0, null, 71, 99, 48, 0, 160, 300, null, null], [0, "승필", null, 0, null, 68, 88, 43, 0, 160, 300, null, null],
[0, "토르승필", null, 0, null, 77, 47, 93, 0, 160, 300, null, null], [0, "타노승필", null, 0, null, 71, 99, 48, 0, 160, 300, null, null],
[0, "헐크승필", null, 0, null, 72, 99, 40, 0, 160, 300, null, null], [0, "토르승필", null, 0, null, 77, 47, 93, 0, 160, 300, null, null],
[0, "크승필아이", null, 0, null, 78, 89, 46, 0, 160, 300, null, null], [0, "크승필", null, 0, null, 72, 99, 40, 0, 160, 300, null, null],
[0, "하츄핑", null, 0, "홍농", 103, 46, 116, 0, 160, 300, "출세", "집중", "애교가 넘치는 사랑의 티니핑, 츄!"], [0, "호크승필아이", null, 0, null, 78, 89, 46, 0, 160, 300, null, null],
[0, "바로핑", null, 0, null, 72, 46, 98, 0, 160, 300, null, null, "바로핑에게 맡겨주세요, 바롬!"], [0, "하츄핑", null, 0, "홍농", 103, 46, 116, 0, 160, 300, "출세", "집중", "애교가 넘치는 사랑의 티니핑, 츄!"],
[0, "아자핑", null, 0, null, 79, 92, 42, 0, 160, 300, null, null, "내가 저 친구를 도와주지, 아자!"], [0, "바로핑", null, 0, null, 72, 46, 98, 0, 160, 300, null, null, "바로핑에게 맡겨주세요, 바롬!"],
[0, "차차핑", null, 0, null, 74, 44, 96, 0, 160, 300, null, null, "차차핑이 희망을 줄게, 차차~"], [0, "아자핑", null, 0, null, 79, 92, 42, 0, 160, 300, null, null, "내가 저 친구를 도와주지, 아자!"],
[0, "라라핑", null, 0, null, 77, 43, 93, 0, 160, 300, null, null, "난 이모션 왕국에서 온 라라핑이라고 해! 만나서 반가워, 라랑♪"], [0, "차차핑", null, 0, null, 74, 44, 96, 0, 160, 300, null, null, "차차핑이 희망을 줄게, 차차~"],
[0, "핑", null, 0, null, 79, 42, 91, 0, 160, 300, null, null, "해핑은 행복해~! 해피!"], [0, "라라핑", null, 0, null, 77, 43, 93, 0, 160, 300, null, null, "난 이모션 왕국에서 온 라라핑이라고 해! 만나서 반가워, 라랑♪"],
[0, "조아핑", null, 0, null, 78, 91, 41, 0, 160, 300, null, null, "우린... 친구들을 구하고 싶었어요, 조아!"], [0, "핑", null, 0, null, 79, 42, 91, 0, 160, 300, null, null, "해핑은 행복해~! 해피!"],
[0, "믿어핑", null, 0, null, 76, 45, 94, 0, 160, 300, null, null, "와아~! 네 말이 맞아, 미더!"], [0, "조아핑", null, 0, null, 78, 91, 41, 0, 160, 300, null, null, "우린... 친구들을 구하고 싶었어요, 조아!"],
[0, "방글핑", null, 0, null, 75, 95, 45, 0, 160, 300, null, null, "꺄항~ 재밌겠다~! 나나나나! 내가 할래! 방글~"], [0, "믿어핑", null, 0, null, 76, 45, 94, 0, 160, 300, null, null, "와아~! 네 말이 맞아, 미더!"],
[0, "키키핑", null, 0, null, 66, 88, 39, 0, 160, 300, null, null], [0, "방글핑", null, 0, null, 75, 95, 45, 0, 160, 300, null, null, "꺄항~ 재밌겠다~! 나나나나! 내가 할래! 방글~"],
[0, "아잉핑", null, 0, null, 74, 39, 80, 0, 160, 300, null, null], [0, "키키핑", null, 0, null, 66, 88, 39, 0, 160, 300, null, null],
[0, "부끄핑", null, 0, null, 69, 85, 39, 0, 160, 300, null, null], [0, "아잉핑", null, 0, null, 74, 39, 80, 0, 160, 300, null, null],
[0, "부핑", null, 0, null, 71, 39, 83, 0, 160, 300, null, null], [0, "부핑", null, 0, null, 69, 85, 39, 0, 160, 300, null, null],
[0, "깜빡핑", null, 0, null, 72, 82, 39, 0, 160, 300, null, null], [0, "부투핑", null, 0, null, 71, 39, 83, 0, 160, 300, null, null],
[0, "띠용핑", null, 0, null, 68, 39, 86, 0, 160, 300, null, null], [0, "깜빡핑", null, 0, null, 72, 82, 39, 0, 160, 300, null, null],
[0, "주르핑", null, 0, null, 75, 79, 39, 0, 160, 300, null, null], [0, "띠용핑", null, 0, null, 68, 39, 86, 0, 160, 300, null, null],
[0, "차나핑", null, 0, null, 65, 39, 89, 0, 160, 300, null, null], [0, "주르핑", null, 0, null, 75, 79, 39, 0, 160, 300, null, null],
[0, "따라핑", null, 0, null, 65, 89, 39, 0, 160, 300, null, null], [0, "차나핑", null, 0, null, 65, 39, 89, 0, 160, 300, null, null],
[0, "나르핑", null, 0, null, 75, 39, 79, 0, 160, 300, null, null], [0, "따라핑", null, 0, null, 65, 89, 39, 0, 160, 300, null, null],
[0, "무셔핑", null, 0, null, 68, 86, 39, 0, 160, 300, null, null], [0, "나르핑", null, 0, null, 75, 39, 79, 0, 160, 300, null, null],
[0, "투투핑", null, 0, null, 72, 39, 82, 0, 160, 300, null, null], [0, "무셔핑", null, 0, null, 68, 86, 39, 0, 160, 300, null, null],
[0, "차캐핑", null, 0, null, 71, 83, 39, 0, 160, 300, null, null], [0, "투투핑", null, 0, null, 72, 39, 82, 0, 160, 300, null, null],
[0, "떠벌핑", null, 0, null, 69, 39, 85, 0, 160, 300, null, null], [0, "차캐핑", null, 0, null, 71, 83, 39, 0, 160, 300, null, null],
[0, "다조핑", null, 0, null, 74, 80, 39, 0, 160, 300, null, null], [0, "떠벌핑", null, 0, null, 69, 39, 85, 0, 160, 300, null, null],
[0, "화나핑", null, 0, null, 66, 39, 88, 0, 160, 300, null, null], [0, "다조핑", null, 0, null, 74, 80, 39, 0, 160, 300, null, null],
[0, "시러핑", null, 0, null, 67, 87, 39, 0, 160, 300, null, null], [0, "화나핑", null, 0, null, 66, 39, 88, 0, 160, 300, null, null],
[0, "바네핑", null, 0, null, 73, 39, 81, 0, 160, 300, null, null], [0, "시러핑", null, 0, null, 67, 87, 39, 0, 160, 300, null, null],
[0, "덜덜핑", null, 0, null, 70, 84, 39, 0, 160, 300, null, null], [0, "바네핑", null, 0, null, 73, 39, 81, 0, 160, 300, null, null],
[0, "그림핑", null, 0, null, 70, 39, 84, 0, 160, 300, null, null], [0, "덜덜핑", null, 0, null, 70, 84, 39, 0, 160, 300, null, null],
[0, "무거핑", null, 0, null, 73, 81, 39, 0, 160, 300, null, null], [0, "그림핑", null, 0, null, 70, 39, 84, 0, 160, 300, null, null],
[0, "꺼꿀핑", null, 0, null, 67, 39, 87, 0, 160, 300, null, null], [0, "무거핑", null, 0, null, 73, 81, 39, 0, 160, 300, null, null],
[0, "씽씽핑", null, 0, null, 66, 88, 39, 0, 160, 300, null, null], [0, "꺼꿀핑", null, 0, null, 67, 39, 87, 0, 160, 300, null, null],
[0, "베베핑", null, 0, null, 74, 39, 80, 0, 160, 300, null, null], [0, "씽씽핑", null, 0, null, 66, 88, 39, 0, 160, 300, null, null],
[0, "코자핑", null, 0, null, 69, 85, 39, 0, 160, 300, null, null], [0, "베베핑", null, 0, null, 74, 39, 80, 0, 160, 300, null, null],
[0, "딱풀핑", null, 0, null, 71, 39, 83, 0, 160, 300, null, null], [0, "코자핑", null, 0, null, 69, 85, 39, 0, 160, 300, null, null],
[0, "모야핑", null, 0, null, 72, 82, 39, 0, 160, 300, null, null], [0, "딱풀핑", null, 0, null, 71, 39, 83, 0, 160, 300, null, null],
[0, "토이핑", null, 0, null, 68, 39, 86, 0, 160, 300, null, null], [0, "모야핑", null, 0, null, 72, 82, 39, 0, 160, 300, null, null],
[0, "또까핑", null, 0, null, 75, 79, 39, 0, 160, 300, null, null], [0, "토이핑", null, 0, null, 68, 39, 86, 0, 160, 300, null, null],
[0, "플라핑", null, 0, null, 65, 39, 89, 0, 160, 300, null, null], [0, "또까핑", null, 0, null, 75, 79, 39, 0, 160, 300, null, null],
[0, "라핑", null, 0, null, 65, 89, 39, 0, 160, 300, null, null], [0, "라핑", null, 0, null, 65, 39, 89, 0, 160, 300, null, null],
[0, "노핑", null, 0, null, 75, 39, 79, 0, 160, 300, null, null], [0, "노핑", null, 0, null, 65, 89, 39, 0, 160, 300, null, null],
[0, "아휴핑", null, 0, null, 68, 86, 39, 0, 160, 300, null, null], [0, "노리핑", null, 0, null, 75, 39, 79, 0, 160, 300, null, null],
[0, "똑똑핑", null, 0, null, 72, 39, 82, 0, 160, 300, null, null], [0, "아휴핑", null, 0, null, 68, 86, 39, 0, 160, 300, null, null],
[0, "꽁꽁핑", null, 0, null, 71, 83, 39, 0, 160, 300, null, null], [0, "똑똑핑", null, 0, null, 72, 39, 82, 0, 160, 300, null, null],
[0, "찌릿핑", null, 0, null, 69, 39, 85, 0, 160, 300, null, null], [0, "꽁꽁핑", null, 0, null, 71, 83, 39, 0, 160, 300, null, null],
[0, "홀로핑", null, 0, null, 74, 80, 39, 0, 160, 300, null, null], [0, "찌릿핑", null, 0, null, 69, 39, 85, 0, 160, 300, null, null],
[0, "악동핑", null, 0, null, 72, 98, 46, 0, 160, 300, null, null, "모두를 다시 풀어주겠어. 기다려라 친구들이여, 통통~!"], [0, "홀로핑", null, 0, null, 74, 80, 39, 0, 160, 300, null, null],
[0, "앙대핑", null, 0, null, 74, 96, 45, 0, 160, 300, null, null, "이 몸은 앙대핑. 난, 여러 감정들을 뒤섞어서 싸움을 부추기지!"], [0, "악동핑", null, 0, null, 72, 98, 46, 0, 160, 300, null, null, "모두를 다시 풀어주겠어. 기다려라 친구들이여, 통통~!"],
[0, "가면핑", null, 0, null, 71, 47, 97, 0, 160, 300, null, null, "나는 누구일까?"], [0, "앙대핑", null, 0, null, 74, 96, 45, 0, 160, 300, null, null, "이 몸은 앙대핑. 난, 여러 감정들을 뒤섞어서 싸움을 부추기지!"],
[0, "까르핑", null, 0, null, 66, 39, 88, 0, 160, 300, null, null], [0, "가면핑", null, 0, null, 71, 47, 97, 0, 160, 300, null, null, "나는 누구일까?"],
[0, "아야핑", null, 0, null, 70, 39, 84, 0, 160, 300, null, null], [0, "까르핑", null, 0, null, 66, 39, 88, 0, 160, 300, null, null],
[0, "소원핑", null, 0, null, 73, 39, 81, 0, 160, 300, null, null], [0, "아야핑", null, 0, null, 70, 39, 84, 0, 160, 300, null, null],
[0, "토닥핑", null, 0, null, 70, 84, 39, 0, 160, 300, null, null], [0, "소원핑", null, 0, null, 73, 39, 81, 0, 160, 300, null, null],
[0, "쪼꼼핑", null, 0, null, 67, 87, 39, 0, 160, 300, null, null], [0, "토닥핑", null, 0, null, 70, 84, 39, 0, 160, 300, null, null],
[0, "싹싹핑", null, 0, null, 73, 81, 39, 0, 160, 300, null, null], [0, "쪼꼼핑", null, 0, null, 67, 87, 39, 0, 160, 300, null, null],
[0, "맛나핑", null, 0, null, 67, 39, 87, 0, 160, 300, null, null], [0, "싹싹핑", null, 0, null, 73, 81, 39, 0, 160, 300, null, null],
[0, "포근핑", null, 0, null, 21, 65, 85, 0, 160, 300, null, null], [0, "맛나핑", null, 0, null, 67, 39, 87, 0, 160, 300, null, null],
[0, "다해핑", null, 0, null, 19, 64, 86, 0, 160, 300, null, null], [0, "포근핑", null, 0, null, 21, 65, 85, 0, 160, 300, null, null],
[0, "메모핑", null, 0, null, 22, 62, 88, 0, 160, 300, null, null], [0, "다해핑", null, 0, null, 19, 64, 86, 0, 160, 300, null, null],
[0, "공쥬핑", null, 0, null, 18, 87, 63, 0, 160, 300, null, null], [0, "메모핑", null, 0, null, 22, 62, 88, 0, 160, 300, null, null],
[0, "짝짝핑", null, 0, null, 24, 63, 84, 0, 160, 300, null, null], [0, "공쥬핑", null, 0, null, 18, 87, 63, 0, 160, 300, null, null],
[0, "주네핑", null, 0, null, 17, 86, 66, 0, 160, 300, null, null], [0, "짝짝핑", null, 0, null, 24, 63, 84, 0, 160, 300, null, null],
[0, "뚝딱핑", null, 0, null, 20, 85, 64, 0, 160, 300, null, null], [0, "주네핑", null, 0, null, 17, 86, 66, 0, 160, 300, null, null],
[0, "발레핑", null, 0, null, 23, 61, 89, 0, 160, 300, null, null], [0, "뚝딱핑", null, 0, null, 20, 85, 64, 0, 160, 300, null, null],
[0, "원더핑", null, 0, null, 20, 88, 63, 0, 160, 300, null, null], [0, "발레핑", null, 0, null, 23, 61, 89, 0, 160, 300, null, null],
[0, "시진핑", null, 0, null, 80, 90, 44, 0, 160, 300, null, null, "핑핑이 정부는 하나의 핑국을 확고히 주장하며 '두 개의 핑국'에 반대한다"], [0, "원더핑", null, 0, null, 20, 88, 63, 0, 160, 300, null, null],
[0, "반도핑", null, 0, null, 71, 48, 97, 0, 160, 300, null, null], [0, "시진핑", null, 0, null, 80, 90, 44, 0, 160, 300, null, null, "핑핑이 정부는 하나의 핑국을 확고히 주장하며 '두 개의 핑국'에 반대한다"],
[0, "마휘핑", null, 0, null, 77, 45, 93, 0, 160, 300, null, null, "총 69명의 친구들이 아이들의 돈을 쓸어담아줍니다"], [0, "반도핑", null, 0, null, 71, 48, 97, 0, 160, 300, null, null],
[0, "미아핑", null, 0, null, 73, 46, 96, 0, 160, 300, null, null], [0, "마휘핑", null, 0, null, 77, 45, 93, 0, 160, 300, null, null, "총 69명의 친구들이 아이들의 돈을 쓸어담아줍니다"],
[0, "앵벌스", null, 0, "진류", 108, 117, 40, 0, 160, 300, "출세", "의술", "다람쥐는 위대하고 그 외에 다른 설치류는 없다"], [0, "미아핑", null, 0, null, 73, 46, 96, 0, 160, 300, null, null],
[0, "앵드캡", null, 0, null, 72, 99, 47, 0, 160, 300, null, null, "내가 가는 길이 곧 재난이요"], [0, "앵벌스", null, 0, "진류", 108, 117, 40, 0, 160, 300, "출세", "의술", "다람쥐는 위대하고 그 외에 다른 설치류는 없다"],
[0, "야람쥐", null, 0, null, 91, 80, 49, 0, 160, 300, null, null], [0, "앵드캡", null, 0, null, 72, 99, 47, 0, 160, 300, null, null, "레드캡투어 풀매수"],
[0, "앵야호", null, 0, null, 73, 46, 97, 0, 160, 300, null, null], [0, "야람쥐", null, 0, null, 91, 80, 49, 0, 160, 300, null, null],
[0, "착한람쥐죽은람쥐", null, 0, null, 74, 96, 44, 0, 160, 300, null, null], [0, "앵야호", null, 0, null, 73, 46, 97, 0, 160, 300, null, null, "앵야~호"],
[0, "람쥐", null, 0, null, 73, 49, 95, 0, 160, 300, null, null, "호우~"], [0, "착한람쥐죽은람쥐", null, 0, null, 74, 96, 44, 0, 160, 300, null, null],
[0, "갤노트람쥐", null, 0, null, 79, 91, 41, 0, 160, 300, null, null, "초코송이"], [0, "람쥐", null, 0, null, 73, 49, 95, 0, 160, 300, null, null, "호우~"],
[0, "아가다람쥐앵벌스", null, 0, null, 74, 96, 40, 0, 160, 300, null, null], [0, "갤노트람쥐", null, 0, null, 79, 91, 41, 0, 160, 300, null, null, "초코송이"],
[0, "머슬다람쥐", null, 0, null, 74, 96, 47, 0, 160, 300, null, null], [0, "아가다람쥐앵벌스", null, 0, null, 74, 96, 40, 0, 160, 300, null, null],
[0, "다럼쥐", null, 0, null, 29, 94, 83, 0, 160, 300, null, null], [0, "머슬다람쥐", null, 0, null, 74, 96, 47, 0, 160, 300, null, null],
[0, "앵날먹", null, 0, null, 32, 82, 96, 0, 160, 300, null, null], [0, "다럼쥐", null, 0, null, 29, 94, 83, 0, 160, 300, null, null],
[0, "돌림쥐", null, 0, null, 73, 46, 96, 0, 160, 300, null, null], [0, "앵날먹", null, 0, null, 32, 82, 96, 0, 160, 300, null, null],
[0, "제갈람쥐", null, 0, null, 73, 44, 97, 0, 160, 300, null, null], [0, "돌림쥐", null, 0, null, 73, 46, 96, 0, 160, 300, null, null],
[0, "람쥐", null, 0, null, 90, 79, 40, 0, 160, 300, null, null], [0, "제갈람쥐", null, 0, null, 73, 44, 97, 0, 160, 300, null, null],
[0, "1분장삭턴다람쥐", null, 0, null, 78, 43, 92, 0, 160, 300, null, null], [0, "람쥐", null, 0, null, 90, 79, 40, 0, 160, 300, null, null],
[0, "거친다람쥐", null, 0, null, 77, 40, 93, 0, 160, 300, null, null], [0, "1분장삭턴다람쥐", null, 0, null, 78, 43, 92, 0, 160, 300, null, null],
[0, "다림쥐", null, 0, null, 74, 42, 97, 0, 160, 300, null, null], [0, "거친다람쥐", null, 0, null, 77, 40, 93, 0, 160, 300, null, null],
[0, "디람쥐", null, 0, null, 78, 92, 44, 0, 160, 300, null, null], [0, "다림쥐", null, 0, null, 74, 42, 97, 0, 160, 300, null, null],
[0, "독구킬러다람쥐", null, 0, null, 75, 95, 45, 0, 160, 300, null, null], [0, "람쥐", null, 0, null, 78, 92, 44, 0, 160, 300, null, null],
[0, "다람쥐", null, 0, null, 75, 45, 95, 0, 160, 300, null, null], [0, "독구킬러다람쥐", null, 0, null, 75, 95, 45, 0, 160, 300, null, null],
[0, "다쥐", null, 0, null, 68, 39, 87, 0, 160, 300, null, null], [0, "다쥐", null, 0, null, 75, 45, 95, 0, 160, 300, null, null],
[0, "아람쥐", null, 0, null, 80, 45, 90, 0, 160, 300, null, null, "앵버거 대성공"], [0, "다랍쥐", null, 0, null, 68, 39, 87, 0, 160, 300, null, null],
[0, "독황상제", null, 0, "강주", 106, 45, 120, 0, 160, 300, "출세", "집중", "나는 나보다 약한 녀석의 명령 따위는 듣지 않는다"], [0, "아람쥐", null, 0, null, 80, 45, 90, 0, 160, 300, null, null, "앵버거 대성공"],
[0, "갈근", null, 0, null, 72, 47, 98, 0, 160, 300, null, null], [0, "독황상제", null, 0, "강주", 106, 45, 120, 0, 160, 300, "출세", "집중", "나는 나보다 약한 녀석의 명령 따위는 듣지 않는다"],
[0, "독 안에 든 쥐", null, 0, null, 72, 98, 45, 0, 160, 300, null, null], [0, "갈근", null, 0, null, 72, 47, 98, 0, 160, 300, null, null],
[0, "독개비", null, 0, null, 72, 98, 45, 0, 160, 300, null, null], [0, "독 안에 든 쥐", null, 0, null, 72, 98, 45, 0, 160, 300, null, null],
[0, "독거노견", null, 0, null, 71, 99, 46, 0, 160, 300, null, null], [0, "독개비", null, 0, null, 72, 98, 45, 0, 160, 300, null, null],
[0, "독거노", null, 0, null, 72, 45, 98, 0, 160, 300, null, null], [0, "독거노", null, 0, null, 71, 99, 46, 0, 160, 300, null, null],
[0, "독", null, 0, null, 71, 46, 99, 0, 160, 300, null, null, "웃자 ^-^"], [0, "독거노인", null, 0, null, 72, 45, 98, 0, 160, 300, null, null],
[0, "독널무덤", null, 0, null, 72, 98, 45, 0, 160, 300, null, null], [0, "독", null, 0, null, 71, 46, 99, 0, 160, 300, null, null, "웃자 ^-^"],
[0, "독도는우리땅", null, 0, null, 73, 44, 97, 0, 160, 300, null, null], [0, "독널무덤", null, 0, null, 72, 98, 45, 0, 160, 300, null, null],
[0, "독립투견", null, 0, null, 73, 44, 97, 0, 160, 300, null, null], [0, "독도는우리땅", null, 0, null, 73, 44, 97, 0, 160, 300, null, null],
[0, "독멜른", null, 0, null, 73, 44, 97, 0, 160, 300, null, null], [0, "독립투견", null, 0, null, 73, 44, 97, 0, 160, 300, null, null],
[0, "독무대", null, 0, null, 71, 99, 46, 0, 160, 300, null, null], [0, "독멜른", null, 0, null, 73, 44, 97, 0, 160, 300, null, null],
[0, "독", null, 0, null, 72, 45, 98, 0, 160, 300, null, null], [0, "독무대", null, 0, null, 71, 99, 46, 0, 160, 300, null, null],
[0, "독불장군", null, 0, null, 72, 45, 98, 0, 160, 300, null, null], [0, "독", null, 0, null, 72, 45, 98, 0, 160, 300, null, null],
[0, "독산 현령", null, 0, null, 72, 45, 98, 0, 160, 300, null, null], [0, "독불장군", null, 0, null, 72, 45, 98, 0, 160, 300, null, null],
[0, "독산", null, 0, null, 73, 44, 97, 0, 160, 300, null, null], [0, "독산 현령", null, 0, null, 72, 45, 98, 0, 160, 300, null, null],
[0, "독산출판", null, 0, null, 73, 44, 97, 0, 160, 300, null, null], [0, "독산", null, 0, null, 73, 44, 97, 0, 160, 300, null, null],
[0, "독설가", null, 0, null, 72, 45, 98, 0, 160, 300, null, null], [0, "독산출판", null, 0, null, 73, 44, 97, 0, 160, 300, null, null],
[0, "독", null, 0, null, 71, 47, 99, 0, 160, 300, null, null], [0, "독설가", null, 0, null, 72, 45, 98, 0, 160, 300, null, null],
[0, "독심술사", null, 0, null, 71, 99, 46, 0, 160, 300, null, null], [0, "독", null, 0, null, 71, 47, 99, 0, 160, 300, null, null],
[0, "독악질", null, 0, null, 71, 99, 46, 0, 160, 300, null, null], [0, "독심술사", null, 0, null, 71, 99, 46, 0, 160, 300, null, null],
[0, "독야청정", null, 0, null, 73, 97, 44, 0, 160, 300, null, null], [0, "독악질", null, 0, null, 71, 99, 46, 0, 160, 300, null, null, "시 스 시"],
[0, "독", null, 0, null, 73, 97, 44, 0, 160, 300, null, null], [0, "독야청정", null, 0, null, 73, 97, 44, 0, 160, 300, null, null],
[0, "독이 든 성배", null, 0, null, 71, 99, 46, 0, 160, 300, null, null], [0, "독", null, 0, null, 73, 97, 44, 0, 160, 300, null, null],
[0, "독재자", null, 0, null, 71, 46, 99, 0, 160, 300, null, null], [0, "독이 든 성배", null, 0, null, 71, 99, 46, 0, 160, 300, null, null],
[0, "독", null, 0, null, 73, 97, 44, 0, 160, 300, null, null], [0, "독재자", null, 0, null, 71, 46, 99, 0, 160, 300, null, null, "대 실 패"],
[0, "독지가", null, 0, null, 71, 99, 46, 0, 160, 300, null, null], [0, "독", null, 0, null, 73, 97, 44, 0, 160, 300, null, null],
[0, "독지", null, 0, null, 71, 99, 46, 0, 160, 300, null, null], [0, "독지", null, 0, null, 71, 99, 46, 0, 160, 300, null, null, "대 성 공"],
[0, "독피자", null, 0, null, 74, 48, 96, 0, 160, 300, null, null], [0, "독지각", null, 0, null, 71, 99, 46, 0, 160, 300, null, null, "독 피 자"],
[0, "독해와 작문", null, 0, null, 73, 44, 97, 0, 160, 300, null, null], [0, "독피자", null, 0, null, 74, 48, 96, 0, 160, 300, null, null],
[0, "독식물", null, 0, null, 68, 83, 36, 0, 160, 300, null, null, "독식물키우세요"], [0, "독해와 작문", null, 0, null, 73, 44, 97, 0, 160, 300, null, null],
[0, "천괴은", null, 0, "회계", 106, 117, 43, 0, 160, 300, "출세", "견고", "헤헤.."], [0, "독식물", null, 0, null, 68, 83, 36, 0, 160, 300, null, null, "독식물키우세요"],
[0, "천괴", null, 0, null, 31, 88, 97, 0, 160, 300, null, null, "헤헤.."], [0, "천괴", null, 0, "회계", 106, 117, 43, 0, 160, 300, "출세", "견고", "헤헤.."],
[0, "천괴", null, 0, null, 74, 96, 46, 0, 160, 300, null, null], [0, "천괴", null, 0, null, 31, 88, 97, 0, 160, 300, null, null, "헤헤.."],
[0, "천괴", null, 0, null, 76, 94, 45, 0, 160, 300, null, null], [0, "천괴", null, 0, null, 74, 96, 46, 0, 160, 300, null, null],
[0, "천괴호우", null, 0, null, 77, 44, 93, 0, 160, 300, null, null], [0, "천괴", null, 0, null, 76, 94, 45, 0, 160, 300, null, null],
[0, "천괴코인", null, 0, null, 73, 97, 43, 0, 160, 300, null, null], [0, "천괴호우", null, 0, null, 77, 44, 93, 0, 160, 300, null, null],
[0, "천괴", null, 0, null, 78, 43, 92, 0, 160, 300, null, null], [0, "천괴코인", null, 0, null, 73, 97, 43, 0, 160, 300, null, null],
[0, "천괴다이아", null, 0, null, 76, 44, 94, 0, 160, 300, null, null], [0, "천괴", null, 0, null, 78, 43, 92, 0, 160, 300, null, null],
[0, "천괴", null, 0, null, 72, 47, 95, 0, 160, 300, null, null, "쓰레기는 쓰레기통에 넣어 주세요. 저도 같이요"], [0, "천괴다이아", null, 0, null, 76, 44, 94, 0, 160, 300, null, null],
[0, "천고l금", null, 0, null, 37, 83, 95, 0, 160, 300, null, null] [0, "천괴옥", null, 0, null, 72, 47, 95, 0, 160, 300, null, null, "쓰레기는 쓰레기통에 넣어 주세요. 저도 같이요"],
[0, "천고l금", null, 0, null, 37, 83, 95, 0, 160, 300, null, null]
], ],
"general_ex":[ "general_ex":[
+10 -9
View File
@@ -785,7 +785,7 @@
[0, "나루토", null, 0, null, 80, 100, 6, 0, 160, 300, null, null, "나루토 사스케 싸움 레알 실화냐"], [0, "나루토", null, 0, null, 80, 100, 6, 0, 160, 300, null, null, "나루토 사스케 싸움 레알 실화냐"],
[0, "달스케", null, 0, null, 73, 97, 43, 0, 160, 300, null, null], [0, "달스케", null, 0, null, 73, 97, 43, 0, 160, 300, null, null],
[0, "독스케", null, 0, null, 79, 91, 46, 0, 160, 300, null, null], [0, "독스케", null, 0, null, 79, 91, 46, 0, 160, 300, null, null],
[0, "마스케", null, 0, null, 74, 96, 45, 0, 160, 300, null, null], [0, "마스케", null, 0, null, 74, 96, 45, 0, 160, 300, null, null, "픽스터 트롤링 ON"],
[0, "사람쥐", null, 0, null, 77, 42, 93, 0, 160, 300, null, null, "사람쥐는 위대하고 그 외에 다른 설치류는 없다"], [0, "사람쥐", null, 0, null, 77, 42, 93, 0, 160, 300, null, null, "사람쥐는 위대하고 그 외에 다른 설치류는 없다"],
[0, "사숙개", null, 0, null, 78, 91, 44, 0, 160, 300, null, null], [0, "사숙개", null, 0, null, 78, 91, 44, 0, 160, 300, null, null],
[0, "사스가키", null, 0, null, 71, 99, 47, 0, 160, 300, null, null, "허~접♡"], [0, "사스가키", null, 0, null, 71, 99, 47, 0, 160, 300, null, null, "허~접♡"],
@@ -805,6 +805,7 @@
[0, "삼수케", null, 0, null, 3, 33, 33, 0, 160, 300, null, null, "대학 입시를 3번 치르는 삼수케"], [0, "삼수케", null, 0, null, 3, 33, 33, 0, 160, 300, null, null, "대학 입시를 3번 치르는 삼수케"],
[0, "사시케", null, 0, null, 44, 44, 44, 0, 160, 300, null, null], [0, "사시케", null, 0, null, 44, 44, 44, 0, 160, 300, null, null],
[0, "사륜안", null, 0, null, 72, 49, 98, 0, 160, 300, null, null], [0, "사륜안", null, 0, null, 72, 49, 98, 0, 160, 300, null, null],
[0, "사사게", null, 0, null, 76, 95, 43, 0, 160, 300, null, null],
[0, "네시", null, 0, "교지", 103, 119, 45, 0, 160, 300, "출세", "필살", "안 자고 싸우면 이겨요"], [0, "네시", null, 0, "교지", 103, 119, 45, 0, 160, 300, "출세", "필살", "안 자고 싸우면 이겨요"],
[0, "영시", null, 0, null, 77, 43, 92, 0, 160, 300, null, null, "충성!"], [0, "영시", null, 0, null, 77, 43, 92, 0, 160, 300, null, null, "충성!"],
[0, "한시", null, 0, null, 71, 47, 99, 0, 160, 300, null, null, "ㅁㄹ"], [0, "한시", null, 0, null, 71, 47, 99, 0, 160, 300, null, null, "ㅁㄹ"],
@@ -862,7 +863,7 @@
[0, "제라늄", null, 0, null, 64, 57, 83, 0, 160, 300, null, null], [0, "제라늄", null, 0, null, 64, 57, 83, 0, 160, 300, null, null],
[0, "베고니아", null, 0, null, 37, 23, 48, 0, 160, 300, null, null], [0, "베고니아", null, 0, null, 37, 23, 48, 0, 160, 300, null, null],
[0, "위시본", null, 0, null, 23, 54, 12, 0, 160, 300, null, null], [0, "위시본", null, 0, null, 23, 54, 12, 0, 160, 300, null, null],
[0, "박쥐란", null, 0, null, 76, 93, 47, 0, 160, 300, null, null, "걸어키워주세요"], [0, "박쥐란", null, 0, null, 76, 93, 47, 0, 160, 300, null, null],
[0, "골든드래곤", null, 0, null, 73, 45, 97, 0, 160, 300, null, null, "고가종 3대장 골든바리!"], [0, "골든드래곤", null, 0, null, 73, 45, 97, 0, 160, 300, null, null, "고가종 3대장 골든바리!"],
[0, "빌리에티에", null, 0, null, 72, 44, 98, 0, 160, 300, null, null, "고가종 3대장 빌리바리!"], [0, "빌리에티에", null, 0, null, 72, 44, 98, 0, 160, 300, null, null, "고가종 3대장 빌리바리!"],
[0, "윌리엄씨", null, 0, null, 77, 93, 46, 0, 160, 300, null, null, "고가종 3대장 윌리엄씨바리!"], [0, "윌리엄씨", null, 0, null, 77, 93, 46, 0, 160, 300, null, null, "고가종 3대장 윌리엄씨바리!"],
@@ -895,7 +896,7 @@
[0, "앤트승필맨", null, 0, null, 69, 88, 56, 0, 160, 300, null, null], [0, "앤트승필맨", null, 0, null, 69, 88, 56, 0, 160, 300, null, null],
[0, "워승필머신", null, 0, null, 72, 98, 45, 0, 160, 300, null, null], [0, "워승필머신", null, 0, null, 72, 98, 45, 0, 160, 300, null, null],
[0, "윈터승필솔져", null, 0, null, 77, 93, 43, 0, 160, 300, null, null], [0, "윈터승필솔져", null, 0, null, 77, 93, 43, 0, 160, 300, null, null],
[0, "정승필실종사건", null, 0, null, 79, 45, 91, 0, 160, 300, null, null, "승필 실종됨 ㄷㄷㄷ"], [0, "정승필실종사건", null, 0, null, 79, 45, 91, 0, 160, 300, null, null, "승필 실종됨 ㄷㄷㄷ"],
[0, "찐승필", null, 0, null, 80, 44, 90, 0, 160, 300, null, null], [0, "찐승필", null, 0, null, 80, 44, 90, 0, 160, 300, null, null],
[0, "캡틴승필리카", null, 0, null, 80, 90, 44, 0, 160, 300, null, null], [0, "캡틴승필리카", null, 0, null, 80, 90, 44, 0, 160, 300, null, null],
[0, "퀵승필", null, 0, null, 68, 88, 43, 0, 160, 300, null, null], [0, "퀵승필", null, 0, null, 68, 88, 43, 0, 160, 300, null, null],
@@ -973,9 +974,9 @@
[0, "마휘핑", null, 0, null, 77, 45, 93, 0, 160, 300, null, null, "총 69명의 친구들이 아이들의 돈을 쓸어담아줍니다"], [0, "마휘핑", null, 0, null, 77, 45, 93, 0, 160, 300, null, null, "총 69명의 친구들이 아이들의 돈을 쓸어담아줍니다"],
[0, "미아핑", null, 0, null, 73, 46, 96, 0, 160, 300, null, null], [0, "미아핑", null, 0, null, 73, 46, 96, 0, 160, 300, null, null],
[0, "앵벌스", null, 0, "진류", 108, 117, 40, 0, 160, 300, "출세", "의술", "다람쥐는 위대하고 그 외에 다른 설치류는 없다"], [0, "앵벌스", null, 0, "진류", 108, 117, 40, 0, 160, 300, "출세", "의술", "다람쥐는 위대하고 그 외에 다른 설치류는 없다"],
[0, "앵드캡", null, 0, null, 72, 99, 47, 0, 160, 300, null, null, "내가 가는 길이 곧 재난이요"], [0, "앵드캡", null, 0, null, 72, 99, 47, 0, 160, 300, null, null, "레드캡투어 풀매수"],
[0, "야람쥐", null, 0, null, 91, 80, 49, 0, 160, 300, null, null], [0, "야람쥐", null, 0, null, 91, 80, 49, 0, 160, 300, null, null],
[0, "앵야호", null, 0, null, 73, 46, 97, 0, 160, 300, null, null], [0, "앵야호", null, 0, null, 73, 46, 97, 0, 160, 300, null, null, "앵야~호"],
[0, "착한람쥐죽은람쥐", null, 0, null, 74, 96, 44, 0, 160, 300, null, null], [0, "착한람쥐죽은람쥐", null, 0, null, 74, 96, 44, 0, 160, 300, null, null],
[0, "호람쥐", null, 0, null, 73, 49, 95, 0, 160, 300, null, null, "호우~"], [0, "호람쥐", null, 0, null, 73, 49, 95, 0, 160, 300, null, null, "호우~"],
[0, "갤노트람쥐", null, 0, null, 79, 91, 41, 0, 160, 300, null, null, "초코송이"], [0, "갤노트람쥐", null, 0, null, 79, 91, 41, 0, 160, 300, null, null, "초코송이"],
@@ -1014,14 +1015,14 @@
[0, "독설가", null, 0, null, 72, 45, 98, 0, 160, 300, null, null], [0, "독설가", null, 0, null, 72, 45, 98, 0, 160, 300, null, null],
[0, "독신", null, 0, null, 71, 47, 99, 0, 160, 300, null, null], [0, "독신", null, 0, null, 71, 47, 99, 0, 160, 300, null, null],
[0, "독심술사", null, 0, null, 71, 99, 46, 0, 160, 300, null, null], [0, "독심술사", null, 0, null, 71, 99, 46, 0, 160, 300, null, null],
[0, "독악질", null, 0, null, 71, 99, 46, 0, 160, 300, null, null], [0, "독악질", null, 0, null, 71, 99, 46, 0, 160, 300, null, null, "시 스 시"],
[0, "독야청정", null, 0, null, 73, 97, 44, 0, 160, 300, null, null], [0, "독야청정", null, 0, null, 73, 97, 44, 0, 160, 300, null, null],
[0, "독우", null, 0, null, 73, 97, 44, 0, 160, 300, null, null], [0, "독우", null, 0, null, 73, 97, 44, 0, 160, 300, null, null],
[0, "독이 든 성배", null, 0, null, 71, 99, 46, 0, 160, 300, null, null], [0, "독이 든 성배", null, 0, null, 71, 99, 46, 0, 160, 300, null, null],
[0, "독재자", null, 0, null, 71, 46, 99, 0, 160, 300, null, null], [0, "독재자", null, 0, null, 71, 46, 99, 0, 160, 300, null, null, "대 실 패"],
[0, "독종", null, 0, null, 73, 97, 44, 0, 160, 300, null, null], [0, "독종", null, 0, null, 73, 97, 44, 0, 160, 300, null, null],
[0, "독지가", null, 0, null, 71, 99, 46, 0, 160, 300, null, null], [0, "독지가", null, 0, null, 71, 99, 46, 0, 160, 300, null, null, "대 성 공"],
[0, "독지각", null, 0, null, 71, 99, 46, 0, 160, 300, null, null], [0, "독지각", null, 0, null, 71, 99, 46, 0, 160, 300, null, null, "독 피 자"],
[0, "독피자", null, 0, null, 74, 48, 96, 0, 160, 300, null, null], [0, "독피자", null, 0, null, 74, 48, 96, 0, 160, 300, null, null],
[0, "독해와 작문", null, 0, null, 73, 44, 97, 0, 160, 300, null, null], [0, "독해와 작문", null, 0, null, 73, 44, 97, 0, 160, 300, null, null],
[0, "독식물", null, 0, null, 68, 83, 36, 0, 160, 300, null, null, "독식물키우세요"], [0, "독식물", null, 0, null, 68, 83, 36, 0, 160, 300, null, null, "독식물키우세요"],
+5 -3
View File
@@ -25,7 +25,7 @@ body {
#container { #container {
width: 500px; width: 500px;
margin: 0 auto; margin: 0 auto;
margin-bottom: 100px; margin-bottom: 40px !important;
} }
input[type='text'], input[type='text'],
@@ -49,6 +49,8 @@ body {
text-align: center; text-align: center;
width: 125px; width: 125px;
font-size: 16px; font-size: 16px;
padding-top: 0.5rem;
padding-bottom: 0.5rem;
} }
box-shadow: 0 -1px 0 $dark; box-shadow: 0 -1px 0 $dark;
@@ -65,7 +67,7 @@ body {
} }
#navbarNationItems { #navbarNationItems {
columns: 2; columns: 3;
} }
#navbarQuickItems { #navbarQuickItems {
@@ -320,7 +322,7 @@ body {
font-weight: bold; font-weight: bold;
font-size: 14px; font-size: 14px;
} }
.toolbarButton2 { .toolbarButton2 {
@extend .btn; @extend .btn;
@extend .btn-sammo-base2; @extend .btn-sammo-base2;
+8 -1
View File
@@ -16,5 +16,12 @@
<?=$btnBegin??''?><a href='b_battleCenter.php' target='_blank' class='open-window commandButton <?=$btnClass??""?> <?= $showSecret ? '' : 'disabled' ?>'>감 찰 부</a><?=$btnEnd??''?> <?=$btnBegin??''?><a href='b_battleCenter.php' target='_blank' class='open-window commandButton <?=$btnClass??""?> <?= $showSecret ? '' : 'disabled' ?>'>감 찰 부</a><?=$btnEnd??''?>
<?=$btnBegin??''?><a href='v_inheritPoint.php' class='commandButton <?=$btnClass??""?>'>유산 관리</a><?=$btnEnd??''?> <?=$btnBegin??''?><a href='v_inheritPoint.php' class='commandButton <?=$btnClass??""?>'>유산 관리</a><?=$btnEnd??''?>
<?=$btnBegin??''?><a href='b_myPage.php' class='commandButton <?=$btnClass??""?>'>내 정보&amp;설정</a><?=$btnEnd??''?> <?=$btnBegin??''?><a href='b_myPage.php' class='commandButton <?=$btnClass??""?>'>내 정보&amp;설정</a><?=$btnEnd??''?>
<?=$btnBegin??''?><a href='v_auction.php' target='_blank' class='open-window commandButton <?=$btnClass??""?>'>거 래 장</a><?=$btnEnd??''?> <?=$splitBtnBegin??''?>
<?=$splitMainBegin??''?><a href='v_auction.php' target='_blank' class='open-window commandButton <?=$btnClass??""?>'>경 매 장</a><?=$splitMainEnd??''?>
<?=$splitZoneSign??''?>
<?=$splitZoneBegin??''?>
<?=$splitSubBtnBegin??''?><a href='v_auction.php' target='_blank' class='open-window commandButton <?=$btnSplitClass??''?>'>금/쌀 경매장</a><?=$splitSubBtnEnd??''?>
<?=$splitSubBtnBegin??''?><a href='v_auction.php?type=unique' target='_blank' class='open-window commandButton <?=$btnSplitClass??''?>'>유니크 경매장</a><?=$splitSubBtnEnd??''?>
<?=$splitZoneEnd??''?>
<?=$splitBtnEnd??''?>
<?=$btnBegin??''?><a href='b_betting.php' target='_blank' class='open-window <?=$btnClassForBetting??""?>'>베 팅 장</a><?=$btnEnd??''?> <?=$btnBegin??''?><a href='b_betting.php' target='_blank' class='open-window <?=$btnClassForBetting??""?>'>베 팅 장</a><?=$btnEnd??''?>
+22 -5
View File
@@ -4,8 +4,8 @@
<BButton @click="isResAuction = true">/</BButton> <BButton @click="isResAuction = true">/</BButton>
<BButton @click="isResAuction = false">유니크</BButton> <BButton @click="isResAuction = false">유니크</BButton>
</TopBackBar> </TopBackBar>
<AuctionResource v-if="isResAuction"></AuctionResource> <AuctionResource v-if="isResAuction" ref="auctionResource"></AuctionResource>
<AuctionUniqueItem v-else></AuctionUniqueItem> <AuctionUniqueItem v-else ref="auctionUniqueItem"></AuctionUniqueItem>
<BottomBar type="close"></BottomBar> <BottomBar type="close"></BottomBar>
</BContainer> </BContainer>
</template> </template>
@@ -24,9 +24,26 @@ import AuctionResource from "@/components/AuctionResource.vue";
import AuctionUniqueItem from "@/components/AuctionUniqueItem.vue"; import AuctionUniqueItem from "@/components/AuctionUniqueItem.vue";
import { ref } from "vue"; import { ref } from "vue";
const isResAuction = ref(true); const props = defineProps({
isResAuction: {
type: Boolean,
default: true,
},
});
function tryReload() { const auctionResource = ref<InstanceType<typeof AuctionResource> | null>(null);
console.log('갱신'); const auctionUniqueItem = ref<InstanceType<typeof AuctionUniqueItem> | null>(null);
const isResAuction = ref(props.isResAuction);
async function tryReload() {
console.log(auctionResource.value);
console.log(auctionUniqueItem.value);
if(isResAuction.value && auctionResource.value){
await auctionResource.value.refresh();
}
if(!isResAuction.value && auctionUniqueItem.value){
await auctionUniqueItem.value.refresh();
}
} }
</script> </script>
+7
View File
@@ -221,4 +221,11 @@ onMounted(() => {
} }
} }
} }
</style> </style>
<style>
.hidden_but_copyable {
color: rgba(0, 0, 0, 0);
font-size: 0;
}
</style>
+239 -229
View File
@@ -70,7 +70,7 @@
<div class="a-right col-6 align-self-center">유니크 경매</div> <div class="a-right col-6 align-self-center">유니크 경매</div>
<div class="col-6"> <div class="col-6">
<select v-model="specificUnique" class="form-select col-6"> <select v-model="specificUnique" class="form-select col-6">
<option disabled selected :value="null"> 유니크 선택 </option> <option disabled selected :value="null">유니크 선택</option>
<option v-for="(info, key) in availableUnique" :key="key" :value="key"> <option v-for="(info, key) in availableUnique" :key="key" :value="key">
{{ info.title }} {{ info.title }}
</option> </option>
@@ -91,7 +91,7 @@
<small class="form-text text-muted" <small class="form-text text-muted"
>얻고자 하는 유니크 아이템으로 경매를 시작합니다. 24 동안 진행됩니다.<br /> >얻고자 하는 유니크 아이템으로 경매를 시작합니다. 24 동안 진행됩니다.<br />
<!-- eslint-disable-next-line vue/no-v-html --> <!-- eslint-disable-next-line vue/no-v-html -->
<span style="color: white" v-html="specificUnique == null?'':availableUnique[specificUnique].info" /> <span style="color: white" v-html="specificUnique == null ? '' : availableUnique[specificUnique].info" />
</small> </small>
</div> </div>
@@ -185,10 +185,10 @@
</div> </div>
<div class="row"> <div class="row">
<div class="col"> <div class="col">
<div class="bg1 a-center">유산 포인트 변경 내역(최근 30)</div> <div class="bg1 a-center">유산 포인트 변경 내역</div>
</div> </div>
</div> </div>
<div v-for="(log, idx) in lastInheritPointLogs" :key="idx" class="row"> <div v-for="[idx, log] of inheritPointLogs" :key="idx" class="row">
<div class="col a-right" style="max-width: 20ch"> <div class="col a-right" style="max-width: 20ch">
<small class="text-muted tnum">[{{ log.date }}]</small> <small class="text-muted tnum">[{{ log.date }}]</small>
</div> </div>
@@ -196,21 +196,11 @@
{{ log.text }} {{ log.text }}
</div> </div>
</div> </div>
<div class="d-grid"><BButton @click="getMoreLog()"> 가져오기</BButton></div>
</div> </div>
</template> </template>
<script lang="ts"> <script lang="ts">
import { defineComponent } from "vue";
import "@scss/common/bootstrap5.scss";
import "@scss/game_bg.scss";
import TopBackBar from "@/components/TopBackBar.vue";
import _ from "lodash";
import NumberInputWithInfo from "@/components/NumberInputWithInfo.vue";
import { SammoAPI } from "./SammoAPI";
import type { inheritBuffType } from "./defs/API/InheritAction";
import * as JosaUtil from '@/util/JosaUtil';
import { BButton } from "bootstrap-vue-3";
type InheritanceType = type InheritanceType =
| "previous" | "previous"
| "lived_month" | "lived_month"
@@ -227,15 +217,53 @@ type InheritanceType =
type InheritanceViewType = InheritanceType | "sum" | "new"; type InheritanceViewType = InheritanceType | "sum" | "new";
declare const lastInheritPointLogs: { declare const staticValues: {
server_id: string; lastInheritPointLogs: InheritPointLogItem[];
year: number; items: Record<InheritanceType, number>;
month: number; currentInheritBuff: {
date: string; [v in inheritBuffType]: number | undefined;
text: string; };
}[]; maxInheritBuff: number;
inheritActionCost: {
buff: number[];
resetTurnTime: number;
resetSpecialWar: number;
randomUnique: number;
nextSpecial: number;
minSpecificUnique: number;
};
resetTurnTimeLevel: number;
resetSpecialWarLevel: number;
declare const items: Record<InheritanceType, number>; availableSpecialWar: Record<
string,
{
title: string;
info: string;
}
>;
availableUnique: Record<
string,
{
title: string;
rawName: string;
info: string;
}
>;
};
</script>
<script lang="ts" setup>
import { reactive, ref } from "vue";
import "@scss/common/bootstrap5.scss";
import "@scss/game_bg.scss";
import TopBackBar from "@/components/TopBackBar.vue";
import _ from "lodash";
import NumberInputWithInfo from "@/components/NumberInputWithInfo.vue";
import { SammoAPI } from "./SammoAPI";
import type { inheritBuffType, InheritPointLogItem } from "./defs/API/InheritAction";
import * as JosaUtil from "@/util/JosaUtil";
import { BButton } from "bootstrap-vue-3";
import { unwrap } from "./util/unwrap";
const inheritanceViewText: Record<InheritanceViewType, { title: string; info: string }> = { const inheritanceViewText: Record<InheritanceViewType, { title: string; info: string }> = {
sum: { sum: {
@@ -296,11 +324,6 @@ const inheritanceViewText: Record<InheritanceViewType, { title: string; info: st
}, },
}; };
declare const currentInheritBuff: {
[v in inheritBuffType]: number | undefined;
};
const inheritBuffHelpText: Record< const inheritBuffHelpText: Record<
inheritBuffType, inheritBuffType,
{ {
@@ -342,226 +365,213 @@ const inheritBuffHelpText: Record<
}, },
}; };
declare const maxInheritBuff: number; const inheritBuff = reactive({} as Record<inheritBuffType, number>);
declare const inheritActionCost: { for (const buffKey of Object.keys(inheritBuffHelpText) as inheritBuffType[]) {
buff: number[]; inheritBuff[buffKey] = staticValues.currentInheritBuff[buffKey] ?? 0;
resetTurnTime: number; }
resetSpecialWar: number;
randomUnique: number;
nextSpecial: number;
minSpecificUnique: number;
};
declare const resetTurnTimeLevel: number; const title = "유산 관리";
declare const resetSpecialWarLevel: number;
declare const availableSpecialWar: Record< const items = ref(
string, (() => {
{ const totalPoint = Math.floor(_.sum(Object.values(staticValues.items)));
title: string; const previousPoint = Math.floor(staticValues.items["previous"]);
info: string; const newPoint = Math.floor(totalPoint - previousPoint);
} const result: Record<InheritanceViewType, number> = {
>; ...staticValues.items,
sum: totalPoint,
declare const availableUnique: Record< new: newPoint,
string,
{
title: string;
rawName: string;
info: string;
}
>;
export default defineComponent({
name: "PageInheritPoint",
components: {
TopBackBar,
NumberInputWithInfo,
BButton,
},
data() {
const inheritBuff = {} as Record<inheritBuffType, number>;
for (const buffKey of Object.keys(inheritBuffHelpText) as inheritBuffType[]) {
inheritBuff[buffKey] = currentInheritBuff[buffKey] ?? 0;
}
return {
title: "유산 관리",
inheritanceViewText,
items: (() => {
const totalPoint = Math.floor(_.sum(Object.values(items)));
const previousPoint = Math.floor(items["previous"]);
const newPoint = Math.floor(totalPoint - previousPoint);
const result: Record<InheritanceViewType, number> = {
...items,
sum: totalPoint,
new: newPoint,
};
return result;
})(),
inheritBuffHelpText,
inheritBuff,
prevInheritBuff: currentInheritBuff,
maxInheritBuff,
inheritActionCost,
resetTurnTimeLevel,
resetSpecialWarLevel,
nextSpecialWar: Object.keys(availableSpecialWar)[0],
specificUnique: null,
availableSpecialWar,
availableUnique,
specificUniqueAmount: inheritActionCost.minSpecificUnique,
lastInheritPointLogs,
}; };
}, return result;
methods: { })()
async buyInheritBuff(buffKey: inheritBuffType) { );
const level = Math.floor(this.inheritBuff[buffKey]);
const prevLevel = this.prevInheritBuff[buffKey] ?? 0;
if (level == prevLevel) {
return;
}
if (level < prevLevel) {
alert("낮출 수 없습니다.");
return;
}
const cost = this.inheritActionCost.buff[level] - this.inheritActionCost.buff[prevLevel];
if (this.items.previous < cost) {
alert("유산 포인트가 부족합니다.");
return;
}
const name = inheritBuffHelpText[buffKey].title; const {
const josaUl = JosaUtil.pick(name, '을'); maxInheritBuff,
if (!confirm(`${name}${josaUl} ${level}등급으로 올릴까요? ${cost} 포인트가 소모됩니다.`)) { inheritActionCost,
return; currentInheritBuff: prevInheritBuff,
} availableSpecialWar,
availableUnique,
} = staticValues;
try { const nextSpecialWar = ref(Object.keys(availableSpecialWar)[0]);
await SammoAPI.InheritAction.BuyHiddenBuff({ const specificUnique = ref<string | null>(null);
type: buffKey, const specificUniqueAmount = ref(inheritActionCost.minSpecificUnique);
level,
});
} catch (e) {
console.error(e);
alert(`실패했습니다: ${e}`);
return;
}
alert("성공했습니다."); const lastLogID = ref(Math.min(...staticValues.lastInheritPointLogs.map((v) => v.id)));
//TODO: 페이지 새로고침 필요없이 하도록 const inheritPointLogs = ref(
location.reload(); (() => {
}, const logs = new Map<number, InheritPointLogItem>();
async buySimple(type: "ResetTurnTime" | "BuyRandomUnique" | "ResetSpecialWar") { for (const log of staticValues.lastInheritPointLogs) {
const costMap: Record<typeof type, number> = { logs.set(log.id, log);
ResetTurnTime: inheritActionCost.resetTurnTime, }
ResetSpecialWar: inheritActionCost.resetSpecialWar, return logs;
BuyRandomUnique: inheritActionCost.randomUnique, })()
}; );
const cost = costMap[type]; staticValues.lastInheritPointLogs;
if (cost === undefined) { async function buyInheritBuff(buffKey: inheritBuffType) {
alert(`올바르지 않은 타입:${type}`); const level = Math.floor(unwrap(inheritBuff[buffKey]));
return; const prevLevel = prevInheritBuff[buffKey] ?? 0;
} if (level == prevLevel) {
return;
}
if (level < prevLevel) {
alert("낮출 수 없습니다.");
return;
}
const cost = inheritActionCost.buff[level] - inheritActionCost.buff[prevLevel];
if (items.value.previous < cost) {
alert("유산 포인트가 부족합니다.");
return;
}
const messageMap: Record<typeof type, string> = { const name = inheritBuffHelpText[buffKey].title;
ResetTurnTime: `${cost} 포인트로 턴을 초기화 하시겠습니까?`, const josaUl = JosaUtil.pick(name, "을");
ResetSpecialWar: `${cost} 포인트로 전투 특기를 초기화 하시겠습니까?`, if (!confirm(`${name}${josaUl} ${level}등급으로 올릴까요? ${cost} 포인트가 소모됩니다.`)) {
BuyRandomUnique: `${cost} 포인트로 랜덤 유니크를 구입하시겠습니까?`, return;
}; }
if (this.items.previous < cost) {
alert("유산 포인트가 부족합니다.");
return;
}
if (!confirm(messageMap[type])) {
return;
}
try { try {
await SammoAPI.InheritAction[type](); await SammoAPI.InheritAction.BuyHiddenBuff({
} catch (e) { type: buffKey,
console.error(e); level,
alert(`실패했습니다: ${e}`); });
return; } catch (e) {
} console.error(e);
alert(`실패했습니다: ${e}`);
return;
}
alert("성공했습니다."); alert("성공했습니다.");
//TODO: 페이지 새로고침 필요없이 하도록 //TODO: 페이지 새로고침 필요없이 하도록
location.reload(); location.reload();
}, }
async setNextSpecialWar() { async function buySimple(type: "ResetTurnTime" | "BuyRandomUnique" | "ResetSpecialWar") {
const specialWarName = this.availableSpecialWar[this.nextSpecialWar].title ?? undefined; const costMap: Record<typeof type, number> = {
if (specialWarName === undefined) { ResetTurnTime: inheritActionCost.resetTurnTime,
alert(`잘못된 타입: ${this.nextSpecialWar}`); ResetSpecialWar: inheritActionCost.resetSpecialWar,
return; BuyRandomUnique: inheritActionCost.randomUnique,
} };
const cost = inheritActionCost.nextSpecial; const cost = costMap[type];
if (this.items.previous < cost) { if (cost === undefined) {
alert("유산 포인트가 부족합니다."); alert(`올바르지 않은 타입:${type}`);
return; return;
} }
const josaRo = JosaUtil.pick(specialWarName, '로'); const messageMap: Record<typeof type, string> = {
if (!confirm(`${cost} 포인트로 다음 전특을 ${specialWarName}${josaRo} 고정하겠습니까?`)) { ResetTurnTime: `${cost} 포인트로 턴을 초기화 하시겠습니까?`,
return; ResetSpecialWar: `${cost} 포인트로 전투 특기를 초기화 하시겠습니까?`,
} BuyRandomUnique: `${cost} 포인트로 랜덤 유니크를 구입하시겠습니까?`,
};
if (items.value.previous < cost) {
alert("유산 포인트가 부족합니다.");
return;
}
if (!confirm(messageMap[type])) {
return;
}
try { try {
await SammoAPI.InheritAction.SetNextSpecialWar({ await SammoAPI.InheritAction[type]();
type: this.nextSpecialWar, } catch (e) {
}); console.error(e);
} catch (e) { alert(`실패했습니다: ${e}`);
console.error(e); return;
alert(`실패했습니다: ${e}`); }
return;
}
alert("성공했습니다."); alert("성공했습니다.");
//TODO: 페이지 새로고침 필요없이 하도록 //TODO: 페이지 새로고침 필요없이 하도록
location.reload(); location.reload();
}, }
async openUniqueItemAuction() { async function setNextSpecialWar() {
if(this.specificUnique === null){ const specialWarName = availableSpecialWar[nextSpecialWar.value].title ?? undefined;
alert("유니크를 선택해주세요."); if (specialWarName === undefined) {
return; alert(`잘못된 타입: ${nextSpecialWar.value}`);
} return;
}
const uniqueName = this.availableUnique[this.specificUnique].title ?? undefined; const cost = inheritActionCost.nextSpecial;
if (uniqueName === undefined) { if (items.value.previous < cost) {
alert(`잘못된 타입: ${this.specificUnique}`); alert("유산 포인트가 부족합니다.");
return; return;
} }
const uniqueRawName = this.availableUnique[this.specificUnique].rawName ?? undefined;
const amount = this.specificUniqueAmount; const josaRo = JosaUtil.pick(specialWarName, "로");
if (this.items.previous < amount) { if (!confirm(`${cost} 포인트로 다음 전특을 ${specialWarName}${josaRo} 고정하겠습니까?`)) {
alert("유산 포인트가 부족합니다."); return;
return; }
}
const josaUl = JosaUtil.pick(uniqueRawName, '을'); try {
if (!confirm(`${amount} 포인트로 ${uniqueName}${josaUl} 입찰하겠습니까?`)) { await SammoAPI.InheritAction.SetNextSpecialWar({
return; type: nextSpecialWar.value,
} });
} catch (e) {
console.error(e);
alert(`실패했습니다: ${e}`);
return;
}
try { alert("성공했습니다.");
await SammoAPI.Auction.OpenUniqueAuction({ //TODO: 페이지 새로고침 필요없이 하도록
itemID: this.specificUnique, location.reload();
amount, }
}); async function openUniqueItemAuction() {
} catch (e) { if (specificUnique.value === null) {
console.error(e); alert("유니크를 선택해주세요.");
alert(`실패했습니다: ${e}`); return;
return; }
}
alert("성공했습니다. 경매장을 확인해주세요."); const uniqueName = availableUnique[specificUnique.value].title ?? undefined;
//TODO: 페이지 새로고침 필요없이 하도록 if (uniqueName === undefined) {
location.reload(); alert(`잘못된 타입: ${specificUnique.value}`);
}, return;
}, }
}); const uniqueRawName = availableUnique[specificUnique.value].rawName ?? undefined;
const amount = specificUniqueAmount.value;
if (items.value.previous < amount) {
alert("유산 포인트가 부족합니다.");
return;
}
const josaUl = JosaUtil.pick(uniqueRawName, "을");
if (!confirm(`${amount} 포인트로 ${uniqueName}${josaUl} 입찰하겠습니까?`)) {
return;
}
try {
await SammoAPI.Auction.OpenUniqueAuction({
itemID: specificUnique.value,
amount,
});
} catch (e) {
console.error(e);
alert(`실패했습니다: ${e}`);
return;
}
alert("성공했습니다. 경매장을 확인해주세요.");
//TODO: 페이지 새로고침 필요없이 하도록
location.reload();
}
async function getMoreLog(): Promise<void>{
try{
const result = await SammoAPI.InheritAction.GetMoreLog({
lastID: lastLogID.value
});
for(const log of result.log){
inheritPointLogs.value.set(log.id, log);
lastLogID.value = Math.min(lastLogID.value, log.id);
}
}catch(e){
console.error(e);
alert(`실패했습니다: ${e}`);
return;
}
}
</script> </script>
<style> <style>
+46 -7
View File
@@ -174,7 +174,7 @@
<div class="row"> <div class="row">
<div class="col col-6 a-right align-self-center">도시</div> <div class="col col-6 a-right align-self-center">도시</div>
<div class="col col-6 align-self-center"> <div class="col col-6 align-self-center">
<select v-model.number="args.inheritCity" class="form-select form-inline" style="max-width: 20ch"> <select v-model.number="inheritCity" class="form-select form-inline" style="max-width: 20ch">
<option :value="undefined">사용안함</option> <option :value="undefined">사용안함</option>
<option v-for="city in availableInheritCity" :key="city.id" :value="city.id"> <option v-for="city in availableInheritCity" :key="city.id" :value="city.id">
{{ `[${city.region}] ${city.name}` }} {{ `[${city.region}] ${city.name}` }}
@@ -216,13 +216,25 @@
<div class="a-center">추가 능력치 고정</div> <div class="a-center">추가 능력치 고정</div>
<div class="row"> <div class="row">
<div class="col"> <div class="col">
<NumberInputWithInfo v-model="(args.inheritBonusStat ?? [0, 0, 0])[0]" :max="stats.bonusMax" title="통솔" /> <NumberInputWithInfo
v-model="(args.inheritBonusStat ?? [0, 0, 0])[0]"
:max="stats.bonusMax"
title="통솔"
/>
</div> </div>
<div class="col"> <div class="col">
<NumberInputWithInfo v-model="(args.inheritBonusStat ?? [0, 0, 0])[1]" :max="stats.bonusMax" title="무력" /> <NumberInputWithInfo
v-model="(args.inheritBonusStat ?? [0, 0, 0])[1]"
:max="stats.bonusMax"
title="무력"
/>
</div> </div>
<div class="col"> <div class="col">
<NumberInputWithInfo v-model="(args.inheritBonusStat ?? [0, 0, 0])[2]" :max="stats.bonusMax" title="지력" /> <NumberInputWithInfo
v-model="(args.inheritBonusStat ?? [0, 0, 0])[2]"
:max="stats.bonusMax"
title="지력"
/>
</div> </div>
</div> </div>
</div> </div>
@@ -346,7 +358,7 @@ watch(gameConstStore, (gameConst) => {
total: gameConst.gameConst.defaultStatTotal, total: gameConst.gameConst.defaultStatTotal,
bonusMin: gameConst.gameConst.defaultStatMin, bonusMin: gameConst.gameConst.defaultStatMin,
bonusMax: gameConst.gameConst.defaultStatMax, bonusMax: gameConst.gameConst.defaultStatMax,
} };
args.value = { args.value = {
name: member.name, name: member.name,
@@ -361,8 +373,6 @@ watch(gameConstStore, (gameConst) => {
inheritSpecial: undefined, inheritSpecial: undefined,
inheritTurntime: undefined, inheritTurntime: undefined,
}; };
}); });
onMounted(async () => { onMounted(async () => {
@@ -466,6 +476,17 @@ watch(displayInherit, (newValue: boolean) => {
localStorage.setItem(`conf.${serverID}.join.displayInherit`, JSON.stringify(newValue)); localStorage.setItem(`conf.${serverID}.join.displayInherit`, JSON.stringify(newValue));
}); });
const inheritCity = ref<number>();
watch(inheritCity, (newValue: undefined | number) => {
if (!args.value) throw "nyc";
if (!newValue) {
args.value.inheritCity = undefined;
return;
}
args.value.inheritCity = inheritCity.value;
});
const inheritTurnTimeSet = ref(false); const inheritTurnTimeSet = ref(false);
watch(inheritTurnTimeSet, (newValue: boolean) => { watch(inheritTurnTimeSet, (newValue: boolean) => {
if (!args.value) throw "nyc"; if (!args.value) throw "nyc";
@@ -477,6 +498,24 @@ watch(inheritTurnTimeSet, (newValue: boolean) => {
args.value.inheritTurntime = inheritTurnTimeMinute.value * 60 + inheritTurnTimeSecond.value; args.value.inheritTurntime = inheritTurnTimeMinute.value * 60 + inheritTurnTimeSecond.value;
}); });
watch(
[inheritCity, inheritTurnTimeSet],
([newInheritCity, newInheritTurnTimeSet], [oldInheritCity, oldInheritTurnTimeSet]) => {
if (newInheritCity === undefined || newInheritTurnTimeSet === false) {
return;
}
alert("도시와 턴 시간을 동시에 설정할 수 없습니다.");
if (newInheritCity !== oldInheritCity) {
inheritCity.value = undefined;
}
if (newInheritTurnTimeSet !== oldInheritTurnTimeSet) {
inheritTurnTimeSet.value = false;
}
},
{ immediate: true }
);
const inheritTurnTimeMinute = ref(0); const inheritTurnTimeMinute = ref(0);
watch(inheritTurnTimeMinute, (newValue: number) => { watch(inheritTurnTimeMinute, (newValue: number) => {
if (!args.value) throw "nyc"; if (!args.value) throw "nyc";
+2
View File
@@ -102,6 +102,7 @@
<NumberInputWithInfo <NumberInputWithInfo
v-model="nationPolicy.minimumResourceActionAmount" v-model="nationPolicy.minimumResourceActionAmount"
:step="100" :step="100"
:min="100"
title="포상/몰수/헌납/삼/팜 최소 단위" title="포상/몰수/헌납/삼/팜 최소 단위"
> >
연산결과가 단위보다 적다면 수행하지 않습니다. 연산결과가 단위보다 적다면 수행하지 않습니다.
@@ -111,6 +112,7 @@
<NumberInputWithInfo <NumberInputWithInfo
v-model="nationPolicy.maximumResourceActionAmount" v-model="nationPolicy.maximumResourceActionAmount"
:step="100" :step="100"
:min="100"
title="포상/몰수/헌납/삼/팜 최대 단위" title="포상/몰수/헌납/삼/팜 최대 단위"
> >
연산결과가 단위보다 크다면, 값에 맞춥니다. 연산결과가 단위보다 크다면, 값에 맞춥니다.
+10 -1
View File
@@ -17,7 +17,7 @@ import { APIPathGen, NumVar, StrVar } from "./util/APIPathGen.js";
import type { BettingDetailResponse, BettingListResponse } from "./defs/API/Betting"; import type { BettingDetailResponse, BettingListResponse } from "./defs/API/Betting";
import type { ReserveBulkCommandResponse, ReserveCommandResponse, ReservedCommandResponse } from "./defs/API/Command"; import type { ReserveBulkCommandResponse, ReserveCommandResponse, ReservedCommandResponse } from "./defs/API/Command";
import type { ChiefResponse } from "./defs/API/NationCommand"; import type { ChiefResponse } from "./defs/API/NationCommand";
import type { inheritBuffType } from "./defs/API/InheritAction"; import type { inheritBuffType, InheritLogResponse } from "./defs/API/InheritAction";
import type { SetBlockWarResponse, GeneralListResponse as NationGeneralListResponse } from "./defs/API/Nation"; import type { SetBlockWarResponse, GeneralListResponse as NationGeneralListResponse } from "./defs/API/Nation";
import type { UploadImageResponse } from "./defs/API/Misc"; import type { UploadImageResponse } from "./defs/API/Misc";
import type { GeneralLogType, GetGeneralLogResponse, JoinArgs } from "./defs/API/General"; import type { GeneralLogType, GetGeneralLogResponse, JoinArgs } from "./defs/API/General";
@@ -125,6 +125,8 @@ const apiRealPath = {
DropItem: PUT as APICallT<{ DropItem: PUT as APICallT<{
itemType: ItemTypeKey; itemType: ItemTypeKey;
}>, }>,
DieOnPrestart: POST as APICallT<undefined>,
BuildNationCandidate: POST as APICallT<undefined>,
}, },
Global: { Global: {
GeneralList: GET as APICallT<undefined, GeneralListResponse>, GeneralList: GET as APICallT<undefined, GeneralListResponse>,
@@ -154,6 +156,9 @@ const apiRealPath = {
SetNextSpecialWar: PUT as APICallT<{ SetNextSpecialWar: PUT as APICallT<{
type: string; type: string;
}>, }>,
GetMoreLog: GET as APICallT<{
lastID: number
}, InheritLogResponse>
}, },
Misc: { Misc: {
UploadImage: POST as APICallT< UploadImage: POST as APICallT<
@@ -222,6 +227,10 @@ const apiRealPath = {
}, },
GetGeneralLogResponse GetGeneralLogResponse
>, >,
SetTroopName: PATCH as APICallT<{
troopID: number;
troopName: string;
}>,
}, },
Vote: { Vote: {
AddComment: POST as APICallT<{ AddComment: POST as APICallT<{
+179 -75
View File
@@ -2,89 +2,101 @@
<div class="bg0"> <div class="bg0">
<div class="bg2">거래장</div> <div class="bg2">거래장</div>
<div style="background-color: orange"> 구매</div> <div style="background-color: orange"> 구매</div>
<div class="row gx-0"> <div class="auctionItem gx-0">
<div class="col">번호</div> <div class="idx">번호</div>
<div class="col">판매자</div> <div class="host">판매자</div>
<div class="col">물품</div> <div class="amount">수량</div>
<div class="col">수량</div> <div class="highestBidder">입찰자</div>
<div class="col">시작 구매</div> <div class="highestBid">입찰</div>
<div class="col">현재 구매</div> <div class="bidRatio"></div>
<div class="col">즉시 구매</div> <div class="finishBid">마감</div>
<div class="col">단가</div> <div class="closeDate">거래 종료</div>
<div class="col">구매 예정자</div>
<div class="col">거래 종료</div>
</div> </div>
<div v-for="auction of buyRice" :key="auction.id" class="row gx-0" @click="selectedBuyRiceAuction = auction"> <div
<div class="col">{{ auction.id }}</div> v-for="auction of buyRice"
<div class="col">{{ auction.hostName }}</div> :key="auction.id"
<div class="col"></div> class="auctionItem gx-0"
<div class="col">{{ auction.amount }}</div> @click="selectedBuyRiceAuction = auction"
<div class="col">{{ auction.startBidAmount }}</div> >
<div class="col">{{ auction.highestBid ? auction.highestBid.amount : "-" }}</div> <div class="idx f_tnum">{{ auction.id }}</div>
<div class="col">{{ auction.finishBidAmount }}</div> <div class="host">{{ auction.hostName }}</div>
<div class="col">{{ auction.highestBid ? (auction.highestBid.amount / auction.amount).toFixed(2) : "-" }}</div> <div class="amount f_tnum"> {{ auction.amount.toLocaleString() }}</div>
<div class="col">{{ auction.highestBid ? auction.highestBid.generalName : "-" }}</div> <div class="highestBidder">{{ auction.highestBid?.generalName ?? "-" }}</div>
<div class="col">{{ auction.closeDate }}</div> <div :class="['highestBid f_tnum', auction.highestBid ? '' : 'noBid']">
{{ (auction.highestBid?.amount ?? auction.startBidAmount).toLocaleString() }}
</div>
<div class="bidRatio f_tnum">
{{ auction.highestBid ? (auction.highestBid.amount / auction.amount).toFixed(2) : "-" }}
</div>
<div class="finishBid f_tnum"> {{ auction.finishBidAmount.toLocaleString() }}</div>
<div class="closeDate f_tnum">{{ cutDateTime(auction.closeDate) }}</div>
</div> </div>
<div v-if="selectedBuyRiceAuction !== undefined" class="row"> <div v-if="selectedBuyRiceAuction !== undefined" class="row gx-1">
<div class="col">{{ selectedBuyRiceAuction.id }} {{ selectedBuyRiceAuction.amount }} 경매에</div> <div class="offset-1 col-4 offset-md-3 col-md-2 align-self-center f_tnum text-end">
<div class="col"> {{ selectedBuyRiceAuction.id }} {{ selectedBuyRiceAuction.amount }} 경매에
</div>
<div class="col-3 col-md-2">
<NumberInputWithInfo <NumberInputWithInfo
v-model="bidAmountBuyRiceAuction" v-model="bidAmountBuyRiceAuction"
:int="true" :int="true"
:min="selectedBuyRiceAuction.startBidAmount" :min="selectedBuyRiceAuction.startBidAmount"
:max="selectedBuyRiceAuction.finishBidAmount" :max="selectedBuyRiceAuction.finishBidAmount"
title="금"
:step="10" :step="10"
></NumberInputWithInfo> ></NumberInputWithInfo>
</div> </div>
<div class="col"><BButton @click="bidBuyRiceAuction">입찰</BButton></div> <div class="col-2 col-md-1 d-grid"><BButton @click="bidBuyRiceAuction">입찰</BButton></div>
</div> </div>
<div style="background-color: skyblue"> 판매</div> <div style="background-color: skyblue"> 판매</div>
<div class="row gx-0"> <div class="auctionItem gx-0">
<div class="col">번호</div> <div class="idx">번호</div>
<div class="col">판매자</div> <div class="host">판매자</div>
<div class="col">물품</div> <div class="amount">수량</div>
<div class="col">수량</div> <div class="highestBidder">입찰자</div>
<div class="col">시작 구매</div> <div class="highestBid">입찰</div>
<div class="col">현재 구매</div> <div class="bidRatio"></div>
<div class="col">즉시 구매</div> <div class="finishBid">마감</div>
<div class="col">단가</div> <div class="closeDate">거래 종료</div>
<div class="col">구매 예정자</div>
<div class="col">거래 종료</div>
</div> </div>
<div v-for="auction of sellRice" :key="auction.id" class="row gx-0" @click="selectedSellRiceAuction = auction"> <div
<div class="col">{{ auction.id }}</div> v-for="auction of sellRice"
<div class="col">{{ auction.hostName }}</div> :key="auction.id"
<div class="col"></div> class="auctionItem gx-0"
<div class="col">{{ auction.amount }}</div> @click="selectedSellRiceAuction = auction"
<div class="col">{{ auction.startBidAmount }}</div> >
<div class="col">{{ auction.highestBid ? auction.highestBid.amount : "-" }}</div> <div class="idx f_tnum">{{ auction.id }}</div>
<div class="col">{{ auction.finishBidAmount }}</div> <div class="host">{{ auction.hostName }}</div>
<div class="col">{{ auction.highestBid ? (auction.highestBid.amount / auction.amount).toFixed(2) : "-" }}</div> <div class="amount f_tnum">{{ auction.amount.toLocaleString() }}</div>
<div class="col">{{ auction.highestBid ? auction.highestBid.generalName : "-" }}</div> <div class="highestBidder">{{ auction.highestBid?.generalName ?? "-" }}</div>
<div class="col">{{ auction.closeDate }}</div> <div :class="['highestBid f_tnum', auction.highestBid ? '' : 'noBid']">
{{ (auction.highestBid?.amount ?? auction.startBidAmount).toLocaleString() }}
</div>
<div class="bidRatio f_tnum">
{{ auction.highestBid ? (auction.highestBid.amount / auction.amount).toFixed(2) : "-" }}
</div>
<div class="finishBid f_tnum"> {{ auction.finishBidAmount.toLocaleString() }}</div>
<div class="closeDate f_tnum">{{ cutDateTime(auction.closeDate) }}</div>
</div> </div>
<div v-if="selectedSellRiceAuction !== undefined" class="row"> <div v-if="selectedSellRiceAuction !== undefined" class="row gx-1">
<div class="col">{{ selectedSellRiceAuction.id }} {{ selectedSellRiceAuction.amount }} 경매에</div> <div class="offset-1 col-4 offset-md-3 col-md-2 align-self-center f_tnum text-end">
<div class="col"> {{ selectedSellRiceAuction.id }} {{ selectedSellRiceAuction.amount }} 경매에
</div>
<div class="col-3 col-md-2">
<NumberInputWithInfo <NumberInputWithInfo
v-model="bidAmountSellRiceAuction" v-model="bidAmountSellRiceAuction"
:int="true" :int="true"
:min="selectedSellRiceAuction.startBidAmount" :min="selectedSellRiceAuction.startBidAmount"
:max="selectedSellRiceAuction.finishBidAmount" :max="selectedSellRiceAuction.finishBidAmount"
title="쌀"
:step="10" :step="10"
></NumberInputWithInfo> ></NumberInputWithInfo>
</div> </div>
<div class="col"><BButton @click="bidSellRiceAuction">입찰</BButton></div> <div class="col-2 col-md-1 d-grid"><BButton @click="bidSellRiceAuction">입찰</BButton></div>
</div> </div>
<div>경매 등록</div> <div>경매 등록</div>
<div class="row"> <div class="row gx-1">
<div class="col"> <div class="col-2 offset-md-2 col-md-1">
매물 매물<br />
<BButtonGroup> <BButtonGroup>
<BButton :pressed="openAuctionInfo.type == 'buyRice'" @click="openAuctionInfo.type = 'buyRice'"> </BButton> <BButton :pressed="openAuctionInfo.type == 'buyRice'" @click="openAuctionInfo.type = 'buyRice'"> </BButton>
<BButton :pressed="openAuctionInfo.type == 'sellRice'" @click="openAuctionInfo.type = 'sellRice'"> <BButton :pressed="openAuctionInfo.type == 'sellRice'" @click="openAuctionInfo.type = 'sellRice'">
@@ -92,50 +104,56 @@
</BButton> </BButton>
</BButtonGroup> </BButtonGroup>
</div> </div>
<div class="col">
<NumberInputWithInfo <div class="col col-md-2">
v-model="openAuctionInfo.closeTurnCnt" 수량 ({{ openAuctionInfo.type == "buyRice" ? "쌀" : "금" }})<br />
:int="true"
:min="3"
:max="24"
title="기간(턴)"
:step="1"
></NumberInputWithInfo>
</div>
<div class="col">
<NumberInputWithInfo <NumberInputWithInfo
v-model="openAuctionInfo.amount" v-model="openAuctionInfo.amount"
:int="true" :int="true"
:min="100" :min="100"
:max="10000" :max="10000"
title="수량"
:step="10" :step="10"
></NumberInputWithInfo> ></NumberInputWithInfo>
</div> </div>
<div class="col"> <div class="col-2 col-md-1">
기간()
<NumberInputWithInfo
v-model="openAuctionInfo.closeTurnCnt"
:int="true"
:min="3"
:max="24"
:step="1"
></NumberInputWithInfo>
</div>
<div class="col col-md-2">
시작가 ({{ openAuctionInfo.type == "buyRice" ? "금" : "쌀" }})
<NumberInputWithInfo <NumberInputWithInfo
v-model="openAuctionInfo.startBidAmount" v-model="openAuctionInfo.startBidAmount"
:int="true" :int="true"
:min="100" :min="100"
:max="10000" :max="10000"
title="시작구매가"
:step="10" :step="10"
></NumberInputWithInfo> ></NumberInputWithInfo>
</div> </div>
<div class="col"> <div class="col col-md-2">
마감가 ({{ openAuctionInfo.type == "buyRice" ? "금" : "쌀" }})
<NumberInputWithInfo <NumberInputWithInfo
v-model="openAuctionInfo.finishBidAmount" v-model="openAuctionInfo.finishBidAmount"
:int="true" :int="true"
:min="100" :min="100"
:max="10000" :max="10000"
title="즉시구매가"
:step="10" :step="10"
></NumberInputWithInfo> ></NumberInputWithInfo>
</div> </div>
<div class="col"> <div class="col-1 d-grid">
<BButton @click="openAuction">등록</BButton> <BButton @click="openAuction">등록</BButton>
</div> </div>
</div> </div>
<div>이전 경매(최근 20)</div>
<div v-for="(log, idx) in recentLogs" :key="idx">
<!-- eslint-disable-next-line vue/no-v-html -->
<div v-html="formatLog(log)" />
</div>
</div> </div>
</template> </template>
@@ -147,10 +165,12 @@ import { useToast, BButtonGroup, BButton } from "bootstrap-vue-3";
import { isString } from "lodash"; import { isString } from "lodash";
import { onMounted, reactive, ref, watch } from "vue"; import { onMounted, reactive, ref, watch } from "vue";
import NumberInputWithInfo from "@/components/NumberInputWithInfo.vue"; import NumberInputWithInfo from "@/components/NumberInputWithInfo.vue";
import { formatLog } from "@/utilGame/formatLog";
const toasts = unwrap(useToast()); const toasts = unwrap(useToast());
const buyRice = ref<BasicResourceAuctionInfo[]>([]); const buyRice = ref<BasicResourceAuctionInfo[]>([]);
const sellRice = ref<BasicResourceAuctionInfo[]>([]); const sellRice = ref<BasicResourceAuctionInfo[]>([]);
const recentLogs = ref<string[]>([]);
const selectedBuyRiceAuction = ref<BasicResourceAuctionInfo | undefined>(undefined); const selectedBuyRiceAuction = ref<BasicResourceAuctionInfo | undefined>(undefined);
const bidAmountBuyRiceAuction = ref<number>(0); const bidAmountBuyRiceAuction = ref<number>(0);
@@ -162,6 +182,12 @@ watch(selectedBuyRiceAuction, (auction) => {
bidAmountBuyRiceAuction.value = auction.highestBid ? auction.highestBid.amount : auction.startBidAmount; bidAmountBuyRiceAuction.value = auction.highestBid ? auction.highestBid.amount : auction.startBidAmount;
}); });
function cutDateTime(dateTime: string, showSecond = false) {
if (showSecond) {
return dateTime.substring(5, 19);
}
return dateTime.substring(5, 16);
}
async function bidBuyRiceAuction() { async function bidBuyRiceAuction() {
if (selectedBuyRiceAuction.value === undefined) { if (selectedBuyRiceAuction.value === undefined) {
@@ -244,6 +270,7 @@ async function refresh() {
const result = await SammoAPI.Auction.GetActiveResourceAuctionList(); const result = await SammoAPI.Auction.GetActiveResourceAuctionList();
buyRice.value = result.buyRice; buyRice.value = result.buyRice;
sellRice.value = result.sellRice; sellRice.value = result.sellRice;
recentLogs.value = result.recentLogs;
} catch (e) { } catch (e) {
console.error(e); console.error(e);
if (isString(e)) { if (isString(e)) {
@@ -282,8 +309,85 @@ async function openAuction() {
} }
} }
defineExpose({
refresh,
});
onMounted(async () => { onMounted(async () => {
void refresh(); void refresh();
console.log("mounted"); console.log("mounted");
}); });
</script> </script>
<style lang="scss" scoped>
@import "@scss/common/break_500px.scss";
.auctionItem {
display: grid;
text-align: center;
> div {
align-self: center;
}
.noBid {
color: #ccc;
}
border-bottom: solid gray 1px;
}
@include media-500px {
.auctionItem {
grid-template-columns: 1fr 3fr 3fr 1fr 2fr 2fr;
grid-template-rows: 1fr 1fr;
.idx {
grid-column: 1 / 2;
grid-row: 1 / 3;
}
.host {
grid-column: 2 / 3;
grid-row: 1 / 2;
}
.amount {
grid-column: 2 / 3;
grid-row: 2/ 3;
}
.highestBidder {
grid-column: 3 / 4;
grid-row: 1 / 2;
}
.highestBid {
grid-column: 3 / 4;
grid-row: 2 / 3;
}
.bidRatio {
grid-column: 4 / 5;
grid-row: 1 / 3;
}
.finishBid {
grid-column: 5 / 6;
grid-row: 1 / 3;
}
.closeDate {
grid-column: 6 / 7;
grid-row: 1 / 3;
}
}
}
@include media-1000px {
.auctionItem {
grid-template-columns: 1fr 2fr 2fr 2fr 2fr 1fr 3fr 2fr;
grid-template-rows: 1fr;
}
}
</style>
+143 -44
View File
@@ -1,61 +1,121 @@
<template> <template>
<div class="bg0"> <div class="bg0">
<div class="bg2">유니크 경매장</div> <div>
<div> 가명: {{ obfuscatedName }}</div> 가명: <span class="isMe">{{ obfuscatedName }}</span>
</div>
<template v-if="currentAuction !== undefined"> <template v-if="currentAuction !== undefined">
<div class="bg1">상세</div> <div class="bg2">경매 {{ currentAuction.auction.id }} 상세</div>
<div class="row gx-0"> <div class="row gx-0 text-center">
<div class="col-4 col-md-2 bg2">경매 번호</div> <div class="col-2 col-md-1 bg1">경매</div>
<div class="col-4 col-md-2">{{ currentAuction.auction.id }}</div>
<div class="col-4 col-md-2 bg2">경매명</div>
<div class="col-4 col-md-2">{{ currentAuction.auction.title }}</div> <div class="col-4 col-md-2">{{ currentAuction.auction.title }}</div>
<div class="col-4 col-md-2 bg2">주최자(익명)</div> <div class="col-2 col-md-1 bg1">주최자(익명)</div>
<div class="col-4 col-md-2">{{ currentAuction.auction.hostName }}</div> <div :class="['col-4 col-md-2', currentAuction.auction.isCallerHost ? 'isMe' : '']">
{{ currentAuction.auction.hostName }}
</div>
<div class="col-4 col-md-2 bg2">종료시</div> <div class="col-2 col-md-1 bg1">종료</div>
<div class="col-4 col-md-2">{{ currentAuction.auction.closeDate }}</div> <div class="col-4 col-md-2 f_tnum">{{ cutDateTime(currentAuction.auction.closeDate, true) }}</div>
<div class="col-4 col-md-2 bg2">최대지연</div> <div class="col-2 col-md-1 bg1">최대지연</div>
<div class="col-4 col-md-2">{{ currentAuction.auction.availableLatestBidCloseDate }}</div> <div class="col-4 col-md-2 f_tnum">
{{ cutDateTime(currentAuction.auction.availableLatestBidCloseDate, true) }}
</div>
</div> </div>
<div class="bg1">입찰자 목록</div> <div class="bg1">입찰자 목록</div>
<div class="row gx-0 bg2"> <div
<div class="col-4">입찰자</div> class="row gx-0 px-md-5 text-center"
<div class="col-4">입찰포인트</div> :style="{
<div class="col-4">시각</div> borderBottom: 'solid 1px white',
}"
>
<div class="col-4 offset-md-2 col-md-3">입찰자</div>
<div class="col-4 col-md-2 text-end px-5">입찰포인트</div>
<div class="col-4 col-md-3">시각</div>
</div> </div>
<div v-for="bidder of currentAuction.bidList" :key="bidder.amount" class="row gx-0"> <div v-for="bidder of currentAuction.bidList" :key="bidder.amount" class="row gx-0 px-md-5 text-center">
<div class="col-4">{{ bidder.generalName }}</div> <div :class="['col-4 offset-md-2 col-md-3', bidder.isCallerHighestBidder ? 'isMe' : '']">{{ bidder.generalName }}</div>
<div class="col-4">{{ bidder.amount }}</div> <div class="col-4 col-md-2 text-end px-5 f_tnum">{{ bidder.amount.toLocaleString() }}</div>
<div class="col-4">{{ bidder.date }}</div> <div class="col-4 col-md-3 f_tnum">{{ cutDateTime(bidder.date) }}</div>
</div> </div>
<div class="bg1">입찰하기</div> <div class="bg1">입찰하기</div>
<div class="row"> <div class="row">
<div class="col"> <label class="col-5 offset-md-3 col-md-3 col-form-label text-center">유산포인트 (잔여: {{ currentAuction.remainPoint.toLocaleString() }}포인트)</label>
<div class="col-4 col-md-2">
<NumberInputWithInfo <NumberInputWithInfo
v-model="bidAmount" v-model="bidAmount"
:int="true" :int="true"
:min="currentAuction.bidList[0].amount" :min="currentAuction.bidList[0].amount"
title="유산포인트" :max="currentAuction.remainPoint"
title=""
:step="1" :step="1"
></NumberInputWithInfo> ></NumberInputWithInfo>
</div> </div>
<div class="col"><BButton @click="bidAuction">입찰</BButton></div> <div class="col-3 col-md-1 d-grid"><BButton @click="bidAuction">입찰</BButton></div>
</div> </div>
</template> </template>
<div class="bg1">목록</div> <div class="bg1">진행중인 경매 목록</div>
<div v-for="[auctionID, auction] of auctionList" :key="auctionID" class="row" @click="currentAuctionID = auctionID"> <div
<div class="col">{{ auction.id }}</div> class="row gx-0 text-center"
<div class="col">{{ auction.finished ? "종료됨" : "진행중" }}</div> :style="{
<div class="col">{{ auction.title }}</div> borderBottom: 'solid 1px white',
<div class="col">{{ auction.hostName }}</div> }"
<div class="col">{{ auction.closeDate }}</div> >
<div class="col">{{ auction.remainCloseDateExtensionCnt > 0 ? "남음" : "소진" }}</div> <div class="col-1">번호</div>
<div class="col">{{ auction.highestBid.generalName }}</div> <div class="col-4">경매명</div>
<div class="col">{{ auction.highestBid.amount }}</div> <div class="col-1">주최자</div>
<div class="col-2">종료일시</div>
<div class="col-1">연장</div>
<div class="col-1">1순위</div>
<div class="col-2 text-end px-2">포인트</div>
</div>
<div
v-for="[auctionID, auction] of ongoingAuctionList"
:key="auctionID"
class="row gx-0 text-center clickableRow"
@click="currentAuctionID = auctionID"
>
<div class="col-1">{{ auction.id }}</div>
<div class="col-4">{{ auction.title }}</div>
<div :class="['col-1', auction.isCallerHost ? 'isMe' : '']">{{ auction.hostName }}</div>
<div class="col-2 f_tnum">{{ cutDateTime(auction.closeDate) }}</div>
<div class="col-1">{{ auction.remainCloseDateExtensionCnt > 0 ? "남음" : "소진" }}</div>
<div :class="['col-1', auction.highestBid.isCallerHighestBidder ? 'isMe' : '']">
{{ auction.highestBid.generalName }}
</div>
<div class="col-2 text-end px-2 f_tnum">{{ auction.highestBid.amount.toLocaleString() }}</div>
</div>
<div class="bg1">종료된 경매 목록</div>
<div
class="row gx-0 text-center"
:style="{
borderBottom: 'solid 1px white',
}"
>
<div class="col-1">번호</div>
<div class="col-4">경매명</div>
<div class="col-1">주최자</div>
<div class="col-2">종료일시</div>
<div class="col-1">연장</div>
<div class="col-1">1순위</div>
<div class="col-2 text-end px-2">포인트</div>
</div>
<div
v-for="[auctionID, auction] of finishedAuctionList"
:key="auctionID"
class="row gx-0 text-center clickableRow"
@click="currentAuctionID = auctionID"
>
<div class="col-1">{{ auction.id }}</div>
<div class="col-4">{{ auction.title }}</div>
<div :class="['col-1', auction.isCallerHost ? 'isMe' : '']">{{ auction.hostName }}</div>
<div class="col-2 f_tnum">{{ cutDateTime(auction.closeDate) }}</div>
<div class="col-1">{{ auction.remainCloseDateExtensionCnt > 0 ? "남음" : "소진" }}</div>
<div :class="['col-1', auction.highestBid.isCallerHighestBidder ? 'isMe' : '']">
{{ auction.highestBid.generalName }}
</div>
<div class="col-2 text-end px-2 f_tnum">{{ auction.highestBid.amount.toLocaleString() }}</div>
</div> </div>
</div> </div>
</template> </template>
@@ -95,19 +155,35 @@ async function refreshDetail() {
watch(currentAuctionID, () => { watch(currentAuctionID, () => {
void refreshDetail(); void refreshDetail();
}); });
const auctionList = ref(new Map<number, AuctionItemInfo>()); const ongoingAuctionList = ref(new Map<number, AuctionItemInfo>());
const finishedAuctionList = ref(new Map<number, AuctionItemInfo>());
const obfuscatedName = ref(""); const obfuscatedName = ref("");
const toasts = unwrap(useToast()); const toasts = unwrap(useToast());
async function refresh() { function cutDateTime(dateTime: string, showSecond = false) {
if (showSecond) {
return dateTime.substring(5, 19);
}
return dateTime.substring(5, 16);
}
async function refreshList() {
try { try {
const result = await SammoAPI.Auction.GetUniqueItemAuctionList(); const result = await SammoAPI.Auction.GetUniqueItemAuctionList();
obfuscatedName.value = result.obfuscatedName; obfuscatedName.value = result.obfuscatedName;
auctionList.value = new Map(result.list.map((auction) => [auction.id, auction])); finishedAuctionList.value = new Map(
if (currentAuctionID.value === undefined && result.list.length > 0) { result.list.filter((auction) => auction.finished).map((auction) => [auction.id, auction])
currentAuctionID.value = result.list[0].id; );
bidAmount.value = result.list[0].highestBid.amount; ongoingAuctionList.value = new Map(
result.list.filter((auction) => !auction.finished).map((auction) => [auction.id, auction])
);
if (currentAuctionID.value === undefined && ongoingAuctionList.value.size > 0) {
const auctionIterator = ongoingAuctionList.value.values().next();
if (!auctionIterator.done) {
currentAuctionID.value = auctionIterator.value.id;
bidAmount.value = auctionIterator.value.highestBid.amount;
}
} }
} catch (e) { } catch (e) {
console.error(e); console.error(e);
@@ -135,8 +211,7 @@ async function bidAuction() {
title: "성공", title: "성공",
body: "입찰이 완료되었습니다.", body: "입찰이 완료되었습니다.",
}); });
void refreshDetail(); await refresh();
void refresh();
} catch (e) { } catch (e) {
console.error(e); console.error(e);
if (isString(e)) { if (isString(e)) {
@@ -149,7 +224,31 @@ async function bidAuction() {
} }
} }
async function refresh() {
const waiters = [refreshList(), refreshDetail()];
await Promise.all(waiters);
}
defineExpose({
refresh,
});
onMounted(() => { onMounted(() => {
void refresh(); void refreshList();
}); });
</script> </script>
<style>
.isMe {
font-weight: bold;
color: aquamarine;
}
.clickableRow{
cursor: pointer;
}
.clickableRow:hover{
background-color: rgba(255, 255, 255, 0.3);
}
</style>
+19 -5
View File
@@ -1,7 +1,7 @@
<template> <template>
<div class="row form-group number-input-with-info"> <div class="row form-group number-input-with-info">
<label v-if="!right" class="col-6 col-form-label">{{ title }}</label> <label v-if="!right && title" class="col col-form-label">{{ title }}</label>
<div class="col-6"> <div class="col">
<input <input
ref="input" ref="input"
v-model="rawValue" v-model="rawValue"
@@ -23,13 +23,14 @@
@focus="onFocusText" @focus="onFocusText"
/> />
</div> </div>
<label v-if="right" class="col-6 col-form-label">{{ title }}</label> <label v-if="right && title" class="col col-form-label">{{ title }}</label>
</div> </div>
<div style="text-align: right"> <div style="text-align: right">
<small class="form-text text-muted"><slot /></small> <small class="form-text text-muted"><slot /></small>
</div> </div>
</template> </template>
<script lang="ts"> <script lang="ts">
import { clamp } from "lodash";
import { defineComponent } from "vue"; import { defineComponent } from "vue";
export default defineComponent({ export default defineComponent({
@@ -47,7 +48,8 @@ export default defineComponent({
}, },
title: { title: {
type: String, type: String,
required: true, required: false,
default: null,
}, },
min: { min: {
type: Number, type: Number,
@@ -97,11 +99,23 @@ export default defineComponent({
this.rawValue = Math.floor(this.rawValue); this.rawValue = Math.floor(this.rawValue);
} }
this.printValue = this.rawValue.toLocaleString(); this.printValue = this.rawValue.toLocaleString();
this.$emit("update:modelValue", this.rawValue); if (this.min !== undefined || this.max !== undefined) {
const clampedValue = clamp(this.rawValue, this.min ?? this.rawValue, this.max ?? this.rawValue);
this.$emit("update:modelValue", clampedValue);
} else {
this.$emit("update:modelValue", this.rawValue);
}
}, },
onBlurNumber() { onBlurNumber() {
this.editmode = false; this.editmode = false;
this.printValue = this.rawValue.toLocaleString(); this.printValue = this.rawValue.toLocaleString();
if (this.min !== undefined || this.max !== undefined) {
const clampedValue = clamp(this.rawValue, this.min ?? this.rawValue, this.max ?? this.rawValue);
if (clampedValue !== this.rawValue) {
this.rawValue = clampedValue;
this.updateValue();
}
}
}, },
onFocusText() { onFocusText() {
if (this.readonly) { if (this.readonly) {
+2 -1
View File
@@ -17,7 +17,7 @@ export type BasicResourceAuctionInfo = {
amount: number; amount: number;
startBidAmount: number; startBidAmount: number;
finishBidAmount: number; finishBidAmount: number;
highestBid: BasicResourceAuctionBidder; highestBid?: BasicResourceAuctionBidder;
}; };
export type UniqueItemAuctionBidder = { export type UniqueItemAuctionBidder = {
@@ -57,6 +57,7 @@ export type UniqueItemAuctionDetail = ValidResponse & {
auction: UniqueItemAuctionInfo; auction: UniqueItemAuctionInfo;
bidList: UniqueItemAuctionBidder[]; bidList: UniqueItemAuctionBidder[];
obfuscatedName: string; obfuscatedName: string;
remainPoint: number;
}; };
export type OpenAuctionResponse = ValidResponse & { export type OpenAuctionResponse = ValidResponse & {
+23 -8
View File
@@ -1,9 +1,24 @@
import type { ValidResponse } from "@/util/callSammoAPI";
export type inheritBuffType = export type inheritBuffType =
| "warAvoidRatio" | "warAvoidRatio"
| "warCriticalRatio" | "warCriticalRatio"
| "warMagicTrialProb" | "warMagicTrialProb"
| "domesticSuccessProb" | "domesticSuccessProb"
| "domesticFailProb" | "domesticFailProb"
| "warAvoidRatioOppose" | "warAvoidRatioOppose"
| "warCriticalRatioOppose" | "warCriticalRatioOppose"
| "warMagicTrialProbOppose"; | "warMagicTrialProbOppose";
export type InheritPointLogItem = {
id: number;
server_id: string;
year: number;
month: number;
date: string;
text: string;
};
export type InheritLogResponse = ValidResponse & {
log: InheritPointLogItem[];
};
+1 -1
View File
@@ -60,7 +60,7 @@ const serverCreateTemplate = "\
</div></td>"; </div></td>";
const serverLoginTemplate = "\ const serverLoginTemplate = "\
<td style='background:url(\"<%picture%>\");background-size: 64px 64px;'></td>\ <td style='background:url(\"<%picture%>\");background-size: 64px 64px;background-repeat: no-repeat;background-position: center center;'></td>\
<td><%name%></td>\ <td><%name%></td>\
<td class='ignore_border'>\ <td class='ignore_border'>\
<div class='d-grid'>\ <div class='d-grid'>\
+19 -12
View File
@@ -130,22 +130,15 @@ $(function ($) {
}); });
$('#die_immediately').on('click', async function (e) { $('#dieOnPrestart').on('click', async function (e) {
e.preventDefault(); e.preventDefault();
if (!confirm('정말로 삭제하시겠습니까?')) { if (!confirm('정말로 삭제하시겠습니까?')) {
return false; return false;
} }
let result: InvalidResponse;
try { try {
const response = await axios({ await SammoAPI.General.DieOnPrestart();
url: 'j_die_immediately.php',
method: 'post',
responseType: 'json',
});
result = response.data;
} }
catch (e) { catch (e) {
console.log(e); console.log(e);
@@ -154,13 +147,27 @@ $(function ($) {
return; return;
} }
if (!result.result) { location.replace('..');
alert(`실패했습니다: ${result.reason}`); });
$('#buildNationCandidate').on('click', async function (e) {
e.preventDefault();
if(!confirm('거병 이후 장수를 삭제할 수 없게됩니다. 거병하시겠습니까?')){
return false;
}
try {
await SammoAPI.General.BuildNationCandidate();
}
catch (e) {
console.log(e);
alert(`실패했습니다: ${e}`);
location.reload(); location.reload();
return; return;
} }
location.replace('..'); location.reload();
}); });
$('#vacation').on('click', async function (e) { $('#vacation').on('click', async function (e) {
+24 -19
View File
@@ -23,14 +23,31 @@
현재 피장파장이 불가능한 국가는 현재 피장파장이 불가능한 국가는
<span style="color: red">붉은색</span>으로 표시됩니다.<br /> <span style="color: red">붉은색</span>으로 표시됩니다.<br />
</div> </div>
<div class="row"> <div class="row gx-3">
<div class="col-6 col-md-3"> <div class="col-5 col-md-3">
국가 : 국가 :
<SelectNation v-model="selectedNationID" :nations="nationList" :searchable="searchable" /> <SelectNation v-model="selectedNationID" :nations="nationList" :searchable="searchable" />
</div> </div>
<div class="col-3 col-md-2"> <div class="col-4 col-md-2">
<label>전략 :</label> <label>전략 :</label>
<b-form-select v-model="selectedCommandID" :options="commandTypesOption" /> <select
v-model="selectedCommandID"
class="form-control"
:style="{
color: availableCommandTypeList[selectedCommandID].remainTurn > 0 ? 'red' : undefined,
}"
>
<option
v-for="(command, commandRawName) in availableCommandTypeList"
:key="commandRawName"
:value="commandRawName"
:style="{
color: command.remainTurn > 0 ? 'red' : 'black',
}"
>
{{ command.name }} {{ command.remainTurn > 0 ? `(불가, ${command.remainTurn}턴)` : "" }}
</option>
</select>
</div> </div>
<div class="col-3 col-md-2 d-grid"> <div class="col-3 col-md-2 d-grid">
<b-button @click="submit"> <b-button @click="submit">
@@ -56,7 +73,7 @@ declare const procRes: {
delayCnt: number; delayCnt: number;
postReqTurn: number; postReqTurn: number;
availableCommandTypeList: Record< availableCommandTypeList: Record<
number, string,
{ {
name: string; name: string;
remainTurn: number; remainTurn: number;
@@ -98,7 +115,6 @@ void Promise.all([storeP]).then(() => {
asyncReady.value = true; asyncReady.value = true;
}); });
const nationList = new Map<number, procNationItem>(); const nationList = new Map<number, procNationItem>();
for (const nationItem of procRes.nationList) { for (const nationItem of procRes.nationList) {
nationList.set(nationItem.id, nationItem); nationList.set(nationItem.id, nationItem);
@@ -111,19 +127,8 @@ const map = ref<MapResult>();
const delayCnt = procRes.delayCnt; const delayCnt = procRes.delayCnt;
const postReqTurn = procRes.postReqTurn; const postReqTurn = procRes.postReqTurn;
const commandTypesOption: { html: string; value: string }[] = []; const availableCommandTypeList = procRes.availableCommandTypeList;
for (const [commandTypeID, commandTypeInfo] of Object.entries(procRes.availableCommandTypeList)) { const selectedCommandID = ref(Object.keys(availableCommandTypeList)[0]);
const notAvailable = commandTypeInfo.remainTurn > 0;
const notAvailableText = notAvailable ? " (불가)" : "";
const name = `${commandTypeInfo.name}${notAvailableText}`;
const html = notAvailable ? `<span style='color:red;'>${name}</span>` : name;
commandTypesOption.push({
html,
value: commandTypeID,
});
}
const selectedCommandID = ref(Object.keys(procRes.availableCommandTypeList)[0]);
async function submit(e: Event) { async function submit(e: Event) {
const event = new CustomEvent<Args>("customSubmit", { const event = new CustomEvent<Args>("customSubmit", {
+1 -1
View File
@@ -27,7 +27,7 @@
<b-button v-if="maxAmount > 2000" class="btn-sm" @click="amount = Math.min(amount + 1000, maxAmount)"> <b-button v-if="maxAmount > 2000" class="btn-sm" @click="amount = Math.min(amount + 1000, maxAmount)">
+ +
</b-button> </b-button>
<b-button v-if="maxAmount > 20000" class="btn-sm" @click="amount = Math.min(amount + 10000, maxAmount)"> <b-button v-if="maxAmount >= 10000" class="btn-sm" @click="amount = Math.min(amount + 10000, maxAmount)">
+ +
</b-button> </b-button>
</div> </div>
+20 -18
View File
@@ -3,6 +3,8 @@ import "@scss/troop.scss";
import { errUnknown } from "@/common_legacy"; import { errUnknown } from "@/common_legacy";
import { launchTroopPlugin } from "@/extPluginTroop"; import { launchTroopPlugin } from "@/extPluginTroop";
import jQuery from "jquery"; import jQuery from "jquery";
import { SammoAPI } from "./SammoAPI";
import { isString } from "lodash";
jQuery(function($){ jQuery(function($){
//btnJoinTroop, btnLeaveTroop, btnKickTroop, btnCreateTroop, btnChangeTroopName //btnJoinTroop, btnLeaveTroop, btnKickTroop, btnCreateTroop, btnChangeTroopName
@@ -35,7 +37,7 @@ jQuery(function($){
dataType:'json', dataType:'json',
data:{ data:{
action:'부대창설', action:'부대창설',
name:$('#nameplate').val() name:$('#newTroopName').val()
} }
}).then(function(data){ }).then(function(data){
console.log(data); console.log(data);
@@ -50,24 +52,24 @@ jQuery(function($){
return false; return false;
}); });
$('#btnChangeTroopName').click(function(){ $('#btnChangeTroopName').on('click', async ()=>{
$.post({ try{
url:'j_troop.php', await SammoAPI.Nation.SetTroopName({
dataType:'json', troopID: parseInt($('#changeNameTroopID').val() as string),
data:{ troopName: $('#changeTroopName').val() as string,
action:'부대변경', });
name:$('#nameplate').val()
}
}).then(function(data){
console.log(data);
if(!data.result){
alert(data.reason);
location.reload();
}
location.reload(); location.reload();
}
}, errUnknown); catch(e){
console.error(e);
if(isString(e)){
alert(e);
}
else{
errUnknown();
}
location.reload();
}
return false; return false;
}); });
+10 -1
View File
@@ -6,9 +6,18 @@ import { auto500px } from "./util/auto500px";
import { insertCustomCSS } from "./util/customCSS"; import { insertCustomCSS } from "./util/customCSS";
import { htmlReady } from "./util/htmlReady"; import { htmlReady } from "./util/htmlReady";
declare const staticValues: {
serverID: string,
turnterm: number,
serverNick: string,
isResAuction: boolean,
};
auto500px(); auto500px();
htmlReady(() => { htmlReady(() => {
insertCustomCSS(); insertCustomCSS();
}); });
createApp(PageAuction).use(BootstrapVue3).use(BToastPlugin).mount('#app') createApp(PageAuction, {
isResAuction: staticValues.isResAuction,
}).use(BootstrapVue3).use(BToastPlugin).mount('#app')
+3
View File
@@ -11,6 +11,8 @@ $userID = Session::getUserID();
$db = DB::db(); $db = DB::db();
$gameStor = KVStorage::getStorage($db, 'game_env'); $gameStor = KVStorage::getStorage($db, 'game_env');
$isResAuction = Util::getReq('type') !== 'unique';
$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, con, turntime, belong, penalty FROM general WHERE owner=%i', $userID);
?> ?>
@@ -28,6 +30,7 @@ $me = $db->queryFirstRow('SELECT no, nation, officer_level, permission, con, tur
'serverID' => UniqueConst::$serverID, 'serverID' => UniqueConst::$serverID,
'serverNick' => DB::prefix(), 'serverNick' => DB::prefix(),
'turnterm' => $gameStor->turnterm, 'turnterm' => $gameStor->turnterm,
'isResAuction' => $isResAuction,
] ]
]) ?> ]) ?>
<?= WebUtil::printDist('vue', 'v_auction', true) ?> <?= WebUtil::printDist('vue', 'v_auction', true) ?>
+19 -17
View File
@@ -68,7 +68,7 @@ foreach (InheritanceKey::cases() as $key) {
$resetTurnTimeLevel = ($me->getAuxVar('inheritResetTurnTime') ?? -1) + 1; $resetTurnTimeLevel = ($me->getAuxVar('inheritResetTurnTime') ?? -1) + 1;
$resetSpecialWarLevel = ($me->getAuxVar('inheritResetSpecialWar') ?? -1) + 1; $resetSpecialWarLevel = ($me->getAuxVar('inheritResetSpecialWar') ?? -1) + 1;
$lastInheritPointLogs = $db->query('SELECT server_id, year, month, date, text FROM user_record WHERE log_type = %s AND user_id = %i ORDER BY id desc LIMIT 30', "inheritPoint", $userID); $lastInheritPointLogs = $db->query('SELECT id, server_id, year, month, date, text FROM user_record WHERE log_type = %s AND user_id = %i ORDER BY id desc LIMIT 30', "inheritPoint", $userID);
?> ?>
<!DOCTYPE html> <!DOCTYPE html>
<html> <html>
@@ -81,22 +81,24 @@ $lastInheritPointLogs = $db->query('SELECT server_id, year, month, date, text FR
<?= WebUtil::printJS('../d_shared/common_path.js', true) ?> <?= WebUtil::printJS('../d_shared/common_path.js', true) ?>
<?= WebUtil::printDist('vue', 'v_inheritPoint', true) ?> <?= WebUtil::printDist('vue', 'v_inheritPoint', true) ?>
<?= WebUtil::printStaticValues([ <?= WebUtil::printStaticValues([
'items' => $items, 'staticValues' => [
'currentInheritBuff' => $currentInheritBuff, 'items' => $items,
'maxInheritBuff' => TriggerInheritBuff::MAX_STEP, 'currentInheritBuff' => $currentInheritBuff,
'resetTurnTimeLevel' => $resetTurnTimeLevel, 'maxInheritBuff' => TriggerInheritBuff::MAX_STEP,
'resetSpecialWarLevel' => $resetSpecialWarLevel, 'resetTurnTimeLevel' => $resetTurnTimeLevel,
'inheritActionCost' => [ 'resetSpecialWarLevel' => $resetSpecialWarLevel,
'buff' => GameConst::$inheritBuffPoints, 'inheritActionCost' => [
'resetTurnTime' => calcResetAttrPoint($resetTurnTimeLevel), 'buff' => GameConst::$inheritBuffPoints,
'resetSpecialWar' => calcResetAttrPoint($resetSpecialWarLevel), 'resetTurnTime' => calcResetAttrPoint($resetTurnTimeLevel),
'randomUnique' => GameConst::$inheritItemRandomPoint, 'resetSpecialWar' => calcResetAttrPoint($resetSpecialWarLevel),
'nextSpecial' => GameConst::$inheritSpecificSpecialPoint, 'randomUnique' => GameConst::$inheritItemRandomPoint,
'minSpecificUnique' => GameConst::$inheritItemUniqueMinPoint, 'nextSpecial' => GameConst::$inheritSpecificSpecialPoint,
], 'minSpecificUnique' => GameConst::$inheritItemUniqueMinPoint,
'availableSpecialWar' => $avilableSpecialWar, ],
'availableUnique' => $availableUnique, 'availableSpecialWar' => $avilableSpecialWar,
'lastInheritPointLogs' => $lastInheritPointLogs, 'availableUnique' => $availableUnique,
'lastInheritPointLogs' => $lastInheritPointLogs,
]
]) ?> ]) ?>
</head> </head>
+8
View File
@@ -486,6 +486,14 @@ class Util extends \utilphp\util
* $min과 $max 사이의 값으로 교정 * $min과 $max 사이의 값으로 교정
*/ */
public static function valueFit($value, $min = null, $max = null) public static function valueFit($value, $min = null, $max = null)
{
return static::clamp($value, $min, $max);
}
/**
* $min과 $max 사이의 값으로 교정
*/
public static function clamp($value, $min = null, $max = null)
{ {
if($max !== null && $min !== null && $max < $min){ if($max !== null && $min !== null && $max < $min){
return $min; return $min;