feat(wip): GameUnitConstrint

This commit is contained in:
2025-01-21 15:26:29 +00:00
parent 3e5727a166
commit 77ec4c6572
9 changed files with 175 additions and 131 deletions
+6 -80
View File
@@ -21,8 +21,6 @@ class GameUnitConstBase{
protected static $constID = []; protected static $constID = [];
protected static $constName = []; protected static $constName = [];
protected static $constCity = [];
protected static $constRegion = [];
protected static $constType = []; protected static $constType = [];
protected static $typeData = [ protected static $typeData = [
@@ -357,22 +355,6 @@ class GameUnitConstBase{
static::$constType[$unitType->armType] = []; static::$constType[$unitType->armType] = [];
} }
static::$constType[$unitType->armType][] = $unitType; 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 +382,6 @@ class GameUnitConstBase{
return static::$constName[$name]??null; 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[] * @return \sammo\GameUnitDetail[]
@@ -435,14 +401,12 @@ class GameUnitConstBase{
protected static function _generate(){ protected static function _generate(){
if(static::$constID || static::$constName || static::$constCity || static::$constRegion || static::$constType){ if(static::$constID || static::$constName || static::$constType){
return; return;
} }
$constID = []; $constID = [];
$constName = []; $constName = [];
$constCity = [];
$constRegion = [];
$constType = []; $constType = [];
foreach(static::$_buildData as $rawUnit){ foreach(static::$_buildData as $rawUnit){
@@ -457,10 +421,7 @@ class GameUnitConstBase{
$magicCoef, $magicCoef,
$cost, $cost,
$rice, $rice,
$reqTech, $reqConstraints,
$reqCities,
$reqRegions,
$reqYear,
$attackCoef, $attackCoef,
$defenceCoef, $defenceCoef,
$info, $info,
@@ -469,21 +430,9 @@ class GameUnitConstBase{
$iActionList, $iActionList,
] = $rawUnit; ] = $rawUnit;
if($reqYear > 0){ foreach($reqConstraints as $value){
$info[] = "{$reqYear}년 경과 후 사용 가능"; /** @var GameUnitConstraint\BaseGameUnitConstraint $value */
} $info[] = $value->getInfo();
$constraints = [];
if($reqTech > 0){
$constraints[] = GameUnitConstraintHelper::ReqTech($reqTech);
}
if($reqCities !== null){
$constraints[] = GameUnitConstraintHelper::ReqCities($reqCities);
}
if($reqRegions !== null){
$constraints[] = GameUnitConstraintHelper::ReqRegions($reqRegions);
} }
$unit = new GameUnitDetail( $unit = new GameUnitDetail(
@@ -498,14 +447,12 @@ class GameUnitConstBase{
$cost, $cost,
$rice, $rice,
$reqConstraints, $reqConstraints,
$reqYear,
$attackCoef, $attackCoef,
$defenceCoef, $defenceCoef,
$info, $info,
$initSkillTrigger, $initSkillTrigger,
$phaseSkillTrigger, $phaseSkillTrigger,
$iActionList, $iActionList
$constraints
); );
$constID[$id] = $unit; $constID[$id] = $unit;
@@ -515,31 +462,10 @@ class GameUnitConstBase{
} }
$constType[$armType][$id] = $unit; $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::$constID = $constID;
static::$constName = $constName; static::$constName = $constName;
static::$constCity = $constCity;
static::$constRegion = $constRegion;
static::$constType = $constType; static::$constType = $constType;
static::_generateOptional(); static::_generateOptional();
@@ -0,0 +1,11 @@
<?php
namespace sammo\GameUnitConstraint;
use sammo\General;
abstract class BaseGameUnitConstraint {
public abstract function test(General $general, array $ownCities, array $ownRegions, int $relativeYear, int $tech, array $nationAux): bool;
public abstract function getInfo(): string;
}
@@ -1,14 +0,0 @@
<?php
namespace sammo\GameUnitConstraint;
use sammo\General;
use sammo\KVStorage;
abstract class GameUnitConstraint {
private function __construct()
{
}
public abstract function test(General $general, KVStorage $env): bool;
}
@@ -0,0 +1,36 @@
<?php
namespace sammo\GameUnitConstraint;
use sammo\CityConst;
use sammo\General;
class ReqCities extends BaseGameUnitConstraint {
public function __construct(protected array $reqCities)
{
}
public function test(General $general, array $ownCities, array $ownRegions, int $relativeYear, int $tech, array $nationAux): bool
{
foreach ($this->reqCities as $city) {
if (key_exists($city, $ownCities)) {
return true;
break;
}
}
return false;
}
public function getInfo(): string
{
$cityNames = [];
foreach ($this->reqCities as $city) {
$cityNames[] = CityConst::byID($city)->name;
}
$cityNameText = implode(', ', $cityNames);
return "{$cityNameText} 소유시 가능";
}
}
@@ -0,0 +1,44 @@
<?php
namespace sammo\GameUnitConstraint;
use sammo\General;
class ReqMinRelYear extends BaseGameUnitConstraint {
public function __construct(protected int $reqMinRelYear)
{
}
public function test(General $general, array $ownCities, array $ownRegions, int $relativeYear, int $tech, array $nationAux): bool
{
return $relativeYear >= $this->reqMinRelYear;
}
public function getInfo(): string
{
return "{$this->reqMinRelYear}년 경과 후 사용 가능";
}
}
/*
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);
}
*/
@@ -0,0 +1,36 @@
<?php
namespace sammo\GameUnitConstraint;
use sammo\CityConst;
use sammo\General;
class ReqRegions extends BaseGameUnitConstraint {
public function __construct(protected array $reqRegions)
{
}
public function test(General $general, array $ownCities, array $ownRegions, int $relativeYear, int $tech, array $nationAux): bool
{
foreach ($this->reqRegions as $region) {
if (key_exists($region, $ownRegions)) {
return true;
break;
}
}
return false;
}
public function getInfo(): string
{
$regionNames = [];
foreach ($this->reqRegions as $region) {
$regionNames[] = CityConst::$regionMap[$region];
}
$regionNameText = implode(', ', $regionNames);
return "{$regionNameText} 지역 소유시 가능";
}
}
+25
View File
@@ -0,0 +1,25 @@
<?php
namespace sammo\GameUnitConstraint;
use sammo\General;
use sammo\KVStorage;
class ReqTech extends BaseGameUnitConstraint {
public function __construct(protected int $reqTech)
{
}
public function test(General $general, array $ownCities, array $ownRegions, int $relativeYear, int $tech, array $nationAux): bool
{
if ($tech < $this->reqTech) {
return false;
}
}
public function getInfo(): string
{
return "기술력 {$this->reqTech} 이상 필요";
}
}
-26
View File
@@ -1,26 +0,0 @@
<?php
namespace sammo;
class GameUnitConstraintHelper {
static function ReqTech(int $reqTech): array {
return [__FUNCTION__, $reqTech];
}
static function ReqCities(array $reqCities): array {
return [__FUNCTION__, $reqCities];
}
static function ReqRegions(array $reqRegions): array {
return [__FUNCTION__, $reqRegions];
}
static function ReqMinYear(int $reqMinYear): array {
return [__FUNCTION__, $reqMinYear];
}
}
namespace sammo\Constraint;
+17 -11
View File
@@ -2,7 +2,7 @@
namespace sammo; namespace sammo;
use sammo\GameUnitConstraint\GameUnitConstraint; use sammo\GameUnitConstraint\BaseGameUnitConstraint;
class GameUnitDetail implements iAction class GameUnitDetail implements iAction
{ {
@@ -18,19 +18,16 @@ class GameUnitDetail implements iAction
public $magicCoef; public $magicCoef;
public $cost; public $cost;
public $rice; public $rice;
public $reqTech;
public $reqCities;
public $reqRegions;
public $reqYear;
public $attackCoef; public $attackCoef;
public $defenceCoef; public $defenceCoef;
public $info;
public $initSkillTrigger; public $initSkillTrigger;
public $phaseSkillTrigger; public $phaseSkillTrigger;
/** @var iAction[]|null iActionList */ /** @var iAction[]|null iActionList */
public $iActionList; public $iActionList;
public array $reqConstraints; public array $reqConstraints;
protected ?string $info;
public function __construct( public function __construct(
int $id, int $id,
int $armType, int $armType,
@@ -45,7 +42,6 @@ class GameUnitDetail implements iAction
array $reqConstraints, array $reqConstraints,
array $attackCoef, array $attackCoef,
array $defenceCoef, array $defenceCoef,
array $info,
?array $initSkillTrigger, ?array $initSkillTrigger,
?array $phaseSkillTrigger, ?array $phaseSkillTrigger,
?array $iActionList, ?array $iActionList,
@@ -63,7 +59,6 @@ class GameUnitDetail implements iAction
$this->reqConstraints = $reqConstraints; $this->reqConstraints = $reqConstraints;
$this->attackCoef = $attackCoef; $this->attackCoef = $attackCoef;
$this->defenceCoef = $defenceCoef; $this->defenceCoef = $defenceCoef;
$this->info = $info;
$this->initSkillTrigger = $initSkillTrigger; $this->initSkillTrigger = $initSkillTrigger;
$this->phaseSkillTrigger = $phaseSkillTrigger; $this->phaseSkillTrigger = $phaseSkillTrigger;
$this->iActionList = []; $this->iActionList = [];
@@ -78,7 +73,16 @@ class GameUnitDetail implements iAction
public function getInfo(): string public function getInfo(): string
{ {
return join("\n<br>", $this->info); if($this->info !== null){
return $this->info;
}
$info = [];
foreach ($this->reqConstraints as $constraint) {
$info[] = $constraint->getInfo();
}
$this->info = join("\n<br>", $info);
return $this->info;
} }
public function getShortName(): string public function getShortName(): string
@@ -195,8 +199,10 @@ class GameUnitDetail implements iAction
//음수 없음 //음수 없음
$relativeYear = max(0, $relativeYear); $relativeYear = max(0, $relativeYear);
if ($relativeYear < $this->reqYear) { foreach($this->reqConstraints as $constraint){
return false; if(!$constraint->test($ownCities, $ownRegions, $relativeYear, $tech)){
return false;
}
} }
if ($tech < $this->reqTech) { if ($tech < $this->reqTech) {