From be187d0c9d5adc289479df5f80533fe37709d24b Mon Sep 17 00:00:00 2001 From: realtradam Date: Tue, 31 Jan 2023 21:58:09 -0500 Subject: gear rules, refined classes idea, worked on abilities --- cards/Gemfile | 11 + cards/Gemfile.lock | 17 + cards/alchemical_recipes.rb | 21 - cards/armour.rb | 58 -- cards/assets/cardback.png | Bin 0 -> 80602 bytes cards/assets/cardback.svg | 223 +++++++ cards/assets/inspiration_cardback.jpg | Bin 0 -> 53923 bytes cards/assets/weapon_example.svg | 864 +++++++++++++++++++++++++++ cards/card.rb | 479 --------------- cards/card_weapons.rb | 89 --- cards/cardback.png | Bin 80602 -> 0 bytes cards/cardback.svg | 223 ------- cards/cards/alchemical_recipes.rb | 21 + cards/cards/armour.rb | 60 ++ cards/cards/card.rb | 494 ++++++++++++++++ cards/cards/card_weapons.rb | 91 +++ cards/cards/class_abilities.rb | 181 ++++++ cards/cards/common_items.rb | 153 +++++ cards/cards/common_weapons.rb | 356 +++++++++++ cards/cards/paladin_abilities.rb | 196 ++++++ cards/cards/rare_weapons.rb | 117 ++++ cards/cards/spells.rb | 266 +++++++++ cards/class_abilities.rb | 181 ------ cards/common_weapons.rb | 350 ----------- cards/inspiration_cardback.jpg | Bin 53923 -> 0 bytes cards/output/alchemical_recipes.html | 300 ++++++++++ cards/output/armour.html | 380 ++++++++++++ cards/output/beginner_spells.html | 568 ++++++++++++++++++ cards/output/class_abilities.html | 595 +++++++++++++++++++ cards/output/common_items.html | 556 +++++++++++++++++ cards/output/common_weapons.html | 1047 +++++++++++++++++++++++++++++++++ cards/output/paladin_abilities.html | 639 ++++++++++++++++++++ cards/output/rare_weapons.html | 512 ++++++++++++++++ cards/spells.rb | 267 --------- cards/weapon_example.svg | 864 --------------------------- 35 files changed, 7647 insertions(+), 2532 deletions(-) create mode 100644 cards/Gemfile create mode 100644 cards/Gemfile.lock delete mode 100644 cards/alchemical_recipes.rb delete mode 100644 cards/armour.rb create mode 100644 cards/assets/cardback.png create mode 100644 cards/assets/cardback.svg create mode 100644 cards/assets/inspiration_cardback.jpg create mode 100644 cards/assets/weapon_example.svg delete mode 100644 cards/card.rb delete mode 100644 cards/card_weapons.rb delete mode 100644 cards/cardback.png delete mode 100644 cards/cardback.svg create mode 100644 cards/cards/alchemical_recipes.rb create mode 100644 cards/cards/armour.rb create mode 100644 cards/cards/card.rb create mode 100644 cards/cards/card_weapons.rb create mode 100644 cards/cards/class_abilities.rb create mode 100644 cards/cards/common_items.rb create mode 100644 cards/cards/common_weapons.rb create mode 100644 cards/cards/paladin_abilities.rb create mode 100644 cards/cards/rare_weapons.rb create mode 100644 cards/cards/spells.rb delete mode 100644 cards/class_abilities.rb delete mode 100644 cards/common_weapons.rb delete mode 100644 cards/inspiration_cardback.jpg create mode 100644 cards/output/alchemical_recipes.html create mode 100644 cards/output/armour.html create mode 100644 cards/output/beginner_spells.html create mode 100644 cards/output/class_abilities.html create mode 100644 cards/output/common_items.html create mode 100644 cards/output/common_weapons.html create mode 100644 cards/output/paladin_abilities.html create mode 100644 cards/output/rare_weapons.html delete mode 100644 cards/spells.rb delete mode 100644 cards/weapon_example.svg (limited to 'cards') diff --git a/cards/Gemfile b/cards/Gemfile new file mode 100644 index 0000000..4af2b1e --- /dev/null +++ b/cards/Gemfile @@ -0,0 +1,11 @@ +# frozen_string_literal: true + +source "https://rubygems.org" + +git_source(:github) {|repo_name| "https://github.com/#{repo_name}" } + +# gem "rails" + +gem "paggio", "~> 0.3.0" + +gem "kramdown", "~> 2.4" diff --git a/cards/Gemfile.lock b/cards/Gemfile.lock new file mode 100644 index 0000000..47747ed --- /dev/null +++ b/cards/Gemfile.lock @@ -0,0 +1,17 @@ +GEM + remote: https://rubygems.org/ + specs: + kramdown (2.4.0) + rexml + paggio (0.3.0) + rexml (3.2.5) + +PLATFORMS + ruby + +DEPENDENCIES + kramdown (~> 2.4) + paggio (~> 0.3.0) + +BUNDLED WITH + 2.1.4 diff --git a/cards/alchemical_recipes.rb b/cards/alchemical_recipes.rb deleted file mode 100644 index 4e96dfb..0000000 --- a/cards/alchemical_recipes.rb +++ /dev/null @@ -1,21 +0,0 @@ -load 'card.rb' - -alchemical_recipes = {} - -beginner_spells[:crystal_encasement] = Card.new( - title: "Crystal Encasement Recipe", - #damage: 3, - #blood: 2, - #reposte: 'Prc', - actions: [ - Card::Action.new( - content: 'A potion which when applied to a surface quickly grows strong blue crystals. Can also be thrown.', - symbol: [:diamonds, :blood] - ), - ], - color: 'firebrick', - flavour: '"You arent making a bomb, are you?"', - type: 'Blood Magic (Eldritch)' -) - -File.write('beginner_spells.html', Card.build(beginner_spells.values)) diff --git a/cards/armour.rb b/cards/armour.rb deleted file mode 100644 index da6cf68..0000000 --- a/cards/armour.rb +++ /dev/null @@ -1,58 +0,0 @@ -load 'card.rb' - -armour = {} - -armour[:iron_plate] = Card.new( - title: "Iron Plate", - defence: '5', - #blood: 1, - #reposte: 'Prc', - #actions: [ - #Card::Action.new( - # content: '(**even**) Engulf your hand in flames for short while. You need to maintain concentration.', - # symbol: [:clubs, :blood] - #), - #Card::Action.new( - # seperator: true, - # content: '(**while concentrating**) Deal melee damage to a target with your flame engulfed hand. If the target is a small object set it on fire.', - # symbol: [:tap] - #), - #], - color: 'cadetblue', - flavour: '"Strong but heavy"', - type: 'Body Armour' -) - -armour[:chain_mail] = Card.new( - title: "Chain Mail", - defence: '4', - color: 'cadetblue', - flavour: '"The fairly lightweight option"', - type: 'Body Armour' -) - -armour[:leather] = Card.new( - title: "Leather", - defence: '3', - color: 'cadetblue', - flavour: '"Popular with goths and punks"', - type: 'Body Armour' -) - -armour[:padded] = Card.new( - title: "Padded", - defence: '2', - color: 'cadetblue', - flavour: '"A *LOT* of regular clothing stacked together"', - type: 'Body Armour' -) - -armour[:none] = Card.new( - title: "None", - defence: '1', - color: 'cadetblue', - flavour: '"Just the skin on your back"', - type: 'Body Armour' -) - -File.write('armour.html', Card.build(armour.values)) diff --git a/cards/assets/cardback.png b/cards/assets/cardback.png new file mode 100644 index 0000000..73dd350 Binary files /dev/null and b/cards/assets/cardback.png differ diff --git a/cards/assets/cardback.svg b/cards/assets/cardback.svg new file mode 100644 index 0000000..1099321 --- /dev/null +++ b/cards/assets/cardback.svg @@ -0,0 +1,223 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/cards/assets/inspiration_cardback.jpg b/cards/assets/inspiration_cardback.jpg new file mode 100644 index 0000000..2b82919 Binary files /dev/null and b/cards/assets/inspiration_cardback.jpg differ diff --git a/cards/assets/weapon_example.svg b/cards/assets/weapon_example.svg new file mode 100644 index 0000000..ef9e910 --- /dev/null +++ b/cards/assets/weapon_example.svg @@ -0,0 +1,864 @@ + + + +123568734 diff --git a/cards/card.rb b/cards/card.rb deleted file mode 100644 index 3d76d22..0000000 --- a/cards/card.rb +++ /dev/null @@ -1,479 +0,0 @@ -require 'paggio' -require 'paggio/markdown' -class Card - attr_accessor( - :attrib_top_left, :attrib_top_left_icon, - :attrib_top_right, :attrib_top_right_icon, - :attrib_bottom_left, :attrib_bottom_left_icon, - :attrib_bottom_right, :attrib_bottom_right_icon, - :color, - :title, - :flavour, - :type - ) - - def actions - @actions ||= [] - end - - def initialize( - title:, - color:, - attrib_top_right: nil, - attrib_top_right_icon: '🩸', - blood: nil, - attrib_top_left: nil, - attrib_top_left_icon: '🎲', - roll: nil, - attrib_bottom_right: nil, - attrib_bottom_right_icon: '🛡️', - reposte: nil, - defence: nil, - attrib_bottom_left: nil, - attrib_bottom_left_icon: '⚔️', - damage: nil, - actions: [], - flavour: nil, - type: nil - ) - attrib_top_right ||= blood.to_s unless blood.nil? - attrib_bottom_right ||= defence.to_s unless defence.nil? - attrib_bottom_right ||= reposte.to_s unless reposte.nil? - attrib_bottom_left ||= damage.to_s unless damage.nil? - attrib_top_left ||= roll.to_s unless roll.nil? - self.title = title - self.color = color - self.attrib_top_left = attrib_top_left - self.attrib_top_left_icon = attrib_top_left_icon - self.attrib_top_right = attrib_top_right - self.attrib_top_right_icon = attrib_top_right_icon - self.attrib_bottom_right = attrib_bottom_right - self.attrib_bottom_right_icon = attrib_bottom_right_icon - self.attrib_bottom_left = attrib_bottom_left - self.attrib_bottom_left_icon = attrib_bottom_left_icon - self.actions.push *actions - self.flavour = flavour - self.type = type - end - - class Action - attr_accessor :content, :symbol, :seperator - - def initialize(content:, symbol: nil, seperator: false) - self.content = content - self.symbol = Array(symbol) - self.seperator = seperator - end - - def symbol - @symbol ||= [] - end - - end - - class << self - def build(cards) - Paggio.html do |_| - _.head do - _.style do - rule 'body' do - background color: '#1e1e1e' - end - rule 'p' do - margin 0 - end - rule 'button' do - font size: 50.px - padding 30.px - margin 30.px - end - rule '.card_wrapper' do - min height: (1425 * 2).px - width (825 * 7).px - display :flex - flex wrap: :wrap - height 100.% - end - rule '.card' do - height 1425.px - width 825.px - background color: :black - display :flex - end - rule '.group' do - margin '50px 50px 0px 50px' - border radius: 25.px - display :flex - flex direction: :column - #background color: :black - align content: 'space-between' - height :auto - flex 2 - gap 35.px - end - rule '.title' do - background color: :black - color :antiquewhite - flex 3 - border radius: 25.px - overflow :hidden - - position :relative - font size: 85.px - display :flex - align items: :center - justify content: :center - text align: :center - flex direction: :column - padding 25.px - border width: '2px 2px 2px 2px' - border color: :black - border style: :solid - end - rule '.attrib_icon' do - background color: 'rgba(255,255,255,0.10)' - end - rule '.attrib_tl' do - position :absolute - top 0 - left 0 - border radius: '0 0 50px 0' - border color: 'rgba(255,255,255,0.50)' - border style: :solid - border width: '0 5px 5px 0' - padding '15px 25px 15px 15px' - end - rule '.attrib_tr' do - position :absolute - top 0 - right 0 - border radius: '0 0 0 50px' - border color: 'rgba(255,255,255,0.50)' - border style: :solid - border width: '0 0 5px 5px' - padding '15px 15px 15px 25px' - end - rule '.attrib_br' do - position :absolute - bottom 0 - right 0 - border radius: '50px 0 0 0' - border color: 'rgba(255,255,255,0.50)' - border style: :solid - border width: '5px 0 0 5px' - padding '15px 15px 15px 25px' - end - rule '.attrib_bl' do - position :absolute - bottom 0 - left 0 - border radius: '0 50px 0 0' - border color: 'rgba(255,255,255,0.50)' - border style: :solid - border width: '5px 5px 0 0' - padding '15px 25px 15px 15px' - end - rule '.attrib_top_icons' do - top 0 - end - rule '.attrib_bottom_icons' do - bottom 0 - end - rule '.content' do - background color: :antiquewhite - color :black - flex 5 - border radius: 25.px - overflow :hidden - position :relative - - font size: 50.px - display :flex - justify content: 'flex-start' - gap 5.px - text align: :left - padding '35px 30px 30px 30px' - flex direction: :column - border width: '2px 2px 2px 2px' - border color: :black - border style: :solid - end - rule '.tap_icon' do - background color: :black - end - rule '.joker_icon' do - background color: :black - padding '6px 3px 2px 5px' - end - rule '.blood_icon' do - background color: :black - padding '6px 3px 2px 5px' - end - rule '.suit_icon' do - background color: :black - text align: :center - font size: 60.px - line height: 40.px - end - rule '.spades_icon' do - color :antiquewhite - end - rule '.clubs_icon' do - color :antiquewhite - end - rule '.diamonds_icon' do - color :orangered - end - rule '.hearts_icon' do - color :orangered - end - rule '.odd_icon' do - background color: :black - padding '12px 0px 0px 12px' - font size: 30.px - height 48.px - width 48.px - end - rule '.even_icon' do - background color: :black - padding '12px 0px 0px 12px' - font size: 30.px - height 48.px - width 48.px - end - rule '.greater_icon' do - background color: :black - padding '12px 0px 0px 12px' - font size: 30.px - height 48.px - width 48.px - end - rule '.lesser_icon' do - background color: :black - padding '12px 0px 0px 12px' - font size: 30.px - height 48.px - width 48.px - end - rule '.face_icon' do - background color: :black - #padding '12px 0px 0px 12px' - #font size: 30.px - #height 48.px - #width 48.px - padding '6px 3px 2px 5px' - end - rule '.icon' do - display 'inline-block' - padding '8px 4px 0px 4px' - border radius: 15.px - aspect ratio: '1/1' - font size: 40.px - height 52.px - width 52.px - end - rule '.card_type' do - background color: :antiquewhite - text align: :center - font size: 40.px - padding 10.px - border radius: '15px 15px 0 0' - font weight: :bold - border width: '2px 2px 0 2px' - border color: :black - border style: :solid - end - rule '.symbol_wrapper_outer' do - display 'flex' - gap 20.px - end - rule '.symbol_wrapper_inner' do - display 'flex' - flex direction: 'column' - gap 5.px - end - rule '.action_detail' do - padding top: 0.px - text align: :left - end - rule '.flavour_wrapper' do - position :absolute - bottom 0 - left 0 - width 100.% - text align: :center - end - rule '.flavour' do - color 'rgba(0,0,0,0.5)' - padding 35.px - font size: 35.px - end - end - end - _.button onclick: "downloadAsImage()" do - "Download" - end - _.div.card_wrapper.card_wrapper! do - cards.each do |card| - _.div.card(style: "background:linear-gradient(225deg, rgba(0,0,0,1) -50%, #{card.color} 100%)") do - _.div.group do - _.div.title do - if card.attrib_top_left && card.attrib_top_left_icon - _.div.attrib_icon.attrib_tl do - card.attrib_top_left_icon + ' ' + card.attrib_top_left - end - end - if card.attrib_top_right && card.attrib_top_right_icon - _.div.attrib_icon.attrib_tr do - card.attrib_top_right + ' ' + card.attrib_top_right_icon - end - end - _.p card.title if card.title - if card.attrib_bottom_left && card.attrib_bottom_left_icon - _.div.attrib_icon.attrib_bl do - card.attrib_bottom_left_icon + ' ' + card.attrib_bottom_left - end - end - if card.attrib_bottom_right && card.attrib_bottom_right_icon - _.div.attrib_icon.attrib_br do - card.attrib_bottom_right + ' ' + card.attrib_bottom_right_icon - end - end - end - _.div.content do - card.actions.each do |action| - _.div.action do - _.hr if action.seperator - if !action.symbol.empty? - _.div.symbol_wrapper_outer do - _.div.symbol_wrapper_inner do - #build_symbol - if action.symbol.include? :tap - _.span.icon.tap_icon do - "↪️" - end - end - if action.symbol.include? :spades - _.span.icon.suit_icon.spades_icon do - "♠️" - end - end - if action.symbol.include? :clubs - _.span.icon.suit_icon.clubs_icon do - "♣️" - end - end - if action.symbol.include? :diamonds - _.span.icon.suit_icon.diamonds_icon do - "♦️" - end - end - if action.symbol.include? :hearts - _.span.icon.suit_icon.hearts_icon do - "♥️" - end - end - if action.symbol.include? :joker - _.span.icon.joker_icon do - "🃏" - end - end - if action.symbol.include? :blood - _.span.icon.blood_icon do - "🩸" - end - end - if action.symbol.include? :odd - _.span.icon.odd_icon do - "🔻" - end - end - if action.symbol.include? :even - _.span.icon.even_icon do - "⬜" - end - end - if action.symbol.include? :face - _.span.icon.face_icon do - "🎭" - end - end - if action.symbol.include? :greater - _.span.icon.greater_icon do - "➕" - end - end - if action.symbol.include? :lesser - _.span.icon.lesser_icon do - "➖" - end - end - end - _.div.action_detail do - _.markdown <<-MD - #{action.content} - MD - end - end - else - _.markdown <<-MD - #{action.content} - MD - end - end - end - if card.flavour - _.div.flavour_wrapper do - _.div.flavour do - _.hr - _.markdown <<-MD - #{card.flavour} - MD - end - end - end - #_.p do - # _.span.tap_icon do - # "↪️" - # end - # _.markdown <<-MD - # Attack with a 🎲 **d6** roll. - # On success deal ⚔️ **2 damage**. - # MD - #end - ##p "↪️ My content will go here at some point." - #_.p do - # _.span.face_icon do - # "♠️" - # end - # _.text "My content will go here at some point." - #end - #_.div do - # _.hr - # _.p "this is just some flavour text" - #end - end - _.div.card_type do - card.type - end - end - end - end - end - _.script src: "./web/bundle.js" - _.script do - <<-SCRIPT -function downloadAsImage() { - htmlToImage.toPng(document.getElementById('card_wrapper')) - .then(function (dataUrl) { - download(dataUrl, 'card_wrapper.png'); - }); -} - SCRIPT - end - end - end - end -end - - diff --git a/cards/card_weapons.rb b/cards/card_weapons.rb deleted file mode 100644 index ed46343..0000000 --- a/cards/card_weapons.rb +++ /dev/null @@ -1,89 +0,0 @@ -load 'card.rb' - -cards = [] - -card = Card.new -card.title = "Unarmed Strike" -card.color = 'goldenrod' - -#card.attrib_top_left = '14' -#card.attrib_top_left_icon = '🩸' - -#card.attrib_top_right = '2' -#card.attrib_top_right_icon = '🛡️' - -card.attrib_bottom_right = '1' -card.attrib_bottom_right_icon = '🎲' - -card.attrib_bottom_left = '1' -card.attrib_bottom_left_icon = '⚔️' - -card.actions.push Card::Action.new( - content: 'Attack with a 🎲 **d4** roll. On success deal ⚔️ **1 damage**.', - symbol: :tap, -) -card.flavour = '"Savage"' -card.type = 'Innate Weapon' - -cards.push card - -card = Card.new -card.title = "Well Worn Knife" -card.color = 'rebeccapurple' - -#card.attrib_top_left = '14' -#card.attrib_top_left_icon = '🩸' - -#card.attrib_top_right = '2' -#card.attrib_top_right_icon = '🛡️' - -card.attrib_bottom_right = '2' -card.attrib_bottom_right_icon = '🎲' - -card.attrib_bottom_left = '1' -card.attrib_bottom_left_icon = '⚔️' - -card.actions.push Card::Action.new( - content: 'Attack with a 🎲 **d6** roll. On success deal ⚔️ **Prescision+1 or Strength+1 damage**.', - symbol: :tap, -) -#card.actions.push Card::Action.new( -# content: 'Play an **even** ♠️ to un-tap', -# seperator: true, -#) -card.flavour = '"Only *slightly* better then a butter knife."' -card.type = 'Weapon' - -cards.push card - -card = Card.new -card.title = "Slingshot" -card.color = 'rebeccapurple' - -#card.attrib_top_left = '14' -#card.attrib_top_left_icon = '🩸' - -#card.attrib_top_right = '2' -#card.attrib_top_right_icon = '🛡️' - -#card.attrib_bottom_right = '2' -#card.attrib_bottom_right_icon = '🎲' - -#card.attrib_bottom_left = '1' -#card.attrib_bottom_left_icon = '⚔️' - -card.actions.push Card::Action.new( - content: 'Attack with a 🎲 **d6** roll. On success deal ⚔️ **Prescision damage**.', - symbol: :tap, -) -card.actions.push Card::Action.new( - content: 'Ranged: This weapon avoids melee reposte attacks.', - seperator: true, -) -card.flavour = '"Only a troublemaker would use this."' -card.type = 'Weapon' - -cards.push card - - -File.write('card.html', Card.build(cards)) diff --git a/cards/cardback.png b/cards/cardback.png deleted file mode 100644 index 73dd350..0000000 Binary files a/cards/cardback.png and /dev/null differ diff --git a/cards/cardback.svg b/cards/cardback.svg deleted file mode 100644 index 1099321..0000000 --- a/cards/cardback.svg +++ /dev/null @@ -1,223 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/cards/cards/alchemical_recipes.rb b/cards/cards/alchemical_recipes.rb new file mode 100644 index 0000000..1332873 --- /dev/null +++ b/cards/cards/alchemical_recipes.rb @@ -0,0 +1,21 @@ +require_relative 'card.rb' + +alchemical_recipes = {} + +alchemical_recipes[:crystal_encasement] = Card.new( + title: "Crystal Encasement Recipe", + #damage: 3, + #blood: 2, + #reposte: 'Prc', + actions: [ + Card::Action.new( + content: 'A potion which when applied to a surface quickly grows strong blue crystals. Can also be thrown.', + symbol: [:diamonds, :blood] + ), + ], + color: 'firebrick', + flavour: '"You arent making a bomb, are you?"', + type: 'Blood Magic (Eldritch)' +) + +Card.output('alchemical_recipes', alchemical_recipes) diff --git a/cards/cards/armour.rb b/cards/cards/armour.rb new file mode 100644 index 0000000..d8ea418 --- /dev/null +++ b/cards/cards/armour.rb @@ -0,0 +1,60 @@ +require_relative 'card.rb' + +armour = {} + +armour[:iron_plate] = Card.new( + title: "Iron Plate", + defence: '5', + #blood: 1, + #reposte: 'Prc', + #actions: [ + #Card::Action.new( + # content: '(**even**) Engulf your hand in flames for short while. You need to maintain concentration.', + # symbol: [:clubs, :blood] + #), + #Card::Action.new( + # seperator: true, + # content: '(**while concentrating**) Deal melee damage to a target with your flame engulfed hand. If the target is a small object set it on fire.', + # symbol: [:tap] + #), + #], + color: 'cadetblue', + flavour: '"Strong but heavy"', + type: 'Body Armour' +) + +armour[:chain_mail] = Card.new( + title: "Chain Mail", + defence: '4', + color: 'cadetblue', + flavour: '"The fairly lightweight option"', + type: 'Body Armour' +) + +armour[:leather] = Card.new( + title: "Leather", + defence: '3', + color: 'cadetblue', + flavour: '"Popular with goths and punks"', + type: 'Body Armour' +) + +armour[:padded] = Card.new( + title: "Padded", + defence: '2', + color: 'cadetblue', + flavour: '"A *LOT* of regular clothing stacked together"', + type: 'Body Armour' +) + +armour[:none] = Card.new( + title: "None", + defence: '1', + color: 'cadetblue', + flavour: '"Just the skin on your back"', + type: 'Body Armour' +) + +File.write('armour.html', Card.build(armour.values)) + +Card.output('armour', armour) diff --git a/cards/cards/card.rb b/cards/cards/card.rb new file mode 100644 index 0000000..3aa4fcd --- /dev/null +++ b/cards/cards/card.rb @@ -0,0 +1,494 @@ +require 'paggio' +require 'paggio/markdown' + +class Card + attr_accessor( + :attrib_top_left, :attrib_top_left_icon, + :attrib_top_right, :attrib_top_right_icon, + :attrib_bottom_left, :attrib_bottom_left_icon, + :attrib_bottom_right, :attrib_bottom_right_icon, + :color, + :title, + :flavour, + :type + ) + + def actions + @actions ||= [] + end + + def initialize( + title:, + color:, + attrib_top_right: nil, + attrib_top_right_icon: '🩸', + blood: nil, + attrib_top_left: nil, + attrib_top_left_icon: '🎲', + roll: nil, + attrib_bottom_right: nil, + attrib_bottom_right_icon: '🛡️', + reposte: nil, + defence: nil, + attrib_bottom_left: nil, + attrib_bottom_left_icon: '⚔️', + damage: nil, + actions: [], + flavour: nil, + type: nil + ) + attrib_top_right ||= blood.to_s unless blood.nil? + attrib_bottom_right ||= defence.to_s unless defence.nil? + attrib_bottom_right ||= reposte.to_s unless reposte.nil? + attrib_bottom_left ||= damage.to_s unless damage.nil? + attrib_top_left ||= roll.to_s unless roll.nil? + self.title = title + self.color = color + self.attrib_top_left = attrib_top_left + self.attrib_top_left_icon = attrib_top_left_icon + self.attrib_top_right = attrib_top_right + self.attrib_top_right_icon = attrib_top_right_icon + self.attrib_bottom_right = attrib_bottom_right + self.attrib_bottom_right_icon = attrib_bottom_right_icon + self.attrib_bottom_left = attrib_bottom_left + self.attrib_bottom_left_icon = attrib_bottom_left_icon + self.actions.push *actions + self.flavour = flavour + self.type = type + end + + class Action + attr_accessor :content, :symbol, :seperator + + def initialize(content:, symbol: nil, seperator: false) + self.content = content + self.symbol = Array(symbol) + self.seperator = seperator + end + + def symbol + @symbol ||= [] + end + + end + + class << self + def build(cards) + Paggio.html do |_| + _.head do + _.style do + rule 'body' do + background color: '#1e1e1e' + end + rule 'p' do + margin 0 + end + rule 'button' do + font size: 50.px + padding 30.px + margin 30.px + end + rule '.card_wrapper' do + min height: (1425 * 2).px + width (825 * 7).px + display :flex + flex wrap: :wrap + height 100.% + end + rule '.card' do + height 1425.px + width 825.px + background color: :black + display :flex + end + rule '.group' do + margin '50px 50px 0px 50px' + border radius: 25.px + display :flex + flex direction: :column + #background color: :black + align content: 'space-between' + height :auto + flex 2 + gap 35.px + end + rule '.title' do + background color: :black + color :antiquewhite + flex 3 + border radius: 25.px + overflow :hidden + + position :relative + font size: 85.px + display :flex + align items: :center + justify content: :center + text align: :center + flex direction: :column + padding 25.px + border width: '2px 2px 2px 2px' + border color: :black + border style: :solid + end + rule '.attrib_icon' do + background color: 'rgba(255,255,255,0.10)' + end + rule '.attrib_tl' do + position :absolute + top 0 + left 0 + border radius: '0 0 50px 0' + border color: 'rgba(255,255,255,0.50)' + border style: :solid + border width: '0 5px 5px 0' + padding '15px 25px 15px 15px' + end + rule '.attrib_tr' do + position :absolute + top 0 + right 0 + border radius: '0 0 0 50px' + border color: 'rgba(255,255,255,0.50)' + border style: :solid + border width: '0 0 5px 5px' + padding '15px 15px 15px 25px' + end + rule '.attrib_br' do + position :absolute + bottom 0 + right 0 + border radius: '50px 0 0 0' + border color: 'rgba(255,255,255,0.50)' + border style: :solid + border width: '5px 0 0 5px' + padding '15px 15px 15px 25px' + end + rule '.attrib_bl' do + position :absolute + bottom 0 + left 0 + border radius: '0 50px 0 0' + border color: 'rgba(255,255,255,0.50)' + border style: :solid + border width: '5px 5px 0 0' + padding '15px 25px 15px 15px' + end + rule '.attrib_top_icons' do + top 0 + end + rule '.attrib_bottom_icons' do + bottom 0 + end + rule '.content' do + background color: :antiquewhite + color :black + flex 5 + border radius: 25.px + overflow :hidden + position :relative + + font size: 50.px + display :flex + justify content: 'flex-start' + gap 5.px + text align: :left + padding '35px 30px 30px 30px' + flex direction: :column + border width: '2px 2px 2px 2px' + border color: :black + border style: :solid + end + rule '.tap_icon' do + background color: :black + end + rule '.joker_icon' do + background color: :black + padding '6px 3px 2px 5px' + end + rule '.blood_icon' do + background color: :black + padding '6px 3px 2px 5px' + end + rule '.suit_icon' do + background color: :black + text align: :center + font size: 60.px + line height: 40.px + end + rule '.spades_icon' do + color :antiquewhite + end + rule '.clubs_icon' do + color :antiquewhite + end + rule '.diamonds_icon' do + color :orangered + end + rule '.hearts_icon' do + color :orangered + end + rule '.odd_icon' do + background color: :black + padding '12px 0px 0px 12px' + font size: 30.px + height 48.px + width 48.px + end + rule '.even_icon' do + background color: :black + padding '12px 0px 0px 12px' + font size: 30.px + height 48.px + width 48.px + end + rule '.greater_icon' do + background color: :black + padding '12px 0px 0px 12px' + font size: 30.px + height 48.px + width 48.px + end + rule '.lesser_icon' do + background color: :black + padding '12px 0px 0px 12px' + font size: 30.px + height 48.px + width 48.px + end + rule '.face_icon' do + background color: :black + #padding '12px 0px 0px 12px' + #font size: 30.px + #height 48.px + #width 48.px + padding '6px 3px 2px 5px' + end + rule '.icon' do + display 'inline-block' + padding '8px 4px 0px 4px' + border radius: 15.px + aspect ratio: '1/1' + font size: 40.px + height 52.px + width 52.px + end + rule '.card_type' do + background color: :antiquewhite + text align: :center + font size: 40.px + padding 10.px + border radius: '15px 15px 0 0' + font weight: :bold + border width: '2px 2px 0 2px' + border color: :black + border style: :solid + end + rule '.symbol_wrapper_outer' do + display 'flex' + gap 20.px + end + rule '.symbol_wrapper_inner' do + display 'flex' + flex direction: 'column' + gap 5.px + end + rule '.action_detail' do + padding top: 0.px + text align: :left + end + rule '.flavour_wrapper' do + position :absolute + bottom 0 + left 0 + width 100.% + text align: :center + end + rule '.flavour' do + color 'rgba(0,0,0,0.5)' + padding 35.px + font size: 35.px + end + end + end + _.button onclick: "downloadAsImage()" do + "Download" + end + _.div.card_wrapper.card_wrapper! do + cards.each do |card| + _.div.card(style: "background:linear-gradient(225deg, rgba(0,0,0,1) -50%, #{card.color} 100%)") do + _.div.group do + _.div.title do + if card.attrib_top_left && card.attrib_top_left_icon + _.div.attrib_icon.attrib_tl do + card.attrib_top_left_icon + ' ' + card.attrib_top_left + end + end + if card.attrib_top_right && card.attrib_top_right_icon + _.div.attrib_icon.attrib_tr do + card.attrib_top_right + ' ' + card.attrib_top_right_icon + end + end + _.p card.title if card.title + if card.attrib_bottom_left && card.attrib_bottom_left_icon + _.div.attrib_icon.attrib_bl do + card.attrib_bottom_left_icon + ' ' + card.attrib_bottom_left + end + end + if card.attrib_bottom_right && card.attrib_bottom_right_icon + _.div.attrib_icon.attrib_br do + card.attrib_bottom_right + ' ' + card.attrib_bottom_right_icon + end + end + end + _.div.content do + card.actions.each do |action| + _.div.action do + _.hr if action.seperator + if !action.symbol.empty? + _.div.symbol_wrapper_outer do + _.div.symbol_wrapper_inner do + #build_symbol + if action.symbol.include? :tap + _.span.icon.tap_icon do + "↪️" + end + end + if action.symbol.include? :blood + _.span.icon.blood_icon do + "🩸" + end + end + if action.symbol.include? :reactive + _.span.icon.lesser_icon do + "📣" + end + end + if action.symbol.include? :joker + _.span.icon.joker_icon do + "🃏" + end + end + if action.symbol.include? :spades + _.span.icon.suit_icon.spades_icon do + "♠️" + end + end + if action.symbol.include? :clubs + _.span.icon.suit_icon.clubs_icon do + "♣️" + end + end + if action.symbol.include? :diamonds + _.span.icon.suit_icon.diamonds_icon do + "♦️" + end + end + if action.symbol.include? :hearts + _.span.icon.suit_icon.hearts_icon do + "♥️" + end + end + if action.symbol.include? :odd + _.span.icon.odd_icon do + "🔻" + end + end + if action.symbol.include? :even + _.span.icon.even_icon do + "⬜" + end + end + if action.symbol.include? :face + _.span.icon.face_icon do + "🎭" + end + end + if action.symbol.include? :greater + _.span.icon.greater_icon do + "➕" + end + end + if action.symbol.include? :lesser + _.span.icon.lesser_icon do + "➖" + end + end + if action.symbol.include? :invisible + _.span.icon.lesser_icon(style: 'visibility: hidden;') do + "🈷️" + end + end + end + _.div.action_detail do + _.markdown <<-MD + #{action.content} + MD + end + end + else + _.markdown <<-MD + #{action.content} + MD + end + end + end + if card.flavour + _.div.flavour_wrapper do + _.div.flavour do + _.hr + _.markdown <<-MD + #{card.flavour} + MD + end + end + end + #_.p do + # _.span.tap_icon do + # "↪️" + # end + # _.markdown <<-MD + # Attack with a 🎲 **d6** roll. + # On success deal ⚔️ **2 damage**. + # MD + #end + ##p "↪️ My content will go here at some point." + #_.p do + # _.span.face_icon do + # "♠️" + # end + # _.text "My content will go here at some point." + #end + #_.div do + # _.hr + # _.p "this is just some flavour text" + #end + end + _.div.card_type do + card.type + end + end + end + end + end + _.script src: "./web/bundle.js" + _.script do + <<-SCRIPT +function downloadAsImage() { + htmlToImage.toPng(document.getElementById('card_wrapper')) + .then(function (dataUrl) { + download(dataUrl, 'card_wrapper.png'); + }); +} + SCRIPT + end + end + end + + def output(name, cards, prefix: "output/") + File.write("#{prefix}#{name}.html", Card.build(cards.values)) + end + end +end + + diff --git a/cards/cards/card_weapons.rb b/cards/cards/card_weapons.rb new file mode 100644 index 0000000..dccb8d7 --- /dev/null +++ b/cards/cards/card_weapons.rb @@ -0,0 +1,91 @@ +require_relative 'card.rb' + +cards = [] + +card = Card.new +card.title = "Unarmed Strike" +card.color = 'goldenrod' + +#card.attrib_top_left = '14' +#card.attrib_top_left_icon = '🩸' + +#card.attrib_top_right = '2' +#card.attrib_top_right_icon = '🛡️' + +card.attrib_bottom_right = '1' +card.attrib_bottom_right_icon = '🎲' + +card.attrib_bottom_left = '1' +card.attrib_bottom_left_icon = '⚔️' + +card.actions.push Card::Action.new( + content: 'Attack with a 🎲 **d4** roll. On success deal ⚔️ **1 damage**.', + symbol: :tap, +) +card.flavour = '"Savage"' +card.type = 'Innate Weapon' + +cards.push card + +card = Card.new +card.title = "Well Worn Knife" +card.color = 'rebeccapurple' + +#card.attrib_top_left = '14' +#card.attrib_top_left_icon = '🩸' + +#card.attrib_top_right = '2' +#card.attrib_top_right_icon = '🛡️' + +card.attrib_bottom_right = '2' +card.attrib_bottom_right_icon = '🎲' + +card.attrib_bottom_left = '1' +card.attrib_bottom_left_icon = '⚔️' + +card.actions.push Card::Action.new( + content: 'Attack with a 🎲 **d6** roll. On success deal ⚔️ **Prescision+1 or Strength+1 damage**.', + symbol: :tap, +) +#card.actions.push Card::Action.new( +# content: 'Play an **even** ♠️ to un-tap', +# seperator: true, +#) +card.flavour = '"Only *slightly* better then a butter knife."' +card.type = 'Weapon' + +cards.push card + +card = Card.new +card.title = "Slingshot" +card.color = 'rebeccapurple' + +#card.attrib_top_left = '14' +#card.attrib_top_left_icon = '🩸' + +#card.attrib_top_right = '2' +#card.attrib_top_right_icon = '🛡️' + +#card.attrib_bottom_right = '2' +#card.attrib_bottom_right_icon = '🎲' + +#card.attrib_bottom_left = '1' +#card.attrib_bottom_left_icon = '⚔️' + +card.actions.push Card::Action.new( + content: 'Attack with a 🎲 **d6** roll. On success deal ⚔️ **Prescision damage**.', + symbol: :tap, +) +card.actions.push Card::Action.new( + content: 'Ranged: This weapon avoids melee reposte attacks.', + seperator: true, +) +card.flavour = '"Only a troublemaker would use this."' +card.type = 'Weapon' + +cards.push card + + +File.write('card.html', Card.build(cards)) + +Card.output('alchemical_recipes', alchemical_recipes) diff --git a/cards/cards/class_abilities.rb b/cards/cards/class_abilities.rb new file mode 100644 index 0000000..300d213 --- /dev/null +++ b/cards/cards/class_abilities.rb @@ -0,0 +1,181 @@ +require_relative 'card.rb' + +class_abilities = {} + +class_colors = { + rogue: 'Maroon', + ranger: 'ForestGreen', + astrologist: 'DodgerBlue', + monk: 'OrangeRed' +} + +class_abilities[:quick_attack] = Card.new( + title: "Quick Attack", + actions: [ + Card::Action.new( + symbol: :spades, + content: '(odd) **Refresh** a **light** weapon.', + ), + ], + color: class_colors[:rogue], + flavour: '"Stabby stabby stab"', + type: 'Rogue Ability', +) +class_abilities[:duck_and_weave] = Card.new( + title: "Duck and Weave", + actions: [ + Card::Action.new( + symbol: [:tap, :diamonds], + content: ' Ignore up to the card played worth of damage from a **reposte**.', + ), + ], + color: class_colors[:rogue], + flavour: '"Missed me"', + type: 'Rogue Ability', +) + +class_abilities[:surgical_strike] = Card.new( + title: "Surgical Strike", + actions: [ + Card::Action.new( + symbol: [:tap, :spades], + content: '(less then 5) Replace a weapon\'s damage with the value of the card played. Only affects the current attack.', + ), + ], + color: class_colors[:rogue], + #flavour: '"Missed me"', + type: 'Rogue Ability', +) + +class_abilities[:down_they_alleys] = Card.new( + title: "Down the Alleys", + actions: [ + Card::Action.new( + symbol: [:diamonds], + content: '(odd) When travelling inside a settlement, after an encounter has been revealed: you may choose to either discard the encounter and draw another one or skip the encounter.', + ), + ], + color: class_colors[:rogue], + #flavour: '"Missed me"', + type: 'Rogue Ability', +) + +class_abilities[:spot] = Card.new( + title: "Spot", + actions: [ + Card::Action.new( + symbol: [:hearts], + content: '(face) Mark a target. Choose up to one dice to reroll on each attack agaisnt this target. You can only have one target marked at a time. Lasts until 3 rerolls or the end of combat.', + ), + ], + color: class_colors[:ranger], + #flavour: '"Missed me"', + type: 'Ranger Ability', +) +class_abilities[:flexible_shooter] = Card.new( + title: "Flexible Shooter", + actions: [ + Card::Action.new( + #symbol: [:hearts], + content: 'You can deal reposte damage with any ranged weapon.', + ), + ], + color: class_colors[:ranger], + #flavour: '"Missed me"', + type: 'Ranger Ability', +) + +class_abilities[:scouting_ahead] = Card.new( + title: "Scouting Ahead", + actions: [ + Card::Action.new( + symbol: [:diamonds], + content: '(even) When travelling outside of a settlement, before the next encounter: reveal 2 encounters and pick 1. Discard the other.', + ), + ], + color: class_colors[:ranger], + #flavour: '"Missed me"', + type: 'Ranger Ability', +) + +class_abilities[:healing_salve_recipe] = Card.new( + title: "Healing Salve Recipe", + actions: [ + Card::Action.new( + symbol: [:diamonds, :hearts], + content: '(each suit) Healberry Herb, Cloth.', + ), + ], + color: class_colors[:ranger], + flavour: '"*Don\'t* eat the berries"', + type: 'Ranger Recipe', +) + +class_abilities[:recast] = Card.new( + title: "Recast", + actions: [ + Card::Action.new( + symbol: [:tap, :hearts], + content: '(less then or equal to your max blood roll) Replace the blood roll with the value of the card played and reroll any other associated dice with a spell you cast.', + ), + ], + color: class_colors[:astrologist], + #flavour: '"Missed me"', + type: 'Astrologist Ability', +) +class_abilities[:focused_cast] = Card.new( + title: "Focused Cast", + actions: [ + Card::Action.new( + symbol: [:tap], + content: 'Upgrade the blood dice for one spell you cast.', + ), + ], + color: class_colors[:astrologist], + #flavour: '"Missed me"', + type: 'Astrologist Ability', +) + +class_abilities[:focused_cast] = Card.new( + title: "Focused Cast", + actions: [ + Card::Action.new( + symbol: [:tap], + content: 'Upgrade the blood dice for one spell you cast.', + ), + ], + color: class_colors[:astrologist], + #flavour: '"Missed me"', + type: 'Astrologist Ability', +) + +class_abilities[:change_of_fate] = Card.new( + title: "Change of Fate", + blood: 1, + actions: [ + Card::Action.new( + symbol: [:blood], + content: 'Swap 1 card with a willing player.', + ), + ], + color: class_colors[:astrologist], + #flavour: '"Missed me"', + type: 'Astrologist Ability', +) + +class_abilities[:palm_reading] = Card.new( + title: "Palm Reading", + blood: 1, + actions: [ + Card::Action.new( + symbol: [:blood], + content: 'Discard a willing players hand and replace it with new cards drawn.', + ), + ], + color: class_colors[:astrologist], + #flavour: '"Missed me"', + type: 'Astrologist Ability', +) + +Card.output('class_abilities', class_abilities); + diff --git a/cards/cards/common_items.rb b/cards/cards/common_items.rb new file mode 100644 index 0000000..06c5347 --- /dev/null +++ b/cards/cards/common_items.rb @@ -0,0 +1,153 @@ +require_relative 'card.rb' + +common_items = {} + +common_items[:test] = Card.new( + title: "Test", + color: 'rebeccapurple', + reposte: 'Prc', + damage: '3', + actions: [ + Card::Action.new( + content: '🎲 **d8 · Prc** to Bludgeon.', + symbol: [ + :tap, + :odd, + :even, + :greater, + :lesser, + :blood, + :reactive, + :face, + ], + ), + Card::Action.new( + content: '🎲 **d6 + Prc** to hit.', + symbol: :spades, + ), + Card::Action.new( + seperator: true, + content: '🎲 **d6 + Prc** to hit.', + symbol: :clubs, + ), + Card::Action.new( + seperator: true, + content: '🎲 **d6 + Prc** to hit.', + symbol: :diamonds, + ), + Card::Action.new( + seperator: true, + content: '🎲 **d6 + Prc** to hit.', + symbol: :joker, + ), + Card::Action.new( + seperator: true, + content: '🎲 **d6 + Prc** to hit.', + symbol: [:tap, :hearts] + ), + ], + flavour: '"World Famous Iron Toothpick"', + type: 'Thrusting Sword Weapon' +) + +common_items[:sack] = Card.new( + title: "Sack", + color: 'saddlebrown', + actions: [ + Card::Action.new( + content: '**Item slot**: 12 spaces.', + ), + Card::Action.new( + seperator: true, + content: 'Draw up to 2 cards from this inventory and place up to 2 items to the front or back of this inventory.', + symbol: :tap, + ), + Card::Action.new( + seperator: true, + content: 'Equips on your back.', + ), + ], + #flavour: '"World Famous Iron Toothpick"', + type: 'Leather Item Container' +) + +common_items[:satchel] = Card.new( + title: "Satchel", + color: 'saddlebrown', + actions: [ + Card::Action.new( + content: '**Item slot**: 6 spaces.', + ), + Card::Action.new( + seperator: true, + content: 'Draw up to 3 cards from this inventory and place up to 3 items to the front or back of this inventory.', + symbol: :tap, + ), + Card::Action.new( + seperator: true, + content: 'Equips on your back.', + ), + ], + #flavour: '"World Famous Iron Toothpick"', + type: 'Leather Item Container' +) + +common_items[:rucksack] = Card.new( + title: "Rucksack", + color: 'saddlebrown', + actions: [ + Card::Action.new( + content: '**Item slot**: 12 spaces.', + ), + Card::Action.new( + content: '**Item slot**: 6 spaces.', + ), + Card::Action.new( + seperator: true, + content: 'Draw up to 2 cards from this inventory and place up to 2 items to the front or back of this inventory.', + symbol: :tap, + ), + Card::Action.new( + seperator: true, + content: 'Equips on your back.', + ), + ], + #flavour: '"World Famous Iron Toothpick"', + type: 'Leather Item Container' +) + +common_items[:sheath] = Card.new( + title: "Sheath", + color: 'saddlebrown', + actions: [ + Card::Action.new( + content: '**Item slot**: 1 weapon.', + ), + Card::Action.new( + seperator: true, + content: 'Draw up to 1 cards from this inventory and place up to 1 weapon to this inventory.', + symbol: :tap, + ), + Card::Action.new( + seperator: true, + content: 'Equips on your back or hip.', + ), + ], + #flavour: '"World Famous Iron Toothpick"', + type: 'Leather Item Container' +) + +common_items[:hand_bomb] = Card.new( + title: "Hand Bomb", + color: 'grey', + actions: [ + Card::Action.new( + content: 'Deal **3 damage**. Consumes this item.', + symbol: :tap, + ), + ], + #flavour: '"World Famous Iron Toothpick"', + type: 'Consumable Weapon' +) + +Card.output('common_items', common_items); diff --git a/cards/cards/common_weapons.rb b/cards/cards/common_weapons.rb new file mode 100644 index 0000000..e1be852 --- /dev/null +++ b/cards/cards/common_weapons.rb @@ -0,0 +1,356 @@ +require_relative 'card.rb' + +common_weapons = {} + +common_weapons[:test] = Card.new( + title: "Test", + color: 'rebeccapurple', + reposte: 'Prc', + damage: '3', + actions: [ + Card::Action.new( + content: '🎲 **d8 · Prc** to Bludgeon.', + symbol: [ + :tap, + :odd, + :even, + :greater, + :lesser, + :blood, + :reactive, + :face, + ], + ), + Card::Action.new( + content: '🎲 **d6 + Prc** to hit.', + symbol: :spades, + ), + Card::Action.new( + seperator: true, + content: '🎲 **d6 + Prc** to hit.', + symbol: :clubs, + ), + Card::Action.new( + seperator: true, + content: '🎲 **d6 + Prc** to hit.', + symbol: :diamonds, + ), + Card::Action.new( + seperator: true, + content: '🎲 **d6 + Prc** to hit.', + symbol: :joker, + ), + Card::Action.new( + seperator: true, + content: '🎲 **d6 + Prc** to hit.', + symbol: [:tap, :hearts] + ), + ], + flavour: '"World Famous Iron Toothpick"', + type: 'Thrusting Sword Weapon' +) + +=begin +common_weapons[:rapier] = Card.new( + title: "Rapier", + color: 'rebeccapurple', + reposte: 'Prc', + damage: '3', + actions: [ + Card::Action.new( + content: '🎲 **d8 · Prc** to Pierce.', + symbol: :tap, + ), + #Card::Action.new( + # seperator: true, + # content: '**Opportune Strike**: When targeting an enemy with this weapon, mark them until the end of their turn. While marked if they attack somone other then you then you can perform a reposte on them.', + #) + ], + flavour: '"World Famous Iron Toothpick"', + type: 'Thrusting Sword Weapon' +) +=end + +common_weapons[:spear] = Card.new( + title: "Spear", + color: 'rebeccapurple', + reposte: 'Prc', + damage: '3', + actions: [ + Card::Action.new( + content: '🎲 **d6 · Prc** to Pierce.', + symbol: :tap, + ), + Card::Action.new( + content: '**Reach**, **Throwable**', + symbol: :invisible, + ), + ], + flavour: '"5x more throwable then previous editions"', + type: 'Polearm Weapon' +) + +common_weapons[:dagger] = Card.new( + title: "Dagger", + color: 'rebeccapurple', + reposte: 'Prc', + damage: '2', + actions: [ + Card::Action.new( + content: '🎲 **d4 · Prc** to Pierce.', + symbol: :tap, + ), + Card::Action.new( + content: '**Light**, **Throwable**', + symbol: :invisible, + #symbol: :spades + ), + #Card::Action.new( + # seperator: true, + # content: '(even) **Swift Attack**: Refresh this card.', + # symbol: :spades + #), + ], + flavour: '"A quick and convinient way to turn a spleen into a sheath"', + type: 'Dagger Weapon' +) + +common_weapons[:longbow] = Card.new( + title: "Longbow", + color: 'rebeccapurple', + damage: '3', + #reposte: 1, + actions: [ + Card::Action.new( + content: '🎲 **d6 · Prc** to Pierce.', + symbol: :tap, + ), + Card::Action.new( + content: '**Ranged**', + symbol: :invisible, + ) + #Card::Action.new( + # seperator: true, + # content: '**Ranged**: When making an attack, you ignore repostes from your target. You can\'t deal a reposte either.', + #) + ], + flavour: '"One stringed instrument that got repurposed as a weapon."', + type: 'Bow Weapon' +) + +common_weapons[:crossbow] = Card.new( + title: "Crossbow", + color: 'rebeccapurple', + damage: '3', + #reposte: 1, + actions: [ + Card::Action.new( + content: 'Remove a counter.', + symbol: :tap, + ), + Card::Action.new( + content: '🎲 **d8 · Prc** to Pierce.', + symbol: :invisible, + ), + Card::Action.new( + content: '**Ranged**', + symbol: :invisible, + ), + Card::Action.new( + seperator: true, + content: '**Reload**: Load this weapon. Add a counter to this card.', + symbol: :tap, + ), + ], + flavour: '"No one will cross you with this weapon"', + type: 'Crossbow Weapon' +) + +common_weapons[:warhammer] = Card.new( + title: "Warhammer", + reposte: 'Str', + damage: 3, + actions: [ + Card::Action.new( + content: '🎲 **d8 · (Str)** to Bludgeon.', + symbol: :tap, + ), + ], + flavour: '"Made of over 39,000 minature hammers"', + color: 'rebeccapurple', + type: 'Hammer Weapon' +) + +common_weapons[:sickle] = Card.new( + title: "Sickle", + reposte: 'Prc', + damage: 1, + actions: [ + Card::Action.new( + content: '🎲 **d4 · (Prc)** to Bludgeon.', + symbol: :tap, + ), + Card::Action.new( + content: '**Light**, **Cleave**', + symbol: :invisible, + ), + ], + flavour: '"Made of over 39,000 minature hammers"', + color: 'rebeccapurple', + type: 'Farming Weapon' +) + +common_weapons[:scythe] = Card.new( + title: "Scythe", + reposte: 'Prc', + damage: 2, + actions: [ + Card::Action.new( + content: '🎲 **d6 · (Prc)** to Bludgeon.', + symbol: :tap, + ), + Card::Action.new( + content: '**Heavy**, **Cleave**', + symbol: :invisible, + ), + ], + flavour: '"Made of over 39,000 minature hammers"', + color: 'rebeccapurple', + type: 'Farming Weapon' +) + +common_weapons[:short_sword] = Card.new( + title: "Short Sword", + damage: 3, + reposte: 'Str', + actions: [ + Card::Action.new( + content: '🎲 **d6 · Str** to hit.', + symbol: :tap, + ), + Card::Action.new( + content: '**Light**', + symbol: :invisible, + ), + ], + flavour: '"El Classico"', + color: 'rebeccapurple', + type: 'Straight Sword Weapon' +) + +common_weapons[:straight_sword] = Card.new( + title: "Long Sword", + damage: 3, + reposte: 'Str', + actions: [ + Card::Action.new( + content: '🎲 **d8 · Str** to hit.', + symbol: :tap, + ), + #Card::Action.new( + # seperator: true, + # content: '(Two Handed) 🎲 **d6 + Str** to hit. Deal **Str** damage.', + # symbol: :tap, + #) + ], + flavour: '"El Classico"', + color: 'rebeccapurple', + type: 'Straight Sword Weapon' +) + +common_weapons[:axe] = Card.new( + title: "Axe", + damage: 4, + reposte: 'Str', + actions: [ + Card::Action.new( + content: '🎲 **d6 · Str** to Slash.', + symbol: :tap, + ), + ], + flavour: '"Looks great with a flannel shirt."', + color: 'rebeccapurple', + type: 'Axe Weapon', +) + +common_weapons[:staff] = Card.new( + title: "Staff", + damage: 2, + reposte: 'Str', + actions: [ + Card::Action.new( + content: '🎲 **d6 + Str** to Bludgeon.', + symbol: :tap, + ), + Card::Action.new( + seperator: true, + content: '🎲 **d8 + Str** to Bludgeon.', + symbol: :tap, + ), + Card::Action.new( + content: '**Heavy**', + ) + ], + color: 'rebeccapurple', + flavour: '"Says \'Made by the Ninja Custodial Group\' on the handle"', + type: 'Staff Weapon', +) + +common_weapons[:kite_shield] = Card.new( + title: "Kite Shield", + #damage: 4, + #reposte: 'Str', + actions: [ + Card::Action.new( + content: 'When **targeted with a weapon:** your attacker recieves **2 disadvantage** on their action.', + symbol: [:tap, :reactive], + ), + ], + flavour: '"Looks great with a flannel shirt."', + color: 'rebeccapurple', + type: 'Shield Weapon', +) + +common_weapons[:buckler_shield] = Card.new( + title: "Buckler Shield", + #damage: 4, + #reposte: 'Str', + actions: [ + Card::Action.new( + content: 'When **targeted with a weapon:** your attacker recieves **1 disadvantage** on their action. If your reposte triggers then deal double damage with it.', + symbol: [:tap, :reactive], + ), + ], + flavour: '"Looks great with a flannel shirt."', + color: 'rebeccapurple', + type: 'Shield Weapon', +) + +common_weapons[:caestus] = Card.new( + title: "Caestus", + color: 'DarkBlue', + actions: [ + Card::Action.new( + content: 'While equipped: Unarmed Strikes deal **Str** additional damage.', + ) + ], + flavour: '"Weapon of choice for a fit bronze statue"', + type: 'Weapon Equipment' +) + +common_weapons[:tuning_fork] = Card.new( + title: "Tuning Fork", + roll: '1d4', + actions: [ + Card::Action.new( + content: '**Casting Focus**', + ), + ], + color: 'DarkBlue', + flavour: '"Resonates with various magical frequencies to help with casting blood magic"', + type: 'Magic Casting Tool', +) + +File.write('common_weapons.html', Card.build(common_weapons.values)) + +Card.output('common_weapons', common_weapons); diff --git a/cards/cards/paladin_abilities.rb b/cards/cards/paladin_abilities.rb new file mode 100644 index 0000000..6dcdbfd --- /dev/null +++ b/cards/cards/paladin_abilities.rb @@ -0,0 +1,196 @@ +require_relative 'card.rb' + +paladin_abilities = {} + +class_colors = { + rogue: 'Maroon', + ranger: 'ForestGreen', + astrologist: 'DodgerBlue', + monk: 'OrangeRed', + paladin: 'GoldenRod' +} + +paladin_abilities[:duel] = Card.new( + title: "Duel", + actions: [ + Card::Action.new( + symbol: [:tap, :even], + content: 'Pick a target. You and that target enter a duel where you and the target may not attack anyone other then each other. You cannot use this while in a duel.', + ), + ], + color: class_colors[:paladin], + flavour: '"A famous commander\'s signature thing."', + type: 'Paladin Ability', +) + +paladin_abilities[:leading_charge] = Card.new( + title: "Leading Charge", + actions: [ + Card::Action.new( + symbol: [:tap, :reactive, :face], + content: 'When making an attack, **mark the target** and **choose an ally**. During **the ally\'s** next turn: they **gain an advatage** for all attacks they do **agaisnt the marked target**.', + ), + ], + color: class_colors[:paladin], + #flavour: '"A famous commander\'s signature thing."', + type: 'Paladin Ability', +) + +paladin_abilities[:duck_and_weave] = Card.new( + title: "Duck and Weave", + actions: [ + Card::Action.new( + symbol: [:tap, :diamonds], + content: ' Ignore up to the card played worth of damage from a **reposte**.', + ), + ], + color: class_colors[:rogue], + flavour: '"Missed me"', + type: 'Rogue Ability', +) + +paladin_abilities[:surgical_strike] = Card.new( + title: "Surgical Strike", + actions: [ + Card::Action.new( + symbol: [:tap, :spades], + content: '(less then 5) Replace a weapon\'s damage with the value of the card played. Only affects the current attack.', + ), + ], + color: class_colors[:rogue], + #flavour: '"Missed me"', + type: 'Rogue Ability', +) + +paladin_abilities[:down_they_alleys] = Card.new( + title: "Down the Alleys", + actions: [ + Card::Action.new( + symbol: [:diamonds], + content: '(odd) When travelling inside a settlement, after an encounter has been revealed: you may choose to either discard the encounter and draw another one or skip the encounter.', + ), + ], + color: class_colors[:rogue], + #flavour: '"Missed me"', + type: 'Rogue Ability', +) + +paladin_abilities[:spot] = Card.new( + title: "Spot", + actions: [ + Card::Action.new( + symbol: [:hearts], + content: '(face) Mark a target. Choose up to one dice to reroll on each attack agaisnt this target. You can only have one target marked at a time. Lasts until 3 rerolls or the end of combat.', + ), + ], + color: class_colors[:ranger], + #flavour: '"Missed me"', + type: 'Ranger Ability', +) +paladin_abilities[:flexible_shooter] = Card.new( + title: "Flexible Shooter", + actions: [ + Card::Action.new( + #symbol: [:hearts], + content: 'You can deal reposte damage with any ranged weapon.', + ), + ], + color: class_colors[:ranger], + #flavour: '"Missed me"', + type: 'Ranger Ability', +) + +paladin_abilities[:scouting_ahead] = Card.new( + title: "Scouting Ahead", + actions: [ + Card::Action.new( + symbol: [:diamonds], + content: '(even) When travelling outside of a settlement, before the next encounter: reveal 2 encounters and pick 1. Discard the other.', + ), + ], + color: class_colors[:ranger], + #flavour: '"Missed me"', + type: 'Ranger Ability', +) + +paladin_abilities[:healing_salve_recipe] = Card.new( + title: "Healing Salve Recipe", + actions: [ + Card::Action.new( + symbol: [:diamonds, :hearts], + content: '(each suit) Healberry Herb, Cloth.', + ), + ], + color: class_colors[:ranger], + flavour: '"*Don\'t* eat the berries"', + type: 'Ranger Recipe', +) + +paladin_abilities[:recast] = Card.new( + title: "Recast", + actions: [ + Card::Action.new( + symbol: [:tap, :hearts], + content: '(less then or equal to your max blood roll) Replace the blood roll with the value of the card played and reroll any other associated dice with a spell you cast.', + ), + ], + color: class_colors[:astrologist], + #flavour: '"Missed me"', + type: 'Astrologist Ability', +) +paladin_abilities[:focused_cast] = Card.new( + title: "Focused Cast", + actions: [ + Card::Action.new( + symbol: [:tap], + content: 'Upgrade the blood dice for one spell you cast.', + ), + ], + color: class_colors[:astrologist], + #flavour: '"Missed me"', + type: 'Astrologist Ability', +) + +paladin_abilities[:focused_cast] = Card.new( + title: "Focused Cast", + actions: [ + Card::Action.new( + symbol: [:tap], + content: 'Upgrade the blood dice for one spell you cast.', + ), + ], + color: class_colors[:astrologist], + #flavour: '"Missed me"', + type: 'Astrologist Ability', +) + +paladin_abilities[:change_of_fate] = Card.new( + title: "Change of Fate", + blood: 1, + actions: [ + Card::Action.new( + symbol: [:blood], + content: 'Swap 1 card with a willing player.', + ), + ], + color: class_colors[:astrologist], + #flavour: '"Missed me"', + type: 'Astrologist Ability', +) + +paladin_abilities[:palm_reading] = Card.new( + title: "Palm Reading", + blood: 1, + actions: [ + Card::Action.new( + symbol: [:blood], + content: 'Discard a willing players hand and replace it with new cards drawn.', + ), + ], + color: class_colors[:astrologist], + #flavour: '"Missed me"', + type: 'Astrologist Ability', +) + +Card.output('paladin_abilities', paladin_abilities); + diff --git a/cards/cards/rare_weapons.rb b/cards/cards/rare_weapons.rb new file mode 100644 index 0000000..e0ec2aa --- /dev/null +++ b/cards/cards/rare_weapons.rb @@ -0,0 +1,117 @@ +require_relative 'card.rb' + +rare_weapons = {} + +rare_weapons[:glaive] = Card.new( + title: "Glaive", + color: 'rebeccapurple', + reposte: 'Prc', + damage: '4', + actions: [ + Card::Action.new( + content: '🎲 **d6 · Str** to Slash.', + symbol: :tap, + ), + Card::Action.new( + content: '**Reach**, **Heavy**', + symbol: :invisible, + ), + ], + flavour: '"Getting up close and personal while staying far away"', + type: 'Polearm Weapon' +) + +rare_weapons[:twinblade] = Card.new( + title: "Twinblade", + damage: 3, + reposte: 'Prc', + actions: [ + Card::Action.new( + content: '🎲 **d4 + Prc** to Slash.', + symbol: :tap, + ), + Card::Action.new( + seperator: true, + content: '🎲 **d6 + Prc** to Slash.', + symbol: :tap, + ), + Card::Action.new( + content: '**Heavy**', + ) + #Card::Action.new( + # seperator: true, + # content: '(odd) **Swift Attack**: Refresh this card.', + # symbol: :spades + #), + ], + color: 'rebeccapurple', + flavour: '"Says \'Made by the Ninja Custodial Group\' on the handle"', + type: 'Staff Weapon', +) + +rare_weapons[:forked_sword] = Card.new( + title: "Forked Sword", + damage: 3, + reposte: 'Str', + #roll: '1d6', + actions: [ + Card::Action.new( + content: '🎲 **d6 + Str** to Pierce.', + symbol: :tap, + ), + Card::Action.new( + content: 'You can use the \'Cast a spell\' ability as a part of this action.', + symbol: :invisible, + ), + Card::Action.new( + seperator: true, + content: 'Cast a **Blood Magic Spell**', + symbol: :tap + ), + ], + color: 'rebeccapurple', + flavour: '"Weapon used in the war against the gods. Vintage!"', + type: 'Forked Sword Weapon', +) + +rare_weapons[:tower_shield] = Card.new( + title: "Tower Shield", + #damage: 4, + #reposte: 'Str', + actions: [ + Card::Action.new( + content: 'When **targeted with a weapon:** your attacker recieves **2 disadvantage** on their action.', + symbol: [:tap, :reactive], + ), + Card::Action.new( + content: '**Heavy**.', + symbol: :invisible, + ), + Card::Action.new( + seperator: true, + content: 'You can act as cover for another character.', + #symbol: :invisible + ), + Card::Action.new( + content: '**Heavy**.', + ), + ], + flavour: '"Looks great with a flannel shirt."', + color: 'rebeccapurple', + type: 'Shield Weapon', +) + +rare_weapons[:casters_glove] = Card.new( + title: "Caster's Glove", + roll: '1d8', + actions: [ + Card::Action.new( + content: '**Casting Focus**', + ), + ], + color: 'DarkBlue', + flavour: '"Modern casting tool that works by directly drawing your blood"', + type: 'Magic Casting Tool', +) + +Card.output('rare_weapons', rare_weapons); diff --git a/cards/cards/spells.rb b/cards/cards/spells.rb new file mode 100644 index 0000000..65cbb42 --- /dev/null +++ b/cards/cards/spells.rb @@ -0,0 +1,266 @@ +require_relative 'card.rb' + +beginner_spells = {} + +spell_color = 'firebrick' +modifier_color = "#b24747" + +=begin + +beginner_spells[:wispy_flame] = Card.new( + title: "Wispy Flame", + damage: 'd4', + blood: 1, + #reposte: 'Prc', + actions: [ + Card::Action.new( + content: 'Engulf your hand in flames for one turn. You need to maintain concentration each turn.', + symbol: [:joker, :blood] + ), + Card::Action.new( + seperator: true, + content: '(**while concentrating**) Deal melee damage to a target with your flame engulfed hand. If the target is a small object set it on fire.', + symbol: [:tap] + ), + ], + color: spell_color, + flavour: '"Portable Candle"', + type: 'Blood Magic(Igneous)' +) + +beginner_spells[:concentrated_cast] = Card.new( + title: "Concentrated Cast", + actions: [ + Card::Action.new( + content: 'Change the number of turns you need to check for concentration equal to the **card played** times your **Resolve**.', + symbol: [:even] + ), + ], + color: modifier_color, + #flavour: '"Portable Candle"', + type: 'Blood Magic(Modifier)' +) + +beginner_spells[:powerful_cast] = Card.new( + title: "Powerful Cast", + actions: [ + Card::Action.new( + content: 'Double the amount of dice rolled for this spell.', + symbol: [:face] + ), + ], + color: modifier_color, + #flavour: '"Portable Candle"', + type: 'Blood Magic(Modifier)' +) + + +beginner_spells[:summon_flesh] = Card.new( + title: "Summon Flesh", + #damage: 3, + blood: 1, + #reposte: 'Prc', + actions: [ + Card::Action.new( + content: '(**5 or less**) Heal a target within arms reach equal to the card played.', + symbol: [:hearts, :blood] + ), + Card::Action.new( + content: 'If this spell heals for more then half of the target\'s max health then they get flesh mass disease.', + seperator: true, + ), + ], + color: spell_color, + flavour: '"Writhing flesh mass that assimilates"', + type: 'Blood Magic (Eldritch)' +) + +beginner_spells[:lighting_fork] = Card.new( + title: "Lightning Fork", + damage: '2d4', + blood: 1, + #reposte: 'Prc', + actions: [ + Card::Action.new( + content: '(**even**) Deal 1d4 damage to one target and 1d4 to another. Both targets need to be within 10 meters if you', + symbol: [:clubs, :blood] + ), + ], + color: 'firebrick', + flavour: '"Double the static, double the fun!"', + type: 'Blood Magic (Storm)' +) + +beginner_spells[:summon_alchemicals] = Card.new( + title: "Summon Alchemicals", + #damage: 3, + blood: 2, + #reposte: 'Prc', + actions: [ + Card::Action.new( + content: 'Summon a random amount of a random alchemical depending on various hidden factors.', + symbol: [:joker, :blood] + ), + ], + color: 'firebrick', + flavour: '"You arent making a bomb, are you?"', + type: 'Blood Magic (Eldritch)' +) + +beginner_spells[:northern_wind] = Card.new( #TODO + title: "Northern Wind", + damage: '2d4', + blood: 1, + #reposte: 'Prc', + actions: [ + Card::Action.new( + content: '(**odd**) Shoot a cold wind from your hands, freezing things in its path.', + symbol: [:clubs, :blood] + ), + ], + color: 'firebrick', + flavour: '"Won\'t fail blowing out birthday candles"', + type: 'Blood Magic (Storm)' +) +=end +beginner_spells[:planes_of_igneous] = Card.new( #TODO + title: "Planes of Igneous", + blood: 1, + #reposte: 'Prc', + actions: [ + Card::Action.new( + content: 'Attune to the planes of igneous.', + symbol: [:blood] + ), + ], + color: 'firebrick', + flavour: '"Sea of flames and ashes."', + type: 'Blood Spell Base' +) +# Ruby + +beginner_spells[:planes_of_storm] = Card.new( #TODO + title: "Planes of Storm", + blood: 1, + #reposte: 'Prc', + actions: [ + Card::Action.new( + content: 'Attune to the planes of storm.', + symbol: [:blood] + ), + ], + color: 'firebrick', + flavour: '"Ice cold winds and storms."', + type: 'Blood Spell Base' +) +# Sapphire + +beginner_spells[:planes_of_eldritch] = Card.new( #TODO + title: "Planes of Eldritch", + blood: 1, + #reposte: 'Prc', + actions: [ + Card::Action.new( + content: 'Attune to the planes of eldritch.', + symbol: [:blood] + ), + ], + color: 'firebrick', + flavour: '"Alchemicals and fleshy masses."', + type: 'Blood Spell Base' +) +# Ammolite + +beginner_spells[:planes_of_void] = Card.new( #TODO + title: "Planes of Void", + blood: 1, + #reposte: 'Prc', + actions: [ + Card::Action.new( + content: 'Attune to the planes of void.', + symbol: [:blood] + ), + ], + color: 'firebrick', + flavour: '"Control Gravity"', + type: 'Blood Spell Base' +) +# Quartz + +beginner_spells[:planes_of_soul] = Card.new( #TODO + title: "Planes of Soul", + blood: 1, + #reposte: 'Prc', + actions: [ + Card::Action.new( + content: 'Attune to the planes of soul.', + symbol: [:blood] + ), + ], + color: 'firebrick', + flavour: '"Dreams and Memories?"', + type: 'Blood Spell Base' +) +# Ilvaite + +beginner_spells[:touch] = Card.new( #TODO + title: "Touch of Magic", + blood: 1, + #reposte: 'Prc', + actions: [ + Card::Action.new( + content: 'Summon magic around your hand.', + symbol: [:blood, :odd] + ), + ], + color: 'firebrick', + #flavour: '"Alchemicals and fleshy masses."', + type: 'Blood Spell Modified' +) + +beginner_spells[:engulf] = Card.new( #TODO + title: "Elemental Engulf", + blood: 2, + #reposte: 'Prc', + actions: [ + Card::Action.new( + content: 'Summon magic around your self.', + symbol: [:blood, :greater] + ), + ], + color: 'firebrick', + #flavour: '"Alchemicals and fleshy masses."', + type: 'Blood Spell Modified' +) + +beginner_spells[:distance] = Card.new( #TODO + title: "Distance Casting", + blood: 2, + #reposte: 'Prc', + actions: [ + Card::Action.new( + content: 'Summon magic at a distance.', + symbol: [:blood, :face] + ), + ], + color: 'firebrick', + #flavour: '"Alchemicals and fleshy masses."', + type: 'Blood Spell Modified' +) + +beginner_spells[:endure] = Card.new( #TODO + title: "Enduring Arcana", + blood: 0, + #reposte: 'Prc', + actions: [ + Card::Action.new( + content: 'Keep casting for a duration. Whenever distractions occurs to you while casting, such as an attack or a suprise, do a blood check with difficulty equal to the sum of the blood value of spell components used.', + symbol: [:blood, :even] + ), + ], + color: 'firebrick', + #flavour: '"Alchemicals and fleshy masses."', + type: 'Blood Spell Modified' +) + +Card.output('beginner_spells', beginner_spells); diff --git a/cards/class_abilities.rb b/cards/class_abilities.rb deleted file mode 100644 index 117005b..0000000 --- a/cards/class_abilities.rb +++ /dev/null @@ -1,181 +0,0 @@ -load 'card.rb' - -class_abilities = {} - -class_colors = { - rogue: 'Maroon', - ranger: 'ForestGreen', - astrologist: 'DodgerBlue', - monk: 'OrangeRed' -} - -class_abilities[:quick_attack] = Card.new( - title: "Quick Attack", - actions: [ - Card::Action.new( - symbol: :spades, - content: '(odd) **Refresh** a **light** weapon.', - ), - ], - color: class_colors[:rogue], - flavour: '"Stabby stabby stab"', - type: 'Rogue Ability', -) -class_abilities[:duck_and_weave] = Card.new( - title: "Duck and Weave", - actions: [ - Card::Action.new( - symbol: [:tap, :diamonds], - content: ' Ignore up to the card played worth of damage from a **reposte**.', - ), - ], - color: class_colors[:rogue], - flavour: '"Missed me"', - type: 'Rogue Ability', -) - -class_abilities[:surgical_strike] = Card.new( - title: "Surgical Strike", - actions: [ - Card::Action.new( - symbol: [:tap, :spades], - content: '(less then 5) Replace a weapon\'s damage with the value of the card played. Only affects the current attack.', - ), - ], - color: class_colors[:rogue], - #flavour: '"Missed me"', - type: 'Rogue Ability', -) - -class_abilities[:down_they_alleys] = Card.new( - title: "Down the Alleys", - actions: [ - Card::Action.new( - symbol: [:diamonds], - content: '(odd) When travelling inside a settlement, after an encounter has been revealed: you may choose to either discard the encounter and draw another one or skip the encounter.', - ), - ], - color: class_colors[:rogue], - #flavour: '"Missed me"', - type: 'Rogue Ability', -) - -class_abilities[:spot] = Card.new( - title: "Spot", - actions: [ - Card::Action.new( - symbol: [:hearts], - content: '(face) Mark a target. Choose up to one dice to reroll on each attack agaisnt this target. You can only have one target marked at a time. Lasts until 3 rerolls or the end of combat.', - ), - ], - color: class_colors[:ranger], - #flavour: '"Missed me"', - type: 'Ranger Ability', -) -class_abilities[:flexible_shooter] = Card.new( - title: "Flexible Shooter", - actions: [ - Card::Action.new( - #symbol: [:hearts], - content: 'You can deal reposte damage with any ranged weapon.', - ), - ], - color: class_colors[:ranger], - #flavour: '"Missed me"', - type: 'Ranger Ability', -) - -class_abilities[:scouting_ahead] = Card.new( - title: "Scouting Ahead", - actions: [ - Card::Action.new( - symbol: [:diamonds], - content: '(even) When travelling outside of a settlement, before the next encounter: reveal 2 encounters and pick 1. Discard the other.', - ), - ], - color: class_colors[:ranger], - #flavour: '"Missed me"', - type: 'Ranger Ability', -) - -class_abilities[:healing_salve_recipe] = Card.new( - title: "Healing Salve Recipe", - actions: [ - Card::Action.new( - symbol: [:diamonds, :hearts], - content: '(each suit) Healberry Herb, Cloth.', - ), - ], - color: class_colors[:ranger], - flavour: '"*Don\'t* eat the berries"', - type: 'Ranger Recipe', -) - -class_abilities[:recast] = Card.new( - title: "Recast", - actions: [ - Card::Action.new( - symbol: [:tap, :hearts], - content: '(less then or equal to your max blood roll) Replace the blood roll with the value of the card played and reroll any other associated dice with a spell you cast.', - ), - ], - color: class_colors[:astrologist], - #flavour: '"Missed me"', - type: 'Astrologist Ability', -) -class_abilities[:focused_cast] = Card.new( - title: "Focused Cast", - actions: [ - Card::Action.new( - symbol: [:tap], - content: 'Upgrade the blood dice for one spell you cast.', - ), - ], - color: class_colors[:astrologist], - #flavour: '"Missed me"', - type: 'Astrologist Ability', -) - -class_abilities[:focused_cast] = Card.new( - title: "Focused Cast", - actions: [ - Card::Action.new( - symbol: [:tap], - content: 'Upgrade the blood dice for one spell you cast.', - ), - ], - color: class_colors[:astrologist], - #flavour: '"Missed me"', - type: 'Astrologist Ability', -) - -class_abilities[:change_of_fate] = Card.new( - title: "Change of Fate", - blood: 1, - actions: [ - Card::Action.new( - symbol: [:blood], - content: 'Swap 1 card with a willing player.', - ), - ], - color: class_colors[:astrologist], - #flavour: '"Missed me"', - type: 'Astrologist Ability', -) - -class_abilities[:palm_reading] = Card.new( - title: "Palm Reading", - blood: 1, - actions: [ - Card::Action.new( - symbol: [:blood], - content: 'Discard a willing players hand and replace it with new cards drawn.', - ), - ], - color: class_colors[:astrologist], - #flavour: '"Missed me"', - type: 'Astrologist Ability', -) - -File.write('class_abilities.html', Card.build(class_abilities.values)) - diff --git a/cards/common_weapons.rb b/cards/common_weapons.rb deleted file mode 100644 index 55931af..0000000 --- a/cards/common_weapons.rb +++ /dev/null @@ -1,350 +0,0 @@ -load 'card.rb' - -common_weapons = {} - -common_weapons[:thrusting_sword] = Card.new( - title: "Thrusting Sword", - color: 'rebeccapurple', - reposte: 'Prc', - damage: '3', - actions: [ - Card::Action.new( - content: '🎲 **d8 + Prc** to hit.', - symbol: :tap, - ), - #Card::Action.new( - # seperator: true, - # content: '**Opportune Strike**: When targeting an enemy with this weapon, mark them until the end of their turn. While marked if they attack somone other then you then you can perform a reposte on them.', - #) - ], - flavour: '"World Famous Iron Toothpick"', - type: 'Thrusting Sword Weapon' -) - - -common_weapons[:polearm] = Card.new( - title: "Polearm", - color: 'rebeccapurple', - reposte: 'Prc', - damage: '4', - actions: [ - Card::Action.new( - content: '🎲 **d6 + Str** to hit.', - symbol: :tap, - ), - Card::Action.new( - seperator: true, - content: '**Reach**', - ), - #Card::Action.new( - # seperator: true, - # content: '**Reach**: When making an attack, you ignore repostes from your target unless they also have Reach.', - # # TODO: this is the same as the bow making it superiour - # #symbol: :spades, - #), - ], - flavour: '"Getting up close and personal while staying far away"', - type: 'Polearm Weapon' -) - -common_weapons[:spear] = Card.new( - title: "Spear", - color: 'rebeccapurple', - reposte: 'Prc', - damage: '3', - actions: [ - Card::Action.new( - content: '🎲 **d6 + Prc** to hit.', - symbol: :tap, - ), - Card::Action.new( - seperator: true, - content: '**Reach**, **Throwable**', - ), - #Card::Action.new( - # seperator: true, - # content: '**Reach**: When making an attack, you ignore repostes from your target unless they also have Reach.', - # # TODO: this is the same as the bow making it superiour - # #symbol: :spades, - #), - ], - flavour: '"5x more throwable then previous editions"', - type: 'Polearm Weapon' -) - -common_weapons[:dagger] = Card.new( - title: "Dagger", - color: 'rebeccapurple', - reposte: 'Prc', - damage: '2', - actions: [ - Card::Action.new( - content: '🎲 **d4 + Prc** to hit.', - symbol: :tap, - ), - Card::Action.new( - seperator: true, - content: '**Light**, **Throwable**', - #symbol: :spades - ), - #Card::Action.new( - # seperator: true, - # content: '(even) **Swift Attack**: Refresh this card.', - # symbol: :spades - #), - ], - flavour: '"A quick and convinient way to turn a spleen into a sheath"', - type: 'Dagger Weapon' -) - -common_weapons[:longbow] = Card.new( - title: "Longbow", - color: 'rebeccapurple', - damage: '3', - #reposte: 1, - actions: [ - Card::Action.new( - content: '🎲 **d4 + (2·Prc)** to hit.', - symbol: :tap, - ), - Card::Action.new( - seperator: true, - content: '**Ranged**', - ) - #Card::Action.new( - # seperator: true, - # content: '**Ranged**: When making an attack, you ignore repostes from your target. You can\'t deal a reposte either.', - #) - ], - flavour: '"One stringed instrument that got repurposed as a weapon."', - type: 'Bow Weapon' -) - -common_weapons[:crossbow] = Card.new( - title: "Crossbow", - color: 'rebeccapurple', - damage: '3', - #reposte: 1, - actions: [ - Card::Action.new( - content: '(must be loaded) 🎲 **d6 + Prc** to hit.', - symbol: :tap, - ), - Card::Action.new( - seperator: true, - content: '**Reload**: Load this weapon.', - symbol: :tap, - ), - Card::Action.new( - seperator: true, - content: '**Ranged**', - ) - ], - flavour: '"No one will cross you with this weapon"', - type: 'Crossbow Weapon' -) - -common_weapons[:hammer] = Card.new( - title: "Hammer", - reposte: 'Str', - damage: 3, - actions: [ - Card::Action.new( - content: '🎲 **d4 + (2·Str)** to hit.', - symbol: :tap, - ), - #Card::Action.new( - # seperator: true, - # content: '**Power Swing**: 🎲 **d4 + Str** to hit. Deal **Str + 2** damage.', - # symbol: :tap - #), - ], - flavour: '"If you can pick it up, then you are worthy enough to use it."', - color: 'rebeccapurple', - type: 'Hammer Weapon' -) - -common_weapons[:straight_sword] = Card.new( - title: "Straight Sword", - damage: 3, - reposte: 'Str', - actions: [ - Card::Action.new( - content: '🎲 **d8 + Str** to hit.', - symbol: :tap, - ), - #Card::Action.new( - # seperator: true, - # content: '(Two Handed) 🎲 **d6 + Str** to hit. Deal **Str** damage.', - # symbol: :tap, - #) - ], - flavour: '"El Classico"', - color: 'rebeccapurple', - type: 'Straight Sword Weapon' -) - -common_weapons[:axe] = Card.new( - title: "Axe", - damage: 4, - reposte: 'Str', - actions: [ - Card::Action.new( - content: '🎲 **d6 + Str** to hit.', - symbol: :tap, - ), - #Card::Action.new( - # seperator: true, - # content: '**Throw**: 🎲 **d6 + Str** to hit. This attack is **Ranged** and thus you ignore repostes from your target. You lose this weapon by using this attack.', - # symbol: :tap - #), - ], - flavour: '"Looks great with a flannel shirt."', - color: 'rebeccapurple', - type: 'Axe Weapon', -) - -common_weapons[:staff] = Card.new( - title: "Staff", - damage: 2, - reposte: 'Str', - actions: [ - Card::Action.new( - content: '🎲 **d6 + Str** to hit.', - symbol: :tap, - ), - Card::Action.new( - seperator: true, - content: '(Two Handed) 🎲 **d8 + Str** to hit.', - symbol: :tap, - ), - Card::Action.new( - seperator: true, - content: '**Light**', - ) - #Card::Action.new( - # seperator: true, - # content: '(odd) **Swift Attack**: Refresh this card.', - # symbol: :spades - #), - ], - color: 'rebeccapurple', - flavour: '"Says \'Made by the Ninja Custodial Group\' on the handle"', - type: 'Staff Weapon', -) - -common_weapons[:curved_sword] = Card.new( - title: "Curved Sword", - damage: 3, - reposte: 'Prc', - actions: [ - Card::Action.new( - content: '🎲 **d8 + Str** to hit.', - symbol: :tap, - ), - #Card::Action.new( - # seperator: true, - # content: '(odd, recieving a reposte) **Close Quarters**: Deal damage equal to your reposte.', - # symbol: :spades - #), - ], - color: 'rebeccapurple', - flavour: '"Arrrgh"', - type: 'Curved Sword Weapon', -) - -common_weapons[:forked_sword] = Card.new( - title: "Forked Sword", - damage: 3, - reposte: 'Str', - roll: '1d6', - actions: [ - Card::Action.new( - content: '🎲 **d6 + Str** to hit.', - symbol: :tap, - ), - Card::Action.new( - seperator: true, - content: '**Casting Focus**', - ), - ], - color: 'rebeccapurple', - flavour: '"Weapon used in the war against the gods. Vintage!"', - type: 'Forked Sword Weapon', -) - -common_weapons[:caestus] = Card.new( - title: "Caestus", - color: 'DarkBlue', - actions: [ - Card::Action.new( - content: 'While equipped: Unarmed Strikes deal **Str** additional damage.', - ) - ], - flavour: '"Weapon of choice for a fit bronze statue"', - type: 'Weapon Equipment' -) - -common_weapons[:tuning_fork] = Card.new( - title: "Tuning Fork", - roll: '1d4', - actions: [ - Card::Action.new( - content: '**Casting Focus**', - ), - ], - color: 'DarkBlue', - flavour: '"Resonates with various magical frequencies to help with casting blood magic"', - type: 'Magic Casting Tool', -) - -common_weapons[:casters_glove] = Card.new( - title: "Caster's Glove", - roll: '1d8', - actions: [ - Card::Action.new( - content: '**Casting Focus**', - ), - ], - color: 'DarkBlue', - flavour: '"Modern casting tool that works by directly drawing your blood"', - type: 'Magic Casting Tool', -) - - -common_weapons[:test_weapon] = Card.new( - title: "Test Weapon", - damage: 3, - reposte: 'Prc', - actions: [ - Card::Action.new( - content: '🎲 **d6 + Prc** to hit.', - symbol: :spades, - ), - Card::Action.new( - seperator: true, - content: '🎲 **d6 + Prc** to hit.', - symbol: :clubs, - ), - Card::Action.new( - seperator: true, - content: '🎲 **d6 + Prc** to hit.', - symbol: :diamonds, - ), - Card::Action.new( - seperator: true, - content: '🎲 **d6 + Prc** to hit.', - symbol: :joker, - ), - Card::Action.new( - seperator: true, - content: '🎲 **d6 + Prc** to hit.', - symbol: [:tap, :hearts] - ), - ], - color: 'rebeccapurple', - flavour: '"Arrr"', - type: 'Curved Sword Weapon', -) - -File.write('common_weapons.html', Card.build(common_weapons.values)) diff --git a/cards/inspiration_cardback.jpg b/cards/inspiration_cardback.jpg deleted file mode 100644 index 2b82919..0000000 Binary files a/cards/inspiration_cardback.jpg and /dev/null differ diff --git a/cards/output/alchemical_recipes.html b/cards/output/alchemical_recipes.html new file mode 100644 index 0000000..7218bd8 --- /dev/null +++ b/cards/output/alchemical_recipes.html @@ -0,0 +1,300 @@ + + + + + + +
+
+
+
+

+ Crystal Encasement Recipe +

+
+
+
+
+
+ + 🩸 + + + ♦️ + +
+
+

A potion which when applied to a surface quickly grows strong blue crystals. Can also be thrown.

+
+
+
+
+
+
+

“You arent making a bomb, are you?”

+
+
+
+
+ Blood Magic (Eldritch) +
+
+
+
+ + + diff --git a/cards/output/armour.html b/cards/output/armour.html new file mode 100644 index 0000000..feb99a8 --- /dev/null +++ b/cards/output/armour.html @@ -0,0 +1,380 @@ + + + + + + +
+
+
+
+

+ Iron Plate +

+
+ 5 🛡️ +
+
+
+
+
+
+

“Strong but heavy”

+
+
+
+
+ Body Armour +
+
+
+
+
+
+

+ Chain Mail +

+
+ 4 🛡️ +
+
+
+
+
+
+

“The fairly lightweight option”

+
+
+
+
+ Body Armour +
+
+
+
+
+
+

+ Leather +

+
+ 3 🛡️ +
+
+
+
+
+
+

“Popular with goths and punks”

+
+
+
+
+ Body Armour +
+
+
+
+
+
+

+ Padded +

+
+ 2 🛡️ +
+
+
+
+
+
+

“A LOT of regular clothing stacked together”

+
+
+
+
+ Body Armour +
+
+
+
+
+
+

+ None +

+
+ 1 🛡️ +
+
+
+
+
+
+

“Just the skin on your back”

+
+
+
+
+ Body Armour +
+
+
+
+ + + diff --git a/cards/output/beginner_spells.html b/cards/output/beginner_spells.html new file mode 100644 index 0000000..7d35cb8 --- /dev/null +++ b/cards/output/beginner_spells.html @@ -0,0 +1,568 @@ + + + + + + +
+
+
+
+
+ 1 🩸 +
+

+ Planes of Igneous +

+
+
+
+
+
+ + 🩸 + +
+
+

Attune to the planes of igneous.

+
+
+
+
+
+
+

“Sea of flames and ashes.”

+
+
+
+
+ Blood Spell Base +
+
+
+
+
+
+
+ 1 🩸 +
+

+ Planes of Storm +

+
+
+
+
+
+ + 🩸 + +
+
+

Attune to the planes of storm.

+
+
+
+
+
+
+

“Ice cold winds and storms.”

+
+
+
+
+ Blood Spell Base +
+
+
+
+
+
+
+ 1 🩸 +
+

+ Planes of Eldritch +

+
+
+
+
+
+ + 🩸 + +
+
+

Attune to the planes of eldritch.

+
+
+
+
+
+
+

“Alchemicals and fleshy masses.”

+
+
+
+
+ Blood Spell Base +
+
+
+
+
+
+
+ 1 🩸 +
+

+ Planes of Void +

+
+
+
+
+
+ + 🩸 + +
+
+

Attune to the planes of void.

+
+
+
+
+
+
+

“Control Gravity”

+
+
+
+
+ Blood Spell Base +
+
+
+
+
+
+
+ 1 🩸 +
+

+ Planes of Soul +

+
+
+
+
+
+ + 🩸 + +
+
+

Attune to the planes of soul.

+
+
+
+
+
+
+

“Dreams and Memories?”

+
+
+
+
+ Blood Spell Base +
+
+
+
+
+
+
+ 1 🩸 +
+

+ Touch of Magic +

+
+
+
+
+
+ + 🩸 + + + 🔻 + +
+
+

Summon magic around your hand.

+
+
+
+
+
+ Blood Spell Modified +
+
+
+
+
+
+
+ 2 🩸 +
+

+ Elemental Engulf +

+
+
+
+
+
+ + 🩸 + + + ➕ + +
+
+

Summon magic around your self.

+
+
+
+
+
+ Blood Spell Modified +
+
+
+
+
+
+
+ 2 🩸 +
+

+ Distance Casting +

+
+
+
+
+
+ + 🩸 + + + 🎭 + +
+
+

Summon magic at a distance.

+
+
+
+
+
+ Blood Spell Modified +
+
+
+
+
+
+
+ 0 🩸 +
+

+ Enduring Arcana +

+
+
+
+
+
+ + 🩸 + + + ⬜ + +
+
+

Keep casting for a duration. Whenever distractions occurs to you while casting, such as an attack or a suprise, do a blood check with difficulty equal to the sum of the blood value of spell components used.

+
+
+
+
+
+ Blood Spell Modified +
+
+
+
+ + + diff --git a/cards/output/class_abilities.html b/cards/output/class_abilities.html new file mode 100644 index 0000000..77f111a --- /dev/null +++ b/cards/output/class_abilities.html @@ -0,0 +1,595 @@ + + + + + + +
+
+
+
+

+ Duel +

+
+
+
+

Pick a target. You and that target a duel where you and the target may not attack anyone other then eachother. You cannot use this while in a duel.

+
+
+
+
+

“Stabby stabby stab”

+
+
+
+
+ Rogue Ability +
+
+
+
+
+
+

+ Duck and Weave +

+
+
+
+
+
+ + ↪️ + + + ♦️ + +
+
+

Ignore up to the card played worth of damage from a reposte.

+
+
+
+
+
+
+

“Missed me”

+
+
+
+
+ Rogue Ability +
+
+
+
+
+
+

+ Surgical Strike +

+
+
+
+
+
+ + ↪️ + + + ♠️ + +
+
+

(less then 5) Replace a weapon’s damage with the value of the card played. Only affects the current attack.

+
+
+
+
+
+ Rogue Ability +
+
+
+
+
+
+

+ Down the Alleys +

+
+
+
+
+
+ + ♦️ + +
+
+

(odd) When travelling inside a settlement, after an encounter has been revealed: you may choose to either discard the encounter and draw another one or skip the encounter.

+
+
+
+
+
+ Rogue Ability +
+
+
+
+
+
+

+ Spot +

+
+
+
+
+
+ + ♥️ + +
+
+

(face) Mark a target. Choose up to one dice to reroll on each attack agaisnt this target. You can only have one target marked at a time. Lasts until 3 rerolls or the end of combat.

+
+
+
+
+
+ Ranger Ability +
+
+
+
+
+
+

+ Flexible Shooter +

+
+
+
+

You can deal reposte damage with any ranged weapon.

+
+
+
+ Ranger Ability +
+
+
+
+
+
+

+ Scouting Ahead +

+
+
+
+
+
+ + ♦️ + +
+
+

(even) When travelling outside of a settlement, before the next encounter: reveal 2 encounters and pick 1. Discard the other.

+
+
+
+
+
+ Ranger Ability +
+
+
+
+
+
+

+ Healing Salve Recipe +

+
+
+
+
+
+ + ♦️ + + + ♥️ + +
+
+

(each suit) Healberry Herb, Cloth.

+
+
+
+
+
+
+

Don’t eat the berries”

+
+
+
+
+ Ranger Recipe +
+
+
+
+
+
+

+ Recast +

+
+
+
+
+
+ + ↪️ + + + ♥️ + +
+
+

(less then or equal to your max blood roll) Replace the blood roll with the value of the card played and reroll any other associated dice with a spell you cast.

+
+
+
+
+
+ Astrologist Ability +
+
+
+
+
+
+

+ Focused Cast +

+
+
+
+
+
+ + ↪️ + +
+
+

Upgrade the blood dice for one spell you cast.

+
+
+
+
+
+ Astrologist Ability +
+
+
+
+
+
+
+ 1 🩸 +
+

+ Change of Fate +

+
+
+
+
+
+ + 🩸 + +
+
+

Swap 1 card with a willing player.

+
+
+
+
+
+ Astrologist Ability +
+
+
+
+
+
+
+ 1 🩸 +
+

+ Palm Reading +

+
+
+
+
+
+ + 🩸 + +
+
+

Discard a willing players hand and replace it with new cards drawn.

+
+
+
+
+
+ Astrologist Ability +
+
+
+
+ + + diff --git a/cards/output/common_items.html b/cards/output/common_items.html new file mode 100644 index 0000000..fc8b188 --- /dev/null +++ b/cards/output/common_items.html @@ -0,0 +1,556 @@ + + + + + + +
+
+
+
+

+ Test +

+
+ ⚔️ 3 +
+
+ Prc 🛡️ +
+
+
+
+
+
+ + ↪️ + + + 🩸 + + + 📣 + + + 🔻 + + + ⬜ + + + 🎭 + + + ➕ + + + ➖ + +
+
+

🎲 d8 · Prc to Bludgeon.

+
+
+
+
+
+
+ + ♠️ + +
+
+

🎲 d6 + Prc to hit.

+
+
+
+
+
+
+
+ + ♣️ + +
+
+

🎲 d6 + Prc to hit.

+
+
+
+
+
+
+
+ + ♦️ + +
+
+

🎲 d6 + Prc to hit.

+
+
+
+
+
+
+
+ + 🃏 + +
+
+

🎲 d6 + Prc to hit.

+
+
+
+
+
+
+
+ + ↪️ + + + ♥️ + +
+
+

🎲 d6 + Prc to hit.

+
+
+
+
+
+
+

“World Famous Iron Toothpick”

+
+
+
+
+ Thrusting Sword Weapon +
+
+
+
+
+
+

+ Sack +

+
+
+
+

Item slot: 12 spaces.

+
+
+
+
+
+ + ↪️ + +
+
+

Draw up to 2 cards from this inventory and place up to 2 items to the front or back of this inventory.

+
+
+
+
+
+

Equips on your back.

+
+
+
+ Leather Item Container +
+
+
+
+
+
+

+ Satchel +

+
+
+
+

Item slot: 6 spaces.

+
+
+
+
+
+ + ↪️ + +
+
+

Draw up to 3 cards from this inventory and place up to 3 items to the front or back of this inventory.

+
+
+
+
+
+

Equips on your back.

+
+
+
+ Leather Item Container +
+
+
+
+
+
+

+ Rucksack +

+
+
+
+

Item slot: 12 spaces.

+
+
+

Item slot: 6 spaces.

+
+
+
+
+
+ + ↪️ + +
+
+

Draw up to 2 cards from this inventory and place up to 2 items to the front or back of this inventory.

+
+
+
+
+
+

Equips on your back.

+
+
+
+ Leather Item Container +
+
+
+
+
+
+

+ Sheath +

+
+
+
+

Item slot: 1 weapon.

+
+
+
+
+
+ + ↪️ + +
+
+

Draw up to 1 cards from this inventory and place up to 1 weapon to this inventory.

+
+
+
+
+
+

Equips on your back or hip.

+
+
+
+ Leather Item Container +
+
+
+
+
+
+

+ Hand Bomb +

+
+
+
+
+
+ + ↪️ + +
+
+

Deal 3 damage. Consumes this item.

+
+
+
+
+
+ Consumable Weapon +
+
+
+
+ + + diff --git a/cards/output/common_weapons.html b/cards/output/common_weapons.html new file mode 100644 index 0000000..fe55b0c --- /dev/null +++ b/cards/output/common_weapons.html @@ -0,0 +1,1047 @@ + + + + + + +
+
+
+
+

+ Test +

+
+ ⚔️ 3 +
+
+ Prc 🛡️ +
+
+
+
+
+
+ + ↪️ + + + 🩸 + + + 📣 + + + 🔻 + + + ⬜ + + + 🎭 + + + ➕ + + + ➖ + +
+
+

🎲 d8 · Prc to Bludgeon.

+
+
+
+
+
+
+ + ♠️ + +
+
+

🎲 d6 + Prc to hit.

+
+
+
+
+
+
+
+ + ♣️ + +
+
+

🎲 d6 + Prc to hit.

+
+
+
+
+
+
+
+ + ♦️ + +
+
+

🎲 d6 + Prc to hit.

+
+
+
+
+
+
+
+ + 🃏 + +
+
+

🎲 d6 + Prc to hit.

+
+
+
+
+
+
+
+ + ↪️ + + + ♥️ + +
+
+

🎲 d6 + Prc to hit.

+
+
+
+
+
+
+

“World Famous Iron Toothpick”

+
+
+
+
+ Thrusting Sword Weapon +
+
+
+
+
+
+

+ Spear +

+
+ ⚔️ 3 +
+
+ Prc 🛡️ +
+
+
+
+
+
+ + ↪️ + +
+
+

🎲 d6 · Prc to Pierce.

+
+
+
+
+
+
+ +
+
+

Reach, Throwable

+
+
+
+
+
+
+

“5x more throwable then previous editions”

+
+
+
+
+ Polearm Weapon +
+
+
+
+
+
+

+ Dagger +

+
+ ⚔️ 2 +
+
+ Prc 🛡️ +
+
+
+
+
+
+ + ↪️ + +
+
+

🎲 d4 · Prc to Pierce.

+
+
+
+
+
+
+ +
+
+

Light, Throwable

+
+
+
+
+
+
+

“A quick and convinient way to turn a spleen into a sheath”

+
+
+
+
+ Dagger Weapon +
+
+
+
+
+
+

+ Longbow +

+
+ ⚔️ 3 +
+
+
+
+
+
+ + ↪️ + +
+
+

🎲 d6 · Prc to Pierce.

+
+
+
+
+
+
+ +
+
+

Ranged

+
+
+
+
+
+
+

“One stringed instrument that got repurposed as a weapon.”

+
+
+
+
+ Bow Weapon +
+
+
+
+
+
+

+ Crossbow +

+
+ ⚔️ 3 +
+
+
+
+
+
+ + ↪️ + +
+
+

Remove a counter.

+
+
+
+
+
+
+ +
+
+

🎲 d8 · Prc to Pierce.

+
+
+
+
+
+
+ +
+
+

Ranged

+
+
+
+
+
+
+
+ + ↪️ + +
+
+

Reload: Load this weapon. Add a counter to this card.

+
+
+
+
+
+
+

“No one will cross you with this weapon”

+
+
+
+
+ Crossbow Weapon +
+
+
+
+
+
+

+ Warhammer +

+
+ ⚔️ 3 +
+
+ Str 🛡️ +
+
+
+
+
+
+ + ↪️ + +
+
+

🎲 d8 · (Str) to Bludgeon.

+
+
+
+
+
+
+

“Made of over 39,000 minature hammers”

+
+
+
+
+ Hammer Weapon +
+
+
+
+
+
+

+ Sickle +

+
+ ⚔️ 1 +
+
+ Prc 🛡️ +
+
+
+
+
+
+ + ↪️ + +
+
+

🎲 d4 · (Prc) to Bludgeon.

+
+
+
+
+
+
+ +
+
+

Light, Cleave

+
+
+
+
+
+
+

“Made of over 39,000 minature hammers”

+
+
+
+
+ Farming Weapon +
+
+
+
+
+
+

+ Scythe +

+
+ ⚔️ 2 +
+
+ Prc 🛡️ +
+
+
+
+
+
+ + ↪️ + +
+
+

🎲 d6 · (Prc) to Bludgeon.

+
+
+
+
+
+
+ +
+
+

Heavy, Cleave

+
+
+
+
+
+
+

“Made of over 39,000 minature hammers”

+
+
+
+
+ Farming Weapon +
+
+
+
+
+
+

+ Short Sword +

+
+ ⚔️ 3 +
+
+ Str 🛡️ +
+
+
+
+
+
+ + ↪️ + +
+
+

🎲 d6 · Str to hit.

+
+
+
+
+
+
+ +
+
+

Light

+
+
+
+
+
+
+

“El Classico”

+
+
+
+
+ Straight Sword Weapon +
+
+
+
+
+
+

+ Long Sword +

+
+ ⚔️ 3 +
+
+ Str 🛡️ +
+
+
+
+
+
+ + ↪️ + +
+
+

🎲 d8 · Str to hit.

+
+
+
+
+
+
+

“El Classico”

+
+
+
+
+ Straight Sword Weapon +
+
+
+
+
+
+

+ Axe +

+
+ ⚔️ 4 +
+
+ Str 🛡️ +
+
+
+
+
+
+ + ↪️ + +
+
+

🎲 d6 · Str to Slash.

+
+
+
+
+
+
+

“Looks great with a flannel shirt.”

+
+
+
+
+ Axe Weapon +
+
+
+
+
+
+

+ Staff +

+
+ ⚔️ 2 +
+
+ Str 🛡️ +
+
+
+
+
+
+ + ↪️ + +
+
+

🎲 d6 + Str to Bludgeon.

+
+
+
+
+
+
+
+ + ↪️ + +
+
+

🎲 d8 + Str to Bludgeon.

+
+
+
+
+

Heavy

+
+
+
+
+

“Says ‘Made by the Ninja Custodial Group’ on the handle”

+
+
+
+
+ Staff Weapon +
+
+
+
+
+
+

+ Kite Shield +

+
+
+
+
+
+ + ↪️ + + + 📣 + +
+
+

When targeted with a weapon: your attacker recieves 2 disadvantage on their action.

+
+
+
+
+
+
+

“Looks great with a flannel shirt.”

+
+
+
+
+ Shield Weapon +
+
+
+
+
+
+

+ Buckler Shield +

+
+
+
+
+
+ + ↪️ + + + 📣 + +
+
+

When targeted with a weapon: your attacker recieves 1 disadvantage on their action. If your reposte triggers then deal double damage with it.

+
+
+
+
+
+
+

“Looks great with a flannel shirt.”

+
+
+
+
+ Shield Weapon +
+
+
+
+
+
+

+ Caestus +

+
+
+
+

While equipped: Unarmed Strikes deal Str additional damage.

+
+
+
+
+

“Weapon of choice for a fit bronze statue”

+
+
+
+
+ Weapon Equipment +
+
+
+
+
+
+
+ 🎲 1d4 +
+

+ Tuning Fork +

+
+
+
+

Casting Focus

+
+
+
+
+

“Resonates with various magical frequencies to help with casting blood magic”

+
+
+
+
+ Magic Casting Tool +
+
+
+
+ + + diff --git a/cards/output/paladin_abilities.html b/cards/output/paladin_abilities.html new file mode 100644 index 0000000..2506e5c --- /dev/null +++ b/cards/output/paladin_abilities.html @@ -0,0 +1,639 @@ + + + + + + +
+
+
+
+

+ Duel +

+
+
+
+
+
+ + ↪️ + + + ⬜ + +
+
+

Pick a target. You and that target enter a duel where you and the target may not attack anyone other then each other. You cannot use this while in a duel.

+
+
+
+
+
+
+

“A famous commander’s signature thing.”

+
+
+
+
+ Paladin Ability +
+
+
+
+
+
+

+ Leading Charge +

+
+
+
+
+
+ + ↪️ + + + 📣 + + + 🎭 + +
+
+

When making an attack, mark the target and choose an ally. During the ally’s next turn: they gain an advatage for all attacks they do agaisnt the marked target.

+
+
+
+
+
+ Paladin Ability +
+
+
+
+
+
+

+ Duck and Weave +

+
+
+
+
+
+ + ↪️ + + + ♦️ + +
+
+

Ignore up to the card played worth of damage from a reposte.

+
+
+
+
+
+
+

“Missed me”

+
+
+
+
+ Rogue Ability +
+
+
+
+
+
+

+ Surgical Strike +

+
+
+
+
+
+ + ↪️ + + + ♠️ + +
+
+

(less then 5) Replace a weapon’s damage with the value of the card played. Only affects the current attack.

+
+
+
+
+
+ Rogue Ability +
+
+
+
+
+
+

+ Down the Alleys +

+
+
+
+
+
+ + ♦️ + +
+
+

(odd) When travelling inside a settlement, after an encounter has been revealed: you may choose to either discard the encounter and draw another one or skip the encounter.

+
+
+
+
+
+ Rogue Ability +
+
+
+
+
+
+

+ Spot +

+
+
+
+
+
+ + ♥️ + +
+
+

(face) Mark a target. Choose up to one dice to reroll on each attack agaisnt this target. You can only have one target marked at a time. Lasts until 3 rerolls or the end of combat.

+
+
+
+
+
+ Ranger Ability +
+
+
+
+
+
+

+ Flexible Shooter +

+
+
+
+

You can deal reposte damage with any ranged weapon.

+
+
+
+ Ranger Ability +
+
+
+
+
+
+

+ Scouting Ahead +

+
+
+
+
+
+ + ♦️ + +
+
+

(even) When travelling outside of a settlement, before the next encounter: reveal 2 encounters and pick 1. Discard the other.

+
+
+
+
+
+ Ranger Ability +
+
+
+
+
+
+

+ Healing Salve Recipe +

+
+
+
+
+
+ + ♦️ + + + ♥️ + +
+
+

(each suit) Healberry Herb, Cloth.

+
+
+
+
+
+
+

Don’t eat the berries”

+
+
+
+
+ Ranger Recipe +
+
+
+
+
+
+

+ Recast +

+
+
+
+
+
+ + ↪️ + + + ♥️ + +
+
+

(less then or equal to your max blood roll) Replace the blood roll with the value of the card played and reroll any other associated dice with a spell you cast.

+
+
+
+
+
+ Astrologist Ability +
+
+
+
+
+
+

+ Focused Cast +

+
+
+
+
+
+ + ↪️ + +
+
+

Upgrade the blood dice for one spell you cast.

+
+
+
+
+
+ Astrologist Ability +
+
+
+
+
+
+
+ 1 🩸 +
+

+ Change of Fate +

+
+
+
+
+
+ + 🩸 + +
+
+

Swap 1 card with a willing player.

+
+
+
+
+
+ Astrologist Ability +
+
+
+
+
+
+
+ 1 🩸 +
+

+ Palm Reading +

+
+
+
+
+
+ + 🩸 + +
+
+

Discard a willing players hand and replace it with new cards drawn.

+
+
+
+
+
+ Astrologist Ability +
+
+
+
+ + + diff --git a/cards/output/rare_weapons.html b/cards/output/rare_weapons.html new file mode 100644 index 0000000..76db3a3 --- /dev/null +++ b/cards/output/rare_weapons.html @@ -0,0 +1,512 @@ + + + + + + +
+
+
+
+

+ Glaive +

+
+ ⚔️ 4 +
+
+ Prc 🛡️ +
+
+
+
+
+
+ + ↪️ + +
+
+

🎲 d6 · Str to Slash.

+
+
+
+
+
+
+ +
+
+

Reach, Heavy

+
+
+
+
+
+
+

“Getting up close and personal while staying far away”

+
+
+
+
+ Polearm Weapon +
+
+
+
+
+
+

+ Twinblade +

+
+ ⚔️ 3 +
+
+ Prc 🛡️ +
+
+
+
+
+
+ + ↪️ + +
+
+

🎲 d4 + Prc to Slash.

+
+
+
+
+
+
+
+ + ↪️ + +
+
+

🎲 d6 + Prc to Slash.

+
+
+
+
+

Heavy

+
+
+
+
+

“Says ‘Made by the Ninja Custodial Group’ on the handle”

+
+
+
+
+ Staff Weapon +
+
+
+
+
+
+

+ Forked Sword +

+
+ ⚔️ 3 +
+
+ Str 🛡️ +
+
+
+
+
+
+ + ↪️ + +
+
+

🎲 d6 + Str to Pierce.

+
+
+
+
+
+
+ +
+
+

You can use the ‘Cast a spell’ ability as a part of this action.

+
+
+
+
+
+
+
+ + ↪️ + +
+
+

Cast a Blood Magic Spell

+
+
+
+
+
+
+

“Weapon used in the war against the gods. Vintage!”

+
+
+
+
+ Forked Sword Weapon +
+
+
+
+
+
+

+ Tower Shield +

+
+
+
+
+
+ + ↪️ + + + 📣 + +
+
+

When targeted with a weapon: your attacker recieves 2 disadvantage on their action.

+
+
+
+
+
+
+ +
+
+

Heavy.

+
+
+
+
+
+

You can act as cover for another character.

+
+
+

Heavy.

+
+
+
+
+

“Looks great with a flannel shirt.”

+
+
+
+
+ Shield Weapon +
+
+
+
+
+
+
+ 🎲 1d8 +
+

+ Caster's Glove +

+
+
+
+

Casting Focus

+
+
+
+
+

“Modern casting tool that works by directly drawing your blood”

+
+
+
+
+ Magic Casting Tool +
+
+
+
+ + + diff --git a/cards/spells.rb b/cards/spells.rb deleted file mode 100644 index 39da46b..0000000 --- a/cards/spells.rb +++ /dev/null @@ -1,267 +0,0 @@ -load 'card.rb' - -beginner_spells = {} - -spell_color = 'firebrick' -modifier_color = "#b24747" - -=begin - -beginner_spells[:wispy_flame] = Card.new( - title: "Wispy Flame", - damage: 'd4', - blood: 1, - #reposte: 'Prc', - actions: [ - Card::Action.new( - content: 'Engulf your hand in flames for one turn. You need to maintain concentration each turn.', - symbol: [:joker, :blood] - ), - Card::Action.new( - seperator: true, - content: '(**while concentrating**) Deal melee damage to a target with your flame engulfed hand. If the target is a small object set it on fire.', - symbol: [:tap] - ), - ], - color: spell_color, - flavour: '"Portable Candle"', - type: 'Blood Magic(Igneous)' -) - -beginner_spells[:concentrated_cast] = Card.new( - title: "Concentrated Cast", - actions: [ - Card::Action.new( - content: 'Change the number of turns you need to check for concentration equal to the **card played** times your **Resolve**.', - symbol: [:even] - ), - ], - color: modifier_color, - #flavour: '"Portable Candle"', - type: 'Blood Magic(Modifier)' -) - -beginner_spells[:powerful_cast] = Card.new( - title: "Powerful Cast", - actions: [ - Card::Action.new( - content: 'Double the amount of dice rolled for this spell.', - symbol: [:face] - ), - ], - color: modifier_color, - #flavour: '"Portable Candle"', - type: 'Blood Magic(Modifier)' -) - - -beginner_spells[:summon_flesh] = Card.new( - title: "Summon Flesh", - #damage: 3, - blood: 1, - #reposte: 'Prc', - actions: [ - Card::Action.new( - content: '(**5 or less**) Heal a target within arms reach equal to the card played.', - symbol: [:hearts, :blood] - ), - Card::Action.new( - content: 'If this spell heals for more then half of the target\'s max health then they get flesh mass disease.', - seperator: true, - ), - ], - color: spell_color, - flavour: '"Writhing flesh mass that assimilates"', - type: 'Blood Magic (Eldritch)' -) - -beginner_spells[:lighting_fork] = Card.new( - title: "Lightning Fork", - damage: '2d4', - blood: 1, - #reposte: 'Prc', - actions: [ - Card::Action.new( - content: '(**even**) Deal 1d4 damage to one target and 1d4 to another. Both targets need to be within 10 meters if you', - symbol: [:clubs, :blood] - ), - ], - color: 'firebrick', - flavour: '"Double the static, double the fun!"', - type: 'Blood Magic (Storm)' -) - -beginner_spells[:summon_alchemicals] = Card.new( - title: "Summon Alchemicals", - #damage: 3, - blood: 2, - #reposte: 'Prc', - actions: [ - Card::Action.new( - content: 'Summon a random amount of a random alchemical depending on various hidden factors.', - symbol: [:joker, :blood] - ), - ], - color: 'firebrick', - flavour: '"You arent making a bomb, are you?"', - type: 'Blood Magic (Eldritch)' -) - -beginner_spells[:northern_wind] = Card.new( #TODO - title: "Northern Wind", - damage: '2d4', - blood: 1, - #reposte: 'Prc', - actions: [ - Card::Action.new( - content: '(**odd**) Shoot a cold wind from your hands, freezing things in its path.', - symbol: [:clubs, :blood] - ), - ], - color: 'firebrick', - flavour: '"Won\'t fail blowing out birthday candles"', - type: 'Blood Magic (Storm)' -) -=end -beginner_spells[:planes_of_igneous] = Card.new( #TODO - title: "Planes of Igneous", - blood: 1, - #reposte: 'Prc', - actions: [ - Card::Action.new( - content: 'Attune to the planes of igneous.', - symbol: [:blood] - ), - ], - color: 'firebrick', - flavour: '"Sea of flames and ashes."', - type: 'Blood Spell Base' -) -# Ruby - -beginner_spells[:planes_of_storm] = Card.new( #TODO - title: "Planes of Storm", - blood: 1, - #reposte: 'Prc', - actions: [ - Card::Action.new( - content: 'Attune to the planes of storm.', - symbol: [:blood] - ), - ], - color: 'firebrick', - flavour: '"Ice cold winds and storms."', - type: 'Blood Spell Base' -) -# Sapphire - -beginner_spells[:planes_of_eldritch] = Card.new( #TODO - title: "Planes of Eldritch", - blood: 1, - #reposte: 'Prc', - actions: [ - Card::Action.new( - content: 'Attune to the planes of eldritch.', - symbol: [:blood] - ), - ], - color: 'firebrick', - flavour: '"Alchemicals and fleshy masses."', - type: 'Blood Spell Base' -) -# Ammolite - -beginner_spells[:planes_of_void] = Card.new( #TODO - title: "Planes of Void", - blood: 1, - #reposte: 'Prc', - actions: [ - Card::Action.new( - content: 'Attune to the planes of void.', - symbol: [:blood] - ), - ], - color: 'firebrick', - flavour: '"Control Gravity"', - type: 'Blood Spell Base' -) -# Quartz - -beginner_spells[:planes_of_soul] = Card.new( #TODO - title: "Planes of Soul", - blood: 1, - #reposte: 'Prc', - actions: [ - Card::Action.new( - content: 'Attune to the planes of soul.', - symbol: [:blood] - ), - ], - color: 'firebrick', - flavour: '"Dreams and Memories?"', - type: 'Blood Spell Base' -) -# Ilvaite - -beginner_spells[:touch] = Card.new( #TODO - title: "Touch of Magic", - blood: 1, - #reposte: 'Prc', - actions: [ - Card::Action.new( - content: 'Summon magic around your hand.', - symbol: [:blood, :odd] - ), - ], - color: 'firebrick', - #flavour: '"Alchemicals and fleshy masses."', - type: 'Blood Spell Modified' -) - -beginner_spells[:engulf] = Card.new( #TODO - title: "Elemental Engulf", - blood: 2, - #reposte: 'Prc', - actions: [ - Card::Action.new( - content: 'Summon magic around your self.', - symbol: [:blood, :greater] - ), - ], - color: 'firebrick', - #flavour: '"Alchemicals and fleshy masses."', - type: 'Blood Spell Modified' -) - -beginner_spells[:distance] = Card.new( #TODO - title: "Distance Casting", - blood: 2, - #reposte: 'Prc', - actions: [ - Card::Action.new( - content: 'Summon magic at a distance.', - symbol: [:blood, :face] - ), - ], - color: 'firebrick', - #flavour: '"Alchemicals and fleshy masses."', - type: 'Blood Spell Modified' -) - -beginner_spells[:endure] = Card.new( #TODO - title: "Enduring Arcana", - blood: 0, - #reposte: 'Prc', - actions: [ - Card::Action.new( - content: 'Keep casting for a duration. Whenever distractions occurs to you while casting, such as an attack or a suprise, do a blood check with difficulty equal to the sum of the blood value of spell components used.', - symbol: [:blood, :even] - ), - ], - color: 'firebrick', - #flavour: '"Alchemicals and fleshy masses."', - type: 'Blood Spell Modified' -) - - -File.write('beginner_spells.html', Card.build(beginner_spells.values)) diff --git a/cards/weapon_example.svg b/cards/weapon_example.svg deleted file mode 100644 index ef9e910..0000000 --- a/cards/weapon_example.svg +++ /dev/null @@ -1,864 +0,0 @@ - - - -123568734 -- cgit v1.2.3