diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/votann/codex.clj | 65 | ||||
| -rw-r--r-- | src/votann/codex_view.clj | 226 | ||||
| -rw-r--r-- | src/votann/model.clj | 12 | ||||
| -rw-r--r-- | src/votann/models/leagues_of_votann.clj | 29 | ||||
| -rw-r--r-- | src/votann/records/points.clj | 3 | ||||
| -rw-r--r-- | src/votann/tab_widget.clj | 16 | ||||
| -rw-r--r-- | src/votann/unit_widget.clj | 17 | ||||
| -rw-r--r-- | src/votann/units_and_points_widget.clj | 4 | ||||
| -rw-r--r-- | src/votann/util.clj | 13 | ||||
| -rw-r--r-- | src/votann/weapon.clj | 3 | ||||
| -rw-r--r-- | src/votann/weapons/leagues_of_votann.clj | 65 |
11 files changed, 305 insertions, 148 deletions
diff --git a/src/votann/codex.clj b/src/votann/codex.clj index 9ea030a..9d63761 100644 --- a/src/votann/codex.clj +++ b/src/votann/codex.clj @@ -1,39 +1,42 @@ -(ns votann.codex) - -(defrecord Unit [count points]) +(ns votann.codex + (:require [votann.models.leagues-of-votann :as lov] + [votann.records.points]) + (:import [votann.records.points Points])) (def kin-models - [{:name "Uthar The Destined" - :units [(Unit. "x1" 115)]} - {:name "Kahl" - :units [(Unit. "x1" 90)]} - {:name "Einhyr Champion" - :units [(Unit. "x1" 75)]} - {:name "Grimnyr" - :units [(Unit. "x3" 75)]} - {:name "Brokhyr Iron-Master" - :units [(Unit. "x3" 95)]} - {:name "Hearthkyn Warriors" - :units [(Unit. "x10" 135)]} - {:name "Einhyr Hearthguard" - :units [(Unit. "x5" 165)]} - {:name "Cthonian Beserks" - :units [(Unit. "x5" 135)]} - {:name "Hernkyn Pioneers" - :units [(Unit. "x3" 105)]} - {:name "Sagitaur" - :units [(Unit. "x1" 120)]} - {:name "Brokhyr Thunderkyn" - :units [(Unit. "x3" 95)]} - {:name "Hekaton Land Fortress" - :units [(Unit. "x1" 245)]}]) + [lov/uthar-the-destined]) + +;; {:name "Uthar The Destined" +;; :units [(Unit. "x1" 115)]} +;; {:name "Kahl" +;; :units [(Unit. "x1" 90)]} +;; {:name "Einhyr Champion" +;; :units [(Unit. "x1" 75)]} +;; {:name "Grimnyr" +;; :units [(Unit. "x3" 75)]} +;; {:name "Brokhyr Iron-Master" +;; :units [(Unit. "x3" 95)]} +;; {:name "Hearthkyn Warriors" +;; :units [(Unit. "x10" 135)]} +;; {:name "Einhyr Hearthguard" +;; :units [(Unit. "x5" 165)]} +;; {:name "Cthonian Beserks" +;; :units [(Unit. "x5" 135)]} +;; {:name "Hernkyn Pioneers" +;; :units [(Unit. "x3" 105)]} +;; {:name "Sagitaur" +;; :units [(Unit. "x1" 120)]} +;; {:name "Brokhyr Thunderkyn" +;; :units [(Unit. "x3" 95)]} +;; {:name "Hekaton Land Fortress" +;; :units [(Unit. "x1" 245)]} (def kin-enhancements [{:name "A Long List" - :units [(Unit. "x1" 15)]} + :units [(Points. "x1" 15)]} {:name "Apprasing Glare" - :units [(Unit. "x1" 20)]} + :units [(Points. "x1" 20)]} {:name "Grim Demeanour" - :units [(Unit. "x1" 20)]} + :units [(Points. "x1" 20)]} {:name "Wayfarers Grace" - :units [(Unit. "x1" 20)]}]) + :units [(Points. "x1" 20)]}]) diff --git a/src/votann/codex_view.clj b/src/votann/codex_view.clj index b2faddb..0a90c71 100644 --- a/src/votann/codex_view.clj +++ b/src/votann/codex_view.clj @@ -1,5 +1,6 @@ (ns votann.codex-view - (:require [hiccup2.core :as h] + (:require [clojure.string :as string] + [hiccup2.core :as h] [hiccup.page :as page])) (def stat-head @@ -20,19 +21,19 @@ [:th] [:th]]) -(def stat-body +(defn stat-body [m t sv w ld oc] [:tr - [:td "5\""] - [:td "5"] - [:td "3+"] - [:td "5"] - [:td "7+"] - [:td "1"]]) - -(def stat-table + [:td (str m "\"")] + [:td t] + [:td (str sv "+")] + [:td w] + [:td (str ld "+")] + [:td oc]]) + +(defn stat-table [model] [:table stat-head - stat-body]) + (stat-body (:m model) (:t model) (:sv model) (:w model) (:ld model) (:oc model))]) (def stat-table-bottom [:table @@ -45,20 +46,11 @@ (defn stat-model-bottom [name] [:div {:class "stat-name-bottom"} [:h3 name]]) -(def stats +(defn stats [model] [:stats [:div {:class "stat-container"} - stat-table - (stat-model "Brokhyr Iron-Master")] - [:div {:class "stat-container"} - stat-table - (stat-model "Kahl")] - [:div {:class "stat-container"} - stat-table-bottom - (stat-model-bottom "CORVs")] - [:div {:class "stat-container"} - stat-table-bottom - (stat-model-bottom "XX")] + (stat-table model) + (stat-model (:name model))] ]) (def ranged-head @@ -72,17 +64,6 @@ [:th "AP"] [:th "D"]]) -(def ranged-body - [:tr - [:td {:class "icon"}] - [:td {:class "text"} "Autoch-pattern bolt pistol"] - [:td "12\""] - [:td "1"] - [:td "3+"] - [:td "4"] - [:td "0"] - [:td "1"]]) - (def melee-head [:tr [:th] @@ -94,92 +75,159 @@ [:th "AP"] [:th "D"]]) -(def melee-body +(defn weapon-body [name abilities range a bs s ap d] [:tr [:td {:class "icon"}] - [:td {:class "text"} "Autoch-pattern bolt pistol"] - [:td "Melee"] - [:td "1"] - [:td "3+"] - [:td "4"] - [:td "0"] - [:td "1"]]) - -(def weapons + [:td {:class "text"} + name + [:br] + [:b (str "[" (string/join ", " abilities) "]")]] + [:td range] + [:td a] + [:td (str bs "+")] + [:td s] + [:td ap] + [:td d]]) + +(defn weapons [ranged melee] [:div {:class "weapons"} - [:table - ranged-head - ranged-body] - [:table - melee-head - melee-body]]) - -(def column-1 + (if-not (empty? ranged) + [:table + ranged-head + (for [weapon ranged] + (weapon-body (:name weapon) + (:abilities weapon) + (str (:range weapon) "\"") + (:a weapon) + (:bs weapon) + (:s weapon) + (:ap weapon) + (:d weapon)))]) + + (if-not (empty? melee) + [:table + melee-head + (for [weapon melee] + (weapon-body (:name weapon) + (:abilities weapon) + "Melee" + (:a weapon) + (:bs weapon) + (:s weapon) + (:ap weapon) + (:d weapon)))])]) + +(defn column-1 [ranged-weapons melee-weapons] [:div {:id "column-1"} - weapons]) + (weapons ranged-weapons melee-weapons)]) -(def abilities-head +(defn abilities-head [header] [:tr - [:th {:class "text"} "Abilities"]]) - -(def abilities-body + [:th {:class "text"} header]]) + +(defn abilities-body [abilities] + (h/html + (if-not (empty? (:core abilities)) + [:tr + [:td + [:p "CORE: " + [:b (string/join ", " (:core abilities))]]]]) + + (if-not (empty? (:faction abilities)) + [:tr + [:td + [:p "FACTION: " + [:b (string/join ", " (:faction abilities))]]]]) + + (if-not (empty? (:other abilities)) + [:tr + [:td + (for [other (:other abilities)] + [:p [:b (str (:name other) ": ")] + (:description other) + ])]]))) + +(defn abilities [abilities] + [:table + (abilities-head "Abilities") + (abilities-body abilities)]) + +(defn wargear-abilities-body [abilities] [:tr - [:td "CORE: Leader"]]) - -(def abilities - [:div {:class "abilities"} - [:table - abilities-head - abilities-body]]) - -(def column-2 + [:td + (for [ability abilities] + [:p [:b (str (:name ability) ": ")] + (:description ability)])]]) + +(defn wargear-abilities [abilities] + (if-not (empty? abilities) + [:table + (abilities-head "Wargear Abilities") + (wargear-abilities-body abilities)])) + +(defn shield [value] + [:div {:class ["shield-container"]} + [:div {:class "shield-text"} (str value "+") ] + [:div {:class "shield"}]]) + +(defn invulnerable-save [ability] + (if-not (nil? ability) + (h/html + [:table + (abilities-head "Invulnerable Save")] + (shield ability)))) + +(defn column-2 [model] [:div {:id "column-2"} - abilities]) + [:div {:class "abilities"} + (abilities (:abilities model)) + (wargear-abilities (:wargear-abilities (:abilities model))) + (invulnerable-save (:invulnerable-save (:abilities model)))]]) -(def keywords-model +(defn keywords-model [keywords] [:div {:class "model"} - [:span "Keywords - All Models: Infanctry, Brokhyr Iron-Master | Brokhyr Iron-Master Model: Character"]]) + [:span (str "KEYWORDS: " (string/join ", " keywords))]]) -(def keywords-faction +(defn keywords-faction [keywords] [:div {:class "faction"} - [:div "Faction Keywords:"] - [:span "Leagues of Votann"]]) + [:div "FACTION KEYWORDS:"] + [:span (string/join ", " keywords)]]) -(def keywords +(defn keywords [keywords] [:div {:class "keywords"} - keywords-model - keywords-faction]) + (keywords-model (:model keywords)) + (keywords-faction (:faction keywords))]) (def star [:div {:class "star"} ""]) -(def top +(defn top [model] [:top - [:h1 "Uthar the Destined"] - stats]) + [:h1 (:name model)] + (stats model)]) -(def content +(defn content [model] [:content - column-1 - column-2]) + (column-1 (:ranged-weapons model) (:melee-weapons model)) + (column-2 model)]) -(def bottom +(defn bottom [model] [:bottom - keywords + (keywords (:keywords model)) star]) (def head [:head [:link {:rel "stylesheet" :href (votann.util/get-resource-path "css/style.css")}]]) -(def body +(defn body [model] [:body - top - content - bottom]) + (top model) + (content model) + (bottom model)]) -(def codex-page +(defn codex-page [model] (page/html5 (h/html head - body))) + (body model)))) diff --git a/src/votann/model.clj b/src/votann/model.clj new file mode 100644 index 0000000..8338b89 --- /dev/null +++ b/src/votann/model.clj @@ -0,0 +1,12 @@ +(ns votann.model) + +(defrecord Model [name m t sv w ld oc + points + ranged-weapons + melee-weapons + abilities + wargear-options + unit-composition + leader + keywords + quote]) diff --git a/src/votann/models/leagues_of_votann.clj b/src/votann/models/leagues_of_votann.clj new file mode 100644 index 0000000..59ad5e3 --- /dev/null +++ b/src/votann/models/leagues_of_votann.clj @@ -0,0 +1,29 @@ +(ns votann.models.leagues-of-votann + (:require [votann.model] + [votann.records.points] + [votann.weapons.leagues-of-votann :as weapon]) + (:import [votann.model Model] + [votann.records.points Points])) + +(def uthar-the-destined (Model. "Ûthar the Destined" 5 5 3 5 7 1 + (Points. "x1" 115) + [weapon/volkanite-disintegrator-khal] + [weapon/blade-of-the-ancestors] + {:core ["Leader"] + :faction ["Eye of the Ancestors"] + :other [{:name "Ancestral Fortune" + :description "Once per turn, you can change one Hit roll, one Wound roll or one Damage roll made for this model to a 6"} + {:name "The Destined" + :description "Each time an attack is allocated to this model, change the Damage characteristic of that attack to 1."} + {:name "Grim Efficiency" + :description "Once per battle round, in your Command phase, you can select one model from your army with this ability, then select one enemy unit that is visibile to that model. That enemy unit gains 1 Judgement token."}] + :wargear-abilities [{:name "Rampart Crest" + :description "While the bearer is leading a unit, models in that unit have a 5+ invulnerable save"}] + :invulnerable-save 4} + [] + {:composition ["1 Ûthar the Destined - Epic Hero"] + :equipment ["volkanite disintegrator" "Blade of the Ancestors" "rampart crest"]} + ["Einhyr Hearthguard" "Hearthkyn Warriors"] + {:model ["Infantry" "Character" "Epic Hero" "Ûthar the Destined"] + :faction ["Leagues of Votann"]} + "As the most accomplished hero of the Greater Thurian League, Kahl Ûthar the Destined is marked for greatness. Few can assess the foe as swiftly or mercilessly as Ûthar and - once he has his enemies' measure- he soon cuts them to pieces with the glowing Blade of the Ancestors.")) diff --git a/src/votann/records/points.clj b/src/votann/records/points.clj new file mode 100644 index 0000000..727cf25 --- /dev/null +++ b/src/votann/records/points.clj @@ -0,0 +1,3 @@ +(ns votann.records.points) + +(defrecord Points [count amount]) diff --git a/src/votann/tab_widget.clj b/src/votann/tab_widget.clj index cf468ca..ec6ac90 100644 --- a/src/votann/tab_widget.clj +++ b/src/votann/tab_widget.clj @@ -1,6 +1,6 @@ (ns votann.tab_widget (:require [votann.list-widget :refer [list-view-widget]] - [votann.util :refer [get-models unit-file-name]] + [votann.codex :refer [kin-models]] [votann.unit-widget :refer [unit-view-widget]] [votann.enhancements-widget :refer [enhancements-view-widget]] [votann.codex-view :refer [codex-page]] @@ -14,11 +14,11 @@ :content (list-view-widget data)}]) (def unit-view-tab - (vec (for [unit get-models] + (vec (for [model kin-models] {:fx/type :tab - :text unit + :text (:name model) :closable false - :content (unit-view-widget (unit-file-name unit))}))) + :content (unit-view-widget model)}))) (def enhancements-view-tab [{:fx/type :tab @@ -31,15 +31,17 @@ :text "Codex" :closable false :content {:fx/type :tab-pane - :tabs (vec (apply merge unit-view-tab enhancements-view-tab))}}]) + :tabs [(apply merge unit-view-tab)]}}]) + +(comment codex-view-tab) (def battle-simulator-view-tab [{:fx/type :tab :text "Battle Simulator" :closable false :content {:fx/type fx.ext.web-view/with-engine-props - :props {:content codex-page} + :props {:content (codex-page nil)} :desc {:fx/type :web-view}}}]) (defn tab-widget [data] - (vec (apply concat [(list-view-tab data) battle-simulator-view-tab]))) + (vec (apply concat [(list-view-tab data) codex-view-tab battle-simulator-view-tab]))) diff --git a/src/votann/unit_widget.clj b/src/votann/unit_widget.clj index 5d31b99..dd14f0a 100644 --- a/src/votann/unit_widget.clj +++ b/src/votann/unit_widget.clj @@ -1,12 +1,9 @@ (ns votann.unit-widget - (:require [votann.util :refer [get-resource-path]] - [cljfx.api :as fx])) + (:require [votann.codex-view :refer [codex-page]] + [cljfx.api :as fx] + [cljfx.ext.web-view :as fx.ext.web-view])) -(defn unit-view-widget [unit-file-name] - {:fx/type :scroll-pane - :content {:fx/type :v-box - :alignment :center - :children [{:fx/type :image-view - :image (get-resource-path (str "leagues-of-votann/" unit-file-name "-front.png"))} - {:fx/type :image-view - :image (get-resource-path (str "leagues-of-votann/" unit-file-name "-back.png"))}]}}) +(defn unit-view-widget [model] + {:fx/type fx.ext.web-view/with-engine-props + :props {:content (codex-page model)} + :desc {:fx/type :web-view}}) diff --git a/src/votann/units_and_points_widget.clj b/src/votann/units_and_points_widget.clj index 81846d7..be2320f 100644 --- a/src/votann/units_and_points_widget.clj +++ b/src/votann/units_and_points_widget.clj @@ -1,5 +1,5 @@ (ns votann.units-and-points-widget - (:require [votann.util :refer [get-units]] + (:require [votann.util :refer [get-models]] [cljfx.api :as fx])) @@ -24,7 +24,7 @@ (def unit-points-list-widget - (vec (for [unit get-units] + (vec (for [unit get-models] {:fx/type :v-box :padding 5 :children [{:fx/type :label diff --git a/src/votann/util.clj b/src/votann/util.clj index ed021a1..5e4ec18 100644 --- a/src/votann/util.clj +++ b/src/votann/util.clj @@ -5,15 +5,10 @@ [clojure.string :as string])) (def get-models - (vec (for [model kin-models] - (:name model)))) - -(def get-units - (->> (concat kin-models kin-enhancements) - (map #(for [unit (:units %)] - {:name (str (:name %) " " (:count unit)) - :points (:points unit)})) - (apply concat) + (->> kin-models + (map (fn [model] + {:name (str (:name model) " " (:count (:points model))) + :points (:amount (:points model))})) vec)) (defn get-resource-path [file] diff --git a/src/votann/weapon.clj b/src/votann/weapon.clj new file mode 100644 index 0000000..d037253 --- /dev/null +++ b/src/votann/weapon.clj @@ -0,0 +1,3 @@ +(ns votann.weapon) + +(defrecord Weapon [name abilities range a bs s ap d]) diff --git a/src/votann/weapons/leagues_of_votann.clj b/src/votann/weapons/leagues_of_votann.clj new file mode 100644 index 0000000..c30984a --- /dev/null +++ b/src/votann/weapons/leagues_of_votann.clj @@ -0,0 +1,65 @@ +(ns votann.weapons.leagues-of-votann + (:require [votann.weapon]) + (:import [votann.weapon Weapon])) + +(def ancestral-ward-stave (Weapon. "Ancestral ward stave" ["Psychic"] 1 1 3 7 1 "D3")) +(def ancestral-wrath-focused-witchfire (Weapon. "Ancestral Wrath - focused witchfire" ["Hazardous" "Psychic"] 24 6 2 6 2 "D3")) +(def ancestral-wrath-witchfire (Weapon. "Ancestral Wrath - witchfire" ["Psychic"] 24 3 2 6 2 "D3")) +(def armoured-wheels-hekaton-land-fortress (Weapon. "Armoured wheels" [] 1 6 4 8 0 1)) +(def armoured-wheels-sagitaur (Weapon. "Armoured wheels" [] 1 3 4 6 0 1)) +(def autoch-pattern-bolter (Weapon. "Autoch-pattern bolter" [] 24 2 4 4 0 1)) +(def autoch-pattern-bolt-pistol (Weapon. "Autoch-pattern bolter pistol" ["Pistol"] 12 1 3 4 0 1)) +(def autoch-pattern-combi-bolter (Weapon. "Autoch-pattern combi-bolter" [] 24 4 2 4 0 1)) +(def blade-of-the-ancestors (Weapon. "Blade of the Ancestors" ["Devastating Wounds"] 1 5 2 6 3 2)) +(def bolt-cannon (Weapon. "Bolt cannon" ["Sustained Hits 1"] 36 3 4 6 1 2)) +(def bolt-revolver (Weapon. "Bolt revolver" ["Pistol"] 9 1 4 5 0 1)) +(def bolt-shotgun (Weapon. "Bolt shotgun" ["Assault"] 12 2 4 5 0 1)) +(def close-combat-weapon (Weapon. "Close combat weapon" [] 1 1 4 3 0 1)) +(def close-combat-weapon-thunderkyn (Weapon. "Close combat weapon" [] 1 2 4 4 0 1)) +(def concussion-guantlet (Weapon. "Concussion guantlet" [] 1 2 3 9 2 2)) +(def concussion-hammer (Weapon. "Concussion hammer" [] 1 3 4 9 1 3)) +(def concussion-maul (Weapon. "Concussion maul" [] 1 3 4 9 2 3)) +(def cyclic-ion-cannon (Weapon. "Cyclic ion cannon" ["Blast"] 24 "D6+3" 4 9 2 2)) +(def darkstar-axe (Weapon. "Darkstar axe" [] 1 6 2 6 2 2)) +(def etacarm-plasma-beamer (Weapon. "EtaCarm plasma beamer" ["Sustained Hits D3"] 18 1 4 8 3 2)) +(def etacarm-plasma-gun (Weapon. "EtaCarm plasma gun" [] 24 1 3 8 3 2)) +(def etacarm-plasma-pistol (Weapon. "EtaCarm plasma pistol" ["Pistol"] 6 1 4 8 3 2)) +(def exo-armour-grenade-launcher (Weapon. "Exo armour grenade launcher" ["Blast"] 18 "D6" 3 4 0 1)) +(def forgewrought-plasma-axe (Weapon. "Forgewrought plasma axe" [] 1 4 2 5 2 2)) +(def graviton-blast-cannon (Weapon. "Graviton blast cannon" ["Anti-Vehicle 2+" "Blast"] 18 "D6" 4 5 2 2)) +(def graviton-hammer (Weapon. "Graviton hammer" ["Anti-Vehicle 2+"] 1 3 4 9 1 3)) +(def graviton-rifle (Weapon. "Graviton Rifle" ["Anti-Vehicle 2+"] 18 3 3 5 1 3)) +(def heavy-magna-rail-cannon (Weapon. "Heavy magna-rail-cannon" ["Devastating Wounds" "Heavy"] 30 1 4 18 4 "D6+6")) +(def heavy-plasma-axe-strike (Weapon. "Heavy plasma axe - strike" [] 1 3 3 6 2 2)) +(def heavy-plasma-axe-sweep (Weapon. "Heavy plasma axe - sweep" [] 1 6 3 4 1 1)) +(def hekaton-warhead (Weapon. "Hekaton warhead" ["Blast" "Indirect Fire" "One Shot"] 36 "D6+3" 4 7 2 2)) +(def hylas-auto-rifle (Weapon. "HYLas auto rifle" ["Assualt" "Rapid Fire 3"] 24 3 4 6 1 1)) +(def hylas-beam-cannon (Weapon. "HYLas beam cannon" ["Sustained Hits 3"] 24 2 4 12 3 "D6")) +(def hylas-rotary-cannon-pioneers (Weapon. "HYLas rotary cannon" ["Sustained Hits 1"] 24 6 4 6 1 1)) +(def hylas-rotary-cannon-warrior (Weapon. "HYLas rotary cannon" ["Heavy" "Sustained Hits 1"] 24 6 5 6 1 1)) +(def ion-beamer (Weapon. "Ion beamer" ["Sustained Hits D3"] 18 3 4 7 2 1)) +(def ion-blaster (Weapon. "Ion blaster" [] 18 1 4 5 2 1)) +(def ion-pistol (Weapon. "Ion pistol" ["Pistol"] 12 1 4 5 2 1)) +(def kin-melee-weapon (Weapon. "Kin melee weapon" [] 1 2 4 5 2 2)) +(def l7-missile-launcher-blast (Weapon. "L7 missile launcher - blast" ["Blast"] 24 "D6" 4 4 0 1)) +(def l7-missile-launcher-focused (Weapon. "L7 missile launcher - focused" [] 24 1 4 9 2 "D6")) +(def las-beam-cutter (Weapon. "Las-beam cutter" [] 6 1 4 6 3 1)) +(def magna-coil-autocannon (Weapon. "Magna-coil autocannon" [] 24 3 4 7 1 2)) +(def magna-rail-rifle (Weapon. "Magna-rail rifle" ["Devastating wounds" "Heavy"] 24 1 4 9 2 "D6")) +(def manipulator-arms (Weapon. "Manipulator arms" [] 1 3 4 3 0 1)) +(def mass-guantlet (Weapon. "Mass guantlet" [] 1 3 3 8 2 3)) +(def mass-hammer (Weapon. "Mass hammer" [] 1 3 3 12 2 "D6+1")) +(def matr-autocannon (Weapon. "MATR autocannon" [] 24 6 4 7 1 2)) +(def matr-cannon (Weapon. "MATR cannon" [] 24 6 4 7 1 2)) +(def mole-grenade-launcher (Weapon. "Mole grenade launcher" ["Blast" "Indirect Fire"] 24 "D6" 4 5 1 1)) +(def plasma-blade-guantlet (Weapon. "Plasma blade guantlet" [] 1 3 3 6 2 1)) +(def plasma-knife (Weapon. "Plasma knife" [] 1 2 4 4 0 1)) +(def plasma-torch (Weapon. "Plasma torch" [] 1 1 4 6 3 2)) +(def sagitaur-missile-launcher (Weapon. "Sagitaur missile launcher" [] 36 2 4 12 3 3)) +(def sp-conversion-beamer (Weapon. "SP conversion beamer" ["Conversion" "Sustained Hits D3"] 24 1 4 7 1 3)) +(def sp-heavy-conversion-beamer (Weapon. "SP heavy conversion beamer" ["Conversion" "Sustained Hits D3"] 24 2 4 10 2 4)) +(def twin-bolt-cannon (Weapon. "Twin bolt cannon" ["Sustained Hits 1" "Twin-Linked"] 36 3 4 6 1 2)) +(def twin-concussion-guantlet (Weapon. "Twin concussion gauntlet" ["Twin-Linked"] 1 4 4 9 1 2)) +(def twin-ion-beamer (Weapon. "Twin ion beamer" ["Sustained Hits D3" "Twin-Linked"] 18 3 4 7 2 1)) +(def volkanite-disintegrator-khal (Weapon. "Volkanite disintegrator" ["Devastating Wounds"] 18 3 2 5 0 1)) +(def volkanite-disintegrator-hearthgurad (Weapon. "Volkanite disintegrator" ["Devastating Wounds"] 18 3 3 5 0 1)) |