Minigames
Optionele minigames binnen de hoofdgame.
Overzicht
| Minigame | Locatie | Beschrijving |
|---|---|---|
| Vissen | Vijver | Vis vangen minigame |
| Koken | Keuken | Recepten combineren |
| Tuinieren | Boerderij | Gewassen verzorgen |
| Memory | Clubhuis | Kaarten matchen |
Vissen Minigame
Concept
┌────────────────────────────────────────┐
│ VISSEN │
│ │
│ 🎣 ━━━━━━━━━╲ │
│ ╲ │
│ 🪝 │
│ 🐟 │
│ 🐠 │
│ │
│ [──────────●─────────] │
│ POWER BAR │
│ │
│ Press SPACE when fish bites! │
└────────────────────────────────────────┘
Mechaniek
# fishing_minigame.gd
enum State { WAITING, BITE, REELING, SUCCESS, FAIL }
var current_state: State = State.WAITING
var bite_timer: float = 0.0
var reel_progress: float = 0.0
var fish_resistance: float = 0.0
func _process(delta: float) -> void:
match current_state:
State.WAITING:
_update_waiting(delta)
State.BITE:
_update_bite(delta)
State.REELING:
_update_reeling(delta)
func _update_waiting(delta: float) -> void:
bite_timer -= delta
if bite_timer <= 0:
# Random bite
current_state = State.BITE
_show_bite_indicator()
bite_timer = 1.0 # Window to react
func _update_bite(delta: float) -> void:
bite_timer -= delta
if bite_timer <= 0:
# Missed the bite
current_state = State.FAIL
return
if Input.is_action_just_pressed("interact"):
current_state = State.REELING
_start_reeling()
Rewards
| Vis | Rarity | Reward |
|---|---|---|
| Karper | Common | 5 beukenootjes |
| Forel | Uncommon | 15 beukenootjes |
| Goudvis | Rare | 50 beukenootjes |
| Magische Vis | Legendary | 200 beukenootjes + XP |
Koken Minigame
Concept
Drag & drop ingrediënten naar de pan:
┌────────────────────────────────────────┐
│ KOKEN │
│ │
│ Ingrediënten: │
│ ┌───┐ ┌───┐ ┌───┐ ┌───┐ │
│ │ 🥕│ │ 🥔│ │ 🧅│ │ 🥩│ │
│ └───┘ └───┘ └───┘ └───┘ │
│ │
│ ┌─────────┐ │
│ │ 🍳 │ │
│ │ PAN │ │
│ └─────────┘ │
│ │
│ Recept: Stoofpot (wortel + aardappel)│
└────────────────────────────────────────┘
Mechaniek
# cooking_minigame.gd
var current_recipe: Dictionary = {}
var added_ingredients: Array = []
func _on_ingredient_dropped(ingredient_id: String) -> void:
added_ingredients.append(ingredient_id)
_check_recipe()
func _check_recipe() -> void:
# Check if ingredients match any recipe
for recipe in recipes:
if _ingredients_match(recipe.ingredients, added_ingredients):
_complete_recipe(recipe)
return
# Check if too many wrong ingredients
if added_ingredients.size() > 4:
_fail_cooking()
Tuinieren Minigame
Concept
Quick-time events voor verzorging:
┌────────────────────────────────────────┐
│ TUINIEREN │
│ │
│ 🌱 → 🌿 → 🌻 │
│ │
│ ┌────────────────────────────┐ │
│ │ WATER: Press when in zone │ │
│ │ [====●=========] │ │
│ └────────────────────────────┘ │
│ │
│ Perfect: +20% yield │
│ Good: +10% yield │
│ Miss: Normal yield │
└────────────────────────────────────────┘
Mechaniek
# gardening_minigame.gd
var target_zone_start: float = 0.4
var target_zone_end: float = 0.6
var cursor_position: float = 0.0
var cursor_speed: float = 1.5
func _process(delta: float) -> void:
# Move cursor back and forth
cursor_position += cursor_speed * delta
if cursor_position >= 1.0 or cursor_position <= 0.0:
cursor_speed *= -1
_update_cursor_visual()
func _on_action_pressed() -> void:
if cursor_position >= target_zone_start and cursor_position <= target_zone_end:
var center = (target_zone_start + target_zone_end) / 2
var distance_from_center = abs(cursor_position - center)
if distance_from_center < 0.05:
_result_perfect()
else:
_result_good()
else:
_result_miss()
Memory Minigame
Concept
Klassiek memory kaartspel:
┌────────────────────────────────────────┐
│ MEMORY │
│ │
│ ┌───┐ ┌───┐ ┌───┐ ┌───┐ │
│ │ ? │ │ 🍎│ │ ? │ │ ? │ │
│ └───┘ └───┘ └───┘ └───┘ │
│ ┌───┐ ┌───┐ ┌───┐ ┌───┐ │
│ │ ? │ │ ? │ │ 🍎│ │ ? │ │
│ └───┘ └───┘ └───┘ └───┘ │
│ │
│ Pairs: 2/8 Time: 45s │
└────────────────────────────────────────┘
Mechaniek
# memory_minigame.gd
var cards: Array = []
var flipped_cards: Array = []
var matched_pairs: int = 0
var total_pairs: int = 8
func _on_card_clicked(card_index: int) -> void:
if flipped_cards.size() >= 2:
return # Wait for cards to flip back
var card = cards[card_index]
if card.is_matched or card.is_flipped:
return
card.flip()
flipped_cards.append(card)
if flipped_cards.size() == 2:
_check_match()
func _check_match() -> void:
var card1 = flipped_cards[0]
var card2 = flipped_cards[1]
if card1.symbol == card2.symbol:
card1.is_matched = true
card2.is_matched = true
matched_pairs += 1
flipped_cards.clear()
if matched_pairs == total_pairs:
_win_game()
else:
# Flip back after delay
await get_tree().create_timer(1.0).timeout
card1.flip_back()
card2.flip_back()
flipped_cards.clear()
Rewards System
XP en Items
func _complete_minigame(score: int, minigame_type: String) -> void:
var rewards = _calculate_rewards(score, minigame_type)
# Give XP
if rewards.xp > 0:
client.reducers.add_xp(rewards.xp)
# Give items
for item in rewards.items:
client.reducers.add_item_to_container(
inventory.get_equipped_container().id,
item.id,
item.quantity
)
# Show reward popup
_show_rewards_popup(rewards)
Integratie
Starten van Minigame
# In main game scene
func _on_minigame_zone_entered(minigame_type: String) -> void:
_show_interaction_prompt("Speel " + minigame_type)
if Input.is_action_just_pressed("interact"):
var minigame_scene = load("res://scenes/minigames/" + minigame_type + ".tscn")
var minigame = minigame_scene.instantiate()
minigame.completed.connect(_on_minigame_completed)
add_child(minigame)