@@ -52,27 +52,27 @@ discard block |
||
52 | 52 | |
53 | 53 | protected function configureOptions(OptionsResolver $resolver): void |
54 | 54 | { |
55 | - $allStats = ["id", "name", "slot", "type", "strength", "worn",]; |
|
55 | + $allStats = ["id", "name", "slot", "type", "strength", "worn", ]; |
|
56 | 56 | $resolver->setRequired($allStats); |
57 | 57 | $resolver->setAllowedTypes("id", "integer"); |
58 | 58 | $resolver->setAllowedTypes("name", "string"); |
59 | 59 | $resolver->setAllowedTypes("slot", "string"); |
60 | - $resolver->setAllowedValues("slot", function (string $value): bool { |
|
60 | + $resolver->setAllowedValues("slot", function(string $value): bool { |
|
61 | 61 | return in_array($value, $this->getAllowedSlots(), true); |
62 | 62 | }); |
63 | 63 | $resolver->setAllowedTypes("type", "null"); |
64 | 64 | $resolver->setDefault("type", null); |
65 | 65 | $resolver->setAllowedTypes("strength", "integer"); |
66 | - $resolver->setAllowedValues("strength", function (int $value): bool { |
|
66 | + $resolver->setAllowedValues("strength", function(int $value): bool { |
|
67 | 67 | return ($value >= 0); |
68 | 68 | }); |
69 | 69 | $resolver->setAllowedTypes("worn", "boolean"); |
70 | 70 | $resolver->setDefault("maxDurability", 0); |
71 | 71 | $resolver->setAllowedTypes("maxDurability", "integer"); |
72 | - $resolver->setAllowedValues("maxDurability", function (int $value): bool { |
|
72 | + $resolver->setAllowedValues("maxDurability", function(int $value): bool { |
|
73 | 73 | return ($value >= 0); |
74 | 74 | }); |
75 | - $resolver->setDefault("durability", function (Options $options) { |
|
75 | + $resolver->setDefault("durability", function(Options $options) { |
|
76 | 76 | return $options["maxDurability"]; |
77 | 77 | }); |
78 | 78 | $resolver->setAllowedTypes("durability", "integer"); |
@@ -85,13 +85,13 @@ discard block |
||
85 | 85 | |
86 | 86 | protected function getStrength(): int |
87 | 87 | { |
88 | - if ($this->durability >= $this->maxDurability * 0.7) { |
|
88 | + if($this->durability >= $this->maxDurability * 0.7) { |
|
89 | 89 | return $this->rawStrength; |
90 | - } elseif ($this->durability >= $this->maxDurability / 2) { |
|
90 | + } elseif($this->durability >= $this->maxDurability / 2) { |
|
91 | 91 | return (int) ($this->rawStrength * 0.75); |
92 | - } elseif ($this->durability >= $this->maxDurability / 4) { |
|
92 | + } elseif($this->durability >= $this->maxDurability / 4) { |
|
93 | 93 | return (int) ($this->rawStrength / 2); |
94 | - } elseif ($this->durability >= $this->maxDurability / 10) { |
|
94 | + } elseif($this->durability >= $this->maxDurability / 10) { |
|
95 | 95 | return (int) ($this->rawStrength / 4); |
96 | 96 | } |
97 | 97 | return 0; |
@@ -127,7 +127,7 @@ discard block |
||
127 | 127 | |
128 | 128 | public function getCombatEffects(): array |
129 | 129 | { |
130 | - if (!$this->worn) { |
|
130 | + if(!$this->worn) { |
|
131 | 131 | return []; |
132 | 132 | } |
133 | 133 | return [new CharacterEffect($this->getDeployParams())]; |
@@ -15,8 +15,7 @@ discard block |
||
15 | 15 | * @property-read int $strength |
16 | 16 | * @property int $durability |
17 | 17 | */ |
18 | -class Equipment implements ICharacterEffectsProvider |
|
19 | -{ |
|
18 | +class Equipment implements ICharacterEffectsProvider { |
|
20 | 19 | use \Nette\SmartObject; |
21 | 20 | |
22 | 21 | public const SLOT_WEAPON = "weapon"; |
@@ -35,8 +34,7 @@ discard block |
||
35 | 34 | protected int $durability; |
36 | 35 | public readonly int $maxDurability; |
37 | 36 | |
38 | - public function __construct(array $data) |
|
39 | - { |
|
37 | + public function __construct(array $data) { |
|
40 | 38 | $resolver = new OptionsResolver(); |
41 | 39 | $this->configureOptions($resolver); |
42 | 40 | $data = $resolver->resolve($data); |
@@ -20,13 +20,13 @@ discard block |
||
20 | 20 | public static function moreDamage(CombatBase $combat): int |
21 | 21 | { |
22 | 22 | $result = 0; |
23 | - if ($combat->round <= $combat->roundLimit) { |
|
24 | - if (!$combat->team1->hasAliveMembers()) { |
|
23 | + if($combat->round <= $combat->roundLimit) { |
|
24 | + if(!$combat->team1->hasAliveMembers()) { |
|
25 | 25 | $result = 2; |
26 | - } elseif (!$combat->team2->hasAliveMembers()) { |
|
26 | + } elseif(!$combat->team2->hasAliveMembers()) { |
|
27 | 27 | $result = 1; |
28 | 28 | } |
29 | - } elseif ($combat->round > $combat->roundLimit) { |
|
29 | + } elseif($combat->round > $combat->roundLimit) { |
|
30 | 30 | $result = ($combat->team1Damage > $combat->team2Damage) ? 1 : 2; |
31 | 31 | } |
32 | 32 | return $result; |
@@ -39,13 +39,13 @@ discard block |
||
39 | 39 | public static function eliminateSecondTeam(CombatBase $combat): int |
40 | 40 | { |
41 | 41 | $result = 0; |
42 | - if ($combat->round <= $combat->roundLimit) { |
|
43 | - if (!$combat->team1->hasAliveMembers()) { |
|
42 | + if($combat->round <= $combat->roundLimit) { |
|
43 | + if(!$combat->team1->hasAliveMembers()) { |
|
44 | 44 | $result = 2; |
45 | - } elseif (!$combat->team2->hasAliveMembers()) { |
|
45 | + } elseif(!$combat->team2->hasAliveMembers()) { |
|
46 | 46 | $result = 1; |
47 | 47 | } |
48 | - } elseif ($combat->round > $combat->roundLimit) { |
|
48 | + } elseif($combat->round > $combat->roundLimit) { |
|
49 | 49 | $result = (!$combat->team2->hasAliveMembers()) ? 1 : 2; |
50 | 50 | } |
51 | 51 | return $result; |
@@ -58,13 +58,13 @@ discard block |
||
58 | 58 | public static function firstTeamSurvives(CombatBase $combat): int |
59 | 59 | { |
60 | 60 | $result = 0; |
61 | - if ($combat->round <= $combat->roundLimit) { |
|
62 | - if (!$combat->team1->hasAliveMembers()) { |
|
61 | + if($combat->round <= $combat->roundLimit) { |
|
62 | + if(!$combat->team1->hasAliveMembers()) { |
|
63 | 63 | $result = 2; |
64 | - } elseif (!$combat->team2->hasAliveMembers()) { |
|
64 | + } elseif(!$combat->team2->hasAliveMembers()) { |
|
65 | 65 | $result = 1; |
66 | 66 | } |
67 | - } elseif ($combat->round > $combat->roundLimit) { |
|
67 | + } elseif($combat->round > $combat->roundLimit) { |
|
68 | 68 | $result = ($combat->team1->hasAliveMembers()) ? 1 : 2; |
69 | 69 | } |
70 | 70 | return $result; |
@@ -8,8 +8,7 @@ |
||
8 | 8 | * |
9 | 9 | * @author Jakub Konečný |
10 | 10 | */ |
11 | -final class VictoryConditions |
|
12 | -{ |
|
11 | +final class VictoryConditions { |
|
13 | 12 | use \Nette\StaticClass; |
14 | 13 | |
15 | 14 | /** |
@@ -21,7 +21,7 @@ |
||
21 | 21 | ]; |
22 | 22 | $formula = str_replace(array_keys($stats), array_values($stats), $formula); |
23 | 23 | preg_match("/^([1-9]+)d([1-9]+)/", $formula, $dices); |
24 | - for ($i = 1; $i <= (int) $dices[1]; $i++) { |
|
24 | + for($i = 1; $i <= (int) $dices[1]; $i++) { |
|
25 | 25 | $result += rand(1, (int) $dices[2]); |
26 | 26 | } |
27 | 27 | preg_match("/\+([0-9]+)\/([0-9]+)/", $formula, $ammendum); |
@@ -8,8 +8,7 @@ |
||
8 | 8 | * |
9 | 9 | * @author Jakub Konečný |
10 | 10 | */ |
11 | -final class InitiativeFormulaParser implements IInitiativeFormulaParser |
|
12 | -{ |
|
11 | +final class InitiativeFormulaParser implements IInitiativeFormulaParser { |
|
13 | 12 | public function calculateInitiative(Character $character): int |
14 | 13 | { |
15 | 14 | $result = 0; |
@@ -23,7 +23,7 @@ discard block |
||
23 | 23 | public const TARGET_PARTY = "party"; |
24 | 24 | public const TARGET_ENEMY_PARTY = "enemy_party"; |
25 | 25 | /** @var string[] */ |
26 | - public const NO_STAT_TYPES = [self::TYPE_STUN, self::TYPE_POISON, self::TYPE_HIDE,]; |
|
26 | + public const NO_STAT_TYPES = [self::TYPE_STUN, self::TYPE_POISON, self::TYPE_HIDE, ]; |
|
27 | 27 | |
28 | 28 | public readonly string $type; |
29 | 29 | public readonly ?string $stat; |
@@ -50,26 +50,26 @@ discard block |
||
50 | 50 | protected function configureOptions(OptionsResolver $resolver): void |
51 | 51 | { |
52 | 52 | parent::configureOptions($resolver); |
53 | - $allStats = ["type", "stat", "value", "valueGrowth", "duration",]; |
|
53 | + $allStats = ["type", "stat", "value", "valueGrowth", "duration", ]; |
|
54 | 54 | $resolver->setRequired($allStats); |
55 | 55 | $resolver->setAllowedTypes("type", "string"); |
56 | - $resolver->setAllowedValues("type", function (string $value): bool { |
|
56 | + $resolver->setAllowedValues("type", function(string $value): bool { |
|
57 | 57 | return in_array($value, $this->getAllowedTypes(), true); |
58 | 58 | }); |
59 | 59 | $resolver->setAllowedTypes("stat", ["string", "null"]); |
60 | - $resolver->setAllowedValues("stat", function (?string $value): bool { |
|
60 | + $resolver->setAllowedValues("stat", function(?string $value): bool { |
|
61 | 61 | return $value === null || in_array($value, $this->getAllowedStats(), true); |
62 | 62 | }); |
63 | 63 | $resolver->setAllowedTypes("value", "integer"); |
64 | - $resolver->setAllowedValues("value", function (int $value): bool { |
|
64 | + $resolver->setAllowedValues("value", function(int $value): bool { |
|
65 | 65 | return ($value >= 0); |
66 | 66 | }); |
67 | 67 | $resolver->setAllowedTypes("valueGrowth", "integer"); |
68 | - $resolver->setAllowedValues("valueGrowth", function (int $value): bool { |
|
68 | + $resolver->setAllowedValues("valueGrowth", function(int $value): bool { |
|
69 | 69 | return ($value >= 0); |
70 | 70 | }); |
71 | 71 | $resolver->setAllowedTypes("duration", "integer"); |
72 | - $resolver->setAllowedValues("duration", function (int $value): bool { |
|
72 | + $resolver->setAllowedValues("duration", function(int $value): bool { |
|
73 | 73 | return ($value >= 0); |
74 | 74 | }); |
75 | 75 | } |
@@ -11,8 +11,7 @@ discard block |
||
11 | 11 | * |
12 | 12 | * @author Jakub Konečný |
13 | 13 | */ |
14 | -final class SkillSpecial extends BaseSkill |
|
15 | -{ |
|
14 | +final class SkillSpecial extends BaseSkill { |
|
16 | 15 | public const TYPE_BUFF = "buff"; |
17 | 16 | public const TYPE_DEBUFF = "debuff"; |
18 | 17 | public const TYPE_STUN = "stun"; |
@@ -31,8 +30,7 @@ discard block |
||
31 | 30 | public readonly int $valueGrowth; |
32 | 31 | public readonly int $duration; |
33 | 32 | |
34 | - public function __construct(array $data) |
|
35 | - { |
|
33 | + public function __construct(array $data) { |
|
36 | 34 | $resolver = new OptionsResolver(); |
37 | 35 | $this->configureOptions($resolver); |
38 | 36 | $data = $resolver->resolve($data); |
@@ -59,7 +59,7 @@ discard block |
||
59 | 59 | public ICombatActionSelector $actionSelector = new CombatActionSelector() |
60 | 60 | ) { |
61 | 61 | $this->victoryCondition = [VictoryConditions::class, "moreDamage"]; |
62 | - $this->healers = function (): Team { |
|
62 | + $this->healers = function(): Team { |
|
63 | 63 | return new Team("healers"); |
64 | 64 | }; |
65 | 65 | $this->combatActions = new class extends Collection { |
@@ -113,7 +113,7 @@ discard block |
||
113 | 113 | */ |
114 | 114 | public function setTeams(Team $team1, Team $team2): void |
115 | 115 | { |
116 | - if (isset($this->team1)) { |
|
116 | + if(isset($this->team1)) { |
|
117 | 117 | throw new ImmutableException("Teams has already been set."); |
118 | 118 | } |
119 | 119 | $this->team1 = $team1; |
@@ -191,7 +191,7 @@ discard block |
||
191 | 191 | public function getWinner(): int |
192 | 192 | { |
193 | 193 | static $result = 0; |
194 | - if ($result === 0) { |
|
194 | + if($result === 0) { |
|
195 | 195 | $result = call_user_func($this->victoryCondition, $this); |
196 | 196 | $result = Numbers::range($result, 0, 2); |
197 | 197 | } |
@@ -218,30 +218,30 @@ discard block |
||
218 | 218 | { |
219 | 219 | /** @var Character[] $characters */ |
220 | 220 | $characters = array_merge($combat->team1->toArray(), $combat->team2->toArray()); |
221 | - foreach ($characters as $character) { |
|
221 | + foreach($characters as $character) { |
|
222 | 222 | $character->applyEffectProviders(); |
223 | 223 | } |
224 | 224 | } |
225 | 225 | |
226 | 226 | public function assignPositions(self $combat): void |
227 | 227 | { |
228 | - $assignPositions = function (Team $team): void { |
|
228 | + $assignPositions = function(Team $team): void { |
|
229 | 229 | $row = 1; |
230 | 230 | $column = 0; |
231 | 231 | /** @var Character $character */ |
232 | - foreach ($team as $character) { |
|
232 | + foreach($team as $character) { |
|
233 | 233 | try { |
234 | 234 | $column++; |
235 | - if ($character->positionRow > 0 && $character->positionColumn > 0) { |
|
235 | + if($character->positionRow > 0 && $character->positionColumn > 0) { |
|
236 | 236 | continue; |
237 | 237 | } |
238 | 238 | setPosition: |
239 | 239 | $team->setCharacterPosition($character->id, $row, $column); |
240 | - } catch (InvalidCharacterPositionException $e) { |
|
241 | - if ($e->getCode() === InvalidCharacterPositionException::ROW_FULL) { |
|
240 | + } catch(InvalidCharacterPositionException $e) { |
|
241 | + if($e->getCode() === InvalidCharacterPositionException::ROW_FULL) { |
|
242 | 242 | $row++; |
243 | 243 | $column = 1; |
244 | - } elseif ($e->getCode() === InvalidCharacterPositionException::POSITION_OCCUPIED) { |
|
244 | + } elseif($e->getCode() === InvalidCharacterPositionException::POSITION_OCCUPIED) { |
|
245 | 245 | $column++; |
246 | 246 | } else { |
247 | 247 | throw $e; |
@@ -258,9 +258,9 @@ discard block |
||
258 | 258 | { |
259 | 259 | /** @var Character[] $characters */ |
260 | 260 | $characters = array_merge($combat->team1->toArray(), $combat->team2->toArray()); |
261 | - foreach ($characters as $character) { |
|
262 | - foreach ($character->effects as $effect) { |
|
263 | - if (is_int($effect->duration)) { |
|
261 | + foreach($characters as $character) { |
|
262 | + foreach($character->effects as $effect) { |
|
263 | + if(is_int($effect->duration)) { |
|
264 | 264 | $effect->duration--; |
265 | 265 | } |
266 | 266 | } |
@@ -274,8 +274,8 @@ discard block |
||
274 | 274 | { |
275 | 275 | /** @var Character[] $characters */ |
276 | 276 | $characters = array_merge($combat->team1->toArray(), $combat->team2->toArray()); |
277 | - foreach ($characters as $character) { |
|
278 | - foreach ($character->skills as $skill) { |
|
277 | + foreach($characters as $character) { |
|
278 | + foreach($character->skills as $skill) { |
|
279 | 279 | $skill->decreaseCooldown(); |
280 | 280 | } |
281 | 281 | } |
@@ -288,7 +288,7 @@ discard block |
||
288 | 288 | { |
289 | 289 | /** @var Character[] $characters */ |
290 | 290 | $characters = array_merge($combat->team1->toArray(), $combat->team2->toArray()); |
291 | - foreach ($characters as $character) { |
|
291 | + foreach($characters as $character) { |
|
292 | 292 | $character->effects->removeByFilter(["duration!=" => CharacterEffect::DURATION_FOREVER]); |
293 | 293 | } |
294 | 294 | } |
@@ -322,7 +322,7 @@ discard block |
||
322 | 322 | { |
323 | 323 | /** @var Character[] $characters */ |
324 | 324 | $characters = array_merge($combat->team1->toArray(), $combat->team2->toArray()); |
325 | - foreach ($characters as $character) { |
|
325 | + foreach($characters as $character) { |
|
326 | 326 | $character->recalculateStats(); |
327 | 327 | } |
328 | 328 | } |
@@ -334,7 +334,7 @@ discard block |
||
334 | 334 | { |
335 | 335 | /** @var Character[] $characters */ |
336 | 336 | $characters = array_merge($combat->team1->toArray(), $combat->team2->toArray()); |
337 | - foreach ($characters as $character) { |
|
337 | + foreach($characters as $character) { |
|
338 | 338 | $character->resetInitiative(); |
339 | 339 | } |
340 | 340 | } |
@@ -347,21 +347,21 @@ discard block |
||
347 | 347 | public function selectAttackTarget(Character $attacker): ?Character |
348 | 348 | { |
349 | 349 | $enemyTeam = $this->getEnemyTeam($attacker); |
350 | - $rangedWeapon = ($attacker->equipment->hasItems(["%class%" => Weapon::class, "worn" => true, "ranged" => true,])); |
|
351 | - if (!$rangedWeapon) { |
|
350 | + $rangedWeapon = ($attacker->equipment->hasItems(["%class%" => Weapon::class, "worn" => true, "ranged" => true, ])); |
|
351 | + if(!$rangedWeapon) { |
|
352 | 352 | $rowToAttack = $enemyTeam->rowToAttack; |
353 | - if ($rowToAttack === null) { |
|
353 | + if($rowToAttack === null) { |
|
354 | 354 | return null; |
355 | 355 | } |
356 | 356 | $enemies = Team::fromArray( |
357 | - $enemyTeam->getItems(["positionRow" => $rowToAttack, "hitpoints>" => 0, "hidden" => false,]), |
|
357 | + $enemyTeam->getItems(["positionRow" => $rowToAttack, "hitpoints>" => 0, "hidden" => false, ]), |
|
358 | 358 | $enemyTeam->name |
359 | 359 | ); |
360 | 360 | } else { |
361 | 361 | $enemies = $enemyTeam; |
362 | 362 | } |
363 | 363 | $target = $enemies->getLowestHpCharacter(); |
364 | - if ($target !== null) { |
|
364 | + if($target !== null) { |
|
365 | 365 | return $target; |
366 | 366 | } |
367 | 367 | return $enemies->getRandomCharacter(); |
@@ -376,13 +376,13 @@ discard block |
||
376 | 376 | { |
377 | 377 | /** @var Character[] $characters */ |
378 | 378 | $characters = array_merge($combat->team1->usableMembers, $combat->team2->usableMembers); |
379 | - usort($characters, function (Character $a, Character $b): int { |
|
379 | + usort($characters, function(Character $a, Character $b): int { |
|
380 | 380 | return -1 * strcmp((string) $a->initiative, (string) $b->initiative); |
381 | 381 | }); |
382 | - foreach ($characters as $character) { |
|
382 | + foreach($characters as $character) { |
|
383 | 383 | /** @var ICombatAction|null $combatAction */ |
384 | 384 | $combatAction = $combat->actionSelector->chooseAction($combat, $character); |
385 | - if ($combatAction === null) { |
|
385 | + if($combatAction === null) { |
|
386 | 386 | break; |
387 | 387 | } |
388 | 388 | $combatAction->do($combat, $character); |
@@ -396,18 +396,18 @@ discard block |
||
396 | 396 | */ |
397 | 397 | public function execute(): int |
398 | 398 | { |
399 | - if (!isset($this->team1)) { |
|
399 | + if(!isset($this->team1)) { |
|
400 | 400 | throw new InvalidStateException("Teams are not set."); |
401 | 401 | } |
402 | 402 | $this->onCombatStart($this); |
403 | - while ($this->round <= $this->roundLimit) { |
|
403 | + while($this->round <= $this->roundLimit) { |
|
404 | 404 | $this->onRoundStart($this); |
405 | - if ($this->getWinner() > 0) { |
|
405 | + if($this->getWinner() > 0) { |
|
406 | 406 | break; |
407 | 407 | } |
408 | 408 | $this->onRound($this); |
409 | 409 | $this->onRoundEnd($this); |
410 | - if ($this->getWinner() > 0) { |
|
410 | + if($this->getWinner() > 0) { |
|
411 | 411 | break; |
412 | 412 | } |
413 | 413 | } |
@@ -422,10 +422,10 @@ discard block |
||
422 | 422 | { |
423 | 423 | /** @var Character[] $characters */ |
424 | 424 | $characters = array_merge( |
425 | - $combat->team1->getItems(["hitpoints>" => 0, "poisoned!=" => false,]), |
|
426 | - $combat->team2->getItems(["hitpoints>" => 0, "poisoned!=" => false,]) |
|
425 | + $combat->team1->getItems(["hitpoints>" => 0, "poisoned!=" => false, ]), |
|
426 | + $combat->team2->getItems(["hitpoints>" => 0, "poisoned!=" => false, ]) |
|
427 | 427 | ); |
428 | - foreach ($characters as $character) { |
|
428 | + foreach($characters as $character) { |
|
429 | 429 | $poisonValue = $character->getStatus(Character::STATUS_POISONED); |
430 | 430 | $character->harm($poisonValue); |
431 | 431 | $action = [ |
@@ -26,8 +26,7 @@ |
||
26 | 26 | * @method void onRound(CombatBase $combat) |
27 | 27 | * @method void onRoundEnd(CombatBase $combat) |
28 | 28 | */ |
29 | -class CombatBase |
|
30 | -{ |
|
29 | +class CombatBase { |
|
31 | 30 | use \Nette\SmartObject; |
32 | 31 | |
33 | 32 | protected Team $team1; |
@@ -28,10 +28,10 @@ discard block |
||
28 | 28 | public function shouldUse(CombatBase $combat, Character $character): bool |
29 | 29 | { |
30 | 30 | $attackTarget = $combat->selectAttackTarget($character); |
31 | - if ($attackTarget === null) { |
|
31 | + if($attackTarget === null) { |
|
32 | 32 | return false; |
33 | 33 | } |
34 | - if (count($character->usableSkills) < 1) { |
|
34 | + if(count($character->usableSkills) < 1) { |
|
35 | 35 | return false; |
36 | 36 | } |
37 | 37 | return ($character->usableSkills[0] instanceof CharacterAttackSkill); |
@@ -46,11 +46,11 @@ discard block |
||
46 | 46 | $result = []; |
47 | 47 | $result["result"] = $combat->successCalculator->hasHit($attacker, $defender, $skill); |
48 | 48 | $result["amount"] = 0; |
49 | - if ($result["result"]) { |
|
49 | + if($result["result"]) { |
|
50 | 50 | $amount = (int) (($attacker->damage - $defender->defense) / 100 * $skill->damage); |
51 | 51 | $result["amount"] = Numbers::range($amount, 0, $defender->hitpoints); |
52 | 52 | } |
53 | - if ($result["amount"] > 0) { |
|
53 | + if($result["amount"] > 0) { |
|
54 | 54 | $defender->harm($result["amount"]); |
55 | 55 | } |
56 | 56 | $result["action"] = $this->getName(); |
@@ -77,9 +77,9 @@ discard block |
||
77 | 77 | Skill::TARGET_COLUMN => $combat->getTeam($primaryTarget)->getItems(["positionColumn" => $primaryTarget->positionColumn]), |
78 | 78 | default => throw new NotImplementedException("Target {$skill->skill->target} for attack skills is not implemented."), |
79 | 79 | }; |
80 | - foreach ($targets as $target) { |
|
81 | - for ($i = 1; $i <= $skill->skill->strikes; $i++) { |
|
82 | - if ($target->hitpoints > 0) { |
|
80 | + foreach($targets as $target) { |
|
81 | + for($i = 1; $i <= $skill->skill->strikes; $i++) { |
|
82 | + if($target->hitpoints > 0) { |
|
83 | 83 | $this->doSingleAttack($character, $target, $skill, $combat); |
84 | 84 | } |
85 | 85 | } |
@@ -11,8 +11,7 @@ discard block |
||
11 | 11 | use HeroesofAbenez\Combat\NotImplementedException; |
12 | 12 | use Nexendrie\Utils\Numbers; |
13 | 13 | |
14 | -final class SkillAttack implements ICombatAction |
|
15 | -{ |
|
14 | +final class SkillAttack implements ICombatAction { |
|
16 | 15 | public const ACTION_NAME = "skill_attack"; |
17 | 16 | |
18 | 17 | public function getName(): string |
@@ -65,10 +64,12 @@ discard block |
||
65 | 64 | /** |
66 | 65 | * @throws NotImplementedException |
67 | 66 | */ |
68 | - public function do(CombatBase $combat, Character $character): void |
|
67 | + public function do { |
|
68 | + (CombatBase $combat, Character $character): void |
|
69 | 69 | { |
70 | 70 | /** @var CharacterAttackSkill $skill */ |
71 | 71 | $skill = $character->usableSkills[0]; |
72 | + } |
|
72 | 73 | /** @var Character $primaryTarget */ |
73 | 74 | $primaryTarget = $combat->selectAttackTarget($character); |
74 | 75 | $targets = match ($skill->skill->target) { |
@@ -75,7 +75,7 @@ |
||
75 | 75 | Skill::TARGET_SINGLE => [$primaryTarget], |
76 | 76 | Skill::TARGET_ROW => $combat->getTeam($primaryTarget)->getItems(["positionRow" => $primaryTarget->positionRow]), |
77 | 77 | Skill::TARGET_COLUMN => $combat->getTeam($primaryTarget)->getItems(["positionColumn" => $primaryTarget->positionColumn]), |
78 | - default => throw new NotImplementedException("Target {$skill->skill->target} for attack skills is not implemented."), |
|
78 | + default => throw new NotImplementedException("target {$skill->skill->target} for attack skills is not implemented."), |
|
79 | 79 | }; |
80 | 80 | foreach ($targets as $target) { |
81 | 81 | for ($i = 1; $i <= $skill->skill->strikes; $i++) { |
@@ -36,16 +36,16 @@ |
||
36 | 36 | { |
37 | 37 | $result = []; |
38 | 38 | $defender = $combat->selectAttackTarget($character); |
39 | - if ($defender === null) { |
|
39 | + if($defender === null) { |
|
40 | 40 | return; |
41 | 41 | } |
42 | 42 | $result["result"] = $combat->successCalculator->hasHit($character, $defender); |
43 | 43 | $result["amount"] = 0; |
44 | - if ($result["result"]) { |
|
44 | + if($result["result"]) { |
|
45 | 45 | $amount = $character->damage - $defender->defense; |
46 | 46 | $result["amount"] = Numbers::range($amount, 0, $defender->hitpoints); |
47 | 47 | } |
48 | - if ($result["amount"] > 0) { |
|
48 | + if($result["amount"] > 0) { |
|
49 | 49 | $defender->harm($result["amount"]); |
50 | 50 | } |
51 | 51 | $result["action"] = $this->getName(); |
@@ -8,8 +8,7 @@ discard block |
||
8 | 8 | use HeroesofAbenez\Combat\ICombatAction; |
9 | 9 | use Nexendrie\Utils\Numbers; |
10 | 10 | |
11 | -final class Attack implements ICombatAction |
|
12 | -{ |
|
11 | +final class Attack implements ICombatAction { |
|
13 | 12 | public const ACTION_NAME = "attack"; |
14 | 13 | |
15 | 14 | public function getName(): string |
@@ -32,9 +31,11 @@ discard block |
||
32 | 31 | * Hit chance = Attacker's hit - Defender's dodge, but at least 15% |
33 | 32 | * Damage = Attacker's damage - defender's defense |
34 | 33 | */ |
35 | - public function do(CombatBase $combat, Character $character): void |
|
34 | + public function do { |
|
35 | + (CombatBase $combat, Character $character): void |
|
36 | 36 | { |
37 | 37 | $result = []; |
38 | + } |
|
38 | 39 | $defender = $combat->selectAttackTarget($character); |
39 | 40 | if ($defender === null) { |
40 | 41 | return; |
@@ -28,10 +28,10 @@ discard block |
||
28 | 28 | public function shouldUse(CombatBase $combat, Character $character): bool |
29 | 29 | { |
30 | 30 | $attackTarget = $combat->selectAttackTarget($character); |
31 | - if ($attackTarget === null) { |
|
31 | + if($attackTarget === null) { |
|
32 | 32 | return false; |
33 | 33 | } |
34 | - if (count($character->usableSkills) < 1) { |
|
34 | + if(count($character->usableSkills) < 1) { |
|
35 | 35 | return false; |
36 | 36 | } |
37 | 37 | return ($character->usableSkills[0] instanceof CharacterSpecialSkill); |
@@ -74,7 +74,7 @@ discard block |
||
74 | 74 | Skill::TARGET_ENEMY_PARTY => $combat->getEnemyTeam($character)->toArray(), |
75 | 75 | default => throw new NotImplementedException("Target {$skill->skill->target} for special skills is not implemented."), |
76 | 76 | }; |
77 | - foreach ($targets as $target) { |
|
77 | + foreach($targets as $target) { |
|
78 | 78 | $this->doSingleTarget($character, $target, $skill, $combat); |
79 | 79 | } |
80 | 80 | } |
@@ -11,8 +11,7 @@ discard block |
||
11 | 11 | use HeroesofAbenez\Combat\NotImplementedException; |
12 | 12 | use HeroesofAbenez\Combat\CharacterEffect; |
13 | 13 | |
14 | -final class SkillSpecial implements ICombatAction |
|
15 | -{ |
|
14 | +final class SkillSpecial implements ICombatAction { |
|
16 | 15 | public const ACTION_NAME = "skill_special"; |
17 | 16 | |
18 | 17 | public function getName(): string |
@@ -63,10 +62,12 @@ discard block |
||
63 | 62 | /** |
64 | 63 | * @throws NotImplementedException |
65 | 64 | */ |
66 | - public function do(CombatBase $combat, Character $character): void |
|
65 | + public function do { |
|
66 | + (CombatBase $combat, Character $character): void |
|
67 | 67 | { |
68 | 68 | /** @var CharacterSpecialSkill $skill */ |
69 | 69 | $skill = $character->usableSkills[0]; |
70 | + } |
|
70 | 71 | $targets = match ($skill->skill->target) { |
71 | 72 | Skill::TARGET_ENEMY => [$combat->selectAttackTarget($character)], |
72 | 73 | Skill::TARGET_SELF => [$character], |
@@ -48,7 +48,7 @@ discard block |
||
48 | 48 | "character1" => $character1, "character2" => $target, |
49 | 49 | ]; |
50 | 50 | $effect = new CharacterEffect([ |
51 | - "id" => "skill{$skill->skill->id}Effect", |
|
51 | + "id" => "skill{$skill->skill->id}effect", |
|
52 | 52 | "type" => $skill->skill->type, |
53 | 53 | "stat" => ((in_array($skill->skill->type, Skill::NO_STAT_TYPES, true)) ? null : $skill->skill->stat), |
54 | 54 | "value" => $skill->value, |
@@ -72,7 +72,7 @@ discard block |
||
72 | 72 | Skill::TARGET_SELF => [$character], |
73 | 73 | Skill::TARGET_PARTY => $combat->getTeam($character)->toArray(), |
74 | 74 | Skill::TARGET_ENEMY_PARTY => $combat->getEnemyTeam($character)->toArray(), |
75 | - default => throw new NotImplementedException("Target {$skill->skill->target} for special skills is not implemented."), |
|
75 | + default => throw new NotImplementedException("target {$skill->skill->target} for special skills is not implemented."), |
|
76 | 76 | }; |
77 | 77 | foreach ($targets as $target) { |
78 | 78 | $this->doSingleTarget($character, $target, $skill, $combat); |
@@ -36,7 +36,7 @@ discard block |
||
36 | 36 | $result["result"] = $combat->successCalculator->hasHealed($character); |
37 | 37 | $amount = ($result["result"]) ? (int) ($character->intelligence / 2) : 0; |
38 | 38 | $result["amount"] = Numbers::range($amount, 0, $patient->maxHitpoints - $patient->hitpoints); |
39 | - if ($result["amount"] > 0) { |
|
39 | + if($result["amount"] > 0) { |
|
40 | 40 | $patient->heal($result["amount"]); |
41 | 41 | } |
42 | 42 | $result["action"] = $this->getName(); |
@@ -49,7 +49,7 @@ discard block |
||
49 | 49 | private function findHealers(CombatBase $combat): Team |
50 | 50 | { |
51 | 51 | $healers = call_user_func($combat->healers, $combat->team1, $combat->team2); |
52 | - if ($healers instanceof Team) { |
|
52 | + if($healers instanceof Team) { |
|
53 | 53 | return $healers; |
54 | 54 | } |
55 | 55 | return new Team("healers"); |
@@ -9,8 +9,7 @@ discard block |
||
9 | 9 | use Nexendrie\Utils\Numbers; |
10 | 10 | use HeroesofAbenez\Combat\Team; |
11 | 11 | |
12 | -final class Heal implements ICombatAction |
|
13 | -{ |
|
12 | +final class Heal implements ICombatAction { |
|
14 | 13 | public const ACTION_NAME = "healing"; |
15 | 14 | |
16 | 15 | public function getName(): string |
@@ -28,9 +27,11 @@ discard block |
||
28 | 27 | return (in_array($character, $this->findHealers($combat)->toArray(), true) && $this->selectHealingTarget($character, $combat) !== null); |
29 | 28 | } |
30 | 29 | |
31 | - public function do(CombatBase $combat, Character $character): void |
|
30 | + public function do { |
|
31 | + (CombatBase $combat, Character $character): void |
|
32 | 32 | { |
33 | 33 | $result = []; |
34 | + } |
|
34 | 35 | /** @var Character $patient */ |
35 | 36 | $patient = $this->selectHealingTarget($character, $combat); |
36 | 37 | $result["result"] = $combat->successCalculator->hasHealed($character); |