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!ia0y~yU|<7b4iNd^%zF<81_sUokH}&M20djEW~^9hU&g?| zpzZ167{U>q{Nw+BduD+K4hyzU!zPvmlN4AJ4xBh~;sDF@g@zu}86q357BOttFaCMT T#MBT51_lOCS3j3^P6 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 b/Player/GrappleHook/GrappleHookProjectile/GrappleTether.png new file mode 100644 index 0000000000000000000000000000000000000000..9761fc4c4e22ded707d39f0d6ed60704129a403a GIT binary patch literal 133 zcmeAS@N?(olHy`uVBq!ia0y~yVBle3U|`{3V_;y|rFO52fq{Xuz$3Dlfk96hgc&QA z+LtjfFqnI~IEHXUC!3g={ae3u>Cpzhb+NmTHTcfqRN?=fCwc$? 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 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 RV_;xl@O1TaS?83{1OPKQAPE2f 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]