ytkns/src/ZoneEffect.php
2020-06-10 16:03:13 +00:00

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;
}
}