diff options
Diffstat (limited to 'Scripts/Player')
-rw-r--r-- | Scripts/Player/PlayerAction.gd | 46 | ||||
-rw-r--r-- | Scripts/Player/PlayerAction.gd.uid | 1 | ||||
-rw-r--r-- | Scripts/Player/PlayerDeath.gd | 8 | ||||
-rw-r--r-- | Scripts/Player/PlayerDeath.gd.uid | 1 | ||||
-rw-r--r-- | Scripts/Player/PlayerInventory.gd | 89 | ||||
-rw-r--r-- | Scripts/Player/PlayerInventory.gd.uid | 1 | ||||
-rw-r--r-- | Scripts/Player/PlayerMovement.gd | 146 | ||||
-rw-r--r-- | Scripts/Player/PlayerMovement.gd.uid | 1 |
8 files changed, 293 insertions, 0 deletions
diff --git a/Scripts/Player/PlayerAction.gd b/Scripts/Player/PlayerAction.gd new file mode 100644 index 0000000..989823a --- /dev/null +++ b/Scripts/Player/PlayerAction.gd @@ -0,0 +1,46 @@ +extends Node +class_name PlayerAction + +@export var plr_sprite : Sprite2D +@export var hand_pivot : Node2D +@export var curr_weapon : Node2D +@export var machette_pivot : Node2D +@export var machette : Node2D + +var can_attack : bool = true + +var delta_pos : Vector2 + +func _process(_delta: float) -> void: + if UIConnector.is_inv_open: + return + + var hpos : Vector2 = hand_pivot.get_global_transform_with_canvas().get_origin() + var mouse_position : Vector2 = get_viewport().get_mouse_position() + delta_pos = mouse_position - hpos + + var angle = rad_to_deg(atan2(delta_pos.y, delta_pos.x)) - 90 + hand_pivot.rotation_degrees = angle + if angle <= 0 && angle >= -180: + if machette_pivot.rotation_degrees < 0: machette_pivot.rotation_degrees *= -1 + if machette.scale.x < 0: machette.scale.x *= -1 + elif (angle <= -180 && angle >= -270) || (angle >= 0 && angle <= 90): + if machette_pivot.rotation_degrees > 0: machette_pivot.rotation_degrees *= -1 + if machette.scale.x > 0: machette.scale.x *= -1 + +func _input(_event: InputEvent) -> void: + if UIConnector.is_inv_open: + return + + if Input.is_action_just_pressed("action") && can_attack: + if delta_pos.x < 0 && !plr_sprite.flip_h: + $"../PlayerMovement".look_left(true) + elif delta_pos.x > 0 && plr_sprite.flip_h: + $"../PlayerMovement".look_right(true) + + curr_weapon.action() + can_attack = false + $"Cooldown".start() + +func _on_cooldown_timeout() -> void: + can_attack = true diff --git a/Scripts/Player/PlayerAction.gd.uid b/Scripts/Player/PlayerAction.gd.uid new file mode 100644 index 0000000..00777f8 --- /dev/null +++ b/Scripts/Player/PlayerAction.gd.uid @@ -0,0 +1 @@ +uid://f4kopug5xiuj diff --git a/Scripts/Player/PlayerDeath.gd b/Scripts/Player/PlayerDeath.gd new file mode 100644 index 0000000..5df4fbf --- /dev/null +++ b/Scripts/Player/PlayerDeath.gd @@ -0,0 +1,8 @@ +extends Node + +@export var player : CharacterBody2D + +func _on_player_entity_death() -> void: + player.visible = false + player.process_mode = Node.PROCESS_MODE_DISABLED + UIConnector.death() diff --git a/Scripts/Player/PlayerDeath.gd.uid b/Scripts/Player/PlayerDeath.gd.uid new file mode 100644 index 0000000..1d6d4b1 --- /dev/null +++ b/Scripts/Player/PlayerDeath.gd.uid @@ -0,0 +1 @@ +uid://dovejm1jxwfrp diff --git a/Scripts/Player/PlayerInventory.gd b/Scripts/Player/PlayerInventory.gd new file mode 100644 index 0000000..76ad2ec --- /dev/null +++ b/Scripts/Player/PlayerInventory.gd @@ -0,0 +1,89 @@ +extends Node +class_name PlayerInventory + +@export var action : PlayerAction +@export var machette_pivot : Node2D + +@export var bow : Node2D +@export var bow_cooldown : float = 0.35 +@export var machette : Node2D +@export var machette_cooldown : float = 0.2 + +@export var masks : Array[Node2D] + + +enum MaskType { + Dash = 0, + Grapple = 1, + Freeze = 3, + Minions = 2, +} + +var prev_inv : Array[int] = [-1, -1, -1, -1, -1, -1] + +@export var mask_inventory : Array[int] = [-1, -1, -1, -1, -1, -1] + +var has_machette : bool = false +var using_bow : bool = true + +func _ready(): + UIConnector.update_masks(mask_inventory) + +func _input(_event: InputEvent) -> void: + if Input.is_action_just_pressed("switch_tool") && has_machette: + UIConnector.switch_tool() + + if using_bow: + action.curr_weapon = machette + machette_pivot.visible = true + bow.visible = false + machette.process_mode = Node.PROCESS_MODE_INHERIT + bow.process_mode = Node.PROCESS_MODE_DISABLED + action.get_node("Cooldown").wait_time = machette_cooldown + else: + action.curr_weapon = bow + machette_pivot.visible = false + bow.visible = true + machette.process_mode = Node.PROCESS_MODE_DISABLED + bow.process_mode = Node.PROCESS_MODE_INHERIT + action.get_node("Cooldown").wait_time = bow_cooldown + + using_bow = !using_bow + + if Input.is_action_just_pressed("switch_mask"): + var curr_mask = mask_inventory[0] + mask_inventory[0] = mask_inventory[1] + mask_inventory[1] = curr_mask + UIConnector.update_masks(mask_inventory) + $"../PlayerMovement".grapple_velocity = Vector2.ZERO + +func _process(_delta: float) -> void: + if prev_inv.hash() != mask_inventory.hash(): + print("changed") + for mask in masks: + mask.visible = false + mask.process_mode = Node.PROCESS_MODE_DISABLED + if mask_inventory[0] != -1: + print("YEAH") + masks[mask_inventory[0]].visible = true + masks[mask_inventory[0]].process_mode = Node.PROCESS_MODE_INHERIT + + prev_inv = mask_inventory.duplicate() + +func give_machette() -> void: + has_machette = true + UIConnector.add_machette() + +func ungive_machette() -> void: + has_machette = false + UIConnector.remove_machette() + +func add_mask(mask : MaskType): + print("the mask is ", mask) + if !(mask in mask_inventory): + for i in range(2, 6): + if mask_inventory[i] == -1: + mask_inventory[i] = mask + break + UIConnector.update_masks(mask_inventory) + UIConnector.show_mask_bubble() diff --git a/Scripts/Player/PlayerInventory.gd.uid b/Scripts/Player/PlayerInventory.gd.uid new file mode 100644 index 0000000..e1d5bbd --- /dev/null +++ b/Scripts/Player/PlayerInventory.gd.uid @@ -0,0 +1 @@ +uid://bmx4fy618slwb diff --git a/Scripts/Player/PlayerMovement.gd b/Scripts/Player/PlayerMovement.gd new file mode 100644 index 0000000..648a5e6 --- /dev/null +++ b/Scripts/Player/PlayerMovement.gd @@ -0,0 +1,146 @@ +extends Node +class_name PlayerMovement + +@export var character : CharacterBody2D + +@export var speed = 300.0 +@export var jump_vel = -400.0 + +@export var plr_sprite : Sprite2D +@export var mask_node : Node2D +@export var hand_pivot : Node2D + +@export var cape : Sprite2D +@export var skew_min : float +@export var skew_max : float +@export var skew_maxmax : float +@export var lerp_step_on : float +@export var lerp_step_off : float + +var target_skew = 0.0 +var curr_step = 0.0 + +@export var min_knock = 100 +@export var knockback_decay = 1.3 +var knockback : Vector2 + +var dir_manipulated : bool = false + +var dash_timer : Timer +var dashing : bool = false +var dash_dir : int = 0 +@export var dash_time : float = 0.2 +@export var dash_speed : float = 1500 + +var grapple_velocity : Vector2 = Vector2.ZERO +var grapple_x_vel_aft : float = 0 + +func _ready() -> void: + dash_timer = Timer.new() + dash_timer.wait_time = dash_time + dash_timer.one_shot = true + dash_timer.timeout.connect(_on_dash_end) + add_child(dash_timer) + + manipulate_timer = Timer.new() + add_child(manipulate_timer) + manipulate_timer.wait_time = 0.5 + manipulate_timer.one_shot = true + manipulate_timer.timeout.connect(_on_manipulate_end) + + +func _physics_process(delta: float) -> void: + if knockback.length_squared() > min_knock**2: + knockback /= knockback_decay + character.velocity = knockback + character.move_and_slide() + return + + if grapple_velocity != Vector2.ZERO: + character.velocity = grapple_velocity + character.move_and_slide() + return + + # Add the gravity. + if not character.is_on_floor(): + character.velocity += character.get_gravity() * delta + + if dashing: + character.velocity.x = 1000 * dash_dir + character.move_and_slide() + return + + # Handle jump. + if Input.is_action_just_pressed("jump") and character.is_on_floor(): + character.velocity.y = jump_vel + + # Get the input direction and handle the movement/deceleration. + # As good practice, you should replace UI actions with custom gameplay actions. + var direction := Input.get_axis("left", "right") + if direction: + grapple_x_vel_aft = 0 + character.velocity.x = direction * speed + if character.velocity.y < 0: + target_skew = skew_min + elif character.is_on_floor(): + target_skew = skew_max + curr_step = lerp_step_on + else: + if grapple_x_vel_aft != 0: + grapple_x_vel_aft = move_toward(character.velocity.x, 0, speed * delta) + character.velocity.x = grapple_x_vel_aft + else: + character.velocity.x = move_toward(character.velocity.x, 0, speed) + target_skew = skew_min + curr_step = lerp_step_off + + if character.velocity.y > 0: + target_skew = skew_maxmax + curr_step = lerp_step_off + + cape.skew = lerp_angle(cape.skew, deg_to_rad(target_skew), curr_step) + + if direction == -1 && !dir_manipulated: look_left() + elif direction == 1 && !dir_manipulated: look_right() + + character.move_and_slide() + +var manipulate_timer : Timer + +func look_left(manipulate : bool = false) -> void: + if manipulate: + dir_manipulated = true + manipulate_timer.start() + + if cape.skew > 0: cape.skew = -cape.skew + if skew_min > 0: skew_min = -skew_min + if skew_max > 0: skew_max = -skew_max + if skew_maxmax > 0: skew_maxmax = -skew_maxmax + if mask_node.position.x > 0: mask_node.position.x *= -1 + if hand_pivot.position.x > 0: hand_pivot.position.x *= -1 + plr_sprite.flip_h = true + + +func look_right(manipulate : bool = false) -> void: + if manipulate: + dir_manipulated = true + manipulate_timer.start() + + if cape.skew < 0: cape.skew = -cape.skew + if skew_min < 0: skew_min = -skew_min + if skew_max < 0: skew_max = -skew_max + if skew_maxmax < 0: skew_maxmax = -skew_maxmax + if mask_node.position.x < 0: mask_node.position.x *= -1 + if hand_pivot.position.x < 0: hand_pivot.position.x *= -1 + plr_sprite.flip_h = false + +func dash(dir): + dashing = true + dash_dir = dir + dash_timer.start() + +func _on_manipulate_end() -> void: + dir_manipulated = false + +func _on_dash_end() -> void: + dashing = false diff --git a/Scripts/Player/PlayerMovement.gd.uid b/Scripts/Player/PlayerMovement.gd.uid new file mode 100644 index 0000000..8636702 --- /dev/null +++ b/Scripts/Player/PlayerMovement.gd.uid @@ -0,0 +1 @@ +uid://d1e1dfcab58lk |