362 lines
9.3 KiB
Markdown
362 lines
9.3 KiB
Markdown
# 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
|