Completed
Branch develop (e10164)
by Benjamin
04:56
created

AbstractRuleHelper::getAvailableStarPlayers()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 10
Code Lines 6

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 1
eloc 6
c 0
b 0
f 0
nc 1
nop 1
dl 0
loc 10
rs 10
1
<?php
2
3
namespace Obblm\Core\Helper\Rule;
4
5
use Doctrine\Common\Collections\Criteria;
6
use Obblm\Core\Contracts\RuleHelperInterface;
7
use Obblm\Core\Entity\Player;
8
use Obblm\Core\Entity\PlayerVersion;
9
use Obblm\Core\Entity\Rule;
10
use Obblm\Core\Entity\Team;
11
use Obblm\Core\Form\Player\ActionType;
12
use Obblm\Core\Form\Player\InjuryType;
13
use Obblm\Core\Helper\CoreTranslation;
14
use Obblm\Core\Contracts\InducementInterface;
15
use Obblm\Core\Helper\Rule\Inducement\StarPlayer;
16
use Obblm\Core\Helper\Rule\Traits\AbstractInducementRuleTrait;
17
use Obblm\Core\Helper\Rule\Traits\AbstractPlayerRuleTrait;
18
use Obblm\Core\Helper\Rule\Traits\AbstractTeamRuleTrait;
19
use Obblm\Core\Traits\ClassNameAsKeyTrait;
20
21
abstract class AbstractRuleHelper extends RuleConfigBuilder implements RuleHelperInterface
22
{
23
    use ClassNameAsKeyTrait;
24
25
    protected $attachedRule;
26
    protected $rule = [];
27
28
    /****************
29
     * COMPLIER PASS
30
     ****************/
31
    /**
32
     * @param Rule $rule
33
     * @return $this
34
     */
35
    public function attachRule(Rule $rule):RuleHelperInterface
36
    {
37
        $this->setAttachedRule($rule);
38
        $this->build($rule->getRuleKey(), $rule->getRule());
39
        return $this;
40
    }
41
42
    public function getTransformedInducementsFor(string $roster)
43
    {
44
        $table = $this->getInducementTable();
45
        foreach ($table as $inducement) {
46
            if ($roster == 'halfling') {
47
                $inducement->setValue(10000);
48
            }
49
        }
50
51
        return $table;
52
    }
53
54
    /**********
55
     * CACHING
56
     *********/
57
58
    public function getAttachedRule():?Rule
59
    {
60
        return $this->attachedRule;
61
    }
62
63
    public function setAttachedRule(Rule $rule):RuleHelperInterface
64
    {
65
        $this->attachedRule = $rule;
66
        $this->rule = $rule->getRule();
67
        return $this;
68
    }
69
70
    /**********************
71
     * APPLICATION METHODS
72
     *********************/
73
74
    /**
75
     * @return string
76
     */
77
    public function getInjuriesFormClass():string
78
    {
79
        return InjuryType::class;
80
    }
81
82
    /**
83
     * @return string
84
     */
85
    public function getActionsFormClass():string
86
    {
87
        return ActionType::class;
88
    }
89
90
    /**
91
     * @return string
92
     */
93
    public function getTemplateKey():string
94
    {
95
        return $this->getKey();
96
    }
97
98
    use AbstractTeamRuleTrait;
99
100
    use AbstractPlayerRuleTrait;
101
102
    /***************
103
     * MISC METHODS
104
     **************/
105
    public function getWeatherChoices():array
106
    {
107
        $weather = [];
108
        $ruleKey = $this->getAttachedRule()->getRuleKey();
109
        $fields = $this->rule['fields'];
110
        foreach ($fields as $fieldKey => $field) {
111
            $fieldLabel = CoreTranslation::getFieldKey($ruleKey, $fieldKey);
112
            $weather[$fieldLabel] = [];
113
            foreach ($field['weather'] as $fieldWeather) {
114
                $label = CoreTranslation::getWeatherKey($ruleKey, $fieldKey, $fieldWeather);
115
                $value = join(CoreTranslation::TRANSLATION_GLUE, [$ruleKey, 'default', $fieldWeather]);
116
                $weather[$fieldLabel][$label] = $value;
117
            }
118
        }
119
        return $weather;
120
    }
121
122
    public function createInducementAsPlayer(InducementInterface $inducement, $number = 0):?Player
123
    {
124
        if (!$inducement instanceof StarPlayer) {
125
            return null;
126
        }
127
        $version = (new PlayerVersion())
128
            ->setCharacteristics($inducement->getCharacteristics())
129
            ->setValue($inducement->getValue());
130
        if ($inducement->getSkills()) {
131
            $version->setSkills($inducement->getSkills());
132
        }
133
        $player = (new Player())
134
            ->setNumber($number)
135
            ->setType($inducement->getType()->getTranslationKey())
136
            ->setName($inducement->getTranslationKey())
137
            ->addVersion($version);
138
        return $player;
139
    }
140
141
    public function createStarPlayerAsPlayer(string $key, int $number):Player
142
    {
143
        $ruleKey = $this->getAttachedRule()->getRuleKey();
144
145
        $starPlayer = $this->getStarPlayer($key);
146
        if (isset($starPlayer['multi_parts']) && $starPlayer['multi_parts']) {
147
            throw new \Exception('You cannot create a player with a multiple parts InducementInterface');
148
        }
149
        $version = (new PlayerVersion())
150
            ->setCharacteristics($starPlayer['characteristics'])
151
            ->setValue($starPlayer['cost']);
152
        if ($starPlayer['skills']) {
153
            $version->setSkills($starPlayer['skills']);
154
        }
155
        $player = (new Player())
156
            ->setNumber($number)
157
            ->setType(CoreTranslation::getStarPlayerTitle($ruleKey))
158
            ->setName(CoreTranslation::getStarPlayerName($ruleKey, $key))
159
            ->addVersion($version);
160
        return $player;
161
    }
162
163
    use AbstractInducementRuleTrait;
164
}
165