# Theme Setup Guide This guide explains how to set up the Code of Conquest theme in Godot, including fonts, colors, and UI styling. ## Overview The theme recreates the web UI's RPG/fantasy aesthetic: - **Color Palette**: Dark slate gray backgrounds with gold accents - **Fonts**: Cinzel (headings), Lato (body text) - **Style**: Medieval/fantasy with ornate borders and rich colors ## Color Palette All colors are defined in `scripts/utils/theme_colors.gd`: ### Backgrounds - Primary: `#1a1a2e` - Very dark blue-gray - Secondary: `#16213e` - Slightly lighter - Card: `#1e1e2f` - Card backgrounds ### Text - Primary: `#e4e4e7` - Light gray (main text) - Secondary: `#a1a1aa` - Medium gray (secondary text) - Disabled: `#71717a` - Dark gray (disabled) ### Accents - Gold: `#d4af37` - Primary accent color - Gold Light: `#f4d03f` - Gold Dark: `#b8930a` ### Status - Success: `#10b981` - Green - Error: `#ef4444` - Red - Warning: `#f59e0b` - Orange - Info: `#3b82f6` - Blue ## Font Setup ### 1. Download Fonts **Cinzel** (for headings): - Download from [Google Fonts](https://fonts.google.com/specimen/Cinzel) - Download all weights (Regular, Medium, SemiBold, Bold) **Lato** (for body text): - Download from [Google Fonts](https://fonts.google.com/specimen/Lato) - Download Regular, Bold, and Italic ### 2. Install Fonts in Project 1. Extract downloaded font files (.ttf or .otf) 2. Copy to `godot_client/assets/fonts/`: ``` assets/fonts/ ├── Cinzel-Regular.ttf ├── Cinzel-Medium.ttf ├── Cinzel-SemiBold.ttf ├── Cinzel-Bold.ttf ├── Lato-Regular.ttf ├── Lato-Bold.ttf └── Lato-Italic.ttf ``` 3. In Godot, the fonts will auto-import 4. Check import settings (select font → Import tab): - Antialiasing: Enabled - Hinting: Full - Subpixel Positioning: Auto ### 3. Create Font Resources For each font file: 1. Right-click font in FileSystem 2. Select "New Resource" 3. Choose "FontVariation" (or use font directly) 4. Configure size and other properties 5. Save as `.tres` resource Example font resources to create: - `Cinzel_Heading_Large.tres` (Cinzel-Bold, 32px) - `Cinzel_Heading_Medium.tres` (Cinzel-SemiBold, 24px) - `Cinzel_Heading_Small.tres` (Cinzel-Medium, 18px) - `Lato_Body.tres` (Lato-Regular, 14px) - `Lato_Body_Bold.tres` (Lato-Bold, 14px) ## Theme Resource Setup ### 1. Create Main Theme 1. In Godot: Right-click `assets/themes/` → New Resource 2. Select "Theme" 3. Save as `main_theme.tres` ### 2. Configure Default Font 1. Select `main_theme.tres` 2. In Inspector → Theme → Default Font: - Set to `Lato-Regular.ttf` 3. Default Font Size: `14` ### 3. Configure Colors For each Control type (Button, Label, LineEdit, etc.): 1. In Theme editor, expand control type 2. Add color overrides: **Button**: - `font_color`: `#e4e4e7` (TEXT_PRIMARY) - `font_hover_color`: `#f4d03f` (GOLD_LIGHT) - `font_pressed_color`: `#d4af37` (GOLD_ACCENT) - `font_disabled_color`: `#71717a` (TEXT_DISABLED) **Label**: - `font_color`: `#e4e4e7` (TEXT_PRIMARY) **LineEdit**: - `font_color`: `#e4e4e7` (TEXT_PRIMARY) - `font_placeholder_color`: `#a1a1aa` (TEXT_SECONDARY) - `caret_color`: `#d4af37` (GOLD_ACCENT) - `selection_color`: `#d4af37` (GOLD_ACCENT with alpha) ### 4. Configure StyleBoxes Create StyleBoxFlat resources for backgrounds and borders: **Button Normal**: 1. Create New StyleBoxFlat 2. Settings: - Background Color: `#1e1e2f` (BACKGROUND_CARD) - Border Width: `2` (all sides) - Border Color: `#3f3f46` (BORDER_DEFAULT) - Corner Radius: `4` (all corners) **Button Hover**: - Background Color: `#16213e` (BACKGROUND_SECONDARY) - Border Color: `#d4af37` (GOLD_ACCENT) **Button Pressed**: - Background Color: `#0f3460` (BACKGROUND_TERTIARY) - Border Color: `#d4af37` (GOLD_ACCENT) **Button Disabled**: - Background Color: `#1a1a2e` (BACKGROUND_PRIMARY) - Border Color: `#27272a` (DIVIDER) **Panel**: - Background Color: `#1e1e2f` (BACKGROUND_CARD) - Border Width: `1` - Border Color: `#3f3f46` (BORDER_DEFAULT) - Corner Radius: `8` **LineEdit Normal**: - Background Color: `#16213e` (BACKGROUND_SECONDARY) - Border Width: `2` - Border Color: `#3f3f46` (BORDER_DEFAULT) - Corner Radius: `4` **LineEdit Focus**: - Border Color: `#d4af37` (GOLD_ACCENT) ### 5. Set Theme in Project 1. Project → Project Settings → GUI → Theme 2. Set Custom Theme to `res://assets/themes/main_theme.tres` Or set per-scene by selecting root Control node and setting Theme property. ## Using the Theme ### In Scenes Most UI elements will automatically use the theme. For custom styling: ```gdscript # Access theme colors var label = Label.new() label.add_theme_color_override("font_color", ThemeColors.GOLD_ACCENT) # Access theme fonts var heading = Label.new() heading.add_theme_font_override("font", preload("res://assets/fonts/Cinzel_Heading_Large.tres")) # Access theme styleboxes var panel = Panel.new() var stylebox = get_theme_stylebox("panel", "Panel").duplicate() stylebox.bg_color = ThemeColors.BACKGROUND_TERTIARY panel.add_theme_stylebox_override("panel", stylebox) ``` ### Creating Custom Styles ```gdscript # Create a card-style panel var stylebox = StyleBoxFlat.new() stylebox.bg_color = ThemeColors.BACKGROUND_CARD stylebox.border_width_all = 2 stylebox.border_color = ThemeColors.BORDER_DEFAULT stylebox.corner_radius_all = 8 stylebox.shadow_color = ThemeColors.SHADOW stylebox.shadow_size = 4 panel.add_theme_stylebox_override("panel", stylebox) ``` ### Reusable Component Scenes Create reusable UI components in `scenes/components/`: **Card.tscn**: - PanelContainer with card styling - Margins for content padding - Optional header and footer sections **CustomButton.tscn**: - Button with custom styling - Hover effects - Icon support **FormField.tscn**: - Label + LineEdit combo - Validation error display - Help text support ## Theme Variations ### Headings Create different heading styles: ```gdscript # H1 - Large heading var h1 = Label.new() h1.add_theme_font_override("font", preload("res://assets/fonts/Cinzel_Heading_Large.tres")) h1.add_theme_color_override("font_color", ThemeColors.GOLD_ACCENT) # H2 - Medium heading var h2 = Label.new() h2.add_theme_font_override("font", preload("res://assets/fonts/Cinzel_Heading_Medium.tres")) h2.add_theme_color_override("font_color", ThemeColors.TEXT_PRIMARY) # H3 - Small heading var h3 = Label.new() h3.add_theme_font_override("font", preload("res://assets/fonts/Cinzel_Heading_Small.tres")) h3.add_theme_color_override("font_color", ThemeColors.TEXT_PRIMARY) ``` ### Status Messages ```gdscript # Success message var success_label = Label.new() success_label.add_theme_color_override("font_color", ThemeColors.SUCCESS) # Error message var error_label = Label.new() error_label.add_theme_color_override("font_color", ThemeColors.ERROR) ``` ### Progress Bars ```gdscript # HP Bar var hp_bar = ProgressBar.new() hp_bar.add_theme_color_override("fill_color", ThemeColors.HP_COLOR) # Mana Bar var mana_bar = ProgressBar.new() mana_bar.add_theme_color_override("fill_color", ThemeColors.MANA_COLOR) ``` ## Responsive Scaling ### DPI Scaling Godot handles DPI scaling automatically. For custom scaling: ```gdscript # Get DPI scale var scale = DisplayServer.screen_get_scale() # Adjust font size var font_size = 14 * scale label.add_theme_font_size_override("font_size", int(font_size)) ``` ### Mobile Adjustments ```gdscript # Detect platform var is_mobile = OS.get_name() in ["Android", "iOS"] if is_mobile: # Larger touch targets button.custom_minimum_size = Vector2(60, 60) # Larger fonts label.add_theme_font_size_override("font_size", 16) else: # Smaller desktop sizes button.custom_minimum_size = Vector2(40, 40) label.add_theme_font_size_override("font_size", 14) ``` ## Testing the Theme ### Visual Consistency Create a theme test scene with all UI elements: - Buttons (normal, hover, pressed, disabled) - Labels (headings, body, secondary) - Input fields (normal, focused, error) - Panels and cards - Progress bars - Lists and grids ### Cross-Platform Test theme on: - Desktop (Windows/Mac/Linux) - Check with different DPI settings - Mobile (Android/iOS) - Check on different screen sizes - Web - Check in different browsers ## Advanced: Dynamic Theming For future dark/light mode support: ```gdscript # Theme manager (future) class ThemeManager: static var current_theme = "dark" static func switch_theme(theme_name: String): match theme_name: "dark": # Load dark theme get_tree().root.theme = preload("res://assets/themes/dark_theme.tres") "light": # Load light theme get_tree().root.theme = preload("res://assets/themes/light_theme.tres") ``` ## Resources - [Godot Theme Documentation](https://docs.godotengine.org/en/stable/tutorials/ui/gui_using_theme_editor.html) - [Google Fonts](https://fonts.google.com/) - [Color Palette Tool](https://coolors.co/) ## Quick Start Checklist - [ ] Download Cinzel and Lato fonts - [ ] Copy fonts to `assets/fonts/` - [ ] Create `main_theme.tres` in `assets/themes/` - [ ] Set default font to Lato-Regular - [ ] Configure Button colors and styleboxes - [ ] Configure Panel styleboxes - [ ] Configure LineEdit colors and styleboxes - [ ] Create heading font variations - [ ] Set project theme in settings - [ ] Test in a sample scene - [ ] Create reusable component scenes