Passed
Pull Request — master (#249)
by Vincent
13:26
created

fr.quatrevieux.araknemu.game.fight.turn.action.util.BaseCriticalityStrategy   A

Complexity

Total Complexity 6

Size/Duplication

Total Lines 34
Duplicated Lines 0 %

Test Coverage

Coverage 100%

Importance

Changes 1
Bugs 0 Features 0
Metric Value
eloc 21
dl 0
loc 34
ccs 13
cts 13
cp 1
rs 10
c 1
b 0
f 0
wmc 6

4 Methods

Rating   Name   Duplication   Size   Complexity  
A failureRate(ActiveFighter,int) 0 3 1
A hitRate(ActiveFighter,int) 0 12 2
A failed(ActiveFighter,int) 0 3 1
A hit(ActiveFighter,int) 0 7 2
1
/*
2
 * This file is part of Araknemu.
3
 *
4
 * Araknemu is free software: you can redistribute it and/or modify
5
 * it under the terms of the GNU Lesser General Public License as published by
6
 * the Free Software Foundation, either version 3 of the License, or
7
 * (at your option) any later version.
8
 *
9
 * Araknemu is distributed in the hope that it will be useful,
10
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12
 * GNU Lesser General Public License for more details.
13
 *
14
 * You should have received a copy of the GNU Lesser General Public License
15
 * along with Araknemu.  If not, see <https://www.gnu.org/licenses/>.
16
 *
17
 * Copyright (c) 2017-2020 Vincent Quatrevieux
18
 */
19
20
package fr.quatrevieux.araknemu.game.fight.turn.action.util;
21
22
import fr.arakne.utils.value.helper.RandomUtil;
23
import fr.quatrevieux.araknemu.data.constant.Characteristic;
24
import fr.quatrevieux.araknemu.game.fight.fighter.ActiveFighter;
25
import org.checkerframework.checker.index.qual.NonNegative;
26
import org.checkerframework.checker.index.qual.Positive;
27
28
/**
29
 * Base algorithm for compute criticality
30
 */
31 1
public final class BaseCriticalityStrategy implements CriticalityStrategy {
32 1
    private final RandomUtil random = new RandomUtil();
33
34
    @Override
35
    public @Positive int hitRate(ActiveFighter fighter, int base) {
36 1
        if (base <= 2) {
37 1
            return Math.max(base, 1);
38
        }
39
40 1
        base -= fighter.characteristics().get(Characteristic.CRITICAL_BONUS);
41
42 1
        final int agility = Math.max(fighter.characteristics().get(Characteristic.AGILITY), 0);
43 1
        final int rate = Math.min((int) ((base * 2.9901) / Math.log(agility + 12)), base);
0 ignored issues
show
Bug introduced by
Math operands should be cast to prevent unwanted loss of precision when mixing types. Consider casting one of the operands of this addition to double.
Loading history...
44
45 1
        return Math.max(rate, 2);
46
    }
47
48
    @Override
49
    public boolean hit(ActiveFighter fighter, @NonNegative int baseRate) {
50 1
        if (baseRate < 2) { // No criticality
51 1
            return false;
52
        }
53
54 1
        return random.reverseBool(hitRate(fighter, baseRate));
55
    }
56
57
    @Override
58
    public @Positive int failureRate(ActiveFighter fighter, @Positive int base) {
59 1
        return Math.max(base - fighter.characteristics().get(Characteristic.FAIL_MALUS), 2);
60
    }
61
62
    @Override
63
    public boolean failed(ActiveFighter fighter, @NonNegative int baseRate) {
64 1
        return baseRate > 0 && random.reverseBool(failureRate(fighter, baseRate));
65
    }
66
}
67