diff options
Diffstat (limited to 'client/player')
-rw-r--r-- | client/player/character/character.gd | 106 | ||||
-rw-r--r-- | client/player/character/character.tscn | 8 | ||||
-rw-r--r-- | client/player/controllable_player.gd | 13 | ||||
-rw-r--r-- | client/player/player.gd | 2 |
4 files changed, 72 insertions, 57 deletions
diff --git a/client/player/character/character.gd b/client/player/character/character.gd index 66a3435b..65275549 100644 --- a/client/player/character/character.gd +++ b/client/player/character/character.gd @@ -42,11 +42,16 @@ var current_animation := "idle" @onready var tie = $Main/Tie @onready var knife = $Main/HandRight/Knife -@onready var hairstyles := { - "Brown": $Main/HeadDefault/Hair, - "Blond": $Main/HeadDefault/Hair2, - "E. Parsley": $Main/HeadDefault/Hair3 -} +const NUM_COLORS = 5; +const NUM_HAIRS = 3; +@onready var hairstyles := [$Main/HeadDefault/Hair, $Main/HeadDefault/Hair2, $Main/HeadDefault/Hair3] +var colors = [ + Color(0.204, 0.361, 0.624), + Color(0.568, 0.256, 0.602), + Color(0.575, 0.341, 0.117), + Color(0.3, 0.455, 0.221), + Color(0.101, 0.452, 0.521) +] @onready var head_default: MeshInstance3D = $Main/HeadDefault @onready var head_robot: MeshInstance3D = $Main/HeadRobot @@ -54,28 +59,41 @@ var current_animation := "idle" @onready var step_sounds: PlayRandom = $Steps @onready var boost_sounds: PlayRandom = $Boosts +class ParsedStyle: + var color: int + var hair: int + var robot: bool + var customer: bool + func _init(n: int) -> void: + customer = n < 0 + if customer: n *= -1 + if n == 51: robot = true + else: + hair = n % NUM_HAIRS + color = n / NUM_HAIRS % NUM_COLORS + func pack() -> int: + if robot: return 51 + return (hair + color * NUM_HAIRS) * (-1 if customer else 1) + func _ready(): play_animation("idle") var t := 0.0 func _process(delta): - if walking: - t += delta - main_height_target = default_height + sin(t * WALK_ANIM_SPEED) * WALK_ANIM_STRENGTH - else: - t = 0 + t += delta + if walking: main_height_target = default_height + sin(t * WALK_ANIM_SPEED) * WALK_ANIM_STRENGTH + else: t = 0 main.position.y = main_height_target # Update animation: var next_animation: String - if holding: - next_animation = "hold" - elif cutting: - next_animation = "cut" - elif walking: - next_animation = "walk" - else: - next_animation = "idle" + if holding: next_animation = "hold" + elif cutting: next_animation = "cut" + elif walking: next_animation = "walk" + else: next_animation = "idle" + + if current_animation != next_animation: + play_animation(next_animation) walking_particles.emitting = walking if boosting and walking and not was_boosting: @@ -85,47 +103,31 @@ func _process(delta): boosting_particles.emitting = false was_boosting = boosting and walking - if current_animation != next_animation: - play_animation(next_animation) - -func select_hairstyle(id: int): - if id == 51: - toggle_robot(true) - return - if id < 0: - to_customer() - id *= -1 - var hairstyle_count = hairstyles.keys().size() - id = id % hairstyle_count - var target = hairstyles.keys()[id] - for k in hairstyles.keys(): - if k == target: - hairstyles[k].show() - else: - hairstyles[k].hide() - -func to_customer(): - main.mesh = CUSTOMER_MAIN_MESH - tie.queue_free() +func set_style(id: int): + var p = ParsedStyle.new(id) + set_customer(p.customer) + set_robot(p.robot) + for h in hairstyles: h.hide() + hairstyles[p.hair].show() + $Main.get_active_material(0).albedo_color = colors[p.color] -func toggle_robot(b: bool): +func set_customer(b: bool): if b: - head_robot.show() - head_default.hide() - main.mesh = ROBOT_MAIN_MESH - else: - head_robot.hide() - head_default.show() - main.mesh = DEFAULT_MAIN_MESH + main.mesh = CUSTOMER_MAIN_MESH + tie.queue_free() + else: pass # TODO + +func set_robot(b: bool): + head_robot.visible = b + head_default.visible = not b + main.mesh = ROBOT_MAIN_MESH if b else DEFAULT_MAIN_MESH func play_animation(name_: String): current_animation = name_ hand_animations.play(name_) - if name_ == "walk": - step_sounds.start_autoplay() - else: - step_sounds.stop_autoplay() + if name_ == "walk": step_sounds.start_autoplay() + else: step_sounds.stop_autoplay() knife.visible = name_ == "cut" diff --git a/client/player/character/character.tscn b/client/player/character/character.tscn index a7c09c01..aca0658a 100644 --- a/client/player/character/character.tscn +++ b/client/player/character/character.tscn @@ -1,4 +1,4 @@ -[gd_scene load_steps=27 format=3 uid="uid://b3hhir2fvnunu"] +[gd_scene load_steps=28 format=3 uid="uid://b3hhir2fvnunu"] [ext_resource type="Script" path="res://player/character/character.gd" id="1_12lbh"] [ext_resource type="ArrayMesh" uid="uid://bnmm01yjwultj" path="res://player/character/default/main.res" id="2_uovyg"] @@ -18,6 +18,11 @@ [ext_resource type="AudioStream" uid="uid://1jsqpnk3igj3" path="res://player/sounds/woosh1.ogg" id="14_ikcec"] [ext_resource type="AudioStream" uid="uid://cwme7eatip0jc" path="res://player/sounds/woosh2.ogg" id="15_iv4wu"] +[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_7ojaw"] +resource_local_to_scene = true +resource_name = "main" +cull_mode = 2 + [sub_resource type="Animation" id="Animation_tdhvg"] length = 0.001 tracks/0/type = "bezier" @@ -729,6 +734,7 @@ script = ExtResource("1_12lbh") transform = Transform3D(0.33, 0, 0, 0, 0.33, 0, 0, 0, 0.33, 0, 0.33, 0) mesh = ExtResource("2_uovyg") skeleton = NodePath("") +surface_material_override/0 = SubResource("StandardMaterial3D_7ojaw") [node name="HandRight" type="MeshInstance3D" parent="Main"] transform = Transform3D(0.287144, 0.2864, -1.17785e-06, 0.402357, -0.133775, 0.337554, 0.292329, -0.0971941, -0.464603, -1.302, -0.17, 0) diff --git a/client/player/controllable_player.gd b/client/player/controllable_player.gd index 0cabcb64..131bc55d 100644 --- a/client/player/controllable_player.gd +++ b/client/player/controllable_player.gd @@ -43,7 +43,7 @@ func _ready(): add_child(timer) timer.start() timer.connect("timeout", func(): - if game.mp != null and game.join_sent: + if game.mp != null and game.join_state == Game.JoinState.JOINED: game.mp.send_movement(game.player_id, position_, direction, boosting) ) add_child(onscreen_controls) @@ -60,13 +60,20 @@ func _process(delta): update_touch_scrolls() var moving_duration = 0 +var fps_rotation_target = 0 func _process_movement(delta): var input = Input.get_vector("left", "right", "forwards", "backwards") if is_input_enabled() else Vector2.ZERO if Global.get_setting("gameplay.first_person"): - input.x *= 0.1 + fps_rotation_target += input.x * delta * 3. + if abs(input.x) > 0.1: input.y -= 0.5 + input.x = 0. input.y = min(input.y, 0) + input = input.rotated(fps_rotation_target) + else: + input = input.rotated(input_rotation) + var boost = Input.is_action_pressed("boost") or (Global.get_setting("gameplay.latch_boost") and boosting) - input = input.rotated(input_rotation) + # if Input.is_action_pressed("interact") or Input.is_action_just_released("interact"): input *= 0 else: diff --git a/client/player/player.gd b/client/player/player.gd index 31a7a337..6ff28e81 100644 --- a/client/player/player.gd +++ b/client/player/player.gd @@ -79,7 +79,7 @@ func _init(_id: int, new_name: String, pos: Vector2, new_character_idx: int, new is_customer = character_idx < 0 func _ready(): - character.select_hairstyle(character_idx) + character.set_style(character_idx) clear_timer.timeout.connect(clear_message) Settings.hook_changed_init("gameplay.usernames", false, update_username_tag) |