diff --git a/hwe/sammo/GameUnitConstBase.php b/hwe/sammo/GameUnitConstBase.php index dc2629c7..ed639479 100644 --- a/hwe/sammo/GameUnitConstBase.php +++ b/hwe/sammo/GameUnitConstBase.php @@ -23,50 +23,273 @@ class GameUnitConstBase{ protected static $constType = null; protected static $typeData = [ - GameUnitConstBase::T_FOOTMAN => '보병', - GameUnitConstBase::T_ARCHER => '궁병', - GameUnitConstBase::T_CAVALRY => '기병', - GameUnitConstBase::T_WIZARD => '귀병', - GameUnitConstBase::T_SIEGE => '차병', + self::T_FOOTMAN => '보병', + self::T_ARCHER => '궁병', + self::T_CAVALRY => '기병', + self::T_WIZARD => '귀병', + self::T_SIEGE => '차병', ]; protected static $_buildData = [ - [ 0, GameUnitConstBase::T_FOOTMAN, '보병', 100, 150, 7, 10, 0, 9, 9, 0, null, null, 0, ['표준적인 보병입니다.','보병은 방어특화입니다.']], - [ 1, GameUnitConstBase::T_FOOTMAN, '청주병', 100, 200, 7, 10, 0, 10, 11, 1000, null, ['중원'], 0, ['저렴하고 튼튼합니다.']], - [ 2, GameUnitConstBase::T_FOOTMAN, '수병', 150, 150, 7, 10, 0, 11, 10, 1000, null, ['오월'], 0, ['저렴하고 강력합니다.']], - [ 3, GameUnitConstBase::T_FOOTMAN, '자객병', 100, 150, 7, 20, 0, 10, 10, 2000, ['저'], null, 0, ['은밀하고 날쌥니다.']], - [ 4, GameUnitConstBase::T_FOOTMAN, '근위병', 150, 200, 7, 10, 0, 12, 12, 3000, ['낙양'], null, 0, ['최강의 보병입니다.']], - [ 5, GameUnitConstBase::T_FOOTMAN, '등갑병', 100, 250, 7, 5, 0, 13, 10, 1000, null, ['남중'], 0, ['등갑을 두른 보병입니다.']], + [ + 0, 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], + ['표준적인 보병입니다.','보병은 방어특화입니다.'] + ], + [ + 1, 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], + ['저렴하고 튼튼합니다.'] + ], + [ + 2, 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], + ['저렴하고 강력합니다.'] + ], + [ + 3, self::T_FOOTMAN, '자객병', + 100, 150, 7, 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], + ['은밀하고 날쌥니다.'] + ], + [ + 4, 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], + ['최강의 보병입니다.'] + ], + [ + 5, 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], + [self::T_ARCHER=>0.8, self::T_CAVALRY=>1.2, self::T_SIEGE=>0.8], + ['등갑을 두른 보병입니다.'] + ], - [10, GameUnitConstBase::T_ARCHER, '궁병', 100, 100, 7, 20, 0, 10, 10, 0, null, null, 0, ['표준적인 궁병입니다.','궁병은 회피특화입니다.']], - [11, GameUnitConstBase::T_ARCHER, '궁기병', 100, 100, 8, 30, 0, 11, 12, 1000, null, ['동이'], 0, ['말을 타고 잘 피합니다.']], - [12, GameUnitConstBase::T_ARCHER, '연노병', 150, 100, 8, 20, 0, 12, 11, 1000, null, ['서촉'], 0, ['화살을 연사합니다.']], - [13, GameUnitConstBase::T_ARCHER, '강궁병', 150, 150, 7, 20, 0, 13, 13, 3000, ['양양'], null, 0, ['강건한 궁병입니다.']], - [14, GameUnitConstBase::T_ARCHER, '석궁병', 200, 100, 7, 20, 0, 13, 13, 3000, ['건업'], null, 0, ['강력한 화살을 쏩니다.']], + [ + 10, 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], + ['표준적인 궁병입니다.','궁병은 회피특화입니다.'] + ], + [ + 11, self::T_ARCHER, '궁기병', + 100, 100, 8, 30, 0, 11, 12, + 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], + ['말을 타고 잘 피합니다.'] + ], + [ + 12, self::T_ARCHER, '연노병', + 150, 100, 8, 20, 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], + ['화살을 연사합니다.'] + ], + [ + 13, self::T_ARCHER, '강궁병', + 150, 150, 7, 20, 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], + ['강건한 궁병입니다.'] + ], + [ + 14, self::T_ARCHER, '석궁병', + 200, 100, 7, 20, 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], + ['강력한 화살을 쏩니다.'] + ], - [20, GameUnitConstBase::T_CAVALRY, '기병', 150, 100, 7, 5, 0, 11, 11, 0, null, null, 0, ['표준적인 기병입니다.','기병은 공격특화입니다.']], - [21, GameUnitConstBase::T_CAVALRY, '백마병', 200, 100, 7, 5, 0, 12, 13, 1000, null, ['하북'], 0, ['백마의 위용을 보여줍니다.']], - [22, GameUnitConstBase::T_CAVALRY, '중장기병', 150, 150, 7, 5, 0, 13, 12, 1000, null, ['서북'], 0, ['갑주를 두른 기병입니다.']], - [23, GameUnitConstBase::T_CAVALRY, '돌격기병', 200, 100, 8, 5, 0, 13, 11, 2000, ['흉노'], null, 0, ['저돌적으로 공격합니다.']], - [24, GameUnitConstBase::T_CAVALRY, '철기병', 100, 200, 7, 5, 0, 11, 13, 2000, ['강'], null, 0, ['철갑을 두른 기병입니다.']], - [25, GameUnitConstBase::T_CAVALRY, '수렵기병', 150, 100, 8, 15, 0, 12, 12, 2000, ['산월'], null, 0, ['날쎄고 빠른 기병입니다.']], - [26, GameUnitConstBase::T_CAVALRY, '맹수병', 250, 200, 6, 0, 0, 16, 16, 2000, ['남만'], null, 0, ['어느 누구보다 강력합니다.']], - [27, GameUnitConstBase::T_CAVALRY, '호표기병', 200, 150, 7, 5, 0, 14, 14, 3000, ['허창'], null, 0, ['정예 기병입니다.']], + [ + 20, 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], + ['표준적인 기병입니다.','기병은 공격특화입니다.'] + ], + [ + 21, 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], + ['백마의 위용을 보여줍니다.'] + ], + [ + 22, 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], + ['갑주를 두른 기병입니다.'] + ], + [ + 23, 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], + ['저돌적으로 공격합니다.'] + ], + [ + 24, 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], + ['철갑을 두른 기병입니다.']], + [ + 25, 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], + ['날쎄고 빠른 기병입니다.'] + ], + [ + 26, self::T_CAVALRY, '맹수병', + 250, 200, 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], + ['어느 누구보다 강력합니다.'] + ], + [ + 27, 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], + ['정예 기병입니다.'] + ], - [30, GameUnitConstBase::T_WIZARD, '귀병', 80, 80, 7, 5, 0.5, 9, 9, 0, null, null, 0, ['계략을 사용하는 병종입니다.']], - [31, GameUnitConstBase::T_WIZARD, '신귀병', 80, 80, 7, 20, 0.6, 10, 10, 1000, null, ['초'], 0, ['신출귀몰한 귀병입니다.']], - [32, GameUnitConstBase::T_WIZARD, '백귀병', 80, 130, 7, 5, 0.6, 9, 11, 2000, ['오환'], null, 0, ['저렴하고 튼튼합니다.']], - [33, GameUnitConstBase::T_WIZARD, '흑귀병', 130, 80, 7, 5, 0.6, 11, 9, 2000, ['왜'], null, 0, ['저렴하고 강력합니다.']], - [34, GameUnitConstBase::T_WIZARD, '악귀병', 130, 130, 7, 0, 0.6, 12, 12, 3000, ['장안'], null, 0, ['백병전에도 능숙합니다.']], - [35, GameUnitConstBase::T_WIZARD, '남귀병', 60, 60, 7, 10, 0.8, 8, 8, 1000, null, null, 0, ['전투를 포기하고 계략에 몰두합니다.']], - [36, GameUnitConstBase::T_WIZARD, '황귀병', 110, 110, 7, 0, 0.8, 13, 10, 3000, ['낙양'], null, 0, ['고도로 훈련된 귀병입니다.']], - [37, GameUnitConstBase::T_WIZARD, '천귀병', 80, 130, 7, 15, 0.6, 11, 12, 3000, ['성도'], null, 0, ['갑주를 두른 귀병입니다.']], - [38, GameUnitConstBase::T_WIZARD, '마귀병', 130, 80, 7, 15, 0.6, 12, 11, 3000, ['업'], null, 0, ['날카로운 무기를 가진 귀병입니다.']], + [ + 30, 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], + ['계략을 사용하는 병종입니다.'] + ], + [ + 31, self::T_WIZARD, '신귀병', + 80, 80, 7, 20, 0.6, 10, 10, + 1000, null, ['초'], 0, + [self::T_SIEGE=>1.2], + [self::T_SIEGE=>0.8], + ['신출귀몰한 귀병입니다.'] + ], + [ + 32, self::T_WIZARD, '백귀병', + 80, 130, 7, 5, 0.6, 9, 11, + 2000, ['오환'], null, 0, + [self::T_SIEGE=>1.2], + [self::T_SIEGE=>0.8], + ['저렴하고 튼튼합니다.'] + ], + [ + 33, self::T_WIZARD, '흑귀병', + 130, 80, 7, 5, 0.6, 11, 9, + 2000, ['왜'], null, 0, + [self::T_SIEGE=>1.2], + [self::T_SIEGE=>0.8], + ['저렴하고 강력합니다.'] + ], + [ + 34, self::T_WIZARD, '악귀병', + 130, 130, 7, 0, 0.6, 12, 12, + 3000, ['장안'], null, 0, + [self::T_SIEGE=>1.2], + [self::T_SIEGE=>0.8], + ['백병전에도 능숙합니다.'] + ], + [ + 35, 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], + ['전투를 포기하고 계략에 몰두합니다.'] + ], + [ + 36, self::T_WIZARD, '황귀병', + 110, 110, 7, 0, 0.8, 13, 10, + 3000, ['낙양'], null, 0, + [self::T_SIEGE=>1.2], + [self::T_SIEGE=>0.8], + ['고도로 훈련된 귀병입니다.'] + ], + [ + 37, self::T_WIZARD, '천귀병', + 80, 130, 7, 15, 0.6, 11, 12, + 3000, ['성도'], null, 0, + [self::T_SIEGE=>1.2], + [self::T_SIEGE=>0.8], + ['갑주를 두른 귀병입니다.'] + ], + [ + 38, self::T_WIZARD, '마귀병', + 130, 80, 7, 15, 0.6, 12, 11, + 3000, ['업'], null, 0, + [self::T_SIEGE=>1.2], + [self::T_SIEGE=>0.8], + ['날카로운 무기를 가진 귀병입니다.'] + ], - [40, GameUnitConstBase::T_SIEGE, '정란', 100, 100, 6, 0, 0, 15, 5, 0, null, null, 3, ['높은 구조물 위에서 공격합니다.']], - [41, GameUnitConstBase::T_SIEGE, '충차', 150, 100, 6, 0, 0, 20, 5, 1000, null, null, 0, ['엄청난 위력으로 성벽을 부수어버립니다.']], - [42, GameUnitConstBase::T_SIEGE, '벽력거', 200, 100, 6, 0, 0, 25, 5, 3000, ['업'], null, 0, ['상대에게 돌덩이를 날립니다.']], - [43, GameUnitConstBase::T_SIEGE, '목우', 50, 200, 5, 0, 0, 30, 5, 3000, ['성도'], null, 0, ['상대를 저지하는 특수병기입니다.']] + [ + 40, 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], + ['높은 구조물 위에서 공격합니다.'] + ], + [ + 41, self::T_SIEGE, '충차', + 150, 100, 6, 0, 0, 20, 5, + 1000, null, null, 0, + [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], + ['엄청난 위력으로 성벽을 부수어버립니다.'] + ], + [ + 42, self::T_SIEGE, '벽력거', + 200, 100, 6, 0, 0, 25, 5, + 3000, ['업'], null, 0, + [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], + ['상대에게 돌덩이를 날립니다.'] + ], + [ + 43, self::T_SIEGE, '목우', + 50, 200, 5, 0, 0, 30, 5, + 3000, ['성도'], null, 0, + [self::T_FOOTMAN=>0.8, self::T_ARCHER=>0.8, self::T_CAVALRY=>0.8, self::T_WIZARD=>0.8], + [self::T_FOOTMAN=>1.2, self::T_ARCHER=>1.2, self::T_CAVALRY=>1.2, self::T_WIZARD=>1.2], + ['상대를 저지하는 특수병기입니다.'] + ] ]; /** @@ -139,6 +362,8 @@ class GameUnitConstBase{ $reqCities, $reqRegions, $reqYear, + $attackCoef, + $defenceCoef, $info ] = $rawUnit; @@ -174,6 +399,8 @@ class GameUnitConstBase{ $reqCities, $reqRegions, $reqYear, + $attackCoef, + $defenceCoef, $info ); diff --git a/hwe/sammo/GameUnitDetail.php b/hwe/sammo/GameUnitDetail.php index 44938c7b..3e9aac37 100644 --- a/hwe/sammo/GameUnitDetail.php +++ b/hwe/sammo/GameUnitDetail.php @@ -16,6 +16,8 @@ class GameUnitDetail{ public $reqCities; public $reqRegions; public $reqYear; + public $attackCoef; + public $defenceCoef; public $info; public function __construct( @@ -33,6 +35,8 @@ class GameUnitDetail{ ?array $reqCities, ?array $reqRegions, int $reqYear, + array $attackCoef, + array $defenceCoef, array $info ){ $this->name = $name; @@ -48,6 +52,8 @@ class GameUnitDetail{ $this->reqCities = $reqCities; $this->reqRegions = $reqRegions; $this->reqYear = $reqYear; + $this->attackCoef = $attackCoef; + $this->defenceCoef = $defenceCoef; $this->info = $info; } @@ -55,6 +61,22 @@ class GameUnitDetail{ return $this->cost * getTechCost($tech) * $crew / 100; } + public function getAttackCoef($armType):float{ + if($armType instanceof GameUnitDetail){ + $armType = $armType->armType; + } + assert(is_numeric($armType), '$armType should be int or GameUnitDetail'); + return $this->attackCoef[$armType]??1; + } + + public function getDefenceCoef($armType):float{ + if($armType instanceof GameUnitDetail){ + $armType = $armType->armType; + } + assert(is_numeric($armType), '$armType should be int or GameUnitDetail'); + return $this->defenceCoef[$armType]??1; + } + public function isValid($ownCities, $ownRegions, $relativeYear, $tech){ if($relativeYear < $this->reqYear){ return false;