Model attack and defence profiles
This commit is contained in:
parent
c41ac72f28
commit
df1f543e6d
15 changed files with 237 additions and 10 deletions
27
pom.xml
27
pom.xml
|
@ -15,6 +15,14 @@
|
||||||
</properties>
|
</properties>
|
||||||
|
|
||||||
<dependencies>
|
<dependencies>
|
||||||
|
<!-- Lombok -->
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.projectlombok</groupId>
|
||||||
|
<artifactId>lombok</artifactId>
|
||||||
|
<version>1.18.30</version> <!-- Or latest -->
|
||||||
|
<scope>provided</scope>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
<!-- JavaFX modules -->
|
<!-- JavaFX modules -->
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.openjfx</groupId>
|
<groupId>org.openjfx</groupId>
|
||||||
|
@ -23,4 +31,23 @@
|
||||||
</dependency>
|
</dependency>
|
||||||
</dependencies>
|
</dependencies>
|
||||||
|
|
||||||
|
<build>
|
||||||
|
<plugins>
|
||||||
|
<!-- Lombok annotation processor (optional but recommended for IDE integration) -->
|
||||||
|
<plugin>
|
||||||
|
<groupId>org.apache.maven.plugins</groupId>
|
||||||
|
<artifactId>maven-compiler-plugin</artifactId>
|
||||||
|
<version>3.13.0</version>
|
||||||
|
<configuration>
|
||||||
|
<annotationProcessorPaths>
|
||||||
|
<path>
|
||||||
|
<groupId>org.projectlombok</groupId>
|
||||||
|
<artifactId>lombok</artifactId>
|
||||||
|
<version>1.18.30</version>
|
||||||
|
</path>
|
||||||
|
</annotationProcessorPaths>
|
||||||
|
</configuration>
|
||||||
|
</plugin>
|
||||||
|
</plugins>
|
||||||
|
</build>
|
||||||
</project>
|
</project>
|
|
@ -0,0 +1,28 @@
|
||||||
|
package ninja.thefirearchmage.games.fourtykcalculator;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Optional;
|
||||||
|
|
||||||
|
public class AttackScenario {
|
||||||
|
private List<Weapon> weapons;
|
||||||
|
private Optional<Reroll> hitReroll;
|
||||||
|
private Optional<Reroll> woundReroll;
|
||||||
|
private Optional<Reroll> damageReroll;
|
||||||
|
private boolean unmodifiableHit;
|
||||||
|
private boolean attackerWasStationary;
|
||||||
|
private boolean attackerCharged;
|
||||||
|
private boolean attackerInRapidFireRange;
|
||||||
|
|
||||||
|
private DefensiveProfile defensiveProfile;
|
||||||
|
private Optional<Reroll> normalSaveReroll;
|
||||||
|
private boolean hasHitPenalty;
|
||||||
|
private boolean hasWoundPenalty;
|
||||||
|
private boolean isInCover;
|
||||||
|
private boolean forceWoundsOnFoursIfLower;
|
||||||
|
private int damageReduction;
|
||||||
|
|
||||||
|
public void resolveAttack() {
|
||||||
|
// Attack step
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,24 @@
|
||||||
|
package ninja.thefirearchmage.games.fourtykcalculator;
|
||||||
|
|
||||||
|
import lombok.Getter;
|
||||||
|
|
||||||
|
import java.util.Optional;
|
||||||
|
|
||||||
|
@Getter
|
||||||
|
public class DefensiveProfile {
|
||||||
|
private final int toughness;
|
||||||
|
private final int normalSave;
|
||||||
|
private final Optional<InvulnerableSave> invulnerableSave;
|
||||||
|
private final Optional<FeelNoPainEffect> feelNoPain;
|
||||||
|
|
||||||
|
public DefensiveProfile(int toughness, int normalSave) {
|
||||||
|
this(toughness, normalSave, Optional.empty(), Optional.empty());
|
||||||
|
}
|
||||||
|
|
||||||
|
public DefensiveProfile(int toughness, int normalSave, Optional<InvulnerableSave> invulnerableSave, Optional<FeelNoPainEffect> feelNoPain) {
|
||||||
|
this.toughness = toughness;
|
||||||
|
this.normalSave = normalSave;
|
||||||
|
this.invulnerableSave = invulnerableSave;
|
||||||
|
this.feelNoPain = feelNoPain;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,7 @@
|
||||||
|
package ninja.thefirearchmage.games.fourtykcalculator;
|
||||||
|
|
||||||
|
|
||||||
|
public class FeelNoPainEffect {
|
||||||
|
private int rollValue;
|
||||||
|
private FeelNoPainType type;
|
||||||
|
}
|
|
@ -0,0 +1,7 @@
|
||||||
|
package ninja.thefirearchmage.games.fourtykcalculator;
|
||||||
|
|
||||||
|
public enum FeelNoPainType {
|
||||||
|
ALL,
|
||||||
|
MORTAL_WOUNDS,
|
||||||
|
PSYCHIC;
|
||||||
|
}
|
|
@ -20,16 +20,16 @@ public class FourtyKCalculatorApp extends Application {
|
||||||
|
|
||||||
Button calculateBtn = new Button("Calculate");
|
Button calculateBtn = new Button("Calculate");
|
||||||
calculateBtn.setOnAction(e -> {
|
calculateBtn.setOnAction(e -> {
|
||||||
List<Target> targets = Arrays.asList(
|
List<DefensiveProfile> targets = Arrays.asList(
|
||||||
new Target("Rhino", 9, 3, null, 10),
|
new DefensiveProfile("Rhino", 9, 3, null, 10),
|
||||||
new Target("Lehman Russ", 11, 2, null, 13),
|
new DefensiveProfile("Lehman Russ", 11, 2, null, 13),
|
||||||
new Target("Redemptor Dread", 10, 3, 5, 12),
|
new DefensiveProfile("Redemptor Dread", 10, 3, 5, 12),
|
||||||
new Target("Knight Paladin", 13, 2, 5, 22),
|
new DefensiveProfile("Knight Paladin", 13, 2, 5, 22),
|
||||||
new Target("Plagueburst Crawler", 12, 3, 4, 12)
|
new DefensiveProfile("Plagueburst Crawler", 12, 3, 4, 12)
|
||||||
);
|
);
|
||||||
|
|
||||||
StringBuilder sb = new StringBuilder();
|
StringBuilder sb = new StringBuilder();
|
||||||
for (Target target : targets) {
|
for (DefensiveProfile target : targets) {
|
||||||
sb.append(calculate(target, 3, true, true, true, "melta"));
|
sb.append(calculate(target, 3, true, true, true, "melta"));
|
||||||
sb.append("\n");
|
sb.append("\n");
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,18 @@
|
||||||
|
package ninja.thefirearchmage.games.fourtykcalculator;
|
||||||
|
|
||||||
|
import lombok.Getter;
|
||||||
|
|
||||||
|
@Getter
|
||||||
|
public class InvulnerableSave {
|
||||||
|
private final int rollValue;
|
||||||
|
private final InvulnerableType type;
|
||||||
|
|
||||||
|
public InvulnerableSave(int rollValue) {
|
||||||
|
this(rollValue, InvulnerableType.ALL);
|
||||||
|
}
|
||||||
|
|
||||||
|
public InvulnerableSave(int rollValue, InvulnerableType type) {
|
||||||
|
this.rollValue = rollValue;
|
||||||
|
this.type = type;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,10 @@
|
||||||
|
package ninja.thefirearchmage.games.fourtykcalculator;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* To which attack type the invulnerability save applies.
|
||||||
|
*/
|
||||||
|
public enum InvulnerableType {
|
||||||
|
ALL,
|
||||||
|
RANGED,
|
||||||
|
MELEE;
|
||||||
|
}
|
|
@ -2,6 +2,6 @@ package ninja.thefirearchmage.games.fourtykcalculator;
|
||||||
|
|
||||||
public class Main {
|
public class Main {
|
||||||
public static void main(String[] args) {
|
public static void main(String[] args) {
|
||||||
System.out.printf("Hello and welcome!");
|
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -0,0 +1,7 @@
|
||||||
|
package ninja.thefirearchmage.games.fourtykcalculator;
|
||||||
|
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
|
public class Reroll {
|
||||||
|
private Set<Integer> rerollableValues;
|
||||||
|
}
|
|
@ -5,7 +5,9 @@ import java.util.Optional;
|
||||||
public class Weapon {
|
public class Weapon {
|
||||||
private int strength;
|
private int strength;
|
||||||
private int ap;
|
private int ap;
|
||||||
private double averageDamage;
|
private int attacks;
|
||||||
|
private WeaponDamage averageDamage;
|
||||||
|
private WeaponRangeType rangeType;
|
||||||
private int hitValue;
|
private int hitValue;
|
||||||
private boolean hasLethalHits;
|
private boolean hasLethalHits;
|
||||||
private Optional<Integer> sustainedHits;
|
private Optional<Integer> sustainedHits;
|
||||||
|
@ -18,5 +20,8 @@ public class Weapon {
|
||||||
private boolean hasHeavy;
|
private boolean hasHeavy;
|
||||||
private boolean hasBlast;
|
private boolean hasBlast;
|
||||||
private boolean hasLance;
|
private boolean hasLance;
|
||||||
|
private boolean ignoresCover;
|
||||||
private Optional<Integer> melta;
|
private Optional<Integer> melta;
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,27 @@
|
||||||
|
package ninja.thefirearchmage.games.fourtykcalculator;
|
||||||
|
|
||||||
|
import lombok.Getter;
|
||||||
|
|
||||||
|
import java.util.Optional;
|
||||||
|
|
||||||
|
@Getter
|
||||||
|
public class WeaponDamage {
|
||||||
|
private final Optional<Integer> diceType;
|
||||||
|
private final Optional<Integer> numberOfDices;
|
||||||
|
private final int flatDamage;
|
||||||
|
|
||||||
|
public WeaponDamage(int flatDamage) {
|
||||||
|
this(Optional.empty(), Optional.empty(), flatDamage);
|
||||||
|
}
|
||||||
|
public WeaponDamage(int diceType, int numberOfDices) {
|
||||||
|
this(Optional.of(diceType), Optional.of(numberOfDices), 0);
|
||||||
|
}
|
||||||
|
public WeaponDamage(int diceType, int numberOfDices, int extraDamage) {
|
||||||
|
this(Optional.of(diceType), Optional.of(numberOfDices), extraDamage);
|
||||||
|
}
|
||||||
|
public WeaponDamage(Optional<Integer> diceType, Optional<Integer> numberOfDices, int flatDamage) {
|
||||||
|
this.diceType = diceType;
|
||||||
|
this.numberOfDices = numberOfDices;
|
||||||
|
this.flatDamage = flatDamage;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,6 @@
|
||||||
|
package ninja.thefirearchmage.games.fourtykcalculator;
|
||||||
|
|
||||||
|
public enum WeaponRangeType {
|
||||||
|
MELEE,
|
||||||
|
RANGED;
|
||||||
|
}
|
30
src/main/resources/defensive_profiles.yaml
Normal file
30
src/main/resources/defensive_profiles.yaml
Normal file
|
@ -0,0 +1,30 @@
|
||||||
|
- intercessor:
|
||||||
|
name: Intercessor
|
||||||
|
toughness: 4
|
||||||
|
save: 3
|
||||||
|
- sm_terminator:
|
||||||
|
name: Space Marine Terminator
|
||||||
|
toughness: 5
|
||||||
|
save: 2
|
||||||
|
invulnerability:
|
||||||
|
save: 4
|
||||||
|
type: ALL
|
||||||
|
- sm_rhino:
|
||||||
|
name: Space Marine Rhino
|
||||||
|
toughness: 9
|
||||||
|
save: 3
|
||||||
|
- impulsor:
|
||||||
|
name: Impulsor
|
||||||
|
toughness: 9
|
||||||
|
save: 3
|
||||||
|
- land_raider:
|
||||||
|
name: Space Marine Land Raider
|
||||||
|
toughness: 12
|
||||||
|
save: 2
|
||||||
|
- questoris_knight:
|
||||||
|
name: Questoris Class Knight
|
||||||
|
toughness: 12
|
||||||
|
save: 3
|
||||||
|
invulnerability:
|
||||||
|
save: 5
|
||||||
|
type: RANGED
|
|
@ -1 +1,32 @@
|
||||||
melta:
|
eradicator_melta_rifle:
|
||||||
|
name: Melta Rifle (Eradicator)
|
||||||
|
attacks: 1
|
||||||
|
range_type: RANGED
|
||||||
|
damage:
|
||||||
|
dice_type: 6
|
||||||
|
number_of_dices: 1
|
||||||
|
melta: 2
|
||||||
|
ap: -4
|
||||||
|
toHit: 3
|
||||||
|
strength: 9
|
||||||
|
isHeavy: true
|
||||||
|
eradicator_multi_melta:
|
||||||
|
name: Multi-Melta (Eradicator)
|
||||||
|
damage:
|
||||||
|
dice_type: 6
|
||||||
|
number_of_dices: 1
|
||||||
|
attacks: 2
|
||||||
|
range_type: RANGED
|
||||||
|
melta: 2
|
||||||
|
ap: -4
|
||||||
|
toHit: 4
|
||||||
|
strength: 9
|
||||||
|
isHeavy: true
|
||||||
|
intercessor_bolt_rifle:
|
||||||
|
name: Bolt Rifle (Intercessor)
|
||||||
|
attacks: 2
|
||||||
|
damage: 1
|
||||||
|
ap: -1
|
||||||
|
toHit: 3
|
||||||
|
strength: 4
|
||||||
|
isHeavy: true
|
Loading…
Add table
Reference in a new issue