From 2f641feeb07864d87e0834edf38d995318f7379d Mon Sep 17 00:00:00 2001 From: Ninjananas Date: Wed, 4 Sep 2024 14:28:55 +0200 Subject: [PATCH] Cards are almost complete now! --- data/cards.xlsx | Bin 8046 -> 8357 bytes graphics/stand-alone/bg_numbers.svg | 115 ++++++++++++++++++ graphics/stand-alone/effet.svg | 40 ++++++ graphics/stand-alone/icone_assassinat.svg | 1 + graphics/stand-alone/icone_campagne-comm.svg | 1 + graphics/stand-alone/icone_casserole.svg | 1 + graphics/stand-alone/icone_corruption.svg | 1 + graphics/stand-alone/icone_propagande.svg | 47 +++++++ graphics/stand-alone/icone_retournement.svg | 1 + graphics/stand-alone/icone_robocaine.svg | 1 + graphics/stand-alone/icone_spin-doctor.svg | 1 + graphics/stand-alone/magouille.svg | 1 + graphics/stand-alone/pv.svg | 33 +++++ scripts/compute_layout.py | 121 ------------------- scripts/generate_layouts.py | 42 +++++++ src/deck.rb | 19 +++ 16 files changed, 304 insertions(+), 121 deletions(-) create mode 100644 graphics/stand-alone/bg_numbers.svg create mode 100644 graphics/stand-alone/effet.svg create mode 100644 graphics/stand-alone/icone_assassinat.svg create mode 100644 graphics/stand-alone/icone_campagne-comm.svg create mode 100644 graphics/stand-alone/icone_casserole.svg create mode 100644 graphics/stand-alone/icone_corruption.svg create mode 100644 graphics/stand-alone/icone_propagande.svg create mode 100644 graphics/stand-alone/icone_retournement.svg create mode 100644 graphics/stand-alone/icone_robocaine.svg create mode 100644 graphics/stand-alone/icone_spin-doctor.svg create mode 100644 graphics/stand-alone/magouille.svg create mode 100644 graphics/stand-alone/pv.svg delete mode 100644 scripts/compute_layout.py diff --git a/data/cards.xlsx b/data/cards.xlsx index 938e98044acef2f5c6447d2ac5b971dd2b105314..bcc8f54f69ee8918c0cfecc38e9b76e7104c8d06 100644 GIT binary patch delta 5526 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 delta 5148 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 YDky@vu?o^mkEJG8DX6kdmjUSk0KeE%r2qf` diff --git a/graphics/stand-alone/bg_numbers.svg b/graphics/stand-alone/bg_numbers.svg new file mode 100644 index 0000000..994ae1e --- /dev/null +++ b/graphics/stand-alone/bg_numbers.svg @@ -0,0 +1,115 @@ + + + + + + + + + 0 0 1 0 1 1 0 1 0 1 0 1 0 0 0 0 1 0 1 1 1 1 1 0 0 0 0 1 0 1 0 0 0 1 1 1 0 1 0 0 1 0 1 0 1 1 0 0 0 1 0 1 0 1 1 0 1 0 0 0 0 1 0 1 1 0 1 0 1 0 1 1 0 1 1 0 1 0 1 1 0 1 1 1 0 0 1 0 0 0 1 0 1 1 0 0 1 1 1 1 1 1 0 0 1 1 0 1 0 1 1 0 1 1 0 1 1 1 0 0 1 1 0 0 1 0 1 1 0 1 0 1 1 1 1 0 0 0 0 1 1 0 0 1 1 0 1 0 1 0 0 1 1 0 0 1 0 1 1 1 1 0 1 1 1 0 0 0 1 0 0 1 1 0 0 0 1 1 1 1 1 1 1 0 0 0 1 0 1 1 1 1 1 1 1 0 1 0 1 1 0 1 0 0 1 0 0 1 0 0 0 0 1 0 1 0 1 1 1 1 1 1 1 0 0 0 1 0 1 0 0 1 1 1 1 1 1 1 1 0 0 0 1 1 1 1 0 0 0 0 0 1 1 0 1 1 1 0 0 0 0 1 0 1 0 1 1 1 0 1 0 1 0 1 0 1 1 1 1 1 1 1 1 0 0 1 1 1 0 1 0 0 1 1 1 1 1 0 1 0 1 0 1 1 1 1 0 1 1 1 0 0 0 1 1 0 1 0 1 1 1 1 1 0 0 0 0 1 0 0 0 1 1 1 1 0 0 0 1 0 1 0 0 0 1 1 0 1 0 1 0 1 0 0 0 1 1 0 1 1 0 0 1 0 1 0 1 0 1 0 1 1 0 1 1 0 1 1 1 0 1 1 0 1 0 0 0 1 1 1 0 0 1 0 1 1 1 1 1 1 0 1 0 1 0 1 0 0 0 1 0 0 0 1 0 1 0 0 0 0 1 0 1 0 0 0 0 1 1 0 0 0 0 1 0 1 0 1 1 1 0 0 0 0 1 1 1 0 1 0 0 1 0 0 0 1 0 1 1 0 0 1 1 1 1 0 1 0 1 0 1 0 0 1 1 0 1 0 0 1 0 1 0 1 1 1 1 0 0 1 0 0 0 1 0 1 0 0 1 0 1 0 0 1 1 0 1 1 0 1 0 1 1 1 0 1 0 0 1 1 0 1 0 1 1 0 1 1 1 0 1 1 1 1 0 1 1 0 0 1 0 1 1 1 0 1 0 0 1 0 0 0 0 1 1 0 1 1 0 1 0 1 0 1 1 0 1 0 1 0 0 1 0 0 0 0 0 1 0 0 0 0 1 1 1 1 0 1 1 0 0 1 1 1 1 1 1 0 1 1 1 0 0 0 1 0 1 1 1 0 0 1 1 1 1 1 1 1 0 0 0 1 0 0 1 0 0 1 1 1 1 0 0 1 0 0 0 0 0 1 0 0 1 0 1 0 1 1 1 0 0 1 1 0 1 0 1 0 1 0 0 0 0 0 0 0 1 1 0 1 0 0 1 0 1 1 1 1 1 1 1 1 1 1 1 1 0 0 1 0 1 0 0 1 0 0 1 1 1 0 0 0 0 0 1 0 1 0 0 1 1 0 1 0 1 1 1 0 1 1 0 1 0 0 0 0 0 0 1 0 1 0 0 1 0 1 0 0 0 0 0 0 0 0 1 1 1 1 0 0 0 1 1 0 0 1 1 1 1 0 0 1 1 1 1 0 0 0 1 1 0 0 1 1 1 0 0 0 0 1 1 1 0 1 1 0 0 0 0 0 0 1 0 0 1 0 1 1 0 0 0 1 0 0 0 1 0 1 1 1 0 0 1 0 0 0 0 1 0 1 0 0 1 1 0 1 0 0 1 0 1 1 0 0 0 1 1 1 0 1 0 0 0 0 1 1 0 1 0 1 1 1 0 1 1 0 0 1 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0 0 0 1 1 0 1 1 0 0 1 1 1 1 1 0 1 0 1 0 1 0 1 1 0 0 0 1 0 1 1 0 0 0 0 0 0 1 0 0 1 1 0 0 1 1 0 1 1 1 0 0 0 1 0 0 0 1 0 0 0 0 1 1 0 0 0 0 1 1 0 0 1 1 1 0 0 0 1 1 0 1 0 0 1 1 0 1 1 1 0 1 1 1 0 1 1 1 1 0 1 1 1 1 1 1 0 1 0 1 1 1 0 0 1 1 1 1 0 0 0 1 0 0 0 0 + + diff --git a/graphics/stand-alone/effet.svg b/graphics/stand-alone/effet.svg new file mode 100644 index 0000000..21683c3 --- /dev/null +++ b/graphics/stand-alone/effet.svg @@ -0,0 +1,40 @@ + + + + + + + + + + + + diff --git a/graphics/stand-alone/icone_assassinat.svg b/graphics/stand-alone/icone_assassinat.svg new file mode 100644 index 0000000..d583b97 --- /dev/null +++ b/graphics/stand-alone/icone_assassinat.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/graphics/stand-alone/icone_campagne-comm.svg b/graphics/stand-alone/icone_campagne-comm.svg new file mode 100644 index 0000000..c1152bb --- /dev/null +++ b/graphics/stand-alone/icone_campagne-comm.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/graphics/stand-alone/icone_casserole.svg b/graphics/stand-alone/icone_casserole.svg new file mode 100644 index 0000000..55b87da --- /dev/null +++ b/graphics/stand-alone/icone_casserole.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/graphics/stand-alone/icone_corruption.svg b/graphics/stand-alone/icone_corruption.svg new file mode 100644 index 0000000..0c1e873 --- /dev/null +++ b/graphics/stand-alone/icone_corruption.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/graphics/stand-alone/icone_propagande.svg b/graphics/stand-alone/icone_propagande.svg new file mode 100644 index 0000000..3c18fac --- /dev/null +++ b/graphics/stand-alone/icone_propagande.svg @@ -0,0 +1,47 @@ + + + + + + + + + + + + + + diff --git a/graphics/stand-alone/icone_retournement.svg b/graphics/stand-alone/icone_retournement.svg new file mode 100644 index 0000000..e222213 --- /dev/null +++ b/graphics/stand-alone/icone_retournement.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/graphics/stand-alone/icone_robocaine.svg b/graphics/stand-alone/icone_robocaine.svg new file mode 100644 index 0000000..9f0b01b --- /dev/null +++ b/graphics/stand-alone/icone_robocaine.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/graphics/stand-alone/icone_spin-doctor.svg b/graphics/stand-alone/icone_spin-doctor.svg new file mode 100644 index 0000000..bb1b1a1 --- /dev/null +++ b/graphics/stand-alone/icone_spin-doctor.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/graphics/stand-alone/magouille.svg b/graphics/stand-alone/magouille.svg new file mode 100644 index 0000000..4658166 --- /dev/null +++ b/graphics/stand-alone/magouille.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/graphics/stand-alone/pv.svg b/graphics/stand-alone/pv.svg new file mode 100644 index 0000000..7b44ece --- /dev/null +++ b/graphics/stand-alone/pv.svg @@ -0,0 +1,33 @@ + + + + + + + + + + + + diff --git a/scripts/compute_layout.py b/scripts/compute_layout.py deleted file mode 100644 index b025692..0000000 --- a/scripts/compute_layout.py +++ /dev/null @@ -1,121 +0,0 @@ -from typing import * - - -# Card size info -TOTAL_HEIGHT = 1125 -TOTAL_WIDTH = 825 -BLEED_MARGIN = 37.5 -SAFE_MARGIN = 75 -MAX_SAFE_X = TOTAL_WIDTH - SAFE_MARGIN -MAX_SAFE_Y = TOTAL_HEIGHT - SAFE_MARGIN - -# Icon info -ICON_SIZE = 125 -ICON_MARGIN_LEFT = 0 -ICON_MARGIN_TOP = 0 -ICON_X = ICON_MARGIN_LEFT + SAFE_MARGIN -ICON_Y = ICON_MARGIN_TOP + SAFE_MARGIN - -# Banner info -BANNER_WIDTH = 75 -BANNER_HEIGHT = 225 -BANNER_X = ICON_X + ICON_SIZE + 10 -BANNER_Y = 0 -BANNER_TEXT_FONT = "\"ethnocentric 12\"" -BANNER_TEXT_X = BANNER_X - 10 -BANNER_TEXT_Y = BANNER_HEIGHT // 3 -BANNER_TEXT_WIDTH = BANNER_WIDTH + 20 - -# Name info -NAME_X = ICON_X + ICON_SIZE -NAME_Y = SAFE_MARGIN + 10 -NAME_WIDTH = MAX_SAFE_X - NAME_X -NAME_HEIGHT = 125 -NAME_FONT = "\"ethnocentric 11\"" - -NAME_WITH_BANNER_X = BANNER_X + BANNER_WIDTH -NAME_WITH_BANNER_WIDTH = NAME_WIDTH - (NAME_WITH_BANNER_X - NAME_X) - -def central_sym(x: int, y: int) -> Tuple[int, int]: - return TOTAL_WIDTH - x, TOTAL_HEIGHT - y - -# Alternative objects -ALT_ICON_X, ALT_ICON_Y = central_sym(ICON_X, ICON_Y) -ALT_BANNER_X, ALT_BANNER_Y = central_sym(BANNER_X, BANNER_Y) -ALT_BANNER_TEXT_X, ALT_BANNER_TEXT_Y = central_sym(BANNER_TEXT_X, BANNER_TEXT_Y) - -LAYOUT: str = f""" -icon: - x: {ICON_X} - y: {ICON_Y} - width: {ICON_SIZE} - height: {ICON_SIZE} - -alt_icon: - extends: icon - x: {ALT_ICON_X} - y: {ALT_ICON_Y} - angle: 3.14159 - -banner: - x: {BANNER_X} - y: {BANNER_Y} - width: {BANNER_WIDTH} - height: {BANNER_HEIGHT} - -banner_text: - x: {BANNER_TEXT_X} - y: {BANNER_TEXT_Y} - width: {BANNER_TEXT_WIDTH} - height: 2c - font: {BANNER_TEXT_FONT} - align: center -# hint: blue - -alt_banner: - extends: banner - x: {ALT_BANNER_X} - y: {ALT_BANNER_Y} - angle: 3.14159 - - -alt_banner_text: - extends: banner_text - angle: 3.14159 - x: {ALT_BANNER_TEXT_X} - y: {ALT_BANNER_TEXT_Y} - -name: - x: {NAME_X} - y: {NAME_Y} - width: {NAME_WIDTH} - height: {NAME_HEIGHT} - align: center - valign: middle - font: {NAME_FONT} -# hint: red - -name_with_banner: - extends: name - x: {NAME_WITH_BANNER_X} - width: {NAME_WITH_BANNER_WIDTH} - -cut: - x: {BLEED_MARGIN} - y: {BLEED_MARGIN} - width: {TOTAL_WIDTH - (2 * BLEED_MARGIN)} - height: {TOTAL_HEIGHT - (2 * BLEED_MARGIN)} - stroke_color: gray - stroke_width: 2 - -safe: - x: {SAFE_MARGIN} - y: {SAFE_MARGIN} - width: {TOTAL_WIDTH - (2 * SAFE_MARGIN)} - height: {TOTAL_HEIGHT - (2 * SAFE_MARGIN)} - radius: 0.5c - dash: 3mm 3mm -""" - -if __name__ == "__main__": - open("layout.yml", "w").write(LAYOUT) diff --git a/scripts/generate_layouts.py b/scripts/generate_layouts.py index a720717..6dd246a 100644 --- a/scripts/generate_layouts.py +++ b/scripts/generate_layouts.py @@ -10,6 +10,8 @@ BLEED_MARGIN = 1 SAFE_MARGIN = 2 MAX_SAFE_X = TOTAL_WIDTH - SAFE_MARGIN MAX_SAFE_Y = TOTAL_HEIGHT - SAFE_MARGIN +SAFE_WIDTH = TOTAL_WIDTH - 2 * SAFE_MARGIN +SAFE_HEIGHT = TOTAL_HEIGHT - 2 * SAFE_MARGIN # Icon info ICON_SIZE = 3.7 @@ -46,7 +48,27 @@ ALT_ICON_X, ALT_ICON_Y = central_sym(ICON_X, ICON_Y) ALT_BANNER_X, ALT_BANNER_Y = central_sym(BANNER_X, BANNER_Y) ALT_BANNER_TEXT_X, ALT_BANNER_TEXT_Y = central_sym(BANNER_TEXT_X, BANNER_TEXT_Y) +# Effects +EFFECT_FRAME_WIDTH = SAFE_WIDTH - 2 +EFFECT_FRAME_HEIGHT = 6 +EFFECT_FRAME_RADIUS = 0.2 +EFFECT_FRAME_MARGIN_BOTTOM = 2 +EFFECT_FRAME_X = (TOTAL_WIDTH - EFFECT_FRAME_WIDTH) / 2. +EFFECT_FRAME_Y = MAX_SAFE_Y - EFFECT_FRAME_MARGIN_BOTTOM - EFFECT_FRAME_HEIGHT + +EFFECT_TEXT_MARGIN = 1 +EFFECT_TEXT_X = EFFECT_FRAME_X + EFFECT_TEXT_MARGIN +EFFECT_TEXT_Y = EFFECT_FRAME_Y + EFFECT_TEXT_MARGIN +EFFECT_TEXT_WIDTH = EFFECT_FRAME_WIDTH - 2 * EFFECT_TEXT_MARGIN +EFFECT_TEXT_HEIGHT = EFFECT_FRAME_HEIGHT - 2 * EFFECT_TEXT_MARGIN + POKER_LAYOUT: str = f""" +background: + x: 0 + y: 0 + width: {TOTAL_WIDTH}c + height: {TOTAL_HEIGHT}c + icon: x: {ICON_X}c y: {ICON_Y}c @@ -102,6 +124,26 @@ name_with_banner: x: {NAME_WITH_BANNER_X}c width: {NAME_WITH_BANNER_WIDTH}c + +effect_frame: + x: {EFFECT_FRAME_X}c + y: {EFFECT_FRAME_Y}c + width: {EFFECT_FRAME_WIDTH}c + height: {EFFECT_FRAME_HEIGHT}c + radius: {EFFECT_FRAME_RADIUS}c + stroke_width: 0.3mm + +effect_text: + x: {EFFECT_TEXT_X}c + y: {EFFECT_TEXT_Y}c + width: {EFFECT_TEXT_WIDTH}c + height: {EFFECT_TEXT_HEIGHT}c + font_size: 9 + spacing: 5 + align: center + valign: middle + markup: true + border: x: 0 y: 0 diff --git a/src/deck.rb b/src/deck.rb index 8dad4ca..b93b380 100644 --- a/src/deck.rb +++ b/src/deck.rb @@ -10,6 +10,10 @@ def rank_to_banner_svg(rank) rank.nil? ? nil : (rank.start_with?('+') || rank.start_with?('-')) ? "banniere_mod.svg" : "banniere_rang.svg" end +def embed_custom(embed, id) + embed.svg width: '0.8c', height: '0.8c', dx: '0c', dy: '-0.7c', key: ":#{id}:", file: "._graphics/#{id}.svg" +end + DPI = 300 CELL_PX = DPI / 8.0 BLEED = 0.125 # In inches @@ -26,6 +30,7 @@ Squib::Deck.new( dpi: DPI, ) do background color: 'white' + svg file: 'bg_numbers.svg', layout: 'background' build :debug do rect layout: 'border', stroke_color: 'black' @@ -49,6 +54,20 @@ Squib::Deck.new( svg file: alt_banner_file, layout: 'alt_banner' text str: data['rang_alt'], layout: 'alt_banner_text' + fill_color = data['effet'].map { |effet| effet.nil? ? '#0000': '#f5f5f5ff' } + stroke_color = data['effet'].map { |effet| effet.nil? ? '#0000': '#bb98' } + rect layout: 'effect_frame', fill_color: fill_color, stroke_color: stroke_color + text(str: data['effet'], layout: 'effect_text') do |embed| + embed_custom(embed, 'effet') + embed_custom(embed, 'magouille') + embed_custom(embed, 'pv') + embed_custom(embed, 'icone_ind') + embed_custom(embed, 'icone_gau') + embed_custom(embed, 'icone_roy') + embed_custom(embed, 'icone_ana') + embed_custom(embed, 'icone_dro') + embed_custom(embed, 'icone_eco') + end build :debug do save_pdf sprue: 'sprues/debug.yml', file: 'debug.pdf'