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

failureRate(ActiveFighter,int)   A

Complexity

Conditions 1

Size

Total Lines 3
Code Lines 3

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 1
CRAP Score 1

Importance

Changes 0
Metric Value
cc 1
eloc 3
dl 0
loc 3
ccs 1
cts 1
cp 1
crap 1
rs 10
c 0
b 0
f 0
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