From 2869ba5c42ef6336c769b0831608176daac8d38c Mon Sep 17 00:00:00 2001 From: Hide_D Date: Wed, 22 Jan 2025 16:26:15 +0000 Subject: [PATCH] =?UTF-8?q?feat,refac:=20GameUnitConstraint=20=EA=B0=9C?= =?UTF-8?q?=EB=85=90=20=EC=B6=94=EA=B0=80=20-=20GameUnitDetail=EC=9D=98=20?= =?UTF-8?q?=EC=9A=94=EA=B5=AC=20=EA=B8=B0=EC=88=A0,=20=EC=A7=80=EC=97=AD,?= =?UTF-8?q?=20=EB=8F=84=EC=8B=9C,=20=EC=97=B0=EB=8F=84=EB=A5=BC=20GameUnit?= =?UTF-8?q?Constraint=EB=A1=9C=20=ED=86=B5=ED=95=A9=20-=20GameUnitConstrai?= =?UTF-8?q?nt=EB=8A=94=20=EC=A1=B0=EA=B1=B4=20=EA=B2=80=EC=82=AC,=20?= =?UTF-8?q?=EC=84=A4=EB=AA=85=20=EC=A0=9C=EA=B3=B5=20-=20=EB=B3=91?= =?UTF-8?q?=EC=A2=85=20=EC=A0=95=EC=9D=98=EB=A5=BC=20GameUnitConstraint=20?= =?UTF-8?q?=EC=9D=B4=EC=9A=A9=20=EC=9E=AC=EC=A0=95=EC=9D=98=20-=20test=20?= =?UTF-8?q?=ED=95=A8=EC=88=98=EC=97=90=20General=20=EA=B0=9D=EC=B2=B4=20?= =?UTF-8?q?=EC=9A=94=EA=B5=AC,=20-=20test=20=ED=95=A8=EC=88=98=EC=9D=98=20?= =?UTF-8?q?ownCities=EC=97=90=20=EB=8B=A8=EC=88=9C=20=EB=8F=84=EC=8B=9C=20?= =?UTF-8?q?=EC=99=B8=20=EB=8F=84=EC=8B=9C=20=EC=A0=95=EB=B3=B4=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80=20-=20=EB=B3=80=EA=B2=BD=EB=90=9C=20=EA=B0=92?= =?UTF-8?q?=EC=97=90=20=EB=A7=9E=EA=B2=8C=20=ED=98=B8=EC=B6=9C=20=ED=95=A8?= =?UTF-8?q?=EC=88=98=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- hwe/sammo/Command/General/che_징병.php | 25 +- hwe/sammo/GameUnitConstBase.php | 734 +++++++-------- .../BaseGameUnitConstraint.php | 11 + hwe/sammo/GameUnitConstraint/Impossible.php | 18 + hwe/sammo/GameUnitConstraint/ReqCities.php | 42 + .../GameUnitConstraint/ReqMinRelYear.php | 22 + hwe/sammo/GameUnitConstraint/ReqRegions.php | 43 + hwe/sammo/GameUnitConstraint/ReqTech.php | 26 + hwe/sammo/GameUnitDetail.php | 60 +- hwe/sammo/GeneralAI.php | 25 +- hwe/scenario/unit/basic.php | 153 ++-- hwe/scenario/unit/che_except_siege.php | 606 ++++++------- hwe/scenario/unit/cr.php | 409 ++++----- hwe/scenario/unit/ludo_rathowm.php | 846 +++++++++--------- hwe/scenario/unit/siegetank.php | 197 ++-- hwe/ts/defs/GameObj.ts | 5 +- 16 files changed, 1659 insertions(+), 1563 deletions(-) create mode 100644 hwe/sammo/GameUnitConstraint/BaseGameUnitConstraint.php create mode 100644 hwe/sammo/GameUnitConstraint/Impossible.php create mode 100644 hwe/sammo/GameUnitConstraint/ReqCities.php create mode 100644 hwe/sammo/GameUnitConstraint/ReqMinRelYear.php create mode 100644 hwe/sammo/GameUnitConstraint/ReqRegions.php create mode 100644 hwe/sammo/GameUnitConstraint/ReqTech.php diff --git a/hwe/sammo/Command/General/che_징병.php b/hwe/sammo/Command/General/che_징병.php index 0f604090..602491ee 100644 --- a/hwe/sammo/Command/General/che_징병.php +++ b/hwe/sammo/Command/General/che_징병.php @@ -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]); diff --git a/hwe/sammo/GameUnitConstBase.php b/hwe/sammo/GameUnitConstBase.php index f1c05b74..c90d1fef 100644 --- a/hwe/sammo/GameUnitConstBase.php +++ b/hwe/sammo/GameUnitConstBase.php @@ -1,6 +1,13 @@ '차병', ]; - 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, 250, 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(); diff --git a/hwe/sammo/GameUnitConstraint/BaseGameUnitConstraint.php b/hwe/sammo/GameUnitConstraint/BaseGameUnitConstraint.php new file mode 100644 index 00000000..87d38b74 --- /dev/null +++ b/hwe/sammo/GameUnitConstraint/BaseGameUnitConstraint.php @@ -0,0 +1,11 @@ +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} 소유시 가능"; + } +} diff --git a/hwe/sammo/GameUnitConstraint/ReqMinRelYear.php b/hwe/sammo/GameUnitConstraint/ReqMinRelYear.php new file mode 100644 index 00000000..9083793e --- /dev/null +++ b/hwe/sammo/GameUnitConstraint/ReqMinRelYear.php @@ -0,0 +1,22 @@ += $this->reqMinRelYear; + } + + public function getInfo(): string + { + return "{$this->reqMinRelYear}년 경과 후 사용 가능"; + } +} \ No newline at end of file diff --git a/hwe/sammo/GameUnitConstraint/ReqRegions.php b/hwe/sammo/GameUnitConstraint/ReqRegions.php new file mode 100644 index 00000000..df27f72e --- /dev/null +++ b/hwe/sammo/GameUnitConstraint/ReqRegions.php @@ -0,0 +1,43 @@ +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} 지역 소유시 가능"; + } +} diff --git a/hwe/sammo/GameUnitConstraint/ReqTech.php b/hwe/sammo/GameUnitConstraint/ReqTech.php new file mode 100644 index 00000000..adba70c7 --- /dev/null +++ b/hwe/sammo/GameUnitConstraint/ReqTech.php @@ -0,0 +1,26 @@ +reqTech) { + return false; + } + return true; + } + + public function getInfo(): string + { + return "기술력 {$this->reqTech} 이상 필요"; + } +} \ No newline at end of file diff --git a/hwe/sammo/GameUnitDetail.php b/hwe/sammo/GameUnitDetail.php index 2e63da15..85cda4fb 100644 --- a/hwe/sammo/GameUnitDetail.php +++ b/hwe/sammo/GameUnitDetail.php @@ -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; } } diff --git a/hwe/sammo/GeneralAI.php b/hwe/sammo/GeneralAI.php index f9848df9..f5d79c08 100644 --- a/hwe/sammo/GeneralAI.php +++ b/hwe/sammo/GeneralAI.php @@ -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; + } } } } diff --git a/hwe/scenario/unit/basic.php b/hwe/scenario/unit/basic.php index 7f939d6e..9b37290a 100644 --- a/hwe/scenario/unit/basic.php +++ b/hwe/scenario/unit/basic.php @@ -1,87 +1,92 @@ 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 + ] + ]; + } } \ No newline at end of file diff --git a/hwe/scenario/unit/che_except_siege.php b/hwe/scenario/unit/che_except_siege.php index 890a56c7..ac5d1461 100644 --- a/hwe/scenario/unit/che_except_siege.php +++ b/hwe/scenario/unit/che_except_siege.php @@ -1,310 +1,318 @@ 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 + ] + ]; + } } \ No newline at end of file diff --git a/hwe/scenario/unit/cr.php b/hwe/scenario/unit/cr.php index d444ce75..916a7192 100644 --- a/hwe/scenario/unit/cr.php +++ b/hwe/scenario/unit/cr.php @@ -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 + ], + ]; + } } diff --git a/hwe/scenario/unit/ludo_rathowm.php b/hwe/scenario/unit/ludo_rathowm.php index d114f121..06ba4836 100644 --- a/hwe/scenario/unit/ludo_rathowm.php +++ b/hwe/scenario/unit/ludo_rathowm.php @@ -1,6 +1,12 @@ '차병', ]; - 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 + ], + ]; + } } \ No newline at end of file diff --git a/hwe/scenario/unit/siegetank.php b/hwe/scenario/unit/siegetank.php index f71f5e7d..19c4449c 100644 --- a/hwe/scenario/unit/siegetank.php +++ b/hwe/scenario/unit/siegetank.php @@ -1,104 +1,109 @@ 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 + ] + ]; + } } \ No newline at end of file diff --git a/hwe/ts/defs/GameObj.ts b/hwe/ts/defs/GameObj.ts index ad21e2c2..95fac373 100644 --- a/hwe/ts/defs/GameObj.ts +++ b/hwe/ts/defs/GameObj.ts @@ -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[]; attackCoef: Record | null | []; defenceCoef: Record | null | []; info: string | string[];