103 lines
3 KiB
PHP
103 lines
3 KiB
PHP
<?php
|
|
namespace YTKNS;
|
|
|
|
use Exception;
|
|
|
|
class ZoneEffectClassNotFoundException extends Exception {};
|
|
|
|
final class ZoneEffect {
|
|
private const CLASS_NAME = '\\YTKNS\\Effects\\%sEffect';
|
|
|
|
public function __construct() {
|
|
}
|
|
|
|
public function getZoneId(): int {
|
|
return $this->zone_id ?? 0;
|
|
}
|
|
public function getZone(): Zone {
|
|
return Zone::byId($this->getZoneId());
|
|
}
|
|
public function setZoneId(Zone $zone): void {
|
|
$this->zone_id = $zone->getId();
|
|
}
|
|
|
|
public function getEffectName(): string {
|
|
return $this->effect_name;
|
|
}
|
|
public function setEffectName(string $name): void {
|
|
$this->effect_name = $name;
|
|
}
|
|
|
|
public function getEffectParams(): array {
|
|
if(!isset($this->effect_params) || $this->effect_params === null)
|
|
return [];
|
|
|
|
if(is_string($this->effect_params))
|
|
$this->effect_params = json_decode($this->effect_params, true);
|
|
|
|
return $this->effect_params;
|
|
}
|
|
public function setEffectParams(array $params): void {
|
|
$this->effect_params = $params;
|
|
}
|
|
|
|
public static function effectClassName(string $name): string {
|
|
return sprintf(self::CLASS_NAME, $name);
|
|
}
|
|
public function getEffectClassName(): string {
|
|
return self::effectClassName($this->getEffectName());
|
|
}
|
|
public static function effectClass(string $name) {
|
|
$className = self::effectClassName($name);
|
|
|
|
if(!class_exists($className))
|
|
throw new ZoneEffectClassNotFoundException($name);
|
|
|
|
return new $className;
|
|
}
|
|
public function getEffectClass(bool $quiet = false) {
|
|
try {
|
|
$effect = self::effectClass($this->getEffectName());
|
|
$effect->setEffectParams($this->getEffectParams(), $quiet);
|
|
return $effect;
|
|
} catch(ZoneEffectClassNotFoundException $ex) {
|
|
return null;
|
|
}
|
|
}
|
|
public function applyEffect(PageBuilder $builder, bool $quiet = false): void {
|
|
$effect = $this->getEffectClass($quiet);
|
|
|
|
if($effect !== null)
|
|
$effect->applyEffect($builder);
|
|
}
|
|
|
|
public static function byZone(Zone $zone): array {
|
|
$getEffects = DB::prepare('
|
|
SELECT `zone_id`, `effect_name`, `effect_params`
|
|
FROM `ytkns_zones_effects`
|
|
WHERE `zone_id` = :zone
|
|
');
|
|
$getEffects->bindValue('zone', $zone->getId());
|
|
if(!$getEffects->execute())
|
|
return [];
|
|
|
|
$effects = [];
|
|
while($effect = $getEffects->fetchObject(self::class))
|
|
$effects[] = $effect;
|
|
|
|
return $effects;
|
|
}
|
|
|
|
public function toJson(bool $asString = false) {
|
|
$effectInfo = [
|
|
'type' => $this->getEffectName(),
|
|
'values' => $this->getEffectParams(),
|
|
];
|
|
|
|
if($asString)
|
|
$effectInfo = json_encode($effectInfo);
|
|
|
|
return $effectInfo;
|
|
}
|
|
}
|