added so you can choose race when starting the game.

This commit is contained in:
2026-01-30 08:31:33 +01:00
parent dabec8a119
commit 3b2af36231
73 changed files with 4241 additions and 1107 deletions

View File

@@ -264,6 +264,38 @@ func _complete_disarm() -> void:
# Change trap visual to show it's disarmed (optional - could fade out or change color)
sprite.modulate = Color(0.5, 0.5, 0.5, 0.5)
# Grant EXP to all players for disarming trap (only on server)
# CRITICAL: Only server should grant EXP to avoid duplicates
if multiplayer.has_multiplayer_peer() and multiplayer.is_server():
var trap_exp_reward = 8.0 # EXP reward for disarming a trap
var all_players = get_tree().get_nodes_in_group("player")
var valid_players = []
for player in all_players:
if is_instance_valid(player) and player.character_stats:
valid_players.append(player)
if valid_players.size() > 0:
# Split EXP evenly among all players
var exp_per_player = trap_exp_reward / valid_players.size()
for player in valid_players:
player.character_stats.add_xp(exp_per_player)
LogManager.log("Trap disarmed: granted " + str(exp_per_player) + " EXP to " + str(player.name) + " (shared from " + str(trap_exp_reward) + " total)", LogManager.CATEGORY_ENEMY)
# Sync EXP to client if this player belongs to a client
var player_peer_id = player.get_multiplayer_authority()
if player_peer_id != 0 and player_peer_id != multiplayer.get_unique_id() and player.has_method("_sync_stats_update"):
var coins = player.character_stats.coin if "coin" in player.character_stats else 0
var xp = player.character_stats.xp if "xp" in player.character_stats else 0.0
player._sync_stats_update.rpc_id(player_peer_id, player.character_stats.kills, coins, xp)
# Show floating EXP text at trap position and sync to all clients
# Show locally first
_show_exp_number(exp_per_player, global_position)
# Sync to all clients via game_world
var game_world = get_tree().get_first_node_in_group("game_world")
if game_world and game_world.has_method("_sync_exp_text_at_position") and multiplayer.has_multiplayer_peer():
game_world._sync_exp_text_at_position.rpc(exp_per_player, global_position)
# Sync disarm to all clients (including host when joiner disarms)
if multiplayer.has_multiplayer_peer() and is_inside_tree() and is_instance_valid(self):
var game_world = get_tree().get_first_node_in_group("game_world")
@@ -291,6 +323,38 @@ func _sync_trap_disarmed() -> void:
if activation_area:
activation_area.monitoring = false
func _show_exp_number(amount: float, exp_pos: Vector2):
# Show EXP number (green, using dmg_numbers.png font) at position
var damage_number_scene = preload("res://scenes/damage_number.tscn")
if not damage_number_scene:
return
var exp_label = damage_number_scene.instantiate()
if not exp_label:
return
# Set text and color for EXP (green)
exp_label.label = "+" + str(int(amount)) + " EXP"
exp_label.color = Color(0.4, 1.0, 0.4) # Bright green
exp_label.z_index = 5
# Direction is straight up
exp_label.direction = Vector2(0, -1)
# Position at the specified location
var game_world = get_tree().get_first_node_in_group("game_world")
if game_world:
var entities_node = game_world.get_node_or_null("Entities")
if entities_node:
entities_node.add_child(exp_label)
exp_label.global_position = exp_pos + Vector2(0, -20) # Slightly above
else:
get_tree().current_scene.add_child(exp_label)
exp_label.global_position = exp_pos + Vector2(0, -20)
else:
get_tree().current_scene.add_child(exp_label)
exp_label.global_position = exp_pos + Vector2(0, -20)
func _show_floating_text(text: String, color: Color) -> void:
var floating_text_scene = preload("res://scenes/floating_text.tscn")
if floating_text_scene: