Compare commits

...
Author SHA1 Message Date
Hide_D 1f556cf88c fix: GetConst의 텍스트 수정 2025-01-21 17:32:30 +00:00
Hide_D 76625cf472 fix: GameUnitDetail의 info를 기존방식으로 변경 2025-01-21 17:23:07 +00:00
Hide_D 84fee0f1f2 fix: ReqCities, ReqRegion 버그 2025-01-21 17:13:37 +00:00
Hide_D 9f81c760d0 병종 데이터 수정 2025-01-21 16:42:19 +00:00
Hide_D f26ac8c37b refac: GameUnitConstBase의 getBuildData 2025-01-21 16:06:03 +00:00
Hide_D 7cffa68d04 UnitConstBase 적용용 2025-01-21 16:02:24 +00:00
Hide_D 01094d376f feat, refac(wip): 징병 기준을 GameUnitConstraint 기반으로 변경 2025-01-21 15:41:41 +00:00
Hide_D 77ec4c6572 feat(wip): GameUnitConstrint 2025-01-21 15:26:29 +00:00
Hide_D 3e5727a166 feat(wip): GameUnitConstraint 개념 추가 2025-01-21 14:25:56 +00:00
Hide_D 91e56644b4 feat: 토너먼트 페이지 관리자 조작 버튼 제거
- 필요할땐 다른 페이지에서 만들어 쓰도록
2024-12-28 08:47:45 +00:00
Hide_D e0b7a3d763 game: 철기병 방어 향상 2024-12-22 05:25:47 +00:00
Hide_D 6a25f03687 fix: namespace 2024-12-22 04:28:29 +00:00
Hide_D 104f306deb fix: callSammoAPI apiPath 호출 2024-12-22 04:27:02 +00:00
Hide_D 09c21cd466 fix: api prefix 2024-12-22 04:23:30 +00:00
Hide_D 5b89797f57 fix: admin_member 페이지 수정 시도 2024-12-22 04:12:59 +00:00
Hide_D ab1cc5146d feat: 유저 관리 패널에 유저 차단 추가 2024-12-22 04:05:44 +00:00
Hide_D 2483a7723f feat: RootAPI/Admin/BanEmailAddress 2024-12-22 03:56:12 +00:00
Hide_D 367db15d93 misc: DB로는 global salt 넘기지 않음 2024-12-22 03:52:39 +00:00
Hide_D 30e02aac08 feat: 가입 시 영구 차단된 이메일 검사 2024-12-22 03:42:08 +00:00
Hide_D ce5ddf05fe fix: 1달이상 지난 삭제요청 계정에 대해 자동삭제하지 않는 버그 수정 2024-12-22 02:46:28 +00:00
Hide_D 475837bca0 feat: 영구 차단 계정용 table 2024-12-22 02:43:18 +00:00
Hide_D bd0ae25afd game: 징계가 남아있는 경우 탈퇴 불가 2024-12-21 09:14:14 +00:00
Hide_D 688de08feb game: 선양시에도 거병/수뇌/외교권자 페널티 검사 2024-12-21 08:56:24 +00:00
Hide_D 83b550adbe game: 거병에도 '건국 금지 패널티 적용' 2024-12-21 08:52:08 +00:00
Hide_D fa89bae7d9 game: NPC 장수 능력치 초기화 불가 2024-12-21 04:03:05 +00:00
Hide_D 456246362f game: NPC의 유저 관직 부여 로직 수정 2024-12-21 03:59:21 +00:00
Hide_D b472440ec1 fix: 이미지 경로에 빈칸이 있는 경우 2024-12-20 15:50:38 +00:00
Hide_D 7b5613d032 fix: 유저 부운영자는 시나리오 리셋시 생성하지 않음 2024-12-14 09:05:07 +00:00
Hide_D f5b3b985ce feat: 시스템 권한 분리
- 부운영자를 부운영자(시스템), 부운영자(유저)로 분리
2024-12-14 04:06:03 +00:00
Hide_D 515298700a term utf-8 2024-12-13 13:12:41 +00:00
Hide_D 41d7566acb game: 롤시나리오 메시지 빈도 재조정 2024-12-11 17:07:31 +00:00
Hide_D f4196263fa game: 롤 시나리오 NPC 메시지 빈도 조절 2024-12-11 17:04:07 +00:00
Hide_D 6bc69ac467 game: 리그오브레전드 v1.1 2024-12-09 17:49:37 +00:00
Hide_D 15b2c8b8e6 game: 재야 의술장은 국가 장수를 치료하지 않음 2024-12-06 18:12:24 +00:00
Hide_D 8e1d33e880 misc: 강서유서 소설 월드 추가 수정 2024-12-06 16:28:20 +00:00
Hide_D 797902552d misc: 강서유서 소설 월드 수정 2024-12-06 15:46:47 +00:00
Hide_D f3d2dcdad2 사소한 수정 2024-12-06 15:36:17 +00:00
Hide_D 928478a8ad misc: 강서유서 소설월드 업데이트 2024-12-06 15:34:50 +00:00
Hide_D 5023ee800b 시나리오 변환시 환경 변수에 json 허용 2024-12-06 15:22:47 +00:00
Hide_D 4a70625487 avif support 2024-12-06 15:09:07 +00:00
Hide_D 26327b5c8c 롤시나리오 m장 이름 지정 2024-12-06 12:37:09 +00:00
Hide_D 372f47760b 리그오브레전드 시나리오 연동 조정
- 군주가 '성인이 되어 나타납니다'로 무효화되는 문제 수정
2024-12-06 11:46:33 +00:00
Hide_D 3111a5eb71 롤 시나리오 1.0으로 업데이트, 비급 and/or 파죽지세도 추가 (#262)
Reviewed-on: https://storage.hided.net/gitea/devsam/core/pulls/262
2024-12-05 17:07:54 +09:00
Hide_D 98e2e2f125 리그오브레전드 베타 아이콘 추가 (#261)
Reviewed-on: https://storage.hided.net/gitea/devsam/core/pulls/261
2024-12-03 12:24:50 +09:00
69 changed files with 2606 additions and 2178 deletions
+1
View File
@@ -29,6 +29,7 @@ d_pic/*.jpg
d_pic/*.gif
d_pic/*.png
d_pic/*.webp
d_pic/*.avif
d_pic/uploaded_image
/dist_js
+1 -1
View File
@@ -56,7 +56,7 @@ $rootDB->insert('member', [
'token_valid_until' => '2999-01-01 00:00:00',
'pw' => $finalPassword,
'salt' => $userSalt,
'grade' => 6,
'grade' => 7,
'name' => $nickname,
'reg_date' => $nowDate
]);
+11 -1
View File
@@ -92,4 +92,14 @@ CREATE TABLE `login_token` (
INDEX `by_date` (`user_id`, `expire_date`)
)
COLLATE='utf8mb4_general_ci'
ENGINE=Aria;
ENGINE=Aria;
CREATE TABLE `banned_member` (
`no` INT NOT NULL AUTO_INCREMENT,
`hashed_email` VARCHAR(128) NOT NULL COLLATE 'utf8mb4_general_ci' COMMENT 'SHA512(salt | email | salt )',
`info` TEXT NULL COLLATE 'utf8mb4_general_ci' COMMENT '부가정보',
PRIMARY KEY (`no`),
UNIQUE INDEX `email` (`hashed_email`(128))
)
COLLATE='utf8mb4_general_ci'
ENGINE = Aria;
+1 -1
View File
@@ -6,7 +6,7 @@ include "func.php";
//로그인 검사
$session = Session::requireGameLogin()->setReadOnly();
if($session->userGrade < 5) {
if($session->userGrade < 6) {
die(requireAdminPermissionHTML());
}
+1 -1
View File
@@ -6,7 +6,7 @@ include "func.php";
//로그인 검사
$session = Session::requireGameLogin()->setReadOnly();
if ($session->userGrade < 5) {
if ($session->userGrade < 6) {
header('location:_admin1.php');
die();
}
+1 -1
View File
@@ -7,7 +7,7 @@ include "func.php";
//로그인 검사
$session = Session::requireGameLogin()->setReadOnly();
if ($session->userGrade < 5) {
if ($session->userGrade < 6) {
die(requireAdminPermissionHTML());
}
+1 -1
View File
@@ -15,7 +15,7 @@ $msg = Util::getPost('msg', 'string');
//로그인 검사
$session = Session::requireLogin()->loginGame()->setReadOnly();
if ($session->userGrade < 5) {
if ($session->userGrade < 6) {
header('location:_admin2.php');
}
+1 -1
View File
@@ -20,7 +20,7 @@ if ($type2 < 0 || $type2 > 6) {
//로그인 검사
$session = Session::requireGameLogin()->setReadOnly();
if ($session->userGrade < 5) {
if ($session->userGrade < 6) {
die(requireAdminPermissionHTML());
}
+1 -1
View File
@@ -12,7 +12,7 @@ $nation = Util::getPost('nation', 'int');
$session = Session::requireGameLogin()->setReadOnly();
$userID = Session::getUserID();
if ($session->userGrade < 5) {
if ($session->userGrade < 6) {
header('location:_admin5.php');
die();
}
+1 -1
View File
@@ -37,7 +37,7 @@ if ($reqQueryType === null || !key_exists($reqQueryType, $queryMap)) {
//로그인 검사
$session = Session::requireGameLogin()->setReadOnly();
if ($session->userGrade < 5) {
if ($session->userGrade < 6) {
die(requireAdminPermissionHTML());
}
+1 -1
View File
@@ -12,7 +12,7 @@ $type = 0;
//로그인 검사
$session = Session::requireGameLogin()->setReadOnly();
if ($session->userGrade < 5) {
if ($session->userGrade < 6) {
die(requireAdminPermissionHTML());
}
+1 -1
View File
@@ -7,7 +7,7 @@ include "func.php";
//로그인 검사
$session = Session::requireGameLogin()->setReadOnly();
if ($session->userGrade < 5) {
if ($session->userGrade < 6) {
die('권한 부족');
}
+2 -2
View File
@@ -177,7 +177,7 @@ $templates = new \League\Plates\Engine('templates');
$valid = 1;
}
if ($userGrade >= 5) {
if ($userGrade >= 6) {
$valid = true;
$showDetailedInfo = true;
}
@@ -275,7 +275,7 @@ $templates = new \League\Plates\Engine('templates');
$ourGeneral = false;
}
if ($userGrade == 6) {
if ($userGrade == 7) {
$ourGeneral = true;
}
+1 -57
View File
@@ -125,63 +125,7 @@ $globalBetTotal = array_sum($globalBet);
</tr>
</table>
<table align=center class='tb_layout bg0'>
<?php if ($session->userGrade >= 5) : ?>
<form method=post action=c_tournament.php>
<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>
<td colspan=8>
<button type="button" class="btn btn-secondary" onclick='location.reload()'>갱신</button>
<?php if ($admin['tournament'] == 0) : ?>
<select name=trig 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; ?>
<?php switch ($admin['tournament']) {
case 1:
echo "<input type=submit name=btn value='랜덤투입'>";
echo "<input type=submit name=btn value='랜덤전부투입'>";
break;
case 2:
echo "<input type=submit name=btn value='예선'><input type=submit name=btn value='예선전부'>";
break;
case 3:
echo "<input type=submit name=btn value='추첨'><input type=submit name=btn value='추첨전부'>";
break;
case 4:
echo "<input type=submit name=btn value='본선'><input type=submit name=btn value='본선전부'>";
break;
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;
} ?>
</td>
</tr>
</form>
<?php elseif ($me['no'] > 0 && $me['tournament'] == 0 && $admin['tournament'] == 1) : ?>
<?php if ($me['no'] > 0 && $me['tournament'] == 0 && $admin['tournament'] == 1) : ?>
<form method=post action=c_tournament.php>
<tr>
<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>
+2 -2
View File
@@ -112,7 +112,7 @@ function GetImageURL($imgsvr, $filepath = '')
function checkLimit($refreshScore = null)
{
$session = Session::getInstance();
if ($session->userGrade >= 4) {
if ($session->userGrade >= 6) {
return 0;
}
@@ -1009,7 +1009,7 @@ function increaseRefresh($type = "", $cnt = 1)
$isunited = $gameStor->isunited;
$opentime = $gameStor->opentime;
if ($userGrade == 6) {
if ($userGrade >= 6) {
return;
}
if ($isunited == 2) {
+2 -2
View File
@@ -7,10 +7,10 @@ include "func.php";
$session = Session::requireLogin();
if ($session->userGrade < 5) {
if ($session->userGrade < 6) {
die('관리자 아님');
}
if ($session->userGrade == 5) {
if ($session->userGrade == 6) {
die('DB 리셋 권한을 가지고 있지 않습니다.');
}
+1 -1
View File
@@ -18,7 +18,7 @@ else{
$availableNextCall = $session->availableNextCallGetCityList??'2000-01-01 00:00:00';
$now = new \DateTimeImmutable();
if($now <= new \DateTimeImmutable($availableNextCall) && $session->userGrade < 5){
if($now <= new \DateTimeImmutable($availableNextCall) && $session->userGrade < 6){
Json::die([
'result'=>false,
'reason'=>"도시 목록은 10초에 한번 갱신 가능합니다.\n다음 시간 : ".$availableNextCall
+1 -1
View File
@@ -8,7 +8,7 @@ include('func.php');
$session = Session::requireLogin([])->setReadOnly();
if(Session::getInstance()->userGrade < 5){
if(Session::getInstance()->userGrade < 6){
Json::die([
'reason'=>'권한이 부족합니다.'
]);
-430
View File
@@ -1,430 +0,0 @@
<?php
namespace sammo;
use sammo\DTO\VoteInfo;
use sammo\Enums\GeneralQueryMode;
include "lib.php";
include "func.php";
$session = Session::requireLogin()->loginGame()->setReadOnly();
$userID = Session::getUserID();
increaseRefresh("메인", 1);
$db = DB::db();
$gameStor = KVStorage::getStorage($db, 'game_env');
if (!$userID) {
header('Location:..');
die();
}
//턴 실행.
TurnExecutionHelper::executeAllCommand();
if (!$session->isGameLoggedIn()) {
header('Location:..');
die();
}
$me = $db->queryFirstRow(
'SELECT no,refresh_score,turntime,newmsg,newvote,`officer_level` FROM `general`
LEFT JOIN general_access_log AS l ON `general`.no = l.general_id WHERE owner = %i',
$userID
);
//그새 사망이면
if ($me === null) {
$session->logoutGame();
header('Location: ../');
die();
}
$gameStor->cacheAll(true);
if ($me['newmsg'] == 1 || $me['newvote'] == 1) {
$db->update('general', [
'newmsg' => 0,
'newvote' => 0
], 'owner=%i', $userID);
}
$plock = boolval($db->queryFirstField('SELECT plock FROM plock WHERE `type`="GAME" LIMIT 1'));
$limitState = checkLimit($me['refresh_score']);
if ($limitState >= 2) {
printLimitMsg($me['turntime']);
exit();
}
$generalObj = General::createObjFromDB($me['no'], null, GeneralQueryMode::FullWithAccessLog);
$generalObj->setRawCity($db->queryFirstRow('SELECT * FROM city WHERE city = %i', $generalObj->getCityID()));
$scenario = $gameStor->scenario_text;
$nationID = $generalObj->getNationID();
if ($nationID) {
$nationStor = KVStorage::getStorage($db, $nationID, 'nation_env');
$nationStor->cacheAll();
}
if ($gameStor->extended_general == 0) {
$extend = "표준";
} else {
$extend = "확장";
}
if ($gameStor->fiction == 0) {
$fiction = "사실";
} else {
$fiction = "가상";
}
if ($gameStor->npcmode == 0) {
$npcmode = "불가능";
} else if ($gameStor->npcmode == 1) {
$npcmode = "가능";
} else {
$npcmode = "선택 생성";
}
$color = "cyan";
$serverName = UniqueConst::$serverName;
$serverCnt = $gameStor->server_cnt;
$auctionCount = $db->queryFirstField('SELECT count(*) FROM ng_auction WHERE finished = 0');
$isTournamentActive = $gameStor->tournament > 0;
$isTournamentApplicationOpen = $gameStor->tournament == 1;
$isBettingActive = $gameStor->tournament == 6;
$myNationStatic = getNationStaticInfo($generalObj->getNationID());
$nationColorType = substr($myNationStatic['color'] ?? '#000000', 1);
$autorunUser = ($gameStor->autorun_user) ?? [];
$otherTextInfo = [];
if ($gameStor->join_mode == 'onlyRandom') {
$otherTextInfo[] = '랜덤 임관 전용';
}
if ($autorunUser['limit_minutes'] ?? false) {
$otherTextInfo[] = getAutorunInfo($autorunUser);
}
if (!$otherTextInfo) {
$otherTextInfo = '표준';
} else {
$otherTextInfo = join(', ', $otherTextInfo);
}
$lastVoteID = $gameStor->lastVote;
$lastVote = null;
if ($lastVoteID) {
$voteStor = KVStorage::getStorage($db, 'vote');
$lastVote = VoteInfo::fromArray($voteStor->getValue("vote_{$lastVoteID}"));
if ($lastVote->endDate && $lastVote->endDate < TimeUtil::now()) {
$lastVote = null;
}
}
?>
<!DOCTYPE html>
<html>
<head>
<title><?= $serverName ?>: 메인</title>
<meta charset="UTF-8">
<meta name="color-scheme" content="dark">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=500" />
<?= WebUtil::printJS('../d_shared/common_path.js') ?>
<?= WebUtil::printJS('d_shared/base_map.js') ?>
<?= WebUtil::printCSS('../d_shared/common.css') ?>
<?= WebUtil::printDist('vue', 'v_main', true) ?>
<link rel="stylesheet" type="text/css" href="https://cdn.jsdelivr.net/gh/orioncactus/pretendard/dist/web/static/pretendard.css" />
<?= WebUtil::printCSS('css/map.css') ?>
<?= WebUtil::printStaticValues([
//deprecated, staticValues를 이용할 것
'serverName' => $serverName,
'serverCnt' => $serverCnt,
'serverNick' => DB::prefix(),
'serverID' => UniqueConst::$serverID,
'maxTurn' => GameConst::$maxTurn,
'maxPushTurn' => 12,
'serverNow' => TimeUtil::now(false),
'lastExecuted' => $gameStor->turntime,
'isLocked' => $plock,
'isTournamentActive' => $isTournamentActive,
'isBettingActive' => $isBettingActive,
'staticValues' => [
'serverName' => $serverName,
'serverCnt' => $serverCnt,
'serverNick' => DB::prefix(),
'serverID' => UniqueConst::$serverID,
'maxTurn' => GameConst::$maxTurn,
'maxPushTurn' => 12,
'serverNow' => TimeUtil::now(false),
'lastExecuted' => $gameStor->turntime,
'isLocked' => $plock,
'isTournamentActive' => $isTournamentActive,
'isBettingActive' => $isBettingActive,
'mapName' => GameConst::$mapName,
'unitSet' => GameConst::$unitSet,
]
]) ?>
<link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.7.1/css/all.css" integrity="sha384-fnmOCqbTlWIlj8LyTjo7mOUStjsKC4pOpQbqyi7RrhN7udi9RwhKkMHpvLbHG9Sr" crossorigin="anonymous">
</head>
<body class="img_back sam-color-<?= $nationColorType ?>">
<div id="container" class="bg0">
<div class="row toolbars gx-0">
<div class="buttonPlate"><?= allButton($gameStor->npcmode == 1) ?></button></div>
</div>
<div class="tb_layout row gx-0">
<div id="server_title" class="row py-2 center">
<h3>삼국지 모의전투 HiDCHe <?= $serverName . $serverCnt ?>기 <span class="avoid-wrap">(<font color=cyan><?= $scenario ?></font>)</span></h3>
</div>
<div class="row center gx-0">
<div class="s-border-t col py-2 col-8 col-lg-4" style="color:<?= $color ?>;">
<?= $scenario ?>
</div>
<div class="s-border-t col py-2 col-4 col-lg-2" style="color:<?= $color ?>;">
NPC 수, 상성 : <?= $extend ?>,<?= $fiction ?>
</div>
<div class="s-border-t col py-2 col-4 col-lg-2" style="color:<?= $color ?>;">
NPC선택 : <?= $npcmode ?>
</div>
<div class="s-border-t col py-2 col-4 col-lg-2" style="color:<?= $color ?>;">
토너먼트 : <?= getTournamentTermText($gameStor->turnterm) ?>
</div>
<div class="s-border-t col py-2 col-4 col-lg-2" style="color:<?= $color ?>;">
기타 설정: <?= $otherTextInfo ?>
</div>
<div class="s-border-t col py-2 col-8 col-lg-4"><?= info(2) ?></div>
<div class="s-border-t col py-2 col-4 col-lg-2">전체 접속자 수 : <?= $gameStor->online_user_cnt ?> 명</div>
<div class="s-border-t col py-2 col-4 col-lg-2">턴당 갱신횟수 : <?= $gameStor->refreshLimit ?>회</div>
<div class="s-border-t col py-2 col-8 col-lg-4"><?= info(3) ?></div>
<div class="s-border-t py-2 col col-6 col-lg-4">
<?php if ($isTournamentActive) : ?>
↑<span style='color:cyan'><?= (['전력전', '통솔전', '일기토', '설전',])[$gameStor->tnmt_type] ?? '' ?> <?= getTournament($gameStor->tournament) ?> <?= getTournamentTime() ?></span>↑
<?php else : ?>
<span style='color:magenta'>현재 토너먼트 경기 없음</span>
<?php endif; ?>
</div>
<div class="s-border-t py-2 col col-6 col-lg-2">
<div style="display:inline-block;"><?= $plock ? ("<span style='color:magenta;'>동작 시각: " . substr($gameStor->turntime, 5, 14) . "</span>") : ("<span style='color:cyan;'>동작 시각: " . substr($gameStor->turntime, 5, 14) . "</span>") ?></div>
</div>
<div class="s-border-t py-2 col col-6 col-lg-2">
<?php if ($auctionCount > 0) : ?>
<span style='color:cyan'><?= $auctionCount ?>건</span> 거래 진행중
<?php else : ?>
<span style='color:magenta'>진행중 거래 없음</span>
<?php endif; ?>
</div>
<div class="s-border-t py-2 col col-6 col-lg-4 vote-cell">
<?php
?>
<?php if ($lastVote === null) : ?>
<span style='color:magenta'>진행중 설문 없음</span>
<?php else : ?>
<span style='color:cyan'>설문 진행중</span> : <span><?= $lastVote->title ?></span>
<?php endif; ?>
</div>
</div>
<div class="row gx-0">
<div class="col s-border-t px-2 py-2">접속중인 국가: <?= $gameStor->online_nation ?></div>
</div>
<div class="row gx-0">
<div class="col s-border-t px-2 py-2">운영자 메세지 : <span style='color:yellow;'><?= $gameStor->msg ?></span></div>
</div>
<div class="row gx-0">
<div class="col s-border-t py-2" id="nation-msg-position">
<div class="px-2">【 국가방침 】</div>
<div id='nation-msg-box'>
<div id='nation-msg'><?= nationMsg($generalObj) ?></div>
</div>
</div>
</div>
<div class="row gx-0">
<div class="col s-border-t px-2 py-2">
【 접속자 】<?= onlinegen($generalObj) ?>
</div>
</div>
<?php if ($session->userGrade >= 5) : ?>
<div class="row">
<div class="col">
<a href='_admin1.php' target='_blank'><button type='button'>게임관리</button></a>
<a href='_admin2.php' target='_blank'><button type='button'>회원관리</button></a>
<a href='_admin4.php' target='_blank'><button type='button'>멀티관리</button></a>
<a href='_admin5.php' target='_blank'><button type='button'>일제정보</button></a>
<a href='_admin7.php' target='_blank'><button type='button'>로그정보</button></a>
<a href='_admin8.php' target='_blank'><button type='button'>외교정보</button></a>
<a href='_119.php' target='_blank'><button type='button'>119</button></a>
</div>
</div>
<?php elseif ($session->userGrade == 4) : ?>
<div class="row">
<div class="col">
<a href='_119.php' target='_blank'><button type='button'>119</button></a>
</div>
</div>
<?php endif; ?>
<div id="map_view" class="gx-0">
<div id="mapZone" class="view-item"><?= getMapHtml() ?></div>
<div class="view-item" id="reservedCommandZone">
<div id="reservedCommandList"></div>
<div id="actionMiniPlate" class="gx-0 row">
<div class="col">
<div class="gx-1 row">
<div class="col-8 d-grid"><button type='button' class='btn btn-sammo-base2 refreshPage'>갱 신</button></div>
<div class="col-4 d-grid"><button type='button' class='btn btn-sammo-base2' onclick="location.replace('../')">로비로</button></div>
</div>
</div>
</div>
</div>
<div id="cityInfo" class="view-item" style="border:none;text-align:center;"><?= cityInfo($generalObj) ?></div>
<div id="nation-position"><?php myNationInfo($generalObj); ?></div>
<div id="general-position"><?php generalInfo($generalObj); ?></div>
<div id="generalCommandButton" class="row gx-0">
<div class="buttonPlate bg2">
?></div>
</div>
</div>
</div>
<div id="actionMiniPlateSub" class="gx-0 row">
<div class="col">
<div class="gx-1 row">
<div class="col-3 d-grid"><button type='button' class="btn btn-dark" onclick="scrollHardTo('reservedCommandList')">명령으로</button></div>
<div class="col-5 d-grid"><button type='button' class='btn btn-sammo-base2 refreshPage'>갱 신</button></div>
<div class="col-4 d-grid"><button type='button' class='btn btn-sammo-base2' onclick="location.replace('../')">로비로</button></div>
</div>
</div>
</div>
<div class="row gx-0">
<div class="col-lg-6" id="general_public_record-position">
<div class="bg1 center s-border-tb"><b>장수 동향</b></div>
<div id="general_public_record" style="text-align:left;"><?= formatHistoryToHTML(getGlobalActionLogRecent(15)) ?></div>
</div>
<div class="col-lg-6" id="general_log-position">
<div class="bg1 center s-border-tb"><b>개인 기록</b></div>
<div id="general_log" style="text-align:left;"><?= formatHistoryToHTML(getGeneralActionLogRecent($me['no'], 15)) ?></div>
</div>
<div class="col-12" id="world_history-position">
<div class="bg1 center s-border-tb"><b>중원 정세</b></div>
<div id="world_history" colspan=2 style="text-align:left;"><?= formatHistoryToHTML(getGlobalHistoryLogRecent(15)) ?></div>
</div>
</div>
<div class="row toolbars gx-0">
<div class="buttonPlate"><?= allButton($gameStor->npcmode == 1) ?></div>
<div id="message_board" class="row gx-0">
<div class="message_input_form bg0 gx-0 row">
<div id="mailbox_list-col" class="col-6 col-lg-2 d-grid">
<select id="mailbox_list" size="1" class="form-control bg-dark text-white">
</select>
</div>
<div id="msg_input-col" class="col-12 col-lg-8 d-grid">
<input type="text" id="msg_input" maxlength="99" class="form-control">
</div>
<div id="msg_submit-col" class="col-6 col-lg-2 d-grid"><button id="msg_submit" class="btn btn-primary">서신전달&amp;갱신</button></div>
</div>
<div class="col-lg-6 board_side bg0"><a id="public_talk_position"></a>
<div class="board_header bg0">전체 메시지(최고99자)</div>
<section class="public_message">
<div class="d-grid"><button type="button" class="load_old_message btn btn-secondary" data-msg_type="public">이전 메시지 불러오기</button></div>
</section>
</div>
<div class="col-lg-6 board_side bg0"><a id="national_talk_position"></a>
<div class="board_header bg0">국가 메시지(최고99자)</div>
<section class="national_message">
<div class="d-grid"><button type="button" class="load_old_message btn btn-secondary" data-msg_type="national">이전 메시지 불러오기</button></div>
</section>
</div>
<div class="col-lg-6 board_side bg0"><a id="private_talk_position"></a>
<div class="board_header bg0">개인 메시지(최고99자)</div>
<section class="private_message">
<div class="d-grid"><button type="button" class="load_old_message btn btn-secondary" data-msg_type="private">이전 메시지 불러오기</button></div>
</section>
</div>
<div class="col-lg-6 board_side bg0"><a id="diplomacy_talk_position"></a>
<div class="board_header bg0">외교 메시지(최고99자)</div>
<section class="diplomacy_message">
<div class="d-grid"><button type="button" class="load_old_message btn btn-secondary" data-msg_type="diplomacy">이전 메시지 불러오기</button></div>
</section>
</div>
</div>
<div class="row toolbars gx-0">
<div class="buttonPlate"><?= allButton($gameStor->npcmode == 1) ?></div><?= banner() ?>
</div>
</div>
<?php
if ($limitState == 1) {
MessageBox("접속제한이 얼마 남지 않았습니다!");
}
if ($me['newmsg'] == 1) {
MessageBox("새로운 서신이 도착했습니다!");
}
if ($me['newvote'] == 1) {
$develcost = $gameStor->develcost * 5;
MessageBox("설문조사에 참여하시면 금{$develcost}과 유니크템을 드립니다! (우측 상단 설문조사 메뉴)");
}
?>
</div>
<nav class="navbar navbar-expand fixed-bottom navbar-dark bg-dark d-sm-block d-lg-none p-0" id="navbar500">
<div class="container-fluid px-0">
<div class="collapse navbar-collapse">
<ul class="navbar-nav me-auto mx-auto">
<li class="nav-item dropup">
<div class="dropdown-toggle text-white btn btn-sammo-base2" id="navbarGlobal" role="button" data-bs-toggle="dropdown" aria-expanded="false">
외부 메뉴
</div>
<ul class="dropdown-menu dropdown-menu-start" aria-labelledby="navbarGlobal" id="navbarGlobalItems">
<?= allButton($gameStor->npcmode == 1, ['btnBegin' => '<li>', 'btnEnd' => '</li>', 'btnClass' => 'dropdown-item']) ?>
</ul>
</li>
<li class="nav-item dropup">
<div class="dropdown-toggle btn btn-sammo-nation" id="navbarNation" role="button" data-bs-toggle="dropdown" aria-expanded="false">
국가 메뉴
</div>
<ul class="dropdown-menu" aria-labelledby="navbarNation" id="navbarNationItems">
</ul>
</li>
<li class="nav-item dropup">
<div class="dropdown-toggle text-white btn btn-dark" id="navbarQuick" role="button" data-bs-toggle="dropdown" aria-expanded="false">
빠른 이동
</div>
<ul class="dropdown-menu dropdown-menu-end" aria-labelledby="navbarDropdown" id="navbarQuickItems">
<li><a class="dropdown-item disabled">국가 정보</a></button></li>
<hr class="dropdown-divider">
</hr>
<li><button type="button" onclick="scrollHardTo('nation-msg-position')" class="dropdown-item">방침</button></li>
<li><button type="button" onclick="scrollHardTo('reservedCommandList')" class="dropdown-item">명령</button></li>
<li><button type="button" onclick="scrollHardTo('nation-position')" class="dropdown-item">국가</button></li>
<li><button type="button" onclick="scrollHardTo('general-position')" class="dropdown-item">장수</button></li>
<li><button type="button" onclick="scrollHardTo('cityInfo')" class="dropdown-item">도시</button></li>
<li><a class="dropdown-item disabled">동향 정보</a></button></li>
<hr class="dropdown-divider">
</hr>
<li><button type="button" onclick="scrollHardTo('mapZone')" class="dropdown-item">지도</button></li>
<li><button type="button" onclick="scrollHardTo('general_public_record-position')" class="dropdown-item">동향</button></li>
<li><button type="button" onclick="scrollHardTo('general_log-position')" class="dropdown-item">개인</button></li>
<li><button type="button" onclick="scrollHardTo('world_history-position')" class="dropdown-item">정세</button></li>
<li><span>&nbsp;</span></li>
<li><a class="dropdown-item disabled">메시지</a></button></li>
<hr class="dropdown-divider">
</hr>
<li><button type="button" onclick="scrollHardTo('public_talk_position')" class="dropdown-item">전체</button></li>
<li><button type="button" onclick="scrollHardTo('national_talk_position')" class="dropdown-item">국가</button></li>
<li><button type="button" onclick="scrollHardTo('private_talk_position')" class="dropdown-item">개인</button></li>
<li><button type="button" onclick="scrollHardTo('diplomacy_talk_position')" class="dropdown-item">외교</button></li>
<li><button type='button' class='btn btn-sammo-base2' onclick="location.replace('../')">로비로</button></li>
</ul>
</li>
<li class="nav-item">
<a class="refreshPage btn btn-sammo-base2 text-white" role="button">갱신</a>
</li>
</ul>
</div>
</div>
</nav>
</body>
</html>
+1 -1
View File
@@ -54,7 +54,7 @@ class GeneralList extends \sammo\BaseAPI
$availableNextCall = $session->availableNextCallGetGeneralList ?? '2000-01-01 00:00:00';
$now = new \DateTimeImmutable();
if ($now <= new \DateTimeImmutable($availableNextCall) && $session->userGrade < 5) {
if ($now <= new \DateTimeImmutable($availableNextCall) && $session->userGrade < 6) {
return "장수 리스트는 10초에 한번 갱신 가능합니다.\n다음 시간 : " . $availableNextCall;
}
@@ -94,6 +94,10 @@ class ResetStat extends \sammo\BaseAPI
}
$userLogger = new UserLogger($userID);
if($general->getNPCType() != 0){
return 'NPC는 능력치 초기화를 할 수 없습니다.';
}
$db = DB::db();
$gameStor = KVStorage::getStorage($db, 'game_env');
+1 -1
View File
@@ -50,7 +50,7 @@ class UploadImage extends \sammo\BaseAPI
}
$extension = ltrim($contentType, 'image/');
$validExtensions = ['png', 'jpeg', 'jpg', 'gif', 'webp'];
$validExtensions = ['png', 'jpeg', 'jpg', 'gif', 'webp', 'avif'];
if (!in_array(strtolower($extension), $validExtensions)) {
return '지원하지 않는 이미지 파일입니다: ' . $contentType;
}
+2
View File
@@ -16,6 +16,7 @@ use \sammo\Constraint\Constraint;
use \sammo\Constraint\ConstraintHelper;
use sammo\CityConst;
use sammo\Enums\InheritanceKey;
use sammo\Enums\PenaltyKey;
use function sammo\refreshNationStaticInfo;
use function sammo\getAllNationStaticInfo;
@@ -45,6 +46,7 @@ class che_거병 extends Command\GeneralCommand{
ConstraintHelper::BeNeutral(),
ConstraintHelper::BeOpeningPart($relYear+1),
ConstraintHelper::AllowJoinAction(),
ConstraintHelper::NoPenalty(PenaltyKey::NoFoundNation),
];
}
+10
View File
@@ -21,6 +21,8 @@ use \sammo\Constraint\Constraint;
use \sammo\Constraint\ConstraintHelper;
use sammo\Enums\GeneralQueryMode;
use sammo\Enums\InheritanceKey;
use sammo\Enums\PenaltyKey;
use sammo\Json;
use sammo\StaticEventHandler;
class che_선양 extends Command\GeneralCommand
@@ -111,6 +113,14 @@ class che_선양 extends Command\GeneralCommand
$date = $general->getTurnTime($general::TURNTIME_HM);
$destGeneral = $this->destGeneralObj;
$destGeneralPenaltyList = JSON::decode($destGeneral->getVar('penalty'));
$penaltyKeyList = [PenaltyKey::NoChief, PenaltyKey::NoFoundNation, PenaltyKey::NoAmbassador];
foreach ($penaltyKeyList as $penaltyKey) {
if (key_exists($penaltyKey->value, $destGeneralPenaltyList)) {
$general->getLogger()->pushGeneralActionLog("선양할 수 없는 장수입니다.");
return false;
}
}
$generalName = $general->getName();
$destGeneralName = $destGeneral->getName();
+12 -13
View File
@@ -256,8 +256,11 @@ class che_징병 extends Command\GeneralCommand
$ownCities = [];
$ownRegions = [];
foreach (DB::db()->query('SELECT city, region from city where nation = %i', $general->getNationID()) as $city) {
$ownCities[$city['city']] = 1;
foreach (DB::db()->query('SELECT city, region, secu, level from city where nation = %i', $general->getNationID()) as $city) {
$ownCities[$city['city']] = [
'secu' => $city['secu'],
'level' => $city['level'],
];
$ownRegions[$city['region']] = 1;
}
@@ -273,23 +276,19 @@ class che_징병 extends Command\GeneralCommand
'values' => [],
];
$crewTypes = [];
foreach (GameUnitConst::byType($armType) as $unit) {
$crewObj = new \stdClass;
$crewObj->id = $unit->id;
$crewObj->reqTech = $unit->reqTech;
$crewObj->reqYear = $unit->reqYear;
/** @var ?\sammo\GameUnitConstraints\ReqTech */
$reqTechObj = $unit->reqConstraints['reqTech'] ?? null;
$crewObj->reqTech = $reqTechObj ? $reqTechObj->reqTech : 0;
/*
if ($unit->reqTech == 0) {
$crewObj->bgcolor = 'green';
} else {
$crewObj->bgcolor = 'limegreen';
}
*/
/** @var ?\sammo\GameUnitConstraint\ReqMinRelYear */
$reqMinRelYearObj = $unit->reqConstraints['reqMinRelYear'] ?? null;
$crewObj->reqYear = $reqMinRelYearObj ? $reqMinRelYearObj->reqMinRelYear : 0;
$crewObj->notAvailable = !$unit->isValid($ownCities, $ownRegions, $relativeYear, $tech);
$crewObj->notAvailable = !$unit->isValid($general, $ownCities, $ownRegions, $relativeYear, $tech);
$crewObj->baseRice = $general->onCalcDomestic($this->getName(), 'rice', $unit->riceWithTech($tech), ['armType' => $unit->armType]);
$crewObj->baseCost = $general->onCalcDomestic($this->getName(), 'cost', $unit->costWithTech($tech), ['armType' => $unit->armType]);
+3 -3
View File
@@ -33,12 +33,12 @@ class NoPenalty extends Constraint{
/** @var PenaltyKey */
$checkKey = $this->arg;
$peneltyList = JSON::decode($this->general['penalty']);
if(!key_exists($checkKey->value, $peneltyList)){
$penaltyList = JSON::decode($this->general['penalty']);
if(!key_exists($checkKey->value, $penaltyList)){
return true;
}
$this->reason = "징계 사유: {$peneltyList[$checkKey->value]}";
$this->reason = "징계 사유: {$penaltyList[$checkKey->value]}";
return false;
}
}
+333 -401
View File
@@ -1,6 +1,13 @@
<?php
namespace sammo;
use sammo\GameUnitConstraint\Impossible;
use sammo\GameUnitConstraint\ReqTech;
use sammo\GameUnitConstraint\ReqCities;
use sammo\GameUnitConstraint\ReqRegions;
use sammo\GameUnitConstraint\ReqMinRelYear;
class GameUnitConstBase{
protected function __construct(){
@@ -21,8 +28,6 @@ class GameUnitConstBase{
protected static $constID = [];
protected static $constName = [];
protected static $constCity = [];
protected static $constRegion = [];
protected static $constType = [];
protected static $typeData = [
@@ -33,319 +38,322 @@ class GameUnitConstBase{
self::T_SIEGE => '차병',
];
protected static $_buildData = [
[
1000, self::T_CASTLE, '성벽',
100, 100, 7, 0, 0, 99, 9,
999999, null, null, 999999,
[],//성벽은 공격할 수 없다.
[self::T_FOOTMAN=>1.2],
['성벽입니다.','생성할 수 없습니다.'],
null, ['che_선제사격시도', 'che_선제사격발동'], null
],
[
1100, self::T_FOOTMAN, '보병',
100, 150, 7, 10, 0, 9, 9,
0, null, null, 0,
[self::T_ARCHER=>1.2, self::T_CAVALRY=>0.8, self::T_SIEGE=>1.2],
[self::T_ARCHER=>0.8, self::T_CAVALRY=>1.2, self::T_SIEGE=>0.8],
['표준적인 보병입니다.','보병은 방어특화이며,','상대가 회피하기 어렵습니다.'],
null, ['che_방어력증가5p'], null
],
[
1101, self::T_FOOTMAN, '청주병',
100, 200, 7, 10, 0, 10, 11,
1000, null, ['중원'], 0,
[self::T_ARCHER=>1.2, self::T_CAVALRY=>0.8, self::T_SIEGE=>1.2],
[self::T_ARCHER=>0.8, self::T_CAVALRY=>1.2, self::T_SIEGE=>0.8],
['저렴하고 튼튼합니다.'],
null, ['che_방어력증가5p'], null
],
[
1102, self::T_FOOTMAN, '수병',
150, 150, 7, 10, 0, 11, 10,
1000, null, ['오월'], 0,
[self::T_ARCHER=>1.2, self::T_CAVALRY=>0.8, self::T_SIEGE=>1.2],
[self::T_ARCHER=>0.8, self::T_CAVALRY=>1.2, self::T_SIEGE=>0.8],
['저렴하고 강력합니다.'],
null, ['che_방어력증가5p'], null
],
[
1103, self::T_FOOTMAN, '자객병',
100, 150, 8, 20, 0, 10, 10,
2000, ['저'], null, 0,
[self::T_ARCHER=>1.2, self::T_CAVALRY=>0.8, self::T_SIEGE=>1.2],
[self::T_ARCHER=>0.8, self::T_CAVALRY=>1.2, self::T_SIEGE=>0.8],
['은밀하고 날쌥니다.'],
null, ['che_방어력증가5p'], null
],
[
1104, self::T_FOOTMAN, '근위병',
150, 200, 7, 10, 0, 12, 12,
3000, ['낙양'], null, 0,
[self::T_ARCHER=>1.2, self::T_CAVALRY=>0.8, self::T_SIEGE=>1.2],
[self::T_ARCHER=>0.8, self::T_CAVALRY=>1.2, self::T_SIEGE=>0.8],
['최강의 보병입니다.'],
null, ['che_방어력증가5p'], null
],
[
1105, self::T_FOOTMAN, '등갑병',
100, 225, 7, 5, 0, 13, 10,
1000, null, ['남중'], 0,
[self::T_ARCHER=>1.2, self::T_CAVALRY=>0.8, self::T_SIEGE=>1.2],
[self::T_ARCHER=>0.8, self::T_CAVALRY=>1.2, self::T_SIEGE=>0.8],
['등갑을 두른 보병입니다.'],
null, ['che_방어력증가5p'], null
],
[
1106, self::T_FOOTMAN, '백이병',
175, 175, 7, 5, 0, 13, 11,
3000, ['성도'], null, 0,
[self::T_ARCHER=>1.1, self::T_CAVALRY=>0.9, self::T_SIEGE=>1.1],
[self::T_ARCHER=>0.9, self::T_CAVALRY=>1.1, self::T_SIEGE=>0.9],
['정예 보병입니다. 불리한 싸움도 버텨냅니다.'],
null, ['che_방어력증가5p'], null
],
[
1200, self::T_ARCHER, '궁병',
100, 100, 7, 10, 0, 10, 10,
0, null, null, 0,
[self::T_CAVALRY=>1.2, self::T_FOOTMAN=>0.8, self::T_SIEGE=>1.2],
[self::T_CAVALRY=>0.8, self::T_FOOTMAN=>1.2, self::T_SIEGE=>0.8],
['표준적인 궁병입니다.','궁병은 선제사격을 하는 병종입니다.'],
null, ['che_선제사격시도', 'che_선제사격발동'], null
],
[
1201, self::T_ARCHER, '궁기병',
100, 100, 8, 20, 0, 11, 12,
1000, null, ['동이'], 0,
[self::T_CAVALRY=>1.2, self::T_FOOTMAN=>0.9, self::T_SIEGE=>1.2],
[self::T_CAVALRY=>0.8, self::T_FOOTMAN=>1.1, self::T_SIEGE=>0.8],
['말을 타고 잘 피합니다. 특히 다른 궁병보다 보병에게 조금 더 강합니다.'],
null, ['che_선제사격시도', 'che_선제사격발동'], null
],
[
1202, self::T_ARCHER, '연노병',
150, 100, 8, 10, 0, 12, 11,
1000, null, ['서촉'], 0,
[self::T_CAVALRY=>1.2, self::T_FOOTMAN=>0.8, self::T_SIEGE=>1.2],
[self::T_CAVALRY=>0.8, self::T_FOOTMAN=>1.2, self::T_SIEGE=>0.8],
['화살을 연사합니다.'],
null, ['che_선제사격시도', 'che_선제사격발동'], null
],
[
1203, self::T_ARCHER, '강궁병',
150, 150, 7, 10, 0, 13, 13,
3000, ['양양'], null, 0,
[self::T_CAVALRY=>1.2, self::T_FOOTMAN=>0.8, self::T_SIEGE=>1.2],
[self::T_CAVALRY=>0.8, self::T_FOOTMAN=>1.2, self::T_SIEGE=>0.8],
['강건한 궁병입니다.'],
null, ['che_선제사격시도', 'che_선제사격발동'], null
],
[
1204, self::T_ARCHER, '석궁병',
200, 100, 7, 10, 0, 13, 13,
3000, ['건업'], null, 0,
[self::T_CAVALRY=>1.2, self::T_FOOTMAN=>0.8, self::T_SIEGE=>1.2],
[self::T_CAVALRY=>0.8, self::T_FOOTMAN=>1.2, self::T_SIEGE=>0.8],
['강력한 화살을 쏩니다.'],
null, ['che_선제사격시도', 'che_선제사격발동'], null
],
[
1300, self::T_CAVALRY, '기병',
150, 100, 7, 5, 0, 11, 11,
0, null, null, 0,
[self::T_FOOTMAN=>1.2, self::T_ARCHER=>0.8, self::T_SIEGE=>1.2],
[self::T_FOOTMAN=>0.8, self::T_ARCHER=>1.2, self::T_SIEGE=>0.8],
['표준적인 기병입니다.','기병은 공격특화입니다.'],
null, ['che_기병병종전투'], null
],
[
1301, self::T_CAVALRY, '백마병',
200, 100, 7, 5, 0, 12, 13,
1000, null, ['하북'], 0,
[self::T_FOOTMAN=>1.2, self::T_ARCHER=>0.8, self::T_SIEGE=>1.2],
[self::T_FOOTMAN=>0.8, self::T_ARCHER=>1.2, self::T_SIEGE=>0.8],
['백마의 위용을 보여줍니다.'],
null, ['che_기병병종전투'], null
],
[
1302, self::T_CAVALRY, '중장기병',
150, 150, 7, 5, 0, 13, 12,
1000, null, ['서북'], 0,
[self::T_FOOTMAN=>1.2, self::T_ARCHER=>0.8, self::T_SIEGE=>1.2],
[self::T_FOOTMAN=>0.8, self::T_ARCHER=>1.2, self::T_SIEGE=>0.8],
['갑주를 두른 기병입니다.'],
null, ['che_기병병종전투'], null
],
[
1303, self::T_CAVALRY, '돌격기병',
200, 100, 8, 5, 0, 13, 11,
2000, ['흉노'], null, 0,
[self::T_FOOTMAN=>1.2, self::T_ARCHER=>0.8, self::T_SIEGE=>1.2],
[self::T_FOOTMAN=>0.8, self::T_ARCHER=>1.2, self::T_SIEGE=>0.8],
['저돌적으로 공격합니다.'],
null, ['che_기병병종전투'], null
],
[
1304, self::T_CAVALRY, '철기병',
100, 200, 7, 5, 0, 11, 13,
2000, ['강'], null, 0,
[self::T_FOOTMAN=>1.2, self::T_ARCHER=>0.8, self::T_SIEGE=>1.2],
[self::T_FOOTMAN=>0.8, self::T_ARCHER=>1.2, self::T_SIEGE=>0.8],
['철갑을 두른 기병입니다.'],
null, ['che_기병병종전투'], null
],
[
1305, self::T_CAVALRY, '수렵기병',
150, 100, 8, 15, 0, 12, 12,
2000, ['산월'], null, 0,
[self::T_FOOTMAN=>1.2, self::T_ARCHER=>0.8, self::T_SIEGE=>1.2],
[self::T_FOOTMAN=>0.8, self::T_ARCHER=>1.2, self::T_SIEGE=>0.8],
['날쎄고 빠른 기병입니다.'],
null, ['che_기병병종전투'], null
],
[
1306, self::T_CAVALRY, '맹수병',
250, 175, 6, 0, 0, 16, 16,
2000, ['남만'], null, 0,
[self::T_FOOTMAN=>1.2, self::T_ARCHER=>0.8, self::T_SIEGE=>1.2],
[self::T_FOOTMAN=>0.8, self::T_ARCHER=>1.2, self::T_SIEGE=>0.8],
['어느 누구보다 강력합니다.'],
null, ['che_기병병종전투'], null
],
[
1307, self::T_CAVALRY, '호표기병',
200, 150, 7, 5, 0, 14, 14,
3000, ['허창'], null, 0,
[self::T_FOOTMAN=>1.2, self::T_ARCHER=>0.8, self::T_SIEGE=>1.2],
[self::T_FOOTMAN=>0.8, self::T_ARCHER=>1.2, self::T_SIEGE=>0.8],
['정예 기병입니다.'],
null, ['che_기병병종전투'], null
],
[
1400, self::T_WIZARD, '귀병',
80, 80, 7, 5, 0.5, 9, 9,
0, null, null, 0,
[self::T_SIEGE=>1.2],
[self::T_SIEGE=>0.8],
['계략을 사용하는 병종입니다.'],
null, null, null
],
[
1401, self::T_WIZARD, '신귀병',
80, 80, 7, 20, 0.6, 10, 10,
1000, null, ['초'], 0,
[self::T_SIEGE=>1.2],
[self::T_SIEGE=>0.8],
['신출귀몰한 귀병입니다.'],
null, null, null
],
[
1402, self::T_WIZARD, '백귀병',
80, 130, 7, 5, 0.6, 9, 11,
2000, ['오환'], null, 0,
[self::T_SIEGE=>1.2],
[self::T_SIEGE=>0.8],
['저렴하고 튼튼합니다.'],
null, null, null
],
[
1403, self::T_WIZARD, '흑귀병',
130, 80, 7, 5, 0.6, 11, 9,
2000, ['왜'], null, 0,
[self::T_SIEGE=>1.2],
[self::T_SIEGE=>0.8],
['저렴하고 강력합니다.'],
null, null, null
],
[
1404, self::T_WIZARD, '악귀병',
130, 130, 7, 0, 0.6, 12, 12,
3000, ['장안'], null, 0,
[self::T_SIEGE=>1.2],
[self::T_SIEGE=>0.8],
['백병전에도 능숙합니다.'],
null, null, null
],
[
1405, self::T_WIZARD, '남귀병',
60, 60, 7, 10, 0.8, 8, 8,
1000, null, null, 0,
[self::T_SIEGE=>1.2],
[self::T_SIEGE=>0.8],
['전투를 포기하고 계략에 몰두합니다.'],
null, null, null
],
[
1406, self::T_WIZARD, '황귀병',
110, 110, 7, 0, 0.8, 13, 10,
3000, ['낙양'], null, 0,
[self::T_SIEGE=>1.2],
[self::T_SIEGE=>0.8],
['고도로 훈련된 귀병입니다.'],
null, null, null
],
[
1407, self::T_WIZARD, '천귀병',
80, 130, 7, 15, 0.6, 11, 12,
3000, ['성도'], null, 0,
[self::T_SIEGE=>1.2],
[self::T_SIEGE=>0.8],
['갑주를 두른 귀병입니다.'],
null, null, null
],
[
1408, self::T_WIZARD, '마귀병',
130, 80, 7, 15, 0.6, 12, 11,
3000, ['업'], null, 0,
[self::T_SIEGE=>1.2],
[self::T_SIEGE=>0.8],
['날카로운 무기를 가진 귀병입니다.'],
null, null, null
],
[
1500, self::T_SIEGE, '정란',
100, 100, 6, 0, 0, 14, 5,
0, null, null, 3,
[self::T_FOOTMAN=>1.25, self::T_ARCHER=>1.25, self::T_CAVALRY=>1.25, self::T_WIZARD=>1.25, self::T_CASTLE=>1.8, 1106=>1.112],
[self::T_FOOTMAN=>1.2, self::T_ARCHER=>1.2, self::T_CAVALRY=>1.2, self::T_WIZARD=>1.2, 1106=>1.067],
['높은 구조물 위에서 공격합니다. 첫 공격은 성벽을 향합니다.'],
['che_성벽부상무효'], ['che_선제사격시도', 'che_선제사격발동'], ['che_성벽선제']
],
[
1501, self::T_SIEGE, '충차',
150, 100, 6, 0, 0, 18, 5,
1000, null, null, 3,
[self::T_FOOTMAN=>0.8, self::T_ARCHER=>0.8, self::T_CAVALRY=>0.8, self::T_WIZARD=>0.8, self::T_CASTLE=>2.4],
[self::T_FOOTMAN=>1.2, self::T_ARCHER=>1.2, self::T_CAVALRY=>1.2, self::T_WIZARD=>1.2],
['엄청난 위력으로 성벽을 부수어버립니다.'],
['che_성벽부상무효'], null, null
],
[
1502, self::T_SIEGE, '벽력거',
150, 100, 6, 5, 0, 20, 5,
3000, ['업'], null, 0,
[self::T_FOOTMAN=>1.25, self::T_ARCHER=>1.25, self::T_CAVALRY=>1.25, self::T_WIZARD=>1.25, self::T_CASTLE=>1.8, 1106=>1.112],
[self::T_FOOTMAN=>1.2, self::T_ARCHER=>1.2, self::T_CAVALRY=>1.2, self::T_WIZARD=>1.2, 1106=>1.067],
['상대에게 돌덩이를 날립니다. 첫 공격은 성벽을 향합니다.'],
['che_성벽부상무효'], ['che_선제사격시도', 'che_선제사격발동'], ['che_성벽선제']
],
[
1503, self::T_SIEGE, '목우',
50, 200, 5, 0, 0, 15, 5,
3000, ['성도'], null, 0,
[self::T_FOOTMAN=>1, self::T_ARCHER=>1, self::T_CAVALRY=>1, self::T_WIZARD=>1, self::T_CASTLE=>1.8],
[self::T_FOOTMAN=>1, self::T_ARCHER=>1, self::T_CAVALRY=>1, self::T_WIZARD=>1, 1106=>1],
['상대를 저지하는 특수병기입니다.'],
['che_성벽부상무효'], ['che_저지시도', 'che_저지발동'], null
]
];
protected static function getBuildData(): array {
return [
[
1000, self::T_CASTLE, '성벽',
100, 100, 7, 0, 0, 99, 9,
[new Impossible()],
[], // 성벽은 공격할 수 없다.
[self::T_FOOTMAN=>1.2],
['성벽입니다.','생성할 수 없습니다.'],
null, ['che_선제사격시도', 'che_선제사격발동'], null
],
[
1100, self::T_FOOTMAN, '보병',
100, 150, 7, 10, 0, 9, 9,
[],
[self::T_ARCHER=>1.2, self::T_CAVALRY=>0.8, self::T_SIEGE=>1.2],
[self::T_ARCHER=>0.8, self::T_CAVALRY=>1.2, self::T_SIEGE=>0.8],
['표준적인 보병입니다.','보병은 방어특화이며,','상대가 회피하기 어렵습니다.'],
null, ['che_방어력증가5p'], null
],
[
1101, self::T_FOOTMAN, '청주병',
100, 200, 7, 10, 0, 10, 11,
[new ReqTech(1000), new ReqRegions('중원')],
[self::T_ARCHER=>1.2, self::T_CAVALRY=>0.8, self::T_SIEGE=>1.2],
[self::T_ARCHER=>0.8, self::T_CAVALRY=>1.2, self::T_SIEGE=>0.8],
['저렴하고 튼튼합니다.'],
null, ['che_방어력증가5p'], null
],
[
1102, self::T_FOOTMAN, '수병',
150, 150, 7, 10, 0, 11, 10,
[new ReqTech(1000), new ReqRegions('오월')],
[self::T_ARCHER=>1.2, self::T_CAVALRY=>0.8, self::T_SIEGE=>1.2],
[self::T_ARCHER=>0.8, self::T_CAVALRY=>1.2, self::T_SIEGE=>0.8],
['저렴하고 강력합니다.'],
null, ['che_방어력증가5p'], null
],
[
1103, self::T_FOOTMAN, '자객병',
100, 150, 8, 20, 0, 10, 10,
[new ReqTech(2000), new ReqCities('저')],
[self::T_ARCHER=>1.2, self::T_CAVALRY=>0.8, self::T_SIEGE=>1.2],
[self::T_ARCHER=>0.8, self::T_CAVALRY=>1.2, self::T_SIEGE=>0.8],
['은밀하고 날쌥니다.'],
null, ['che_방어력증가5p'], null
],
[
1104, self::T_FOOTMAN, '근위병',
150, 200, 7, 10, 0, 12, 12,
[new ReqTech(3000), new ReqCities('낙양')],
[self::T_ARCHER=>1.2, self::T_CAVALRY=>0.8, self::T_SIEGE=>1.2],
[self::T_ARCHER=>0.8, self::T_CAVALRY=>1.2, self::T_SIEGE=>0.8],
['최강의 보병입니다.'],
null, ['che_방어력증가5p'], null
],
[
1105, self::T_FOOTMAN, '등갑병',
100, 225, 7, 5, 0, 13, 10,
[new ReqTech(1000), new ReqRegions('남중')],
[self::T_ARCHER=>1.2, self::T_CAVALRY=>0.8, self::T_SIEGE=>1.2],
[self::T_ARCHER=>0.8, self::T_CAVALRY=>1.2, self::T_SIEGE=>0.8],
['등갑을 두른 보병입니다.'],
null, ['che_방어력증가5p'], null
],
[
1106, self::T_FOOTMAN, '백이병',
175, 175, 7, 5, 0, 13, 11,
[new ReqTech(3000), new ReqCities('성도')],
[self::T_ARCHER=>1.1, self::T_CAVALRY=>0.9, self::T_SIEGE=>1.1],
[self::T_ARCHER=>0.9, self::T_CAVALRY=>1.1, self::T_SIEGE=>0.9],
['정예 보병입니다. 불리한 싸움도 버텨냅니다.'],
null, ['che_방어력증가5p'], null
],
[
1200, self::T_ARCHER, '궁병',
100, 100, 7, 10, 0, 10, 10,
[],
[self::T_CAVALRY=>1.2, self::T_FOOTMAN=>0.8, self::T_SIEGE=>1.2],
[self::T_CAVALRY=>0.8, self::T_FOOTMAN=>1.2, self::T_SIEGE=>0.8],
['표준적인 궁병입니다.','궁병은 선제사격을 하는 병종입니다.'],
null, ['che_선제사격시도', 'che_선제사격발동'], null
],
[
1201, self::T_ARCHER, '궁기병',
100, 100, 8, 20, 0, 11, 12,
[new ReqTech(1000), new ReqRegions('동이')],
[self::T_CAVALRY=>1.2, self::T_FOOTMAN=>0.9, self::T_SIEGE=>1.2],
[self::T_CAVALRY=>0.8, self::T_FOOTMAN=>1.1, self::T_SIEGE=>0.8],
['말을 타고 잘 피합니다. 특히 다른 궁병보다 보병에게 조금 더 강합니다.'],
null, ['che_선제사격시도', 'che_선제사격발동'], null
],
[
1202, self::T_ARCHER, '연노병',
150, 100, 8, 10, 0, 12, 11,
[new ReqTech(1000), new ReqRegions('서촉')],
[self::T_CAVALRY=>1.2, self::T_FOOTMAN=>0.8, self::T_SIEGE=>1.2],
[self::T_CAVALRY=>0.8, self::T_FOOTMAN=>1.2, self::T_SIEGE=>0.8],
['화살을 연사합니다.'],
null, ['che_선제사격시도', 'che_선제사격발동'], null
],
[
1203, self::T_ARCHER, '강궁병',
150, 150, 7, 10, 0, 13, 13,
[new ReqTech(3000), new ReqCities('양양')],
[self::T_CAVALRY=>1.2, self::T_FOOTMAN=>0.8, self::T_SIEGE=>1.2],
[self::T_CAVALRY=>0.8, self::T_FOOTMAN=>1.2, self::T_SIEGE=>0.8],
['강건한 궁병입니다.'],
null, ['che_선제사격시도', 'che_선제사격발동'], null
],
[
1204, self::T_ARCHER, '석궁병',
200, 100, 7, 10, 0, 13, 13,
[new ReqTech(3000), new ReqCities('건업')],
[self::T_CAVALRY=>1.2, self::T_FOOTMAN=>0.8, self::T_SIEGE=>1.2],
[self::T_CAVALRY=>0.8, self::T_FOOTMAN=>1.2, self::T_SIEGE=>0.8],
['강력한 화살을 쏩니다.'],
null, ['che_선제사격시도', 'che_선제사격발동'], null
],
[
1300, self::T_CAVALRY, '기병',
150, 100, 7, 5, 0, 11, 11,
[],
[self::T_FOOTMAN=>1.2, self::T_ARCHER=>0.8, self::T_SIEGE=>1.2],
[self::T_FOOTMAN=>0.8, self::T_ARCHER=>1.2, self::T_SIEGE=>0.8],
['표준적인 기병입니다.','기병은 공격특화입니다.'],
null, ['che_기병병종전투'], null
],
[
1301, self::T_CAVALRY, '백마병',
200, 100, 7, 5, 0, 12, 13,
[new ReqTech(1000), new ReqRegions('하북')],
[self::T_FOOTMAN=>1.2, self::T_ARCHER=>0.8, self::T_SIEGE=>1.2],
[self::T_FOOTMAN=>0.8, self::T_ARCHER=>1.2, self::T_SIEGE=>0.8],
['백마의 위용을 보여줍니다.'],
null, ['che_기병병종전투'], null
],
[
1302, self::T_CAVALRY, '중장기병',
150, 150, 7, 5, 0, 13, 12,
[new ReqTech(1000), new ReqRegions('서북')],
[self::T_FOOTMAN=>1.2, self::T_ARCHER=>0.8, self::T_SIEGE=>1.2],
[self::T_FOOTMAN=>0.8, self::T_ARCHER=>1.2, self::T_SIEGE=>0.8],
['갑주를 두른 기병입니다.'],
null, ['che_기병병종전투'], null
],
[
1303, self::T_CAVALRY, '돌격기병',
200, 100, 8, 5, 0, 13, 11,
[new ReqTech(2000), new ReqCities('흉노')],
[self::T_FOOTMAN=>1.2, self::T_ARCHER=>0.8, self::T_SIEGE=>1.2],
[self::T_FOOTMAN=>0.8, self::T_ARCHER=>1.2, self::T_SIEGE=>0.8],
['저돌적으로 공격합니다.'],
null, ['che_기병병종전투'], null
],
[
1304, self::T_CAVALRY, '철기병',
100, 250, 7, 5, 0, 11, 13,
[new ReqTech(2000), new ReqCities('강')],
[self::T_FOOTMAN=>1.2, self::T_ARCHER=>0.8, self::T_SIEGE=>1.2],
[self::T_FOOTMAN=>0.8, self::T_ARCHER=>1.2, self::T_SIEGE=>0.8],
['철갑을 두른 기병입니다.'],
null, ['che_기병병종전투'], null
],
[
1305, self::T_CAVALRY, '수렵기병',
150, 100, 8, 15, 0, 12, 12,
[new ReqTech(2000), new ReqCities('산월')],
[self::T_FOOTMAN=>1.2, self::T_ARCHER=>0.8, self::T_SIEGE=>1.2],
[self::T_FOOTMAN=>0.8, self::T_ARCHER=>1.2, self::T_SIEGE=>0.8],
['날쎄고 빠른 기병입니다.'],
null, ['che_기병병종전투'], null
],
[
1306, self::T_CAVALRY, '맹수병',
250, 175, 6, 0, 0, 16, 16,
[new ReqTech(2000), new ReqCities('남만')],
[self::T_FOOTMAN=>1.2, self::T_ARCHER=>0.8, self::T_SIEGE=>1.2],
[self::T_FOOTMAN=>0.8, self::T_ARCHER=>1.2, self::T_SIEGE=>0.8],
['어느 누구보다 강력합니다.'],
null, ['che_기병병종전투'], null
],
[
1307, self::T_CAVALRY, '호표기병',
200, 150, 7, 5, 0, 14, 14,
[new ReqTech(3000), new ReqCities('허창')],
[self::T_FOOTMAN=>1.2, self::T_ARCHER=>0.8, self::T_SIEGE=>1.2],
[self::T_FOOTMAN=>0.8, self::T_ARCHER=>1.2, self::T_SIEGE=>0.8],
['정예 기병입니다.'],
null, ['che_기병병종전투'], null
],
[
1400, self::T_WIZARD, '귀병',
80, 80, 7, 5, 0.5, 9, 9,
[],
[self::T_SIEGE=>1.2],
[self::T_SIEGE=>0.8],
['계략을 사용하는 병종입니다.'],
null, null, null
],
[
1401, self::T_WIZARD, '신귀병',
80, 80, 7, 20, 0.6, 10, 10,
[new ReqTech(1000), new ReqRegions('초')],
[self::T_SIEGE=>1.2],
[self::T_SIEGE=>0.8],
['신출귀몰한 귀병입니다.'],
null, null, null
],
[
1402, self::T_WIZARD, '백귀병',
80, 130, 7, 5, 0.6, 9, 11,
[new ReqTech(2000), new ReqCities('오환')],
[self::T_SIEGE=>1.2],
[self::T_SIEGE=>0.8],
['저렴하고 튼튼합니다.'],
null, null, null
],
[
1403, self::T_WIZARD, '흑귀병',
130, 80, 7, 5, 0.6, 11, 9,
[new ReqTech(2000), new ReqCities('왜')],
[self::T_SIEGE=>1.2],
[self::T_SIEGE=>0.8],
['저렴하고 강력합니다.'],
null, null, null
],
[
1404, self::T_WIZARD, '악귀병',
130, 130, 7, 0, 0.6, 12, 12,
[new ReqTech(3000), new ReqCities('장안')],
[self::T_SIEGE=>1.2],
[self::T_SIEGE=>0.8],
['백병전에도 능숙합니다.'],
null, null, null
],
[
1405, self::T_WIZARD, '남귀병',
60, 60, 7, 10, 0.8, 8, 8,
[new ReqTech(1000)],
[self::T_SIEGE=>1.2],
[self::T_SIEGE=>0.8],
['전투를 포기하고 계략에 몰두합니다.'],
null, null, null
],
[
1406, self::T_WIZARD, '황귀병',
110, 110, 7, 0, 0.8, 13, 10,
[new ReqTech(3000), new ReqCities('낙양')],
[self::T_SIEGE=>1.2],
[self::T_SIEGE=>0.8],
['고도로 훈련된 귀병입니다.'],
null, null, null
],
[
1407, self::T_WIZARD, '천귀병',
80, 130, 7, 15, 0.6, 11, 12,
[new ReqTech(3000), new ReqCities('성도')],
[self::T_SIEGE=>1.2],
[self::T_SIEGE=>0.8],
['갑주를 두른 귀병입니다.'],
null, null, null
],
[
1408, self::T_WIZARD, '마귀병',
130, 80, 7, 15, 0.6, 12, 11,
[new ReqTech(3000), new ReqCities('업')],
[self::T_SIEGE=>1.2],
[self::T_SIEGE=>0.8],
['날카로운 무기를 가진 귀병입니다.'],
null, null, null
],
[
1500, self::T_SIEGE, '정란',
100, 100, 6, 0, 0, 14, 5,
[new ReqMinRelYear(3)],
[self::T_FOOTMAN=>1.25, self::T_ARCHER=>1.25, self::T_CAVALRY=>1.25, self::T_WIZARD=>1.25, self::T_CASTLE=>1.8, 1106=>1.112],
[self::T_FOOTMAN=>1.2, self::T_ARCHER=>1.2, self::T_CAVALRY=>1.2, self::T_WIZARD=>1.2, 1106=>1.067],
['높은 구조물 위에서 공격합니다. 첫 공격은 성벽을 향합니다.'],
['che_성벽부상무효'], ['che_선제사격시도', 'che_선제사격발동'], ['che_성벽선제']
],
[
1501, self::T_SIEGE, '충차',
150, 100, 6, 0, 0, 18, 5,
[new ReqTech(1000), new ReqMinRelYear(3)],
[self::T_FOOTMAN=>0.8, self::T_ARCHER=>0.8, self::T_CAVALRY=>0.8, self::T_WIZARD=>0.8, self::T_CASTLE=>2.4],
[self::T_FOOTMAN=>1.2, self::T_ARCHER=>1.2, self::T_CAVALRY=>1.2, self::T_WIZARD=>1.2],
['엄청난 위력으로 성벽을 부수어버립니다.'],
['che_성벽부상무효'], null, null
],
[
1502, self::T_SIEGE, '벽력거',
150, 100, 6, 5, 0, 20, 5,
[new ReqTech(3000), new ReqCities('업')],
[self::T_FOOTMAN=>1.25, self::T_ARCHER=>1.25, self::T_CAVALRY=>1.25, self::T_WIZARD=>1.25, self::T_CASTLE=>1.8, 1106=>1.112],
[self::T_FOOTMAN=>1.2, self::T_ARCHER=>1.2, self::T_CAVALRY=>1.2, self::T_WIZARD=>1.2, 1106=>1.067],
['상대에게 돌덩이를 날립니다. 첫 공격은 성벽을 향합니다.'],
['che_성벽부상무효'], ['che_선제사격시도', 'che_선제사격발동'], ['che_성벽선제']
],
[
1503, self::T_SIEGE, '목우',
50, 200, 5, 0, 0, 15, 5,
[new ReqTech(3000), new ReqCities('성도')],
[self::T_FOOTMAN=>1, self::T_ARCHER=>1, self::T_CAVALRY=>1, self::T_WIZARD=>1, self::T_CASTLE=>1.8],
[self::T_FOOTMAN=>1, self::T_ARCHER=>1, self::T_CAVALRY=>1, self::T_WIZARD=>1, 1106=>1],
['상대를 저지하는 특수병기입니다.'],
['che_성벽부상무효'], ['che_저지시도', 'che_저지발동'], null
]
];
}
public static function addGameUnit(GameUnitDetail $unitType){
static::_generate();
@@ -357,22 +365,6 @@ class GameUnitConstBase{
static::$constType[$unitType->armType] = [];
}
static::$constType[$unitType->armType][] = $unitType;
foreach($unitType->reqCities as $reqCity){
if(!key_exists($reqCity, static::$constCity)){
static::$constCity[$reqCity] = [];
}
static::$constCity[$reqCity][] = $unitType;
}
if($unitType->reqRegions){
foreach($unitType->reqRegions as $reqRegion){
if(!key_exists($reqRegion, static::$constRegion)){
static::$constRegion[$reqRegion] = [];
}
static::$constRegion[$reqRegion][] = $unitType;
}
}
}
/**
@@ -400,22 +392,6 @@ class GameUnitConstBase{
return static::$constName[$name]??null;
}
/**
* @return \sammo\GameUnitDetail[]
*/
public static function byCity(int $city): array{
static::_generate();
return static::$constCity[$city]??[];
}
/**
* @return \sammo\GameUnitDetail[]
*/
public static function byRegion(int $region): array{
static::_generate();
return static::$constRegion[$region]??[];
}
/**
* @return \sammo\GameUnitDetail[]
@@ -435,17 +411,17 @@ class GameUnitConstBase{
protected static function _generate(){
if(static::$constID || static::$constName || static::$constCity || static::$constRegion || static::$constType){
if(static::$constID || static::$constName || static::$constType){
return;
}
$constID = [];
$constName = [];
$constCity = [];
$constRegion = [];
$constType = [];
foreach(static::$_buildData as $rawUnit){
$buildData = static::getBuildData();
foreach($buildData as $rawUnit){
[
$id,
$armType,
@@ -457,10 +433,7 @@ class GameUnitConstBase{
$magicCoef,
$cost,
$rice,
$reqTech,
$reqCities,
$reqRegions,
$reqYear,
$reqConstraints,
$attackCoef,
$defenceCoef,
$info,
@@ -469,26 +442,9 @@ class GameUnitConstBase{
$iActionList,
] = $rawUnit;
if($reqYear > 0){
$info[] = "{$reqYear}년 경과 후 사용 가능";
}
if($reqTech > 0){
$info[] = "기술력 {$reqTech} 이상 필요";
}
if($reqCities !== null){
$reqCities = array_map(function($reqCity) use (&$info){
$info[] = "{$reqCity} 소유시 가능";
return CityConst::byName($reqCity)->id;
}, $reqCities);
}
if($reqRegions !== null){
$reqRegions = array_map(function($reqRegion) use (&$info){
$info[] = "{$reqRegion} 지역 소유시 가능";
return CityConst::$regionMap[$reqRegion];
}, $reqRegions);
foreach($reqConstraints as $constraint){
/** @var \sammo\GameUnitConstraint\BaseGameUnitConstraint $constraint */
$info[] = $constraint->getInfo();
}
$unit = new GameUnitDetail(
@@ -502,16 +458,13 @@ class GameUnitConstBase{
$magicCoef,
$cost,
$rice,
$reqTech,
$reqCities,
$reqRegions,
$reqYear,
$reqConstraints,
$attackCoef,
$defenceCoef,
$info,
$initSkillTrigger,
$phaseSkillTrigger,
$iActionList,
$iActionList
);
$constID[$id] = $unit;
@@ -521,31 +474,10 @@ class GameUnitConstBase{
}
$constType[$armType][$id] = $unit;
if($unit->reqCities){
foreach($unit->reqCities as $reqCity){
if(!key_exists($reqCity, $constCity)){
$constCity[$reqCity] = [];
}
$constCity[$reqCity][$id] = $unit;
}
}
if($unit->reqRegions){
foreach($unit->reqRegions as $reqRegion){
if(!key_exists($reqRegion, $constRegion)){
$constRegion[$reqRegion] = [];
}
$constRegion[$reqRegion][$id] = $unit;
}
}
}
static::$constID = $constID;
static::$constName = $constName;
static::$constCity = $constCity;
static::$constRegion = $constRegion;
static::$constType = $constType;
static::_generateOptional();
@@ -0,0 +1,11 @@
<?php
namespace sammo\GameUnitConstraint;
use sammo\General;
abstract class BaseGameUnitConstraint {
public abstract function test(General $general, array $ownCities, array $ownRegions, int $relativeYear, int $tech, array $nationAux): bool;
public abstract function getInfo(): string;
}
@@ -0,0 +1,18 @@
<?php
namespace sammo\GameUnitConstraint;
use sammo\General;
class Impossible extends BaseGameUnitConstraint {
public function test(General $general, array $ownCities, array $ownRegions, int $relativeYear, int $tech, array $nationAux): bool
{
return false;
}
public function getInfo(): string
{
return "불가능";
}
}
@@ -0,0 +1,42 @@
<?php
namespace sammo\GameUnitConstraint;
use sammo\CityConst;
use sammo\General;
class ReqCities extends BaseGameUnitConstraint
{
public readonly array $reqCities;
public function __construct(...$reqCities)
{
$dstReqCities = [];
if (count($reqCities) == 0) {
$this->reqCities = [];
return;
}
foreach ($reqCities as $city) {
$dstReqCities[CityConst::byName($city)->id] = $city;
}
$this->reqCities = $dstReqCities;
}
public function test(General $general, array $ownCities, array $ownRegions, int $relativeYear, int $tech, array $nationAux): bool
{
foreach ($this->reqCities as $cityID => $cityName) {
if (key_exists($cityID, $ownCities)) {
return true;
}
}
return false;
}
public function getInfo(): string
{
$cityNameText = implode(', ', $this->reqCities);
return "{$cityNameText} 소유시 가능";
}
}
@@ -0,0 +1,22 @@
<?php
namespace sammo\GameUnitConstraint;
use sammo\General;
class ReqMinRelYear extends BaseGameUnitConstraint {
public function __construct(public readonly int $reqMinRelYear)
{
}
public function test(General $general, array $ownCities, array $ownRegions, int $relativeYear, int $tech, array $nationAux): bool
{
return $relativeYear >= $this->reqMinRelYear;
}
public function getInfo(): string
{
return "{$this->reqMinRelYear}년 경과 후 사용 가능";
}
}
@@ -0,0 +1,43 @@
<?php
namespace sammo\GameUnitConstraint;
use sammo\CityConst;
use sammo\General;
class ReqRegions extends BaseGameUnitConstraint
{
public readonly array $reqRegions;
public function __construct(...$reqRegions)
{
$dstReqRegions = [];
if (count($reqRegions) == 0) {
$this->reqRegions = [];
return;
}
foreach ($reqRegions as $region) {
$dstReqRegions[CityConst::$regionMap[$region]] = $region;
}
$this->reqRegions = $dstReqRegions;
}
public function test(General $general, array $ownCities, array $ownRegions, int $relativeYear, int $tech, array $nationAux): bool
{
foreach ($this->reqRegions as $regionID => $regionText) {
if (key_exists($regionID, $ownRegions)) {
return true;
}
}
return false;
}
public function getInfo(): string
{
$regionNameText = implode(', ', $this->reqRegions);
return "{$regionNameText} 지역 소유시 가능";
}
}
+26
View File
@@ -0,0 +1,26 @@
<?php
namespace sammo\GameUnitConstraint;
use sammo\General;
use sammo\KVStorage;
class ReqTech extends BaseGameUnitConstraint {
public function __construct(public readonly int $reqTech)
{
}
public function test(General $general, array $ownCities, array $ownRegions, int $relativeYear, int $tech, array $nationAux): bool
{
if ($tech < $this->reqTech) {
return false;
}
return true;
}
public function getInfo(): string
{
return "기술력 {$this->reqTech} 이상 필요";
}
}
+14 -46
View File
@@ -2,6 +2,8 @@
namespace sammo;
use sammo\GameUnitConstraint\BaseGameUnitConstraint;
class GameUnitDetail implements iAction
{
use DefaultAction;
@@ -16,17 +18,14 @@ class GameUnitDetail implements iAction
public $magicCoef;
public $cost;
public $rice;
public $reqTech;
public $reqCities;
public $reqRegions;
public $reqYear;
public $attackCoef;
public $defenceCoef;
public $info;
public $initSkillTrigger;
public $phaseSkillTrigger;
/** @var iAction[]|null iActionList */
public $iActionList;
public array $reqConstraints;
public function __construct(
int $id,
@@ -39,13 +38,10 @@ class GameUnitDetail implements iAction
float $magicCoef,
int $cost,
int $rice,
int $reqTech,
?array $reqCities,
?array $reqRegions,
int $reqYear,
array $reqConstraints,
array $attackCoef,
array $defenceCoef,
array $info,
public readonly array $info,
?array $initSkillTrigger,
?array $phaseSkillTrigger,
?array $iActionList,
@@ -60,13 +56,13 @@ class GameUnitDetail implements iAction
$this->magicCoef = $magicCoef;
$this->cost = $cost;
$this->rice = $rice;
$this->reqTech = $reqTech;
$this->reqCities = $reqCities;
$this->reqRegions = $reqRegions;
$this->reqYear = $reqYear;
$this->reqConstraints = [];
foreach($reqConstraints as $constraint){
$className = Util::getClassNameFromObj($constraint);
$this->reqConstraints[$className] = $constraint;
}
$this->attackCoef = $attackCoef;
$this->defenceCoef = $defenceCoef;
$this->info = $info;
$this->initSkillTrigger = $initSkillTrigger;
$this->phaseSkillTrigger = $phaseSkillTrigger;
$this->iActionList = [];
@@ -193,41 +189,13 @@ class GameUnitDetail implements iAction
return $defaultWar;
}
public function isValid($ownCities, $ownRegions, $relativeYear, $tech)
public function isValid(General $general, $ownCities, $ownRegions, $relativeYear, $tech, $nationAux = [])
{
//음수 없음
$relativeYear = max(0, $relativeYear);
if ($relativeYear < $this->reqYear) {
return false;
}
if ($tech < $this->reqTech) {
return false;
}
if ($this->reqCities !== null) {
$valid = false;
foreach ($this->reqCities as $reqCity) {
if (\key_exists($reqCity, $ownCities)) {
$valid = true;
break;
}
}
if (!$valid) {
return false;
}
}
if ($this->reqRegions !== null) {
$valid = false;
foreach ($this->reqRegions as $reqRegion) {
if (\key_exists($reqRegion, $ownRegions)) {
$valid = true;
break;
}
}
if (!$valid) {
foreach($this->reqConstraints as $constraint){
if(!$constraint->test($general, $ownCities, $ownRegions, $relativeYear, $tech, $nationAux)){
return false;
}
}
+18 -11
View File
@@ -2558,8 +2558,11 @@ class GeneralAI
$cities = [];
$regions = [];
foreach ($db->queryAllLists('SELECT city, region FROM city WHERE nation = %i', $nationID) as [$cityID, $regionID]) {
$cities[$cityID] = true;
foreach ($db->queryAllLists('SELECT city, region, secu, level FROM city WHERE nation = %i', $nationID) as [$cityID, $regionID, $secu, $level]) {
$cities[$cityID] = [
'secu' => $secu,
'level' => $level,
];
$regions[$regionID] = true;
}
$relYear = Util::valueFit($env['year'] - $env['startyear'], 0);
@@ -2567,7 +2570,7 @@ class GeneralAI
$types = [];
foreach (GameUnitConst::byType($armType) as $crewtype) {
if ($crewtype->isValid($cities, $regions, $relYear, $tech)) {
if ($crewtype->isValid($general, $cities, $regions, $relYear, $tech)) {
$score = $crewtype->pickScore($tech);
$types[$crewtype->id] = $score;
}
@@ -2581,12 +2584,16 @@ class GeneralAI
if ($this->generalPolicy->can고급병종) {
$currCrewType = $general->getCrewTypeObj();
if ($currCrewType->isValid($cities, $regions, $relYear, $tech)) {
if ($currCrewType->reqTech >= 2000) {
$type = $currCrewType->id;
} else if ($currCrewType->armType != $armType && $currCrewType->reqTech >= 1000) {
//굳이 뽑은 이유가 있겠지
$type = $currCrewType->id;
if ($currCrewType->isValid($general, $cities, $regions, $relYear, $tech)) {
$reqTechObj = $currCrewType->reqConstraints['reqTech'] ?? null;
if($reqTechObj){
$reqTech = $reqTechObj->getValue($tech);
if ($reqTech >= 2000) {
$type = $currCrewType->id;
} else if ($currCrewType->armType != $armType && $reqTech >= 1000) {
//굳이 뽑은 이유가 있겠지
$type = $currCrewType->id;
}
}
}
}
@@ -4036,7 +4043,7 @@ class GeneralAI
if ($general->getVar('belong') < $minBelong) {
continue;
}
if ($general->getVar('officer_level') !== 1) {
if ($general->getVar('officer_level') > 4) {
continue;
}
$nextChiefs[11] = $general;
@@ -4093,7 +4100,7 @@ class GeneralAI
$newChief = null;
foreach ($generals as $general) {
if ($general->getVar('officer_level') !== 1) {
if ($general->getVar('officer_level') > 4) {
continue;
}
if ($general->getNPCType() < 2 && $general->getVar('killturn') < $minUserKillturn) {
+34 -18
View File
@@ -1,5 +1,7 @@
<?php
namespace sammo\GeneralTrigger;
use sammo\BaseGeneralTrigger;
use sammo\General;
use sammo\ActionLogger;
@@ -7,16 +9,18 @@ use sammo\DB;
use sammo\Util;
use sammo\JosaUtil;
class che_도시치료 extends BaseGeneralTrigger{
class che_도시치료 extends BaseGeneralTrigger
{
protected $priority = 10010;
public function action(\sammo\RandUtil $rng, ?array $env=null, $arg=null):?array{
public function action(\sammo\RandUtil $rng, ?array $env = null, $arg = null): ?array
{
/** @var \sammo\General $general */
$general = $this->object;
$logger = $general->getLogger();
if($general->getVar('injury') > 0){
if ($general->getVar('injury') > 0) {
$general->updateVar('injury', 0);
$general->activateSkill('pre.부상경감', 'pre.치료');
$logger->pushGeneralActionLog('<C>의술</>을 펼쳐 스스로 치료합니다!', ActionLogger::PLAIN);
@@ -24,14 +28,27 @@ class che_도시치료 extends BaseGeneralTrigger{
$db = DB::db();
/** @var array{int,string,string}[] $patients */
$patients = $db->queryAllLists(
'SELECT no,name,nation FROM general WHERE city=%i AND injury > 10 AND no != %i',
$general->getCityID(),
$general->getID()
);
if ($general->getNationID() == 0) {
/** @var array{int,string,string}[] $patients */
$patients = $db->queryAllLists(
'SELECT no,name,nation FROM general WHERE city=%i AND nation=%i AND injury > 10 AND no != %i',
$general->getCityID(),
0,
$general->getID()
);
}
else {
/** @var array{int,string,string}[] $patients */
$patients = $db->queryAllLists(
'SELECT no,name,nation FROM general WHERE city=%i AND injury > 10 AND no != %i',
$general->getCityID(),
$general->getID()
);
}
if(!$patients){
if (!$patients) {
return $env;
}
@@ -42,7 +59,7 @@ class che_도시치료 extends BaseGeneralTrigger{
/** @var string|null */
$curedPatientName = null;
foreach($patients as [$patientID, $patientName, $patientNationID]){
foreach ($patients as [$patientID, $patientName, $patientNationID]) {
if (!$rng->nextBool(0.5)) {
continue;
}
@@ -54,28 +71,27 @@ class che_도시치료 extends BaseGeneralTrigger{
$patientLogger->flush();
}
if(!$cureList){
if (!$cureList) {
return $env;
}
if($curedPatientName === null){
if ($curedPatientName === null) {
throw new \sammo\MustNotBeReachedException();
}
if(count($cureList) == 1){
if (count($cureList) == 1) {
$josaUl = JosaUtil::pick($curedPatientName, "");
$logger->pushGeneralActionLog("<C>의술</>을 펼쳐 도시의 장수 <Y>{$curedPatientName}</>{$josaUl} 치료합니다!", ActionLogger::PLAIN);
}
else{
} else {
$otherCount = count($cureList) - 1;
$logger->pushGeneralActionLog("<C>의술</>을 펼쳐 도시의 장수들 <Y>{$curedPatientName}</> 외 <C>{$otherCount}</>명을 치료합니다!", ActionLogger::PLAIN);
}
$db->update('general', [
'injury'=>0
'injury' => 0
], 'no IN %li', $cureList);
return $env;
}
}
}
+1 -1
View File
@@ -302,7 +302,7 @@ class ResetHelper{
'server_cnt'=>$serverCnt,
];
foreach(RootDB::db()->query('SELECT `no`, `name`, `picture`, `imgsvr` FROM member WHERE grade >= 5') as $admin){
foreach(RootDB::db()->query('SELECT `no`, `name`, `picture`, `imgsvr` FROM member WHERE grade >= 6') as $admin){
$db->insert('general', [
'owner'=>$admin['no'],
'name'=>$admin['name'],
+114 -29
View File
@@ -10,20 +10,22 @@
"min": 40,
"max": 90
},
"iconPath": ".",
"iconPath": "강서유서월드",
"fiction": 1,
"nation":[
["TOG", "#FFD700", 13000, 60000, "반정부주의 단체", 0, "병가", 2, ["대", "유구"]],
["초대 선받아", "#00FFFF", 8000, 25000, "초대 선택받은 아이들의 세력, 원작과는 다르다 달라", 0, "명가", 2, ["천수", ""]],
["TOG", "#FFD700", 13000, 60000, "반정부주의 단체", 1, "병가", 2, ["하비"]],
["초대 선받아", "#00FFFF", 8000, 25000, "초대 선택받은 아이들의 세력, 원작과는 다르다 달라", 0, "명가", 2, ["", "역경"]],
["견휘", "#008000", 20000, 40000, "연휘아님 소설 출현 캐릭터(허락받음 오래전에)", 0, "법가", 3, ["장안", "함곡"]],
["강인", "#00FF00", 15000, 40000, "블로거분 소설 캐릭터(소설 여전히 진짜 적게 연재", 0, "법가", 3, ["한중", "양평"]],
["테란 자치령", "#000080", 40000, 60000, "스타크래프트 테란 자치령 소속", 0, "법가", 7, ["성도"]]
["테란 자치령", "#000080", 40000, 60000, "스타크래프트 테란 자치령 소속", 1, "법가", 5, ["성도"]],
["이터니얼", "#A0522D", 30000, 120000, "프리큐어의 주적", 1, "도적", 4, ["이도", "왜", "유구"]],
["타이 제국", "#20B2AA", 30000, 60000, "타이지역과 동남아의 강국", 0, "법가", 5, ["남해", "교지"]]
],
"diplomacy":[],
"general":[
[1, "키타노 유키코", null, 1, "대", 86, 31, 95, 1, 160, 300, "대의", "저격", "모든것은 우리들의 꿈을 이루기 위해…"],
[1, "키타노 시오리", null, 1, "대", 94, 96, 89, 1, 160, 300, "대의", "무쌍", "언니를 지켜보일거야"],
[1, "이치가와 아이리", null, 1, "대", 78, 88, 94, 11, 160, 300, "대의", null, "유키코를 지킬거야. 내 속죄를 위해"],
[1, "키타노 유키코", null, 1, "대", 95, 31, 95, 12, 160, 300, "대의", "저격", "모든것은 우리들의 꿈을 이루기 위해…"],
[1, "키타노 시오리", null, 1, "대", 88, 96, 89, 1, 160, 300, "대의", "무쌍", "언니를 지켜보일거야"],
[1, "이치가와 아이리", null, 1, "대", 87, 73, 94, 11, 160, 300, "대의", null, "유키코를 지킬거야. 내 속죄를 위해"],
[1, "이즈카에 에리카", null, 1, "유구", 77, 93, 72, 1, 160, 300, "의협", "저격"],
[1, "타에구치 유카리", null, 1, "유구", 71, 66, 80, 1, 160, 300, "할거", null, "아버지와 어머니를 지키기 위해 미래에서 왓어 난"],
[1, "오모타 아미유", null, 1, "대", 64, 51, 44, 1, 160, 300, "대의", null],
@@ -34,7 +36,7 @@
[1, "요리시마 사치코", null, 1, "유구", 51, 81, 70, 1, 160, 300, "대의", "저격"],
[0, "큐어 스플릿", null, 0, null, 80, 90, 56, 0, 160, 300, null, "무쌍"],
[0, "큐어 솔크", null, 0, null, 93, 97, 67, 0, 160, 300, null, null, "아버지를 이겨보일거야."],
[0, "큐어 샤인", null, 0, null, 99, 75, 99, 0, 160, 300, "패권", "신산", "디지털 월드와 인간세계 모두를 위해"],
[0, "큐어 샤인", null, 0, null, 89, 75, 99, 0, 160, 300, "패권", "신산", "디지털 월드와 인간세계 모두를 위해"],
[0, "큐어 러브", null, 0, null, 77, 86, 54, 0, 160, 300, null, null, "사랑을 추구하는 전사 큐어 러브"],
[0, "큐어 프로즌", null, 0, null, 64, 88, 72, 0, 160, 300, null, null],
[0, "큐어 바이올렛", null, 0, null, 49, 89, 77, 0, 160, 300, null, "상재"],
@@ -46,16 +48,16 @@
[0, "큐어 뮤직", null, 0, null, 79, 84, 60, 0, 160, 300, null, null],
[0, "큐어 포르테", null, 0, null, 72, 77, 55, 0, 160, 300, null, null],
[0, "큐어 리스", null, 0, null, 89, 80, 67, 0, 160, 300, null, null],
[0, "분비", null, 0, null, 85, 94, 90, 0, 148, 300, null, null],
[0, "시비렛타", null, 0, null, 82, 73, 90, 0, 127, 300, null, null],
[0, "히토", null, 0, null, 64, 88, 80, 0, 115, 300, null, null],
[8, "분비", null, 6, "이도", 85, 94, 90, 12, 148, 300, null, null],
[8, "시비렛타", null, 6, "이도", 82, 73, 90, 1, 127, 300, null, null],
[8, "히토", null, 6, "이도", 64, 88, 80, 11, 115, 300, null, null],
[2, "모요코모 미에카", null, 2, "천수", 91, 60, 97, 12, 141, 300, "할거", null, "모든것은 분비님이 부활시키려는 그자를 막기 위해서야! 그자는 우리가 죽을뻔한 초대 선택받은 아이들의 적이니까!"],
[2, "노자미 미노코", null, 2, "천수", 80, 77, 80, 11, 143, 300, null, null, "도대체 요시미츠님(분비님)은 뭔 생각이신거야…"],
[2, "노자미 미에키", null, 0, null, 73, 70, 55, 0, 160, 300, null, null],
[999, "리아", null, 0, null, 99, 34, 100, 0, 132, 300, null, "집중", "이 세계를 부디 안정시켜줄 사람이 필요해…."],
[0, "코구라 아치모토", null, 0, null, 51, 44, 114, 0, 160, 300, null, "발명", "크흐흐…다크 프리큐어여 모습을 드러내라…!"],
[0, "다크 프리큐어즈", null, 0, null, 84, 97, 92, 0, 160, 300, null, null, "모든건… 그분의 부활을 위해."],
[0, "레톨프", null, 0, null, 87, 88, 64, 0, 160, 300, null, null],
[2, "리아", null, 0, null, 99, 34, 100, 0, 132, 300, null, "집중", "이 세계를 부디 안정시켜줄 사람이 필요해…."],
[8, "코구라 아치모토", null, 6, "왜", 51, 44, 114, 1, 160, 300, null, "발명", "크흐흐…다크 프리큐어여 모습을 드러내라…!"],
[8, "다크 프리큐어즈", null, 6, "왜", 84, 97, 92, 1, 160, 300, null, null, "모든건… 그분의 부활을 위해."],
[8, "레톨프", null, 6, "왜", 87, 88, 64, 1, 160, 300, null, null],
[2, "사사토케 라이라", null, 2, "천수", 71, 80, 74, 1, 151, 300, null, null, "다시한번 주어진 기회. 이번엔 그녀를 지킬거야."],
[2, "하루사키 츠보미", null, 2, "천수", 88, 51, 97, 1, 153, 300, "할거", null, "똑같은 악당짓을 다시는 하지않게, 나자신을 바꿀거야, 사랑하는 라이라 오빠와 함께."],
[2, "아야토케 나이미", null, 2, "천수", 76, 44, 88, 1, 151, 300, null, null],
@@ -80,6 +82,7 @@
[0, "오카자키 토모야", null, 0, null, 79, 82, 51, 0, 160, 300, null, null],
[0, "오카자키 우시오", null, 0, null, 67, 77, 68, 0, 160, 300, null, null, "미우를 구하기 위해..! 난 싸울거야 친구니까!"],
[0, "최산해", null, 0, null, 82, 88, 33, 0, 160, 300, null, null],
[0, "모토미야 유지", null, 0, null, 86, 31, 88, 0, 160, 300, null, "상재", "허허…. 이나라가 어찌되련지…"],
[0, "유에", null, 0, null, 56, 14, 80, 0, 160, 300, null, null, "백성을 우선시하는게 통치의 근본."],
[0, "에이", null, 0, null, 64, 33, 97, 0, 160, 300, null, null, "유에는 소중한 친구이자 주군,"],
[0, "견휘", null, 3, "장안", 85, 44, 92, 12, 160, 300, null, "집중"],
@@ -165,7 +168,7 @@
[0, "미라 호너", null, 0, null, 89, 66, 94, 0, 160, 300, null, null],
[0, "알렌 세자르", null, 0, null, 85, 61, 82, 0, 160, 300, null, null],
[0, "마이클 리버티", null, 0, null, 64, 33, 71, 0, 160, 300, null, null],
[0, "시온 크루스", null, 5, "성도", 51, 14, 85, 1, 160, 300, null, null],
[0, "시온 크루스", null, 0, null, 51, 14, 85, 0, 160, 300, null, null],
[0, "사라 케리건", null, 0, null, 95, 95, 81, 0, 160, 300, null, "무쌍"],
[10, "드랄리스카", null, 0, null, 82, 93, 78, 0, 160, 300, null, null, "케리건님이 죽다니…근데 왜 내가 그 중임을 이어받아야 하는거야?"],
[0, "에레니카", null, 0, null, 78, 38, 91, 0, 160, 300, null, null, "곧있으면 위대하신 아몬님이 완전히 부활할거야 드랄리스카 언니 후후후…."],
@@ -218,7 +221,7 @@
[0, "나서희", null, 0, null, 81, 77, 44, 0, 160, 300, null, null, "다미를 지킬거야"],
[0, "스노우 화이트", null, 0, null, 71, 80, 66, 0, 160, 300, null, null, "이번에야 말로 친구들을 지켜 보이겠어. 소타도, 아카리도"],
[0, "워터 스플렛", null, 0, null, 65, 80, 52, 0, 160, 300, null, null, "이번생에는 그런 셔플린 따위에게 지지 않을거야,"],
[0, "스노우 슬러스", null, 0, null, 69, 75, 53, 0, 160, 300, null, null, "저번생이랑 달라! 나도 강해졋다고!"],
[0, "프린세스 스노우", null, 0, null, 69, 75, 53, 0, 160, 300, null, null, "저번생이랑 달라! 나도 강해졋다고!"],
[0, "리하나", null, 0, null, 79, 70, 65, 0, 160, 300, null, null, "프흐레 언니…"],
[0, "블루베리", null, 0, null, 81, 88, 73, 0, 160, 300, null, null],
[0, "스윔스윔", null, 0, null, 54, 90, 71, 0, 163, 300, null, null, "룰러가 그랫어 마법소녀는 본모습을 남에게 보여주면 안된다고"],
@@ -242,7 +245,7 @@
[0, "나츠세 유우", null, 0, null, 66, 30, 70, 0, 160, 300, null, null],
[0, "크로노스 신", null, 0, null, 50, 15, 90, 0, 160, 300, null, null],
[0, "프흐레", null, 0, null, 69, 24, 100, 0, 160, 300, null, null, "마법나라가 바라는 마법소녀란 말이지…"],
[999, "나나하라 슈야", null, 0, null, 73, 72, 62, 0, 160, 300, null, null, "전세계의 어른들에게 선전포고 한다!"],
[0, "나나하라 슈야", null, 0, null, 73, 72, 62, 0, 160, 300, null, null, "전세계의 어른들에게 선전포고 한다!"],
[0, "타에구치유이치로", null, 0, null, 51, 63, 44, 0, 160, 300, null, null],
[0, "카와다 소교", null, 0, null, 49, 70, 85, 0, 160, 300, null, null],
[0, "카에리 유카리", null, 0, null, 41, 31, 53, 0, 160, 300, null, null],
@@ -254,25 +257,25 @@
[0, "카마디야", null, 0, null, 85, 93, 55, 0, 160, 300, null, null, "크흐흐… 감히 인간 따위가!! 나에게 덤비다니 용서못한다!!"],
[0, "토토리몬", null, 0, null, 69, 88, 44, 0, 160, 300, null, null, "모든것은 카마디야님의 부활을 위해서…."],
[0, "카와리노", null, 0, null, 73, 91, 80, 0, 160, 300, null, null, "나를 그곳에 꺼내주신 카마디야 님을 위해 난 일한다!"],
[0, "가마오", null, 0, null, 41, 65, 13, 0, 160, 300, null, null, "이씨 너무 배고파…"],
[0, "가마오", "이터니얼", 0, null, 41, 65, 13, 0, 160, 300, null, null, "이씨 너무 배고파…"],
[0, "밀키 로즈", null, 0, null, 64, 82, 52, 0, 160, 300, null, null],
[0, "옐로우 미치", null, 0, null, 61, 80, 80, 0, 160, 300, null, null, "난 마법나라 외교부문의 부문장 옐로우 미치야"],
[0, "마왕팜", null, 0, null, 50, 90, 70, 0, 160, 300, null, null, "무지개? 어째서…!"],
[0, "그림하트", null, 0, null, 74, 63, 41, 0, 160, 300, null, null, "목을 쳐라!!"],
[0, "루다", null, 0, null, 62, 66, 62, 0, 160, 300, null, null],
[0, "루다", null, 0, null, 62, 66, 62, 0, 160, 300, null, null, "널 좋아해 미우."],
[0, "아이카와 준", null, 0, null, 90, 88, 65, 0, 160, 300, null, null],
[0, "아이카와 린", null, 0, null, 74, 12, 85, 0, 160, 300, null, null],
[0, "타카이시 히야미", null, 0, null, 86, 75, 77, 0, 161, 300, "대의", "인덕", "이나라를 안정시키려는데 힘이 부족해…"],
[0, "타카이시 카린", null, 0, null, 41, 14, 79, 0, 160, 300, "재간", null, "우리딸이 행복해야 할텐데…."],
[0, "타카이시 에이린", null, 0, null, 75, 51, 92, 0, 160, 300, null, null],
[0, "정군호", null, 0, null, 94, 65, 88, 0, 160, 300, null, null, "우리 제국의 대장군으로써, 이나라를 수호한다!"],
[0, "슈리", null, 0, null, 81, 34, 100, 0, 160, 300, null, "신산", "하와와"],
[0, "미나미", null, 0, null, 85, 56, 98, 0, 160, 300, null, "귀모"],
[0, "타카이시 히야미", null, 7, "남해", 86, 75, 77, 12, 161, 300, "대의", "인덕", "이나라를 안정시키려는데 힘이 부족해…"],
[0, "타카이시 카린", null, 7, "남해", 41, 14, 79, 1, 160, 300, "재간", null, "우리딸이 행복해야 할텐데…."],
[0, "타카이시 에이린", null, 7, "교지", 75, 51, 92, 1, 160, 300, null, null],
[0, "정군호", null, 7, "남해", 94, 65, 88, 1, 160, 300, null, null, "우리 제국의 대장군으로써, 이나라를 수호한다!"],
[0, "슈리", null, 7, "교지", 81, 34, 100, 11, 160, 300, null, "신산", "하와와"],
[0, "히나리", null, 0, null, 85, 56, 98, 0, 160, 300, null, "귀모"],
[0, "린린", null, 0, null, 92, 99, 44, 0, 160, 300, null, "무쌍", "~거다"],
[0, "아이샤", null, 0, null, 96, 98, 71, 0, 160, 300, null, "위압"],
[0, "모토미야 미야코", null, 0, null, 71, 64, 77, 0, 160, 300, null, null],
[0, "모토미야 메이", null, 0, null, 81, 55, 80, 0, 160, 300, null, null],
[0, "모토미야 유지", null, 0, null, 86, 31, 88, 0, 160, 300, null, "상재", "허허…. 이나라가 어찌되련지…"],
[0, "오오시 리네", null, 0, null, 66, 72, 46, 0, 160, 300, null, null],
[0, "타카이시 나츠히코", null, 0, null, 51, 33, 67, 0, 160, 300, null, null],
[0, "유해", null, 0, null, 85, 87, 64, 0, 160, 300, null, null],
[0, "유채", null, 0, null, 64, 71, 23, 0, 160, 300, null, null],
@@ -294,14 +297,96 @@
[1, "니시나 묘토", null, 0, null, 63, 67, 44, 0, 160, 300, null, null, "에휴 유키코를 지키는데 이유는 없지만 말이지"],
[0, "오오시 마카코", null, 0, null, 55, 73, 55, 0, 160, 300, null, null, "젠장…! 유키코 놈들 절대로 가만두지 않을거다!"],
[0, "스즈이 이로키", null, 0, null, 63, 59, 37, 0, 160, 300, null, null, "우리는 고사모! 유키코와 동료들을 증오하는 클래스 메이트!"],
[0, "스즈키 이로이", null, 0, null, 59, 64, 44, 0, 160, 300, null, null, "유키는 증오의 철퇴를 마주보아라!"],
[0, "스즈키 이로이", null, 0, null, 59, 64, 44, 0, 160, 300, null, null, "유키는 증오의 철퇴를 마주보아라!"],
[0, "히라구시 토노", null, 0, null, 51, 58, 59, 0, 160, 300, null, null],
[0, "미타키 신고", null, 0, null, 68, 77, 64, 0, 160, 300, null, null],
[0, "섀도 게일", null, 0, null, 57, 69, 62, 0, 160, 300, null, null],
[0, "사야코", null, 0, null, 69, 75, 60, 0, 160, 300, null, null],
[0, "미요가타노 나코", null, 0, null, 77, 55, 79, 0, 160, 300, null, null, "fucking doll!"],
[0, "첼너 마우스", null, 0, null, 51, 85, 2, 0, 160, 300, null, null, "체르나는 그런거 싫단 말이야! 내꺼라고!"],
[0, "페치카", null, 0, null, 68, 8, 80, 0, 160, 300, null, null]
[0, "페치카", null, 0, null, 68, 8, 80, 0, 160, 300, null, null],
[0, "기타노 유리코", null, 0, null, 14, 9, 64, 0, 160, 300, null, null, "유키코는 참 의젓한 아이야."],
[0, "니얀다 카멘", null, 0, null, 86, 85, 41, 0, 160, 300, null, null, "살려달라고 외치면 그 누구든 구할거야, 설사 적이라 할지라도"],
[0, "니얀다 카렌", null, 0, null, 73, 88, 60, 0, 160, 300, null, null],
[0, "니얀다 아렌", null, 0, null, 73, 85, 58, 0, 160, 300, null, null],
[0, "니얀다 루나", null, 0, null, 84, 81, 75, 0, 160, 300, null, null],
[0, "니얀다 아코", null, 0, null, 67, 80, 55, 0, 160, 300, null, null],
[0, "니얀다 세인트", null, 0, null, 81, 83, 71, 0, 160, 300, null, null],
[0, "니얀다 레인", null, 0, null, 66, 82, 52, 0, 160, 300, null, null],
[0, "니얀다 마우스", null, 0, null, 69, 74, 39, 0, 160, 300, null, null],
[0, "마키무라 신타로", null, 0, null, 65, 62, 39, 0, 160, 300, null, null],
[0, "요시야마 에리", null, 0, null, 46, 12, 55, 0, 160, 300, null, null],
[0, "타케우치 리키", null, 0, null, 51, 33, 72, 0, 160, 300, null, null, "세상에는 승자와 패자가 있다, 허나 그것은 사실일까?"],
[0, "나카가와 노리코", null, 0, null, 19, 8, 68, 0, 160, 300, null, null, "알고있엇니? 수십년간 전쟁이 지속된 이 나라에도 이렇게 아름다운 봄이 온다는 것을, 돌아오지 않는 계절은 없어, 신기해"],
[0, "타마키 이로하", null, 0, null, 75, 69, 62, 0, 160, 300, null, null],
[0, "타마키 우이", null, 0, null, 87, 53, 74, 0, 160, 300, null, null, "마기우스의 날개의 쉼터에 온것을 환영해 언니"],
[0, "사토미 토우카", null, 0, null, 65, 47, 92, 0, 160, 300, null, null, "우린 우이가 너무 좋아~ 이로하 언니도"],
[0, "히이라기 네무", null, 0, null, 57, 48, 93, 0, 160, 300, null, null],
[0, "아노토카 모미카", null, 0, null, 69, 81, 74, 0, 160, 300, null, null, "친구들을 믿는 굳건한 마음 큐어 프리트"],
[0, "모노미야 세이나", null, 0, null, 77, 83, 41, 0, 160, 300, null, null, "어떤 유혹에도 빛을 잃지않는 깨끗한 마음 큐어 다이아!"],
[0, "모노야마 유이", null, 0, null, 69, 85, 60, 0, 160, 300, null, null, "사랑하는 사람을 지키기 위한 진실한 마음 큐어 실린!"],
[0, "루시에르", null, 0, null, 84, 72, 80, 0, 160, 300, null, null],
[0, "큐어 루프", null, 0, null, 63, 81, 40, 0, 160, 300, null, null],
[0, "가제크", null, 0, null, 55, 79, 51, 0, 160, 300, null, null],
[0, "큐어 가젯", null, 0, null, 67, 81, 55, 0, 160, 300, null, null],
[0, "큐어 루비", null, 0, null, 73, 79, 59, 0, 160, 300, null, null],
[0, "루미에르", null, 0, null, 80, 81, 64, 0, 160, 300, null, null],
[0, "토모야마 리에리", null, 0, null, 92, 55, 91, 0, 160, 300, null, null],
[0, "니카와라 리나", null, 0, null, 75, 67, 77, 0, 160, 300, null, null],
[0, "테네유치 이야노", null, 0, null, 66, 81, 55, 0, 160, 300, null, null],
[0, "니시유라 리코", null, 0, null, 64, 84, 75, 0, 160, 300, null, null],
[0, "소우다 마키", null, 0, null, 67, 81, 62, 0, 160, 300, null, null],
[0, "타니구치유이치로", null, 0, null, 79, 82, 66, 0, 160, 300, null, null],
[0, "마라바키 료", null, 0, null, 82, 81, 60, 0, 160, 300, null, null],
[0, "에트리카 에슈", null, 0, null, 84, 53, 82, 0, 160, 300, null, null, "모든것은, 나를 이렇게 만든 세상에 복수하기 위해!"],
[0, "유가을", null, 0, null, 87, 95, 60, 0, 160, 300, null, null],
[0, "츠바이 유시", null, 0, null, 43, 63, 77, 0, 160, 300, null, null],
[0, "크람베리", null, 0, null, 82, 93, 51, 0, 160, 300, null, null],
[0, "파브", null, 0, null, 41, 10, 78, 0, 160, 300, null, null],
[0, "파르", null, 0, null, 43, 10, 88, 0, 160, 300, null, null],
[0, "타이요 아카리", null, 0, null, 81, 92, 77, 0, 160, 300, null, null, "나 잊지 않을테니까, 후유나에 대해 절대로 잊지않을 테니까"],
[0, "신자키 후유나", null, 0, null, 74, 79, 55, 0, 160, 300, null, null, "안녕 아카리, 아카리와 만나 행복했어"],
[0, "크랑테일", null, 0, null, 77, 81, 55, 0, 160, 300, null, null],
[0, "타카이시 히모리", null, 0, null, 69, 37, 89, 0, 160, 300, null, null],
[0, "사카나기 아야나", null, 0, null, 73, 89, 53, 0, 160, 300, null, null],
[0, "사카나기 이즈카", null, 0, null, 77, 82, 60, 0, 160, 300, null, null],
[0, "릿프", null, 0, null, 51, 9, 61, 0, 160, 300, null, null],
[0, "다크니스 드림", null, 0, null, 64, 93, 66, 0, 160, 300, null, null],
[0, "큐어 멜로디", null, 0, null, 74, 88, 46, 0, 160, 300, null, null],
[0, "큐어 하모니", null, 0, null, 81, 88, 55, 0, 160, 300, null, null],
[0, "큐어 블루펄", null, 0, null, 87, 92, 80, 0, 160, 300, null, null],
[0, "큐어 위시", null, 0, null, 83, 77, 42, 0, 160, 300, null, null],
[0, "큐어 비트", null, 0, null, 69, 88, 68, 0, 160, 300, null, null],
[0, "큐어 리히트", null, 0, null, 73, 79, 70, 0, 160, 300, null, null],
[0, "바라엘", null, 0, null, 87, 88, 64, 0, 160, 300, null, null],
[0, "다크 드림", null, 0, null, 77, 89, 69, 0, 160, 300, null, null],
[0, "하드고어 앨리스", null, 0, null, 81, 53, 79, 0, 160, 300, null, null],
[0, "푸크푹", null, 0, null, 66, 27, 79, 0, 160, 300, null, null],
[0, "카나", null, 0, null, 77, 55, 89, 0, 160, 300, null, null],
[0, "아리엘", null, 0, null, 86, 60, 93, 0, 160, 300, null, null],
[0, "리오네타", null, 0, null, 70, 17, 81, 0, 160, 300, null, null],
[0, "키도 미노루", null, 0, null, 84, 67, 85, 0, 160, 300, null, null],
[0, "리 슈촌", null, 0, null, 56, 69, 40, 0, 160, 300, null, null],
[0, "아마노 네네", null, 0, null, 82, 77, 90, 0, 160, 300, null, null],
[0, "쿠도 타이키", null, 0, null, 80, 80, 77, 0, 160, 300, null, null],
[0, "히노모토 아카리", null, 0, null, 89, 100, 42, 0, 160, 300, null, null],
[0, "아오누마 키리하", null, 0, null, 63, 55, 89, 0, 160, 300, null, null],
[0, "츠루기 젠지로", null, 0, null, 58, 77, 39, 0, 160, 300, null, null],
[0, "향상성", null, 0, null, 64, 71, 27, 0, 160, 300, null, null, "전, 디지털 월드의 평화를 바라는 자입니다."],
[0, "이그드라실", null, 0, null, 68, 89, 66, 0, 160, 300, null, null],
[0, "렌", null, 0, null, 80, 104, 70, 0, 160, 300, null, "무쌍"],
[0, "네네네", null, 0, null, 73, 82, 55, 0, 160, 300, null, null],
[0, "이소긴&야도간", null, 0, null, 90, 96, 76, 0, 160, 300, null, null],
[0, "바스도라", null, 0, null, 83, 85, 72, 0, 160, 300, null, null],
[0, "포이즈니", null, 0, null, 80, 83, 70, 0, 160, 300, null, null],
[0, "긴토레스키", null, 0, null, 70, 90, 90, 0, 160, 300, null, "무쌍"],
[0, "키리야", null, 0, null, 82, 85, 52, 0, 160, 300, null, null],
[0, "큐어 옐", null, 0, null, 85, 83, 73, 0, 160, 300, null, null],
[0, "큐어 앙주", null, 0, null, 89, 93, 74, 0, 160, 300, null, null],
[0, "큐어 에투알", null, 0, null, 77, 94, 76, 0, 160, 300, null, null],
[0, "닥터 크라이시스", null, 0, null, 86, 83, 77, 0, 160, 300, null, null],
[0, "큐어 프렌디", null, 0, null, 87, 82, 80, 0, 160, 300, null, null],
[0, "큐어 릴리안", null, 0, null, 87, 82, 80, 0, 160, 300, null, null]
],
"general_ex":[
+543
View File
@@ -0,0 +1,543 @@
{
"title": "【가상모드28-b】 강서유서 소설 월드(비세력)",
"startYear": 180,
"history": [
"<C>●</>180년 1월:<L><b>【가상모드28】</b>강서유서 소설 월드</>",
"<C>●</>180년 1월:<L><b>【이벤트】</b></>강서유서의 소설 캐릭터들이 날뛰는곳"
],
"stat": {
"total": 210,
"min": 40,
"max": 90
},
"iconPath": "강서유서월드",
"fiction": 1,
"nation":[
],
"diplomacy":[],
"general":[
[1, "키타노 유키코", null, 0, null, 95, 31, 95, 0, 160, 300, "대의", "저격", "모든것은 우리들의 꿈을 이루기 위해…"],
[1, "키타노 시오리", null, 0, null, 88, 96, 89, 0, 160, 300, "대의", "무쌍", "언니를 지켜보일거야"],
[1, "이치가와 아이리", null, 0, null, 87, 73, 94, 0, 160, 300, "대의", null, "유키코를 지킬거야. 내 속죄를 위해"],
[1, "이즈카에 에리카", null, 0, null, 77, 93, 72, 0, 160, 300, "의협", "저격"],
[1, "타에구치 유카리", null, 0, null, 71, 66, 80, 0, 160, 300, "할거", null, "아버지와 어머니를 지키기 위해 미래에서 왓어 난"],
[1, "오모타 아미유", null, 0, null, 64, 51, 44, 0, 160, 300, "대의", null],
[1, "소카이 요시나", null, 0, null, 79, 62, 80, 0, 160, 300, "의협", null],
[1, "소미타키 코토키", null, 0, null, 86, 79, 55, 0, 160, 300, "재간", null],
[1, "타카이시 유키", null, 0, null, 83, 64, 72, 0, 160, 300, "재간", null],
[1, "스즈카 아야로", null, 0, null, 62, 88, 47, 0, 160, 300, "의협", null],
[1, "요리시마 사치코", null, 0, null, 51, 81, 70, 0, 160, 300, null, "저격"],
[0, "큐어 스플릿", null, 0, null, 80, 90, 56, 0, 160, 300, null, "무쌍"],
[0, "큐어 솔크", null, 0, null, 93, 97, 67, 0, 160, 300, null, null, "아버지를 이겨보일거야."],
[0, "큐어 샤인", null, 0, null, 89, 75, 99, 0, 160, 300, "패권", "신산", "디지털 월드와 인간세계 모두를 위해"],
[0, "큐어 러브", null, 0, null, 77, 86, 54, 0, 160, 300, null, null, "사랑을 추구하는 전사 큐어 러브"],
[0, "큐어 프로즌", null, 0, null, 64, 88, 72, 0, 160, 300, null, null],
[0, "큐어 바이올렛", null, 0, null, 49, 89, 77, 0, 160, 300, null, "상재"],
[0, "큐어 드림", null, 0, null, 97, 99, 71, 0, 160, 300, null, "무쌍"],
[0, "큐어 뮤즈", null, 0, null, 71, 95, 64, 0, 160, 300, null, null],
[0, "큐어 플리오네", null, 0, null, 89, 102, 86, 0, 148, 300, null, null],
[0, "큐어 리큐브", null, 0, null, 67, 88, 82, 0, 152, 300, null, null],
[0, "큐어 퓨리", null, 0, null, 83, 84, 42, 0, 160, 300, null, null],
[0, "큐어 뮤직", null, 0, null, 79, 84, 60, 0, 160, 300, null, null],
[0, "큐어 포르테", null, 0, null, 72, 77, 55, 0, 160, 300, null, null],
[0, "큐어 리스", null, 0, null, 89, 80, 67, 0, 160, 300, null, null],
[0, "분비", null, 0, null, 85, 94, 90, 0, 148, 300, null, null],
[0, "시비렛타", null, 0, null, 82, 73, 90, 0, 127, 300, null, null],
[0, "히토", null, 0, null, 64, 88, 80, 0, 115, 300, null, null],
[2, "모요코모 미에카", null, 0, null, 91, 60, 97, 0, 141, 300, "할거", null, "모든것은 분비님이 부활시키려는 그자를 막기 위해서야! 그자는 우리가 죽을뻔한 선택받은 아이들의 적이니까!"],
[2, "노자미 미노코", null, 0, null, 80, 77, 80, 0, 143, 300, null, null, "도체 요시미츠님(분비님)은 뭔 생각이신거야…"],
[2, "노자미 미에키", null, 0, null, 73, 70, 55, 0, 160, 300, null, null],
[999, "리아", null, 0, null, 99, 34, 100, 0, 132, 300, null, "집중", "이 세계를 부디 안정시켜줄 사람이 필요해…."],
[0, "코구라 아치모토", null, 0, null, 51, 44, 114, 0, 160, 300, null, "발명", "크흐흐…다크 프리큐어여 모습을 드러내라…!"],
[0, "다크 프리큐어즈", null, 0, null, 84, 97, 92, 0, 160, 300, null, null, "모든건… 그분의 부활을 위해."],
[0, "레톨프", null, 0, null, 87, 88, 64, 0, 160, 300, null, null],
[2, "사사토케 라이라", null, 0, null, 71, 80, 74, 0, 151, 300, null, null, "다시한번 주어진 기회. 이번엔 그녀를 지킬거야."],
[2, "하루사키 츠보미", null, 0, null, 88, 51, 97, 0, 153, 300, "할거", null, "똑같은 악당짓을 다시는 하지않게, 나자신을 바꿀거야, 사랑하는 라이라 오빠와 함께."],
[2, "아야토케 나이미", null, 0, null, 76, 44, 88, 0, 151, 300, null, null],
[2, "히마즈라 유게키", null, 0, null, 54, 80, 12, 0, 149, 300, null, null],
[2, "하루사키 유나", null, 0, null, 77, 44, 91, 0, 150, 300, null, null],
[0, "야가미 타이치", null, 0, null, 89, 88, 67, 0, 153, 300, null, null],
[0, "야가미 소라", null, 0, null, 62, 37, 75, 0, 153, 300, null, null],
[0, "야가미 유메", null, 0, null, 80, 55, 78, 0, 160, 300, null, null],
[0, "이시다 야마토", null, 0, null, 72, 77, 60, 0, 153, 300, null, null],
[0, "이시다 나데히코", null, 0, null, 80, 50, 79, 0, 160, 300, null, null],
[0, "이즈미 코시로", null, 0, null, 34, 17, 99, 0, 154, 300, null, "발명"],
[0, "이즈미 미미", null, 0, null, 51, 23, 66, 0, 154, 300, null, null],
[0, "이즈미 토모", null, 0, null, 37, 30, 89, 0, 160, 300, null, null],
[0, "이즈미 쥰", null, 0, null, 77, 77, 31, 0, 160, 300, null, null],
[0, "아마노 유우", null, 0, null, 77, 70, 85, 0, 160, 300, null, null, "모든건 그분을 위하여"],
[2, "사사토케 키아라", null, 0, null, 85, 83, 60, 0, 160, 300, null, null, "감히 엄마를 그렇게 만들었겟다… 그 디지몬 절로 용서하지 않을거야!"],
[2, "야카기 츠에루", null, 0, null, 83, 80, 51, 0, 160, 300, null, null, "할머니의 업보… 제가 신 갚아나갈 거에요"],
[0, "사이온지 카나타", null, 0, null, 81, 79, 85, 0, 160, 300, null, null, "내가 먼 말할게 좋아해 미유,"],
[0, "사이온지 미유", null, 0, null, 78, 64, 82, 0, 160, 300, null, null, "미우… 방금 뭐라고?.....루? 루란 말이야?"],
[0, "사이온지 미우", null, 0, null, 85, 91, 33, 0, 160, 300, null, "견고", "크하하… 모두 박살나 버려라, 이딴 세상!"],
[0, "오카자키 나기사", null, 0, null, 77, 17, 91, 0, 160, 300, null, null, "경단~ 경단~ 경단~경단 경단 가족~"],
[0, "오카자키 토모야", null, 0, null, 79, 82, 51, 0, 160, 300, null, null],
[0, "오카자키 우시오", null, 0, null, 67, 77, 68, 0, 160, 300, null, null, "미우를 구하기 위해..! 난 싸울거야 친구니까!"],
[0, "최산해", null, 0, null, 82, 88, 33, 0, 160, 300, null, null],
[0, "모토미야 유지", null, 0, null, 86, 31, 88, 0, 160, 300, null, "상재", "허허…. 이나라가 어찌되련지…"],
[0, "유에", null, 0, null, 56, 14, 80, 0, 160, 300, null, null, "백성을 우선시하는게 통치의 근본."],
[0, "에이", null, 0, null, 64, 33, 97, 0, 160, 300, null, null, "유에는 소중한 친구이자 주군,"],
[0, "고현", null, 0, null, 52, 37, 81, 0, 160, 300, null, null],
[5, "고순", null, 0, null, 88, 86, 66, 0, 160, 300, null, "기병"],
[5, "장료", null, 0, null, 85, 92, 78, 0, 160, 300, null, "무쌍"],
[5, "가후", null, 0, null, 80, 46, 98, 0, 160, 300, null, null],
[5, "견린", null, 0, null, 70, 42, 88, 0, 160, 300, null, null],
[5, "견정", null, 0, null, 66, 40, 55, 0, 160, 300, null, null],
[5, "헌제", null, 0, null, 47, 44, 83, 0, 160, 300, null, null],
[5, "곽가", null, 0, null, 61, 33, 91, 0, 160, 300, null, "귀모"],
[5, "강인", null, 0, null, 90, 53, 91, 0, 160, 300, null, null],
[5, "사마예은", null, 0, null, 53, 37, 82, 0, 160, 300, null, null],
[3, "유혜은", null, 0, null, 69, 57, 72, 0, 160, 300, null, null],
[3, "유현아", null, 0, null, 65, 68, 51, 0, 160, 300, null, null],
[3, "장연지", null, 0, null, 31, 15, 66, 0, 160, 300, null, null],
[3, "장서연", null, 0, null, 74, 73, 44, 0, 160, 300, null, null],
[3, "유하연", null, 0, null, 68, 61, 65, 0, 160, 300, null, null],
[3, "유희", null, 0, null, 64, 75, 62, 0, 160, 300, null, null],
[3, "나지현", null, 0, null, 64, 33, 71, 0, 160, 300, null, null],
[3, "아사쿠라 나오", null, 0, null, 81, 63, 83, 0, 160, 300, null, "저격", "모든건 우리를 싸우게 만들고 서로 죽이게 한 어른들에 한 복수,"],
[3, "아오이 타쿠마", null, 0, null, 77, 89, 55, 0, 160, 300, null, null],
[0, "우라베 슈고", null, 0, null, 53, 68, 61, 0, 160, 300, null, null],
[0, "카사이 오사무", null, 0, null, 66, 54, 39, 0, 160, 300, null, null],
[0, "카케이 쿄코", null, 0, null, 77, 55, 81, 0, 160, 300, null, null],
[0, "사쿠라이 하루야", null, 0, null, 63, 79, 51, 0, 160, 300, null, null],
[0, "히카사 쇼타", null, 0, null, 55, 31, 44, 0, 160, 300, null, null],
[0, "토츠카 호나미", null, 0, null, 81, 77, 53, 0, 160, 300, null, null],
[0, "니이미 레나", null, 0, null, 66, 78, 55, 0, 160, 300, null, null],
[0, "큐어 트윙클", null, 0, null, 81, 88, 55, 0, 160, 300, null, null],
[0, "모토무라 아스카", null, 0, null, 64, 77, 81, 0, 160, 300, null, null],
[0, "야기 아야네", null, 0, null, 78, 83, 55, 0, 160, 300, null, "저격"],
[0, "야자와 아이", null, 0, null, 67, 89, 57, 0, 160, 300, null, "무쌍"],
[0, "유키 카나", null, 0, null, 79, 24, 88, 0, 160, 300, null, "통찰"],
[0, "노다 샤토미", null, 0, null, 61, 55, 69, 0, 160, 300, null, null],
[0, "사사가와 류헤이", null, 0, null, 66, 58, 66, 0, 160, 300, null, null],
[0, "키리야마 카즈오", null, 0, null, 91, 92, 99, 0, 160, 300, "패권", "위압", "뒷면이 나오면…이 게임을 받아들이기로…!"],
[0, "이치가와 쥬리", null, 0, null, 34, 32, 91, 0, 160, 300, null, "발명"],
[0, "모토무라 아야네", null, 0, null, 77, 67, 55, 0, 163, 300, null, null],
[0, "코토히키 카요코", null, 0, null, 78, 33, 78, 0, 160, 300, null, null],
[0, "스기무라 히로키", null, 0, null, 67, 90, 45, 0, 160, 300, "유지", null],
[0, "민유희", null, 0, null, 89, 55, 81, 0, 163, 300, null, null],
[0, "사카키 유코", null, 0, null, 45, 34, 60, 0, 160, 300, null, null],
[0, "사쿠라이 사키", null, 0, null, 78, 77, 66, 0, 160, 300, null, "저격"],
[0, "마키", null, 0, null, 72, 74, 56, 0, 160, 300, null, null],
[0, "마이", null, 0, null, 70, 70, 60, 0, 160, 300, null, null],
[0, "소마 미츠코", null, 0, null, 93, 66, 90, 0, 160, 300, null, null, "나는 뺏는쪽에 서서 살아가는 거잖아…?"],
[0, "타카구치유이치로", null, 0, null, 77, 54, 79, 0, 160, 300, null, null],
[0, "스즈키 아야로", null, 0, null, 55, 44, 77, 0, 160, 300, null, null],
[0, "아사기 유미", null, 0, null, 84, 56, 66, 0, 160, 300, null, null],
[1, "아오조야 하나코", null, 0, null, 89, 66, 94, 0, 160, 300, null, null],
[1, "아유카 시로미", null, 0, null, 3, 15, 64, 0, 160, 300, null, null],
[0, "아유카 시코", null, 0, null, 7, 9, 66, 0, 160, 300, null, null],
[0, "아카타 마야코", null, 0, null, 35, 40, 55, 0, 160, 300, null, null],
[0, "아타키 류야", null, 0, null, 64, 12, 80, 0, 160, 300, null, null],
[0, "우츠미 유키에", null, 0, null, 71, 44, 82, 0, 160, 300, null, null, "바보야…모두 바보야! 모두 살아돌아갈수도 있엇는데…."],
[0, "아제라크", null, 0, null, 81, 89, 68, 0, 160, 300, null, null, "프리큐어…! 모조리 거미밥으로 만들어주마!"],
[0, "악튜러스 멩스크", null, 0, null, 95, 71, 99, 0, 151, 300, "패권", "집중", "누구도 날 막을 수 없어. 네놈이건, 연합이건, 프로토스건, 그 누구도! 코프룰루를 가질 수 없다면 차라리 잿더미로 만들어 버릴테다!"],
[0, "발레리안 멩스크", null, 0, null, 85, 63, 88, 0, 160, 300, null, null, "난 국민의 편이오. 아버지의 죄는 용서받을 수 없다는 걸 알고 있소. 권좌에서… 내려오셔야 한다는 것도."],
[10, "호러스 워필드", null, 0, null, 95, 83, 82, 0, 160, 300, "대의", "인덕", "캐리건... 잘 들어라. 지금 왕복선 3엔 부상병들만 타고 있다. 다들 누군가의... 남편이자, 아버지야. 들은 그냥 보내다오. 알겠나? 독한 것. 넌 인간도 아니야. 넌 우릴 배신했어. 뭣 때문에? 그깟 복수 때문에?\n무고한 사람들을 얼마나 죽인 거야? 또 얼마나 더 죽일 셈이야?\n레이너가 널 보면 뭐라고 할까?"],
[10, "캐롤라이나", null, 0, null, 80, 51, 75, 0, 160, 300, null, null],
[10, "노바 테라", null, 0, null, 71, 92, 55, 0, 160, 300, null, "저격", "노바, 작전준비"],
[10, "헥터 산티아고", null, 0, null, 85, 55, 84, 0, 160, 300, null, null],
[10, "클레리아 듀크", null, 0, null, 89, 64, 88, 0, 146, 300, null, null, "가족들과 같이 마지막 까지 살아남아 돌아가겟어."],
[10, "에밀리아 듀크", null, 0, null, 82, 84, 66, 0, 160, 300, null, "저격", "어머니랑 다시 만나서 기뻐"],
[0, "에르지나 듀크", null, 0, null, 75, 87, 62, 0, 160, 300, null, "저격"],
[0, "헤일리 듀크", null, 0, null, 70, 64, 84, 0, 160, 300, null, null],
[0, "존 레이너", null, 0, null, 77, 89, 62, 0, 160, 300, null, "돌격"],
[0, "베르카 나바렌", null, 0, null, 81, 51, 93, 0, 160, 300, null, null],
[0, "마리에 베넷", null, 0, null, 66, 33, 66, 0, 160, 300, null, null],
[0, "유리아 베넷", null, 0, null, 76, 41, 55, 0, 160, 300, null, null],
[0, "루미 베레스", null, 0, null, 77, 33, 89, 0, 160, 300, null, null],
[0, "타이커스", null, 0, null, 61, 85, 40, 0, 160, 300, null, null],
[0, "제임스 레이너", null, 0, null, 99, 88, 72, 0, 160, 300, "대의", "돌격", "피닉스! 안돼!!"],
[0, "맷 호너", null, 0, null, 87, 64, 95, 0, 160, 300, null, null],
[0, "로리 스완", null, 0, null, 32, 55, 93, 0, 160, 300, null, "발명"],
[0, "이곤 스텟먼", null, 0, null, 11, 7, 91, 0, 160, 300, null, "발명"],
[0, "가브리엘 토시", null, 0, null, 85, 96, 55, 0, 160, 300, null, null],
[0, "로사 모랄레스", null, 0, null, 51, 44, 67, 0, 160, 300, null, null],
[0, "레베카 레이너", null, 0, null, 81, 93, 44, 0, 160, 300, null, null],
[0, "케이트 록웰", null, 0, null, 43, 10, 78, 0, 160, 300, null, null],
[0, "아리엘 헨슨", null, 0, null, 17, 1, 89, 0, 160, 300, null, "발명"],
[0, "미라 호너", null, 0, null, 89, 66, 94, 0, 160, 300, null, null],
[0, "알렌 세자르", null, 0, null, 85, 61, 82, 0, 160, 300, null, null],
[0, "마이클 리버티", null, 0, null, 64, 33, 71, 0, 160, 300, null, null],
[0, "시온 크루스", null, 0, null, 51, 14, 85, 0, 160, 300, null, null],
[0, "사라 케리건", null, 0, null, 95, 95, 81, 0, 160, 300, null, "무쌍"],
[10, "드랄리스카", null, 0, null, 82, 93, 78, 0, 160, 300, null, null, "케리건님이 죽다니…근데 왜 내가 그 중임을 이어받아야 하는거야?"],
[0, "에레니카", null, 0, null, 78, 38, 91, 0, 160, 300, null, null, "곧있으면 위하신 아몬님이 완전히 부활할거야 드랄리스카 언니 후후후…."],
[0, "세페니아", null, 0, null, 75, 81, 51, 0, 160, 300, null, null, "에레니카 언니 뭔가 이상해"],
[0, "이즈샤", null, 0, null, 31, 55, 81, 0, 160, 300, null, null, "여왕님의 명을 받듭니다"],
[0, "자가라", null, 0, null, 87, 91, 46, 0, 160, 300, null, null],
[0, "데히카", null, 0, null, 75, 91, 55, 0, 160, 300, null, null],
[0, "스투코프 부제독", null, 0, null, 87, 71, 93, 0, 160, 300, null, null],
[0, "니아드라", null, 0, null, 80, 83, 52, 0, 160, 300, null, null],
[0, "아바투르", null, 0, null, 43, 33, 81, 0, 160, 300, null, "발명"],
[0, "다고쓰", null, 0, null, 81, 85, 80, 0, 160, 300, null, null, "휴우… 드랄리스카도 환생자라 다행이야, 죽을일은 없겠네… 근데 케리건이 죽을줄이야…"],
[0, "초월체", null, 0, null, 95, 55, 99, 0, 160, 300, null, null],
[0, "자츠", null, 0, null, 82, 55, 71, 0, 160, 300, null, null],
[0, "곤", null, 0, null, 79, 56, 77, 0, 160, 300, null, null],
[0, "카그", null, 0, null, 80, 55, 69, 0, 160, 300, null, null],
[0, "아우자", null, 0, null, 64, 71, 86, 0, 160, 300, null, null],
[0, "제라드 듀갈", null, 0, null, 87, 51, 80, 0, 160, 300, null, null],
[0, "맘스틴 령", null, 0, null, 80, 51, 66, 0, 160, 300, null, null],
[0, "스투코프 주니어", null, 0, null, 81, 56, 72, 0, 160, 300, null, null, "ued 2차원정로 우린 아몬과의 결전에 참가할거야."],
[0, "레비나 스투코프", null, 0, null, 66, 31, 90, 0, 160, 300, null, null, "근데 우리 병사로 괜찮을까 오빠"],
[0, "제라툴", null, 0, null, 85, 90, 82, 0, 160, 300, null, null, "젤나가 맙소사! 누가 이런 끔찍한 혼종을 만들었단 말인가"],
[0, "테사다르", "`", 0, null, 82, 77, 86, 0, 160, 300, null, null, "난 죽음을 경험한 적이 없네"],
[0, "피닉스", null, 0, null, 79, 80, 65, 0, 160, 300, null, null],
[0, "알다리스", null, 0, null, 80, 51, 77, 0, 160, 300, null, null],
[0, "탈란다르", null, 0, null, 84, 66, 80, 0, 160, 300, null, null],
[0, "아르타니스", null, 0, null, 80, 71, 84, 0, 160, 300, null, null, "모조리 용기병으로 만들어주마!"],
[0, "라자갈", null, 0, null, 90, 75, 89, 0, 160, 300, null, null],
[0, "우룬 제독", null, 0, null, 84, 80, 55, 0, 160, 300, null, null],
[0, "셀렌디스", null, 0, null, 80, 80, 67, 0, 160, 300, null, null],
[0, "보라준", null, 0, null, 87, 51, 91, 0, 160, 300, null, null],
[0, "알라리크", null, 0, null, 89, 92, 87, 0, 160, 300, null, null],
[0, "말라쉬", null, 0, null, 80, 96, 65, 0, 160, 300, null, null],
[0, "니온", null, 0, null, 62, 73, 43, 0, 160, 300, null, null],
[0, "지나라", null, 0, null, 75, 90, 55, 0, 160, 300, null, null],
[0, "아리샤", null, 0, null, 51, 81, 50, 0, 160, 300, null, null, "난 XX부르드의 울트라 표 아리샤다!"],
[0, "아몬", null, 0, null, 97, 107, 85, 0, 160, 300, null, null, "나는 너희들의 시작이었으니 또한 끝이리라….!"],
[0, "에밀 나루드", null, 0, null, 85, 92, 96, 0, 160, 300, null, null, "아몬께서 별빛으로 속삭이셨다. 그분은 돌아오신다고 하셨다. 그분은 파괴한다고 하셨다. 멸종. 모든 것이 종말을 맞이할 것이라고"],
[0, "오로스", null, 0, null, 80, 79, 55, 0, 160, 300, null, null],
[0, "도로시 멩스크", null, 0, null, 52, 74, 81, 0, 160, 300, null, null],
[0, "유다미", null, 0, null, 40, 78, 3, 0, 160, 300, null, null],
[0, "유지혜", null, 0, null, 77, 64, 80, 0, 160, 300, null, null, "언니를 이번에야 말로 지킬거야… 그럴려고 마법소녀가 된걸!"],
[0, "유하준", null, 0, null, 78, 70, 70, 0, 160, 300, null, null],
[0, "유당찬", null, 0, null, 83, 69, 55, 0, 160, 300, null, null],
[0, "유시하", "`", 0, null, 67, 55, 81, 0, 160, 300, null, null],
[0, "유미하", null, 0, null, 41, 34, 48, 0, 160, 300, null, null],
[0, "유지은", null, 0, null, 55, 78, 64, 0, 160, 300, null, null, "나는 레플리카"],
[0, "유혜선", null, 0, null, 78, 89, 55, 0, 160, 300, null, null, "나는"],
[0, "최정윤", null, 0, null, 85, 71, 66, 0, 160, 300, null, null, "우리는 다미키즈, 다미의 친구들이자 다미에 의해 도움을 받은 아이들 거기서도 나는 캔디팝이야"],
[0, "이선아", null, 0, null, 83, 88, 56, 0, 160, 300, null, null, "나는 마콧치, 마법나라 감사부문의 부부장이야."],
[0, "나서희", null, 0, null, 81, 77, 44, 0, 160, 300, null, null, "다미를 지킬거야"],
[0, "스노우 화이트", null, 0, null, 71, 80, 66, 0, 160, 300, null, null, "이번에야 말로 친구들을 지켜 보이겠어. 소타도, 아카리도"],
[0, "워터 스플렛", null, 0, null, 65, 80, 52, 0, 160, 300, null, null, "이번생에는 그런 셔플린 따위에게 지지 않을거야,"],
[0, "스노우 슬러스", null, 0, null, 69, 75, 53, 0, 160, 300, null, null, "번생이랑 달라! 나도 강해졋다고!"],
[0, "리하나", null, 0, null, 79, 70, 65, 0, 160, 300, null, null, "프흐레 언니…"],
[0, "블루베리", null, 0, null, 81, 88, 73, 0, 160, 300, null, null],
[0, "스윔스윔", null, 0, null, 54, 90, 71, 0, 163, 300, null, null, "룰러가 그랫어 마법소녀는 본모습을 남에게 보여주면 안된다고"],
[0, "이선화", null, 0, null, 66, 55, 79, 0, 160, 300, null, null, "다미는 우리의 소중한 친구"],
[0, "정혜림", null, 0, null, 91, 88, 80, 0, 160, 300, null, null, "우리 다미키즈는 다미언니에 의해 많은걸 받은 아이들이야,"],
[0, "하나조노 아무", null, 0, null, 67, 53, 81, 0, 160, 300, null, null, "캐릭터 변신! 애뮬릿 다이아!"],
[0, "하나조노 카렌", null, 0, null, 66, 51, 80, 0, 160, 300, null, null, "나는 하나조노 카렌, 전 이름은 하나무라 카렌이야."],
[0, "하나조노 아리스", null, 0, null, 53, 14, 61, 0, 160, 300, null, null],
[0, "린", null, 0, null, 38, 32, 69, 0, 160, 300, null, null, "난 용담꽃의 페어리루 린이야~"],
[0, "하나조노 마츠아", null, 0, null, 44, 40, 55, 0, 160, 300, null, null],
[0, "롭프", null, 0, null, 55, 47, 50, 0, 160, 300, null, null],
[0, "이정선 황제", null, 0, null, 74, 44, 85, 0, 160, 300, null, null, "감히 우리 제국에 반기를 든자들! 용서하지 않는다! !"],
[0, "이양선 공", null, 0, null, 77, 42, 79, 0, 160, 300, null, null, "형님이 리 화를 내시다니 내심 단하구나 그들은"],
[0, "이을용 황태자", null, 0, null, 51, 33, 69, 0, 160, 300, null, null],
[0, "카라시프 장군", null, 0, null, 75, 69, 71, 0, 160, 300, null, null],
[0, "카몬 요네미", null, 0, null, 40, 8, 66, 0, 160, 300, null, null],
[0, "키타노 타케시", null, 0, null, 43, 14, 75, 0, 160, 300, null, null, "우리가족의 행복과 안전을 우선시해야지"],
[0, "키타노 유리아", null, 0, null, 32, 8, 69, 0, 160, 300, null, null],
[0, "후타바 안즈", null, 0, null, 67, 44, 90, 0, 160, 300, null, null, "나도 하메르도 행복하길"],
[0, "히나노", null, 0, null, 66, 32, 73, 0, 160, 300, null, null, "이번생에는 행복하고 싶어"],
[0, "나츠세 유우", null, 0, null, 66, 30, 70, 0, 160, 300, null, null],
[0, "크로노스 신", null, 0, null, 50, 15, 90, 0, 160, 300, null, null],
[0, "프흐레", null, 0, null, 69, 24, 100, 0, 160, 300, null, null, "마법나라가 바라는 마법소녀란 말이지…"],
[0, "나나하라 슈야", null, 0, null, 73, 72, 62, 0, 160, 300, null, null, "전세계의 어른들에게 선전포고 한다!"],
[0, "타에구치유이치로", null, 0, null, 51, 63, 44, 0, 160, 300, null, null],
[0, "카와다 소교", null, 0, null, 49, 70, 85, 0, 160, 300, null, null],
[0, "카에리 유카리", null, 0, null, 41, 31, 53, 0, 160, 300, null, null],
[0, "사에구치 미나", null, 0, null, 44, 55, 36, 0, 160, 300, null, null],
[0, "큐어 카루티", null, 0, null, 62, 81, 55, 0, 160, 300, null, null],
[0, "큐어 리프렛", null, 0, null, 71, 89, 72, 0, 160, 300, null, null],
[0, "큐어 실프", null, 0, null, 83, 92, 88, 0, 160, 300, null, null],
[0, "큐어 아네모스", null, 0, null, 69, 80, 55, 0, 160, 300, null, null],
[0, "카마디야", null, 0, null, 85, 93, 55, 0, 160, 300, null, null, "크흐흐… 감히 인간 따위가!! 나에게 덤비다니 용서못한다!!"],
[0, "토토리몬", null, 0, null, 69, 88, 44, 0, 160, 300, null, null, "모든것은 카마디야님의 부활을 위해서…."],
[0, "카와리노", null, 0, null, 73, 91, 80, 0, 160, 300, null, null, "나를 그곳에 꺼내주신 카마디야 님을 위해 난 일한다!"],
[0, "가마오", null, 0, null, 41, 65, 13, 0, 160, 300, null, null, "이씨 너무 배고파…"],
[0, "밀키 로즈", null, 0, null, 64, 82, 52, 0, 160, 300, null, null],
[0, "옐로우 미치", null, 0, null, 61, 80, 80, 0, 160, 300, null, null, "난 마법나라 외교부문의 부문장 옐로우 미치야"],
[0, "마왕팜", null, 0, null, 50, 90, 70, 0, 160, 300, null, null, "무지개? 어째서…!"],
[0, "그림하트", null, 0, null, 74, 63, 41, 0, 160, 300, null, null, "목을 쳐라!!"],
[0, "루다", null, 0, null, 62, 66, 62, 0, 160, 300, null, null, "널 좋아해 미우."],
[0, "아이카와 준", null, 0, null, 90, 88, 65, 0, 160, 300, null, null],
[0, "아이카와 린", null, 0, null, 74, 12, 85, 0, 160, 300, null, null],
[0, "타카이시 히야미", null, 0, null, 86, 75, 77, 0, 161, 300, "대의", "인덕", "이나라를 안정시키려는데 힘이 부족해…"],
[0, "타카이시 카린", null, 0, null, 41, 14, 79, 0, 160, 300, "재간", null, "우리딸이 행복해야 할텐데…."],
[0, "타카이시 에이린", null, 0, null, 75, 51, 92, 0, 160, 300, null, null],
[0, "정군호", null, 0, null, 94, 65, 88, 0, 160, 300, null, null, "우리 제국의 장군으로써, 이나라를 수호한다!"],
[0, "슈리", null, 0, null, 81, 34, 100, 0, 160, 300, null, "신산", "하와와"],
[0, "미나미", null, 0, null, 85, 56, 98, 0, 160, 300, null, "귀모"],
[0, "린린", null, 0, null, 92, 99, 44, 0, 160, 300, null, "무쌍", "~거다"],
[0, "아이샤", null, 0, null, 96, 98, 71, 0, 160, 300, null, "위압"],
[0, "모토미야 미야코", null, 0, null, 71, 64, 77, 0, 160, 300, null, null],
[0, "모토미야 메이", null, 0, null, 81, 55, 80, 0, 160, 300, null, null],
[0, "오오시 리네", null, 0, null, 66, 72, 46, 0, 160, 300, null, null],
[0, "타카이시 나츠히코", null, 0, null, 51, 33, 67, 0, 160, 300, null, null],
[0, "유해", null, 0, null, 85, 87, 64, 0, 160, 300, null, null],
[0, "유채", null, 0, null, 64, 71, 23, 0, 160, 300, null, null],
[0, "유창", null, 0, null, 59, 68, 33, 0, 160, 300, null, null],
[0, "타카이시 타케루", null, 0, null, 80, 92, 65, 0, 160, 300, null, "무쌍"],
[0, "타카이시 히카리", null, 0, null, 31, 11, 90, 0, 160, 300, null, "인덕"],
[0, "타카이시 노조미", null, 0, null, 82, 66, 81, 0, 160, 300, null, null],
[0, "타카이시 미츠루", null, 0, null, 85, 51, 71, 0, 160, 300, null, null, "이 나라가 왜이리 망가져 버린걸까"],
[0, "유상", null, 0, null, 66, 77, 51, 0, 160, 300, null, null],
[0, "유상호", null, 0, null, 39, 56, 44, 0, 160, 300, null, null, "쯧. 런애가 내 딸이라니 수치야"],
[0, "서유현", null, 0, null, 42, 44, 60, 0, 160, 300, null, null, "하… 내가 교육을 잘못했구나"],
[0, "오준", null, 0, null, 69, 12, 84, 0, 160, 300, null, null, "이 지역은 이제부터 내것이다!"],
[10, "도니 버밀리언", null, 0, null, 48, 14, 66, 0, 160, 300, null, null],
[0, "모한다르", null, 0, null, 68, 81, 45, 0, 160, 300, null, null],
[0, "월리엄 와이트", null, 0, null, 55, 64, 88, 0, 160, 300, null, null, "아니 나를 별명으로 부르지 말라고!"],
[0, "도미니크 헥터", null, 0, null, 57, 69, 41, 0, 160, 300, null, null],
[0, "리만 베리오스", null, 0, null, 55, 69, 40, 0, 160, 300, null, null],
[1, "고야 나카타", null, 0, null, 73, 55, 77, 0, 160, 300, null, null, "유키코, 난 너를 언제나 사랑할거야"],
[1, "니시나 묘토", null, 0, null, 63, 67, 44, 0, 160, 300, null, null, "에휴 유키코를 지키는데 이유는 없지만 말이지"],
[0, "오오시 마카코", null, 0, null, 55, 73, 55, 0, 160, 300, null, null, "젠장…! 유키코 놈들 절로 가만두지 않을거다!"],
[0, "스즈이 이로키", null, 0, null, 63, 59, 37, 0, 160, 300, null, null, "우리는 고사모! 유키코와 동료들을 증오하는 클래스 메이트!"],
[0, "스즈키 이로이", null, 0, null, 59, 64, 44, 0, 160, 300, null, null, "유키코는 증오의 철퇴를 마주보아라!"],
[0, "히라구시 토노", null, 0, null, 51, 58, 59, 0, 160, 300, null, null],
[0, "미타키 신고", null, 0, null, 68, 77, 64, 0, 160, 300, null, null],
[0, "섀도 게일", null, 0, null, 57, 69, 62, 0, 160, 300, null, null],
[0, "사야코", null, 0, null, 69, 75, 60, 0, 160, 300, null, null],
[0, "미요가타노 나코", null, 0, null, 77, 55, 79, 0, 160, 300, null, null, "fucking doll!"],
[0, "첼너 마우스", null, 0, null, 51, 85, 2, 0, 160, 300, null, null, "체르나는 그런거 싫단 말이야! 내꺼라고!"],
[0, "페치카", null, 0, null, 68, 8, 80, 0, 160, 300, null, null],
[0, "기타노 유리코", null, 0, null, 14, 9, 64, 0, 160, 300, null, null, "유키코는 참 의젓한 아이야."],
[0, "니얀다 카멘", null, 0, null, 86, 85, 41, 0, 160, 300, null, null, "살려달라고 외치면 그 누구든 구할거야, 설사 적이라 할지라도"],
[0, "니얀다 카렌", null, 0, null, 73, 88, 60, 0, 160, 300, null, null],
[0, "니얀다 아렌", null, 0, null, 73, 85, 58, 0, 160, 300, null, null],
[0, "니얀다 루나", null, 0, null, 84, 81, 75, 0, 160, 300, null, null],
[0, "니얀다 아코", null, 0, null, 67, 80, 55, 0, 160, 300, null, null],
[0, "니얀다 세인트", null, 0, null, 81, 83, 71, 0, 160, 300, null, null],
[0, "니얀다 레인", null, 0, null, 66, 82, 52, 0, 160, 300, null, null],
[0, "니얀다 마우스", null, 0, null, 69, 74, 39, 0, 160, 300, null, null],
[0, "마키무라 신타로", null, 0, null, 65, 62, 39, 0, 160, 300, null, null],
[0, "요시야마 에리", null, 0, null, 46, 12, 55, 0, 160, 300, null, null],
[0, "타케우치 리키", null, 0, null, 51, 33, 72, 0, 160, 300, null, null, "세상에는 승자와 패자가 있다, 허나 그것은 사실일까?"],
[0, "나카가와 노리코", null, 0, null, 19, 8, 68, 0, 160, 300, null, null, "알고있엇니? 수십년간 전쟁이 지속된 이 나라에도 이렇게 아름다운 봄이 온다는 것을, 돌아오지 않는 계절은 없어, 신기해"],
[0, "타마키 이로하", null, 0, null, 75, 69, 62, 0, 160, 300, null, null],
[0, "타마키 우이", null, 0, null, 87, 53, 74, 0, 160, 300, null, null, "마기우스의 날개의 쉼터에 온것을 환영해 언니"],
[0, "사토미 토우카", null, 0, null, 65, 47, 92, 0, 160, 300, null, null, "우린 우이가 너무 좋아~ 이로하 언니도"],
[0, "히이라기 네무", null, 0, null, 57, 48, 93, 0, 160, 300, null, null],
[0, "아노토카 모미카", null, 0, null, 69, 81, 74, 0, 160, 300, null, null, "친구들을 믿는 굳건한 마음 큐어 프리트"],
[0, "모노미야 세이나", null, 0, null, 77, 83, 41, 0, 160, 300, null, null, "어떤 유혹에도 빛을 잃지않는 깨끗한 마음 큐어 다이아!"],
[0, "모노야마 유이", null, 0, null, 69, 85, 60, 0, 160, 300, null, null, "사랑하는 사람을 지키기 위한 진실한 마음 큐어 실린!"],
[0, "루시에르", null, 0, null, 84, 72, 80, 0, 160, 300, null, null, "내 딸들은 행복했으면 좋겟어"],
[0, "큐어 루프", null, 0, null, 63, 81, 40, 0, 160, 300, null, null, "감히… 내동생을 어둠의 가면으로 죽였겟다! 복수할거야! 로스쿨"],
[0, "가제크", null, 0, null, 55, 79, 51, 0, 160, 300, null, null, "어…언니 사…살려줘!!"],
[0, "큐어 가젯", null, 0, null, 67, 81, 55, 0, 160, 300, null, null, "어머니… 어머니의 원수 꼭 갚겠어요.. 우리를 버린 로스쿨에게 복수할 겁니다"],
[0, "큐어 루비", null, 0, null, 73, 79, 59, 0, 160, 300, null, null, "언니 우리 같이 힘내자"],
[0, "루미에르", null, 0, null, 80, 81, 64, 0, 160, 300, null, null],
[0, "토모야마 리에리", null, 0, null, 92, 55, 91, 0, 160, 300, null, null],
[0, "니카와라 리나", null, 0, null, 75, 67, 77, 0, 160, 300, null, null],
[0, "테네유치 이야노", null, 0, null, 66, 81, 55, 0, 160, 300, null, null],
[0, "니시유라 리코", null, 0, null, 64, 84, 75, 0, 160, 300, null, null],
[0, "소우다 마키", null, 0, null, 67, 81, 62, 0, 160, 300, null, null],
[0, "타니구치유이치로", null, 0, null, 79, 82, 66, 0, 160, 300, null, null],
[0, "마라바키 료", null, 0, null, 82, 81, 60, 0, 160, 300, null, null],
[0, "에트리카 에슈", null, 0, null, 84, 53, 82, 0, 160, 300, null, null, "모든것은, 나를 이렇게 만든 세상에 복수하기 위해!"],
[0, "유가을", null, 0, null, 87, 95, 60, 0, 160, 300, null, null],
[0, "츠바이 유시", null, 0, null, 43, 63, 77, 0, 160, 300, null, null],
[0, "크람베리", null, 0, null, 82, 93, 51, 0, 160, 300, null, null],
[0, "파브", null, 0, null, 41, 10, 78, 0, 160, 300, null, null],
[0, "파르", null, 0, null, 43, 10, 88, 0, 160, 300, null, null],
[0, "타이요 아카리", null, 0, null, 81, 92, 77, 0, 160, 300, null, null, "나 잊지 않을테니까, 후유나에 대해 절대로 잊지않을 테니까"],
[0, "신자키 후유나", null, 0, null, 74, 79, 55, 0, 160, 300, null, null, "안녕 아카리, 아카리와 만나 행복했어"],
[0, "크랑테일", null, 0, null, 77, 81, 55, 0, 160, 300, null, null],
[0, "타카이시 히모리", null, 0, null, 69, 37, 89, 0, 160, 300, null, null, "내 나라, 부모님의 나라 내가 지킬거야"],
[0, "사카나기 아야나", null, 0, null, 73, 89, 53, 0, 160, 300, null, null, "난 스윔스윔, 잘부탁해"],
[0, "사카나기 이즈카", null, 0, null, 77, 82, 60, 0, 160, 300, null, null, "난 사야코야"],
[0, "릿프", null, 0, null, 51, 9, 61, 0, 160, 300, null, null],
[0, "다크니스 드림", null, 0, null, 64, 93, 66, 0, 160, 300, null, null],
[0, "큐어 멜로디", null, 0, null, 74, 88, 46, 0, 160, 300, null, null],
[0, "큐어 하모니", null, 0, null, 81, 88, 55, 0, 160, 300, null, null],
[0, "큐어 블루펄", null, 0, null, 87, 92, 80, 0, 160, 300, null, null],
[0, "큐어 위시", null, 0, null, 83, 77, 42, 0, 160, 300, null, null],
[0, "큐어 비트", null, 0, null, 69, 88, 68, 0, 160, 300, null, null],
[0, "하드고어 앨리스", null, 0, null, 73, 79, 70, 0, 160, 300, null, null],
[0, "푸크푹", null, 0, null, 87, 88, 64, 0, 160, 300, null, null],
[0, "카나", null, 0, null, 77, 89, 69, 0, 160, 300, null, null],
[0, "키도 미노루", null, 0, null, 81, 53, 79, 0, 160, 300, null, null],
[0, "리 슈촌", null, 0, null, 66, 27, 79, 0, 160, 300, null, null],
[0, "아마노 네네", null, 0, null, 77, 55, 89, 0, 160, 300, null, null],
[0, "쿠도 타이키", null, 0, null, 86, 60, 93, 0, 160, 300, null, null],
[0, "히노모토 아카리", null, 0, null, 70, 17, 81, 0, 160, 300, null, null],
[0, "아오누마 키리하", null, 0, null, 84, 67, 85, 0, 160, 300, null, null],
[0, "츠루기 젠지로", null, 0, null, 56, 69, 40, 0, 160, 300, null, null],
[0, "향상성", null, 0, null, 82, 77, 90, 0, 160, 300, null, null],
[0, "이그드라실", null, 0, null, 80, 80, 77, 0, 160, 300, null, null, "저는 디지털 월드의 평화를 바라는자,"],
[0, "렌", null, 0, null, 89, 100, 42, 0, 160, 300, null, "무쌍"],
[0, "네네네", null, 0, null, 63, 55, 89, 0, 160, 300, null, null],
[0, "이소긴&야도간", null, 0, null, 58, 77, 39, 0, 160, 300, null, null],
[0, "바스도라", null, 0, null, 64, 71, 27, 0, 160, 300, null, null],
[0, "포이즈니", null, 0, null, 68, 89, 66, 0, 160, 300, null, null],
[0, "긴토레스키", null, 0, null, 80, 104, 70, 0, 160, 300, null, "무쌍"],
[0, "키리야", null, 0, null, 73, 82, 55, 0, 160, 300, null, null],
[0, "큐어 옐", null, 0, null, 90, 96, 76, 0, 160, 300, null, null],
[0, "큐어 앙주", null, 0, null, 83, 85, 72, 0, 160, 300, null, null],
[0, "큐어 에투알", null, 0, null, 80, 83, 70, 0, 160, 300, null, null],
[0, "닥터 크라이시스", null, 0, null, 70, 90, 90, 0, 160, 300, null, null],
[0, "큐어 원더풀", null, 0, null, 82, 85, 52, 0, 160, 300, null, null],
[0, "큐어 냐미", null, 0, null, 85, 83, 73, 0, 160, 300, null, null],
[0, "큐어 리히트", null, 0, null, 89, 93, 74, 0, 160, 300, null, null],
[0, "다크 드림", null, 0, null, 77, 94, 76, 0, 160, 300, null, null],
[0, "큐어 프렌디", null, 0, null, 86, 83, 77, 0, 160, 300, null, null],
[0, "큐어 릴리안", null, 0, null, 87, 82, 80, 0, 160, 300, null, null]
],
"general_ex":[
],
"initialEvents": [
[
true,
[
"ChangeCity",
"all",
{
"trade": 100
}
]
]
],
"events": [
[
"month",
1000,
[
"Date",
"==",
180,
1
],
[
"ChangeCity",
"all",
{
"trade": 100
}
],
[
"DeleteEvent"
]
],
[
"month",
1000,
[
"Date",
"==",
180,
7
],
[
"ChangeCity",
"all",
{
"trade": 100
}
],
[
"DeleteEvent"
]
],
[
"month",
1000,
[
"Date",
"==",
181,
1
],
[
"ChangeCity",
"all",
{
"trade": 100
}
],
[
"DeleteEvent"
]
],
[
"month",
1000,
[
"Date",
"==",
181,
7
],
[
"ChangeCity",
"all",
{
"trade": 100
}
],
[
"DeleteEvent"
]
],
[
"month",
1000,
[
"Date",
"==",
182,
1
],
[
"ChangeCity",
"all",
{
"trade": 100
}
],
[
"DeleteEvent"
]
],
[
"month",
1000,
[
"Date",
"==",
182,
7
],
[
"ChangeCity",
"all",
{
"trade": 100
}
],
[
"DeleteEvent"
]
],
[
"destroy_nation",
1000,
[
"and",
[
"Date",
">=",
183,
1
],
[
"RemainNation",
"==",
1
]
],
[
"BlockScoutAction"
],
[
"DeleteEvent"
]
]
]
}
+11 -5
View File
@@ -1,8 +1,8 @@
{
"title": "【가상모드29】 리그오브레전드 v1.0",
"startYear": 2024,
"title": "【가상모드29】 리그오브레전드 v1.1",
"startYear": 2025,
"history": [
"<C>●</>2024년 1월:<L><b>【가상모드99】</b>리그 오브 레전드 (전콘도움 네이미)</>",
"<C>●</>2024년 1월:<L><b>【가상모드29】</b>리그 오브 레전드 (비급) (전콘도움 네이미)</>",
"<C>●</>2024년 1월:<L><b>【이벤트】</b></>소환사의 협곡에 오신 것을 환영합니다."
],
"stat": {
@@ -29,6 +29,12 @@
["타곤", "#0000FF", 5000, 5000, "타곤", 300, "덕가", 2, ["한중"]]
],
"diplomacy":[],
"const": {
"randGenFirstName": ["근거리", "원거리", "대포", "슈퍼"],
"randGenMiddleName": [""],
"randGenLastName": [" 미니언"],
"npcMessageFreqByDay": 2
},
"general":[
[0, "가렌", null, 10, "성도", 101, 97, 49, 11, 2009, 2200, null, null, "내 검과 심장은 데마시아의 것이다."],
[0, "갈리오", null, 10, "성도", 108, 58, 96, 1, 2009, 2200, null, null, "힘을 발휘할 시간이군!"],
@@ -232,7 +238,7 @@
[0, "바루스", null, 0, null, 88, 113, 59, 0, 2009, 2200, null, null, "죄 지은 자, 고통받을지어다."],
[0, "바이", null, 5, "낙양", 103, 104, 49, 1, 2009, 2200, null, null, "일단 한 대 맞아. 질문은 나중에 하고."],
[0, "베이가", null, 0, null, 102, 26, 119, 0, 2009, 2200, null, null, "내가 너였다면, 너에게 어떤 자비도 없었을 거란 것만 알아 둬!"],
[0, "베인", null, 10, "성도", 84, 116, 55, 1, 2009, 2200, null, null, "어둠에 빠진 자들을 사냥해 볼까?"],
[0, "베인", null, 0, null, 84, 116, 55, 0, 2009, 2200, null, null, "어둠에 빠진 자들을 사냥해 볼까?"],
[0, "벡스", null, 3, "서량", 89, 56, 112, 1, 2009, 2200, null, null, "뭐, 그러든가, 말든가…"],
[0, "벨베스", null, 13, "장안", 103, 96, 60, 1, 2009, 2200, null, null, "내가 바로 적막의 목소리다."],
[0, "벨코즈", null, 13, "장안", 84, 55, 118, 1, 2009, 2200, null, null, "해체하여, 지식을 습득한다."],
@@ -400,7 +406,7 @@
[0, "이블린", null, 0, null, 91, 68, 104, 0, 2009, 2200, null, null, "날 원하잖아, 그렇지?"],
[0, "이즈리얼", null, 5, "낙양", 91, 101, 77, 1, 2009, 2200, null, null, "임무를 수락하지! 잠깐, 어디 가는 거라고?"],
[0, "일라오이", null, 9, "이도", 102, 94, 58, 11, 2009, 2200, null, null, "설교는 필요 없다. 부러진 뼈가 더 큰 교훈을 새겨 줄 테니."],
[0, "자르반 4세", null, 0, null, 96, 101, 61, 0, 2009, 2200, null, null, "내 의지로 여기서 끝을 보겠노라."],
[0, "자르반 4세", null, 10, "성도", 96, 101, 61, 12, 2009, 2200, null, null, "내 의지로 여기서 끝을 보겠노라."],
[0, "자야", null, 7, "위례", 88, 112, 61, 12, 2009, 2200, null, null, "댄스 파티에 내가 빠질 수는 없지."],
[0, "자이라", null, 0, null, 88, 59, 106, 0, 2009, 2200, null, null, "가시 덩굴에 포근히 안겨봐."],
[0, "자크", null, 6, "허창", 109, 84, 47, 1, 2009, 2200, null, null, "딱 봐도 잘 싸우게 생기지 않았어?"],
+9 -6
View File
@@ -1,8 +1,8 @@
{
"title": "【가상모드29-b】 리그오브레전드 v1.0 (비급)",
"startYear": 2024,
"title": "【가상모드29-b】 리그오브레전드 v1.1 (비급)",
"startYear": 2025,
"history": [
"<C>●</>2024년 1월:<L><b>【가상모드99】</b>리그 오브 레전드 (비급) (전콘도움 네이미)</>",
"<C>●</>2024년 1월:<L><b>【가상모드29-b】</b>리그 오브 레전드 (비급) (전콘도움 네이미)</>",
"<C>●</>2024년 1월:<L><b>【이벤트】</b></>소환사의 협곡에 오신 것을 환영합니다."
],
"stat": {
@@ -30,9 +30,12 @@
],
"diplomacy":[],
"const": {
"randGenFirstName": ["근거리", "원거리", "대포", "슈퍼"],
"randGenMiddleName": [""],
"randGenLastName": [" 미니언"],
"npcBanMessageProb": 0,
"npcSeizureMessageProb": 0,
"npcMessageFreqByDay": 8,
"npcMessageFreqByDay": 2,
"availableSpecialWar": [
"che_귀병",
"che_신산",
@@ -373,7 +376,7 @@
[0, "바루스", null, 0, null, 88, 113, 59, 0, 2009, 2200, null, null, "죄 지은 자, 고통받을지어다."],
[0, "바이", null, 5, "낙양", 103, 104, 49, 1, 2009, 2200, null, null, "일단 한 대 맞아. 질문은 나중에 하고."],
[0, "베이가", null, 0, null, 102, 26, 119, 0, 2009, 2200, null, null, "내가 너였다면, 너에게 어떤 자비도 없었을 거란 것만 알아 둬!"],
[0, "베인", null, 10, "성도", 84, 116, 55, 1, 2009, 2200, null, null, "어둠에 빠진 자들을 사냥해 볼까?"],
[0, "베인", null, 0, null, 84, 116, 55, 0, 2009, 2200, null, null, "어둠에 빠진 자들을 사냥해 볼까?"],
[0, "벡스", null, 3, "서량", 89, 56, 112, 1, 2009, 2200, null, null, "뭐, 그러든가, 말든가…"],
[0, "벨베스", null, 13, "장안", 103, 96, 60, 1, 2009, 2200, null, null, "내가 바로 적막의 목소리다."],
[0, "벨코즈", null, 13, "장안", 84, 55, 118, 1, 2009, 2200, null, null, "해체하여, 지식을 습득한다."],
@@ -541,7 +544,7 @@
[0, "이블린", null, 0, null, 91, 68, 104, 0, 2009, 2200, null, null, "날 원하잖아, 그렇지?"],
[0, "이즈리얼", null, 5, "낙양", 91, 101, 77, 1, 2009, 2200, null, null, "임무를 수락하지! 잠깐, 어디 가는 거라고?"],
[0, "일라오이", null, 9, "이도", 102, 94, 58, 11, 2009, 2200, null, null, "설교는 필요 없다. 부러진 뼈가 더 큰 교훈을 새겨 줄 테니."],
[0, "자르반 4세", null, 0, null, 96, 101, 61, 0, 2009, 2200, null, null, "내 의지로 여기서 끝을 보겠노라."],
[0, "자르반 4세", null, 10, "성도", 96, 101, 61, 12, 2009, 2200, null, null, "내 의지로 여기서 끝을 보겠노라."],
[0, "자야", null, 7, "위례", 88, 112, 61, 12, 2009, 2200, null, null, "댄스 파티에 내가 빠질 수는 없지."],
[0, "자이라", null, 0, null, 88, 59, 106, 0, 2009, 2200, null, null, "가시 덩굴에 포근히 안겨봐."],
[0, "자크", null, 6, "허창", 109, 84, 47, 1, 2009, 2200, null, null, "딱 봐도 잘 싸우게 생기지 않았어?"],
+10 -6
View File
@@ -1,8 +1,8 @@
{
"title": "【가상모드29-d】 리그오브레전드 v1.0 (파죽지세)",
"startYear": 2024,
"title": "【가상모드29-d】 리그오브레전드 v1.1 (파죽지세)",
"startYear": 2025,
"history": [
"<C>●</>2024년 1월:<L><b>【가상모드99】</b>리그 오브 레전드 (파죽지세) (전콘도움 네이미)</>",
"<C>●</>2024년 1월:<L><b>【가상모드29-d】</b>리그 오브 레전드 (파죽지세) (전콘도움 네이미)</>",
"<C>●</>2024년 1월:<L><b>【이벤트】</b></>소환사의 협곡에 오신 것을 환영합니다."
],
"stat": {
@@ -30,10 +30,14 @@
],
"diplomacy":[],
"const": {
"randGenFirstName": ["근거리", "원거리", "대포", "슈퍼"],
"randGenMiddleName": [""],
"randGenLastName": [" 미니언"],
"scenarioEffect": "event_StrongAttacker",
"availableInstantAction": {
"instantRetreat": true
}
},
"npcMessageFreqByDay": 2
},
"general":[
[0, "가렌", null, 10, "성도", 101, 97, 49, 11, 2009, 2200, null, null, "내 검과 심장은 데마시아의 것이다."],
@@ -238,7 +242,7 @@
[0, "바루스", null, 0, null, 88, 113, 59, 0, 2009, 2200, null, null, "죄 지은 자, 고통받을지어다."],
[0, "바이", null, 5, "낙양", 103, 104, 49, 1, 2009, 2200, null, null, "일단 한 대 맞아. 질문은 나중에 하고."],
[0, "베이가", null, 0, null, 102, 26, 119, 0, 2009, 2200, null, null, "내가 너였다면, 너에게 어떤 자비도 없었을 거란 것만 알아 둬!"],
[0, "베인", null, 10, "성도", 84, 116, 55, 1, 2009, 2200, null, null, "어둠에 빠진 자들을 사냥해 볼까?"],
[0, "베인", null, 0, null, 84, 116, 55, 0, 2009, 2200, null, null, "어둠에 빠진 자들을 사냥해 볼까?"],
[0, "벡스", null, 3, "서량", 89, 56, 112, 1, 2009, 2200, null, null, "뭐, 그러든가, 말든가…"],
[0, "벨베스", null, 13, "장안", 103, 96, 60, 1, 2009, 2200, null, null, "내가 바로 적막의 목소리다."],
[0, "벨코즈", null, 13, "장안", 84, 55, 118, 1, 2009, 2200, null, null, "해체하여, 지식을 습득한다."],
@@ -406,7 +410,7 @@
[0, "이블린", null, 0, null, 91, 68, 104, 0, 2009, 2200, null, null, "날 원하잖아, 그렇지?"],
[0, "이즈리얼", null, 5, "낙양", 91, 101, 77, 1, 2009, 2200, null, null, "임무를 수락하지! 잠깐, 어디 가는 거라고?"],
[0, "일라오이", null, 9, "이도", 102, 94, 58, 11, 2009, 2200, null, null, "설교는 필요 없다. 부러진 뼈가 더 큰 교훈을 새겨 줄 테니."],
[0, "자르반 4세", null, 0, null, 96, 101, 61, 0, 2009, 2200, null, null, "내 의지로 여기서 끝을 보겠노라."],
[0, "자르반 4세", null, 10, "성도", 96, 101, 61, 12, 2009, 2200, null, null, "내 의지로 여기서 끝을 보겠노라."],
[0, "자야", null, 7, "위례", 88, 112, 61, 12, 2009, 2200, null, null, "댄스 파티에 내가 빠질 수는 없지."],
[0, "자이라", null, 0, null, 88, 59, 106, 0, 2009, 2200, null, null, "가시 덩굴에 포근히 안겨봐."],
[0, "자크", null, 6, "허창", 109, 84, 47, 1, 2009, 2200, null, null, "딱 봐도 잘 싸우게 생기지 않았어?"],
+9 -6
View File
@@ -1,8 +1,8 @@
{
"title": "【가상모드29-e】 리그오브레전드 v1.0 (비급+파죽지세)",
"startYear": 2024,
"title": "【가상모드29-e】 리그오브레전드 v1.1 (비급+파죽지세)",
"startYear": 2025,
"history": [
"<C>●</>2024년 1월:<L><b>【가상모드99】</b>리그 오브 레전드 (비급+파죽지세) (전콘도움 네이미)</>",
"<C>●</>2024년 1월:<L><b>【가상모드29-e】</b>리그 오브 레전드 (비급+파죽지세) (전콘도움 네이미)</>",
"<C>●</>2024년 1월:<L><b>【이벤트】</b></>소환사의 협곡에 오신 것을 환영합니다."
],
"stat": {
@@ -30,13 +30,16 @@
],
"diplomacy":[],
"const": {
"randGenFirstName": ["근거리", "원거리", "대포", "슈퍼"],
"randGenMiddleName": [""],
"randGenLastName": [" 미니언"],
"scenarioEffect": "event_StrongAttacker",
"availableInstantAction": {
"instantRetreat": true
},
"npcBanMessageProb": 0,
"npcSeizureMessageProb": 0,
"npcMessageFreqByDay": 8,
"npcMessageFreqByDay": 2,
"availableSpecialWar": [
"che_귀병",
"che_신산",
@@ -377,7 +380,7 @@
[0, "바루스", null, 0, null, 88, 113, 59, 0, 2009, 2200, null, null, "죄 지은 자, 고통받을지어다."],
[0, "바이", null, 5, "낙양", 103, 104, 49, 1, 2009, 2200, null, null, "일단 한 대 맞아. 질문은 나중에 하고."],
[0, "베이가", null, 0, null, 102, 26, 119, 0, 2009, 2200, null, null, "내가 너였다면, 너에게 어떤 자비도 없었을 거란 것만 알아 둬!"],
[0, "베인", null, 10, "성도", 84, 116, 55, 1, 2009, 2200, null, null, "어둠에 빠진 자들을 사냥해 볼까?"],
[0, "베인", null, 0, null, 84, 116, 55, 0, 2009, 2200, null, null, "어둠에 빠진 자들을 사냥해 볼까?"],
[0, "벡스", null, 3, "서량", 89, 56, 112, 1, 2009, 2200, null, null, "뭐, 그러든가, 말든가…"],
[0, "벨베스", null, 13, "장안", 103, 96, 60, 1, 2009, 2200, null, null, "내가 바로 적막의 목소리다."],
[0, "벨코즈", null, 13, "장안", 84, 55, 118, 1, 2009, 2200, null, null, "해체하여, 지식을 습득한다."],
@@ -545,7 +548,7 @@
[0, "이블린", null, 0, null, 91, 68, 104, 0, 2009, 2200, null, null, "날 원하잖아, 그렇지?"],
[0, "이즈리얼", null, 5, "낙양", 91, 101, 77, 1, 2009, 2200, null, null, "임무를 수락하지! 잠깐, 어디 가는 거라고?"],
[0, "일라오이", null, 9, "이도", 102, 94, 58, 11, 2009, 2200, null, null, "설교는 필요 없다. 부러진 뼈가 더 큰 교훈을 새겨 줄 테니."],
[0, "자르반 4세", null, 0, null, 96, 101, 61, 0, 2009, 2200, null, null, "내 의지로 여기서 끝을 보겠노라."],
[0, "자르반 4세", null, 10, "성도", 96, 101, 61, 12, 2009, 2200, null, null, "내 의지로 여기서 끝을 보겠노라."],
[0, "자야", null, 7, "위례", 88, 112, 61, 12, 2009, 2200, null, null, "댄스 파티에 내가 빠질 수는 없지."],
[0, "자이라", null, 0, null, 88, 59, 106, 0, 2009, 2200, null, null, "가시 덩굴에 포근히 안겨봐."],
[0, "자크", null, 6, "허창", 109, 84, 47, 1, 2009, 2200, null, null, "딱 봐도 잘 싸우게 생기지 않았어?"],
+79 -74
View File
@@ -1,87 +1,92 @@
<?php
namespace sammo;
use sammo\GameUnitConstraint\ReqMinRelYear;
use sammo\GameUnitConstraint\ReqTech;
class GameUnitConst extends GameUnitConstBase
{
const DEFAULT_CREWTYPE = 1100;
protected static $_buildData = [
[
1000, self::T_CASTLE, '성벽',
100, 100, 7, 0, 0, 99, 9,
999999, null, null, 999999,
[],//성벽은 공격할 수 없다.
[self::T_FOOTMAN=>1.2],
['성벽입니다.','생성할 수 없습니다.'],
null, null, null
],
protected static function getBuildData(): array {
return [
[
1000, self::T_CASTLE, '성벽',
100, 100, 7, 0, 0, 99, 9,
[],
[], // 성벽은 공격할 수 없다.
[self::T_FOOTMAN=>1.2],
['성벽입니다.','생성할 수 없습니다.'],
null, null, null
],
[
1100, self::T_FOOTMAN, '보병',
100, 150, 7, 10, 0, 9, 9,
0, null, null, 0,
[self::T_ARCHER=>1.2, self::T_CAVALRY=>0.8, self::T_SIEGE=>1.2],
[self::T_ARCHER=>0.8, self::T_CAVALRY=>1.2, self::T_SIEGE=>0.8],
['표준적인 보병입니다.','보병은 방어특화이며,','상대가 회피하기 어렵습니다.'],
null, null, null
],
[
1100, self::T_FOOTMAN, '보병',
100, 150, 7, 10, 0, 9, 9,
[],
[self::T_ARCHER=>1.2, self::T_CAVALRY=>0.8, self::T_SIEGE=>1.2],
[self::T_ARCHER=>0.8, self::T_CAVALRY=>1.2, self::T_SIEGE=>0.8],
['표준적인 보병입니다.','보병은 방어특화이며,','상대가 회피하기 어렵습니다.'],
null, null, null
],
[
1200, self::T_ARCHER, '궁병',
100, 100, 7, 20, 0, 10, 10,
0, null, null, 0,
[self::T_CAVALRY=>1.2, self::T_FOOTMAN=>0.8, self::T_SIEGE=>1.2],
[self::T_CAVALRY=>0.8, self::T_FOOTMAN=>1.2, self::T_SIEGE=>0.8],
['표준적인 궁병입니다.','궁병은 회피특화입니다.'],
null, null, null
],
[
1200, self::T_ARCHER, '궁병',
100, 100, 7, 20, 0, 10, 10,
[],
[self::T_CAVALRY=>1.2, self::T_FOOTMAN=>0.8, self::T_SIEGE=>1.2],
[self::T_CAVALRY=>0.8, self::T_FOOTMAN=>1.2, self::T_SIEGE=>0.8],
['표준적인 궁병입니다.','궁병은 회피특화입니다.'],
null, null, null
],
[
1300, self::T_CAVALRY, '기병',
150, 100, 7, 5, 0, 11, 11,
0, null, null, 0,
[self::T_FOOTMAN=>1.2, self::T_ARCHER=>0.8, self::T_SIEGE=>1.2],
[self::T_FOOTMAN=>0.8, self::T_ARCHER=>1.2, self::T_SIEGE=>0.8],
['표준적인 기병입니다.','기병은 공격특화입니다.'],
null, null, null
],
[
1300, self::T_CAVALRY, '기병',
150, 100, 7, 5, 0, 11, 11,
[],
[self::T_FOOTMAN=>1.2, self::T_ARCHER=>0.8, self::T_SIEGE=>1.2],
[self::T_FOOTMAN=>0.8, self::T_ARCHER=>1.2, self::T_SIEGE=>0.8],
['표준적인 기병입니다.','기병은 공격특화입니다.'],
null, null, null
],
[
1400, self::T_WIZARD, '귀병',
80, 80, 7, 5, 0.5, 9, 9,
0, null, null, 0,
[self::T_SIEGE=>1.2],
[self::T_SIEGE=>0.8],
['계략을 사용하는 병종입니다.'],
null, null, null
],
[
1405, self::T_WIZARD, '남귀병',
60, 60, 7, 10, 0.8, 8, 8,
1000, null, null, 0,
[self::T_SIEGE=>1.2],
[self::T_SIEGE=>0.8],
['전투를 포기하고 계략에 몰두합니다.'],
null, null, null
],
[
1400, self::T_WIZARD, '귀병',
80, 80, 7, 5, 0.5, 9, 9,
[],
[self::T_SIEGE=>1.2],
[self::T_SIEGE=>0.8],
['계략을 사용하는 병종입니다.'],
null, null, null
],
[
1405, self::T_WIZARD, '남귀병',
60, 60, 7, 10, 0.8, 8, 8,
[],
[self::T_SIEGE=>1.2],
[self::T_SIEGE=>0.8],
['전투를 포기하고 계략에 몰두합니다.'],
null, null, null
],
[
1500, self::T_SIEGE, '정란',
100, 100, 6, 0, 0, 15, 5,
0, null, null, 3,
[self::T_FOOTMAN=>0.8, self::T_ARCHER=>0.8, self::T_CAVALRY=>0.8, self::T_WIZARD=>0.8, self::T_CASTLE=>1.8],
[self::T_FOOTMAN=>1.2, self::T_ARCHER=>1.2, self::T_CAVALRY=>1.2, self::T_WIZARD=>1.2],
['높은 구조물 위에서 공격합니다.'],
['che_성벽부상무효'], null, ['che_성벽선제']
],
[
1501, self::T_SIEGE, '충차',
150, 100, 6, 0, 0, 20, 5,
1000, null, null, 3,
[self::T_FOOTMAN=>0.8, self::T_ARCHER=>0.8, self::T_CAVALRY=>0.8, self::T_WIZARD=>0.8, self::T_CASTLE=>2.4],
[self::T_FOOTMAN=>1.2, self::T_ARCHER=>1.2, self::T_CAVALRY=>1.2, self::T_WIZARD=>1.2],
['엄청난 위력으로 성벽을 부수어버립니다.'],
['che_성벽부상무효'], null, null
]
];
[
1500, self::T_SIEGE, '정란',
100, 100, 6, 0, 0, 15, 5,
[new ReqMinRelYear(3)],
[self::T_FOOTMAN=>0.8, self::T_ARCHER=>0.8, self::T_CAVALRY=>0.8, self::T_WIZARD=>0.8, self::T_CASTLE=>1.8],
[self::T_FOOTMAN=>1.2, self::T_ARCHER=>1.2, self::T_CAVALRY=>1.2, self::T_WIZARD=>1.2],
['높은 구조물 위에서 공격합니다.'],
['che_성벽부상무효'], null, ['che_성벽선제']
],
[
1501, self::T_SIEGE, '충차',
150, 100, 6, 0, 0, 20, 5,
[new ReqTech(1000), new ReqMinRelYear(3)],
[self::T_FOOTMAN=>0.8, self::T_ARCHER=>0.8, self::T_CAVALRY=>0.8, self::T_WIZARD=>0.8, self::T_CASTLE=>2.4],
[self::T_FOOTMAN=>1.2, self::T_ARCHER=>1.2, self::T_CAVALRY=>1.2, self::T_WIZARD=>1.2],
['엄청난 위력으로 성벽을 부수어버립니다.'],
['che_성벽부상무효'], null, null
]
];
}
}
+307 -299
View File
@@ -1,310 +1,318 @@
<?php
namespace sammo;
use sammo\GameUnitConstraint\Impossible;
use sammo\GameUnitConstraint\ReqCities;
use sammo\GameUnitConstraint\ReqMinRelYear;
use sammo\GameUnitConstraint\ReqRegions;
use sammo\GameUnitConstraint\ReqTech;
class GameUnitConst extends GameUnitConstBase
{
protected static $_buildData = [
[
1000, self::T_CASTLE, '성벽',
100, 100, 7, 0, 0, 99, 9,
999999, null, null, 999999,
[],//성벽은 공격할 수 없다.
[self::T_FOOTMAN=>1.2],
['성벽입니다.','생성할 수 없습니다.'],
null, ['che_선제사격시도', 'che_선제사격발동'], null
],
protected static function getBuildData(): array {
return [
[
1000, self::T_CASTLE, '성벽',
100, 100, 7, 0, 0, 99, 9,
[new Impossible()],
[], // 성벽은 공격할 수 없다.
[self::T_FOOTMAN=>1.2],
['성벽입니다.','생성할 수 없습니다.'],
null, ['che_선제사격시도', 'che_선제사격발동'], null
],
[
1100, self::T_FOOTMAN, '보병',
100, 150, 7, 10, 0, 9, 9,
0, null, null, 0,
[self::T_ARCHER=>1.2, self::T_CAVALRY=>0.8, self::T_SIEGE=>1.2],
[self::T_ARCHER=>0.8, self::T_CAVALRY=>1.2, self::T_SIEGE=>0.8],
['표준적인 보병입니다.','보병은 방어특화이며,','상대가 회피하기 어렵습니다.'],
null, ['che_방어력증가5p'], null
],
[
1101, self::T_FOOTMAN, '청주병',
100, 200, 7, 10, 0, 10, 11,
1000, null, ['중원'], 0,
[self::T_ARCHER=>1.2, self::T_CAVALRY=>0.8, self::T_SIEGE=>1.2],
[self::T_ARCHER=>0.8, self::T_CAVALRY=>1.2, self::T_SIEGE=>0.8],
['저렴하고 튼튼합니다.'],
null, ['che_방어력증가5p'], null
],
[
1102, self::T_FOOTMAN, '수병',
150, 150, 7, 10, 0, 11, 10,
1000, null, ['오월'], 0,
[self::T_ARCHER=>1.2, self::T_CAVALRY=>0.8, self::T_SIEGE=>1.2],
[self::T_ARCHER=>0.8, self::T_CAVALRY=>1.2, self::T_SIEGE=>0.8],
['저렴하고 강력합니다.'],
null, ['che_방어력증가5p'], null
],
[
1103, self::T_FOOTMAN, '자객병',
100, 150, 8, 20, 0, 10, 10,
2000, ['저'], null, 0,
[self::T_ARCHER=>1.2, self::T_CAVALRY=>0.8, self::T_SIEGE=>1.2],
[self::T_ARCHER=>0.8, self::T_CAVALRY=>1.2, self::T_SIEGE=>0.8],
['은밀하고 날쌥니다.'],
null, ['che_방어력증가5p'], null
],
[
1104, self::T_FOOTMAN, '근위병',
150, 200, 7, 10, 0, 12, 12,
3000, ['낙양'], null, 0,
[self::T_ARCHER=>1.2, self::T_CAVALRY=>0.8, self::T_SIEGE=>1.2],
[self::T_ARCHER=>0.8, self::T_CAVALRY=>1.2, self::T_SIEGE=>0.8],
['최강의 보병입니다.'],
null, ['che_방어력증가5p'], null
],
[
1105, self::T_FOOTMAN, '등갑병',
100, 225, 7, 5, 0, 13, 10,
1000, null, ['남중'], 0,
[self::T_ARCHER=>1.2, self::T_CAVALRY=>0.8, self::T_SIEGE=>1.2],
[self::T_ARCHER=>0.8, self::T_CAVALRY=>1.2, self::T_SIEGE=>0.8],
['등갑을 두른 보병입니다.'],
null, ['che_방어력증가5p'], null
],
[
1106, self::T_FOOTMAN, '백이병',
175, 175, 7, 5, 0, 13, 11,
3000, ['성도'], null, 0,
[self::T_ARCHER=>1.1, self::T_CAVALRY=>0.9, self::T_SIEGE=>1.1],
[self::T_ARCHER=>0.9, self::T_CAVALRY=>1.1, self::T_SIEGE=>0.9],
['정예 보병입니다. 불리한 싸움도 버텨냅니다.'],
null, ['che_방어력증가5p'], null
],
[
1100, self::T_FOOTMAN, '보병',
100, 150, 7, 10, 0, 9, 9,
[],
[self::T_ARCHER=>1.2, self::T_CAVALRY=>0.8, self::T_SIEGE=>1.2],
[self::T_ARCHER=>0.8, self::T_CAVALRY=>1.2, self::T_SIEGE=>0.8],
['표준적인 보병입니다.','보병은 방어특화이며,','상대가 회피하기 어렵습니다.'],
null, ['che_방어력증가5p'], null
],
[
1101, self::T_FOOTMAN, '청주병',
100, 200, 7, 10, 0, 10, 11,
[new ReqTech(1000), new ReqRegions('중원')],
[self::T_ARCHER=>1.2, self::T_CAVALRY=>0.8, self::T_SIEGE=>1.2],
[self::T_ARCHER=>0.8, self::T_CAVALRY=>1.2, self::T_SIEGE=>0.8],
['저렴하고 튼튼합니다.'],
null, ['che_방어력증가5p'], null
],
[
1102, self::T_FOOTMAN, '수병',
150, 150, 7, 10, 0, 11, 10,
[new ReqTech(1000), new ReqRegions('오월')],
[self::T_ARCHER=>1.2, self::T_CAVALRY=>0.8, self::T_SIEGE=>1.2],
[self::T_ARCHER=>0.8, self::T_CAVALRY=>1.2, self::T_SIEGE=>0.8],
['저렴하고 강력합니다.'],
null, ['che_방어력증가5p'], null
],
[
1103, self::T_FOOTMAN, '자객병',
100, 150, 8, 20, 0, 10, 10,
[new ReqTech(2000), new ReqCities('저')],
[self::T_ARCHER=>1.2, self::T_CAVALRY=>0.8, self::T_SIEGE=>1.2],
[self::T_ARCHER=>0.8, self::T_CAVALRY=>1.2, self::T_SIEGE=>0.8],
['은밀하고 날쌥니다.'],
null, ['che_방어력증가5p'], null
],
[
1104, self::T_FOOTMAN, '근위병',
150, 200, 7, 10, 0, 12, 12,
[new ReqTech(3000), new ReqCities('낙양')],
[self::T_ARCHER=>1.2, self::T_CAVALRY=>0.8, self::T_SIEGE=>1.2],
[self::T_ARCHER=>0.8, self::T_CAVALRY=>1.2, self::T_SIEGE=>0.8],
['최강의 보병입니다.'],
null, ['che_방어력증가5p'], null
],
[
1105, self::T_FOOTMAN, '등갑병',
100, 225, 7, 5, 0, 13, 10,
[new ReqTech(1000), new ReqRegions('남중')],
[self::T_ARCHER=>1.2, self::T_CAVALRY=>0.8, self::T_SIEGE=>1.2],
[self::T_ARCHER=>0.8, self::T_CAVALRY=>1.2, self::T_SIEGE=>0.8],
['등갑을 두른 보병입니다.'],
null, ['che_방어력증가5p'], null
],
[
1106, self::T_FOOTMAN, '백이병',
175, 175, 7, 5, 0, 13, 11,
[new ReqTech(3000), new ReqCities('성도')],
[self::T_ARCHER=>1.1, self::T_CAVALRY=>0.9, self::T_SIEGE=>1.1],
[self::T_ARCHER=>0.9, self::T_CAVALRY=>1.1, self::T_SIEGE=>0.9],
['정예 보병입니다. 불리한 싸움도 버텨냅니다.'],
null, ['che_방어력증가5p'], null
],
[
1200, self::T_ARCHER, '궁병',
100, 100, 7, 10, 0, 10, 10,
0, null, null, 0,
[self::T_CAVALRY=>1.2, self::T_FOOTMAN=>0.8, self::T_SIEGE=>1.2],
[self::T_CAVALRY=>0.8, self::T_FOOTMAN=>1.2, self::T_SIEGE=>0.8],
['표준적인 궁병입니다.','궁병은 선제사격을 하는 병종입니다.'],
null, ['che_선제사격시도', 'che_선제사격발동'], null
],
[
1201, self::T_ARCHER, '궁기병',
100, 100, 8, 20, 0, 11, 12,
1000, null, ['동이'], 0,
[self::T_CAVALRY=>1.2, self::T_FOOTMAN=>0.9, self::T_SIEGE=>1.2],
[self::T_CAVALRY=>0.8, self::T_FOOTMAN=>1.1, self::T_SIEGE=>0.8],
['말을 타고 잘 피합니다. 특히 다른 궁병보다 보병에게 조금 더 강합니다.'],
null, ['che_선제사격시도', 'che_선제사격발동'], null
],
[
1202, self::T_ARCHER, '연노병',
150, 100, 8, 10, 0, 12, 11,
1000, null, ['서촉'], 0,
[self::T_CAVALRY=>1.2, self::T_FOOTMAN=>0.8, self::T_SIEGE=>1.2],
[self::T_CAVALRY=>0.8, self::T_FOOTMAN=>1.2, self::T_SIEGE=>0.8],
['화살을 연사합니다.'],
null, ['che_선제사격시도', 'che_선제사격발동'], null
],
[
1203, self::T_ARCHER, '강궁병',
150, 150, 7, 10, 0, 13, 13,
3000, ['양양'], null, 0,
[self::T_CAVALRY=>1.2, self::T_FOOTMAN=>0.8, self::T_SIEGE=>1.2],
[self::T_CAVALRY=>0.8, self::T_FOOTMAN=>1.2, self::T_SIEGE=>0.8],
['강건한 궁병입니다.'],
null, ['che_선제사격시도', 'che_선제사격발동'], null
],
[
1204, self::T_ARCHER, '석궁병',
200, 100, 7, 10, 0, 13, 13,
3000, ['건업'], null, 0,
[self::T_CAVALRY=>1.2, self::T_FOOTMAN=>0.8, self::T_SIEGE=>1.2],
[self::T_CAVALRY=>0.8, self::T_FOOTMAN=>1.2, self::T_SIEGE=>0.8],
['강력한 화살을 쏩니다.'],
null, ['che_선제사격시도', 'che_선제사격발동'], null
],
[
1200, self::T_ARCHER, '궁병',
100, 100, 7, 10, 0, 10, 10,
[],
[self::T_CAVALRY=>1.2, self::T_FOOTMAN=>0.8, self::T_SIEGE=>1.2],
[self::T_CAVALRY=>0.8, self::T_FOOTMAN=>1.2, self::T_SIEGE=>0.8],
['표준적인 궁병입니다.','궁병은 선제사격을 하는 병종입니다.'],
null, ['che_선제사격시도', 'che_선제사격발동'], null
],
[
1201, self::T_ARCHER, '궁기병',
100, 100, 8, 20, 0, 11, 12,
[new ReqTech(1000), new ReqRegions('동이')],
[self::T_CAVALRY=>1.2, self::T_FOOTMAN=>0.9, self::T_SIEGE=>1.2],
[self::T_CAVALRY=>0.8, self::T_FOOTMAN=>1.1, self::T_SIEGE=>0.8],
['말을 타고 잘 피합니다. 특히 다른 궁병보다 보병에게 조금 더 강합니다.'],
null, ['che_선제사격시도', 'che_선제사격발동'], null
],
[
1202, self::T_ARCHER, '연노병',
150, 100, 8, 10, 0, 12, 11,
[new ReqTech(1000), new ReqRegions('서촉')],
[self::T_CAVALRY=>1.2, self::T_FOOTMAN=>0.8, self::T_SIEGE=>1.2],
[self::T_CAVALRY=>0.8, self::T_FOOTMAN=>1.2, self::T_SIEGE=>0.8],
['화살을 연사합니다.'],
null, ['che_선제사격시도', 'che_선제사격발동'], null
],
[
1203, self::T_ARCHER, '강궁병',
150, 150, 7, 10, 0, 13, 13,
[new ReqTech(3000), new ReqCities('양양')],
[self::T_CAVALRY=>1.2, self::T_FOOTMAN=>0.8, self::T_SIEGE=>1.2],
[self::T_CAVALRY=>0.8, self::T_FOOTMAN=>1.2, self::T_SIEGE=>0.8],
['강건한 궁병입니다.'],
null, ['che_선제사격시도', 'che_선제사격발동'], null
],
[
1204, self::T_ARCHER, '석궁병',
200, 100, 7, 10, 0, 13, 13,
[new ReqTech(3000), new ReqCities('건업')],
[self::T_CAVALRY=>1.2, self::T_FOOTMAN=>0.8, self::T_SIEGE=>1.2],
[self::T_CAVALRY=>0.8, self::T_FOOTMAN=>1.2, self::T_SIEGE=>0.8],
['강력한 화살을 쏩니다.'],
null, ['che_선제사격시도', 'che_선제사격발동'], null
],
[
1300, self::T_CAVALRY, '기병',
150, 100, 7, 5, 0, 11, 11,
0, null, null, 0,
[self::T_FOOTMAN=>1.2, self::T_ARCHER=>0.8, self::T_SIEGE=>1.2],
[self::T_FOOTMAN=>0.8, self::T_ARCHER=>1.2, self::T_SIEGE=>0.8],
['표준적인 기병입니다.','기병은 공격특화입니다.'],
null, ['che_기병병종전투'], null
],
[
1301, self::T_CAVALRY, '백마병',
200, 100, 7, 5, 0, 12, 13,
1000, null, ['하북'], 0,
[self::T_FOOTMAN=>1.2, self::T_ARCHER=>0.8, self::T_SIEGE=>1.2],
[self::T_FOOTMAN=>0.8, self::T_ARCHER=>1.2, self::T_SIEGE=>0.8],
['백마의 위용을 보여줍니다.'],
null, ['che_기병병종전투'], null
],
[
1302, self::T_CAVALRY, '중장기병',
150, 150, 7, 5, 0, 13, 12,
1000, null, ['서북'], 0,
[self::T_FOOTMAN=>1.2, self::T_ARCHER=>0.8, self::T_SIEGE=>1.2],
[self::T_FOOTMAN=>0.8, self::T_ARCHER=>1.2, self::T_SIEGE=>0.8],
['갑주를 두른 기병입니다.'],
null, ['che_기병병종전투'], null
],
[
1303, self::T_CAVALRY, '돌격기병',
200, 100, 8, 5, 0, 13, 11,
2000, ['흉노'], null, 0,
[self::T_FOOTMAN=>1.2, self::T_ARCHER=>0.8, self::T_SIEGE=>1.2],
[self::T_FOOTMAN=>0.8, self::T_ARCHER=>1.2, self::T_SIEGE=>0.8],
['저돌적으로 공격합니다.'],
null, ['che_기병병종전투'], null
],
[
1304, self::T_CAVALRY, '철기병',
100, 200, 7, 5, 0, 11, 13,
2000, ['강'], null, 0,
[self::T_FOOTMAN=>1.2, self::T_ARCHER=>0.8, self::T_SIEGE=>1.2],
[self::T_FOOTMAN=>0.8, self::T_ARCHER=>1.2, self::T_SIEGE=>0.8],
['철갑을 두른 기병입니다.'],
null, ['che_기병병종전투'], null
],
[
1305, self::T_CAVALRY, '수렵기병',
150, 100, 8, 15, 0, 12, 12,
2000, ['산월'], null, 0,
[self::T_FOOTMAN=>1.2, self::T_ARCHER=>0.8, self::T_SIEGE=>1.2],
[self::T_FOOTMAN=>0.8, self::T_ARCHER=>1.2, self::T_SIEGE=>0.8],
['날쎄고 빠른 기병입니다.'],
null, ['che_기병병종전투'], null
],
[
1306, self::T_CAVALRY, '맹수병',
250, 175, 6, 0, 0, 16, 16,
2000, ['남만'], null, 0,
[self::T_FOOTMAN=>1.2, self::T_ARCHER=>0.8, self::T_SIEGE=>1.2],
[self::T_FOOTMAN=>0.8, self::T_ARCHER=>1.2, self::T_SIEGE=>0.8],
['어느 누구보다 강력합니다.'],
null, ['che_기병병종전투'], null
],
[
1307, self::T_CAVALRY, '호표기병',
200, 150, 7, 5, 0, 14, 14,
3000, ['허창'], null, 0,
[self::T_FOOTMAN=>1.2, self::T_ARCHER=>0.8, self::T_SIEGE=>1.2],
[self::T_FOOTMAN=>0.8, self::T_ARCHER=>1.2, self::T_SIEGE=>0.8],
['정예 기병입니다.'],
null, ['che_기병병종전투'], null
],
[
1300, self::T_CAVALRY, '기병',
150, 100, 7, 5, 0, 11, 11,
[],
[self::T_FOOTMAN=>1.2, self::T_ARCHER=>0.8, self::T_SIEGE=>1.2],
[self::T_FOOTMAN=>0.8, self::T_ARCHER=>1.2, self::T_SIEGE=>0.8],
['표준적인 기병입니다.','기병은 공격특화입니다.'],
null, ['che_기병병종전투'], null
],
[
1301, self::T_CAVALRY, '백마병',
200, 100, 7, 5, 0, 12, 13,
[new ReqTech(1000), new ReqRegions('하북')],
[self::T_FOOTMAN=>1.2, self::T_ARCHER=>0.8, self::T_SIEGE=>1.2],
[self::T_FOOTMAN=>0.8, self::T_ARCHER=>1.2, self::T_SIEGE=>0.8],
['백마의 위용을 보여줍니다.'],
null, ['che_기병병종전투'], null
],
[
1302, self::T_CAVALRY, '중장기병',
150, 150, 7, 5, 0, 13, 12,
[new ReqTech(1000), new ReqRegions('서북')],
[self::T_FOOTMAN=>1.2, self::T_ARCHER=>0.8, self::T_SIEGE=>1.2],
[self::T_FOOTMAN=>0.8, self::T_ARCHER=>1.2, self::T_SIEGE=>0.8],
['갑주를 두른 기병입니다.'],
null, ['che_기병병종전투'], null
],
[
1303, self::T_CAVALRY, '돌격기병',
200, 100, 8, 5, 0, 13, 11,
[new ReqTech(2000), new ReqCities('흉노')],
[self::T_FOOTMAN=>1.2, self::T_ARCHER=>0.8, self::T_SIEGE=>1.2],
[self::T_FOOTMAN=>0.8, self::T_ARCHER=>1.2, self::T_SIEGE=>0.8],
['저돌적으로 공격합니다.'],
null, ['che_기병병종전투'], null
],
[
1304, self::T_CAVALRY, '철기병',
100, 200, 7, 5, 0, 11, 13,
[new ReqTech(2000), new ReqCities('강')],
[self::T_FOOTMAN=>1.2, self::T_ARCHER=>0.8, self::T_SIEGE=>1.2],
[self::T_FOOTMAN=>0.8, self::T_ARCHER=>1.2, self::T_SIEGE=>0.8],
['철갑을 두른 기병입니다.'],
null, ['che_기병병종전투'], null
],
[
1305, self::T_CAVALRY, '수렵기병',
150, 100, 8, 15, 0, 12, 12,
[new ReqTech(2000), new ReqCities('산월')],
[self::T_FOOTMAN=>1.2, self::T_ARCHER=>0.8, self::T_SIEGE=>1.2],
[self::T_FOOTMAN=>0.8, self::T_ARCHER=>1.2, self::T_SIEGE=>0.8],
['날쎄고 빠른 기병입니다.'],
null, ['che_기병병종전투'], null
],
[
1306, self::T_CAVALRY, '맹수병',
250, 175, 6, 0, 0, 16, 16,
[new ReqTech(2000), new ReqCities('남만')],
[self::T_FOOTMAN=>1.2, self::T_ARCHER=>0.8, self::T_SIEGE=>1.2],
[self::T_FOOTMAN=>0.8, self::T_ARCHER=>1.2, self::T_SIEGE=>0.8],
['어느 누구보다 강력합니다.'],
null, ['che_기병병종전투'], null
],
[
1307, self::T_CAVALRY, '호표기병',
200, 150, 7, 5, 0, 14, 14,
[new ReqTech(3000), new ReqCities('허창')],
[self::T_FOOTMAN=>1.2, self::T_ARCHER=>0.8, self::T_SIEGE=>1.2],
[self::T_FOOTMAN=>0.8, self::T_ARCHER=>1.2, self::T_SIEGE=>0.8],
['정예 기병입니다.'],
null, ['che_기병병종전투'], null
],
[
1400, self::T_WIZARD, '귀병',
80, 80, 7, 5, 0.5, 9, 9,
0, null, null, 0,
[self::T_SIEGE=>1.2],
[self::T_SIEGE=>0.8],
['계략을 사용하는 병종입니다.'],
null, null, null
],
[
1401, self::T_WIZARD, '신귀병',
80, 80, 7, 20, 0.6, 10, 10,
1000, null, ['초'], 0,
[self::T_SIEGE=>1.2],
[self::T_SIEGE=>0.8],
['신출귀몰한 귀병입니다.'],
null, null, null
],
[
1402, self::T_WIZARD, '백귀병',
80, 130, 7, 5, 0.6, 9, 11,
2000, ['오환'], null, 0,
[self::T_SIEGE=>1.2],
[self::T_SIEGE=>0.8],
['저렴하고 튼튼합니다.'],
null, null, null
],
[
1403, self::T_WIZARD, '흑귀병',
130, 80, 7, 5, 0.6, 11, 9,
2000, ['왜'], null, 0,
[self::T_SIEGE=>1.2],
[self::T_SIEGE=>0.8],
['저렴하고 강력합니다.'],
null, null, null
],
[
1404, self::T_WIZARD, '악귀병',
130, 130, 7, 0, 0.6, 12, 12,
3000, ['장안'], null, 0,
[self::T_SIEGE=>1.2],
[self::T_SIEGE=>0.8],
['백병전에도 능숙합니다.'],
null, null, null
],
[
1405, self::T_WIZARD, '남귀병',
60, 60, 7, 10, 0.8, 8, 8,
1000, null, null, 0,
[self::T_SIEGE=>1.2],
[self::T_SIEGE=>0.8],
['전투를 포기하고 계략에 몰두합니다.'],
null, null, null
],
[
1406, self::T_WIZARD, '황귀병',
110, 110, 7, 0, 0.8, 13, 10,
3000, ['낙양'], null, 0,
[self::T_SIEGE=>1.2],
[self::T_SIEGE=>0.8],
['고도로 훈련된 귀병입니다.'],
null, null, null
],
[
1407, self::T_WIZARD, '천귀병',
80, 130, 7, 15, 0.6, 11, 12,
3000, ['성도'], null, 0,
[self::T_SIEGE=>1.2],
[self::T_SIEGE=>0.8],
['갑주를 두른 귀병입니다.'],
null, null, null
],
[
1408, self::T_WIZARD, '마귀병',
130, 80, 7, 15, 0.6, 12, 11,
3000, ['업'], null, 0,
[self::T_SIEGE=>1.2],
[self::T_SIEGE=>0.8],
['날카로운 무기를 가진 귀병입니다.'],
null, null, null
],
[
1400, self::T_WIZARD, '귀병',
80, 80, 7, 5, 0.5, 9, 9,
[],
[self::T_SIEGE=>1.2],
[self::T_SIEGE=>0.8],
['계략을 사용하는 병종입니다.'],
null, null, null
],
[
1401, self::T_WIZARD, '신귀병',
80, 80, 7, 20, 0.6, 10, 10,
[new ReqTech(1000), new ReqRegions('초')],
[self::T_SIEGE=>1.2],
[self::T_SIEGE=>0.8],
['신출귀몰한 귀병입니다.'],
null, null, null
],
[
1402, self::T_WIZARD, '백귀병',
80, 130, 7, 5, 0.6, 9, 11,
[new ReqTech(2000), new ReqCities('오환')],
[self::T_SIEGE=>1.2],
[self::T_SIEGE=>0.8],
['저렴하고 튼튼합니다.'],
null, null, null
],
[
1403, self::T_WIZARD, '흑귀병',
130, 80, 7, 5, 0.6, 11, 9,
[new ReqTech(2000), new ReqCities('왜')],
[self::T_SIEGE=>1.2],
[self::T_SIEGE=>0.8],
['저렴하고 강력합니다.'],
null, null, null
],
[
1404, self::T_WIZARD, '악귀병',
130, 130, 7, 0, 0.6, 12, 12,
[new ReqTech(3000), new ReqCities('장안')],
[self::T_SIEGE=>1.2],
[self::T_SIEGE=>0.8],
['백병전에도 능숙합니다.'],
null, null, null
],
[
1405, self::T_WIZARD, '남귀병',
60, 60, 7, 10, 0.8, 8, 8,
[new ReqTech(1000)],
[self::T_SIEGE=>1.2],
[self::T_SIEGE=>0.8],
['전투를 포기하고 계략에 몰두합니다.'],
null, null, null
],
[
1406, self::T_WIZARD, '황귀병',
110, 110, 7, 0, 0.8, 13, 10,
[new ReqTech(3000), new ReqCities('낙양')],
[self::T_SIEGE=>1.2],
[self::T_SIEGE=>0.8],
['고도로 훈련된 귀병입니다.'],
null, null, null
],
[
1407, self::T_WIZARD, '천귀병',
80, 130, 7, 15, 0.6, 11, 12,
[new ReqTech(3000), new ReqCities('성도')],
[self::T_SIEGE=>1.2],
[self::T_SIEGE=>0.8],
['갑주를 두른 귀병입니다.'],
null, null, null
],
[
1408, self::T_WIZARD, '마귀병',
130, 80, 7, 15, 0.6, 12, 11,
[new ReqTech(3000), new ReqCities('업')],
[self::T_SIEGE=>1.2],
[self::T_SIEGE=>0.8],
['날카로운 무기를 가진 귀병입니다.'],
null, null, null
],
[
1500, self::T_SIEGE, '정란',
100, 100, 6, 0, 0, 14, 5,
0, null, null, 3,
[self::T_FOOTMAN=>1.25, self::T_ARCHER=>1.25, self::T_CAVALRY=>1.25, self::T_WIZARD=>1.25, self::T_CASTLE=>1.2, 1106=>1.112],
[self::T_FOOTMAN=>1.2, self::T_ARCHER=>1.2, self::T_CAVALRY=>1.2, self::T_WIZARD=>1.2, 1106=>1.067],
['높은 구조물 위에서 공격합니다. 첫 공격은 성벽을 향합니다.'],
['che_성벽부상무효'], ['che_선제사격시도', 'che_선제사격발동'], ['che_성벽선제']
],
[
1502, self::T_SIEGE, '벽력거',
150, 100, 6, 5, 0, 20, 5,
3000, ['업'], null, 0,
[self::T_FOOTMAN=>1.25, self::T_ARCHER=>1.25, self::T_CAVALRY=>1.25, self::T_WIZARD=>1.25, self::T_CASTLE=>1.2, 1106=>1.112],
[self::T_FOOTMAN=>1.2, self::T_ARCHER=>1.2, self::T_CAVALRY=>1.2, self::T_WIZARD=>1.2, 1106=>1.067],
['상대에게 돌덩이를 날립니다. 첫 공격은 성벽을 향합니다.'],
['che_성벽부상무효'], ['che_선제사격시도', 'che_선제사격발동'], ['che_성벽선제']
],
[
1503, self::T_SIEGE, '목우',
50, 200, 5, 0, 0, 15, 5,
3000, ['성도'], null, 0,
[self::T_FOOTMAN=>1, self::T_ARCHER=>1, self::T_CAVALRY=>1, self::T_WIZARD=>1, self::T_CASTLE=>1.2],
[self::T_FOOTMAN=>1, self::T_ARCHER=>1, self::T_CAVALRY=>1, self::T_WIZARD=>1, 1106=>1],
['상대를 저지하는 특수병기입니다.'],
['che_성벽부상무효'], ['che_저지시도', 'che_저지발동'], null
]
];
[
1500, self::T_SIEGE, '정란',
100, 100, 6, 0, 0, 14, 5,
[new ReqMinRelYear(3)],
[self::T_FOOTMAN=>1.25, self::T_ARCHER=>1.25, self::T_CAVALRY=>1.25, self::T_WIZARD=>1.25, self::T_CASTLE=>1.2, 1106=>1.112],
[self::T_FOOTMAN=>1.2, self::T_ARCHER=>1.2, self::T_CAVALRY=>1.2, self::T_WIZARD=>1.2, 1106=>1.067],
['높은 구조물 위에서 공격합니다. 첫 공격은 성벽을 향합니다.'],
['che_성벽부상무효'], ['che_선제사격시도', 'che_선제사격발동'], ['che_성벽선제']
],
[
1502, self::T_SIEGE, '벽력거',
150, 100, 6, 5, 0, 20, 5,
[new ReqTech(3000), new ReqCities('업')],
[self::T_FOOTMAN=>1.25, self::T_ARCHER=>1.25, self::T_CAVALRY=>1.25, self::T_WIZARD=>1.25, self::T_CASTLE=>1.2, 1106=>1.112],
[self::T_FOOTMAN=>1.2, self::T_ARCHER=>1.2, self::T_CAVALRY=>1.2, self::T_WIZARD=>1.2, 1106=>1.067],
['상대에게 돌덩이를 날립니다. 첫 공격은 성벽을 향합니다.'],
['che_성벽부상무효'], ['che_선제사격시도', 'che_선제사격발동'], ['che_성벽선제']
],
[
1503, self::T_SIEGE, '목우',
50, 200, 5, 0, 0, 15, 5,
[new ReqTech(3000), new ReqCities('성도')],
[self::T_FOOTMAN=>1, self::T_ARCHER=>1, self::T_CAVALRY=>1, self::T_WIZARD=>1, self::T_CASTLE=>1.2],
[self::T_FOOTMAN=>1, self::T_ARCHER=>1, self::T_CAVALRY=>1, self::T_WIZARD=>1, 1106=>1],
['상대를 저지하는 특수병기입니다.'],
['che_성벽부상무효'], ['che_저지시도', 'che_저지발동'], null
]
];
}
}
+209 -200
View File
@@ -2,209 +2,218 @@
namespace sammo;
use sammo\GameUnitConstraint\Impossible;
use sammo\GameUnitConstraint\ReqCities;
use sammo\GameUnitConstraint\ReqMinRelYear;
use sammo\GameUnitConstraint\ReqRegions;
use sammo\GameUnitConstraint\ReqTech;
class GameUnitConst extends GameUnitConstBase
{
const DEFAULT_CREWTYPE = 1100;
protected static $_buildData = [
[
1000, self::T_CASTLE, '성벽',
100, 100, 7, 0, 0, 99, 9,
999999, null, null, 999999,
[], //성벽은 공격할 수 없다.
[self::T_FOOTMAN => 1.2],
['성벽입니다.', '생성할 수 없습니다.'],
null, null, null
],
protected static function getBuildData(): array
{
return [
[
1000, self::T_CASTLE, '성벽',
100, 100, 7, 0, 0, 99, 9,
[new Impossible()],
[], //성벽은 공격할 수 없다.
[self::T_FOOTMAN => 1.2],
['성벽입니다.', '생성할 수 없습니다.'],
null, null, null
],
[
1100, self::T_FOOTMAN, '보병',
100, 150, 7, 10, 0, 9, 9,
0, null, null, 0,
[self::T_ARCHER => 1.2, self::T_CAVALRY => 0.8, self::T_SIEGE => 1.2],
[self::T_ARCHER => 0.8, self::T_CAVALRY => 1.2, self::T_SIEGE => 0.8],
['표준적인 보병입니다.', '보병은 방어특화이며,', '상대가 회피하기 어렵습니다.'],
null, null, null
],
[
1200, self::T_ARCHER, '궁병',
100, 100, 7, 10, 0, 10, 10,
0, null, null, 0,
[self::T_CAVALRY => 1.2, self::T_FOOTMAN => 0.8, self::T_SIEGE => 1.2],
[self::T_CAVALRY => 0.8, self::T_FOOTMAN => 1.2, self::T_SIEGE => 0.8],
['표준적인 궁병입니다.', '궁병은 선제사격을 하는 병종입니다.'],
null, ['che_선제사격시도', 'che_선제사격발동'], null
],
[
1300, self::T_CAVALRY, '기병',
150, 100, 7, 5, 0, 11, 11,
0, null, null, 0,
[self::T_FOOTMAN => 1.2, self::T_ARCHER => 0.8, self::T_SIEGE => 1.2],
[self::T_FOOTMAN => 0.8, self::T_ARCHER => 1.2, self::T_SIEGE => 0.8],
['표준적인 기병입니다.', '기병은 공격특화입니다.'],
null, null, null
],
[
1104, self::T_FOOTMAN, '근위병',
150, 200, 7, 10, 0, 12, 12,
2000, ['낙양'], null, 0,
[self::T_ARCHER => 1.2, self::T_CAVALRY => 0.8, self::T_SIEGE => 1.2],
[self::T_ARCHER => 0.8, self::T_CAVALRY => 1.2, self::T_SIEGE => 0.8],
['최강의 보병입니다.'],
null, ['che_방어력증가5p'], null
],
[
1106, self::T_FOOTMAN, '백이병',
175, 175, 7, 5, 0, 13, 11,
2000, ['성도'], null, 0,
[self::T_ARCHER => 1.1, self::T_CAVALRY => 0.9, self::T_SIEGE => 1.1],
[self::T_ARCHER => 0.9, self::T_CAVALRY => 1.1, self::T_SIEGE => 0.9],
['정예 보병입니다. 불리한 싸움도 버텨냅니다.'],
null, ['che_방어력증가5p'], null
],
[
97201, self::T_ARCHER, '화랑',
175, 150, 8, 15, 0.05, 13, 13,
2000, ['한', '서라벌'], null, 0,
[self::T_CAVALRY => 1.2, self::T_FOOTMAN => 0.9, self::T_SIEGE => 1.2],
[self::T_CAVALRY => 0.8, self::T_FOOTMAN => 1.1, self::T_SIEGE => 0.8],
['특수한 궁병입니다.'],
null, ['che_선제사격시도', 'che_선제사격발동'], null
],
[
1204, self::T_ARCHER, '석궁병',
200, 125, 7, 10, 0, 13, 13,
2000, ['건업'], null, 0,
[self::T_CAVALRY => 1.2, self::T_FOOTMAN => 0.8, self::T_SIEGE => 1.2],
[self::T_CAVALRY => 0.8, self::T_FOOTMAN => 1.2, self::T_SIEGE => 0.8],
['강력한 화살을 쏩니다.'],
null, ['che_선제사격시도', 'che_선제사격발동'], null
],
[
1303, self::T_CAVALRY, '돌격기병',
200, 125, 8, 10, 0, 13, 12,
2000, ['서량', '안정'], null, 0,
[self::T_FOOTMAN => 1.2, self::T_ARCHER => 0.8, self::T_SIEGE => 1.2],
[self::T_FOOTMAN => 0.8, self::T_ARCHER => 1.2, self::T_SIEGE => 0.8],
['저돌적으로 공격합니다.'],
null, ['che_기병병종전투'], null
],
[
1307, self::T_CAVALRY, '호표기병',
200, 150, 7, 5, 0, 14, 14,
2000, ['허창'], null, 0,
[self::T_FOOTMAN => 1.2, self::T_ARCHER => 0.8, self::T_SIEGE => 1.2],
[self::T_FOOTMAN => 0.8, self::T_ARCHER => 1.2, self::T_SIEGE => 0.8],
['정예 기병입니다.'],
null, ['che_기병병종전투'], null
],
[
1306, self::T_CAVALRY, '맹수병',
250, 175, 6, 0, 0, 16, 16,
2000, ['운남'], null, 0,
[self::T_FOOTMAN => 1.2, self::T_ARCHER => 0.8, self::T_SIEGE => 1.2],
[self::T_FOOTMAN => 0.8, self::T_ARCHER => 1.2, self::T_SIEGE => 0.8],
['어느 누구보다 강력합니다.'],
null, ['che_기병병종전투'], null
],
[
1400, self::T_WIZARD, '귀병',
80, 80, 7, 5, 0.5, 9, 9,
0, null, null, 0,
[self::T_SIEGE => 1.2],
[self::T_SIEGE => 0.8],
['계략을 사용하는 병종입니다.'],
null, null, null
],
[
1405, self::T_WIZARD, '남귀병',
60, 60, 7, 10, 0.8, 8, 8,
1000, null, null, 0,
[self::T_SIEGE => 1.2],
[self::T_SIEGE => 0.8],
['전투를 포기하고 계략에 몰두합니다.'],
null, null, null
],
[
1404, self::T_WIZARD, '악귀병',
130, 130, 7, 0, 0.6, 12, 12,
2000, ['장안'], null, 0,
[self::T_SIEGE => 1.2],
[self::T_SIEGE => 0.8],
['백병전에도 능숙합니다.'],
null, null, null
],
[
1407, self::T_WIZARD, '천귀병',
90, 130, 7, 15, 0.6, 11, 12,
2000, ['성도'], null, 0,
[self::T_SIEGE => 1.2],
[self::T_SIEGE => 0.8],
['갑주를 두른 귀병입니다.'],
null, null, null
],
[
1500, self::T_SIEGE, '정란',
100, 100, 6, 0, 0, 14, 5,
0, null, null, 3,
[self::T_FOOTMAN => 1.25, self::T_ARCHER => 1.25, self::T_CAVALRY => 1.25, self::T_WIZARD => 1.25, self::T_CASTLE => 1.8, 1106 => 1.112],
[self::T_FOOTMAN => 1.2, self::T_ARCHER => 1.2, self::T_CAVALRY => 1.2, self::T_WIZARD => 1.2],
['높은 구조물 위에서 공격합니다.'],
['che_성벽부상무효'], ['che_선제사격시도', 'che_선제사격발동'], null
],
[
1501, self::T_SIEGE, '충차',
150, 100, 6, 0, 0, 20, 5,
1000, null, null, 3,
[self::T_FOOTMAN => 0.8, self::T_ARCHER => 0.8, self::T_CAVALRY => 0.8, self::T_WIZARD => 0.8, self::T_CASTLE => 2.4],
[self::T_FOOTMAN => 1.2, self::T_ARCHER => 1.2, self::T_CAVALRY => 1.2, self::T_WIZARD => 1.2],
['엄청난 위력으로 성벽을 부수어버립니다.'],
['che_성벽부상무효'], null, null
],
[
1502, self::T_SIEGE, '벽력거',
135, 100, 6, 5, 0, 20, 5,
2000, ['업'], null, 0,
[self::T_FOOTMAN => 1.25, self::T_ARCHER => 1.25, self::T_CAVALRY => 1.25, self::T_WIZARD => 1.25, self::T_CASTLE => 1.8, 1106 => 1.112],
[self::T_FOOTMAN => 0.833, self::T_ARCHER => 0.833, self::T_CAVALRY => 0.833, self::T_WIZARD => 0.833, 1106 => 0.909],
['상대에게 돌덩이를 날립니다.'],
['che_성벽부상무효'], ['che_선제사격시도', 'che_선제사격발동'], null
],
[
97101, self::T_FOOTMAN, '중장보병',
150, 175, 7, 10, 0, 12, 12,
3000, null, null, 0,
[self::T_ARCHER => 1.2, self::T_CAVALRY => 0.8, self::T_SIEGE => 1.2],
[self::T_ARCHER => 0.8, self::T_CAVALRY => 1.2, self::T_SIEGE => 0.8],
['전천후 보병입니다.'],
null, ['che_방어력증가5p'], null
],
[
1202, self::T_ARCHER, '연노병',
150, 175, 8, 10, 0, 12, 12,
3000, null, null, 0,
[self::T_CAVALRY => 1.2, self::T_FOOTMAN => 0.8, self::T_SIEGE => 1.2],
[self::T_CAVALRY => 0.8, self::T_FOOTMAN => 1.2, self::T_SIEGE => 0.8],
['화살을 연사합니다.'],
null, ['che_선제사격시도', 'che_선제사격발동'], null
],
[
1304, self::T_CAVALRY, '철기병',
175, 175, 7, 5, 0, 13, 13,
3000, null, null, 0,
[self::T_FOOTMAN => 1.2, self::T_ARCHER => 0.8, self::T_SIEGE => 1.2],
[self::T_FOOTMAN => 0.8, self::T_ARCHER => 1.2, self::T_SIEGE => 0.8],
['철갑을 두른 기병입니다.'],
null, ['che_기병병종전투'], null
],
[
1401, self::T_WIZARD, '신귀병',
100, 100, 7, 20, 0.6, 12, 12,
3000, null, null, 0,
[self::T_SIEGE => 1.2],
[self::T_SIEGE => 0.8],
['신출귀몰한 귀병입니다.'],
null, null, null
],
];
[
1100, self::T_FOOTMAN, '보병',
100, 150, 7, 10, 0, 9, 9,
[],
[self::T_ARCHER => 1.2, self::T_CAVALRY => 0.8, self::T_SIEGE => 1.2],
[self::T_ARCHER => 0.8, self::T_CAVALRY => 1.2, self::T_SIEGE => 0.8],
['표준적인 보병입니다.', '보병은 방어특화이며,', '상대가 회피하기 어렵습니다.'],
null, null, null
],
[
1200, self::T_ARCHER, '궁병',
100, 100, 7, 10, 0, 10, 10,
[],
[self::T_CAVALRY => 1.2, self::T_FOOTMAN => 0.8, self::T_SIEGE => 1.2],
[self::T_CAVALRY => 0.8, self::T_FOOTMAN => 1.2, self::T_SIEGE => 0.8],
['표준적인 궁병입니다.', '궁병은 선제사격을 하는 병종입니다.'],
null, ['che_선제사격시도', 'che_선제사격발동'], null
],
[
1300, self::T_CAVALRY, '기병',
150, 100, 7, 5, 0, 11, 11,
[],
[self::T_FOOTMAN => 1.2, self::T_ARCHER => 0.8, self::T_SIEGE => 1.2],
[self::T_FOOTMAN => 0.8, self::T_ARCHER => 1.2, self::T_SIEGE => 0.8],
['표준적인 기병입니다.', '기병은 공격특화입니다.'],
null, null, null
],
[
1104, self::T_FOOTMAN, '근위병',
150, 200, 7, 10, 0, 12, 12,
[new ReqTech(2000), new ReqCities('낙양')],
[self::T_ARCHER => 1.2, self::T_CAVALRY => 0.8, self::T_SIEGE => 1.2],
[self::T_ARCHER => 0.8, self::T_CAVALRY => 1.2, self::T_SIEGE => 0.8],
['최강의 보병입니다.'],
null, ['che_방어력증가5p'], null
],
[
1106, self::T_FOOTMAN, '백이병',
175, 175, 7, 5, 0, 13, 11,
[new ReqTech(2000), new ReqCities('성도')],
[self::T_ARCHER => 1.1, self::T_CAVALRY => 0.9, self::T_SIEGE => 1.1],
[self::T_ARCHER => 0.9, self::T_CAVALRY => 1.1, self::T_SIEGE => 0.9],
['정예 보병입니다. 불리한 싸움도 버텨냅니다.'],
null, ['che_방어력증가5p'], null
],
[
97201, self::T_ARCHER, '화랑',
175, 150, 8, 15, 0.05, 13, 13,
[new ReqTech(2000), new ReqCities('한', '서라벌')],
[self::T_CAVALRY => 1.2, self::T_FOOTMAN => 0.9, self::T_SIEGE => 1.2],
[self::T_CAVALRY => 0.8, self::T_FOOTMAN => 1.1, self::T_SIEGE => 0.8],
['특수한 궁병입니다.'],
null, ['che_선제사격시도', 'che_선제사격발동'], null
],
[
1204, self::T_ARCHER, '석궁병',
200, 125, 7, 10, 0, 13, 13,
[new ReqTech(2000), new ReqCities('건업')],
[self::T_CAVALRY => 1.2, self::T_FOOTMAN => 0.8, self::T_SIEGE => 1.2],
[self::T_CAVALRY => 0.8, self::T_FOOTMAN => 1.2, self::T_SIEGE => 0.8],
['강력한 화살을 쏩니다.'],
null, ['che_선제사격시도', 'che_선제사격발동'], null
],
[
1303, self::T_CAVALRY, '돌격기병',
200, 125, 8, 10, 0, 13, 12,
[new ReqTech(2000), new ReqCities('서량', '안정')],
[self::T_FOOTMAN => 1.2, self::T_ARCHER => 0.8, self::T_SIEGE => 1.2],
[self::T_FOOTMAN => 0.8, self::T_ARCHER => 1.2, self::T_SIEGE => 0.8],
['저돌적으로 공격합니다.'],
null, ['che_기병병종전투'], null
],
[
1307, self::T_CAVALRY, '호표기병',
200, 150, 7, 5, 0, 14, 14,
[new ReqTech(2000), new ReqCities('허창')],
[self::T_FOOTMAN => 1.2, self::T_ARCHER => 0.8, self::T_SIEGE => 1.2],
[self::T_FOOTMAN => 0.8, self::T_ARCHER => 1.2, self::T_SIEGE => 0.8],
['정예 기병입니다.'],
null, ['che_기병병종전투'], null
],
[
1306, self::T_CAVALRY, '맹수병',
250, 175, 6, 0, 0, 16, 16,
[new ReqTech(2000), new ReqCities('운남')],
[self::T_FOOTMAN => 1.2, self::T_ARCHER => 0.8, self::T_SIEGE => 1.2],
[self::T_FOOTMAN => 0.8, self::T_ARCHER => 1.2, self::T_SIEGE => 0.8],
['어느 누구보다 강력합니다.'],
null, ['che_기병병종전투'], null
],
[
1400, self::T_WIZARD, '귀병',
80, 80, 7, 5, 0.5, 9, 9,
[],
[self::T_SIEGE => 1.2],
[self::T_SIEGE => 0.8],
['계략을 사용하는 병종입니다.'],
null, null, null
],
[
1405, self::T_WIZARD, '남귀병',
60, 60, 7, 10, 0.8, 8, 8,
[new ReqTech(1000)],
[self::T_SIEGE => 1.2],
[self::T_SIEGE => 0.8],
['전투를 포기하고 계략에 몰두합니다.'],
null, null, null
],
[
1404, self::T_WIZARD, '악귀병',
130, 130, 7, 0, 0.6, 12, 12,
[new ReqTech(2000), new ReqCities('장안')],
[self::T_SIEGE => 1.2],
[self::T_SIEGE => 0.8],
['백병전에도 능숙합니다.'],
null, null, null
],
[
1407, self::T_WIZARD, '천귀병',
90, 130, 7, 15, 0.6, 11, 12,
[new ReqTech(2000), new ReqCities('성도')],
[self::T_SIEGE => 1.2],
[self::T_SIEGE => 0.8],
['갑주를 두른 귀병입니다.'],
null, null, null
],
[
1500, self::T_SIEGE, '정란',
100, 100, 6, 0, 0, 14, 5,
[new ReqMinRelYear(3)],
[self::T_FOOTMAN => 1.25, self::T_ARCHER => 1.25, self::T_CAVALRY => 1.25, self::T_WIZARD => 1.25, self::T_CASTLE => 1.8, 1106 => 1.112],
[self::T_FOOTMAN => 1.2, self::T_ARCHER => 1.2, self::T_CAVALRY => 1.2, self::T_WIZARD => 1.2],
['높은 구조물 위에서 공격합니다.'],
['che_성벽부상무효'], ['che_선제사격시도', 'che_선제사격발동'], null
],
[
1501, self::T_SIEGE, '충차',
150, 100, 6, 0, 0, 20, 5,
[new ReqTech(1000), new ReqMinRelYear(3)],
[self::T_FOOTMAN => 0.8, self::T_ARCHER => 0.8, self::T_CAVALRY => 0.8, self::T_WIZARD => 0.8, self::T_CASTLE => 2.4],
[self::T_FOOTMAN => 1.2, self::T_ARCHER => 1.2, self::T_CAVALRY => 1.2, self::T_WIZARD => 1.2],
['엄청난 위력으로 성벽을 부수어버립니다.'],
['che_성벽부상무효'], null, null
],
[
1502, self::T_SIEGE, '벽력거',
135, 100, 6, 5, 0, 20, 5,
[new ReqTech(2000), new ReqCities('업')],
[self::T_FOOTMAN => 1.25, self::T_ARCHER => 1.25, self::T_CAVALRY => 1.25, self::T_WIZARD => 1.25, self::T_CASTLE => 1.8, 1106 => 1.112],
[self::T_FOOTMAN => 0.833, self::T_ARCHER => 0.833, self::T_CAVALRY => 0.833, self::T_WIZARD => 0.833, 1106 => 0.909],
['상대에게 돌덩이를 날립니다.'],
['che_성벽부상무효'], ['che_선제사격시도', 'che_선제사격발동'], null
],
[
97101, self::T_FOOTMAN, '중장보병',
150, 175, 7, 10, 0, 12, 12,
[new ReqTech(3000)],
[self::T_ARCHER => 1.2, self::T_CAVALRY => 0.8, self::T_SIEGE => 1.2],
[self::T_ARCHER => 0.8, self::T_CAVALRY => 1.2, self::T_SIEGE => 0.8],
['전천후 보병입니다.'],
null, ['che_방어력증가5p'], null
],
[
1202, self::T_ARCHER, '연노병',
150, 175, 8, 10, 0, 12, 12,
[new ReqTech(3000)],
[self::T_CAVALRY => 1.2, self::T_FOOTMAN => 0.8, self::T_SIEGE => 1.2],
[self::T_CAVALRY => 0.8, self::T_FOOTMAN => 1.2, self::T_SIEGE => 0.8],
['화살을 연사합니다.'],
null, ['che_선제사격시도', 'che_선제사격발동'], null
],
[
1304, self::T_CAVALRY, '철기병',
175, 175, 7, 5, 0, 13, 13,
[new ReqTech(3000)],
[self::T_FOOTMAN => 1.2, self::T_ARCHER => 0.8, self::T_SIEGE => 1.2],
[self::T_FOOTMAN => 0.8, self::T_ARCHER => 1.2, self::T_SIEGE => 0.8],
['철갑을 두른 기병입니다.'],
null, ['che_기병병종전투'], null
],
[
1401, self::T_WIZARD, '신귀병',
100, 100, 7, 20, 0.6, 12, 12,
[new ReqTech(3000)],
[self::T_SIEGE => 1.2],
[self::T_SIEGE => 0.8],
['신출귀몰한 귀병입니다.'],
null, null, null
],
];
}
}
+425 -421
View File
@@ -1,6 +1,12 @@
<?php
namespace sammo;
use sammo\GameUnitConstraint\Impossible;
use sammo\GameUnitConstraint\ReqTech;
use sammo\GameUnitConstraint\ReqCities;
use sammo\GameUnitConstraint\ReqRegions;
use sammo\GameUnitConstraint\ReqMinRelYear;
class GameUnitConst extends GameUnitConstBase
{
const DEFAULT_CREWTYPE = 217100;
@@ -13,427 +19,425 @@ class GameUnitConst extends GameUnitConstBase
self::T_SIEGE => '차병',
];
protected static $_buildData = [
[
1000, self::T_CASTLE, '성벽',
100, 100, 7, 0, 0, 99, 9,
999999, null, null, 999999,
[],//성벽은 공격할 수 없다.
[self::T_FOOTMAN=>1.2],
['성벽입니다.','생성할 수 없습니다.'],
null, null, null
],
protected static function getBuildData(): array
{
return [
[
1000, self::T_CASTLE, '성벽',
100, 100, 7, 0, 0, 99, 9,
[new Impossible()],
[], //성벽은 공격할 수 없다.
[self::T_FOOTMAN=>1.2],
['성벽입니다.','생성할 수 없습니다.'],
null, null, null
],
[
217100, self::T_FOOTMAN, '보병',
100, 150, 7, 10, 0, 9, 9,
[],
[self::T_ARCHER=>1.2, self::T_CAVALRY=>0.8, self::T_SIEGE=>1.2, 217502=>1],
[self::T_ARCHER=>0.8, self::T_CAVALRY=>1.2, self::T_SIEGE=>0.8, 217502=>1],
["표준적인 보병입니다. 보병은 방어특화입니다."],
null, ['che_방어력증가5p'], null
],
[
217101, self::T_FOOTMAN, '마물병',
110, 160, 7, 10, 0, 9, 10,
[new ReqRegions('호넷 마인령', '케이브리스 마인령')],
[self::T_ARCHER=>1.2, self::T_CAVALRY=>0.8, self::T_SIEGE=>1.2, 217502=>1],
[self::T_ARCHER=>0.8, self::T_CAVALRY=>1.2, self::T_SIEGE=>0.8, 217502=>1],
["마군 지역 기본병종입니다. 조금더 강하지만 쌀을 많이 소비합니다."],
null, ['che_방어력증가5p'], null
],
[
217102, self::T_FOOTMAN, '중장보병',
100, 250, 7, 5, 0, 13, 10,
[new ReqTech(1000), new ReqRegions('헬만 동부')],
[self::T_ARCHER=>1.2, self::T_CAVALRY=>0.8, self::T_SIEGE=>1.2, 217502=>1],
[self::T_ARCHER=>0.8, self::T_CAVALRY=>1.2, self::T_SIEGE=>0.8, 217502=>1],
["헬만 특유의 견고한 보병입니다."],
null, ['che_방어력증가5p'], null
],
[
217103, self::T_FOOTMAN, '흑의 군 보병',
150, 150, 7, 10, 0, 12, 11,
[new ReqTech(1000), new ReqRegions('리자스 남부', '리자스 북부')],
[self::T_ARCHER=>1.2, self::T_CAVALRY=>0.8, self::T_SIEGE=>1.2, 217502=>1],
[self::T_ARCHER=>0.8, self::T_CAVALRY=>1.2, self::T_SIEGE=>0.8, 217502=>1],
["흑의 군 전통의 체계적인 훈련으로 공격력을 보완했습니다."],
null, ['che_방어력증가5p'], null
],
[
217104, self::T_FOOTMAN, '용병',
125, 175, 7, 10, 0, 12, 11,
[new ReqTech(1000), new ReqRegions('자유도시 동부')],
[self::T_ARCHER=>1.2, self::T_CAVALRY=>0.8, self::T_SIEGE=>1.2, 217502=>1],
[self::T_ARCHER=>0.8, self::T_CAVALRY=>1.2, self::T_SIEGE=>0.8, 217502=>1],
["일반 보병보다 비싸지만 받은 만큼은 일해줍니다."],
null, ['che_방어력증가5p'], null
],
[
217105, self::T_FOOTMAN, '사메라이',
175, 150, 7, 0, 0, 11, 10,
[new ReqTech(1000), new ReqRegions('제스 남부')],
[self::T_ARCHER=>1.2, self::T_CAVALRY=>0.8, self::T_SIEGE=>1.2, 217502=>1],
[self::T_ARCHER=>0.8, self::T_CAVALRY=>1.2, self::T_SIEGE=>0.8, 217502=>1],
["검으로 난무를 가하는 몬스터 보병입니다."],
null, ['che_방어력증가5p'], null
],
[
217106, self::T_FOOTMAN, '템플나이트병',
75, 275, 7, 0, 0, 11, 12,
[new ReqTech(1000), new ReqRegions('AL교')],
[self::T_ARCHER=>1.2, self::T_CAVALRY=>0.8, self::T_SIEGE=>1.2, 217502=>1],
[self::T_ARCHER=>0.8, self::T_CAVALRY=>1.2, self::T_SIEGE=>0.8, 217502=>1],
["공격을 포기하고 오직 방어에만 집중합니다."],
null, ['che_방어력증가5p'], null
],
[
217107, self::T_FOOTMAN, '메이드병',
150, 150, 7, 20, 0, 13, 11,
[new ReqTech(2000), new ReqCities('메이드의 묘지')],
[self::T_ARCHER=>1.2, self::T_CAVALRY=>0.8, self::T_SIEGE=>1.2, 217502=>1],
[self::T_ARCHER=>0.8, self::T_CAVALRY=>1.2, self::T_SIEGE=>0.8, 217502=>1],
["켓셀링크 휘하의 날렵한 전투메이드입니다."],
null, ['che_방어력증가5p'], null
],
[
217108, self::T_FOOTMAN, '요괴병',
150, 150, 8, 0, 0, 11, 13,
[new ReqTech(2000), new ReqCities('오슈')],
[self::T_ARCHER=>1.2, self::T_CAVALRY=>0.8, self::T_SIEGE=>1.2, 217502=>1],
[self::T_ARCHER=>0.8, self::T_CAVALRY=>1.2, self::T_SIEGE=>0.8, 217502=>1],
["단단한 육체를 믿고 적진을 돌파합니다."],
null, ['che_방어력증가5p'], null
],
[
217109, self::T_FOOTMAN, '리자스 친위병',
150, 200, 7, 10, 0, 12, 12,
[new ReqTech(3000), new ReqCities('리자스성')],
[self::T_ARCHER=>1.2, self::T_CAVALRY=>0.8, self::T_SIEGE=>1.2, 217502=>1],
[self::T_ARCHER=>0.8, self::T_CAVALRY=>1.2, self::T_SIEGE=>0.8, 217502=>1],
["여왕을 수호하는 리자스 최강의 보병 정예보병입니다."],
null, ['che_방어력증가5p'], null
],
[
217110, self::T_FOOTMAN, '케이브리스 마물병',
200, 150, 7, 5, 0, 13, 14,
[new ReqTech(3000), new ReqCities('케이브리스의 성')],
[self::T_ARCHER=>1.2, self::T_CAVALRY=>0.8, self::T_SIEGE=>1.2, 217502=>1],
[self::T_ARCHER=>0.8, self::T_CAVALRY=>1.2, self::T_SIEGE=>0.8, 217502=>1],
["케이브리스 직속의 마물 정예 전투보병입니다."],
null, ['che_방어력증가5p'], null
],
[
217111, self::T_FOOTMAN, '투신',
200, 300, 7, 5, 0, 28, 23,
[new ReqTech(5000), new ReqCities('투신도시')],
[self::T_ARCHER=>1.2, self::T_CAVALRY=>0.8, self::T_SIEGE=>1.2, 217502=>1],
[self::T_ARCHER=>0.8, self::T_CAVALRY=>1.2, self::T_SIEGE=>0.8, 217502=>1],
["성마교단 유적에서 발굴된 사상 최강의 보병입니다."],
null, ['che_방어력증가5p'], null
],
[
217200, self::T_ARCHER, '궁병',
100, 100, 7, 20, 0, 10, 10,
[],
[ self::T_FOOTMAN=>0.8, self::T_CAVALRY=>1.2, self::T_SIEGE=>1.2, 217502=>1],
[ self::T_FOOTMAN=>1.2, self::T_CAVALRY=>0.8, self::T_SIEGE=>0.8, 217502=>1],
["표준적인 궁병입니다. 궁병은 회피특화입니다."],
null, null, null
],
[
217201, self::T_ARCHER, '투척마물병',
150, 100, 7, 10, 0, 11, 12,
[new ReqTech(1000), new ReqRegions('호넷 마인령')],
[ self::T_FOOTMAN=>0.8, self::T_CAVALRY=>1.2, self::T_SIEGE=>1.2, 217502=>1],
[ self::T_FOOTMAN=>1.2, self::T_CAVALRY=>0.8, self::T_SIEGE=>0.8, 217502=>1],
["날렵함을 포기하고 도끼를 투척합니다."],
null, null, null
],
[
217202, self::T_ARCHER, '백의 군 궁병',
100, 100, 8, 30, 0, 11, 11,
[new ReqTech(1000), new ReqRegions('리자스 남부')],
[ self::T_FOOTMAN=>0.8, self::T_CAVALRY=>1.2, self::T_SIEGE=>1.2, 217502=>1],
[ self::T_FOOTMAN=>1.2, self::T_CAVALRY=>0.8, self::T_SIEGE=>0.8, 217502=>1],
["전략을 활용하여 치고 빠지기에 능합니다."],
null, null, null
],
[
217203, self::T_ARCHER, '벌레술사병',
100, 150, 7, 20, 0, 12, 12,
[new ReqTech(2000), new ReqCities('호박성')],
[ self::T_FOOTMAN=>0.8, self::T_CAVALRY=>1.2, self::T_SIEGE=>1.2, 217502=>1],
[ self::T_FOOTMAN=>1.2, self::T_CAVALRY=>0.8, self::T_SIEGE=>0.8, 217502=>1],
["벌레들을 부려 몸을 보호하는 궁병입니다."],
null, null, null
],
[
217204, self::T_ARCHER, '저격암살병',
225, 75, 5, 10, 0, 14, 11,
[new ReqTech(2000), new ReqCities('블라디보스토크')],
[ self::T_FOOTMAN=>0.8, self::T_CAVALRY=>1.2, self::T_SIEGE=>1.2, 217502=>1],
[ self::T_FOOTMAN=>1.2, self::T_CAVALRY=>0.8, self::T_SIEGE=>0.8, 217502=>1],
["독을 바른 탄환으로 적의 목숨을 앗아갑니다."],
null, null, null
],
[
217205, self::T_ARCHER, '호루스병',
150, 100, 8, 20, 0, 11, 12,
[new ReqTech(2000), new ReqCities('거대전함')],
[ self::T_FOOTMAN=>0.8, self::T_CAVALRY=>1.2, self::T_SIEGE=>1.2, 217502=>1],
[ self::T_FOOTMAN=>1.2, self::T_CAVALRY=>0.8, self::T_SIEGE=>0.8, 217502=>1],
["민첩하게 파고드는 호루스족 궁병입니다."],
null, null, null
],
[
217206, self::T_ARCHER, '튤립병',
200, 100, 7, 20, 0, 13, 13,
[new ReqTech(3000), new ReqCities('커스텀')],
[ self::T_FOOTMAN=>0.8, self::T_CAVALRY=>1.2, self::T_SIEGE=>1.2, 217502=>1],
[ self::T_FOOTMAN=>1.2, self::T_CAVALRY=>0.8, self::T_SIEGE=>0.8, 217502=>1],
["최첨단병기 튤립으로 적을 폭격합니다."],
null, null, null
],
[
217207, self::T_ARCHER, '아이스플레임 궁병',
150, 150, 7, 20, 0, 13, 13,
[new ReqTech(3000), new ReqCities('라그나로크 아크')],
[ self::T_FOOTMAN=>0.8, self::T_CAVALRY=>1.2, self::T_SIEGE=>1.2, 217502=>1],
[ self::T_FOOTMAN=>1.2, self::T_CAVALRY=>0.8, self::T_SIEGE=>0.8, 217502=>1],
["혁명을 성공으로 이끈 정예 게릴라 궁병입니다."],
null, null, null
],
[
217208, self::T_ARCHER, '카라 궁병',
225, 225, 7, 30, 0, 25, 25,
[new ReqTech(5000), new ReqCities('펜실 카우')],
[ self::T_FOOTMAN=>0.8, self::T_CAVALRY=>1.2, self::T_SIEGE=>1.2, 217502=>1],
[ self::T_FOOTMAN=>1.2, self::T_CAVALRY=>0.8, self::T_SIEGE=>0.8, 217502=>1],
["선조의 힘을 이어받은 최강의 카라 정예 궁병입니다."],
null, null, null
],
[
217100, self::T_FOOTMAN, '병',
100, 150, 7, 10, 0, 9, 9,
0, null, null, 0,
[self::T_ARCHER=>1.2, self::T_CAVALRY=>0.8, self::T_SIEGE=>1.2, 217502=>1],
[self::T_ARCHER=>0.8, self::T_CAVALRY=>1.2, self::T_SIEGE=>0.8, 217502=>1],
["표준적인 병입니다. 병은 방어특화입니다."],
null, ['che_방어력증가5p'], null
],
[
217101, self::T_FOOTMAN, '마물병',
110, 160, 7, 10, 0, 9, 10,
0, null, ["호넷 마인령","케이브리스 마인령"], 0,
[self::T_ARCHER=>1.2, self::T_CAVALRY=>0.8, self::T_SIEGE=>1.2, 217502=>1],
[self::T_ARCHER=>0.8, self::T_CAVALRY=>1.2, self::T_SIEGE=>0.8, 217502=>1],
["마군 지역 기본병종입니다. 조금더 강하지만 쌀을 많이 소비합니다."],
null, ['che_방어력증가5p'], null
],
[
217102, self::T_FOOTMAN, '중장보병',
100, 250, 7, 5, 0, 13, 10,
1000, null, ["헬만 동부"], 0,
[self::T_ARCHER=>1.2, self::T_CAVALRY=>0.8, self::T_SIEGE=>1.2, 217502=>1],
[self::T_ARCHER=>0.8, self::T_CAVALRY=>1.2, self::T_SIEGE=>0.8, 217502=>1],
["헬만 특유의 견고한 보병입니다."],
null, ['che_방어력증가5p'], null
],
[
217103, self::T_FOOTMAN, '흑의 군 보병',
150, 150, 7, 10, 0, 12, 11,
1000, null, ["리자스 남부","리자스 북부"], 0,
[self::T_ARCHER=>1.2, self::T_CAVALRY=>0.8, self::T_SIEGE=>1.2, 217502=>1],
[self::T_ARCHER=>0.8, self::T_CAVALRY=>1.2, self::T_SIEGE=>0.8, 217502=>1],
["흑의 군 전통의 체계적인 훈련으로 공격력을 보완했습니다."],
null, ['che_방어력증가5p'], null
],
[
217104, self::T_FOOTMAN, '병',
125, 175, 7, 10, 0, 12, 11,
1000, null, ["자유도시 동부"], 0,
[self::T_ARCHER=>1.2, self::T_CAVALRY=>0.8, self::T_SIEGE=>1.2, 217502=>1],
[self::T_ARCHER=>0.8, self::T_CAVALRY=>1.2, self::T_SIEGE=>0.8, 217502=>1],
["일반 보병보다 비싸지만 받은 만큼은 일해줍니다."],
null, ['che_방어력증가5p'], null
],
[
217105, self::T_FOOTMAN, '사메라이',
175, 150, 7, 0, 0, 11, 10,
1000, null, ["제스 남부"], 0,
[self::T_ARCHER=>1.2, self::T_CAVALRY=>0.8, self::T_SIEGE=>1.2, 217502=>1],
[self::T_ARCHER=>0.8, self::T_CAVALRY=>1.2, self::T_SIEGE=>0.8, 217502=>1],
["검으로 난무를 가하는 몬스터 보병입니다."],
null, ['che_방어력증가5p'], null
],
[
217106, self::T_FOOTMAN, '템플나이트병',
75, 275, 7, 0, 0, 11, 12,
1000, null, ["AL교"], 0,
[self::T_ARCHER=>1.2, self::T_CAVALRY=>0.8, self::T_SIEGE=>1.2, 217502=>1],
[self::T_ARCHER=>0.8, self::T_CAVALRY=>1.2, self::T_SIEGE=>0.8, 217502=>1],
["공격을 포기하고 오직 방어에만 집중합니다."],
null, ['che_방어력증가5p'], null
],
[
217107, self::T_FOOTMAN, '메이드병',
150, 150, 7, 20, 0, 13, 11,
2000, ["메이드의 묘지"], null, 0,
[self::T_ARCHER=>1.2, self::T_CAVALRY=>0.8, self::T_SIEGE=>1.2, 217502=>1],
[self::T_ARCHER=>0.8, self::T_CAVALRY=>1.2, self::T_SIEGE=>0.8, 217502=>1],
["켓셀링크 휘하의 날렵한 전투메이드입니다."],
null, ['che_방어력증가5p'], null
],
[
217108, self::T_FOOTMAN, '요괴병',
150, 150, 8, 0, 0, 11, 13,
2000, ["오슈"], null, 0,
[self::T_ARCHER=>1.2, self::T_CAVALRY=>0.8, self::T_SIEGE=>1.2, 217502=>1],
[self::T_ARCHER=>0.8, self::T_CAVALRY=>1.2, self::T_SIEGE=>0.8, 217502=>1],
["단단한 육체를 믿고 적진을 돌파합니다."],
null, ['che_방어력증가5p'], null
],
[
217109, self::T_FOOTMAN, '리자스 친위병',
150, 200, 7, 10, 0, 12, 12,
3000, ["리자스성"], null, 0,
[self::T_ARCHER=>1.2, self::T_CAVALRY=>0.8, self::T_SIEGE=>1.2, 217502=>1],
[self::T_ARCHER=>0.8, self::T_CAVALRY=>1.2, self::T_SIEGE=>0.8, 217502=>1],
["여왕을 수호하는 리자스 최강의 보병 정예보병입니다."],
null, ['che_방어력증가5p'], null
],
[
217110, self::T_FOOTMAN, '케이브리스 마물병',
200, 150, 7, 5, 0, 13, 14,
3000, ["케이브리스의 성"], null, 0,
[self::T_ARCHER=>1.2, self::T_CAVALRY=>0.8, self::T_SIEGE=>1.2, 217502=>1],
[self::T_ARCHER=>0.8, self::T_CAVALRY=>1.2, self::T_SIEGE=>0.8, 217502=>1],
["케이브리스 직속의 마물 정예 전투보병입니다."],
null, ['che_방어력증가5p'], null
],
[
217111, self::T_FOOTMAN, '투신',
200, 300, 7, 5, 0, 28, 23,
5000, ["투신도시"], null, 0,
[self::T_ARCHER=>1.2, self::T_CAVALRY=>0.8, self::T_SIEGE=>1.2, 217502=>1],
[self::T_ARCHER=>0.8, self::T_CAVALRY=>1.2, self::T_SIEGE=>0.8, 217502=>1],
["성마교단 유적에서 발굴된 사상 최강의 보병입니다."],
null, ['che_방어력증가5p'], null
],
[
217300, self::T_CAVALRY, '기동병',
150, 100, 7, 5, 0, 11, 11,
[],
[ self::T_FOOTMAN=>1.2, self::T_ARCHER=>0.8, self::T_SIEGE=>1.2, 217502=>1],
[ self::T_FOOTMAN=>0.8, self::T_ARCHER=>1.2, self::T_SIEGE=>0.8, 217502=>1],
["표준적인 기동병입니다. 기동병은 공격특화입니다."],
null, ['che_기병병종전투'], null
],
[
217301, self::T_CAVALRY, '하치온나',
175, 100, 7, 15, 0, 12, 12,
[new ReqTech(1000), new ReqRegions('자유도시 서부')],
[ self::T_FOOTMAN=>1.2, self::T_ARCHER=>0.8, self::T_SIEGE=>1.2, 217502=>1],
[ self::T_FOOTMAN=>0.8, self::T_ARCHER=>1.2, self::T_SIEGE=>0.8, 217502=>1],
["작은 몸으로 회피하며 따끔한 일격을 먹이는 몬스터 기동병입니다."],
null, ['che_기병병종전투'], null
],
[
217302, self::T_CAVALRY, '적의 군 기동병',
200, 100, 7, 5, 0, 12, 13,
[new ReqTech(1000), new ReqRegions('리자스 북부')],
[ self::T_FOOTMAN=>1.2, self::T_ARCHER=>0.8, self::T_SIEGE=>1.2, 217502=>1],
[ self::T_FOOTMAN=>0.8, self::T_ARCHER=>1.2, self::T_SIEGE=>0.8, 217502=>1],
["리자스군의 자랑인 기동부대입니다."],
null, ['che_기병병종전투'], null
],
[
217303, self::T_CAVALRY, '안드로이드 기동병',
175, 150, 7, 10, 0, 13, 12,
[new ReqTech(2000), new ReqCities('악의 탑')],
[ self::T_FOOTMAN=>1.2, self::T_ARCHER=>0.8, self::T_SIEGE=>1.2, 217502=>1],
[ self::T_FOOTMAN=>0.8, self::T_ARCHER=>1.2, self::T_SIEGE=>0.8, 217502=>1],
["파이아르가 개발한 최첨단 안드로이드 기동병입니다."],
null, ['che_기병병종전투'], null
],
[
217304, self::T_CAVALRY, '파란쵸 기동병',
200, 100, 8, 5, 0, 13, 11,
[new ReqTech(2000), new ReqCities('파란쵸 왕국')],
[ self::T_FOOTMAN=>1.2, self::T_ARCHER=>0.8, self::T_SIEGE=>1.2, 217502=>1],
[ self::T_FOOTMAN=>0.8, self::T_ARCHER=>1.2, self::T_SIEGE=>0.8, 217502=>1],
["적진을 일점돌파하는 파란쵸왕국의 돌격 기동병입니다. "],
null, ['che_기병병종전투'], null
],
[
217305, self::T_CAVALRY, '비행마물병',
150, 100, 8, 15, 0, 12, 12,
[new ReqTech(2000), new ReqCities('죽음의 대지')],
[ self::T_FOOTMAN=>1.2, self::T_ARCHER=>0.8, self::T_SIEGE=>1.2, 217502=>1],
[ self::T_FOOTMAN=>0.8, self::T_ARCHER=>1.2, self::T_SIEGE=>0.8, 217502=>1],
["비행마물에 올라탄 기동마물병입니다."],
null, ['che_기병병종전투'], null
],
[
217306, self::T_CAVALRY, '마물조련사병',
250, 200, 6, 0, 0, 16, 16,
[new ReqTech(3000), new ReqCities('랑그바우')],
[ self::T_FOOTMAN=>1.2, self::T_ARCHER=>0.8, self::T_SIEGE=>1.2, 217502=>1],
[ self::T_FOOTMAN=>0.8, self::T_ARCHER=>1.2, self::T_SIEGE=>0.8, 217502=>1],
["무시무시한 몬스터에 올라타서 싸우는 극강의 기동병입니다."],
null, ['che_기병병종전투'], null
],
[
217307, self::T_CAVALRY, '기마병',
200, 150, 7, 5, 0, 14, 14,
[new ReqTech(3000), new ReqCities('오와리')],
[ self::T_FOOTMAN=>1.2, self::T_ARCHER=>0.8, self::T_SIEGE=>1.2, 217502=>1],
[ self::T_FOOTMAN=>0.8, self::T_ARCHER=>1.2, self::T_SIEGE=>0.8, 217502=>1],
["JAPAN 특유의 기마에 올라타 적을 짓밟는 기동병입니다."],
null, ['che_기병병종전투'], null
],
[
217308, self::T_CAVALRY, '엔젤나이트',
300, 200, 7, 5, 0, 25, 25,
[new ReqTech(5000), new ReqCities('떨어진 궁도')],
[ self::T_FOOTMAN=>1.2, self::T_ARCHER=>0.8, self::T_SIEGE=>1.2, 217502=>1],
[ self::T_FOOTMAN=>0.8, self::T_ARCHER=>1.2, self::T_SIEGE=>0.8, 217502=>1],
["신의 명령으로 파멸을 내리기 위해 강림했습니다."],
null, ['che_기병병종전투'], null
],
[
217200, self::T_ARCHER, '병',
100, 100, 7, 20, 0, 10, 10,
0, null, null, 0,
[ self::T_FOOTMAN=>0.8, self::T_CAVALRY=>1.2, self::T_SIEGE=>1.2, 217502=>1],
[ self::T_FOOTMAN=>1.2, self::T_CAVALRY=>0.8, self::T_SIEGE=>0.8, 217502=>1],
["표준적인 궁병입니다. 궁병은 회피특화입니다."],
null, null, null
],
[
217201, self::T_ARCHER, '투척마물병',
150, 100, 7, 10, 0, 11, 12,
1000, null, ["호넷 마인령"], 0,
[ self::T_FOOTMAN=>0.8, self::T_CAVALRY=>1.2, self::T_SIEGE=>1.2, 217502=>1],
[ self::T_FOOTMAN=>1.2, self::T_CAVALRY=>0.8, self::T_SIEGE=>0.8, 217502=>1],
["날렵함을 포기하고 도끼를 투척합니다."],
null, null, null
],
[
217202, self::T_ARCHER, '백의 군 궁병',
100, 100, 8, 30, 0, 11, 11,
1000, null, ["리자스 남부"], 0,
[ self::T_FOOTMAN=>0.8, self::T_CAVALRY=>1.2, self::T_SIEGE=>1.2, 217502=>1],
[ self::T_FOOTMAN=>1.2, self::T_CAVALRY=>0.8, self::T_SIEGE=>0.8, 217502=>1],
["전략을 활용하여 치고 빠지기에 능합니다."],
null, null, null
],
[
217203, self::T_ARCHER, '벌레술사병',
100, 150, 7, 20, 0, 12, 12,
2000, ["호박성"], null, 0,
[ self::T_FOOTMAN=>0.8, self::T_CAVALRY=>1.2, self::T_SIEGE=>1.2, 217502=>1],
[ self::T_FOOTMAN=>1.2, self::T_CAVALRY=>0.8, self::T_SIEGE=>0.8, 217502=>1],
["벌레들을 부려 몸을 보호하는 궁병입니다."],
null, null, null
],
[
217204, self::T_ARCHER, '저격암살병',
225, 75, 5, 10, 0, 14, 11,
2000, ["블라디보스토크"], null, 0,
[ self::T_FOOTMAN=>0.8, self::T_CAVALRY=>1.2, self::T_SIEGE=>1.2, 217502=>1],
[ self::T_FOOTMAN=>1.2, self::T_CAVALRY=>0.8, self::T_SIEGE=>0.8, 217502=>1],
["독을 바른 탄환으로 적의 목숨을 앗아갑니다."],
null, null, null
],
[
217205, self::T_ARCHER, '호루스병',
150, 100, 8, 20, 0, 11, 12,
2000, ["거대전함"], null, 0,
[ self::T_FOOTMAN=>0.8, self::T_CAVALRY=>1.2, self::T_SIEGE=>1.2, 217502=>1],
[ self::T_FOOTMAN=>1.2, self::T_CAVALRY=>0.8, self::T_SIEGE=>0.8, 217502=>1],
["민첩하게 파고드는 호루스족 궁병입니다."],
null, null, null
],
[
217206, self::T_ARCHER, '튤립병',
200, 100, 7, 20, 0, 13, 13,
3000, ["커스텀"], null, 0,
[ self::T_FOOTMAN=>0.8, self::T_CAVALRY=>1.2, self::T_SIEGE=>1.2, 217502=>1],
[ self::T_FOOTMAN=>1.2, self::T_CAVALRY=>0.8, self::T_SIEGE=>0.8, 217502=>1],
["최첨단병기 튤립으로 적을 폭격합니다."],
null, null, null
],
[
217207, self::T_ARCHER, '아이스플레임 궁병',
150, 150, 7, 20, 0, 13, 13,
3000, ["라그나로크 아크"], null, 0,
[ self::T_FOOTMAN=>0.8, self::T_CAVALRY=>1.2, self::T_SIEGE=>1.2, 217502=>1],
[ self::T_FOOTMAN=>1.2, self::T_CAVALRY=>0.8, self::T_SIEGE=>0.8, 217502=>1],
["혁명을 성공으로 이끈 정예 게릴라 궁병입니다."],
null, null, null
],
[
217208, self::T_ARCHER, '카라 궁병',
225, 225, 7, 30, 0, 25, 25,
5000, ["펜실 카우"], null, 0,
[ self::T_FOOTMAN=>0.8, self::T_CAVALRY=>1.2, self::T_SIEGE=>1.2, 217502=>1],
[ self::T_FOOTMAN=>1.2, self::T_CAVALRY=>0.8, self::T_SIEGE=>0.8, 217502=>1],
["선조의 힘을 이어받은 최강의 카라 정예 궁병입니다."],
null, null, null
],
[
217300, self::T_CAVALRY, '기동병',
150, 100, 7, 5, 0, 11, 11,
0, null, null, 0,
[ self::T_FOOTMAN=>1.2, self::T_ARCHER=>0.8, self::T_SIEGE=>1.2, 217502=>1],
[ self::T_FOOTMAN=>0.8, self::T_ARCHER=>1.2, self::T_SIEGE=>0.8, 217502=>1],
["표준적인 기동병입니다. 기동병은 공격특화입니다."],
null, ['che_기병병종전투'], null
],
[
217301, self::T_CAVALRY, '하치온나',
175, 100, 7, 15, 0, 12, 12,
1000, null, ["자유도시 서부"], 0,
[ self::T_FOOTMAN=>1.2, self::T_ARCHER=>0.8, self::T_SIEGE=>1.2, 217502=>1],
[ self::T_FOOTMAN=>0.8, self::T_ARCHER=>1.2, self::T_SIEGE=>0.8, 217502=>1],
["작은 몸으로 회피하며 따끔한 일격을 먹이는 몬스터 기동병입니다."],
null, ['che_기병병종전투'], null
],
[
217302, self::T_CAVALRY, '적의 군 기동병',
200, 100, 7, 5, 0, 12, 13,
1000, null, ["리자스 북부"], 0,
[ self::T_FOOTMAN=>1.2, self::T_ARCHER=>0.8, self::T_SIEGE=>1.2, 217502=>1],
[ self::T_FOOTMAN=>0.8, self::T_ARCHER=>1.2, self::T_SIEGE=>0.8, 217502=>1],
["리자스군의 자랑인 기동부대입니다."],
null, ['che_기병병종전투'], null
],
[
217303, self::T_CAVALRY, '안드로이드 기동병',
175, 150, 7, 10, 0, 13, 12,
2000, ["악의 탑"], null, 0,
[ self::T_FOOTMAN=>1.2, self::T_ARCHER=>0.8, self::T_SIEGE=>1.2, 217502=>1],
[ self::T_FOOTMAN=>0.8, self::T_ARCHER=>1.2, self::T_SIEGE=>0.8, 217502=>1],
["파이아르가 개발한 최첨단 안드로이드 기동병입니다."],
null, ['che_기병병종전투'], null
],
[
217304, self::T_CAVALRY, '파란쵸 기동병',
200, 100, 8, 5, 0, 13, 11,
2000, ["파란쵸 왕국"], null, 0,
[ self::T_FOOTMAN=>1.2, self::T_ARCHER=>0.8, self::T_SIEGE=>1.2, 217502=>1],
[ self::T_FOOTMAN=>0.8, self::T_ARCHER=>1.2, self::T_SIEGE=>0.8, 217502=>1],
["적진을 일점돌파하는 파란쵸왕국의 돌격 기동병입니다. "],
null, ['che_기병병종전투'], null
],
[
217305, self::T_CAVALRY, '비행마물병',
150, 100, 8, 15, 0, 12, 12,
2000, ["죽음의 대지"], null, 0,
[ self::T_FOOTMAN=>1.2, self::T_ARCHER=>0.8, self::T_SIEGE=>1.2, 217502=>1],
[ self::T_FOOTMAN=>0.8, self::T_ARCHER=>1.2, self::T_SIEGE=>0.8, 217502=>1],
["비행마물에 올라탄 기동마물병입니다."],
null, ['che_기병병종전투'], null
],
[
217306, self::T_CAVALRY, '마물조련사병',
250, 200, 6, 0, 0, 16, 16,
3000, ["랑그바우"], null, 0,
[ self::T_FOOTMAN=>1.2, self::T_ARCHER=>0.8, self::T_SIEGE=>1.2, 217502=>1],
[ self::T_FOOTMAN=>0.8, self::T_ARCHER=>1.2, self::T_SIEGE=>0.8, 217502=>1],
["무시무시한 몬스터에 올라타서 싸우는 극강의 기동병입니다."],
null, ['che_기병병종전투'], null
],
[
217307, self::T_CAVALRY, '기마병',
200, 150, 7, 5, 0, 14, 14,
3000, ["오와리"], null, 0,
[ self::T_FOOTMAN=>1.2, self::T_ARCHER=>0.8, self::T_SIEGE=>1.2, 217502=>1],
[ self::T_FOOTMAN=>0.8, self::T_ARCHER=>1.2, self::T_SIEGE=>0.8, 217502=>1],
["JAPAN 특유의 기마에 올라타 적을 짓밟는 기동병입니다."],
null, ['che_기병병종전투'], null
],
[
217308, self::T_CAVALRY, '엔젤나이트',
300, 200, 7, 5, 0, 25, 25,
5000, ["떨어진 궁도"], null, 0,
[ self::T_FOOTMAN=>1.2, self::T_ARCHER=>0.8, self::T_SIEGE=>1.2, 217502=>1],
[ self::T_FOOTMAN=>0.8, self::T_ARCHER=>1.2, self::T_SIEGE=>0.8, 217502=>1],
["신의 명령으로 파멸을 내리기 위해 강림했습니다."],
null, ['che_기병병종전투'], null
],
[
217400, self::T_WIZARD, '마법병',
80, 80, 7, 5, 0.6, 9, 9,
0, null, null, 0,
[self::T_SIEGE=>1.2],
[self::T_SIEGE=>0.8],
["마법을 사용하는 병종입니다."],
null, null, null
],
[
217401, self::T_WIZARD, '마물 마법병',
90, 90, 7, 0, 0.6, 11, 9,
0, null, ["호넷 마인령","케이브리스 마인령"], 0,
[self::T_SIEGE=>1.2],
[self::T_SIEGE=>0.8],
["마군 지역 기본병종입니다. 조금더 강하지만 금을 많이 소비합니다."],
null, null, null
],
[
217402, self::T_WIZARD, '카라 마법병',
80, 80, 7, 20, 0.6, 10, 10,
1000, null, ["카라의 숲"], 0,
[self::T_SIEGE=>1.2],
[self::T_SIEGE=>0.8],
["신속히 움직이며 카라의 저주로 적을 공격합니다."],
null, null, null
],
[
217403, self::T_WIZARD, '제스 마법병',
100, 100, 7, 0, 0.6, 10, 10,
1000, null, ["제스 북부"], 0,
[self::T_SIEGE=>1.2],
[self::T_SIEGE=>0.8],
["마법국가 제스의 전통있는 마법병입니다."],
null, null, null
],
[
217404, self::T_WIZARD, '무녀',
80, 80, 8, 10, 0.6, 10, 10,
1000, null, ["JAPAN"], 0,
[self::T_SIEGE=>1.2],
[self::T_SIEGE=>0.8],
["신마법과 함께 신통한 춤으로 활력을 불어넣는 마법병입니다."],
null, null, null
],
[
217405, self::T_WIZARD, '프로즌',
90, 70, 7, 10, 0.8, 10, 10,
1000, null, ["헬만 서부"], 0,
[self::T_SIEGE=>1.2],
[self::T_SIEGE=>0.8],
["백병전에 불리한 연약한 몸으로 마법 사용에 집중하는 몬스터입니다."],
null, null, null
],
[
217406, self::T_WIZARD, '마소한 마법병',
70, 90, 7, 10, 0.8, 11, 10,
1000, null, ["케이브리스 마인령"], 0,
[self::T_SIEGE=>1.2],
[self::T_SIEGE=>0.8],
["로브를 여러겹 둘러입은 마물마법병입니다. 직접 전투보단 마법에 집중합니다."],
null, null, null
],
[
217407, self::T_WIZARD, '신관병',
80, 130, 7, 5, 0.6, 9, 11,
2000, ["카이즈"], null, 0,
[self::T_SIEGE=>1.2],
[self::T_SIEGE=>0.8],
["AL교의 전투신관입니다. 몸을 보호하는 성스러운 마법을 사용합니다."],
null, null, null
],
[
217408, self::T_WIZARD, '중장마법병',
80, 130, 7, 15, 0.6, 11, 12,
3000, ["로제스그라드"], null, 0,
[self::T_SIEGE=>1.2],
[self::T_SIEGE=>0.8],
["두터운 로브를 입고 불길한 주문을 읊습니다."],
null, null, null
],
[
217409, self::T_WIZARD, '악마병',
130, 80, 7, 15, 0.6, 11, 12,
3000, ["올드제스"], null, 0,
[self::T_SIEGE=>1.2],
[self::T_SIEGE=>0.8],
["고대 제스 왕가의 계약에 따라 소환된 흑마법병입니다."],
null, null, null
],
[
217410, self::T_WIZARD, '호넷 마물병',
130, 130, 7, 0, 0.6, 12, 12,
3000, ["구 마왕성"], null, 0,
[self::T_SIEGE=>1.2],
[self::T_SIEGE=>0.8],
["호넷 직속의 최강 마물 마법병입니다."],
null, null, null
],
[
217411, self::T_WIZARD, 'Z가디언',
180, 180, 7, 0, 0.7, 28, 20,
5000, ["라그나로크 아크"], null, 0,
[self::T_SIEGE=>1.2],
[self::T_SIEGE=>0.8],
["제스의 기술력이 집약된 최고의 마법병기입니다."],
null, null, null
],
[
217500, self::T_SIEGE, '정란',
150, 150, 6, 0, 0, 15, 5,
0, null, null, 3,
[ self::T_FOOTMAN=>0.8, self::T_ARCHER=>0.8, self::T_CAVALRY=>0.8, self::T_WIZARD=>0.8, self::T_CASTLE=>1.8],
[ self::T_FOOTMAN=>1.2, self::T_ARCHER=>1.2, self::T_CAVALRY=>1.2, self::T_WIZARD=>1.2],
["높은 구조물 위에서 공격합니다."],
['che_성벽부상무효'], null, null
],
[
217501, self::T_SIEGE, '충차',
150, 100, 6, 0, 0, 20, 5,
1000, null, null, 3,
[ self::T_FOOTMAN=>0.8, self::T_ARCHER=>0.8, self::T_CAVALRY=>0.8, self::T_WIZARD=>0.8, self::T_CASTLE=>2.4],
[ self::T_FOOTMAN=>1.2, self::T_ARCHER=>1.2, self::T_CAVALRY=>1.2, self::T_WIZARD=>1.2],
["엄청난 위력으로 성벽을 부수어버립니다."],
['che_성벽부상무효'], null, null
],
[
217502, self::T_SIEGE, '튤립3호',
275, 300, 6, 0, 0, 35, 15,
5000, ["커스텀"], null, 0,
[ ],
[ ],
["파괴적인 위력과 정말 파괴적인 비용을 자랑하는 전차입니다. "],
['che_성벽부상무효'], null, null
],
];
[
217400, self::T_WIZARD, '마법병',
80, 80, 7, 5, 0.6, 9, 9,
[],
[self::T_SIEGE=>1.2],
[self::T_SIEGE=>0.8],
["마법을 사용하는 병종입니다."],
null, null, null
],
[
217401, self::T_WIZARD, '마물 마법병',
90, 90, 7, 0, 0.6, 11, 9,
[new ReqRegions('호넷 마인령', '케이브리스 마인령')],
[self::T_SIEGE=>1.2],
[self::T_SIEGE=>0.8],
["마군 지역 기본병종입니다. 조금더 강하지만 금을 많이 소비합니다."],
null, null, null
],
[
217402, self::T_WIZARD, '카라 마법병',
80, 80, 7, 20, 0.6, 10, 10,
[new ReqTech(1000), new ReqRegions('카라의 숲')],
[self::T_SIEGE=>1.2],
[self::T_SIEGE=>0.8],
["신속히 움직이며 카라의 저주로 적을 공격합니다."],
null, null, null
],
[
217403, self::T_WIZARD, '제스 마법병',
100, 100, 7, 0, 0.6, 10, 10,
[new ReqTech(1000), new ReqRegions('제스 북부')],
[self::T_SIEGE=>1.2],
[self::T_SIEGE=>0.8],
["마법국가 제스의 전통있는 마법병입니다."],
null, null, null
],
[
217404, self::T_WIZARD, '무녀',
80, 80, 8, 10, 0.6, 10, 10,
[new ReqTech(1000), new ReqRegions('JAPAN')],
[self::T_SIEGE=>1.2],
[self::T_SIEGE=>0.8],
["신마법과 함께 신통한 춤으로 활력을 불어넣는 마법병입니다."],
null, null, null
],
[
217405, self::T_WIZARD, '프로즌',
90, 70, 7, 10, 0.8, 10, 10,
[new ReqTech(1000), new ReqRegions('헬만 서부')],
[self::T_SIEGE=>1.2],
[self::T_SIEGE=>0.8],
["백병전에 불리한 연약한 몸으로 마법 사용에 집중하는 몬스터입니다."],
null, null, null
],
[
217406, self::T_WIZARD, '마소한 마법병',
70, 90, 7, 10, 0.8, 11, 10,
[new ReqTech(1000), new ReqRegions('케이브리스 마인령')],
[self::T_SIEGE=>1.2],
[self::T_SIEGE=>0.8],
["로브를 여러겹 둘러입은 마물마법병입니다. 직접 전투보단 마법에 집중합니다."],
null, null, null
],
[
217407, self::T_WIZARD, '신관병',
80, 130, 7, 5, 0.6, 9, 11,
[new ReqTech(2000), new ReqCities('카이즈')],
[self::T_SIEGE=>1.2],
[self::T_SIEGE=>0.8],
["AL교의 전투신관입니다. 몸을 보호하는 성스러운 마법을 사용합니다."],
null, null, null
],
[
217408, self::T_WIZARD, '중장마법병',
80, 130, 7, 15, 0.6, 11, 12,
[new ReqTech(3000), new ReqCities('로제스그라드')],
[self::T_SIEGE=>1.2],
[self::T_SIEGE=>0.8],
["두터운 로브를 입고 불길한 주문을 읊습니다."],
null, null, null
],
[
217409, self::T_WIZARD, '악마병',
130, 80, 7, 15, 0.6, 11, 12,
[new ReqTech(3000), new ReqCities('올드제스')],
[self::T_SIEGE=>1.2],
[self::T_SIEGE=>0.8],
["고대 제스 왕가의 계약에 따라 소환된 흑마법병입니다."],
null, null, null
],
[
217410, self::T_WIZARD, '호넷 마물병',
130, 130, 7, 0, 0.6, 12, 12,
[new ReqTech(3000), new ReqCities('구 마왕성')],
[self::T_SIEGE=>1.2],
[self::T_SIEGE=>0.8],
["호넷 직속의 최강 마물 마법병입니다."],
null, null, null
],
[
217411, self::T_WIZARD, 'Z가디언',
180, 180, 7, 0, 0.7, 28, 20,
[new ReqTech(5000), new ReqCities('라그나로크 아크')],
[self::T_SIEGE=>1.2],
[self::T_SIEGE=>0.8],
["제스의 기술력이 집약된 최고의 마법병기입니다."],
null, null, null
],
[
217500, self::T_SIEGE, '정란',
150, 150, 6, 0, 0, 15, 5,
[new ReqMinRelYear(3)],
[ self::T_FOOTMAN=>0.8, self::T_ARCHER=>0.8, self::T_CAVALRY=>0.8, self::T_WIZARD=>0.8, self::T_CASTLE=>1.8],
[ self::T_FOOTMAN=>1.2, self::T_ARCHER=>1.2, self::T_CAVALRY=>1.2, self::T_WIZARD=>1.2],
["높은 구조물 위에서 공격합니다."],
['che_성벽부상무효'], null, null
],
[
217501, self::T_SIEGE, '충차',
150, 100, 6, 0, 0, 20, 5,
[new ReqTech(1000), new ReqMinRelYear(3)],
[ self::T_FOOTMAN=>0.8, self::T_ARCHER=>0.8, self::T_CAVALRY=>0.8, self::T_WIZARD=>0.8, self::T_CASTLE=>2.4],
[ self::T_FOOTMAN=>1.2, self::T_ARCHER=>1.2, self::T_CAVALRY=>1.2, self::T_WIZARD=>1.2],
["엄청난 위력으로 성벽을 부수어버립니다."],
['che_성벽부상무효'], null, null
],
[
217502, self::T_SIEGE, '튤립3호',
275, 300, 6, 0, 0, 35, 15,
[new ReqTech(5000), new ReqCities('커스텀')],
[],
[],
["파괴적인 위력과 정말 파괴적인 비용을 자랑하는 전차입니다. "],
['che_성벽부상무효'], null, null
],
];
}
}
+101 -96
View File
@@ -1,104 +1,109 @@
<?php
namespace sammo;
use sammo\GameUnitConstraint\Impossible;
use sammo\GameUnitConstraint\ReqTech;
use sammo\GameUnitConstraint\ReqCities;
use sammo\GameUnitConstraint\ReqRegions;
use sammo\GameUnitConstraint\ReqMinRelYear;
class GameUnitConst extends GameUnitConstBase
{
const DEFAULT_CREWTYPE = 1500;
protected static $_buildData = [
[
1000, self::T_CASTLE, '성벽',
100, 100, 7, 0, 0, 99, 9,
999999, null, null, 999999,
[],//성벽은 공격할 수 없다.
[self::T_FOOTMAN=>1.2],
['성벽입니다.','생성할 수 없습니다.'],
null, null, null
],
[
1100, self::T_FOOTMAN, '보병',
100, 150, 7, 10, 0, 18, 18,
0, null, null, 0,
[self::T_ARCHER=>1.2, self::T_CAVALRY=>0.8],
[self::T_ARCHER=>0.8, self::T_CAVALRY=>1.2],
['표준적인 보병입니다.','보병은 방어특화이며,','상대가 회피하기 어렵습니다.'],
null, null, null
],
[
1200, self::T_ARCHER, '궁병',
100, 100, 7, 20, 0, 20, 20,
0, null, null, 0,
[self::T_CAVALRY=>1.2, self::T_FOOTMAN=>0.8],
[self::T_CAVALRY=>0.8, self::T_FOOTMAN=>1.2],
['표준적인 궁병입니다.','궁병은 회피특화입니다.'],
null, null, null
],
[
1300, self::T_CAVALRY, '기병',
150, 100, 7, 5, 0, 22, 22,
0, null, null, 0,
[self::T_FOOTMAN=>1.2, self::T_ARCHER=>0.8],
[self::T_FOOTMAN=>0.8, self::T_ARCHER=>1.2],
['표준적인 기병입니다.','기병은 공격특화입니다.'],
null, null, null
],
[
1400, self::T_WIZARD, '귀병',
80, 80, 7, 5, 0.5, 18, 18,
0, null, null, 0,
[],
[],
['계략을 사용하는 병종입니다.'],
null, null, null
],
[
1405, self::T_WIZARD, '남귀병',
60, 60, 7, 10, 0.8, 16, 16,
1000, null, null, 0,
[],
[],
['전투를 포기하고 계략에 몰두합니다.'],
null, null, null
],
[
1500, self::T_SIEGE, '정란',
100, 100, 6, 0, 0, 7, 3,
0, null, null, 0,
[self::T_CASTLE=>1.8],
[],
['높은 구조물 위에서 공격합니다.'],
['che_성벽부상무효'], null, null
],
[
1501, self::T_SIEGE, '충차',
150, 100, 6, 0, 0, 10, 3,
1000, null, null, 3,
[self::T_CASTLE=>2.4],
[],
['엄청난 위력으로 성벽을 부수어버립니다.'],
['che_성벽부상무효'], null, null
],
[
1502, self::T_SIEGE, '벽력거',
200, 100, 6, 0, 0, 20, 4,
3000, ['업'], null, 0,
[self::T_CASTLE=>1.8],
[],
['상대에게 돌덩이를 날립니다.'],
['che_성벽부상무효'], null, null
],
[
1503, self::T_SIEGE, '목우',
50, 200, 5, 0, 0, 15, 3,
3000, ['성도'], null, 0,
[],
[],
['상대를 저지하는 특수병기입니다.'],
['che_성벽부상무효'], null, null
]
];
protected static function getBuildData(): array
{
return [
[
1000, self::T_CASTLE, '성벽',
100, 100, 7, 0, 0, 99, 9,
[new Impossible()],
[], //성벽은 공격할 수 없다.
[self::T_FOOTMAN=>1.2],
['성벽입니다.','생성할 수 없습니다.'],
null, null, null
],
[
1100, self::T_FOOTMAN, '보병',
100, 150, 7, 10, 0, 18, 18,
[],
[self::T_ARCHER=>1.2, self::T_CAVALRY=>0.8],
[self::T_ARCHER=>0.8, self::T_CAVALRY=>1.2],
['표준적인 보병입니다.','보병은 방어특화이며,','상대가 회피하기 어렵습니다.'],
null, null, null
],
[
1200, self::T_ARCHER, '궁병',
100, 100, 7, 20, 0, 20, 20,
[],
[self::T_CAVALRY=>1.2, self::T_FOOTMAN=>0.8],
[self::T_CAVALRY=>0.8, self::T_FOOTMAN=>1.2],
['표준적인 궁병입니다.','궁병은 회피특화입니다.'],
null, null, null
],
[
1300, self::T_CAVALRY, '기병',
150, 100, 7, 5, 0, 22, 22,
[],
[self::T_FOOTMAN=>1.2, self::T_ARCHER=>0.8],
[self::T_FOOTMAN=>0.8, self::T_ARCHER=>1.2],
['표준적인 기병입니다.','기병은 공격특화입니다.'],
null, null, null
],
[
1400, self::T_WIZARD, '귀병',
80, 80, 7, 5, 0.5, 18, 18,
[],
[],
[],
['계략을 사용하는 병종입니다.'],
null, null, null
],
[
1405, self::T_WIZARD, '남귀병',
60, 60, 7, 10, 0.8, 16, 16,
[new ReqTech(1000)],
[],
[],
['전투를 포기하고 계략에 몰두합니다.'],
null, null, null
],
[
1500, self::T_SIEGE, '정란',
100, 100, 6, 0, 0, 7, 3,
[],
[self::T_CASTLE=>1.8],
[],
['높은 구조물 위에서 공격합니다.'],
['che_성벽부상무효'], null, null
],
[
1501, self::T_SIEGE, '충차',
150, 100, 6, 0, 0, 10, 3,
[new ReqTech(1000), new ReqMinRelYear(3)],
[self::T_CASTLE=>2.4],
[],
['엄청난 위력으로 성벽을 부수어버립니다.'],
['che_성벽부상무효'], null, null
],
[
1502, self::T_SIEGE, '벽력거',
200, 100, 6, 0, 0, 20, 4,
[new ReqTech(3000), new ReqCities('업')],
[self::T_CASTLE=>1.8],
[],
['상대에게 돌덩이를 날립니다.'],
['che_성벽부상무효'], null, null
],
[
1503, self::T_SIEGE, '목우',
50, 200, 5, 0, 0, 15, 3,
[new ReqTech(3000), new ReqCities('성도')],
[],
[],
['상대를 저지하는 특수병기입니다.'],
['che_성벽부상무효'], null, null
]
];
}
}
+5
View File
@@ -4,6 +4,11 @@ import { callSammoAPI, extractHttpMethod, GET, POST, type APICallT, type APITail
export type { ValidResponse, InvalidResponse };
const apiRealPath = {
Admin: {
BanEmailAddress: POST as APICallT<{
email: string,
}>
},
Login: {
LoginByID: POST as APICallT<{
username: string,
+2 -2
View File
@@ -3,7 +3,7 @@
<div
class="general-icon"
:style="{
backgroundImage: `url(${iconPath})`,
backgroundImage: `url('${iconPath}')`,
}"
></div>
@@ -83,7 +83,7 @@
<div
class="general-crew-type-icon"
:style="{
backgroundImage: `url(${imagePath}/crewtype${general.crewtype}.png)`,
backgroundImage: `url('${imagePath}/crewtype${general.crewtype}.png')`,
}"
></div>
+1 -1
View File
@@ -3,7 +3,7 @@
<div
class="general-icon"
:style="{
backgroundImage: `url(${iconPath})`,
backgroundImage: `url('${iconPath}')`,
}"
></div>
+1 -1
View File
@@ -9,7 +9,7 @@
v-if="city.color"
:class="`city_bg b${city.color.substring(1)}`"
:style="{
backgroundImage: `url(${imagePath}/b${city.color.substring(1).toUpperCase()}.png)`,
backgroundImage: `url('${imagePath}/b${city.color.substring(1).toUpperCase()}.png')`,
}"
></div>
+2 -2
View File
@@ -18,7 +18,7 @@
left: '0',
width: '100%',
height: `${props.height}px`,
backgroundImage: `url(${imagePath}/pr${props.height - 2}.gif)`,
backgroundImage: `url('${imagePath}/pr${props.height - 2}.gif')`,
backgroundRepeat: 'repeat-x',
backgroundPosition: 'center',
}"
@@ -30,7 +30,7 @@
left: '0',
width: `${clamp(props.percent, 0, 100)}%`,
height: `${props.height}px`,
backgroundImage: `url(${imagePath}/pb${props.height - 2}.gif)`,
backgroundImage: `url('${imagePath}/pb${props.height - 2}.gif')`,
backgroundRepeat: 'repeat-x',
backgroundPosition: 'left center',
+2 -2
View File
@@ -279,7 +279,7 @@
label-cols-lg="3"
content-cols-sm
content-cols-lg="7"
description="업로드할 파일을 선택해주세요. (jpg, png, gif, webp)"
description="업로드할 파일을 선택해주세요. (jpg, png, gif, webp, avif)"
label="이미지 업로드"
label-align="right"
:label-for="`${uuid}_image_upload`"
@@ -288,7 +288,7 @@
:id="`${uuid}_image_upload`"
class="form-control"
type="file"
accept=".jpg,.jpeg,.png,.gif,.webp"
accept=".jpg,.jpeg,.png,.gif,.webp,.avif"
@change="chooseImage"
/>
</BFormGroup>
+1 -4
View File
@@ -176,10 +176,7 @@ export type GameUnitType = {
magicCoef: number;
cost: number;
rice: number;
reqTech: number;
reqCities: CityID[] | null;
reqRegions: MapRegionID[] | null;
reqYear: number;
reqConstraints: Record<string, unknown>[];
attackCoef: Record<CrewTypeID | ArmTypeID, number> | null | [];
defenceCoef: Record<CrewTypeID | ArmTypeID, number> | null | [];
info: string | string[];
+28 -4
View File
@@ -1,13 +1,14 @@
import { SammoRootAPI, type InvalidResponse } from '@/SammoRootAPI';
import axios from 'axios';
import $ from 'jquery';
import { isNumber } from 'lodash-es';
import { TemplateEngine } from '@util/TemplateEngine';
import type { InvalidResponse } from '@/defs';
import { setAxiosXMLHttpRequest } from '@util/setAxiosXMLHttpRequest';
import { unwrap_any } from '@util/unwrap_any';
import { convertFormData } from '@util/convertFormData';
import { exportWindow } from '@util/exportWindow';
import '@/gateway/common';
import { setSammoAPIPrefix } from '@/util/callSammoAPI';
type UserEntry = {
userID: string,
@@ -32,7 +33,7 @@ type UserListResponse = {
}
const userFrame = '\
<tr id="userinfo_<%userID%>" data-username="<%userName%>" data-id="<%userID%>">\
<tr id="userinfo_<%userID%>" data-username="<%userName%>" data-id="<%userID%>" data-email="<%email%>">\
<th scope="row"><%userID%></th>\
<td><%userName%></td>\
<td class="small"><%emailFunc(email)%><br>(<%authType%>)</td>\
@@ -49,6 +50,7 @@ const userFrame = '\
<button type="button" onclick="changeUserStatus(\'reset_pw\', this);" class="btn btn-info btn-sm"><br></button>\
<button type="button" onclick="changeUserStatus(\'block\', this);" class="btn btn-warning btn-sm"><br></button>\
<button type="button" onclick="changeUserStatus(\'unblock\', this);" class="btn btn-secondary btn-sm"><br></button>\
<button type="button" onclick="banEmailAddress(this);" class="btn btn-danger btn-sm"><br></button>\
<button type="button" onclick="changeUserStatus(\'set_userlevel\', this);" class="btn btn-primary btn-sm"><br></button>\
</div>\
</td>\
@@ -171,6 +173,25 @@ async function changeSystem(action: string, param?: string): Promise<void> {
}
}
async function banEmailAddress(target: Element): Promise<void> {
const email: string = $(target).parents('tr').data('email');
if (!confirm(`${email}에 대해서 영구차단을 진행합니다.`)) {
return;
}
const result = await SammoRootAPI.Admin.BanEmailAddress({
email,
}, true);
if (!result.result) {
alert(result.reason);
return;
}
alert('완료되었습니다.');
}
async function changeUserStatus(action: string, userID: Element | number, param?: number): Promise<void> {
if (userID instanceof Element) {
userID = parseInt($(userID).parents('tr').data('id'));
@@ -180,7 +201,6 @@ async function changeUserStatus(action: string, userID: Element | number, param?
return;
}
if (action == 'set_userlevel') {
if (!isNumber(param)) {
param = parseInt(prompt('원하는 등급을 입력해주세요.(1:일반, 4:특별, 5:부운영자, 6:운영자)', '1') ?? '0');
@@ -280,5 +300,9 @@ $(async function () {
})
});
setSammoAPIPrefix('..');
exportWindow(changeSystem, 'changeSystem');
exportWindow(changeUserStatus, 'changeUserStatus');
exportWindow(changeUserStatus, 'changeUserStatus');
exportWindow(banEmailAddress, 'banEmailAddress');
+1 -1
View File
@@ -123,7 +123,7 @@ export async function callSammoAPI<ResultType extends ValidResponse, ErrorType e
retry: 0,
});
}
return ky("api.php", {
return ky(apiPath, {
searchParams: {
...paramArgs,
path,
+10
View File
@@ -40,6 +40,16 @@ if($userInfo['delete_after']){
]);
}
$penaltyList = JSON::decode($userInfo['penalty']??'{}');
foreach($penaltyList as $penaltyKey=>$penaltyValue){
if($penaltyValue['expire'] ?? 0 > TimeUtil::now()){
Json::die([
'result'=>false,
'reason'=>"징계가 남아있어 탈퇴할 수 없습니다."
]);
}
}
$db->update('member',[
'delete_after'=>TimeUtil::nowAddMinutes(60*24*30)
], 'no=%i', $userID);
+5 -3
View File
@@ -32,10 +32,12 @@ else{
$tokenValidUntil = $member['token_valid_until'];
if($member['grade'] == 6) {
$grade = '운영자';
if($member['grade'] == 7) {
$grade = '최고운영자';
} elseif($member['grade'] == 6) {
$grade = '부운영자(시스템)';
} elseif($member['grade'] == 5) {
$grade = '부운영자';
$grade = '부운영자(유저)';
} elseif($member['grade'] > 1) {
$grade = '특별회원';
} elseif($member['grade'] == 1) {
+2 -2
View File
@@ -21,7 +21,7 @@ $size = getImageSize($image['tmp_name']);
$imageType = $size[2];
$availableImageType = array('.webp'=>IMAGETYPE_WEBP, '.jpg'=>IMAGETYPE_JPEG, '.png'=>IMAGETYPE_PNG, '.gif'=>IMAGETYPE_GIF);
$availableImageType = array('.avif'=>IMAGETYPE_AVIF, '.webp'=>IMAGETYPE_WEBP, '.jpg'=>IMAGETYPE_JPEG, '.png'=>IMAGETYPE_PNG, '.gif'=>IMAGETYPE_GIF);
$db = RootDB::db();
$member = $db->queryFirstRow('SELECT `ID`, `PICTURE` FROM `member` WHERE `NO` = %i', $userID);
@@ -48,7 +48,7 @@ if(!is_uploaded_file($image['tmp_name'])) {
$response['result'] = false;
} elseif(!$newExt) {
//확장자 검사
$response['reason'] = 'webp, jpg, gif, png 파일이 아닙니다!';
$response['reason'] = 'avif, webp, jpg, gif, png 파일이 아닙니다!';
$response['result'] = false;
} elseif($image['size'] > 51200) {
//파일크기 검사
+2 -2
View File
@@ -7,7 +7,7 @@ WebUtil::requireAJAX();
$session = Session::requireLogin([])->setReadOnly();
if($session->userGrade < 5){
if($session->userGrade < 6){
Json::die([
'result'=>false,
'reason'=>'운영자 권한이 없습니다.'
@@ -90,7 +90,7 @@ if($action == 'scrub_icon'){
$cnt = 0;
foreach(glob(AppConf::getUserIconPathFS().'/*.{webp,jpg,png,gif}', GLOB_BRACE) as $filepath){
foreach(glob(AppConf::getUserIconPathFS().'/*.{avif,webp,jpg,png,gif}', GLOB_BRACE) as $filepath){
$filename = basename($filepath);
if (array_key_exists($filename, $usedIcon)) {
+2 -2
View File
@@ -143,7 +143,7 @@ require(__DIR__ . '/../vendor/autoload.php');
<form name="change_icon_form" id="change_icon_form" method="post" enctype="multipart/form-data">
<input class="with_skin" type="text" readonly="readonly" id="image_upload_filename">
<button id="image_upload_fake_btn" class="with_skin">찾아보기</button>
<input type="file" id="image_upload" name="image_upload" accept=".webp,.jpg,.jpeg,.png,.gif"><br>
<input type="file" id="image_upload" name="image_upload" accept=".avif,.webp,.jpg,.jpeg,.png,.gif"><br>
<input class="with_skin" id="btn_image_submit" type="submit" value="아이콘 변경"> <button id="btn_remove_icon" class="with_skin">아이콘 제거</button>
</form>
@@ -156,7 +156,7 @@ require(__DIR__ . '/../vendor/autoload.php');
<th class="bg1">도움말</th>
<td colspan="5" style="text-align:left;padding:8px;">
<p style="line-height:1.2em;">
아이콘은 64 x 64픽셀 ~ 128 x 128픽셀 사이, 50KB 이하의 webp, jpg, gif, png 파일만 가능합니다.</p>
아이콘은 64 x 64픽셀 ~ 128 x 128픽셀 사이, 50KB 이하의 avif, webp, jpg, gif, png 파일만 가능합니다.</p>
<p style="margin-top:1em;color:magenta;line-height:1.2em;">탈퇴시 1개월간 정보가 보존되며, 1개월간 재가입이 불가능합니다.</span>
</p>
</td>
+1 -1
View File
@@ -202,7 +202,7 @@ $target = Util::getPost('target');
$server = basename($request['server']);
$settingBasePath = __DIR__ . "/{$server}/d_setting/";
$allowFullUpdate = in_array('fullUpdate', $session->acl[$server] ?? []);
$allowFullUpdate |= $session->userGrade >= 6;
$allowFullUpdate |= $session->userGrade >= 7;
$allowUpdate = in_array('update', $session->acl[$server] ?? []);
$allowUpdate |= $session->userGrade >= 5;
+10 -1
View File
@@ -48,6 +48,15 @@ function checkEmailDup($email){
return '적절하지 않은 길이입니다.';
}
$globalSalt = RootDB::getGlobalSalt();
$isBanned = RootDB::db()->queryFirstField(
'SELECT count(no) FROM banned_member WHERE `hashed_email` = %s LIMIT 1',
hash('sha512', $globalSalt.$email.$globalSalt)
);
if($isBanned){
return '영구 차단된 이메일입니다.';
}
$userInfo = RootDB::db()->queryFirstField('SELECT `no`, `delete_after` FROM member WHERE `email` = %s LIMIT 1', $email);
if($userInfo){
$nowDate = TimeUtil::now();
@@ -55,7 +64,7 @@ function checkEmailDup($email){
return '이미 사용중인 이메일입니다. 관리자에게 문의해주세요.';
}
if($userInfo['delete_after'] >= $userInfo){
if($userInfo['delete_after'] >= $nowDate){
return "삭제 요청된 계정입니다.[{$userInfo['delete_after']}]";
}
+10 -4
View File
@@ -4,6 +4,7 @@ import os
import sys
import json
from openpyxl.worksheet.worksheet import Worksheet
import json
#TODO: 시나리오마다 바뀔 수 있음
nationLevelMap = {
@@ -37,14 +38,19 @@ def parseConfig(configSheet: Worksheet):
value = int(value)
if isinstance(value, str):
values = value.split('\n')
if len(values) > 1:
value = values
# json으로 변환 시도
try:
value = json.loads(value)
except:
values = value.split('\n')
if len(values) > 1:
value = values
varNames = varName.split('.')
varNameCnt = len(varNames)
target = result
for idx, name in enumerate(varNames):
if idx + 1 == len(varNames):
if idx + 1 == varNameCnt:
target[name] = value
break
if not name in target:
+59
View File
@@ -0,0 +1,59 @@
<?php
namespace sammo\API\Admin;
use sammo\Session;
use DateTimeInterface;
use sammo\BaseAPI;
use sammo\Enums\APIRecoveryType;
use sammo\RootDB;
use sammo\TimeUtil;
use sammo\Validator;
class BanEmailAddress extends \sammo\BaseAPI
{
public function validateArgs(): ?string
{
$v = new Validator($this->args);
$v
->rule('required', [
'email',
]);
if (!$v->validate()) {
return $v->errorStr();
}
return null;
}
public function getRequiredSessionMode(): int
{
return BaseAPI::REQ_LOGIN | BaseAPI::REQ_READ_ONLY;
}
public function launch(Session $session, ?DateTimeInterface $modifiedSince, ?string $reqEtag): null | string | array | APIRecoveryType
{
$RootDB = RootDB::db();
$email = $this->args['email'];
if ($session->userGrade < 5) {
return '권한이 없습니다.';
}
$globalSalt = RootDB::getGlobalSalt();
try{
$RootDB->insert('banned_member', [
'hashed_email' => hash('sha512', $globalSalt.$email.$globalSalt),
'info' => TimeUtil::now(),
]);
}
catch(\Exception $e){
return '이미 등록된 이메일입니다.';
}
return [
'result' => true,
'reason' => '등록되었습니다.'
];
}
}
+9 -1
View File
@@ -1,3 +1,9 @@
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
</head>
<body>
<pre>
HiDCHe서버 이용 약관
@@ -140,4 +146,6 @@
부칙 <2018.4.17.>
⓵ 본 약관은 2018.4.17.부터 적용된다.
</pre>
</pre>
</body>
</html>
+9 -1
View File
@@ -1,3 +1,9 @@
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
</head>
<body>
<pre>
개인정보 제공 및 이용에 대한 동의
@@ -19,4 +25,6 @@
개인정보 관리자 : 이동수
연락처 : hided62gmail.com
</pre>
</pre>
</body>
</html>
+1 -1
View File
@@ -176,7 +176,7 @@ module.exports = (env, argv) => {
use: [MiniCssExtractPlugin.loader, 'css-loader', 'postcss-loader', 'sass-loader']
},
{
test: /\.(png|jpe?g|gif|webp)$/,
test: /\.(png|jpe?g|gif|webp|avif)$/,
use: ['file-loader']
},
{