From a8045728b329504d08528e02a37bf4da3e0fc3b0 Mon Sep 17 00:00:00 2001 From: Erzangel Date: Sun, 26 May 2024 00:43:27 +0200 Subject: [PATCH] feat: attempt at refactoring code, new placeholder json for tests --- card.svg | 2 +- card2.svg | 2 + src/actual_card_data_2.json | 20 +++++++++ src/card_data.json | 5 +++ src/draw.py | 36 ++++++++++++++++ src/generate_cards_mvp.py | 82 ++++++++++++++++++------------------- 6 files changed, 105 insertions(+), 42 deletions(-) create mode 100644 card2.svg create mode 100644 src/actual_card_data_2.json create mode 100644 src/draw.py diff --git a/card.svg b/card.svg index fe94dc8..a48c712 100644 --- a/card.svg +++ b/card.svg @@ -1,2 +1,2 @@ -Rallier les TroupesAction, Charme455Mobilisez un Champion. \ No newline at end of file +Rallier les TroupesAction, Charme455Mobilisez un champion. \ No newline at end of file diff --git a/card2.svg b/card2.svg new file mode 100644 index 0000000..fe94dc8 --- /dev/null +++ b/card2.svg @@ -0,0 +1,2 @@ + +Rallier les TroupesAction, Charme455Mobilisez un Champion. \ No newline at end of file diff --git a/src/actual_card_data_2.json b/src/actual_card_data_2.json new file mode 100644 index 0000000..eea91db --- /dev/null +++ b/src/actual_card_data_2.json @@ -0,0 +1,20 @@ +{ + "id": 13, + "role": "market", + "card_type": "action", + "faction": "yellow", + "name": "Taxation", + "cost": 1, + "init_amount": 3, + "effects": [ + { + "effect": "gold", + "amount": 2 + }, + { + "effect": "heal", + "amount": 6, + "effect_type": "faction_combo" + } + ] +} \ No newline at end of file diff --git a/src/card_data.json b/src/card_data.json index 1b15ff2..e2d93a8 100644 --- a/src/card_data.json +++ b/src/card_data.json @@ -3,6 +3,11 @@ "title": "Rallier les Troupes", "type": "Action, Charme", "image_path": "lancersiz3.png" + }, + "13": { + "title": "Caprisun", + "type": "Action, 20cl", + "image_path": "lancersiz3.png" } } diff --git a/src/draw.py b/src/draw.py new file mode 100644 index 0000000..321aa78 --- /dev/null +++ b/src/draw.py @@ -0,0 +1,36 @@ +from typing import List + +stats_radius = 22 + + +def draw_effects_resources_for_row(dwg, effects: List, y: int, x_width: int): + row_1_nb_effects = len(effects) + + row_1_x_offset = -20 + row_1_x_step = 60 + if row_1_nb_effects == 1: + row_1_x_offset = 0 + elif row_1_nb_effects == 2: + row_1_x_offset = -20 + elif row_1_nb_effects == 3: + row_1_x_offset = -40 + row_1_nb_effects_applied = 0 + + for effect in effects: + if effect.get('effect') == 'damage': + x_effect_pos = x_width/2 + row_1_x_offset + row_1_x_step*row_1_nb_effects_applied + dwg.add(dwg.circle(center=(x_effect_pos, y + stats_radius), r=stats_radius, fill='red')) + dwg.add(dwg.text(str(effect.get('amount')), insert=(x_effect_pos, y + stats_radius + 9), text_anchor='middle', fill='white', font_size='24px', font_weight="bold", font_family='Helvetica')) + row_1_nb_effects_applied += 1 + + if effect.get('effect') == 'gold': + x_effect_pos = x_width/2 + row_1_x_offset + row_1_x_step*row_1_nb_effects_applied + dwg.add(dwg.circle(center=(x_effect_pos, y + stats_radius), r=stats_radius, fill='yellow')) + dwg.add(dwg.text(str(effect.get('amount')), insert=(x_effect_pos, y + stats_radius + 9), text_anchor='middle', fill='black', font_size='24px', font_weight="bold", font_family='Helvetica')) + row_1_nb_effects_applied += 1 + + if effect.get('effect') == 'heal': + x_effect_pos = x_width/2 + row_1_x_offset + row_1_x_step*row_1_nb_effects_applied + dwg.add(dwg.circle(center=(x_effect_pos, y + stats_radius), r=stats_radius, fill='green')) + dwg.add(dwg.text(str(effect.get('amount')), insert=(x_effect_pos, y + stats_radius + 9), text_anchor='middle', fill='white', font_size='24px', font_weight="bold", font_family='Helvetica')) + row_1_nb_effects_applied += 1 diff --git a/src/generate_cards_mvp.py b/src/generate_cards_mvp.py index 9adbcc6..8a63552 100644 --- a/src/generate_cards_mvp.py +++ b/src/generate_cards_mvp.py @@ -64,7 +64,9 @@ import svgwrite import json -from typing import Array +from typing import List + +from draw import draw_effects_resources_for_row with open('src/card_data.json') as f: @@ -80,7 +82,6 @@ title_y_offset = 24 title_font_size = 19 subtitle_font_size = 13 cost_right_offset = 38 -stats_radius = 22 effect_text_size = 14 row_1_base_y = 280 row_2_base_y = 375 @@ -110,7 +111,7 @@ icon_colors = { with open('src/actual_card_data.json') as f: card_data = json.load(f) -card_skin_data = all_skin_data['id'] +card_skin_data = all_skin_data[str(card_data['id'])] # Create a new SVG drawing @@ -164,58 +165,57 @@ dwg.add(dwg.image(card_skin_data['image_path'], insert=(0, 65), size=(x_width, 2 dwg.add(dwg.rect(insert=(border_width_x, 265), size=(str(30) + 'px', str(y_height - 265 - border_width_y) + 'px'), fill='url(#grad1)')) # TODO: figure out nb of effects and adjust row_1_x_offset accordingly -def is_base_effect(array: Array): - return array['effect_type'] == 'champion_action' or not array['effect_type'] +def is_base_effect(array: List): + return not 'effect_type' in array.keys() or array['effect_type'] == 'champion_action' -card_effects: Array = card_data['effects'] +card_effects: List = card_data['effects'] base_effects = list(filter(is_base_effect, card_effects)) other_effects = list(filter(lambda x: not is_base_effect(x), card_effects)) # card_effects = card_data['row_1'] # row_1_nb_effects = len(card_data['row_1'].keys()) -row_1_nb_effects = len(base_effects) -row_1_x_offset = -20 -row_1_x_step = 60 -if row_1_nb_effects == 1: - row_1_x_offset = 0 -elif row_1_nb_effects == 2: - row_1_x_offset = -20 -elif row_1_nb_effects == 3: - row_1_x_offset = -40 -row_1_nb_effects_applied = 0 # Draw row 1 stats -for effect in base_effects: - if effect.get('effect') == 'damage': - # if card_effects.get('damage'): - x_effect_pos = x_width/2 + row_1_x_offset + row_1_x_step*row_1_nb_effects_applied - dwg.add(dwg.circle(center=(x_effect_pos, row_1_base_y + stats_radius), r=stats_radius, fill='red')) - dwg.add(dwg.text(str(effect.get('amount')), insert=(x_effect_pos, row_1_base_y + stats_radius + 9), text_anchor='middle', fill='white', font_size='24px', font_weight="bold", font_family='Helvetica')) - row_1_nb_effects_applied += 1 +# for effect in base_effects: +# if effect.get('effect') == 'damage': +# # if card_effects.get('damage'): +# x_effect_pos = x_width/2 + row_1_x_offset + row_1_x_step*row_1_nb_effects_applied +# dwg.add(dwg.circle(center=(x_effect_pos, row_1_base_y + stats_radius), r=stats_radius, fill='red')) +# dwg.add(dwg.text(str(effect.get('amount')), insert=(x_effect_pos, row_1_base_y + stats_radius + 9), text_anchor='middle', fill='white', font_size='24px', font_weight="bold", font_family='Helvetica')) +# row_1_nb_effects_applied += 1 - if effect.get('effect') == 'gold': - x_effect_pos = x_width/2 + row_1_x_offset + row_1_x_step*row_1_nb_effects_applied - dwg.add(dwg.circle(center=(x_effect_pos, row_1_base_y + stats_radius), r=stats_radius, fill='yellow')) - dwg.add(dwg.text(str(card_data['row_1']['gold']), insert=(x_effect_pos, row_1_base_y + stats_radius + 9), text_anchor='middle', fill='black', font_size='24px', font_weight="bold", font_family='Helvetica')) - row_1_nb_effects_applied += 1 +# if effect.get('effect') == 'gold': +# x_effect_pos = x_width/2 + row_1_x_offset + row_1_x_step*row_1_nb_effects_applied +# dwg.add(dwg.circle(center=(x_effect_pos, row_1_base_y + stats_radius), r=stats_radius, fill='yellow')) +# dwg.add(dwg.text(str(effect.get('amount')), insert=(x_effect_pos, row_1_base_y + stats_radius + 9), text_anchor='middle', fill='black', font_size='24px', font_weight="bold", font_family='Helvetica')) +# row_1_nb_effects_applied += 1 -if card_effects.get('heal'): - x_effect_pos = x_width/2 + row_1_x_offset + row_1_x_step*row_1_nb_effects_applied - dwg.add(dwg.circle(center=(x_effect_pos, row_1_base_y + stats_radius), r=stats_radius, fill='green')) - dwg.add(dwg.text(str(card_data['row_1']['heal']), insert=(x_effect_pos, row_1_base_y + stats_radius + 9), text_anchor='middle', fill='white', font_size='24px', font_weight="bold", font_family='Helvetica')) - row_1_nb_effects_applied += 1 +# if effect.get('effect') == 'heal': +# x_effect_pos = x_width/2 + row_1_x_offset + row_1_x_step*row_1_nb_effects_applied +# dwg.add(dwg.circle(center=(x_effect_pos, row_1_base_y + stats_radius), r=stats_radius, fill='green')) +# dwg.add(dwg.text(str(effect.get('amount')), insert=(x_effect_pos, row_1_base_y + stats_radius + 9), text_anchor='middle', fill='white', font_size='24px', font_weight="bold", font_family='Helvetica')) +# row_1_nb_effects_applied += 1 +draw_effects_resources_for_row(dwg, base_effects, row_1_base_y, x_width) -if card_data['row_2']: +if other_effects: # Draw row 1 to row 2 separator dwg.add(dwg.line(start=(0 + row_1_to_2_separator_shorten_by, row_1_to_2_separator_y), end=(x_width - row_1_to_2_separator_shorten_by, row_1_to_2_separator_y), stroke='black', stroke_width=1)) + +for effect in other_effects: + # TODO handle case where there is both faction combo and trash can + + if effect.get('effect_type') == 'faction_combo': + row_2_icon_x = border_width_x + 35 + row_2_icon_y = row_2_base_y - 5 + dwg.add(dwg.circle(center=(row_2_icon_x + 1, row_2_icon_y + 1), r=15, fill='black')) + dwg.add(dwg.circle(center=(row_2_icon_x, row_2_icon_y), r=15, fill='url(#grad2)')) + # Draw row 2 stats + # Draw row 2 effect text - # If ally effect, draw ally icon (TODO condition) - row_2_icon_x = border_width_x + 35 - row_2_icon_y = row_2_base_y - 5 - dwg.add(dwg.circle(center=(row_2_icon_x + 1, row_2_icon_y + 1), r=15, fill='black')) - dwg.add(dwg.circle(center=(row_2_icon_x, row_2_icon_y), r=15, fill='url(#grad2)')) - # dwg.add(dwg.image(card_data['faction_icon'], insert=(x_width - 30 - 15, 30 - 15), size=(30, 30))) - dwg.add(dwg.text(card_data['row_2']['effect'], insert=(x_width/2, row_2_base_y), text_anchor='middle', fill='black', font_size=str(effect_text_size) + 'px', font_family='Helvetica')) + effect_text_2 = "" + if effect.get('effect') == 'prepare': + effect_text_2 = "Mobilisez un champion." + dwg.add(dwg.text(effect_text_2, insert=(x_width/2, row_2_base_y), text_anchor='middle', fill='black', font_size=str(effect_text_size) + 'px', font_family='Helvetica')) # Save the SVG file dwg.save()