# Getting Started with Card Framework

Complete step-by-step guide to set up and use the Card Framework in your Godot 4.x projects.

## Prerequisites

- **Godot Engine 4.4+** installed
- Basic knowledge of Godot scenes and nodes
- Understanding of GDScript fundamentals

## Installation Methods

### Method 1: AssetLib Installation (Recommended)

1. **Open Godot Editor** and create or open your project
2. **Navigate to AssetLib** tab in the main editor
3. **Search** for "Card Framework"
4. **Download** and import the latest version
5. **Verify Installation** - Check `res://addons/card-framework/` exists

### Method 2: Manual Installation

1. **Download** Card Framework from the repository
2. **Extract** the contents to your project
3. **Copy** the `addons/card-framework/` folder to `res://addons/`
4. **Refresh** the FileSystem dock in Godot

## Project Setup

### Step 1: Scene Structure

Create your main game scene with this hierarchy:
```
Main (Node2D)
└── CardManager (CardManager)
	├── Deck (Pile)
	├── PlayerHand (Hand) 
	└── DiscardPile (Pile)
```

### Step 2: CardManager Configuration

1. **Add CardManager Scene**
   - In your main scene, **Add Child Node**
   - **Instance** `res://addons/card-framework/card_manager.tscn`

2. **Configure Basic Properties**
   ```
   Card Size: (150, 210)          # Standard playing card dimensions
   Debug Mode: false              # Enable for development
   ```

3. **Create Your Card Factory**
   Instead of using the card factory directly, create your own:
   
   **Option A: Inherit from JsonCardFactory (Recommended)**
   - **Create New Scene** → **Add Node** → **JsonCardFactory**
   - **Save** as `res://scenes/my_card_factory.tscn`
   - **Set** `card_factory_scene` to `res://scenes/my_card_factory.tscn`
   
   **Option B: Create Custom Factory**
   - **Create New Scene** → **Add Node** → **CardFactory**
   - **Attach Script** and implement `create_card()` method
   - **Save** as `res://scenes/my_card_factory.tscn`

### Step 3: Directory Structure Setup

Create this folder structure in your project:
```
res://
├── cards/
│   ├── images/          # Card artwork
│   └── data/           # JSON card definitions
└── scenes/
	└── main.tscn       # Your main scene
```

### Step 4: Card Assets Preparation

#### 4.1 Card Images
- **Format**: PNG recommended (supports transparency)
- **Size**: 150x210 pixels for standard cards
- **Naming**: Use descriptive names (e.g., `cardClubs2.png`, `cardHeartsK.png`)
- **Location**: Store in `res://cards/images/`

#### 4.2 Card Data Files
Create JSON files in `res://cards/data/` for each card:

**Example: `club_2.json`**
```json
{
	"name": "club_2",
	"front_image": "cardClubs2.png",
	"suit": "club",
	"value": "2",
	"color": "black"
}
```

**Required Fields**:
- `name` - Unique identifier for the card
- `front_image` - Filename of the card's front texture

**Optional Fields**:
- Add any custom properties needed for your game logic

### Step 5: Card Factory Configuration

**If using JsonCardFactory (Option A from Step 2):**

Open your `my_card_factory.tscn` scene and configure the JsonCardFactory node:

```
Card Asset Dir: "res://cards/images/"
Card Info Dir: "res://cards/data/"
Back Image: [Assign a card back texture]
Default Card Scene: [Assign custom card scene - required field]
```

**If using Custom Factory (Option B):**
- Implement your own card creation logic in the attached script
- No additional configuration needed here

### Step 6: Container Setup

#### 6.1 Adding Containers

Add container nodes as children of CardManager:

1. **Right-click** CardManager in Scene dock
2. **Add Child** → Choose container type:
   - `Pile` for stacked cards (decks, discard piles)
   - `Hand` for fanned card layouts (player hands)
3. **Position Containers**
   - Select each container in the Scene dock
   - In **Inspector** → **Transform** → **Position**, set appropriate coordinates:
     - Example: Deck at (100, 300), PlayerHand at (400, 500), DiscardPile at (700, 300)
   - Adjust positions based on your game screen size and layout needs

#### 6.2 Pile Configuration

**Basic Properties**:
```
Enable Drop Zone: true
Card Face Up: false             # For deck, true for discard
Layout: UP                      # Stack direction
Allow Card Movement: true
Restrict To Top Card: true      # Only top card moveable
```

**Visual Properties**:
```
Stack Display Gap: 8            # Pixel spacing between cards
Max Stack Display: 6           # Maximum visible cards
```

#### 6.3 Hand Configuration

**Layout Properties**:
```
Max Hand Size: 10
Max Hand Spread: 700           # Pixel width of fanned cards
Card Face Up: true
Card Hover Distance: 30        # Hover effect height
```

**Required Curves** (Create in Inspector):
- `Hand Rotation Curve`: 2-point linear curve for card rotation
- `Hand Vertical Curve`: 3-point curve for arc shape (0→1→0)

### Step 7: Basic Scripting

Add this script to your main scene to start using cards:

```gdscript
extends Node2D

@onready var card_manager = $CardManager
@onready var deck = $CardManager/Deck
@onready var player_hand = $CardManager/PlayerHand

func _ready():
    setup_game()

func setup_game():
    # Create a deck of cards
    create_standard_deck()
    
    # Deal initial hand
    deal_cards_to_hand(5)

func create_standard_deck():
    var suits = ["club", "diamond", "heart", "spade"]
    var values = ["A", "2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K"]
    
    for suit in suits:
        for value in values:
            var card_name = "%s_%s" % [suit, value]
            var card = card_manager.card_factory.create_card(card_name, deck)
            deck.add_card(card)

func deal_cards_to_hand(count: int):
    for i in count:
        if deck.get_card_count() > 0:
            var card = deck.get_top_cards(1).front()
            player_hand.move_cards([card])
```

## Testing Your Setup

### Quick Test Checklist

1. **Run Your Scene** - Press F6 and select your main scene
2. **Verify Cards Appear** - You should see cards in your containers
3. **Test Interactions** - Try dragging cards between containers
4. **Check Debug Mode** - Enable in CardManager to see drop zones
5. **Console Errors** - Ensure no error messages appear

### Common Issues

**Cards Not Appearing**:
- Verify JSON files exist and match card names
- Check `card_asset_dir` and `card_info_dir` paths
- Ensure image files exist in the asset directory

**Drag and Drop Issues**:
- Confirm `enable_drop_zone` is true on containers
- Check that `can_be_interacted_with` is true on cards
- Verify container positions don't overlap incorrectly

**JSON Loading Errors**:
- Validate JSON syntax using online validator
- Ensure required `name` and `front_image` fields exist
- Check for typos in field names

## Next Steps

### Explore Sample Projects
- **`example1/`** - Basic demonstration of all container types
- **`freecell/`** - Complete game implementation with custom rules

### Advanced Customization
- [API Reference](API.md) - Complete class documentation
- [Creating Custom Containers](API.md#extending-cardcontainer)
- [Custom Card Properties](API.md#extending-card)

### Performance Optimization
- Use `preload_card_data()` for better loading performance
- Implement object pooling for frequently created/destroyed cards
- Consider `max_stack_display` for large piles

---

**Need Help?** Check the [API Documentation](API.md) or examine the sample projects for working examples.
