summaryrefslogtreecommitdiff
path: root/src/votann_battle_simulator/battle_round.clj
blob: f5e55b23b73a34823662cf2b455418f52bf85640 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
(ns votann-battle-simulator.battle-round
  (:require [votann-battle-simulator.util :as util]
            [votann-battle-simulator.weapon-abilities :as weapon-abilities])
  (:import [votann.records.model Model]))

(defn resolve-hit-roll [rolls skill]
  (vec (filter #(>= % skill) rolls)))

(defn resolve-wound-roll [rolls strength toughness]
  (vec (cond (>= strength (* toughness 2))
             (filter #(>= % 2) rolls)

             (> strength toughness)
             (filter #(>= % 3) rolls)

             (= strength toughness)
             (filter #(>= % 4) rolls)

             (< strength toughness)
             (filter #(>= % 5) rolls)

             (<= strength (double (/ toughness 2)))
             (filter #(>= % 6) rolls))))

(defn resolve-saving-throw-roll [rolls ap save]
  (vec (filter #(< % (+ ap save)) rolls)))

(defn command-phase [])

(defn movement-phase [])

(defn shooting-phase [^Integer unit-size ^Model model ^Integer target-size ^Model target battle-modifiers]
  (println "Starting shooting-phase ")
  (println (str (:name model) " x" unit-size " target " (:name target)
                " W: " (:w target)
                " T: " (:t target)
                " SV: " (:sv target)))
  (for [weapon (:ranged-weapons model)]
    (do
      (println (str "\nUsing weapon: " (:name weapon)))
      (let [rolls (util/roll-d6 (weapon-abilities/resolve-attack-abilities weapon unit-size target-size))
            rolls (weapon-abilities/resolve-hit-dice-abilities weapon rolls)
            rolls (weapon-abilities/resolve-hit-modifier-abilities weapon (:hit battle-modifiers) rolls)
            hits (resolve-hit-roll rolls (:bs weapon))
            wounds (weapon-abilities/resolve-wound-dice-abilites weapon (util/roll-d6 (count hits)) (:s weapon) (:t target))
            mortal-wounds (count (filter #(= 99 %) wounds))
            wounds (vec (filter #(not= 99 %) wounds))
            wounds (weapon-abilities/resolve-wound-modifier-abilites weapon (:wound battle-modifiers) wounds)
            wounds (resolve-wound-roll (util/roll-d6 (count wounds)) (:s weapon) (:t target))
            non-saves (count (resolve-saving-throw-roll (util/roll-d6 (count wounds)) (:ap weapon) (:sv target)))
            damage (* (util/resolve-stat-count (:d weapon)) (+ mortal-wounds non-saves))]
        (println (str "Total damage: " damage))
        {:dialog (str (:name model) " x" unit-size " target " (:name target)
                      " W: " (:w target)
                      " T: " (:t target)
                      " SV: " (:sv target))
         :weapon (:name weapon) :damage damage}
        ))))

(defn charge-phase [])

(defn fight-phase [^Integer unit-size ^Model model ^Integer target-size ^Model target battle-modifiers]
  (println "Starting fight-phase ")
  (println (str (:name model) " x" unit-size " target " (:name target)
                " W: " (:w target)
                " T: " (:t target)
                " SV: " (:sv target)))
  (for [weapon (:melee-weapons model)]
    (do
      (println (str "\nUsing weapon: " (:name weapon)))
      (let [rolls (util/roll-d6 (weapon-abilities/resolve-attack-abilities weapon unit-size target-size))
            rolls (weapon-abilities/resolve-hit-dice-abilities weapon rolls)
            rolls (weapon-abilities/resolve-hit-modifier-abilities weapon (:hit battle-modifiers) rolls)
            hits (resolve-hit-roll rolls (:bs weapon))
            wounds (weapon-abilities/resolve-wound-dice-abilites weapon (util/roll-d6 (count hits)) (:s weapon) (:t target))
            mortal-wounds (count (filter #(= 99 %) wounds))
            wounds (vec (filter #(not= 99 %) wounds))
            wounds (weapon-abilities/resolve-wound-modifier-abilites weapon (:wound battle-modifiers) wounds)
            wounds (resolve-wound-roll (util/roll-d6 (count wounds)) (:s weapon) (:t target))
            non-saves (count (resolve-saving-throw-roll (util/roll-d6 (count wounds)) (:ap weapon) (:sv target)))
            damage (* (util/resolve-stat-count (:d weapon)) (+ mortal-wounds non-saves))]
        (println (str "Total damage: " damage))
        {:dialog (str (:name model) " x" unit-size " target " (:name target)
                      " W: " (:w target)
                      " T: " (:t target)
                      " SV: " (:sv target))
         :weapon (:name weapon) :damage damage}))))