From 13ccecad193c973fc8789eb4bb6e41eb866c6f1b Mon Sep 17 00:00:00 2001 From: Bingus_Violet Date: Mon, 26 Feb 2024 08:28:11 -0600 Subject: [PATCH] fun --- Core/Scripts/smoother.gd | 229 ++++++++++++++++++ Maps/Testing Purgatory.tscn | 17 +- Player/BasicCharacter/AnimationController.gd | 44 +++- Player/BasicCharacter/CameraController.gd | 4 - Player/BasicCharacter/Character.tscn | 47 +++- Player/BasicCharacter/CharacterController.gd | 67 +++-- Player/Camera/CameraController.gd | 10 + Player/Camera/camera.tscn | 9 + Player/GUI/GUI.tscn | 50 ++++ Player/GUI/GuiController.gd | 5 + Player/GUI/GuiRoot.gd | 13 + Player/GrappleHook/GrappleCenter.png | Bin 0 -> 121 bytes Player/GrappleHook/GrappleCenter.png.import | 34 +++ Player/GrappleHook/GrappleHook.gd | 93 +++++++ .../GrappleHookProjectile/Grapple.png | Bin 0 -> 164 bytes .../GrappleHookProjectile/Grapple.png.import | 34 +++ .../GrappleHookProjectile.gd | 37 +++ .../GrappleHookProjectile.tscn | 43 ++++ .../GrappleHookProjectile/GrappleTether.kra | Bin 0 -> 32646 bytes .../GrappleHookProjectile/GrappleTether.png | Bin 0 -> 133 bytes .../GrappleTether.png.import | 34 +++ .../GrappleHookProjectile/GrappleTether.png~ | Bin 0 -> 143 bytes Player/GrappleHook/PullGrapple.kra | Bin 0 -> 37199 bytes Player/GrappleHook/PullGrapple.png~ | Bin 0 -> 119 bytes project.godot | 13 +- 25 files changed, 730 insertions(+), 53 deletions(-) create mode 100644 Core/Scripts/smoother.gd delete mode 100644 Player/BasicCharacter/CameraController.gd create mode 100644 Player/Camera/CameraController.gd create mode 100644 Player/Camera/camera.tscn create mode 100644 Player/GUI/GUI.tscn create mode 100644 Player/GUI/GuiController.gd create mode 100644 Player/GUI/GuiRoot.gd create mode 100644 Player/GrappleHook/GrappleCenter.png create mode 100644 Player/GrappleHook/GrappleCenter.png.import create mode 100644 Player/GrappleHook/GrappleHook.gd create mode 100644 Player/GrappleHook/GrappleHookProjectile/Grapple.png create mode 100644 Player/GrappleHook/GrappleHookProjectile/Grapple.png.import create mode 100644 Player/GrappleHook/GrappleHookProjectile/GrappleHookProjectile.gd create mode 100644 Player/GrappleHook/GrappleHookProjectile/GrappleHookProjectile.tscn create mode 100644 Player/GrappleHook/GrappleHookProjectile/GrappleTether.kra create mode 100644 Player/GrappleHook/GrappleHookProjectile/GrappleTether.png create mode 100644 Player/GrappleHook/GrappleHookProjectile/GrappleTether.png.import create mode 100644 Player/GrappleHook/GrappleHookProjectile/GrappleTether.png~ create mode 100644 Player/GrappleHook/PullGrapple.kra create mode 100644 Player/GrappleHook/PullGrapple.png~ diff --git a/Core/Scripts/smoother.gd b/Core/Scripts/smoother.gd new file mode 100644 index 0000000..b1b2fd5 --- /dev/null +++ b/Core/Scripts/smoother.gd @@ -0,0 +1,229 @@ +# MIT LICENSE +# +# Copyright 2022 Anatol Bogun +# +# Permission is hereby granted, free of charge, to any person obtaining a copy of this software and +# associated documentation files (the "Software"), to deal in the Software without restriction, +# including without limitation the rights to use, copy, modify, merge, publish, distribute, +# sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all copies or +# substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT +# NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +# DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + +class_name Smoother extends Node + +## Smoother Node +## Version: 1.0.4 +## +## A node type that smoothes scene nodes' properties by interpolating _physics_process steps. +## +## For documentation please visit https://github.com/anatolbogun/godot-smoother-node . + +## Node properties that are interpolated. +## Defaults to ["position"], even if not displayed in the inspector. +@export var properties:Array[String] = ["position"] + +## Apply interpolation to this node's parent. +@export var smooth_parent: = true : + set (value): + if value == false: + # remove parent from _properties in case this gets toggled on and off during runtime + _properties.erase(get_parent()) + + smooth_parent = value + +## Apply interpolation to the recursive children of this node's parent. +@export var recursive: = true + +## Explicitly include node paths in addition to the nodes that are included by other Smoother +## settings. +@export var includes:Array[NodePath] = [] + +## Explicitly exclude node paths. +## This will exclude nodes that would otherwise be included by other settings. +@export var excludes:Array[NodePath] = [] + +# get an array of all currently smoothed nodes; mainly for debugging performance optimisations +var smoothed_nodes:Array[Node] : + get: + var parent: = get_parent() + return _get_physics_process_nodes(parent, !smooth_parent) if parent != null else [] as Array[Node] + +var _properties: = {} +var _physics_process_nodes:Array[Node] +var _physics_process_just_updated: = false + + +## Reset all smoothed nodes. +func reset() -> void: + _properties.clear() + + +## Reset a specific node. You may want to call this when a node gets teleported. +func reset_node(node:Node) -> void: + _properties.erase(node) + + +## Reset a specific Node by NodePath. You may want to call this when a Node gets teleported. +func reset_node_path(path:NodePath) -> void: + var node: = get_node_or_null(path) + + if node != null: + reset_node(node) + + +## Add a Node to the includes Array[NodePath]. +func add_include_node(node:Node) -> Array[NodePath]: + return add_include_path(get_path_to(node)) + + +## Add a NodePath to the includes Array[NodePath]. +func add_include_path(path:NodePath) -> Array[NodePath]: + return _add_unique_to_array(includes, path) as Array[NodePath] + + +## Remove a Node from the includes Array[NodePath]. +func remove_include_node(node:Node) -> Array[NodePath]: + return remove_include_path(get_path_to(node)) + + +## Remove a NodePath from the includes Array[NodePath]. +func remove_include_path(path:NodePath) -> Array[NodePath]: + return _remove_all_from_array(includes, path) as Array[NodePath] + + +## Add a Node to the excludes Array[NodePath]. +func add_exclude_node(node:Node) -> Array[NodePath]: + return add_exclude_path(get_path_to(node)) + + +## Add a NodePath to the excludes Array[NodePath]. +func add_exclude_path(path:NodePath) -> Array[NodePath]: + return _add_unique_to_array(excludes, path) as Array[NodePath] + + +## Remove a Node from the excludes Array[NodePath]. +func remove_exclude_node(node:Node) -> Array[NodePath]: + return remove_exclude_path(get_path_to(node)) + + +## Remove a NodePath from the excludes Array[NodePath]. +func remove_exclude_path(path:NodePath) -> Array[NodePath]: + return _remove_all_from_array(excludes, path) as Array[NodePath] + + +## Add an item to an array unless the array already contains that item. +func _add_unique_to_array(array:Array, item:Variant) -> Array: + if !array.has(item): + array.push_back(item) + + return array + + +## Remove all array items that match item. +func _remove_all_from_array(array:Array, item:Variant) -> Array: + while array.has(item): + array.erase(item) + + return array + + +## Apply interpolation to all smoothed_nodes supported properties. +func _process(_delta: float) -> void: + for node in _physics_process_nodes: + if !_properties.has(node): continue + + for property in _properties[node]: + var values = _properties[node][property] + + if values.size() == 2: + if _physics_process_just_updated: + values[1] = node[property] + + node[property] = lerp(values[0], values[1], Engine.get_physics_interpolation_fraction()) + + _physics_process_just_updated = false + + +## Store all smoothed_nodes' relevant properties of the previous (origin) and this (target) +## _physics_process frames for interpolation in the upcoming _process frames and apply the origin +## values. +func _physics_process(_delta: float) -> void: + var parent: = get_parent() + if parent == null: return + + # move this node to the top of the parent tree (typically a scene's root node) so that it is + # called before all other _physics_processes + parent.move_child(self, 0) + + if smooth_parent: + process_priority = parent.process_priority - 1 + + # update the relevant nodes once per _physics_process + _physics_process_nodes = _get_physics_process_nodes(parent, !smooth_parent) + + # clean up _properties + for key in _properties.keys(): + if !_physics_process_nodes.has(key): + _properties.erase(key) + + for node in _physics_process_nodes: + if !_properties.has(node): + # called on the first frame after a node was added to _properties + _properties[node] = {} + + # clean up _properties when a node exited the tree + node.tree_exited.connect(func (): _properties.erase(node)) + + for property in properties: + if ! property in node: continue + + if !_properties[node].has(property): + # called on the first frame after a node was added to _properties + _properties[node][property] = [node[property]] + elif _properties[node][property].size() < 2: + # called on the second frame after a node was added to _properties + _properties[node][property].push_front(_properties[node][property][0]) + _properties[node][property][1] = node[property] + else: + _properties[node][property][0] = _properties[node][property][1] + node[property] = _properties[node][property][0] + + _physics_process_just_updated = true + + +## Get the relevant nodes to be smoothed based on this node's tree position and properties. +func _get_physics_process_nodes(node: Node, ignore_node: = false, with_includes: = true) -> Array[Node]: + var nodes:Array[Node] = [] + + nodes.assign(includes.map( + get_node_or_null + ).filter( + func (_node:Node) -> bool: return _node != null && !excludes.has(get_path_to(_node)) + ) if with_includes else []) + + if ( + !ignore_node + && node != self + && !node is RigidBody2D + && !node is RigidBody3D + && !nodes.has(node) + && !excludes.has(get_path_to(node)) + && node.has_method("_physics_process") + ): + nodes.push_back(node) + + if recursive: + for child in node.get_children(): + for nested_node in _get_physics_process_nodes(child, false, false): + _add_unique_to_array(nodes, nested_node) + + return nodes diff --git a/Maps/Testing Purgatory.tscn b/Maps/Testing Purgatory.tscn index d3bce56..d8796f0 100644 --- a/Maps/Testing Purgatory.tscn +++ b/Maps/Testing Purgatory.tscn @@ -1,7 +1,9 @@ -[gd_scene load_steps=5 format=3 uid="uid://cw55umm21amea"] +[gd_scene load_steps=7 format=3 uid="uid://cw55umm21amea"] [ext_resource type="Texture2D" uid="uid://dmlk63esqvmiv" path="res://Tilemaps/BasicSquare/Texture.png" id="1_8s7p6"] [ext_resource type="PackedScene" uid="uid://cqcjan67wgkc1" path="res://Player/BasicCharacter/Character.tscn" id="1_jcngi"] +[ext_resource type="Script" path="res://Core/Scripts/smoother.gd" id="3_16g5e"] +[ext_resource type="PackedScene" uid="uid://b6rvghqqnqqk1" path="res://Player/GUI/GUI.tscn" id="4_7j33c"] [sub_resource type="TileSetAtlasSource" id="TileSetAtlasSource_t1l2y"] texture = ExtResource("1_8s7p6") @@ -23,7 +25,8 @@ texture_region_size = Vector2i(32, 32) [sub_resource type="TileSet" id="TileSet_qp0ib"] tile_size = Vector2i(32, 32) -physics_layer_0/collision_layer = 1 +physics_layer_0/collision_layer = 5 +physics_layer_0/collision_mask = 5 terrain_set_0/mode = 0 terrain_set_0/terrain_0/name = "Terrain 0" terrain_set_0/terrain_0/color = Color(0.5, 0.34375, 0.25, 1) @@ -36,9 +39,10 @@ metadata/_edit_horizontal_guides_ = [15.0] [node name="TileMap" type="TileMap" parent="Map"] modulate = Color(0, 0, 0.486275, 1) +scale = Vector2(1.00629, 1.00935) tile_set = SubResource("TileSet_qp0ib") format = 2 -layer_0/tile_data = PackedInt32Array(589824, 0, 0, 589825, 0, 0, 589826, 0, 0, 589827, 0, 0, 589828, 0, 0, 589829, 0, 0, 589830, 0, 0, 589831, 0, 0, 589832, 0, 0, 589833, 0, 0, 589834, 0, 0, 589835, 0, 0, 589836, 0, 0, 589837, 0, 0, 589838, 0, 0, 589839, 0, 0, 589840, 0, 0, 589841, 0, 0, 655359, 0, 0, 655358, 0, 0, 655357, 0, 0, 655356, 0, 0, 655355, 0, 0, 655354, 0, 0, 655353, 0, 0, 655352, 0, 0, 655351, 0, 0, 589815, 0, 0, 589816, 0, 0, 589817, 0, 0, 589818, 0, 0, 589819, 0, 0, 589820, 0, 0, 589821, 0, 0, 589822, 0, 0, 589823, 0, 0, 524288, 0, 0, 524289, 0, 0, 524299, 0, 0, 524292, 0, 0, 524291, 0, 0, 524290, 0, 0, 524298, 0, 0, 524297, 0, 0, 524296, 0, 0, 524295, 0, 0, 524293, 0, 0, 524294, 0, 0, 524300, 0, 0, 524301, 0, 0, 524302, 0, 0, 524303, 0, 0, 524304, 0, 0, 524305, 0, 0, 524306, 0, 0, 589842, 0, 0, 655350, 0, 0, 589814, 0, 0, 524278, 0, 0, 458742, 0, 0, 393206, 0, 0, 327670, 0, 0, 262134, 0, 0, 196598, 0, 0, 131062, 0, 0, 65526, 0, 0, -10, 0, 0, -65546, 0, 0, -131082, 0, 0, -196618, 0, 0, -262154, 0, 0, 655349, 0, 0, 589813, 0, 0, 524277, 0, 0, 458741, 0, 0, 393205, 0, 0, 327669, 0, 0, 262133, 0, 0, 196597, 0, 0, 131061, 0, 0, 65525, 0, 0, -11, 0, 0, -65547, 0, 0, -131083, 0, 0, -196619, 0, 0, -262155, 0, 0, 655348, 0, 0, 589812, 0, 0, 655347, 0, 0, 589811, 0, 0, 655346, 0, 0, 589810, 0, 0, 655345, 0, 0, 589809, 0, 0, 655344, 0, 0, 589808, 0, 0, 655343, 0, 0, 589807, 0, 0, 655342, 0, 0, 589806, 0, 0, 655341, 0, 0, 589805, 0, 0, 655340, 0, 0, 589804, 0, 0, 655339, 0, 0, 589803, 0, 0, 655338, 0, 0, 589802, 0, 0, 458764, 0, 0, 393228, 0, 0, 327692, 0, 0, 262156, 0, 0, 196620, 0, 0, 131084, 0, 0, 65548, 0, 0, 12, 0, 0, 458763, 0, 0, 393227, 0, 0, 327691, 0, 0, 262155, 0, 0, 196619, 0, 0, 131083, 0, 0, 65547, 0, 0, 11, 0, 0, 589852, 0, 0, 524316, 0, 0, 589851, 0, 0, 524315, 0, 0, 589850, 0, 0, 524314, 0, 0, 589849, 0, 0, 524313, 0, 0, 589848, 0, 0, 524312, 0, 0, 589847, 0, 0, 524311, 0, 0, 589846, 0, 0, 524310, 0, 0, 589845, 0, 0, 524309, 0, 0, 589844, 0, 0, 524308, 0, 0, 589843, 0, 0, 524307, 0, 0) +layer_0/tile_data = PackedInt32Array(589824, 0, 0, 589825, 0, 0, 589826, 0, 0, 589827, 0, 0, 589828, 0, 0, 589829, 0, 0, 589830, 0, 0, 589831, 0, 0, 589832, 0, 0, 589833, 0, 0, 589834, 0, 0, 589835, 0, 0, 589836, 0, 0, 589837, 0, 0, 589838, 0, 0, 589839, 0, 0, 589840, 0, 0, 589841, 0, 0, 655359, 0, 0, 655358, 0, 0, 655357, 0, 0, 655356, 0, 0, 655355, 0, 0, 655354, 0, 0, 655353, 0, 0, 655352, 0, 0, 655351, 0, 0, 589815, 0, 0, 589816, 0, 0, 589817, 0, 0, 589818, 0, 0, 589819, 0, 0, 589820, 0, 0, 589821, 0, 0, 589822, 0, 0, 589823, 0, 0, 524288, 0, 0, 524289, 0, 0, 524299, 0, 0, 524292, 0, 0, 524291, 0, 0, 524290, 0, 0, 524298, 0, 0, 524297, 0, 0, 524296, 0, 0, 524295, 0, 0, 524293, 0, 0, 524294, 0, 0, 524300, 0, 0, 524301, 0, 0, 524302, 0, 0, 524303, 0, 0, 524304, 0, 0, 524305, 0, 0, 524306, 0, 0, 589842, 0, 0, 655350, 0, 0, 589814, 0, 0, 524278, 0, 0, 458742, 0, 0, 393206, 0, 0, 327670, 0, 0, 262134, 0, 0, 196598, 0, 0, 131062, 0, 0, 65526, 0, 0, -10, 0, 0, -65546, 0, 0, -131082, 0, 0, -196618, 0, 0, -262154, 0, 0, 655349, 0, 0, 589813, 0, 0, 524277, 0, 0, 458741, 0, 0, 393205, 0, 0, 327669, 0, 0, 262133, 0, 0, 196597, 0, 0, 131061, 0, 0, 65525, 0, 0, -11, 0, 0, -65547, 0, 0, -131083, 0, 0, -196619, 0, 0, -262155, 0, 0, 655348, 0, 0, 589812, 0, 0, 655347, 0, 0, 589811, 0, 0, 655346, 0, 0, 589810, 0, 0, 655345, 0, 0, 589809, 0, 0, 655344, 0, 0, 589808, 0, 0, 655343, 0, 0, 589807, 0, 0, 655342, 0, 0, 589806, 0, 0, 655341, 0, 0, 589805, 0, 0, 655340, 0, 0, 589804, 0, 0, 655339, 0, 0, 589803, 0, 0, 655338, 0, 0, 589802, 0, 0, 458764, 0, 0, 393228, 0, 0, 327692, 0, 0, 262156, 0, 0, 196620, 0, 0, 131084, 0, 0, 65548, 0, 0, 12, 0, 0, 458763, 0, 0, 393227, 0, 0, 327691, 0, 0, 262155, 0, 0, 196619, 0, 0, 131083, 0, 0, 65547, 0, 0, 11, 0, 0, 589852, 0, 0, 524316, 0, 0, 589851, 0, 0, 524315, 0, 0, 589850, 0, 0, 524314, 0, 0, 589849, 0, 0, 524313, 0, 0, 589848, 0, 0, 524312, 0, 0, 589847, 0, 0, 524311, 0, 0, 589846, 0, 0, 524310, 0, 0, 589845, 0, 0, 524309, 0, 0, 589844, 0, 0, 524308, 0, 0, 589843, 0, 0, 524307, 0, 0, 655337, 0, 0, 589801, 0, 0, 655336, 0, 0, 589800, 0, 0, 655335, 0, 0, 589799, 0, 0, 655334, 0, 0, 589798, 0, 0, 655333, 0, 0, 589797, 0, 0, 655332, 0, 0, 589796, 0, 0, 655331, 0, 0, 589795, 0, 0, 655330, 0, 0, 589794, 0, 0, 655329, 0, 0, 589793, 0, 0, 655328, 0, 0, 589792, 0, 0, 655327, 0, 0, 589791, 0, 0, 655326, 0, 0, 589790, 0, 0, 655325, 0, 0, 589789, 0, 0, 655324, 0, 0, 589788, 0, 0, 655323, 0, 0, 589787, 0, 0, 655322, 0, 0, 589786, 0, 0, 655321, 0, 0, 589785, 0, 0, 655320, 0, 0, 589784, 0, 0, 655319, 0, 0, 589783, 0, 0, 655318, 0, 0, 589782, 0, 0, 655317, 0, 0, 589781, 0, 0, 655316, 0, 0, 589780, 0, 0, 655315, 0, 0, 589779, 0, 0, 655314, 0, 0, 589778, 0, 0, 655313, 0, 0, 589777, 0, 0, 655312, 0, 0, 589776, 0, 0, 655311, 0, 0, 589775, 0, 0, 655310, 0, 0, 589774, 0, 0, 655309, 0, 0, 589773, 0, 0, 655308, 0, 0, 589772, 0, 0, 655307, 0, 0, 589771, 0, 0, 655306, 0, 0, 589770, 0, 0, 655305, 0, 0, 589769, 0, 0, 655304, 0, 0, 589768, 0, 0, 655303, 0, 0, 589767, 0, 0, 655302, 0, 0, 589766, 0, 0, 655301, 0, 0, 589765, 0, 0, 655300, 0, 0, 589764, 0, 0, 655299, 0, 0, 589763, 0, 0, 655298, 0, 0, 589762, 0, 0, 655297, 0, 0, 589761, 0, 0, 655296, 0, 0, 589760, 0, 0, 655295, 0, 0, 589759, 0, 0, 655294, 0, 0, 589758, 0, 0, 655293, 0, 0, 589757, 0, 0, 655292, 0, 0, 589756, 0, 0, 655291, 0, 0, 589755, 0, 0, 655290, 0, 0, 589754, 0, 0, 655289, 0, 0, 589753, 0, 0, 655288, 0, 0, 589752, 0, 0, 655287, 0, 0, 589751, 0, 0, 655286, 0, 0, 589750, 0, 0, 655285, 0, 0, 589749, 0, 0, 655284, 0, 0, 589748, 0, 0, 655283, 0, 0, 589747, 0, 0, 655282, 0, 0, 589746, 0, 0, 655281, 0, 0, 589745, 0, 0, 655280, 0, 0, 589744, 0, 0, 655279, 0, 0, 589743, 0, 0, 655278, 0, 0, 589742, 0, 0, 655277, 0, 0, 589741, 0, 0, 655276, 0, 0, 589740, 0, 0, 655275, 0, 0, 589739, 0, 0, 655274, 0, 0, 589738, 0, 0, 655273, 0, 0, 589737, 0, 0, 655272, 0, 0, 589736, 0, 0, 655271, 0, 0, 589735, 0, 0, 655270, 0, 0, 589734, 0, 0, 655269, 0, 0, 589733, 0, 0, 655268, 0, 0, 589732, 0, 0, 655267, 0, 0, 589731, 0, 0, 655266, 0, 0, 589730, 0, 0, 655265, 0, 0, 589729, 0, 0, 655264, 0, 0, 589728, 0, 0, 655263, 0, 0, 589727, 0, 0, 655262, 0, 0, 589726, 0, 0, 655261, 0, 0, 589725, 0, 0, 655260, 0, 0, 589724, 0, 0, 655259, 0, 0, 589723, 0, 0, 655258, 0, 0, 589722, 0, 0, 655257, 0, 0, 589721, 0, 0, 655256, 0, 0, 589720, 0, 0, 655255, 0, 0, 589719, 0, 0, 655254, 0, 0, 589718, 0, 0, 655253, 0, 0, 589717, 0, 0, 655252, 0, 0, 589716, 0, 0, 655251, 0, 0, 589715, 0, 0, 655250, 0, 0, 589714, 0, 0, 655249, 0, 0, 589713, 0, 0, 655248, 0, 0, 589712, 0, 0, 655247, 0, 0, 589711, 0, 0, 655246, 0, 0, 589710, 0, 0, 655245, 0, 0, 589709, 0, 0, 655244, 0, 0, 589708, 0, 0, 655243, 0, 0, 589707, 0, 0, 655242, 0, 0, 589706, 0, 0, 655241, 0, 0, 589705, 0, 0, 655240, 0, 0, 589704, 0, 0, 655239, 0, 0, 589703, 0, 0, 655238, 0, 0, 589702, 0, 0, 655237, 0, 0, 589701, 0, 0, 655236, 0, 0, 589700, 0, 0, 655235, 0, 0, 589699, 0, 0, 655234, 0, 0, 589698, 0, 0, 655233, 0, 0, 589697, 0, 0, 655232, 0, 0, 589696, 0, 0, 655231, 0, 0, 589695, 0, 0, 655230, 0, 0, 589694, 0, 0, 655229, 0, 0, 589693, 0, 0, 655228, 0, 0, 589692, 0, 0, 655227, 0, 0, 589691, 0, 0, 655226, 0, 0, 589690, 0, 0, 655225, 0, 0, 589689, 0, 0, 655224, 0, 0, 589688, 0, 0, 655223, 0, 0, 589687, 0, 0, 655222, 0, 0, 589686, 0, 0, 655221, 0, 0, 589685, 0, 0, 655220, 0, 0, 589684, 0, 0, 655219, 0, 0, 589683, 0, 0, 655218, 0, 0, 589682, 0, 0, 655217, 0, 0, 589681, 0, 0, 655216, 0, 0, 589680, 0, 0, 655215, 0, 0, 589679, 0, 0, 655214, 0, 0, 589678, 0, 0, 655213, 0, 0, 589677, 0, 0, 655212, 0, 0, 589676, 0, 0, 655211, 0, 0, 589675, 0, 0, 655210, 0, 0, 589674, 0, 0, 655209, 0, 0, 589673, 0, 0, 655208, 0, 0, 589672, 0, 0, 655207, 0, 0, 589671, 0, 0, 655206, 0, 0, 589670, 0, 0, 655205, 0, 0, 589669, 0, 0, 655204, 0, 0, 589668, 0, 0, 655203, 0, 0, 589667, 0, 0, 655202, 0, 0, 589666, 0, 0, 655201, 0, 0, 589665, 0, 0, 655200, 0, 0, 589664, 0, 0, 655199, 0, 0, 589663, 0, 0, 655198, 0, 0, 589662, 0, 0, 655197, 0, 0, 589661, 0, 0, 655196, 0, 0, 589660, 0, 0, 655195, 0, 0, 589659, 0, 0, 655194, 0, 0, 589658, 0, 0, 655193, 0, 0, 589657, 0, 0, 655192, 0, 0, 589656, 0, 0, 655191, 0, 0, 589655, 0, 0, 655190, 0, 0, 589654, 0, 0, 655189, 0, 0, 589653, 0, 0, 655188, 0, 0, 589652, 0, 0, 655187, 0, 0, 589651, 0, 0, 655186, 0, 0, 589650, 0, 0, 655185, 0, 0, 589649, 0, 0, 655184, 0, 0, 589648, 0, 0, 655183, 0, 0, 589647, 0, 0, 655182, 0, 0, 589646, 0, 0, 655181, 0, 0, 589645, 0, 0, 655180, 0, 0, 589644, 0, 0, 655179, 0, 0, 589643, 0, 0, 655178, 0, 0, 589642, 0, 0, 655177, 0, 0, 589641, 0, 0, 655176, 0, 0, 589640, 0, 0, 655175, 0, 0, 589639, 0, 0, 655174, 0, 0, 589638, 0, 0, 655173, 0, 0, 589637, 0, 0, 655172, 0, 0, 589636, 0, 0, 655171, 0, 0, 589635, 0, 0, 655170, 0, 0, 589634, 0, 0, 655169, 0, 0, 589633, 0, 0, 655168, 0, 0, 589632, 0, 0, 655167, 0, 0, 589631, 0, 0, 655166, 0, 0, 589630, 0, 0, 655165, 0, 0, 589629, 0, 0, 655164, 0, 0, 589628, 0, 0, 655163, 0, 0, 589627, 0, 0, 655162, 0, 0, 589626, 0, 0, 655161, 0, 0, 589625, 0, 0, 655160, 0, 0, 589624, 0, 0, 655159, 0, 0, 589623, 0, 0, 655158, 0, 0, 589622, 0, 0, 655157, 0, 0, 589621, 0, 0, 655156, 0, 0, 589620, 0, 0, 655155, 0, 0, 589619, 0, 0, 655154, 0, 0, 589618, 0, 0, 655153, 0, 0, 589617, 0, 0, 655152, 0, 0, 589616, 0, 0, 655151, 0, 0, 589615, 0, 0, 655150, 0, 0, 589614, 0, 0, 655149, 0, 0, 589613, 0, 0, 655148, 0, 0, 589612, 0, 0, 655147, 0, 0, 589611, 0, 0, 655146, 0, 0, 589610, 0, 0, 655145, 0, 0, 589609, 0, 0, 655144, 0, 0, 589608, 0, 0, 655143, 0, 0, 589607, 0, 0, 655142, 0, 0, 589606, 0, 0, 655141, 0, 0, 589605, 0, 0, 655140, 0, 0, 589604, 0, 0, 655139, 0, 0, 589603, 0, 0, 655138, 0, 0, 589602, 0, 0, 655137, 0, 0, 589601, 0, 0, 655136, 0, 0, 589600, 0, 0, 655135, 0, 0, 589599, 0, 0, 655134, 0, 0, 589598, 0, 0, 655133, 0, 0, 589597, 0, 0, 655132, 0, 0, 589596, 0, 0, 655131, 0, 0, 589595, 0, 0, 655130, 0, 0, 589594, 0, 0, 655129, 0, 0, 589593, 0, 0, 655128, 0, 0, 589592, 0, 0, 655127, 0, 0, 589591, 0, 0, 655126, 0, 0, 589590, 0, 0, 655125, 0, 0, 589589, 0, 0, 655124, 0, 0, 589588, 0, 0, 655123, 0, 0, 589587, 0, 0, 655122, 0, 0, 589586, 0, 0, 655121, 0, 0, 589585, 0, 0, 655120, 0, 0, 589584, 0, 0, 655119, 0, 0, 589583, 0, 0, 655118, 0, 0, 589582, 0, 0, 655117, 0, 0, 589581, 0, 0, 655116, 0, 0, 589580, 0, 0, 655115, 0, 0, 589579, 0, 0, 655114, 0, 0, 589578, 0, 0, 655113, 0, 0, 589577, 0, 0, 655112, 0, 0, 589576, 0, 0, 655111, 0, 0, 589575, 0, 0, 655110, 0, 0, 589574, 0, 0, 655109, 0, 0, 589573, 0, 0, 655108, 0, 0, 589572, 0, 0, 655107, 0, 0, 589571, 0, 0, 655106, 0, 0, 589570, 0, 0, 655105, 0, 0, 589569, 0, 0, 655104, 0, 0, 589568, 0, 0, 655103, 0, 0, 589567, 0, 0, 655102, 0, 0, 589566, 0, 0, 655101, 0, 0, 589565, 0, 0, 655100, 0, 0, 589564, 0, 0, 655099, 0, 0, 589563, 0, 0, 655098, 0, 0, 589562, 0, 0, 655097, 0, 0, 589561, 0, 0, 655096, 0, 0, 589560, 0, 0, 655095, 0, 0, 589559, 0, 0, 655094, 0, 0, 589558, 0, 0, 655093, 0, 0, 589557, 0, 0, 655092, 0, 0, 589556, 0, 0, 655091, 0, 0, 589555, 0, 0, 655090, 0, 0, 589554, 0, 0, 655089, 0, 0, 589553, 0, 0, 655088, 0, 0, 589552, 0, 0, 655087, 0, 0, 589551, 0, 0, 655086, 0, 0, 589550, 0, 0, 655085, 0, 0, 589549, 0, 0, 655084, 0, 0, 589548, 0, 0, 655083, 0, 0, 589547, 0, 0, 655082, 0, 0, 589546, 0, 0, 655081, 0, 0, 589545, 0, 0, 655080, 0, 0, 589544, 0, 0, 655079, 0, 0, 589543, 0, 0, 655078, 0, 0, 589542, 0, 0, 655077, 0, 0, 589541, 0, 0, 655076, 0, 0, 589540, 0, 0, 655075, 0, 0, 589539, 0, 0, 655074, 0, 0, 589538, 0, 0, 655073, 0, 0, 589537, 0, 0, 655072, 0, 0, 589536, 0, 0, 655071, 0, 0, 589535, 0, 0, 655070, 0, 0, 589534, 0, 0, 655069, 0, 0, 589533, 0, 0, 655068, 0, 0, 589532, 0, 0, 655067, 0, 0, 589531, 0, 0, 655066, 0, 0, 589530, 0, 0, 655065, 0, 0, 589529, 0, 0, 655064, 0, 0, 589528, 0, 0, 655063, 0, 0, 589527, 0, 0, 655062, 0, 0, 589526, 0, 0, 655061, 0, 0, 589525, 0, 0, 655060, 0, 0, 589524, 0, 0, 655059, 0, 0, 589523, 0, 0, 655058, 0, 0, 589522, 0, 0, 655057, 0, 0, 589521, 0, 0, 655056, 0, 0, 589520, 0, 0, 655055, 0, 0, 589519, 0, 0, 655054, 0, 0, 589518, 0, 0, 655053, 0, 0, 589517, 0, 0, 655052, 0, 0, 589516, 0, 0, 655051, 0, 0, 589515, 0, 0, 655050, 0, 0, 589514, 0, 0, 655049, 0, 0, 589513, 0, 0, 655048, 0, 0, 589512, 0, 0, 655047, 0, 0, 589511, 0, 0, 655046, 0, 0, 589510, 0, 0, 655045, 0, 0, 589509, 0, 0, 655044, 0, 0, 589508, 0, 0, 655043, 0, 0, 589507, 0, 0, 655042, 0, 0, 589506, 0, 0, 655041, 0, 0, 589505, 0, 0, 655040, 0, 0, 589504, 0, 0, 655039, 0, 0, 589503, 0, 0, 655038, 0, 0, 589502, 0, 0, 655037, 0, 0, 589501, 0, 0, 655036, 0, 0, 589500, 0, 0, 655035, 0, 0, 589499, 0, 0, 655034, 0, 0, 589498, 0, 0, 655033, 0, 0, 589497, 0, 0, 655032, 0, 0, 589496, 0, 0, 655031, 0, 0, 589495, 0, 0, 655030, 0, 0, 589494, 0, 0, 655029, 0, 0, 589493, 0, 0, 655028, 0, 0, 589492, 0, 0, 655027, 0, 0, 589491, 0, 0, 655026, 0, 0, 589490, 0, 0, 655025, 0, 0, 589489, 0, 0, 655024, 0, 0, 589488, 0, 0, 655023, 0, 0, 589487, 0, 0, 655022, 0, 0, 589486, 0, 0, 655021, 0, 0, 589485, 0, 0, 655020, 0, 0, 589484, 0, 0, 655019, 0, 0, 589483, 0, 0, 655018, 0, 0, 589482, 0, 0, 655017, 0, 0, 589481, 0, 0, 655016, 0, 0, 589480, 0, 0, 655015, 0, 0, 589479, 0, 0, 655014, 0, 0, 589478, 0, 0, 655013, 0, 0, 589477, 0, 0, 655012, 0, 0, 589476, 0, 0, 655011, 0, 0, 589475, 0, 0, 655010, 0, 0, 589474, 0, 0, 655009, 0, 0, 589473, 0, 0, 655008, 0, 0, 589472, 0, 0, 655007, 0, 0, 589471, 0, 0, 655006, 0, 0, 589470, 0, 0, 655005, 0, 0, 589469, 0, 0, 655004, 0, 0, 589468, 0, 0, 655003, 0, 0, 589467, 0, 0, 655002, 0, 0, 589466, 0, 0, 655001, 0, 0, 589465, 0, 0, 655000, 0, 0, 589464, 0, 0, 654999, 0, 0, 589463, 0, 0, 654998, 0, 0, 589462, 0, 0, 654997, 0, 0, 589461, 0, 0, 654996, 0, 0, 589460, 0, 0, 654995, 0, 0, 589459, 0, 0, 654994, 0, 0, 589458, 0, 0, 654993, 0, 0, 589457, 0, 0, 654992, 0, 0, 589456, 0, 0, 654991, 0, 0, 589455, 0, 0, 654990, 0, 0, 589454, 0, 0, 654989, 0, 0, 589453, 0, 0, 654988, 0, 0, 589452, 0, 0, 654987, 0, 0, 589451, 0, 0, 654986, 0, 0, 589450, 0, 0, 654985, 0, 0, 589449, 0, 0, 654984, 0, 0, 589448, 0, 0, 654983, 0, 0, 589447, 0, 0, 654982, 0, 0, 589446, 0, 0, 654981, 0, 0, 589445, 0, 0, 654980, 0, 0, 589444, 0, 0, 654979, 0, 0, 589443, 0, 0, 654978, 0, 0, 589442, 0, 0, 654977, 0, 0, 589441, 0, 0, 654976, 0, 0, 589440, 0, 0, 654975, 0, 0, 589439, 0, 0, 654974, 0, 0, 589438, 0, 0, 654973, 0, 0, 589437, 0, 0, 654972, 0, 0, 589436, 0, 0, 654971, 0, 0, 589435, 0, 0, 654970, 0, 0, 589434, 0, 0, 654969, 0, 0, 589433, 0, 0, 654968, 0, 0, 589432, 0, 0, 654967, 0, 0, 589431, 0, 0, 654966, 0, 0, 589430, 0, 0, 654965, 0, 0, 589429, 0, 0, 654964, 0, 0, 589428, 0, 0, 654963, 0, 0, 589427, 0, 0, 654962, 0, 0, 589426, 0, 0, 654961, 0, 0, 589425, 0, 0, 654960, 0, 0, 589424, 0, 0, 654959, 0, 0, 589423, 0, 0, 654958, 0, 0, 589422, 0, 0, 654957, 0, 0, 589421, 0, 0, 654956, 0, 0, 589420, 0, 0, 654955, 0, 0, 589419, 0, 0, 654954, 0, 0, 589418, 0, 0, 654953, 0, 0, 589417, 0, 0, 654952, 0, 0, 589416, 0, 0, 654951, 0, 0, 589415, 0, 0, 654950, 0, 0, 589414, 0, 0, 654949, 0, 0, 589413, 0, 0, 654948, 0, 0, 589412, 0, 0, 654947, 0, 0, 589411, 0, 0, 654946, 0, 0, 589410, 0, 0, 654945, 0, 0, 589409, 0, 0, 654944, 0, 0, 589408, 0, 0, 654943, 0, 0, 589407, 0, 0, 654942, 0, 0, 589406, 0, 0, 654941, 0, 0, 589405, 0, 0, 654940, 0, 0, 589404, 0, 0, 654939, 0, 0, 589403, 0, 0, 654938, 0, 0, 589402, 0, 0, 654937, 0, 0, 589401, 0, 0, 654936, 0, 0, 589400, 0, 0, 654935, 0, 0, 589399, 0, 0, 654934, 0, 0, 589398, 0, 0, 654933, 0, 0, 589397, 0, 0, 654932, 0, 0, 589396, 0, 0, 654931, 0, 0, 589395, 0, 0, 654930, 0, 0, 589394, 0, 0, 654929, 0, 0, 589393, 0, 0, 654928, 0, 0, 589392, 0, 0, 654927, 0, 0, 589391, 0, 0, 654926, 0, 0, 589390, 0, 0, 654925, 0, 0, 589389, 0, 0, 654924, 0, 0, 589388, 0, 0, 654923, 0, 0, 589387, 0, 0, 654922, 0, 0, 589386, 0, 0, 654921, 0, 0, 589385, 0, 0, 654920, 0, 0, 589384, 0, 0, 654919, 0, 0, 589383, 0, 0, 654918, 0, 0, 589382, 0, 0, 654917, 0, 0, 589381, 0, 0, 654916, 0, 0, 589380, 0, 0, 654915, 0, 0, 589379, 0, 0, 654914, 0, 0, 589378, 0, 0, 654913, 0, 0, 589377, 0, 0, 654912, 0, 0, 589376, 0, 0, 654911, 0, 0, 589375, 0, 0, 654910, 0, 0, 589374, 0, 0, 654909, 0, 0, 589373, 0, 0, 654908, 0, 0, 589372, 0, 0, 654907, 0, 0, 589371, 0, 0, 654906, 0, 0, 589370, 0, 0, 654905, 0, 0, 589369, 0, 0, 654904, 0, 0, 589368, 0, 0, 654903, 0, 0, 589367, 0, 0, 654902, 0, 0, 589366, 0, 0, 654901, 0, 0, 589365, 0, 0, 654900, 0, 0, 589364, 0, 0, 654899, 0, 0, 589363, 0, 0, 654898, 0, 0, 589362, 0, 0, 654897, 0, 0, 589361, 0, 0, 654896, 0, 0, 589360, 0, 0, 654895, 0, 0, 589359, 0, 0, 654894, 0, 0, 589358, 0, 0, 654893, 0, 0, 589357, 0, 0, 654892, 0, 0, 589356, 0, 0, 654891, 0, 0, 589355, 0, 0, 654890, 0, 0, 589354, 0, 0, 654889, 0, 0, 589353, 0, 0, 654888, 0, 0, 589352, 0, 0, 654887, 0, 0, 589351, 0, 0, 654886, 0, 0, 589350, 0, 0, 654885, 0, 0, 589349, 0, 0, 654884, 0, 0, 589348, 0, 0, 654883, 0, 0, 589347, 0, 0, 654882, 0, 0, 589346, 0, 0, 654881, 0, 0, 589345, 0, 0, 654880, 0, 0, 589344, 0, 0, 654879, 0, 0, 589343, 0, 0, 654878, 0, 0, 589342, 0, 0, 654877, 0, 0, 589341, 0, 0, 654876, 0, 0, 589340, 0, 0, 654875, 0, 0, 589339, 0, 0, 654874, 0, 0, 589338, 0, 0, 654873, 0, 0, 589337, 0, 0, 654872, 0, 0, 589336, 0, 0, 654871, 0, 0, 589335, 0, 0, 654870, 0, 0, 589334, 0, 0, 654869, 0, 0, 589333, 0, 0, 654868, 0, 0, 589332, 0, 0, 654867, 0, 0, 589331, 0, 0, 654866, 0, 0, 589330, 0, 0, 654865, 0, 0, 589329, 0, 0, 654864, 0, 0, 589328, 0, 0, 654863, 0, 0, 589327, 0, 0, 654862, 0, 0, 589326, 0, 0, 654861, 0, 0, 589325, 0, 0, 654860, 0, 0, 589324, 0, 0, 654859, 0, 0, 589323, 0, 0, 654858, 0, 0, 589322, 0, 0, 654857, 0, 0, 589321, 0, 0, 654856, 0, 0, 589320, 0, 0, 654855, 0, 0, 589319, 0, 0, 654854, 0, 0, 589318, 0, 0, 654853, 0, 0, 589317, 0, 0, 654852, 0, 0, 589316, 0, 0, 654851, 0, 0, 589315, 0, 0, 654850, 0, 0, 589314, 0, 0, 654849, 0, 0, 589313, 0, 0, 654848, 0, 0, 589312, 0, 0, 654847, 0, 0, 589311, 0, 0, 654846, 0, 0, 589310, 0, 0, 654845, 0, 0, 589309, 0, 0, 654844, 0, 0, 589308, 0, 0, 654843, 0, 0, 589307, 0, 0, 654842, 0, 0, 589306, 0, 0, 654841, 0, 0, 589305, 0, 0, 654840, 0, 0, 589304, 0, 0, 654839, 0, 0, 589303, 0, 0, 654838, 0, 0, 589302, 0, 0, 654837, 0, 0, 589301, 0, 0, 654836, 0, 0, 589300, 0, 0, 654835, 0, 0, 589299, 0, 0, 654834, 0, 0, 589298, 0, 0, 654833, 0, 0, 589297, 0, 0, 654832, 0, 0, 589296, 0, 0, 654831, 0, 0, 589295, 0, 0, 654830, 0, 0, 589294, 0, 0, 654829, 0, 0, 589293, 0, 0, 654828, 0, 0, 589292, 0, 0, 654827, 0, 0, 589291, 0, 0, 654826, 0, 0, 589290, 0, 0, 654825, 0, 0, 589289, 0, 0, 654824, 0, 0, 589288, 0, 0, 654823, 0, 0, 589287, 0, 0, 654822, 0, 0, 589286, 0, 0, 654821, 0, 0, 589285, 0, 0, 654820, 0, 0, 589284, 0, 0, 654819, 0, 0, 589283, 0, 0, 654818, 0, 0, 589282, 0, 0, 654817, 0, 0, 589281, 0, 0, 654816, 0, 0, 589280, 0, 0, 654815, 0, 0, 589279, 0, 0, 654814, 0, 0, 589278, 0, 0, 654813, 0, 0, 589277, 0, 0, 654812, 0, 0, 589276, 0, 0, 654811, 0, 0, 589275, 0, 0, 654810, 0, 0, 589274, 0, 0, 654809, 0, 0, 589273, 0, 0, 654808, 0, 0, 589272, 0, 0, 654807, 0, 0, 589271, 0, 0, 654806, 0, 0, 589270, 0, 0, 654805, 0, 0, 589269, 0, 0, 654804, 0, 0, 589268, 0, 0, 654803, 0, 0, 589267, 0, 0, 654802, 0, 0, 589266, 0, 0, 654801, 0, 0, 589265, 0, 0, 654800, 0, 0, 589264, 0, 0, 654799, 0, 0, 589263, 0, 0, 654798, 0, 0, 589262, 0, 0, 654797, 0, 0, 589261, 0, 0, 654796, 0, 0, 589260, 0, 0, 654795, 0, 0, 589259, 0, 0, 654794, 0, 0, 589258, 0, 0, 654793, 0, 0, 589257, 0, 0, 654792, 0, 0, 589256, 0, 0, 654791, 0, 0, 589255, 0, 0, 654790, 0, 0, 589254, 0, 0, 654789, 0, 0, 589253, 0, 0, 654788, 0, 0, 589252, 0, 0, 654787, 0, 0, 589251, 0, 0, 654786, 0, 0, 589250, 0, 0, 654785, 0, 0, 589249, 0, 0, 654784, 0, 0, 589248, 0, 0, 654783, 0, 0, 589247, 0, 0, 654782, 0, 0, 589246, 0, 0, 654781, 0, 0, 589245, 0, 0, 654780, 0, 0, 589244, 0, 0, 654779, 0, 0, 589243, 0, 0, 654778, 0, 0, 589242, 0, 0, 654777, 0, 0, 589241, 0, 0, 654776, 0, 0, 589240, 0, 0, 654775, 0, 0, 589239, 0, 0, 654774, 0, 0, 589238, 0, 0, 654773, 0, 0, 589237, 0, 0, 654772, 0, 0, 589236, 0, 0, 654771, 0, 0, 589235, 0, 0, 654770, 0, 0, 589234, 0, 0, 654769, 0, 0, 589233, 0, 0, 654768, 0, 0, 589232, 0, 0, 654767, 0, 0, 589231, 0, 0, 654766, 0, 0, 589230, 0, 0, 654765, 0, 0, 589229, 0, 0, 654764, 0, 0, 589228, 0, 0, 654763, 0, 0, 589227, 0, 0, 654762, 0, 0, 589226, 0, 0, 654761, 0, 0, 589225, 0, 0, 654760, 0, 0, 589224, 0, 0, 654759, 0, 0, 589223, 0, 0, 654758, 0, 0, 589222, 0, 0, 654757, 0, 0, 589221, 0, 0, 654756, 0, 0, 589220, 0, 0, 654755, 0, 0, 589219, 0, 0, 654754, 0, 0, 589218, 0, 0, 654753, 0, 0, 589217, 0, 0, 654752, 0, 0, 589216, 0, 0, 654751, 0, 0, 589215, 0, 0, 654750, 0, 0, 589214, 0, 0, 654749, 0, 0, 589213, 0, 0, 654748, 0, 0, 589212, 0, 0, 654747, 0, 0, 589211, 0, 0, 654746, 0, 0, 589210, 0, 0, 654745, 0, 0, 589209, 0, 0, 654744, 0, 0, 589208, 0, 0, 654743, 0, 0, 589207, 0, 0, 654742, 0, 0, 589206, 0, 0, 654741, 0, 0, 589205, 0, 0, 654740, 0, 0, 589204, 0, 0, 654739, 0, 0, 589203, 0, 0, 654738, 0, 0, 589202, 0, 0, 654737, 0, 0, 589201, 0, 0, 654736, 0, 0, 589200, 0, 0, 654735, 0, 0, 589199, 0, 0, 654734, 0, 0, 589198, 0, 0, 654733, 0, 0, 589197, 0, 0, 654732, 0, 0, 589196, 0, 0, 654731, 0, 0, 589195, 0, 0, 654730, 0, 0, 589194, 0, 0, 654729, 0, 0, 589193, 0, 0, 654728, 0, 0, 589192, 0, 0, 654727, 0, 0, 589191, 0, 0, 654726, 0, 0, 589190, 0, 0, 654725, 0, 0, 589189, 0, 0, 654724, 0, 0, 589188, 0, 0, 654723, 0, 0, 589187, 0, 0, 654722, 0, 0, 589186, 0, 0, 654721, 0, 0, 589185, 0, 0, 654720, 0, 0, 589184, 0, 0, 654719, 0, 0, 589183, 0, 0, 654718, 0, 0, 589182, 0, 0, 654717, 0, 0, 589181, 0, 0, 654716, 0, 0, 589180, 0, 0, 654715, 0, 0, 589179, 0, 0, 654714, 0, 0, 589178, 0, 0, 654713, 0, 0, 589177, 0, 0, 654712, 0, 0, 589176, 0, 0, 654711, 0, 0, 589175, 0, 0, 654710, 0, 0, 589174, 0, 0, 654709, 0, 0, 589173, 0, 0, 654708, 0, 0, 589172, 0, 0, 654707, 0, 0, 589171, 0, 0, 654706, 0, 0, 589170, 0, 0, 654705, 0, 0, 589169, 0, 0, 654704, 0, 0, 589168, 0, 0, 654703, 0, 0, 589167, 0, 0, 654702, 0, 0, 589166, 0, 0, 654701, 0, 0, 589165, 0, 0, 654700, 0, 0, 589164, 0, 0, 654699, 0, 0, 589163, 0, 0, 654698, 0, 0, 589162, 0, 0, 654697, 0, 0, 589161, 0, 0, 654696, 0, 0, 589160, 0, 0, 654695, 0, 0, 589159, 0, 0, 654694, 0, 0, 589158, 0, 0, 654693, 0, 0, 589157, 0, 0, 654692, 0, 0, 589156, 0, 0, 654691, 0, 0, 589155, 0, 0, 654690, 0, 0, 589154, 0, 0, 654689, 0, 0, 589153, 0, 0, 654688, 0, 0, 589152, 0, 0, 654687, 0, 0, 589151, 0, 0, 654686, 0, 0, 589150, 0, 0, 654685, 0, 0, 589149, 0, 0, 654684, 0, 0, 589148, 0, 0, 654683, 0, 0, 589147, 0, 0, 654682, 0, 0, 589146, 0, 0, 654681, 0, 0, 589145, 0, 0, 654680, 0, 0, 589144, 0, 0, 654679, 0, 0, 589143, 0, 0, 654678, 0, 0, 589142, 0, 0, 654677, 0, 0, 589141, 0, 0, 654676, 0, 0, 589140, 0, 0, 654675, 0, 0, 589139, 0, 0, 654674, 0, 0, 589138, 0, 0, 654673, 0, 0, 589137, 0, 0, 654672, 0, 0, 589136, 0, 0, 654671, 0, 0, 589135, 0, 0, 654670, 0, 0, 589134, 0, 0, 654669, 0, 0, 589133, 0, 0, 654668, 0, 0, 589132, 0, 0, 654667, 0, 0, 589131, 0, 0, 654666, 0, 0, 589130, 0, 0, 654665, 0, 0, 589129, 0, 0, 654664, 0, 0, 589128, 0, 0, 654663, 0, 0, 589127, 0, 0, 654662, 0, 0, 589126, 0, 0, 654661, 0, 0, 589125, 0, 0, 654660, 0, 0, 589124, 0, 0, 654659, 0, 0, 589123, 0, 0, 654658, 0, 0, 589122, 0, 0, 654657, 0, 0, 589121, 0, 0, 654656, 0, 0, 589120, 0, 0, 654655, 0, 0, 589119, 0, 0, 654654, 0, 0, 589118, 0, 0, 654653, 0, 0, 589117, 0, 0, 654652, 0, 0, 589116, 0, 0, 654651, 0, 0, 589115, 0, 0, 654650, 0, 0, 589114, 0, 0, 654649, 0, 0, 589113, 0, 0, 654648, 0, 0, 589112, 0, 0, 654647, 0, 0, 589111, 0, 0, 654646, 0, 0, 589110, 0, 0, 654645, 0, 0, 589109, 0, 0, 654644, 0, 0, 589108, 0, 0, 654643, 0, 0, 589107, 0, 0, 654642, 0, 0, 589106, 0, 0, 654641, 0, 0, 589105, 0, 0, 654640, 0, 0, 589104, 0, 0, 654639, 0, 0, 589103, 0, 0, 654638, 0, 0, 589102, 0, 0, 654637, 0, 0, 589101, 0, 0, 654636, 0, 0, 589100, 0, 0, 654635, 0, 0, 589099, 0, 0, 654634, 0, 0, 589098, 0, 0, 654633, 0, 0, 589097, 0, 0, 654632, 0, 0, 589096, 0, 0, 654631, 0, 0, 589095, 0, 0, 654630, 0, 0, 589094, 0, 0, 654629, 0, 0, 589093, 0, 0, 654628, 0, 0, 589092, 0, 0, 654627, 0, 0, 589091, 0, 0, 654626, 0, 0, 589090, 0, 0, 654625, 0, 0, 589089, 0, 0, 654624, 0, 0, 589088, 0, 0, 654623, 0, 0, 589087, 0, 0, 654622, 0, 0, 589086, 0, 0, 654621, 0, 0, 589085, 0, 0, 654620, 0, 0, 589084, 0, 0, 654619, 0, 0, 589083, 0, 0, 654618, 0, 0, 589082, 0, 0, 654617, 0, 0, 589081, 0, 0, 654616, 0, 0, 589080, 0, 0, 654615, 0, 0, 589079, 0, 0, 654614, 0, 0, 589078, 0, 0, 654613, 0, 0, 589077, 0, 0, 654612, 0, 0, 589076, 0, 0, 654611, 0, 0, 589075, 0, 0, 654610, 0, 0, 589074, 0, 0, 654609, 0, 0, 589073, 0, 0, 654608, 0, 0, 589072, 0, 0, 654607, 0, 0, 589071, 0, 0, 654606, 0, 0, 589070, 0, 0, 654605, 0, 0, 589069, 0, 0, 654604, 0, 0, 589068, 0, 0, 654603, 0, 0, 589067, 0, 0, 654602, 0, 0, 589066, 0, 0, 654601, 0, 0, 589065, 0, 0, 654600, 0, 0, 589064, 0, 0, 654599, 0, 0, 589063, 0, 0, 654598, 0, 0, 589062, 0, 0, 654597, 0, 0, 589061, 0, 0, 654596, 0, 0, 589060, 0, 0, 654595, 0, 0, 589059, 0, 0, 654594, 0, 0, 589058, 0, 0, 654593, 0, 0, 589057, 0, 0, 654592, 0, 0, 589056, 0, 0, 654591, 0, 0, 589055, 0, 0, 654590, 0, 0, 589054, 0, 0, 654589, 0, 0, 589053, 0, 0, 654588, 0, 0, 589052, 0, 0, 654587, 0, 0, 589051, 0, 0, 654586, 0, 0, 589050, 0, 0, 654585, 0, 0, 589049, 0, 0, 654584, 0, 0, 589048, 0, 0, 654583, 0, 0, 589047, 0, 0, 654582, 0, 0, 589046, 0, 0, 654581, 0, 0, 589045, 0, 0, 654580, 0, 0, 589044, 0, 0, 654579, 0, 0, 589043, 0, 0, 654578, 0, 0, 589042, 0, 0, 654577, 0, 0, 589041, 0, 0, 654576, 0, 0, 589040, 0, 0, 654575, 0, 0, 589039, 0, 0, 654574, 0, 0, 589038, 0, 0, 654573, 0, 0, 589037, 0, 0, 654572, 0, 0, 589036, 0, 0, 654571, 0, 0, 589035, 0, 0, 654570, 0, 0, 589034, 0, 0, 654569, 0, 0, 589033, 0, 0, 654568, 0, 0, 589032, 0, 0, 654567, 0, 0, 589031, 0, 0, 654566, 0, 0, 589030, 0, 0, 654565, 0, 0, 589029, 0, 0, 654564, 0, 0, 589028, 0, 0, 654563, 0, 0, 589027, 0, 0, 654562, 0, 0, 589026, 0, 0, 654561, 0, 0, 589025, 0, 0, 654560, 0, 0, 589024, 0, 0, 654559, 0, 0, 589023, 0, 0, 654558, 0, 0, 589022, 0, 0, 654557, 0, 0, 589021, 0, 0, 654556, 0, 0, 589020, 0, 0, 654555, 0, 0, 589019, 0, 0, 654554, 0, 0, 589018, 0, 0, 654553, 0, 0, 589017, 0, 0, 654552, 0, 0, 589016, 0, 0, 654551, 0, 0, 589015, 0, 0, 654550, 0, 0, 589014, 0, 0, 654549, 0, 0, 589013, 0, 0, 654548, 0, 0, 589012, 0, 0, 654547, 0, 0, 589011, 0, 0, 654546, 0, 0, 589010, 0, 0, 654545, 0, 0, 589009, 0, 0, 654544, 0, 0, 589008, 0, 0, 654543, 0, 0, 589007, 0, 0, 654542, 0, 0, 589006, 0, 0, 654541, 0, 0, 589005, 0, 0, 654540, 0, 0, 589004, 0, 0, 654539, 0, 0, 589003, 0, 0, 654538, 0, 0, 589002, 0, 0, 654537, 0, 0, 589001, 0, 0, 654536, 0, 0, 589000, 0, 0, 654535, 0, 0, 588999, 0, 0, 654534, 0, 0, 588998, 0, 0, 654533, 0, 0, 588997, 0, 0, 654532, 0, 0, 588996, 0, 0, 654531, 0, 0, 588995, 0, 0, 654530, 0, 0, 588994, 0, 0, 654529, 0, 0, 588993, 0, 0, 654528, 0, 0, 588992, 0, 0, 654527, 0, 0, 588991, 0, 0, 654526, 0, 0, 588990, 0, 0, 654525, 0, 0, 588989, 0, 0, 654524, 0, 0, 588988, 0, 0, 654523, 0, 0, 588987, 0, 0, 654522, 0, 0, 588986, 0, 0, 654521, 0, 0, 588985, 0, 0, 654520, 0, 0, 588984, 0, 0, 654519, 0, 0, 588983, 0, 0, 654518, 0, 0, 588982, 0, 0, 654517, 0, 0, 588981, 0, 0, 654516, 0, 0, 588980, 0, 0, 654515, 0, 0, 588979, 0, 0, 654514, 0, 0, 588978, 0, 0, 654513, 0, 0, 588977, 0, 0, 654512, 0, 0, 588976, 0, 0, 654511, 0, 0, 588975, 0, 0, 654510, 0, 0, 588974, 0, 0, 654509, 0, 0, 588973, 0, 0, 654508, 0, 0, 588972, 0, 0, 654507, 0, 0, 588971, 0, 0, 654506, 0, 0, 588970, 0, 0, 654505, 0, 0, 588969, 0, 0, 654504, 0, 0, 588968, 0, 0, 654503, 0, 0, 588967, 0, 0, 654502, 0, 0, 588966, 0, 0, 654501, 0, 0, 588965, 0, 0, 654500, 0, 0, 588964, 0, 0, 654499, 0, 0, 588963, 0, 0, 654498, 0, 0, 588962, 0, 0, 654497, 0, 0, 588961, 0, 0, 654496, 0, 0, 588960, 0, 0, 654495, 0, 0, 588959, 0, 0, 654494, 0, 0, 588958, 0, 0, 654493, 0, 0, 588957, 0, 0, 654492, 0, 0, 588956, 0, 0, 654491, 0, 0, 588955, 0, 0, 654490, 0, 0, 588954, 0, 0, 654489, 0, 0, 588953, 0, 0, 654488, 0, 0, 588952, 0, 0, 654487, 0, 0, 588951, 0, 0, 654486, 0, 0, 588950, 0, 0, 654485, 0, 0, 588949, 0, 0, 654484, 0, 0, 588948, 0, 0, 654483, 0, 0, 588947, 0, 0, 654482, 0, 0, 588946, 0, 0, 654481, 0, 0, 588945, 0, 0, 654480, 0, 0, 588944, 0, 0, 654479, 0, 0, 588943, 0, 0, 654478, 0, 0, 588942, 0, 0, 654477, 0, 0, 588941, 0, 0, 654476, 0, 0, 588940, 0, 0, 654475, 0, 0, 588939, 0, 0, 654474, 0, 0, 588938, 0, 0, 654473, 0, 0, 588937, 0, 0, 654472, 0, 0, 588936, 0, 0, 654471, 0, 0, 588935, 0, 0, 654470, 0, 0, 588934, 0, 0, 654469, 0, 0, 588933, 0, 0, 654468, 0, 0, 588932, 0, 0, 654467, 0, 0, 588931, 0, 0, 654466, 0, 0, 588930, 0, 0, 654465, 0, 0, 588929, 0, 0, 654464, 0, 0, 588928, 0, 0, 654463, 0, 0, 588927, 0, 0, 654462, 0, 0, 588926, 0, 0, 654461, 0, 0, 588925, 0, 0, 654460, 0, 0, 588924, 0, 0, 654459, 0, 0, 588923, 0, 0, 654458, 0, 0, 588922, 0, 0, 654457, 0, 0, 588921, 0, 0, 654456, 0, 0, 588920, 0, 0, 654455, 0, 0, 588919, 0, 0, 654454, 0, 0, 588918, 0, 0, 654453, 0, 0, 588917, 0, 0, 654452, 0, 0, 588916, 0, 0, 654451, 0, 0, 588915, 0, 0, 654450, 0, 0, 588914, 0, 0, 654449, 0, 0, 588913, 0, 0, 654448, 0, 0, 588912, 0, 0, 654447, 0, 0, 588911, 0, 0) [node name="TileMap2" type="TileMap" parent="Map"] modulate = Color(0, 0, 0.486275, 1) @@ -49,5 +53,12 @@ format = 2 layer_0/tile_data = PackedInt32Array(589824, 0, 0, 589825, 0, 0, 589826, 0, 0, 589827, 0, 0, 589828, 0, 0, 589829, 0, 0, 589830, 0, 0, 589831, 0, 0, 589832, 0, 0, 589833, 0, 0, 589834, 0, 0, 589835, 0, 0, 589836, 0, 0, 589837, 0, 0, 589838, 0, 0, 589839, 0, 0, 589840, 0, 0, 589841, 0, 0, 655359, 0, 0, 655358, 0, 0, 655357, 0, 0, 655356, 0, 0, 655355, 0, 0, 655354, 0, 0, 655353, 0, 0, 655352, 0, 0, 655351, 0, 0, 589815, 0, 0, 589816, 0, 0, 589817, 0, 0, 589818, 0, 0, 589819, 0, 0, 589820, 0, 0, 589821, 0, 0, 589822, 0, 0, 589823, 0, 0, 524288, 0, 0, 524289, 0, 0, 524299, 0, 0, 524292, 0, 0, 524291, 0, 0, 524290, 0, 0, 524298, 0, 0, 524297, 0, 0, 524296, 0, 0, 524295, 0, 0, 524293, 0, 0, 524294, 0, 0, 524300, 0, 0, 524301, 0, 0, 524302, 0, 0, 524303, 0, 0, 524304, 0, 0, 524305, 0, 0, 524306, 0, 0, 589842, 0, 0, 655350, 0, 0, 589814, 0, 0, 524278, 0, 0, 458742, 0, 0, 393206, 0, 0, 327670, 0, 0, 262134, 0, 0, 196598, 0, 0, 131062, 0, 0, 65526, 0, 0, -10, 0, 0, -65546, 0, 0, -131082, 0, 0, -196618, 0, 0, -262154, 0, 0, 655349, 0, 0, 589813, 0, 0, 524277, 0, 0, 458741, 0, 0, 393205, 0, 0, 327669, 0, 0, 262133, 0, 0, 196597, 0, 0, 131061, 0, 0, 65525, 0, 0, -11, 0, 0, -65547, 0, 0, -131083, 0, 0, -196619, 0, 0, -262155, 0, 0, 655348, 0, 0, 589812, 0, 0, 655347, 0, 0, 589811, 0, 0, 655346, 0, 0, 589810, 0, 0, 655345, 0, 0, 589809, 0, 0, 655344, 0, 0, 589808, 0, 0, 655343, 0, 0, 589807, 0, 0, 655342, 0, 0, 589806, 0, 0, 655341, 0, 0, 589805, 0, 0, 655340, 0, 0, 589804, 0, 0, 655339, 0, 0, 589803, 0, 0, 655338, 0, 0, 589802, 0, 0, 458764, 0, 0, 393228, 0, 0, 327692, 0, 0, 262156, 0, 0, 196620, 0, 0, 131084, 0, 0, 65548, 0, 0, 12, 0, 0, 458763, 0, 0, 393227, 0, 0, 327691, 0, 0, 262155, 0, 0, 196619, 0, 0, 131083, 0, 0, 65547, 0, 0, 11, 0, 0, 589852, 0, 0, 524316, 0, 0, 589851, 0, 0, 524315, 0, 0, 589850, 0, 0, 524314, 0, 0, 589849, 0, 0, 524313, 0, 0, 589848, 0, 0, 524312, 0, 0, 589847, 0, 0, 524311, 0, 0, 589846, 0, 0, 524310, 0, 0, 589845, 0, 0, 524309, 0, 0, 589844, 0, 0, 524308, 0, 0, 589843, 0, 0, 524307, 0, 0) [node name="Player" parent="." instance=ExtResource("1_jcngi")] +collision_layer = 3 +collision_mask = 1 floor_constant_speed = true floor_snap_length = 1.0 + +[node name="GUI" parent="Player" instance=ExtResource("4_7j33c")] + +[node name="Smoother" type="Node" parent="."] +script = ExtResource("3_16g5e") diff --git a/Player/BasicCharacter/AnimationController.gd b/Player/BasicCharacter/AnimationController.gd index 9fca59e..76d8438 100644 --- a/Player/BasicCharacter/AnimationController.gd +++ b/Player/BasicCharacter/AnimationController.gd @@ -2,38 +2,54 @@ extends Sprite2D @onready var player = $"../" -@onready var wallSlidingParticles = $"WallslidingParticles" +var spinAccel = 0 func spin(veloc, delta): var vertSpinMult = abs(veloc.y) * clamp(veloc.x, -1, 1) / 1.5 var spinFactor = (veloc.x + vertSpinMult) / 30 - if player.direction: + if player.direction or abs(player.velocity.x) > 100: rotation = lerp(rotation, rotation + (spinFactor), delta) else: - rotation = lerp(rotation, snappedf(rotation, PI / 2), delta * 10) + rotation = lerp(rotation, snappedf(rotation + (spinFactor * delta * 2), PI / 2), delta * 5) var landed = 0 +@onready var slidingVariants = [$"WallslidingNeutral", $"WallslidingUp", $"WallslidingDown"] + +func disableSlidingVariants(keep=null): + for variant in slidingVariants: + if variant != keep: + variant.emitting = false + func _process(delta): var velocity = player.velocity + var grapple = $"GrappleCore" var floored = player.is_on_floor() - if player.is_on_wall_only() and velocity.y > 0: + if player.isWallSliding(): + var wallSlidingParticles = slidingVariants[0] + if abs(velocity.y) < 150: + wallSlidingParticles = slidingVariants[1] + elif abs(velocity.y) > 300: + wallSlidingParticles = slidingVariants[2] + + disableSlidingVariants(wallSlidingParticles) wallSlidingParticles.emitting = true - wallSlidingParticles.global_position = player.position + (player.get_wall_normal() * -8) + wallSlidingParticles.global_position = player.position + (player.get_wall_normal() * -8 * player.scale.x) wallSlidingParticles.global_rotation = player.get_wall_normal().x * deg_to_rad(45) + else: - wallSlidingParticles.emitting = false + disableSlidingVariants() if not floored: spin(velocity, delta) landed = velocity.y - scale = Vector2.ONE + #scale = Vector2.ONE - if player.is_on_wall(): + if player.isWallSliding(): rotation = lerp(rotation, deg_to_rad(30) * player.get_wall_normal().x + snappedf(rotation, PI / 2), delta * 15) else: var floorRot = player.get_floor_normal().angle() + (PI / 2) @@ -52,8 +68,18 @@ func _process(delta): scale.y = lerp(scale.y, 1.0, delta * 7) scale.x = lerp(scale.x, 1.0, delta * 7) - scale.y = clamp(scale.y, 0.1, INF) + scale.y = clamp(scale.y, 0.25, INF) scale.x = clamp(scale.x, 0.1, INF) + #modulate.h = abs(player.position.x / 400.) offset.y = (8 * pow(scale.y, -1) - 8) offset.x = 0 + + grapple.offset = offset + + +func _on_character_jumped(): + if not player.direction: + rotation = 0 + scale.y = 1.5 + scale.x = 0.5 diff --git a/Player/BasicCharacter/CameraController.gd b/Player/BasicCharacter/CameraController.gd deleted file mode 100644 index 968a926..0000000 --- a/Player/BasicCharacter/CameraController.gd +++ /dev/null @@ -1,4 +0,0 @@ -extends Camera2D - -func _process(delta): - position = get_local_mouse_position() / 3 diff --git a/Player/BasicCharacter/Character.tscn b/Player/BasicCharacter/Character.tscn index ed4b993..1841549 100644 --- a/Player/BasicCharacter/Character.tscn +++ b/Player/BasicCharacter/Character.tscn @@ -1,9 +1,11 @@ -[gd_scene load_steps=9 format=3 uid="uid://cqcjan67wgkc1"] +[gd_scene load_steps=11 format=3 uid="uid://cqcjan67wgkc1"] [ext_resource type="Texture2D" uid="uid://dvx8lliqdi3dv" path="res://Player/Skins/Square/Square.png" id="1_3vfyw"] [ext_resource type="Script" path="res://Player/BasicCharacter/CharacterController.gd" id="1_c5ycp"] -[ext_resource type="Script" path="res://Player/BasicCharacter/CameraController.gd" id="3_2bdku"] +[ext_resource type="PackedScene" uid="uid://cjjrxtvufk35a" path="res://Player/Camera/camera.tscn" id="2_oahgu"] [ext_resource type="Script" path="res://Player/BasicCharacter/AnimationController.gd" id="3_6plye"] +[ext_resource type="Script" path="res://Player/GrappleHook/GrappleHook.gd" id="5_sv1u0"] +[ext_resource type="Texture2D" uid="uid://bi5ofgcvid5qk" path="res://Player/GrappleHook/GrappleCenter.png" id="6_ismrc"] [sub_resource type="CircleShape2D" id="CircleShape2D_jbiem"] radius = 8.0 @@ -28,27 +30,52 @@ scale_max = 2.0 scale_curve = SubResource("CurveTexture_d404m") [node name="Character" type="CharacterBody2D"] +collision_mask = 7 +floor_stop_on_slope = false floor_snap_length = 3.0 script = ExtResource("1_c5ycp") -[node name="Camera" type="Camera2D" parent="."] -zoom = Vector2(3, 3) -position_smoothing_enabled = true -position_smoothing_speed = 35.0 -script = ExtResource("3_2bdku") +[node name="Camera" parent="." instance=ExtResource("2_oahgu")] +position_smoothing_speed = 20.0 [node name="BoxCollider" type="CollisionShape2D" parent="."] shape = SubResource("CircleShape2D_jbiem") [node name="Sprite" type="Sprite2D" parent="."] -self_modulate = Color(1, 0, 0, 1) +self_modulate = Color(0.678431, 0.298039, 1, 1) +visibility_layer = 257 rotation = 0.0123838 texture = ExtResource("1_3vfyw") script = ExtResource("3_6plye") -[node name="WallslidingParticles" type="GPUParticles2D" parent="Sprite"] +[node name="WallslidingUp" type="GPUParticles2D" parent="Sprite"] show_behind_parent = true top_level = true position = Vector2(-7.79423, 4.5) -rotation = 0.785398 +emitting = false process_material = SubResource("ParticleProcessMaterial_65t6y") + +[node name="WallslidingNeutral" type="GPUParticles2D" parent="Sprite"] +show_behind_parent = true +top_level = true +position = Vector2(-7.79423, 4.5) +emitting = false +amount = 16 +process_material = SubResource("ParticleProcessMaterial_65t6y") + +[node name="WallslidingDown" type="GPUParticles2D" parent="Sprite"] +show_behind_parent = true +top_level = true +position = Vector2(-7.79423, 4.5) +emitting = false +amount = 24 +process_material = SubResource("ParticleProcessMaterial_65t6y") + +[node name="Grapple" type="Node2D" parent="Sprite"] +script = ExtResource("5_sv1u0") + +[node name="GrappleCore" type="Sprite2D" parent="Sprite"] +modulate = Color(0.513726, 1, 0.482353, 1) +texture = ExtResource("6_ismrc") + +[connection signal="Jumped" from="." to="Sprite" method="_on_character_jumped"] diff --git a/Player/BasicCharacter/CharacterController.gd b/Player/BasicCharacter/CharacterController.gd index 3232d1a..4da1030 100644 --- a/Player/BasicCharacter/CharacterController.gd +++ b/Player/BasicCharacter/CharacterController.gd @@ -2,72 +2,87 @@ extends CharacterBody2D const SPEED = 400.0 const ACCEL = 7.0 +var direction = 0 +var addedveloc = 0 const JUMP_VELOCITY = -450.0 - const MAX_JUMPS = 2 var jumps = MAX_JUMPS +var wallKayote = 0 const FALL_SPEED = -JUMP_VELOCITY * 1.5 var falling = false +var floorTime = 0 + var gravity = ProjectSettings.get_setting("physics/2d/default_gravity") -var direction = 0 - -var addedveloc = 0 - -var wallKayote = 0 +func isWallSliding(): + return is_on_wall_only() and direction func launch(veloc): addedveloc = veloc velocity.x = veloc +signal Jumped + func _physics_process(delta): direction = round(Input.get_axis("left", "right")) wallKayote -= delta if not is_on_floor(): - var lowGrav = velocity.y < 0 and Input.is_action_pressed("jump") - + var lowGrav = velocity.y < 0 and (Input.is_action_pressed("up") or Input.is_action_pressed("jump")) velocity.y += gravity * delta / gen.boolToNumb(lowGrav, 1) + + floorTime = 0 else: + floorTime += delta jumps = MAX_JUMPS falling = false - if is_on_wall_only() and direction: - wallKayote = 0.225 + if isWallSliding(): + wallKayote = 0.2 + falling = false - print(-get_wall_normal().x, direction) + if Input.is_action_just_pressed("respawn") or position.y > 500: + position = Vector2.ZERO + velocity = Vector2.ZERO if Input.is_action_just_pressed("jump"): - if wallKayote > 0: - velocity.y = clamp(velocity.y + JUMP_VELOCITY, -INF, JUMP_VELOCITY) - launch(get_wall_normal().x * SPEED) + if wallKayote > 0 and not is_on_floor(): + wallKayote /= 2 + if Input.is_action_pressed("down"): + launch(get_wall_normal().x * SPEED * 2.5) + velocity.y = JUMP_VELOCITY / 2 + else: + launch(get_wall_normal().x * SPEED * 1.5) + velocity.y = clamp(velocity.y + JUMP_VELOCITY, -INF, JUMP_VELOCITY) elif jumps > 0: + Jumped.emit() velocity.y = clamp(velocity.y + JUMP_VELOCITY, -INF, JUMP_VELOCITY) jumps -= 1 falling = false - - if Input.is_action_just_pressed("down") and not falling: + + if Input.is_action_just_pressed("down") and not falling and not isWallSliding(): falling = true velocity.y = clamp(velocity.y + FALL_SPEED, FALL_SPEED, INF) - if is_on_wall_only(): - velocity.y = lerpf(velocity.y, clamp(velocity.y, JUMP_VELOCITY, 100), delta * 10) + if isWallSliding(): + var upDown = clamp(Input.get_axis("up", "down"), -0.5, 1) + var holdMulti = (upDown * 2) + 1 + velocity.y = lerpf(velocity.y, clamp(velocity.y, JUMP_VELOCITY, 100 * holdMulti), delta * 10) - var finalSpeed = clamp(abs(velocity.x), SPEED, SPEED * 2) - abs(addedveloc) - - finalSpeed = clamp(lerp(finalSpeed, SPEED, delta * 10), SPEED, INF) - #print(finalSpeed) + var finalSpeed = clamp(abs(velocity.x), SPEED, INF) + if floorTime > 0.05: + finalSpeed = clamp(lerp(finalSpeed, SPEED, delta * 20), SPEED, INF) velocity.x = lerp(velocity.x, direction * finalSpeed, delta * ACCEL) - #if abs(velocity.x) < abs(addedveloc): - #print("boiyoing") - velocity.x += addedveloc * delta * 10 - + if abs(velocity.x) < abs(addedveloc): + addedveloc = lerp(addedveloc, velocity.x, ACCEL * 2 * delta) + velocity.x += addedveloc * delta * 15 + addedveloc = lerpf(addedveloc, 0, delta * 5) move_and_slide() diff --git a/Player/Camera/CameraController.gd b/Player/Camera/CameraController.gd new file mode 100644 index 0000000..475d410 --- /dev/null +++ b/Player/Camera/CameraController.gd @@ -0,0 +1,10 @@ +extends Camera2D + +@onready var player = $"../" + +func _process(delta): + var velocModifier = clamp(abs(player.velocity.x) - 700, 0, 1000) + var direction = clamp(player.velocity.x, -1, 1) + + position = (get_local_mouse_position() / 3) + position.x += velocModifier * direction / 10 diff --git a/Player/Camera/camera.tscn b/Player/Camera/camera.tscn new file mode 100644 index 0000000..a95f8d6 --- /dev/null +++ b/Player/Camera/camera.tscn @@ -0,0 +1,9 @@ +[gd_scene load_steps=2 format=3 uid="uid://cjjrxtvufk35a"] + +[ext_resource type="Script" path="res://Player/Camera/CameraController.gd" id="1_5yyqm"] + +[node name="Camera" type="Camera2D"] +zoom = Vector2(3, 3) +position_smoothing_enabled = true +position_smoothing_speed = 35.0 +script = ExtResource("1_5yyqm") diff --git a/Player/GUI/GUI.tscn b/Player/GUI/GUI.tscn new file mode 100644 index 0000000..af83100 --- /dev/null +++ b/Player/GUI/GUI.tscn @@ -0,0 +1,50 @@ +[gd_scene load_steps=3 format=3 uid="uid://b6rvghqqnqqk1"] + +[ext_resource type="Script" path="res://Player/GUI/GuiRoot.gd" id="1_hovww"] + +[sub_resource type="LabelSettings" id="LabelSettings_nvd2b"] +font_size = 32 + +[node name="CanvasLayer" type="CanvasLayer"] + +[node name="GuiRoot" type="Control" parent="."] +layout_mode = 3 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +size_flags_horizontal = 3 +size_flags_vertical = 3 +script = ExtResource("1_hovww") + +[node name="Velocity" type="Label" parent="GuiRoot"] +layout_mode = 0 +offset_right = 79.0 +offset_bottom = 23.0 +text = "Velocity: 0" +label_settings = SubResource("LabelSettings_nvd2b") + +[node name="HorzVeloc" type="Label" parent="GuiRoot"] +layout_mode = 0 +offset_top = 44.0 +offset_right = 328.0 +offset_bottom = 89.0 +text = "Horizontal Velocity: 0" +label_settings = SubResource("LabelSettings_nvd2b") + +[node name="VertVeloc" type="Label" parent="GuiRoot"] +layout_mode = 0 +offset_top = 88.0 +offset_right = 283.0 +offset_bottom = 133.0 +text = "Vertical Velocity: 0" +label_settings = SubResource("LabelSettings_nvd2b") + +[node name="AddedVeloc" type="Label" parent="GuiRoot"] +layout_mode = 0 +offset_top = 132.0 +offset_right = 283.0 +offset_bottom = 177.0 +text = "Added Velocity: 0" +label_settings = SubResource("LabelSettings_nvd2b") diff --git a/Player/GUI/GuiController.gd b/Player/GUI/GuiController.gd new file mode 100644 index 0000000..c384610 --- /dev/null +++ b/Player/GUI/GuiController.gd @@ -0,0 +1,5 @@ +extends Control +# +#func _process(delta): + #position = -get_viewport_transform().get_origin() + #print(position) diff --git a/Player/GUI/GuiRoot.gd b/Player/GUI/GuiRoot.gd new file mode 100644 index 0000000..9e9aee2 --- /dev/null +++ b/Player/GUI/GuiRoot.gd @@ -0,0 +1,13 @@ +extends Control + +@onready var player = $"../../" + +@onready var velocNumb = $"Velocity" +@onready var horzVeloc = $"HorzVeloc" +@onready var vertVeloc = $"VertVeloc" +@onready var addedVeloc = $"AddedVeloc" +func _physics_process(delta): + velocNumb.text = "Velocity: " + str(round(player.velocity.length())) + horzVeloc.text = "Horizontal Velocity: " + str(round(abs(player.velocity.x))) + vertVeloc.text = "Vertical Velocity: " + str(round(abs(player.velocity.y))) + addedVeloc.text = "Added Velocity: " + str(round(abs(player.addedveloc))) diff --git a/Player/GrappleHook/GrappleCenter.png b/Player/GrappleHook/GrappleCenter.png new file mode 100644 index 0000000000000000000000000000000000000000..b7dd5422f80cdcd0fc927b9da797d69d91387981 GIT binary patch literal 121 zcmeAS@N?(olHy`uVBq!ia0vp^Y#_`5A|IT2?*XJZ3p^r=85s1GL71^(seKtxP}|eR zF@z&J`N#kN_RIne92RVyhD|IBCMmEc95`{}!~vG)3k^M{GekCAEn?WPU;OiwiK!t# OZ492SelF{r5}E+Dog&fz literal 0 HcmV?d00001 diff --git a/Player/GrappleHook/GrappleCenter.png.import b/Player/GrappleHook/GrappleCenter.png.import new file mode 100644 index 0000000..e649808 --- /dev/null +++ b/Player/GrappleHook/GrappleCenter.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://bi5ofgcvid5qk" +path="res://.godot/imported/GrappleCenter.png-5e9ed5c2d1472f72fd1015c922d13ef9.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Player/GrappleHook/GrappleCenter.png" +dest_files=["res://.godot/imported/GrappleCenter.png-5e9ed5c2d1472f72fd1015c922d13ef9.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/Player/GrappleHook/GrappleHook.gd b/Player/GrappleHook/GrappleHook.gd new file mode 100644 index 0000000..c749ba6 --- /dev/null +++ b/Player/GrappleHook/GrappleHook.gd @@ -0,0 +1,93 @@ +extends Node2D + +@onready var player = $"../../" +@onready var sprite = $"../" + +@onready var grappleCore = $"../GrappleCore" + +@onready var Smoother = $"../../../Smoother" + +var grappleProjectile = preload("res://Player/GrappleHook/GrappleHookProjectile/GrappleHookProjectile.tscn") + +var proj = null + +var grappleSpeed = Vector2.ZERO +var retractDur = 0 +var retractStart = Vector2.ZERO + +var grappleDur = 0 + +var grappling = false +var retracting = false + +func launch(delta): + if proj: + player.jumps = player.MAX_JUMPS - 1 + var grappleVeloc = (proj.position - player.position).normalized() * grappleSpeed + player.launch(grappleVeloc.x) + player.velocity.y = grappleVeloc.y + +func grappleStart(): + grappleSpeed = (500 + clamp(player.velocity.length(), 500, 1000)) + grappleDur = .5 + grappling = true + +func _physics_process(delta): + grappleDur -= delta + + var moveVector = (get_global_mouse_position() - player.position).normalized() + + if Input.is_action_just_pressed("pullGrapple") and not proj: + #player.velocity.y = player.JUMP_VELOCITY / 2 + + proj = grappleProjectile.instantiate() + + proj.position = player.position + proj.rotation = moveVector.angle() + + proj.velocity = (moveVector * 1500) + player.velocity + #grappleDur = 10 + add_child(proj) + #else: + + if proj and grappleDur > 0 and (player.position - proj.position).length() > 15 and not Input.is_action_just_pressed("jump"): + launch(delta) + elif proj and grappling: + player.jumps = 1 + player.velocity.y = player.JUMP_VELOCITY + grappleDur = 0 + + retractStart = proj.position + retracting = true + grappling = false + +func _process(delta): + if proj and retracting == true: + proj.position = lerp(retractStart, player.position, retractDur) + retractDur += delta * 4 + if retractDur >= 1: + proj.queue_free() + proj = null + retracting = false + retractDur = 0 + + if proj: + #Engine.time_scale = 0.1 + var grappleLine = proj.get_node("GrappleLine") + var grappleBord = proj.get_node("GrappleBord") + + var grapOffset = grappleCore.offset * sprite.scale + + grappleLine.set_point_position(1, player.position + grapOffset) + grappleBord.set_point_position(1, player.position + grapOffset) + + grappleLine.set_point_position(0, proj.position) + grappleBord.set_point_position(0, proj.position) + + var curve = Curve.new() + curve.add_point(Vector2(0, 1)) + curve.add_point(Vector2(1, sprite.scale.y)) + + grappleLine.width_curve = curve + grappleBord.width_curve = curve + diff --git a/Player/GrappleHook/GrappleHookProjectile/Grapple.png b/Player/GrappleHook/GrappleHookProjectile/Grapple.png new file mode 100644 index 0000000000000000000000000000000000000000..2ccd8009d094ab07e85222bd3d3c5e95550ed14c GIT binary patch literal 164 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 literal 0 HcmV?d00001 diff --git a/Player/GrappleHook/GrappleHookProjectile/GrappleTether.png.import b/Player/GrappleHook/GrappleHookProjectile/GrappleTether.png.import new file mode 100644 index 0000000..c61ada6 --- /dev/null +++ b/Player/GrappleHook/GrappleHookProjectile/GrappleTether.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://gn347ng3iu02" +path="res://.godot/imported/GrappleTether.png-070f72f0eebbe08ec00dac245679c61b.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Player/GrappleHook/GrappleHookProjectile/GrappleTether.png" +dest_files=["res://.godot/imported/GrappleTether.png-070f72f0eebbe08ec00dac245679c61b.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/Player/GrappleHook/GrappleHookProjectile/GrappleTether.png~ b/Player/GrappleHook/GrappleHookProjectile/GrappleTether.png~ new file mode 100644 index 0000000000000000000000000000000000000000..c74dea3dff46e28b61471484cca27de59e6be09d GIT binary patch literal 143 zcmeAS@N?(olHy`uVBq!ia0vp^JV4CG!3HG1zpHNqQk(@Ik;M!QddeWoSh3W;3@GU6 z>Eak75uV)B+xz#t15?7TvbR!UPj?)dxn;{1i3_TZH8GET6dq4hP3$V{Y&KQ!ZZc73 no{?x!xPxtmT8^BP84Cj|o0?MOyEU_chB0`$`njxgN@xNAkTWW= literal 0 HcmV?d00001 diff --git a/Player/GrappleHook/PullGrapple.kra b/Player/GrappleHook/PullGrapple.kra new file mode 100644 index 0000000000000000000000000000000000000000..e8f210de46d68235c2a914834f7e6315bd1df986 GIT binary patch literal 37199 zcmV)XK&`(}O9KQ70000001Td3SfTI(rxO4G022TJ00;m80Bvb)WpsIPWnpk|Y-wX* zbZKvHFL*6$a%ps7P)h>@6aWAK2mlP8SXjS&1fazN001Kf000XB003=aX>Me1V=j1Y zY?V}9Z`v>veebXE{KCtUK!9|el2)`ZT6NvfN-OQrI3{>Fc4V8cPW$h>cKF)Vt{qYm zhkMSwC+A)}y;zq5Etxi4$qcu`CPqwBm2+8S_+k7h_<%3YPtte&uUF&mqXB{^8a-To zzPUn;Ac}7LgDC2c`)IDYB`6M?Q8f6{K#iHT)yF7WtyUo=LhwS9Q0c;9BaaOL8|F4| zKz5fDbV!roS9utjjkIL_xYHba%{jM9XZW^;c;p_@4dXDz=O-w=x$6xFC})OhURfW+ zNRpCec(f2=s7X}`h7nalX;Tr(>fpEGWe=m0yS0OGN*p^{2XhVO)`4cAz1;*Qo1^uN z@nU8(oM2RGHRS^6266>V2o^lXfzidpY8rA%F!@CtZ*U6Bz~xOK$kY)ouBZAeC`gh)9()yQv^l5iYH-ff20WD+QM|W#gf1e|P%p z${rhIq(BU}fQh?ZjD(`|ZEiXvQZg|Wq%a4IFA1F&S}kM_R0;l>IhP*4Sa2Zz%;{OH zGdVj8lGE-q=uDF&fInIROFHdI(oAx~$gh2NS8rc|sc zt$u)8Q2L}boap8p~dXxv}WO2HPH`km4C zJEOguvp;*Cj)-8^GE+z4P*4j^cdtb9(wkD(nQGV|;L`Ko9`E&NA`8GM7&mvm)L^$^ zeE_zoR^^eWbfGnqb_{@jnV&|-a?;43l5i|Xa4w&p{02}<0|XQR000O844zn6+sX2c zp#cB@aRUGV5C8xGWN%}2ZDnqBX>Mk3E_iKhjZ#f>+aMIY`&THs_=K=jcba-InbdMJ zon}%WG#?6dX`PytX}b!P}5BeKJ$K?ef@&qxy2_5BCCc}zGe>t&nc58 z&>eEOfX8DX(%9E-ysbM3kR-Hy!hJ(ZgDuy_9xb1cL$4qottW1*9<-ovu7J^%oO zKmY&>0001Ra%FaDWp^%cZfE8DcUM$T@HdL?+02mRkU?O`Q3*;G7?7NE5RfP!8Hti+ zND2}}k|&%I}@=bl$^|LE$ydv)(xRb5^Esa3V( z^mWz9h?$5103g#)S2hFy2=HGc#J}mRo|Zb@bVT0j7QO&L-uGXFqzjTW0{{ZhP*yY! z%HFnibC{DNzm=@nc8No6H6#+w698Q5260&p^F^y$|Bh-Z#^E9iXo}adgm<3T*rLMv zM{TpbKD9#l6=pO~VQ*#NzgIlmZ7OPzKh&mi2vgS%a~ zlxgVZst5eZYBU z&*y4S9c2X~V`8XS?=998Ms=K@)Ua+sY7yop5o=f}Ra}=E#N1Dz6!6rZ7K~s&7+_Xa zG-g}@6Cd?fdA z3~Y}OsD8NWCqgRg6Gv$&+F248*6@RO_`dO(u$!}Tkv3Yzbq_oQ`scL-WVKS>9d3q? zZln;Ulud$kbOLbLC9?jlvXfRP+g2jJ<*lcv=QH>2Z}^(@s?1Zo+_{_ORhs8*VAJvr zdWRbze`;ec!&}X-n2xjJHqyqsz>SsQS$pzyTu~TS(Sa0CFdUJv`lykA-)D3M@$t{u zjFG&T5rqryuB!PxJ_Sl U}<9!DEc~ld#^tKaE|d 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 E7gKQaod5s; literal 0 HcmV?d00001 diff --git a/Player/GrappleHook/PullGrapple.png~ b/Player/GrappleHook/PullGrapple.png~ new file mode 100644 index 0000000000000000000000000000000000000000..8ea81db46f496ac1efba48904571c42e5f2febcd GIT binary patch literal 119 zcmeAS@N?(olHy`uVBq!ia0vp^Y#_`5A|IT2?*XJZ3p^r=85s1GL71^(seKtxP}9@J zF@z&J`42x!Pfrie2?mWL2bjeEyl+rq6iRjybbK^H?;z7Aj@eHcw*KSu3tp3E2Gqph M>FVdQ&MBb@05dos2><{9 literal 0 HcmV?d00001 diff --git a/project.godot b/project.godot index e4ed4c5..f2ff6f4 100644 --- a/project.godot +++ b/project.godot @@ -21,6 +21,11 @@ config/icon="res://icon.svg" gen="*res://Core/Scripts/GeneralFunctions.gd" +[display] + +window/size/viewport_width=1920 +window/size/viewport_height=1080 + [editor] version_control/plugin_name="GitPlugin" @@ -71,10 +76,16 @@ spinGrapple={ , Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":81,"key_label":0,"unicode":113,"echo":false,"script":null) ] } +respawn={ +"deadzone": 0.5, +"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":82,"key_label":0,"unicode":114,"echo":false,"script":null) +, Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":4194308,"key_label":0,"unicode":0,"echo":false,"script":null) +] +} [physics] -common/physics_ticks_per_second=144 +common/physics_jitter_fix=0.0 2d/default_gravity=1300.0 [rendering]