├── .gitignore ├── LICENSE ├── README.md └── source ├── actors ├── platform_actor.gd ├── state_machine │ ├── state_machine.gd │ ├── state_machine.tscn │ └── states │ │ ├── climb.gd │ │ ├── dash.gd │ │ ├── fall.gd │ │ ├── idle.gd │ │ ├── jump.gd │ │ ├── state.gd │ │ ├── walk.gd │ │ └── wall.gd └── template │ ├── animations │ ├── climb.tres │ ├── dash.tres │ ├── fall.tres │ ├── idle.tres │ ├── jump.tres │ ├── rest.tres │ ├── walk.tres │ └── wall.tres │ ├── coyotte_fall.tscn │ ├── cutout_character.gd │ ├── ladder_check.gd │ ├── ladder_check.tscn │ ├── pass_through.gd │ ├── pass_through.tscn │ ├── player_platform_actor.gd │ ├── template_actor.tscn │ ├── template_body_sprites.png │ ├── template_body_sprites.png.import │ ├── template_character.tscn │ ├── template_faces_sprites.png │ └── template_faces_sprites.png.import ├── areas └── tileset_template.tscn ├── default_bus_layout.tres ├── default_env.tres ├── icon.png ├── icon.png.import ├── interface ├── font │ ├── kenney_future.ttf │ ├── kenney_future_20.tres │ └── kenney_future_narrow.ttf └── themes │ └── template_theme_scene.tscn ├── juiceness ├── pop_score │ ├── pop_label.gd │ └── pop_label.tscn └── shake_camera │ ├── rigged_camera │ ├── camera_rig.gd │ └── camera_rig.tscn │ ├── shake_camera.gd │ └── shake_camera.tscn ├── levels └── template_level.tscn ├── objects ├── ladder │ └── ladder.tscn ├── pass_through_platform │ └── pass_through_platform.tscn └── pickup.tscn └── project.godot /.gitignore: -------------------------------------------------------------------------------- 1 | 2 | # Godot-specific ignores 3 | .import/ 4 | 5 | # Imported translations (automatically generated from CSV files) 6 | *.translation 7 | 8 | # Mono-specific ignores 9 | .mono/ 10 | data_*/ 11 | mono_crash.*.json 12 | 13 | # System/tool-specific ignores 14 | .directory 15 | *~ 16 | assets/ 17 | releases/ 18 | source/levels/demo/ 19 | source/interface/demo/ 20 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2018 Pigdev Studio 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Pigdev's Platform Template 2 | 3 | [![](https://img.itch.zone/aW1nLzEyMjYwODMucG5n/original/BoqJUa.png)](https://pigdev.itch.io/platform-template) 4 | A complete platform template project which aims to ease the development of platform games in [Godot Engine](https://github.com/godotengine/godot). 5 | 6 | 7 | [![](https://storage.googleapis.com/docs.itch.ovh/brand/rf/assets/badges/badge_color.png)](https://pigdev.itch.io/platform-template) 8 | 9 | This is the base code used for the Platform Template Assets at our itch.io page. The Assets Pack has exclusive contents such as: 10 | 11 | - Wiki-like **Tutorial** 12 | - Cookbook with **Tips&Tricks** 13 | - 4 **Cutout Animation Character** from Pigdev's Cutout Character 14 | - Editable Assets to customize sfx, vfx, characters and more 15 | 16 | **And of course exclusive premium support on our discord server** 17 | 18 | [![](https://i.imgur.com/Xd9P4oM.png)](https://discordapp.com/invite/fBhS9Zd) 19 | 20 | --- 21 | 22 | # Patrons 23 | 24 | This work wouldn't happen if it wasn't for the patronage of my beloved supporters :heart: 25 | 26 | | Patrons | 27 | |:------------------: | 28 | | DavidPeterWorks | 29 | | kycho | 30 | | Kyle Szklenski | 31 | | Laurence Bannister | 32 | | Peter Oldhammer | 33 | | Rebeca Araújo | 34 | | Ryan Whited | 35 | | Sheila Rodrigues | 36 | 37 | -------------------------------------------------------------------------------- /source/actors/platform_actor.gd: -------------------------------------------------------------------------------- 1 | extends KinematicBody2D 2 | 3 | var direction = 1 setget set_direction 4 | var velocity = Vector2(0, 0) setget set_velocity 5 | 6 | var state_machine = null 7 | 8 | export (float) var GRAVITY = 50 9 | export (Vector2) var FLOOR_NORMAL = Vector2(0, -1) 10 | export (float) var SLOPE_STOP_SPEED = 200 11 | export (float) var SLOPE_MAX_DEGREE = 46 12 | export (float) var FALL_THRESHOLD = 100 13 | 14 | export (bool) var can_dash = true 15 | 16 | signal action_performed(action) 17 | signal direction_changed(new_direction) 18 | 19 | func set_velocity(value): 20 | velocity = value 21 | 22 | func set_direction(value): 23 | direction = value 24 | emit_signal("direction_changed", value) 25 | 26 | func set_state(new_state): 27 | state_machine.state = new_state 28 | 29 | func get_state(): 30 | return state_machine.state 31 | 32 | func climb(): 33 | set_state("climb") 34 | 35 | func dash(): 36 | if not can_dash: 37 | return 38 | set_state("dash") 39 | 40 | func jump(): 41 | set_state("jump") 42 | 43 | func cancel_jump(): 44 | velocity.y = 0 45 | 46 | func fall(): 47 | set_state("fall") 48 | 49 | func walk(): 50 | set_state("walk") 51 | 52 | func idle(): 53 | set_state("idle") 54 | 55 | func wall_slide(): 56 | set_state("wall") 57 | 58 | func stop(): 59 | emit_signal("action_performed", "stop") 60 | 61 | func _ready(): 62 | state_machine = $state_machine 63 | set_state("idle") 64 | 65 | func _physics_process(delta): 66 | velocity = move_and_slide(velocity, FLOOR_NORMAL, 67 | SLOPE_STOP_SPEED, 4, deg2rad(SLOPE_MAX_DEGREE)) 68 | state_machine.state.process(self, delta) 69 | -------------------------------------------------------------------------------- /source/actors/state_machine/state_machine.gd: -------------------------------------------------------------------------------- 1 | extends Node 2 | 3 | export (NodePath) var actor = "../" 4 | var previous_state = null 5 | var state = null setget set_state, get_state 6 | signal state_changed(from, to) 7 | 8 | func _ready(): 9 | actor = get_node(actor) 10 | 11 | func set_state(new_state): 12 | new_state = get_node(new_state) 13 | 14 | if state != null: 15 | state.clear(actor) 16 | emit_signal("state_changed", state.name, new_state.name) 17 | previous_state = state 18 | else: 19 | previous_state = new_state 20 | state = new_state 21 | state.setup(actor, previous_state) 22 | 23 | func get_state(): 24 | return state 25 | -------------------------------------------------------------------------------- /source/actors/state_machine/state_machine.tscn: -------------------------------------------------------------------------------- 1 | [gd_scene load_steps=2 format=2] 2 | 3 | [ext_resource path="res://actors/state_machine/state_machine.gd" type="Script" id=1] 4 | 5 | [node name="state_machine" type="Node"] 6 | 7 | script = ExtResource( 1 ) 8 | actor = "../" 9 | 10 | 11 | -------------------------------------------------------------------------------- /source/actors/state_machine/states/climb.gd: -------------------------------------------------------------------------------- 1 | extends "state.gd" 2 | 3 | export (float) var speed = 200 4 | 5 | var direction = Vector2(0, -1) 6 | 7 | func setup(actor, previous_state): 8 | actor.velocity = Vector2(0, 0) 9 | actor.emit_signal("action_performed", "climb") 10 | 11 | func input_process(actor, event): 12 | if event.is_action_pressed(actor.up): 13 | direction.y = -1 14 | actor.emit_signal("action_performed", "climb") 15 | elif event.is_action_pressed(actor.down): 16 | direction.y = 1 17 | actor.emit_signal("action_performed", "climb") 18 | elif event.is_action_pressed(actor.left): 19 | direction.x = -1 20 | actor.emit_signal("action_performed", "climb") 21 | elif event.is_action_pressed(actor.right): 22 | direction.x = 1 23 | actor.emit_signal("action_performed", "climb") 24 | 25 | if event.is_action_released(actor.up) and direction.y == -1: 26 | actor.velocity.y = 0 27 | actor.emit_signal("action_performed", "stop") 28 | elif event.is_action_released(actor.down) and direction.y == 1: 29 | actor.velocity.y = 0 30 | actor.emit_signal("action_performed", "stop") 31 | elif event.is_action_released(actor.left) and direction.x == -1: 32 | actor.velocity.x = 0 33 | actor.emit_signal("action_performed", "stop") 34 | elif event.is_action_released(actor.right) and direction.x == 1: 35 | actor.velocity.x = 0 36 | actor.emit_signal("action_performed", "stop") 37 | 38 | if event.is_action_pressed(actor.jump): 39 | actor.jump() 40 | 41 | func process(actor, delta): 42 | 43 | if actor.is_on_floor(): 44 | actor.idle() 45 | 46 | if not actor.has_method("handle_input"): 47 | return 48 | 49 | if Input.is_action_pressed(actor.up): 50 | direction.y = -1 51 | actor.velocity.y = -speed 52 | elif Input.is_action_pressed(actor.down): 53 | direction.y = 1 54 | actor.velocity.y = speed 55 | elif Input.is_action_pressed(actor.left): 56 | direction.x = -1 57 | actor.velocity.x = -speed 58 | elif Input.is_action_pressed(actor.right): 59 | direction.x = 1 60 | actor.velocity.x = speed 61 | -------------------------------------------------------------------------------- /source/actors/state_machine/states/dash.gd: -------------------------------------------------------------------------------- 1 | extends "state.gd" 2 | export (int) var length = 300 3 | export (int) var speed = 600 4 | 5 | var init_pos = Vector2() 6 | 7 | var can_dash = true 8 | 9 | func setup(actor, previous_state): 10 | can_dash = true 11 | init_pos = actor.position 12 | 13 | match previous_state.name: 14 | "jump": 15 | if previous_state.jumps + 1 < previous_state.max_jumps: 16 | can_dash = false 17 | previous_state.jumps -= 1 18 | "fall": 19 | var jump = get_parent().get_node("jump") 20 | if jump.jumps + 1 < jump.max_jumps: 21 | can_dash = false 22 | jump.jumps -= 1 23 | 24 | if not can_dash: 25 | if previous_state.name == "jump": 26 | actor.fall() 27 | else: 28 | get_parent().state = previous_state.name 29 | return 30 | actor.velocity.y = 0 31 | 32 | actor.velocity.x = speed * actor.direction 33 | actor.emit_signal("action_performed", "dash") 34 | can_dash = false 35 | 36 | func input_process(actor, event): 37 | if event.is_action_released(actor.dash): 38 | if actor.is_on_floor(): 39 | actor.idle() 40 | else: 41 | actor.fall() 42 | 43 | if event.is_action_pressed(actor.jump): 44 | actor.jump() 45 | 46 | func process(actor, delta): 47 | if actor.is_on_wall(): 48 | actor.wall_slide() 49 | 50 | if abs(init_pos.x - actor.position.x) >= length: 51 | if actor.has_method("handle_input"): 52 | if Input.is_action_pressed(actor.right) or Input.is_action_pressed(actor.left): 53 | actor.walk() 54 | else: 55 | actor.idle() 56 | 57 | if not actor.is_on_floor(): 58 | return 59 | if actor.get_slide_count() < 1: 60 | return 61 | 62 | var collision = actor.get_slide_collision(0) 63 | if abs(rad2deg(collision.normal.angle())) > 90: 64 | actor.velocity = Vector2(speed * actor.direction, 0) 65 | -------------------------------------------------------------------------------- /source/actors/state_machine/states/fall.gd: -------------------------------------------------------------------------------- 1 | extends "state.gd" 2 | 3 | var in_air_speed = 400 4 | export (float) var MAX_FALL_SPEED = 2000 5 | 6 | func setup(actor, previous_state): 7 | in_air_speed = get_node("../walk").speed 8 | match previous_state.name: 9 | "jump": 10 | in_air_speed = previous_state.in_air_speed 11 | "walk": 12 | in_air_speed = previous_state.speed 13 | actor.emit_signal("action_performed", "fall") 14 | 15 | func input_process(actor, event): 16 | if event.is_action_pressed(actor.right): 17 | actor.direction = 1 18 | actor.velocity.x = in_air_speed * actor.direction 19 | elif event.is_action_pressed(actor.left): 20 | actor.direction = -1 21 | actor.velocity.x = in_air_speed * actor.direction 22 | if event.is_action_released(actor.right): 23 | actor.direction = 1 24 | actor.velocity.x = 0 25 | elif event.is_action_released(actor.left): 26 | actor.direction = -1 27 | actor.velocity.x = 0 28 | 29 | if event.is_action_pressed(actor.jump): 30 | actor.jump() 31 | 32 | if event.is_action_pressed(actor.dash): 33 | actor.dash() 34 | if event.is_action_released(actor.dash): 35 | in_air_speed = get_node("../walk").speed 36 | 37 | func process(actor, delta): 38 | actor.velocity.y += actor.GRAVITY 39 | actor.velocity.y = min(actor.velocity.y, MAX_FALL_SPEED) 40 | 41 | if actor.is_on_wall(): 42 | actor.wall_slide() 43 | 44 | if actor.has_method("handle_input"): 45 | if Input.is_action_pressed(actor.right): 46 | actor.direction = 1 47 | actor.velocity.x = in_air_speed * actor.direction 48 | elif Input.is_action_pressed(actor.left): 49 | actor.direction = -1 50 | actor.velocity.x = in_air_speed * actor.direction 51 | 52 | if actor.is_on_floor(): 53 | if actor.has_method("handle_input"): 54 | if Input.is_action_pressed(actor.right): 55 | actor.direction = 1 56 | actor.walk() 57 | elif Input.is_action_pressed(actor.left): 58 | actor.direction = -1 59 | actor.walk() 60 | else: 61 | actor.idle() 62 | else: 63 | actor.idle() 64 | -------------------------------------------------------------------------------- /source/actors/state_machine/states/idle.gd: -------------------------------------------------------------------------------- 1 | extends "state.gd" 2 | 3 | func setup(actor, previous_state): 4 | actor.velocity.x = 0 5 | actor.emit_signal("action_performed", "idle") 6 | 7 | func input_process(actor, event): 8 | if event.is_action_pressed(actor.jump): 9 | if Input.is_action_pressed(actor.down) and actor.has_node("pass_through"): 10 | if not actor.is_on_floor(): 11 | return 12 | actor.set_collision_mask_bit(3, false) 13 | else: 14 | actor.jump() 15 | 16 | if event.is_action_pressed(actor.right): 17 | actor.direction = 1 18 | actor.walk() 19 | elif event.is_action_pressed(actor.left): 20 | actor.direction = -1 21 | actor.walk() 22 | 23 | if event.is_action_pressed(actor.dash): 24 | actor.dash() 25 | 26 | func process(actor, delta): 27 | actor.velocity.y += actor.GRAVITY 28 | if actor.velocity.y > actor.FALL_THRESHOLD: 29 | actor.fall() 30 | -------------------------------------------------------------------------------- /source/actors/state_machine/states/jump.gd: -------------------------------------------------------------------------------- 1 | extends "state.gd" 2 | 3 | export (int) var jump_height = 800 4 | export (int) var max_jumps = 2 5 | 6 | var was_dashing = false 7 | var in_air_speed = 400.0 8 | 9 | onready var jumps = max_jumps setget set_jumps 10 | 11 | func setup(actor, previous_state): 12 | was_dashing = false 13 | in_air_speed = get_node("../walk").speed 14 | 15 | match previous_state.name: 16 | "idle": 17 | jumps = max_jumps 18 | "walk": 19 | jumps = max_jumps 20 | "fall": 21 | jumps = min(jumps, max_jumps - 1) 22 | "dash": 23 | in_air_speed = previous_state.speed 24 | jumps = max(max_jumps - 1, 1) 25 | was_dashing = true 26 | 27 | if jumps < 1: 28 | return 29 | 30 | jumps -= 1 31 | actor.velocity.y = -jump_height 32 | actor.emit_signal("action_performed", "jump") 33 | 34 | func input_process(actor, event): 35 | if event.is_action_pressed(actor.jump): 36 | actor.jump() 37 | elif event.is_action_released(actor.jump): 38 | actor.cancel_jump() 39 | 40 | if event.is_action_pressed(actor.right): 41 | actor.direction = 1 42 | actor.velocity.x = in_air_speed * actor.direction 43 | elif event.is_action_pressed(actor.left): 44 | actor.direction = -1 45 | actor.velocity.x = in_air_speed * actor.direction 46 | if event.is_action_released(actor.right): 47 | actor.direction = 1 48 | actor.velocity.x = 0 49 | elif event.is_action_released(actor.left): 50 | actor.direction = -1 51 | actor.velocity.x = 0 52 | 53 | if event.is_action_pressed(actor.dash) and jumps >= max_jumps - 1: 54 | if not was_dashing: 55 | actor.dash() 56 | if event.is_action_released(actor.dash): 57 | in_air_speed = get_node("../walk").speed 58 | 59 | func process(actor, delta): 60 | actor.velocity.y += actor.GRAVITY 61 | if actor.velocity.y > actor.FALL_THRESHOLD: 62 | actor.fall() 63 | if actor.is_on_wall(): 64 | actor.wall_slide() 65 | 66 | if not actor.has_method("handle_input"): 67 | return 68 | if Input.is_action_pressed(actor.right): 69 | actor.direction = 1 70 | actor.velocity.x = in_air_speed * actor.direction 71 | elif Input.is_action_pressed(actor.left): 72 | actor.direction = -1 73 | actor.velocity.x = in_air_speed * actor.direction 74 | 75 | func set_jumps(value): 76 | jumps = value 77 | jumps = clamp(jumps, 0, max_jumps) 78 | -------------------------------------------------------------------------------- /source/actors/state_machine/states/state.gd: -------------------------------------------------------------------------------- 1 | extends Node 2 | 3 | func _ready(): 4 | set_process_input(false) 5 | set_process(false) 6 | set_physics_process(false) 7 | 8 | func process(actor, delta): 9 | pass 10 | 11 | func input_process(actor, event): 12 | pass 13 | 14 | func setup(actor, previous_state): 15 | pass 16 | 17 | func clear(actor): 18 | pass 19 | -------------------------------------------------------------------------------- /source/actors/state_machine/states/walk.gd: -------------------------------------------------------------------------------- 1 | extends "state.gd" 2 | 3 | export (int) var speed = 400 4 | 5 | func setup(actor, previous_state): 6 | actor.velocity.x = speed * actor.direction 7 | actor.emit_signal("action_performed", "walk") 8 | $coyotte_fall.connect("timeout", self, "_on_coyotte_fall_timeout", [actor]) 9 | 10 | func clear(actor): 11 | $coyotte_fall.disconnect("timeout", self, "_on_coyotte_fall_timeout") 12 | 13 | func input_process(actor, event): 14 | if event.is_action_pressed(actor.jump): 15 | actor.jump() 16 | 17 | if event.is_action_pressed(actor.right): 18 | actor.direction = 1 19 | elif event.is_action_pressed(actor.left): 20 | actor.direction = -1 21 | 22 | if event.is_action_released(actor.right) and actor.direction == 1: 23 | if Input.is_action_pressed(actor.left): 24 | actor.direction = -1 25 | else: 26 | actor.idle() 27 | elif event.is_action_released(actor.left) and actor.direction == -1: 28 | if Input.is_action_pressed(actor.right): 29 | actor.direction = 1 30 | else: 31 | actor.idle() 32 | 33 | if event.is_action_pressed(actor.dash): 34 | actor.dash() 35 | 36 | func process(actor, delta): 37 | actor.velocity.y += actor.GRAVITY 38 | 39 | if actor.velocity.y > actor.FALL_THRESHOLD: 40 | $coyotte_fall.start() 41 | 42 | if not $coyotte_fall.is_stopped() and actor.is_on_wall(): 43 | actor.wall_slide() 44 | 45 | if actor.get_slide_count() < 1: 46 | return 47 | 48 | var collision = actor.get_slide_collision(0) 49 | if abs(rad2deg(collision.normal.angle())) > 90: 50 | actor.velocity = Vector2(speed * actor.direction, 0) 51 | 52 | func _on_coyotte_fall_timeout(actor): 53 | actor.fall() 54 | -------------------------------------------------------------------------------- /source/actors/state_machine/states/wall.gd: -------------------------------------------------------------------------------- 1 | extends "state.gd" 2 | 3 | export (float) var wall_jump = 800 4 | export (float) var dash_jump_multiplier = 1.4 5 | export (float) var MAX_WALL_SPEED = 600 6 | 7 | var normal = Vector2(0,0) 8 | 9 | func setup(actor, previous_state): 10 | normal = actor.get_slide_collision(0).normal 11 | actor.emit_signal("action_performed", "wall") 12 | 13 | func input_process(actor, event): 14 | if event.is_action_pressed(actor.jump) and actor.is_on_wall(): 15 | if Input.is_action_pressed(actor.dash): 16 | actor.velocity.x = (wall_jump * normal.x) 17 | actor.velocity.y = -wall_jump * dash_jump_multiplier 18 | actor.emit_signal("action_performed", "jump") 19 | else: 20 | actor.velocity.x = wall_jump * normal.x 21 | actor.velocity.y = -wall_jump 22 | actor.emit_signal("action_performed", "jump") 23 | 24 | elif event.is_action_pressed(actor.dash) and not actor.is_on_wall(): 25 | actor.dash() 26 | 27 | if event.is_action_released(actor.right) and sign(normal.x) == -1: 28 | actor.velocity.x = 0 29 | actor.fall() 30 | if event.is_action_released(actor.left) and sign(normal.x) == 1: 31 | actor.velocity.x = 0 32 | actor.fall() 33 | 34 | 35 | func process(actor, delta): 36 | if actor.is_on_wall(): 37 | actor.emit_signal("action_performed", "wall") 38 | actor.velocity.y /= 2 39 | elif actor.velocity.y > actor.FALL_THRESHOLD: 40 | actor.fall() 41 | actor.velocity.y += actor.GRAVITY 42 | 43 | if actor.is_on_floor(): 44 | if not actor.has_method("handle_input"): 45 | actor.idle() 46 | return 47 | if Input.is_action_pressed(actor.right) or Input.is_action_pressed(actor.left): 48 | actor.walk() 49 | else: 50 | actor.idle() 51 | 52 | if actor.has_method("handle_input"): 53 | if Input.is_action_pressed(actor.right) and sign(normal.x) == -1: 54 | actor.velocity.x += actor.GRAVITY * -sign(normal.x) * 2 55 | elif Input.is_action_pressed(actor.left) and sign(normal.x) == 1: 56 | actor.velocity.x += actor.GRAVITY * -sign(normal.x) * 2 57 | else: 58 | actor.velocity.x += actor.GRAVITY * -sign(normal.x) * 2 59 | 60 | actor.velocity.x = clamp(actor.velocity.x, -MAX_WALL_SPEED, MAX_WALL_SPEED) 61 | -------------------------------------------------------------------------------- /source/actors/template/animations/climb.tres: -------------------------------------------------------------------------------- 1 | [gd_resource type="Animation" format=2] 2 | 3 | [resource] 4 | 5 | resource_name = "climb" 6 | length = 0.5 7 | loop = true 8 | step = 0.05 9 | tracks/0/type = "value" 10 | tracks/0/path = NodePath("sprites/body:position") 11 | tracks/0/interp = 1 12 | tracks/0/loop_wrap = true 13 | tracks/0/imported = false 14 | tracks/0/enabled = true 15 | tracks/0/keys = { 16 | "times": PoolRealArray( 0, 0.25 ), 17 | "transitions": PoolRealArray( 0.383041, 0.383041 ), 18 | "update": 1, 19 | "values": [ Vector2( 2.40747e-07, -36.5 ), Vector2( 2.40747e-07, -36.5 ) ] 20 | } 21 | tracks/1/type = "value" 22 | tracks/1/path = NodePath("sprites/body:rotation_degrees") 23 | tracks/1/interp = 1 24 | tracks/1/loop_wrap = true 25 | tracks/1/imported = false 26 | tracks/1/enabled = true 27 | tracks/1/keys = { 28 | "times": PoolRealArray( 0, 0.25 ), 29 | "transitions": PoolRealArray( 0.383041, 0.383041 ), 30 | "update": 0, 31 | "values": [ -0.301418, -0.301418 ] 32 | } 33 | tracks/2/type = "value" 34 | tracks/2/path = NodePath("sprites/body/tail:position") 35 | tracks/2/interp = 1 36 | tracks/2/loop_wrap = true 37 | tracks/2/imported = false 38 | tracks/2/enabled = true 39 | tracks/2/keys = { 40 | "times": PoolRealArray( 0, 0.25 ), 41 | "transitions": PoolRealArray( 0.383041, 0.383041 ), 42 | "update": 0, 43 | "values": [ Vector2( -17.5182, 3.40789 ), Vector2( -17.5182, 3.40789 ) ] 44 | } 45 | tracks/3/type = "value" 46 | tracks/3/path = NodePath("sprites/body/tail:rotation_degrees") 47 | tracks/3/interp = 1 48 | tracks/3/loop_wrap = true 49 | tracks/3/imported = false 50 | tracks/3/enabled = true 51 | tracks/3/keys = { 52 | "times": PoolRealArray( 0, 0.25 ), 53 | "transitions": PoolRealArray( 0.383041, 0.383041 ), 54 | "update": 0, 55 | "values": [ 0.0, 0.0 ] 56 | } 57 | tracks/4/type = "value" 58 | tracks/4/path = NodePath("sprites/body/arm_r:position") 59 | tracks/4/interp = 1 60 | tracks/4/loop_wrap = true 61 | tracks/4/imported = false 62 | tracks/4/enabled = true 63 | tracks/4/keys = { 64 | "times": PoolRealArray( 0, 0.25 ), 65 | "transitions": PoolRealArray( 0.383041, 0.383041 ), 66 | "update": 0, 67 | "values": [ Vector2( -16.54, -38.5172 ), Vector2( -14.6146, -24.5205 ) ] 68 | } 69 | tracks/5/type = "value" 70 | tracks/5/path = NodePath("sprites/body/arm_r:rotation_degrees") 71 | tracks/5/interp = 1 72 | tracks/5/loop_wrap = true 73 | tracks/5/imported = false 74 | tracks/5/enabled = true 75 | tracks/5/keys = { 76 | "times": PoolRealArray( 0, 0.25 ), 77 | "transitions": PoolRealArray( 0.383041, 0.383041 ), 78 | "update": 0, 79 | "values": [ 147.563, 147.563 ] 80 | } 81 | tracks/6/type = "value" 82 | tracks/6/path = NodePath("sprites/leg_r:position") 83 | tracks/6/interp = 1 84 | tracks/6/loop_wrap = true 85 | tracks/6/imported = false 86 | tracks/6/enabled = true 87 | tracks/6/keys = { 88 | "times": PoolRealArray( 0, 0.25 ), 89 | "transitions": PoolRealArray( 0.383041, 0.383041 ), 90 | "update": 0, 91 | "values": [ Vector2( -10, -39 ), Vector2( -10, -50.4888 ) ] 92 | } 93 | tracks/7/type = "value" 94 | tracks/7/path = NodePath("sprites/leg_r:rotation_degrees") 95 | tracks/7/interp = 1 96 | tracks/7/loop_wrap = true 97 | tracks/7/imported = false 98 | tracks/7/enabled = true 99 | tracks/7/keys = { 100 | "times": PoolRealArray( 0, 0.25 ), 101 | "transitions": PoolRealArray( 0.383041, 0.383041 ), 102 | "update": 0, 103 | "values": [ 0.0, 0.0 ] 104 | } 105 | tracks/8/type = "value" 106 | tracks/8/path = NodePath("sprites/leg_l:position") 107 | tracks/8/interp = 1 108 | tracks/8/loop_wrap = true 109 | tracks/8/imported = false 110 | tracks/8/enabled = true 111 | tracks/8/keys = { 112 | "times": PoolRealArray( 0, 0.25 ), 113 | "transitions": PoolRealArray( 0.383041, 0.383041 ), 114 | "update": 0, 115 | "values": [ Vector2( 12, -46.4912 ), Vector2( 12, -40.9966 ) ] 116 | } 117 | tracks/9/type = "value" 118 | tracks/9/path = NodePath("sprites/leg_l:rotation_degrees") 119 | tracks/9/interp = 1 120 | tracks/9/loop_wrap = true 121 | tracks/9/imported = false 122 | tracks/9/enabled = true 123 | tracks/9/keys = { 124 | "times": PoolRealArray( 0, 0.25 ), 125 | "transitions": PoolRealArray( 0.383041, 0.383041 ), 126 | "update": 0, 127 | "values": [ 0.0, 0.0 ] 128 | } 129 | tracks/10/type = "value" 130 | tracks/10/path = NodePath("sprites/body/arm_l:position") 131 | tracks/10/interp = 1 132 | tracks/10/loop_wrap = true 133 | tracks/10/imported = false 134 | tracks/10/enabled = true 135 | tracks/10/keys = { 136 | "times": PoolRealArray( 0, 0.25 ), 137 | "transitions": PoolRealArray( 0.383041, 0.383041 ), 138 | "update": 0, 139 | "values": [ Vector2( 14.4106, -27.0091 ), Vector2( 14.4973, -43.4928 ) ] 140 | } 141 | tracks/11/type = "value" 142 | tracks/11/path = NodePath("sprites/body/arm_l:rotation_degrees") 143 | tracks/11/interp = 1 144 | tracks/11/loop_wrap = true 145 | tracks/11/imported = false 146 | tracks/11/enabled = true 147 | tracks/11/keys = { 148 | "times": PoolRealArray( 0, 0.25 ), 149 | "transitions": PoolRealArray( 0.383041, 0.383041 ), 150 | "update": 0, 151 | "values": [ -147.312, -147.312 ] 152 | } 153 | tracks/12/type = "value" 154 | tracks/12/path = NodePath("sprites/body/head:position") 155 | tracks/12/interp = 1 156 | tracks/12/loop_wrap = true 157 | tracks/12/imported = false 158 | tracks/12/enabled = true 159 | tracks/12/keys = { 160 | "times": PoolRealArray( 0, 0.25 ), 161 | "transitions": PoolRealArray( 0.383041, 0.383041 ), 162 | "update": 0, 163 | "values": [ Vector2( 1.27354, -51.994 ), Vector2( 1.27354, -51.994 ) ] 164 | } 165 | tracks/13/type = "value" 166 | tracks/13/path = NodePath("sprites/body/head:rotation_degrees") 167 | tracks/13/interp = 1 168 | tracks/13/loop_wrap = true 169 | tracks/13/imported = false 170 | tracks/13/enabled = true 171 | tracks/13/keys = { 172 | "times": PoolRealArray( 0, 0.25 ), 173 | "transitions": PoolRealArray( 0.383041, 0.383041 ), 174 | "update": 0, 175 | "values": [ 0.0, 0.0 ] 176 | } 177 | tracks/14/type = "value" 178 | tracks/14/path = NodePath("sprites/body/head:region_rect") 179 | tracks/14/interp = 1 180 | tracks/14/loop_wrap = true 181 | tracks/14/imported = false 182 | tracks/14/enabled = true 183 | tracks/14/keys = { 184 | "times": PoolRealArray( 0 ), 185 | "transitions": PoolRealArray( 1 ), 186 | "update": 0, 187 | "values": [ Rect2( 0, 0, 53, 60 ) ] 188 | } 189 | 190 | -------------------------------------------------------------------------------- /source/actors/template/animations/dash.tres: -------------------------------------------------------------------------------- 1 | [gd_resource type="Animation" format=2] 2 | 3 | [resource] 4 | 5 | resource_name = "dash" 6 | length = 1.0 7 | loop = false 8 | step = 0.1 9 | tracks/0/type = "value" 10 | tracks/0/path = NodePath("sprites/body/arm_l:position") 11 | tracks/0/interp = 1 12 | tracks/0/loop_wrap = true 13 | tracks/0/imported = false 14 | tracks/0/enabled = true 15 | tracks/0/keys = { 16 | "times": PoolRealArray( 0 ), 17 | "transitions": PoolRealArray( 1 ), 18 | "update": 0, 19 | "values": [ Vector2( -4.54972, -41.1639 ) ] 20 | } 21 | tracks/1/type = "value" 22 | tracks/1/path = NodePath("sprites/body/arm_l:rotation_degrees") 23 | tracks/1/interp = 1 24 | tracks/1/loop_wrap = true 25 | tracks/1/imported = false 26 | tracks/1/enabled = true 27 | tracks/1/keys = { 28 | "times": PoolRealArray( 0 ), 29 | "transitions": PoolRealArray( 1 ), 30 | "update": 0, 31 | "values": [ 83.2688 ] 32 | } 33 | tracks/2/type = "value" 34 | tracks/2/path = NodePath("sprites/body/head:position") 35 | tracks/2/interp = 1 36 | tracks/2/loop_wrap = true 37 | tracks/2/imported = false 38 | tracks/2/enabled = true 39 | tracks/2/keys = { 40 | "times": PoolRealArray( 0 ), 41 | "transitions": PoolRealArray( 1 ), 42 | "update": 0, 43 | "values": [ Vector2( 10.1502, -48.079 ) ] 44 | } 45 | tracks/3/type = "value" 46 | tracks/3/path = NodePath("sprites/body/head:rotation_degrees") 47 | tracks/3/interp = 1 48 | tracks/3/loop_wrap = true 49 | tracks/3/imported = false 50 | tracks/3/enabled = true 51 | tracks/3/keys = { 52 | "times": PoolRealArray( 0 ), 53 | "transitions": PoolRealArray( 1 ), 54 | "update": 0, 55 | "values": [ -25.8921 ] 56 | } 57 | tracks/4/type = "value" 58 | tracks/4/path = NodePath("sprites/body:position") 59 | tracks/4/interp = 1 60 | tracks/4/loop_wrap = true 61 | tracks/4/imported = false 62 | tracks/4/enabled = true 63 | tracks/4/keys = { 64 | "times": PoolRealArray( 0 ), 65 | "transitions": PoolRealArray( 1 ), 66 | "update": 0, 67 | "values": [ Vector2( 2.40747e-07, -36.5 ) ] 68 | } 69 | tracks/5/type = "value" 70 | tracks/5/path = NodePath("sprites/body:rotation_degrees") 71 | tracks/5/interp = 1 72 | tracks/5/loop_wrap = true 73 | tracks/5/imported = false 74 | tracks/5/enabled = true 75 | tracks/5/keys = { 76 | "times": PoolRealArray( 0 ), 77 | "transitions": PoolRealArray( 1 ), 78 | "update": 0, 79 | "values": [ 29.5293 ] 80 | } 81 | tracks/6/type = "value" 82 | tracks/6/path = NodePath("sprites/leg_l:position") 83 | tracks/6/interp = 1 84 | tracks/6/loop_wrap = true 85 | tracks/6/imported = false 86 | tracks/6/enabled = true 87 | tracks/6/keys = { 88 | "times": PoolRealArray( 0 ), 89 | "transitions": PoolRealArray( 1 ), 90 | "update": 0, 91 | "values": [ Vector2( 21.5, -46 ) ] 92 | } 93 | tracks/7/type = "value" 94 | tracks/7/path = NodePath("sprites/leg_l:rotation_degrees") 95 | tracks/7/interp = 1 96 | tracks/7/loop_wrap = true 97 | tracks/7/imported = false 98 | tracks/7/enabled = true 99 | tracks/7/keys = { 100 | "times": PoolRealArray( 0 ), 101 | "transitions": PoolRealArray( 1 ), 102 | "update": 0, 103 | "values": [ 1.16868 ] 104 | } 105 | tracks/8/type = "value" 106 | tracks/8/path = NodePath("sprites/leg_r:position") 107 | tracks/8/interp = 1 108 | tracks/8/loop_wrap = true 109 | tracks/8/imported = false 110 | tracks/8/enabled = true 111 | tracks/8/keys = { 112 | "times": PoolRealArray( 0 ), 113 | "transitions": PoolRealArray( 1 ), 114 | "update": 0, 115 | "values": [ Vector2( -10, -39 ) ] 116 | } 117 | tracks/9/type = "value" 118 | tracks/9/path = NodePath("sprites/leg_r:rotation_degrees") 119 | tracks/9/interp = 1 120 | tracks/9/loop_wrap = true 121 | tracks/9/imported = false 122 | tracks/9/enabled = true 123 | tracks/9/keys = { 124 | "times": PoolRealArray( 0 ), 125 | "transitions": PoolRealArray( 1 ), 126 | "update": 0, 127 | "values": [ 47.3099 ] 128 | } 129 | tracks/10/type = "value" 130 | tracks/10/path = NodePath("sprites/body/arm_r:position") 131 | tracks/10/interp = 1 132 | tracks/10/loop_wrap = true 133 | tracks/10/imported = false 134 | tracks/10/enabled = true 135 | tracks/10/keys = { 136 | "times": PoolRealArray( 0 ), 137 | "transitions": PoolRealArray( 1 ), 138 | "update": 0, 139 | "values": [ Vector2( -12.5211, -42.4922 ) ] 140 | } 141 | tracks/11/type = "value" 142 | tracks/11/path = NodePath("sprites/body/arm_r:rotation_degrees") 143 | tracks/11/interp = 1 144 | tracks/11/loop_wrap = true 145 | tracks/11/imported = false 146 | tracks/11/enabled = true 147 | tracks/11/keys = { 148 | "times": PoolRealArray( 0 ), 149 | "transitions": PoolRealArray( 1 ), 150 | "update": 0, 151 | "values": [ 51.5882 ] 152 | } 153 | tracks/12/type = "value" 154 | tracks/12/path = NodePath("sprites:scale") 155 | tracks/12/interp = 1 156 | tracks/12/loop_wrap = true 157 | tracks/12/imported = false 158 | tracks/12/enabled = true 159 | tracks/12/keys = { 160 | "times": PoolRealArray( 0 ), 161 | "transitions": PoolRealArray( 1 ), 162 | "update": 1, 163 | "values": [ Vector2( 1, 1 ) ] 164 | } 165 | tracks/13/type = "value" 166 | tracks/13/path = NodePath("sprites/body/head:region_rect") 167 | tracks/13/interp = 1 168 | tracks/13/loop_wrap = true 169 | tracks/13/imported = false 170 | tracks/13/enabled = true 171 | tracks/13/keys = { 172 | "times": PoolRealArray( 0 ), 173 | "transitions": PoolRealArray( 1 ), 174 | "update": 1, 175 | "values": [ Rect2( 0, 68, 53, 60 ) ] 176 | } 177 | 178 | -------------------------------------------------------------------------------- /source/actors/template/animations/fall.tres: -------------------------------------------------------------------------------- 1 | [gd_resource type="Animation" format=2] 2 | 3 | [resource] 4 | 5 | resource_name = "fall" 6 | length = 1.0 7 | loop = false 8 | step = 0.1 9 | tracks/0/type = "value" 10 | tracks/0/path = NodePath("sprites/body/arm_l:position") 11 | tracks/0/interp = 1 12 | tracks/0/loop_wrap = true 13 | tracks/0/imported = false 14 | tracks/0/enabled = true 15 | tracks/0/keys = { 16 | "times": PoolRealArray( 0 ), 17 | "transitions": PoolRealArray( 1 ), 18 | "update": 0, 19 | "values": [ Vector2( 14.4868, -41.4948 ) ] 20 | } 21 | tracks/1/type = "value" 22 | tracks/1/path = NodePath("sprites/body/arm_l:rotation_degrees") 23 | tracks/1/interp = 1 24 | tracks/1/loop_wrap = true 25 | tracks/1/imported = false 26 | tracks/1/enabled = true 27 | tracks/1/keys = { 28 | "times": PoolRealArray( 0 ), 29 | "transitions": PoolRealArray( 1 ), 30 | "update": 0, 31 | "values": [ -68.9079 ] 32 | } 33 | tracks/2/type = "value" 34 | tracks/2/path = NodePath("sprites/body/head:position") 35 | tracks/2/interp = 1 36 | tracks/2/loop_wrap = true 37 | tracks/2/imported = false 38 | tracks/2/enabled = true 39 | tracks/2/keys = { 40 | "times": PoolRealArray( 0 ), 41 | "transitions": PoolRealArray( 1 ), 42 | "update": 0, 43 | "values": [ Vector2( 4.61657, -47.9831 ) ] 44 | } 45 | tracks/3/type = "value" 46 | tracks/3/path = NodePath("sprites/body/head:rotation_degrees") 47 | tracks/3/interp = 1 48 | tracks/3/loop_wrap = true 49 | tracks/3/imported = false 50 | tracks/3/enabled = true 51 | tracks/3/keys = { 52 | "times": PoolRealArray( 0 ), 53 | "transitions": PoolRealArray( 1 ), 54 | "update": 0, 55 | "values": [ 6.56317 ] 56 | } 57 | tracks/4/type = "value" 58 | tracks/4/path = NodePath("sprites/body:position") 59 | tracks/4/interp = 1 60 | tracks/4/loop_wrap = true 61 | tracks/4/imported = false 62 | tracks/4/enabled = true 63 | tracks/4/keys = { 64 | "times": PoolRealArray( 0 ), 65 | "transitions": PoolRealArray( 1 ), 66 | "update": 0, 67 | "values": [ Vector2( 2.40747e-07, -36.5 ) ] 68 | } 69 | tracks/5/type = "value" 70 | tracks/5/path = NodePath("sprites/body:rotation_degrees") 71 | tracks/5/interp = 1 72 | tracks/5/loop_wrap = true 73 | tracks/5/imported = false 74 | tracks/5/enabled = true 75 | tracks/5/keys = { 76 | "times": PoolRealArray( 0 ), 77 | "transitions": PoolRealArray( 1 ), 78 | "update": 0, 79 | "values": [ 7.44802 ] 80 | } 81 | tracks/6/type = "value" 82 | tracks/6/path = NodePath("sprites/leg_l:position") 83 | tracks/6/interp = 1 84 | tracks/6/loop_wrap = true 85 | tracks/6/imported = false 86 | tracks/6/enabled = true 87 | tracks/6/keys = { 88 | "times": PoolRealArray( 0 ), 89 | "transitions": PoolRealArray( 1 ), 90 | "update": 0, 91 | "values": [ Vector2( 16.5, -46 ) ] 92 | } 93 | tracks/7/type = "value" 94 | tracks/7/path = NodePath("sprites/leg_l:rotation_degrees") 95 | tracks/7/interp = 1 96 | tracks/7/loop_wrap = true 97 | tracks/7/imported = false 98 | tracks/7/enabled = true 99 | tracks/7/keys = { 100 | "times": PoolRealArray( 0 ), 101 | "transitions": PoolRealArray( 1 ), 102 | "update": 0, 103 | "values": [ -23.4444 ] 104 | } 105 | tracks/8/type = "value" 106 | tracks/8/path = NodePath("sprites/leg_r:position") 107 | tracks/8/interp = 1 108 | tracks/8/loop_wrap = true 109 | tracks/8/imported = false 110 | tracks/8/enabled = true 111 | tracks/8/keys = { 112 | "times": PoolRealArray( 0 ), 113 | "transitions": PoolRealArray( 1 ), 114 | "update": 0, 115 | "values": [ Vector2( -10.5, -42.5 ) ] 116 | } 117 | tracks/9/type = "value" 118 | tracks/9/path = NodePath("sprites/leg_r:rotation_degrees") 119 | tracks/9/interp = 1 120 | tracks/9/loop_wrap = true 121 | tracks/9/imported = false 122 | tracks/9/enabled = true 123 | tracks/9/keys = { 124 | "times": PoolRealArray( 0 ), 125 | "transitions": PoolRealArray( 1 ), 126 | "update": 0, 127 | "values": [ 33.6009 ] 128 | } 129 | tracks/10/type = "value" 130 | tracks/10/path = NodePath("sprites/body/arm_r:position") 131 | tracks/10/interp = 1 132 | tracks/10/loop_wrap = true 133 | tracks/10/imported = false 134 | tracks/10/enabled = true 135 | tracks/10/keys = { 136 | "times": PoolRealArray( 0 ), 137 | "transitions": PoolRealArray( 1 ), 138 | "update": 0, 139 | "values": [ Vector2( -12.5211, -42.4922 ) ] 140 | } 141 | tracks/11/type = "value" 142 | tracks/11/path = NodePath("sprites/body/arm_r:rotation_degrees") 143 | tracks/11/interp = 1 144 | tracks/11/loop_wrap = true 145 | tracks/11/imported = false 146 | tracks/11/enabled = true 147 | tracks/11/keys = { 148 | "times": PoolRealArray( 0 ), 149 | "transitions": PoolRealArray( 1 ), 150 | "update": 0, 151 | "values": [ 59.5313 ] 152 | } 153 | tracks/12/type = "value" 154 | tracks/12/path = NodePath("sprites:scale") 155 | tracks/12/interp = 1 156 | tracks/12/loop_wrap = true 157 | tracks/12/imported = false 158 | tracks/12/enabled = true 159 | tracks/12/keys = { 160 | "times": PoolRealArray( 0 ), 161 | "transitions": PoolRealArray( 1 ), 162 | "update": 1, 163 | "values": [ Vector2( 1, 1 ) ] 164 | } 165 | tracks/13/type = "value" 166 | tracks/13/path = NodePath("sprites/body/head:region_rect") 167 | tracks/13/interp = 1 168 | tracks/13/loop_wrap = true 169 | tracks/13/imported = false 170 | tracks/13/enabled = true 171 | tracks/13/keys = { 172 | "times": PoolRealArray( 0 ), 173 | "transitions": PoolRealArray( 1 ), 174 | "update": 1, 175 | "values": [ Rect2( 0, 68, 53, 60 ) ] 176 | } 177 | 178 | -------------------------------------------------------------------------------- /source/actors/template/animations/idle.tres: -------------------------------------------------------------------------------- 1 | [gd_resource type="Animation" format=2] 2 | 3 | [resource] 4 | 5 | length = 1.0 6 | loop = true 7 | step = 0.05 8 | tracks/0/type = "value" 9 | tracks/0/path = NodePath("sprites/body/head:position") 10 | tracks/0/interp = 1 11 | tracks/0/loop_wrap = true 12 | tracks/0/imported = false 13 | tracks/0/enabled = true 14 | tracks/0/keys = { 15 | "times": PoolRealArray( 0, 0.5 ), 16 | "transitions": PoolRealArray( 0.25, 1 ), 17 | "update": 0, 18 | "values": [ Vector2( 3.26825, -50.9835 ), Vector2( 2.85747, -48.9356 ) ] 19 | } 20 | tracks/1/type = "value" 21 | tracks/1/path = NodePath("sprites/body/head:rotation_degrees") 22 | tracks/1/interp = 1 23 | tracks/1/loop_wrap = true 24 | tracks/1/imported = false 25 | tracks/1/enabled = true 26 | tracks/1/keys = { 27 | "times": PoolRealArray( 0, 0.5 ), 28 | "transitions": PoolRealArray( 1, 1 ), 29 | "update": 0, 30 | "values": [ -6.81253, 6.20868 ] 31 | } 32 | tracks/2/type = "value" 33 | tracks/2/path = NodePath("sprites/body:position") 34 | tracks/2/interp = 1 35 | tracks/2/loop_wrap = true 36 | tracks/2/imported = false 37 | tracks/2/enabled = true 38 | tracks/2/keys = { 39 | "times": PoolRealArray( 0, 0.5 ), 40 | "transitions": PoolRealArray( 1, 1 ), 41 | "update": 0, 42 | "values": [ Vector2( 2.40747e-07, -36.5 ), Vector2( 7.22241e-07, -34.5 ) ] 43 | } 44 | tracks/3/type = "value" 45 | tracks/3/path = NodePath("sprites/body:rotation_degrees") 46 | tracks/3/interp = 1 47 | tracks/3/loop_wrap = true 48 | tracks/3/imported = false 49 | tracks/3/enabled = true 50 | tracks/3/keys = { 51 | "times": PoolRealArray( 0, 0.5 ), 52 | "transitions": PoolRealArray( 1, 1 ), 53 | "update": 0, 54 | "values": [ -0.301418, -0.301418 ] 55 | } 56 | tracks/4/type = "value" 57 | tracks/4/path = NodePath("sprites/body/arm_l:position") 58 | tracks/4/interp = 1 59 | tracks/4/loop_wrap = true 60 | tracks/4/imported = false 61 | tracks/4/enabled = true 62 | tracks/4/keys = { 63 | "times": PoolRealArray( 0, 0.5 ), 64 | "transitions": PoolRealArray( 0.25, 1 ), 65 | "update": 0, 66 | "values": [ Vector2( 14.4868, -41.4948 ), Vector2( 14.4868, -41.4948 ) ] 67 | } 68 | tracks/5/type = "value" 69 | tracks/5/path = NodePath("sprites/body/arm_l:rotation_degrees") 70 | tracks/5/interp = 1 71 | tracks/5/loop_wrap = true 72 | tracks/5/imported = false 73 | tracks/5/enabled = true 74 | tracks/5/keys = { 75 | "times": PoolRealArray( 0, 0.5 ), 76 | "transitions": PoolRealArray( 0.25, 1 ), 77 | "update": 0, 78 | "values": [ -35.055, -21.6236 ] 79 | } 80 | tracks/6/type = "value" 81 | tracks/6/path = NodePath("sprites/body/arm_r:position") 82 | tracks/6/interp = 1 83 | tracks/6/loop_wrap = true 84 | tracks/6/imported = false 85 | tracks/6/enabled = true 86 | tracks/6/keys = { 87 | "times": PoolRealArray( 0, 0.5 ), 88 | "transitions": PoolRealArray( 0.25, 1 ), 89 | "update": 0, 90 | "values": [ Vector2( -12.5211, -42.4922 ), Vector2( -12.5211, -42.4922 ) ] 91 | } 92 | tracks/7/type = "value" 93 | tracks/7/path = NodePath("sprites/body/arm_r:rotation_degrees") 94 | tracks/7/interp = 1 95 | tracks/7/loop_wrap = true 96 | tracks/7/imported = false 97 | tracks/7/enabled = true 98 | tracks/7/keys = { 99 | "times": PoolRealArray( 0, 0.5 ), 100 | "transitions": PoolRealArray( 0.25, 1 ), 101 | "update": 0, 102 | "values": [ 34.9537, 25.9879 ] 103 | } 104 | tracks/8/type = "value" 105 | tracks/8/path = NodePath("sprites/leg_l:position") 106 | tracks/8/interp = 1 107 | tracks/8/loop_wrap = true 108 | tracks/8/imported = false 109 | tracks/8/enabled = true 110 | tracks/8/keys = { 111 | "times": PoolRealArray( 0, 0.5 ), 112 | "transitions": PoolRealArray( 1, 1 ), 113 | "update": 0, 114 | "values": [ Vector2( 12, -37.5 ), Vector2( 12, -37.5 ) ] 115 | } 116 | tracks/9/type = "value" 117 | tracks/9/path = NodePath("sprites/leg_l:rotation_degrees") 118 | tracks/9/interp = 1 119 | tracks/9/loop_wrap = true 120 | tracks/9/imported = false 121 | tracks/9/enabled = true 122 | tracks/9/keys = { 123 | "times": PoolRealArray( 0, 0.5 ), 124 | "transitions": PoolRealArray( 1, 1 ), 125 | "update": 0, 126 | "values": [ 0.0, 0.0 ] 127 | } 128 | tracks/10/type = "value" 129 | tracks/10/path = NodePath("sprites/leg_r:position") 130 | tracks/10/interp = 1 131 | tracks/10/loop_wrap = true 132 | tracks/10/imported = false 133 | tracks/10/enabled = true 134 | tracks/10/keys = { 135 | "times": PoolRealArray( 0, 0.5 ), 136 | "transitions": PoolRealArray( 1, 1 ), 137 | "update": 0, 138 | "values": [ Vector2( -10, -39 ), Vector2( -10, -39 ) ] 139 | } 140 | tracks/11/type = "value" 141 | tracks/11/path = NodePath("sprites/leg_r:rotation_degrees") 142 | tracks/11/interp = 1 143 | tracks/11/loop_wrap = true 144 | tracks/11/imported = false 145 | tracks/11/enabled = true 146 | tracks/11/keys = { 147 | "times": PoolRealArray( 0, 0.5 ), 148 | "transitions": PoolRealArray( 1, 1 ), 149 | "update": 0, 150 | "values": [ 0.0, 0.0 ] 151 | } 152 | tracks/12/type = "value" 153 | tracks/12/path = NodePath("sprites:scale") 154 | tracks/12/interp = 1 155 | tracks/12/loop_wrap = true 156 | tracks/12/imported = false 157 | tracks/12/enabled = true 158 | tracks/12/keys = { 159 | "times": PoolRealArray( 0 ), 160 | "transitions": PoolRealArray( 1 ), 161 | "update": 1, 162 | "values": [ Vector2( 1, 1 ) ] 163 | } 164 | tracks/13/type = "value" 165 | tracks/13/path = NodePath("sprites/body/head:region_rect") 166 | tracks/13/interp = 1 167 | tracks/13/loop_wrap = true 168 | tracks/13/imported = false 169 | tracks/13/enabled = true 170 | tracks/13/keys = { 171 | "times": PoolRealArray( 0 ), 172 | "transitions": PoolRealArray( 1 ), 173 | "update": 1, 174 | "values": [ Rect2( 0, 68, 53, 60 ) ] 175 | } 176 | 177 | -------------------------------------------------------------------------------- /source/actors/template/animations/jump.tres: -------------------------------------------------------------------------------- 1 | [gd_resource type="Animation" format=2] 2 | 3 | [resource] 4 | 5 | resource_name = "jump" 6 | length = 1.0 7 | loop = false 8 | step = 0.1 9 | tracks/0/type = "value" 10 | tracks/0/path = NodePath("sprites/body/arm_l:position") 11 | tracks/0/interp = 1 12 | tracks/0/loop_wrap = true 13 | tracks/0/imported = false 14 | tracks/0/enabled = true 15 | tracks/0/keys = { 16 | "times": PoolRealArray( 0 ), 17 | "transitions": PoolRealArray( 1 ), 18 | "update": 0, 19 | "values": [ Vector2( 14.4868, -41.4948 ) ] 20 | } 21 | tracks/1/type = "value" 22 | tracks/1/path = NodePath("sprites/body/arm_l:rotation_degrees") 23 | tracks/1/interp = 1 24 | tracks/1/loop_wrap = true 25 | tracks/1/imported = false 26 | tracks/1/enabled = true 27 | tracks/1/keys = { 28 | "times": PoolRealArray( 0 ), 29 | "transitions": PoolRealArray( 1 ), 30 | "update": 0, 31 | "values": [ -20.0575 ] 32 | } 33 | tracks/2/type = "value" 34 | tracks/2/path = NodePath("sprites/body/head:position") 35 | tracks/2/interp = 1 36 | tracks/2/loop_wrap = true 37 | tracks/2/imported = false 38 | tracks/2/enabled = true 39 | tracks/2/keys = { 40 | "times": PoolRealArray( 0 ), 41 | "transitions": PoolRealArray( 1 ), 42 | "update": 0, 43 | "values": [ Vector2( 3.66709, -51.3887 ) ] 44 | } 45 | tracks/3/type = "value" 46 | tracks/3/path = NodePath("sprites/body/head:rotation_degrees") 47 | tracks/3/interp = 1 48 | tracks/3/loop_wrap = true 49 | tracks/3/imported = false 50 | tracks/3/enabled = true 51 | tracks/3/keys = { 52 | "times": PoolRealArray( 0 ), 53 | "transitions": PoolRealArray( 1 ), 54 | "update": 0, 55 | "values": [ -22.0052 ] 56 | } 57 | tracks/4/type = "value" 58 | tracks/4/path = NodePath("sprites/body:position") 59 | tracks/4/interp = 1 60 | tracks/4/loop_wrap = true 61 | tracks/4/imported = false 62 | tracks/4/enabled = true 63 | tracks/4/keys = { 64 | "times": PoolRealArray( 0 ), 65 | "transitions": PoolRealArray( 1 ), 66 | "update": 0, 67 | "values": [ Vector2( 2.40747e-07, -36.5 ) ] 68 | } 69 | tracks/5/type = "value" 70 | tracks/5/path = NodePath("sprites/body:rotation_degrees") 71 | tracks/5/interp = 1 72 | tracks/5/loop_wrap = true 73 | tracks/5/imported = false 74 | tracks/5/enabled = true 75 | tracks/5/keys = { 76 | "times": PoolRealArray( 0 ), 77 | "transitions": PoolRealArray( 1 ), 78 | "update": 0, 79 | "values": [ 7.44802 ] 80 | } 81 | tracks/6/type = "value" 82 | tracks/6/path = NodePath("sprites/leg_l:position") 83 | tracks/6/interp = 1 84 | tracks/6/loop_wrap = true 85 | tracks/6/imported = false 86 | tracks/6/enabled = true 87 | tracks/6/keys = { 88 | "times": PoolRealArray( 0 ), 89 | "transitions": PoolRealArray( 1 ), 90 | "update": 0, 91 | "values": [ Vector2( 16.5, -46 ) ] 92 | } 93 | tracks/7/type = "value" 94 | tracks/7/path = NodePath("sprites/leg_l:rotation_degrees") 95 | tracks/7/interp = 1 96 | tracks/7/loop_wrap = true 97 | tracks/7/imported = false 98 | tracks/7/enabled = true 99 | tracks/7/keys = { 100 | "times": PoolRealArray( 0 ), 101 | "transitions": PoolRealArray( 1 ), 102 | "update": 0, 103 | "values": [ 0.0 ] 104 | } 105 | tracks/8/type = "value" 106 | tracks/8/path = NodePath("sprites/leg_r:position") 107 | tracks/8/interp = 1 108 | tracks/8/loop_wrap = true 109 | tracks/8/imported = false 110 | tracks/8/enabled = true 111 | tracks/8/keys = { 112 | "times": PoolRealArray( 0 ), 113 | "transitions": PoolRealArray( 1 ), 114 | "update": 0, 115 | "values": [ Vector2( -10, -39 ) ] 116 | } 117 | tracks/9/type = "value" 118 | tracks/9/path = NodePath("sprites/leg_r:rotation_degrees") 119 | tracks/9/interp = 1 120 | tracks/9/loop_wrap = true 121 | tracks/9/imported = false 122 | tracks/9/enabled = true 123 | tracks/9/keys = { 124 | "times": PoolRealArray( 0 ), 125 | "transitions": PoolRealArray( 1 ), 126 | "update": 0, 127 | "values": [ 25.9731 ] 128 | } 129 | tracks/10/type = "value" 130 | tracks/10/path = NodePath("sprites/body/arm_r:position") 131 | tracks/10/interp = 1 132 | tracks/10/loop_wrap = true 133 | tracks/10/imported = false 134 | tracks/10/enabled = true 135 | tracks/10/keys = { 136 | "times": PoolRealArray( 0 ), 137 | "transitions": PoolRealArray( 1 ), 138 | "update": 0, 139 | "values": [ Vector2( -12.5211, -42.4922 ) ] 140 | } 141 | tracks/11/type = "value" 142 | tracks/11/path = NodePath("sprites/body/arm_r:rotation_degrees") 143 | tracks/11/interp = 1 144 | tracks/11/loop_wrap = true 145 | tracks/11/imported = false 146 | tracks/11/enabled = true 147 | tracks/11/keys = { 148 | "times": PoolRealArray( 0 ), 149 | "transitions": PoolRealArray( 1 ), 150 | "update": 0, 151 | "values": [ 25.7485 ] 152 | } 153 | tracks/12/type = "value" 154 | tracks/12/path = NodePath("sprites:scale") 155 | tracks/12/interp = 1 156 | tracks/12/loop_wrap = true 157 | tracks/12/imported = false 158 | tracks/12/enabled = true 159 | tracks/12/keys = { 160 | "times": PoolRealArray( 0 ), 161 | "transitions": PoolRealArray( 1 ), 162 | "update": 1, 163 | "values": [ Vector2( 1, 1 ) ] 164 | } 165 | tracks/13/type = "value" 166 | tracks/13/path = NodePath("sprites/body/head:region_rect") 167 | tracks/13/interp = 1 168 | tracks/13/loop_wrap = true 169 | tracks/13/imported = false 170 | tracks/13/enabled = true 171 | tracks/13/keys = { 172 | "times": PoolRealArray( 0 ), 173 | "transitions": PoolRealArray( 1 ), 174 | "update": 1, 175 | "values": [ Rect2( 0, 68, 53, 60 ) ] 176 | } 177 | 178 | -------------------------------------------------------------------------------- /source/actors/template/animations/rest.tres: -------------------------------------------------------------------------------- 1 | [gd_resource type="Animation" format=2] 2 | 3 | [resource] 4 | 5 | resource_name = "SETUP" 6 | length = 0.2 7 | loop = false 8 | step = 0.1 9 | tracks/0/type = "value" 10 | tracks/0/path = NodePath(".:rotation_degrees") 11 | tracks/0/interp = 1 12 | tracks/0/loop_wrap = true 13 | tracks/0/imported = false 14 | tracks/0/enabled = true 15 | tracks/0/keys = { 16 | "times": PoolRealArray( 0 ), 17 | "transitions": PoolRealArray( 1 ), 18 | "update": 0, 19 | "values": [ 0.0 ] 20 | } 21 | tracks/1/type = "value" 22 | tracks/1/path = NodePath(".:position") 23 | tracks/1/interp = 1 24 | tracks/1/loop_wrap = true 25 | tracks/1/imported = false 26 | tracks/1/enabled = true 27 | tracks/1/keys = { 28 | "times": PoolRealArray( 0 ), 29 | "transitions": PoolRealArray( 1 ), 30 | "update": 0, 31 | "values": [ Vector2( 0, 0 ) ] 32 | } 33 | tracks/2/type = "value" 34 | tracks/2/path = NodePath("sprites/body/tail:position") 35 | tracks/2/interp = 1 36 | tracks/2/loop_wrap = true 37 | tracks/2/imported = false 38 | tracks/2/enabled = true 39 | tracks/2/keys = { 40 | "times": PoolRealArray( 0 ), 41 | "transitions": PoolRealArray( 1 ), 42 | "update": 0, 43 | "values": [ Vector2( -17.5182, 3.40789 ) ] 44 | } 45 | tracks/3/type = "value" 46 | tracks/3/path = NodePath("sprites/body/tail:rotation_degrees") 47 | tracks/3/interp = 1 48 | tracks/3/loop_wrap = true 49 | tracks/3/imported = false 50 | tracks/3/enabled = true 51 | tracks/3/keys = { 52 | "times": PoolRealArray( 0 ), 53 | "transitions": PoolRealArray( 1 ), 54 | "update": 0, 55 | "values": [ 0.0 ] 56 | } 57 | tracks/4/type = "value" 58 | tracks/4/path = NodePath("sprites/body/arm_l:position") 59 | tracks/4/interp = 1 60 | tracks/4/loop_wrap = true 61 | tracks/4/imported = false 62 | tracks/4/enabled = true 63 | tracks/4/keys = { 64 | "times": PoolRealArray( 0 ), 65 | "transitions": PoolRealArray( 1 ), 66 | "update": 0, 67 | "values": [ Vector2( 14.4868, -41.4948 ) ] 68 | } 69 | tracks/5/type = "value" 70 | tracks/5/path = NodePath("sprites/body/arm_l:rotation_degrees") 71 | tracks/5/interp = 1 72 | tracks/5/loop_wrap = true 73 | tracks/5/imported = false 74 | tracks/5/enabled = true 75 | tracks/5/keys = { 76 | "times": PoolRealArray( 0 ), 77 | "transitions": PoolRealArray( 1 ), 78 | "update": 0, 79 | "values": [ -35.055 ] 80 | } 81 | tracks/6/type = "value" 82 | tracks/6/path = NodePath("sprites/body/head:position") 83 | tracks/6/interp = 1 84 | tracks/6/loop_wrap = true 85 | tracks/6/imported = false 86 | tracks/6/enabled = true 87 | tracks/6/keys = { 88 | "times": PoolRealArray( 0 ), 89 | "transitions": PoolRealArray( 1 ), 90 | "update": 0, 91 | "values": [ Vector2( 1.27354, -51.994 ) ] 92 | } 93 | tracks/7/type = "value" 94 | tracks/7/path = NodePath("sprites/body/head:rotation_degrees") 95 | tracks/7/interp = 1 96 | tracks/7/loop_wrap = true 97 | tracks/7/imported = false 98 | tracks/7/enabled = true 99 | tracks/7/keys = { 100 | "times": PoolRealArray( 0 ), 101 | "transitions": PoolRealArray( 1 ), 102 | "update": 0, 103 | "values": [ 0.0 ] 104 | } 105 | tracks/8/type = "value" 106 | tracks/8/path = NodePath("sprites/body:position") 107 | tracks/8/interp = 1 108 | tracks/8/loop_wrap = true 109 | tracks/8/imported = false 110 | tracks/8/enabled = true 111 | tracks/8/keys = { 112 | "times": PoolRealArray( 0 ), 113 | "transitions": PoolRealArray( 1 ), 114 | "update": 0, 115 | "values": [ Vector2( 2.40747e-07, -36.5 ) ] 116 | } 117 | tracks/9/type = "value" 118 | tracks/9/path = NodePath("sprites/body:rotation_degrees") 119 | tracks/9/interp = 1 120 | tracks/9/loop_wrap = true 121 | tracks/9/imported = false 122 | tracks/9/enabled = true 123 | tracks/9/keys = { 124 | "times": PoolRealArray( 0 ), 125 | "transitions": PoolRealArray( 1 ), 126 | "update": 0, 127 | "values": [ -0.301418 ] 128 | } 129 | tracks/10/type = "value" 130 | tracks/10/path = NodePath("sprites/leg_l:position") 131 | tracks/10/interp = 1 132 | tracks/10/loop_wrap = true 133 | tracks/10/imported = false 134 | tracks/10/enabled = true 135 | tracks/10/keys = { 136 | "times": PoolRealArray( 0 ), 137 | "transitions": PoolRealArray( 1 ), 138 | "update": 0, 139 | "values": [ Vector2( 12, -37.5 ) ] 140 | } 141 | tracks/11/type = "value" 142 | tracks/11/path = NodePath("sprites/leg_l:rotation_degrees") 143 | tracks/11/interp = 1 144 | tracks/11/loop_wrap = true 145 | tracks/11/imported = false 146 | tracks/11/enabled = true 147 | tracks/11/keys = { 148 | "times": PoolRealArray( 0 ), 149 | "transitions": PoolRealArray( 1 ), 150 | "update": 0, 151 | "values": [ 0.0 ] 152 | } 153 | tracks/12/type = "value" 154 | tracks/12/path = NodePath("sprites/leg_r:position") 155 | tracks/12/interp = 1 156 | tracks/12/loop_wrap = true 157 | tracks/12/imported = false 158 | tracks/12/enabled = true 159 | tracks/12/keys = { 160 | "times": PoolRealArray( 0 ), 161 | "transitions": PoolRealArray( 1 ), 162 | "update": 0, 163 | "values": [ Vector2( -10, -39 ) ] 164 | } 165 | tracks/13/type = "value" 166 | tracks/13/path = NodePath("sprites/leg_r:rotation_degrees") 167 | tracks/13/interp = 1 168 | tracks/13/loop_wrap = true 169 | tracks/13/imported = false 170 | tracks/13/enabled = true 171 | tracks/13/keys = { 172 | "times": PoolRealArray( 0 ), 173 | "transitions": PoolRealArray( 1 ), 174 | "update": 0, 175 | "values": [ 0.0 ] 176 | } 177 | tracks/14/type = "value" 178 | tracks/14/path = NodePath("sprites/body/arm_r:position") 179 | tracks/14/interp = 1 180 | tracks/14/loop_wrap = true 181 | tracks/14/imported = false 182 | tracks/14/enabled = true 183 | tracks/14/keys = { 184 | "times": PoolRealArray( 0 ), 185 | "transitions": PoolRealArray( 1 ), 186 | "update": 0, 187 | "values": [ Vector2( -12.5211, -42.4922 ) ] 188 | } 189 | tracks/15/type = "value" 190 | tracks/15/path = NodePath("sprites/body/arm_r:rotation_degrees") 191 | tracks/15/interp = 1 192 | tracks/15/loop_wrap = true 193 | tracks/15/imported = false 194 | tracks/15/enabled = true 195 | tracks/15/keys = { 196 | "times": PoolRealArray( 0 ), 197 | "transitions": PoolRealArray( 1 ), 198 | "update": 0, 199 | "values": [ 34.9537 ] 200 | } 201 | tracks/16/type = "value" 202 | tracks/16/path = NodePath("sprites:scale") 203 | tracks/16/interp = 1 204 | tracks/16/loop_wrap = true 205 | tracks/16/imported = false 206 | tracks/16/enabled = true 207 | tracks/16/keys = { 208 | "times": PoolRealArray( 0 ), 209 | "transitions": PoolRealArray( 1 ), 210 | "update": 1, 211 | "values": [ Vector2( 1, 1 ) ] 212 | } 213 | tracks/17/type = "value" 214 | tracks/17/path = NodePath("sprites/body/head:region_rect") 215 | tracks/17/interp = 1 216 | tracks/17/loop_wrap = true 217 | tracks/17/imported = false 218 | tracks/17/enabled = true 219 | tracks/17/keys = { 220 | "times": PoolRealArray( 0 ), 221 | "transitions": PoolRealArray( 1 ), 222 | "update": 1, 223 | "values": [ Rect2( 0, 68, 53, 60 ) ] 224 | } 225 | 226 | -------------------------------------------------------------------------------- /source/actors/template/animations/walk.tres: -------------------------------------------------------------------------------- 1 | [gd_resource type="Animation" format=2] 2 | 3 | [resource] 4 | 5 | length = 0.5 6 | loop = true 7 | step = 0.05 8 | tracks/0/type = "value" 9 | tracks/0/path = NodePath("sprites/body/arm_l:position") 10 | tracks/0/interp = 1 11 | tracks/0/loop_wrap = true 12 | tracks/0/imported = false 13 | tracks/0/enabled = true 14 | tracks/0/keys = { 15 | "times": PoolRealArray( 0, 0.25 ), 16 | "transitions": PoolRealArray( 0.25, 0.25 ), 17 | "update": 0, 18 | "values": [ Vector2( -8.526, -39.1158 ), Vector2( 1.31299, -37.5524 ) ] 19 | } 20 | tracks/1/type = "value" 21 | tracks/1/path = NodePath("sprites/body/arm_l:rotation_degrees") 22 | tracks/1/interp = 1 23 | tracks/1/loop_wrap = true 24 | tracks/1/imported = false 25 | tracks/1/enabled = true 26 | tracks/1/keys = { 27 | "times": PoolRealArray( 0, 0.25 ), 28 | "transitions": PoolRealArray( 0.25, 0.25 ), 29 | "update": 0, 30 | "values": [ 46.2551, -82.2369 ] 31 | } 32 | tracks/2/type = "value" 33 | tracks/2/path = NodePath("sprites/body/head:position") 34 | tracks/2/interp = 1 35 | tracks/2/loop_wrap = true 36 | tracks/2/imported = false 37 | tracks/2/enabled = true 38 | tracks/2/keys = { 39 | "times": PoolRealArray( 0, 0.25 ), 40 | "transitions": PoolRealArray( 1, 1 ), 41 | "update": 0, 42 | "values": [ Vector2( 3.57682, -51.5055 ), Vector2( 1.45102, -52.199 ) ] 43 | } 44 | tracks/3/type = "value" 45 | tracks/3/path = NodePath("sprites/body/head:rotation_degrees") 46 | tracks/3/interp = 1 47 | tracks/3/loop_wrap = true 48 | tracks/3/imported = false 49 | tracks/3/enabled = true 50 | tracks/3/keys = { 51 | "times": PoolRealArray( 0, 0.25 ), 52 | "transitions": PoolRealArray( 1, 1 ), 53 | "update": 0, 54 | "values": [ -1.42635, -18.9888 ] 55 | } 56 | tracks/4/type = "value" 57 | tracks/4/path = NodePath("sprites/body:position") 58 | tracks/4/interp = 1 59 | tracks/4/loop_wrap = true 60 | tracks/4/imported = false 61 | tracks/4/enabled = true 62 | tracks/4/keys = { 63 | "times": PoolRealArray( 0, 0.1, 0.25, 0.4 ), 64 | "transitions": PoolRealArray( 0.25, 1, 1, 0.25 ), 65 | "update": 0, 66 | "values": [ Vector2( 2.40747e-07, -36.5 ), Vector2( 6.85453e-07, -30.5 ), Vector2( 2.40747e-07, -36.5 ), Vector2( 6.85453e-07, -30.5 ) ] 67 | } 68 | tracks/5/type = "value" 69 | tracks/5/path = NodePath("sprites/body:rotation_degrees") 70 | tracks/5/interp = 1 71 | tracks/5/loop_wrap = true 72 | tracks/5/imported = false 73 | tracks/5/enabled = true 74 | tracks/5/keys = { 75 | "times": PoolRealArray( 0, 0.1, 0.25, 0.4 ), 76 | "transitions": PoolRealArray( 1, 1, 1, 1 ), 77 | "update": 0, 78 | "values": [ 8.4967, 8.4967, 8.4967, 8.4967 ] 79 | } 80 | tracks/6/type = "value" 81 | tracks/6/path = NodePath("sprites/leg_l:position") 82 | tracks/6/interp = 1 83 | tracks/6/loop_wrap = true 84 | tracks/6/imported = false 85 | tracks/6/enabled = true 86 | tracks/6/keys = { 87 | "times": PoolRealArray( 0, 0.25 ), 88 | "transitions": PoolRealArray( 0.25, 0.25 ), 89 | "update": 0, 90 | "values": [ Vector2( 0.5, -36 ), Vector2( -4, -38 ) ] 91 | } 92 | tracks/7/type = "value" 93 | tracks/7/path = NodePath("sprites/leg_l:rotation_degrees") 94 | tracks/7/interp = 1 95 | tracks/7/loop_wrap = true 96 | tracks/7/imported = false 97 | tracks/7/enabled = true 98 | tracks/7/keys = { 99 | "times": PoolRealArray( 0, 0.25 ), 100 | "transitions": PoolRealArray( 0.25, 0.25 ), 101 | "update": 0, 102 | "values": [ -57.5123, 48.3429 ] 103 | } 104 | tracks/8/type = "value" 105 | tracks/8/path = NodePath("sprites/leg_r:position") 106 | tracks/8/interp = 1 107 | tracks/8/loop_wrap = true 108 | tracks/8/imported = false 109 | tracks/8/enabled = true 110 | tracks/8/keys = { 111 | "times": PoolRealArray( 0, 0.25 ), 112 | "transitions": PoolRealArray( 0.25, 0.25 ), 113 | "update": 0, 114 | "values": [ Vector2( -2, -39 ), Vector2( 0, -33.5 ) ] 115 | } 116 | tracks/9/type = "value" 117 | tracks/9/path = NodePath("sprites/leg_r:rotation_degrees") 118 | tracks/9/interp = 1 119 | tracks/9/loop_wrap = true 120 | tracks/9/imported = false 121 | tracks/9/enabled = true 122 | tracks/9/keys = { 123 | "times": PoolRealArray( 0, 0.25 ), 124 | "transitions": PoolRealArray( 0.25, 0.25 ), 125 | "update": 0, 126 | "values": [ 48.8258, -72.3006 ] 127 | } 128 | tracks/10/type = "value" 129 | tracks/10/path = NodePath("sprites/body/arm_r:position") 130 | tracks/10/interp = 1 131 | tracks/10/loop_wrap = true 132 | tracks/10/imported = false 133 | tracks/10/enabled = true 134 | tracks/10/keys = { 135 | "times": PoolRealArray( 0, 0.25 ), 136 | "transitions": PoolRealArray( 0.25, 0.25 ), 137 | "update": 0, 138 | "values": [ Vector2( -14.05, -37.0001 ), Vector2( -9.27523, -42.2634 ) ] 139 | } 140 | tracks/11/type = "value" 141 | tracks/11/path = NodePath("sprites/body/arm_r:rotation_degrees") 142 | tracks/11/interp = 1 143 | tracks/11/loop_wrap = true 144 | tracks/11/imported = false 145 | tracks/11/enabled = true 146 | tracks/11/keys = { 147 | "times": PoolRealArray( 0, 0.25 ), 148 | "transitions": PoolRealArray( 0.25, 0.25 ), 149 | "update": 0, 150 | "values": [ -71.781, 48.5298 ] 151 | } 152 | tracks/12/type = "value" 153 | tracks/12/path = NodePath("sprites:scale") 154 | tracks/12/interp = 1 155 | tracks/12/loop_wrap = true 156 | tracks/12/imported = false 157 | tracks/12/enabled = true 158 | tracks/12/keys = { 159 | "times": PoolRealArray( 0 ), 160 | "transitions": PoolRealArray( 1 ), 161 | "update": 1, 162 | "values": [ Vector2( 1, 1 ) ] 163 | } 164 | tracks/13/type = "value" 165 | tracks/13/path = NodePath("sprites/body/head:region_rect") 166 | tracks/13/interp = 1 167 | tracks/13/loop_wrap = true 168 | tracks/13/imported = false 169 | tracks/13/enabled = true 170 | tracks/13/keys = { 171 | "times": PoolRealArray( 0 ), 172 | "transitions": PoolRealArray( 1 ), 173 | "update": 1, 174 | "values": [ Rect2( 0, 68, 53, 60 ) ] 175 | } 176 | 177 | -------------------------------------------------------------------------------- /source/actors/template/animations/wall.tres: -------------------------------------------------------------------------------- 1 | [gd_resource type="Animation" format=2] 2 | 3 | [resource] 4 | 5 | resource_name = "wall" 6 | length = 1.0 7 | loop = false 8 | step = 0.1 9 | tracks/0/type = "value" 10 | tracks/0/path = NodePath("sprites/body/arm_l:position") 11 | tracks/0/interp = 1 12 | tracks/0/loop_wrap = true 13 | tracks/0/imported = false 14 | tracks/0/enabled = true 15 | tracks/0/keys = { 16 | "times": PoolRealArray( 0 ), 17 | "transitions": PoolRealArray( 1 ), 18 | "update": 0, 19 | "values": [ Vector2( 14.4868, -41.4948 ) ] 20 | } 21 | tracks/1/type = "value" 22 | tracks/1/path = NodePath("sprites/body/arm_l:rotation_degrees") 23 | tracks/1/interp = 1 24 | tracks/1/loop_wrap = true 25 | tracks/1/imported = false 26 | tracks/1/enabled = true 27 | tracks/1/keys = { 28 | "times": PoolRealArray( 0 ), 29 | "transitions": PoolRealArray( 1 ), 30 | "update": 0, 31 | "values": [ -18.8972 ] 32 | } 33 | tracks/2/type = "value" 34 | tracks/2/path = NodePath("sprites/body/head:position") 35 | tracks/2/interp = 1 36 | tracks/2/loop_wrap = true 37 | tracks/2/imported = false 38 | tracks/2/enabled = true 39 | tracks/2/keys = { 40 | "times": PoolRealArray( 0 ), 41 | "transitions": PoolRealArray( 1 ), 42 | "update": 0, 43 | "values": [ Vector2( 1.2099, -47.0413 ) ] 44 | } 45 | tracks/3/type = "value" 46 | tracks/3/path = NodePath("sprites/body/head:rotation_degrees") 47 | tracks/3/interp = 1 48 | tracks/3/loop_wrap = true 49 | tracks/3/imported = false 50 | tracks/3/enabled = true 51 | tracks/3/keys = { 52 | "times": PoolRealArray( 0 ), 53 | "transitions": PoolRealArray( 1 ), 54 | "update": 0, 55 | "values": [ 6.90001 ] 56 | } 57 | tracks/4/type = "value" 58 | tracks/4/path = NodePath("sprites/body:position") 59 | tracks/4/interp = 1 60 | tracks/4/loop_wrap = true 61 | tracks/4/imported = false 62 | tracks/4/enabled = true 63 | tracks/4/keys = { 64 | "times": PoolRealArray( 0 ), 65 | "transitions": PoolRealArray( 1 ), 66 | "update": 0, 67 | "values": [ Vector2( 2.40747e-07, -36.5 ) ] 68 | } 69 | tracks/5/type = "value" 70 | tracks/5/path = NodePath("sprites/body:rotation_degrees") 71 | tracks/5/interp = 1 72 | tracks/5/loop_wrap = true 73 | tracks/5/imported = false 74 | tracks/5/enabled = true 75 | tracks/5/keys = { 76 | "times": PoolRealArray( 0 ), 77 | "transitions": PoolRealArray( 1 ), 78 | "update": 0, 79 | "values": [ 7.55874 ] 80 | } 81 | tracks/6/type = "value" 82 | tracks/6/path = NodePath("sprites/leg_l:position") 83 | tracks/6/interp = 1 84 | tracks/6/loop_wrap = true 85 | tracks/6/imported = false 86 | tracks/6/enabled = true 87 | tracks/6/keys = { 88 | "times": PoolRealArray( 0 ), 89 | "transitions": PoolRealArray( 1 ), 90 | "update": 0, 91 | "values": [ Vector2( 19.5, -51.5 ) ] 92 | } 93 | tracks/7/type = "value" 94 | tracks/7/path = NodePath("sprites/leg_l:rotation_degrees") 95 | tracks/7/interp = 1 96 | tracks/7/loop_wrap = true 97 | tracks/7/imported = false 98 | tracks/7/enabled = true 99 | tracks/7/keys = { 100 | "times": PoolRealArray( 0 ), 101 | "transitions": PoolRealArray( 1 ), 102 | "update": 0, 103 | "values": [ 0.0 ] 104 | } 105 | tracks/8/type = "value" 106 | tracks/8/path = NodePath("sprites/leg_r:position") 107 | tracks/8/interp = 1 108 | tracks/8/loop_wrap = true 109 | tracks/8/imported = false 110 | tracks/8/enabled = true 111 | tracks/8/keys = { 112 | "times": PoolRealArray( 0 ), 113 | "transitions": PoolRealArray( 1 ), 114 | "update": 0, 115 | "values": [ Vector2( -10, -39 ) ] 116 | } 117 | tracks/9/type = "value" 118 | tracks/9/path = NodePath("sprites/leg_r:rotation_degrees") 119 | tracks/9/interp = 1 120 | tracks/9/loop_wrap = true 121 | tracks/9/imported = false 122 | tracks/9/enabled = true 123 | tracks/9/keys = { 124 | "times": PoolRealArray( 0 ), 125 | "transitions": PoolRealArray( 1 ), 126 | "update": 0, 127 | "values": [ 34.8664 ] 128 | } 129 | tracks/10/type = "value" 130 | tracks/10/path = NodePath("sprites/body/arm_r:position") 131 | tracks/10/interp = 1 132 | tracks/10/loop_wrap = true 133 | tracks/10/imported = false 134 | tracks/10/enabled = true 135 | tracks/10/keys = { 136 | "times": PoolRealArray( 0 ), 137 | "transitions": PoolRealArray( 1 ), 138 | "update": 0, 139 | "values": [ Vector2( -13.6839, -32.2502 ) ] 140 | } 141 | tracks/11/type = "value" 142 | tracks/11/path = NodePath("sprites/body/arm_r:rotation_degrees") 143 | tracks/11/interp = 1 144 | tracks/11/loop_wrap = true 145 | tracks/11/imported = false 146 | tracks/11/enabled = true 147 | tracks/11/keys = { 148 | "times": PoolRealArray( 0 ), 149 | "transitions": PoolRealArray( 1 ), 150 | "update": 0, 151 | "values": [ 133.594 ] 152 | } 153 | tracks/12/type = "value" 154 | tracks/12/path = NodePath("sprites:scale") 155 | tracks/12/interp = 1 156 | tracks/12/loop_wrap = true 157 | tracks/12/imported = false 158 | tracks/12/enabled = true 159 | tracks/12/keys = { 160 | "times": PoolRealArray( 0 ), 161 | "transitions": PoolRealArray( 1 ), 162 | "update": 1, 163 | "values": [ Vector2( -1, 1 ) ] 164 | } 165 | tracks/13/type = "value" 166 | tracks/13/path = NodePath("sprites/body/head:region_rect") 167 | tracks/13/interp = 1 168 | tracks/13/loop_wrap = true 169 | tracks/13/imported = false 170 | tracks/13/enabled = true 171 | tracks/13/keys = { 172 | "times": PoolRealArray( 0 ), 173 | "transitions": PoolRealArray( 1 ), 174 | "update": 1, 175 | "values": [ Rect2( 0, 68, 53, 60 ) ] 176 | } 177 | 178 | -------------------------------------------------------------------------------- /source/actors/template/coyotte_fall.tscn: -------------------------------------------------------------------------------- 1 | [gd_scene load_steps=2 format=2] 2 | 3 | [sub_resource type="GDScript" id=1] 4 | script/source = "extends Timer 5 | 6 | export (bool) var coyotte_fall = false 7 | 8 | func start(default_time = -1): # error(5,1): Function signature doesn't match the parent. Parent signature is: 'void start(float=default)'. 9 | if coyotte_fall: 10 | .start(default_time) 11 | else: 12 | emit_signal(\"timeout\") 13 | stop() 14 | " 15 | 16 | [node name="coyotte_fall" type="Timer"] 17 | process_mode = 0 18 | wait_time = 0.25 19 | one_shot = true 20 | script = SubResource( 1 ) 21 | -------------------------------------------------------------------------------- /source/actors/template/cutout_character.gd: -------------------------------------------------------------------------------- 1 | extends Node2D 2 | onready var initial_scale = get_scale() 3 | 4 | enum directions {RIGHT, LEFT} 5 | 6 | func flip_sprites(direction): 7 | if direction == directions.RIGHT: 8 | scale.x = initial_scale.x 9 | else: 10 | scale.x = initial_scale.x * -1 11 | 12 | func _on_actor_direction_changed(new_direction): 13 | if new_direction < 0: 14 | flip_sprites(directions.LEFT) 15 | else: 16 | flip_sprites(directions.RIGHT) 17 | 18 | func _on_actor_action_performed(action): 19 | match action: 20 | "idle": 21 | $animator.play("idle") 22 | "walk": 23 | $animator.play("walk") 24 | "jump": 25 | $animator.play("jump") 26 | "fall": 27 | $animator.play("fall") 28 | "dash": 29 | $animator.play("dash") 30 | "wall": 31 | $animator.play("wall") 32 | "climb": 33 | $animator.play("climb") 34 | "stop": 35 | $animator.stop(false) 36 | -------------------------------------------------------------------------------- /source/actors/template/ladder_check.gd: -------------------------------------------------------------------------------- 1 | extends Area2D 2 | 3 | export (bool) var snap = false 4 | 5 | onready var actor = get_parent() 6 | var is_on_ladder = false 7 | var already_snap = false 8 | var center = null 9 | 10 | func _input(event): 11 | if not is_on_ladder: 12 | return 13 | if event.is_action_pressed(actor.down) or event.is_action_pressed(actor.up): 14 | actor.set_collision_mask_bit(2, false) 15 | actor.climb() 16 | if not snap or already_snap: 17 | return 18 | #Searches for an area to snap to 19 | actor.global_position.x = center 20 | already_snap = true 21 | 22 | func _on_ladder_check_body_entered(body): 23 | is_on_ladder = true 24 | center = body.global_position.x 25 | 26 | func _on_ladder_check_area_entered(area): 27 | is_on_ladder = true 28 | center = area.global_position.x 29 | 30 | func _on_ladder_check_area_exited(area): 31 | is_on_ladder = false 32 | already_snap = false 33 | actor.set_collision_mask_bit(2, true) 34 | actor.fall() 35 | -------------------------------------------------------------------------------- /source/actors/template/ladder_check.tscn: -------------------------------------------------------------------------------- 1 | [gd_scene load_steps=3 format=2] 2 | 3 | [ext_resource path="res://actors/template/ladder_check.gd" type="Script" id=1] 4 | 5 | [sub_resource type="RectangleShape2D" id=1] 6 | 7 | custom_solver_bias = 0.0 8 | extents = Vector2( 24, 56 ) 9 | 10 | [node name="ladder_check" type="Area2D"] 11 | 12 | z_index = -1 13 | input_pickable = true 14 | gravity_vec = Vector2( 0, 1 ) 15 | gravity = 98.0 16 | linear_damp = 0.1 17 | angular_damp = 1.0 18 | collision_layer = 0 19 | collision_mask = 4 20 | audio_bus_override = false 21 | audio_bus_name = "Master" 22 | script = ExtResource( 1 ) 23 | _sections_unfolded = [ "Collision", "Transform" ] 24 | snap = false 25 | 26 | [node name="shape" type="CollisionShape2D" parent="." index="0"] 27 | 28 | position = Vector2( 0, -48 ) 29 | shape = SubResource( 1 ) 30 | 31 | [connection signal="area_entered" from="." to="." method="_on_ladder_check_area_entered"] 32 | 33 | [connection signal="area_exited" from="." to="." method="_on_ladder_check_area_exited"] 34 | 35 | [connection signal="body_entered" from="." to="." method="_on_ladder_check_body_entered"] 36 | 37 | 38 | -------------------------------------------------------------------------------- /source/actors/template/pass_through.gd: -------------------------------------------------------------------------------- 1 | extends Area2D 2 | 3 | func _on_pass_through_body_exited(body): 4 | if body.get_collision_layer_bit(3) and not get_parent().get_collision_mask_bit(3): 5 | get_parent().set_collision_mask_bit(3, true) 6 | -------------------------------------------------------------------------------- /source/actors/template/pass_through.tscn: -------------------------------------------------------------------------------- 1 | [gd_scene load_steps=3 format=2] 2 | 3 | [ext_resource path="res://actors/template/pass_through.gd" type="Script" id=1] 4 | 5 | [sub_resource type="RectangleShape2D" id=1] 6 | 7 | custom_solver_bias = 0.0 8 | extents = Vector2( 24, 48 ) 9 | 10 | [node name="pass_through" type="Area2D"] 11 | 12 | z_index = -1 13 | input_pickable = true 14 | gravity_vec = Vector2( 0, 1 ) 15 | gravity = 98.0 16 | linear_damp = 0.1 17 | angular_damp = 1.0 18 | collision_layer = 0 19 | collision_mask = 8 20 | audio_bus_override = false 21 | audio_bus_name = "Master" 22 | script = ExtResource( 1 ) 23 | _sections_unfolded = [ "Collision" ] 24 | 25 | [node name="shape" type="CollisionShape2D" parent="." index="0"] 26 | 27 | position = Vector2( 0, -48 ) 28 | shape = SubResource( 1 ) 29 | _sections_unfolded = [ "Transform" ] 30 | 31 | [connection signal="body_exited" from="." to="." method="_on_pass_through_body_exited"] 32 | 33 | 34 | -------------------------------------------------------------------------------- /source/actors/template/player_platform_actor.gd: -------------------------------------------------------------------------------- 1 | extends "../platform_actor.gd" 2 | 3 | export (String) var left = "left_1" 4 | export (String) var right = "right_1" 5 | export (String) var up = "up_1" 6 | export (String) var down = "down_1" 7 | export (String) var jump = "jump_1" 8 | export (String) var dash = "dash_1" 9 | 10 | func handle_input(): 11 | pass 12 | 13 | func _input(event): 14 | state_machine.state.input_process(self, event) 15 | -------------------------------------------------------------------------------- /source/actors/template/template_actor.tscn: -------------------------------------------------------------------------------- 1 | [gd_scene load_steps=15 format=2] 2 | 3 | [ext_resource path="res://actors/template/player_platform_actor.gd" type="Script" id=1] 4 | [ext_resource path="res://actors/state_machine/state_machine.tscn" type="PackedScene" id=2] 5 | [ext_resource path="res://actors/state_machine/states/idle.gd" type="Script" id=3] 6 | [ext_resource path="res://actors/state_machine/states/walk.gd" type="Script" id=4] 7 | [ext_resource path="res://actors/template/coyotte_fall.tscn" type="PackedScene" id=5] 8 | [ext_resource path="res://actors/state_machine/states/jump.gd" type="Script" id=6] 9 | [ext_resource path="res://actors/state_machine/states/dash.gd" type="Script" id=7] 10 | [ext_resource path="res://actors/state_machine/states/fall.gd" type="Script" id=8] 11 | [ext_resource path="res://actors/state_machine/states/wall.gd" type="Script" id=9] 12 | [ext_resource path="res://actors/state_machine/states/climb.gd" type="Script" id=10] 13 | [ext_resource path="res://actors/template/pass_through.tscn" type="PackedScene" id=11] 14 | [ext_resource path="res://actors/template/ladder_check.tscn" type="PackedScene" id=12] 15 | [ext_resource path="res://actors/template/template_character.tscn" type="PackedScene" id=13] 16 | 17 | [sub_resource type="RectangleShape2D" id=1] 18 | extents = Vector2( 24, 48 ) 19 | 20 | [node name="template_actor" type="KinematicBody2D"] 21 | collision_layer = 2 22 | collision_mask = 15 23 | script = ExtResource( 1 ) 24 | 25 | [node name="shape" type="CollisionShape2D" parent="."] 26 | position = Vector2( 0, -48 ) 27 | z_index = -1 28 | shape = SubResource( 1 ) 29 | 30 | [node name="state_machine" parent="." instance=ExtResource( 2 )] 31 | 32 | [node name="idle" type="Node" parent="state_machine"] 33 | script = ExtResource( 3 ) 34 | 35 | [node name="walk" type="Node" parent="state_machine"] 36 | script = ExtResource( 4 ) 37 | 38 | [node name="coyotte_fall" parent="state_machine/walk" instance=ExtResource( 5 )] 39 | 40 | [node name="jump" type="Node" parent="state_machine"] 41 | script = ExtResource( 6 ) 42 | max_jumps = 1 43 | 44 | [node name="dash" type="Node" parent="state_machine"] 45 | script = ExtResource( 7 ) 46 | speed = 1000 47 | 48 | [node name="fall" type="Node" parent="state_machine"] 49 | script = ExtResource( 8 ) 50 | 51 | [node name="wall" type="Node" parent="state_machine"] 52 | script = ExtResource( 9 ) 53 | 54 | [node name="climb" type="Node" parent="state_machine"] 55 | script = ExtResource( 10 ) 56 | 57 | [node name="pass_through" parent="." instance=ExtResource( 11 )] 58 | 59 | [node name="ladder_check" parent="." instance=ExtResource( 12 )] 60 | snap = true 61 | 62 | [node name="template_character" parent="." instance=ExtResource( 13 )] 63 | scale = Vector2( 0.75, 0.75 ) 64 | [connection signal="action_performed" from="." to="template_character" method="_on_actor_action_performed"] 65 | [connection signal="direction_changed" from="." to="template_character" method="_on_actor_direction_changed"] 66 | -------------------------------------------------------------------------------- /source/actors/template/template_body_sprites.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pigdevstudio/platform_template/c2598366c2a711e11ec1ff62b5950caad6fea8c1/source/actors/template/template_body_sprites.png -------------------------------------------------------------------------------- /source/actors/template/template_body_sprites.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="StreamTexture" 5 | path="res://.import/template_body_sprites.png-3c5a108a5d9c98f3b164105ce3b85974.stex" 6 | metadata={ 7 | "vram_texture": false 8 | } 9 | 10 | [deps] 11 | 12 | source_file="res://actors/template/template_body_sprites.png" 13 | dest_files=[ "res://.import/template_body_sprites.png-3c5a108a5d9c98f3b164105ce3b85974.stex" ] 14 | 15 | [params] 16 | 17 | compress/mode=0 18 | compress/lossy_quality=0.7 19 | compress/hdr_mode=0 20 | compress/bptc_ldr=0 21 | compress/normal_map=0 22 | flags/repeat=0 23 | flags/filter=true 24 | flags/mipmaps=false 25 | flags/anisotropic=false 26 | flags/srgb=2 27 | process/fix_alpha_border=true 28 | process/premult_alpha=false 29 | process/HDR_as_SRGB=false 30 | process/invert_color=false 31 | stream=false 32 | size_limit=0 33 | detect_3d=true 34 | svg/scale=1.0 35 | -------------------------------------------------------------------------------- /source/actors/template/template_character.tscn: -------------------------------------------------------------------------------- 1 | [gd_scene load_steps=12 format=2] 2 | 3 | [ext_resource path="res://actors/template/cutout_character.gd" type="Script" id=1] 4 | [ext_resource path="res://actors/template/animations/rest.tres" type="Animation" id=2] 5 | [ext_resource path="res://actors/template/animations/climb.tres" type="Animation" id=3] 6 | [ext_resource path="res://actors/template/animations/dash.tres" type="Animation" id=4] 7 | [ext_resource path="res://actors/template/animations/fall.tres" type="Animation" id=5] 8 | [ext_resource path="res://actors/template/animations/idle.tres" type="Animation" id=6] 9 | [ext_resource path="res://actors/template/animations/jump.tres" type="Animation" id=7] 10 | [ext_resource path="res://actors/template/animations/walk.tres" type="Animation" id=8] 11 | [ext_resource path="res://actors/template/animations/wall.tres" type="Animation" id=9] 12 | [ext_resource path="res://actors/template/template_body_sprites.png" type="Texture" id=10] 13 | [ext_resource path="res://actors/template/template_faces_sprites.png" type="Texture" id=11] 14 | 15 | [node name="template_character" type="Position2D"] 16 | 17 | script = ExtResource( 1 ) 18 | _sections_unfolded = [ "Transform" ] 19 | 20 | [node name="animator" type="AnimationPlayer" parent="." index="0"] 21 | 22 | root_node = NodePath("..") 23 | autoplay = "idle" 24 | playback_process_mode = 1 25 | playback_default_blend_time = 0.08 26 | playback_speed = 1.0 27 | anims/SETUP = ExtResource( 2 ) 28 | anims/climb = ExtResource( 3 ) 29 | anims/dash = ExtResource( 4 ) 30 | anims/fall = ExtResource( 5 ) 31 | anims/idle = ExtResource( 6 ) 32 | anims/jump = ExtResource( 7 ) 33 | anims/walk = ExtResource( 8 ) 34 | anims/wall = ExtResource( 9 ) 35 | blend_times = [ ] 36 | _sections_unfolded = [ "Playback Options" ] 37 | 38 | [node name="sprites" type="Node2D" parent="." index="1"] 39 | 40 | _sections_unfolded = [ "Transform" ] 41 | 42 | [node name="leg_l" type="Sprite" parent="sprites" index="0"] 43 | 44 | position = Vector2( 12, -37.5 ) 45 | z_index = -1 46 | texture = ExtResource( 10 ) 47 | offset = Vector2( 0, 18 ) 48 | region_enabled = true 49 | region_rect = Rect2( 65, 216, 14, 39 ) 50 | _sections_unfolded = [ "Transform", "Z Index" ] 51 | 52 | [node name="leg_r" type="Sprite" parent="sprites" index="1"] 53 | 54 | position = Vector2( -10, -39 ) 55 | z_index = -1 56 | texture = ExtResource( 10 ) 57 | offset = Vector2( 0, 20 ) 58 | region_enabled = true 59 | region_rect = Rect2( 1, 216, 14, 39 ) 60 | _sections_unfolded = [ "Region", "Z Index" ] 61 | 62 | [node name="body" type="Sprite" parent="sprites" index="2"] 63 | 64 | position = Vector2( 2.40747e-07, -36.5 ) 65 | rotation = -0.00526074 66 | texture = ExtResource( 10 ) 67 | offset = Vector2( 0.960531, -20.4948 ) 68 | region_enabled = true 69 | region_rect = Rect2( 1, 57, 49, 71 ) 70 | _sections_unfolded = [ "Transform" ] 71 | 72 | [node name="head" type="Sprite" parent="sprites/body" index="0"] 73 | 74 | position = Vector2( 1.27354, -51.994 ) 75 | texture = ExtResource( 11 ) 76 | offset = Vector2( 0.128969, -21.4457 ) 77 | region_enabled = true 78 | region_rect = Rect2( 0, 68, 53, 60 ) 79 | _sections_unfolded = [ "Region", "Transform", "Visibility", "Z Index" ] 80 | 81 | [node name="arm_l" type="Sprite" parent="sprites/body" index="1"] 82 | 83 | position = Vector2( 14.4868, -41.4948 ) 84 | rotation = -0.611825 85 | z_index = -1 86 | texture = ExtResource( 10 ) 87 | offset = Vector2( 0, 18 ) 88 | region_enabled = true 89 | region_rect = Rect2( 192, 153, 14, 39 ) 90 | _sections_unfolded = [ "Region", "Z Index" ] 91 | 92 | [node name="arm_r" type="Sprite" parent="sprites/body" index="2"] 93 | 94 | position = Vector2( -12.5211, -42.4922 ) 95 | rotation = 0.610057 96 | texture = ExtResource( 10 ) 97 | offset = Vector2( 0, 20 ) 98 | region_enabled = true 99 | region_rect = Rect2( 128, 153, 14, 39 ) 100 | _sections_unfolded = [ "Region" ] 101 | 102 | [node name="tail" type="Sprite" parent="sprites/body" index="3"] 103 | 104 | position = Vector2( -17.5182, 3.40789 ) 105 | z_index = -1 106 | texture = ExtResource( 10 ) 107 | offset = Vector2( -15.4446, -10.5814 ) 108 | region_enabled = true 109 | _sections_unfolded = [ "Region", "Z Index" ] 110 | 111 | 112 | -------------------------------------------------------------------------------- /source/actors/template/template_faces_sprites.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pigdevstudio/platform_template/c2598366c2a711e11ec1ff62b5950caad6fea8c1/source/actors/template/template_faces_sprites.png -------------------------------------------------------------------------------- /source/actors/template/template_faces_sprites.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="StreamTexture" 5 | path="res://.import/template_faces_sprites.png-903e52da18b3730bb59914e39f174f65.stex" 6 | metadata={ 7 | "vram_texture": false 8 | } 9 | 10 | [deps] 11 | 12 | source_file="res://actors/template/template_faces_sprites.png" 13 | dest_files=[ "res://.import/template_faces_sprites.png-903e52da18b3730bb59914e39f174f65.stex" ] 14 | 15 | [params] 16 | 17 | compress/mode=0 18 | compress/lossy_quality=0.7 19 | compress/hdr_mode=0 20 | compress/bptc_ldr=0 21 | compress/normal_map=0 22 | flags/repeat=0 23 | flags/filter=true 24 | flags/mipmaps=false 25 | flags/anisotropic=false 26 | flags/srgb=2 27 | process/fix_alpha_border=true 28 | process/premult_alpha=false 29 | process/HDR_as_SRGB=false 30 | process/invert_color=false 31 | stream=false 32 | size_limit=0 33 | detect_3d=true 34 | svg/scale=1.0 35 | -------------------------------------------------------------------------------- /source/areas/tileset_template.tscn: -------------------------------------------------------------------------------- 1 | [gd_scene format=2] 2 | 3 | [node name="Tileset" type="Node2D"] 4 | position = Vector2( 20, 0 ) 5 | 6 | [node name="guidelines" type="Control" parent="."] 7 | margin_right = 40.0 8 | margin_bottom = 40.0 9 | 10 | [node name="slope" type="Label" parent="guidelines"] 11 | margin_left = -20.0 12 | margin_top = 336.0 13 | margin_right = 108.0 14 | margin_bottom = 350.0 15 | text = "45º slope" 16 | align = 1 17 | 18 | [node name="slope2" type="Label" parent="guidelines"] 19 | margin_left = 124.0 20 | margin_top = 336.0 21 | margin_right = 252.0 22 | margin_bottom = 350.0 23 | text = "22.5º slope" 24 | align = 1 25 | 26 | [node name="slope3" type="Label" parent="guidelines"] 27 | margin_left = 268.0 28 | margin_top = 336.0 29 | margin_right = 396.0 30 | margin_bottom = 350.0 31 | text = "15º slope" 32 | align = 1 33 | 34 | [node name="slope4" type="Label" parent="guidelines"] 35 | margin_left = 412.0 36 | margin_top = 336.0 37 | margin_right = 540.0 38 | margin_bottom = 350.0 39 | text = "11.25º slope" 40 | align = 1 41 | 42 | [node name="floor" type="Label" parent="guidelines"] 43 | margin_left = -20.0 44 | margin_top = 128.0 45 | margin_right = 108.0 46 | margin_bottom = 142.0 47 | text = "floor" 48 | align = 1 49 | autowrap = true 50 | 51 | [node name="floor_to_slope" type="Label" parent="guidelines"] 52 | margin_left = 124.0 53 | margin_top = 128.0 54 | margin_right = 252.0 55 | margin_bottom = 142.0 56 | text = "floor to slope tile" 57 | align = 1 58 | autowrap = true 59 | 60 | [node name="ground" type="Label" parent="guidelines"] 61 | margin_left = 268.0 62 | margin_top = 128.0 63 | margin_right = 396.0 64 | margin_bottom = 142.0 65 | text = "ground tiles 66 | 67 | don't have collisions so they can overlap with floor tiles when due" 68 | align = 1 69 | autowrap = true 70 | 71 | [node name="platform" type="Label" parent="guidelines"] 72 | margin_left = 412.0 73 | margin_top = 128.0 74 | margin_right = 540.0 75 | margin_bottom = 159.0 76 | text = "pass through platform" 77 | align = 1 78 | autowrap = true 79 | 80 | [node name="block_platform" type="Label" parent="guidelines"] 81 | margin_left = 412.0 82 | margin_top = 480.0 83 | margin_right = 540.0 84 | margin_bottom = 511.0 85 | text = "platform that prevents actor from passing through" 86 | align = 1 87 | autowrap = true 88 | 89 | [node name="platform_edge" type="Label" parent="guidelines"] 90 | margin_left = 556.0 91 | margin_top = 128.0 92 | margin_right = 676.0 93 | margin_bottom = 159.0 94 | text = "pass through floor edge" 95 | align = 1 96 | autowrap = true 97 | 98 | [node name="block_edge" type="Label" parent="guidelines"] 99 | margin_left = 556.0 100 | margin_top = 480.0 101 | margin_right = 676.0 102 | margin_bottom = 511.0 103 | text = "floor edge that prevents actor from passing through" 104 | align = 1 105 | autowrap = true 106 | 107 | [node name="platform_mid" type="Label" parent="guidelines"] 108 | margin_left = 692.0 109 | margin_top = 128.0 110 | margin_right = 820.0 111 | margin_bottom = 159.0 112 | text = "pass through floor mid" 113 | align = 1 114 | autowrap = true 115 | 116 | [node name="block_mid" type="Label" parent="guidelines"] 117 | margin_left = 692.0 118 | margin_top = 480.0 119 | margin_right = 820.0 120 | margin_bottom = 511.0 121 | text = "floor mid that prevents actor from passing through" 122 | align = 1 123 | autowrap = true 124 | 125 | [node name="water" type="Label" parent="guidelines"] 126 | margin_left = -20.0 127 | margin_top = 512.0 128 | margin_right = 108.0 129 | margin_bottom = 645.0 130 | text = "water surface 131 | 132 | use a dedicated area2D to apply special behaviors for the character when in water" 133 | align = 1 134 | autowrap = true 135 | 136 | [node name="floor" type="Sprite" parent="."] 137 | editor/display_folded = true 138 | position = Vector2( -20, 0 ) 139 | centered = false 140 | 141 | [node name="body" type="StaticBody2D" parent="floor"] 142 | show_behind_parent = true 143 | 144 | [node name="shape" type="CollisionPolygon2D" parent="floor/body"] 145 | position = Vector2( 0, -4 ) 146 | polygon = PoolVector2Array( 0, 4, 128, 4, 128, 132, 0, 132 ) 147 | one_way_collision = true 148 | 149 | [node name="floor_to_slope" type="Sprite" parent="."] 150 | editor/display_folded = true 151 | position = Vector2( 124, 0 ) 152 | centered = false 153 | 154 | [node name="body" type="StaticBody2D" parent="floor_to_slope"] 155 | show_behind_parent = true 156 | 157 | [node name="shape" type="CollisionPolygon2D" parent="floor_to_slope/body"] 158 | position = Vector2( 0, -4 ) 159 | polygon = PoolVector2Array( 0, 4, 128, 4, 128, 132, 0, 132 ) 160 | 161 | [node name="ground" type="Sprite" parent="."] 162 | editor/display_folded = true 163 | position = Vector2( 268, 0 ) 164 | centered = false 165 | 166 | [node name="polygon_2d" type="Polygon2D" parent="ground"] 167 | color = Color( 0.585938, 0.42057, 0.274658, 1 ) 168 | polygon = PoolVector2Array( 0, 0, 128, 0, 128, 128, 0, 128 ) 169 | 170 | [node name="slope" type="Sprite" parent="."] 171 | editor/display_folded = true 172 | position = Vector2( -20, 208 ) 173 | centered = false 174 | 175 | [node name="body" type="StaticBody2D" parent="slope"] 176 | show_behind_parent = true 177 | 178 | [node name="shape" type="CollisionPolygon2D" parent="slope/body"] 179 | position = Vector2( 0, -4 ) 180 | polygon = PoolVector2Array( 128, 4, 0, 132, 128, 132 ) 181 | 182 | [node name="slope2" type="Sprite" parent="."] 183 | editor/display_folded = true 184 | position = Vector2( 124, 208 ) 185 | centered = false 186 | 187 | [node name="body" type="StaticBody2D" parent="slope2"] 188 | show_behind_parent = true 189 | 190 | [node name="shape" type="CollisionPolygon2D" parent="slope2/body"] 191 | position = Vector2( 0, -4 ) 192 | polygon = PoolVector2Array( 128, 76, 0, 132, 128, 132 ) 193 | 194 | [node name="slope3" type="Sprite" parent="."] 195 | editor/display_folded = true 196 | position = Vector2( 268, 208 ) 197 | centered = false 198 | 199 | [node name="body" type="StaticBody2D" parent="slope3"] 200 | show_behind_parent = true 201 | 202 | [node name="shape" type="CollisionPolygon2D" parent="slope3/body"] 203 | position = Vector2( 0, -4 ) 204 | polygon = PoolVector2Array( 128, 100, 0, 132, 128, 132 ) 205 | 206 | [node name="slope4" type="Sprite" parent="."] 207 | editor/display_folded = true 208 | position = Vector2( 412, 208 ) 209 | centered = false 210 | 211 | [node name="body" type="StaticBody2D" parent="slope4"] 212 | show_behind_parent = true 213 | 214 | [node name="shape" type="CollisionPolygon2D" parent="slope4/body"] 215 | position = Vector2( 0, -4 ) 216 | polygon = PoolVector2Array( 128, 108, 0, 132, 128, 132 ) 217 | 218 | [node name="platform" type="Sprite" parent="."] 219 | editor/display_folded = true 220 | position = Vector2( 412, 0 ) 221 | centered = false 222 | 223 | [node name="body" type="StaticBody2D" parent="platform"] 224 | show_behind_parent = true 225 | 226 | [node name="shape" type="CollisionPolygon2D" parent="platform/body"] 227 | polygon = PoolVector2Array( 124, 72, 124, 0, 4, 0, 4, 72 ) 228 | one_way_collision = true 229 | 230 | [node name="block_platform" type="Sprite" parent="."] 231 | editor/display_folded = true 232 | position = Vector2( 412, 384 ) 233 | centered = false 234 | 235 | [node name="body" type="StaticBody2D" parent="block_platform"] 236 | show_behind_parent = true 237 | 238 | [node name="shape" type="CollisionPolygon2D" parent="block_platform/body"] 239 | polygon = PoolVector2Array( 124, 72, 124, 0, 4, 0, 4, 72 ) 240 | 241 | [node name="air_ground_edge" type="Sprite" parent="."] 242 | editor/display_folded = true 243 | position = Vector2( 548, 0 ) 244 | centered = false 245 | 246 | [node name="body" type="StaticBody2D" parent="air_ground_edge"] 247 | show_behind_parent = true 248 | 249 | [node name="shape" type="CollisionPolygon2D" parent="air_ground_edge/body"] 250 | polygon = PoolVector2Array( 128, 72, 128, 0, 8, 0, 8, 72 ) 251 | one_way_collision = true 252 | 253 | [node name="block_air_edge" type="Sprite" parent="."] 254 | editor/display_folded = true 255 | position = Vector2( 548, 384 ) 256 | centered = false 257 | 258 | [node name="body" type="StaticBody2D" parent="block_air_edge"] 259 | show_behind_parent = true 260 | 261 | [node name="shape" type="CollisionPolygon2D" parent="block_air_edge/body"] 262 | polygon = PoolVector2Array( 128, 72, 128, 0, 8, 0, 8, 72 ) 263 | 264 | [node name="air_ground_mid" type="Sprite" parent="."] 265 | editor/display_folded = true 266 | position = Vector2( 692, 0 ) 267 | centered = false 268 | 269 | [node name="body" type="StaticBody2D" parent="air_ground_mid"] 270 | show_behind_parent = true 271 | 272 | [node name="shape" type="CollisionPolygon2D" parent="air_ground_mid/body"] 273 | polygon = PoolVector2Array( 128, 72, 128, 0, 0, 0, 0, 72 ) 274 | one_way_collision = true 275 | 276 | [node name="block_air_ground" type="Sprite" parent="."] 277 | editor/display_folded = true 278 | position = Vector2( 692, 384 ) 279 | centered = false 280 | 281 | [node name="body" type="StaticBody2D" parent="block_air_ground"] 282 | show_behind_parent = true 283 | 284 | [node name="shape" type="CollisionPolygon2D" parent="block_air_ground/body"] 285 | polygon = PoolVector2Array( 128, 72, 128, 0, 0, 0, 0, 72 ) 286 | 287 | [node name="water" type="Sprite" parent="."] 288 | editor/display_folded = true 289 | position = Vector2( -20, 384 ) 290 | centered = false 291 | 292 | [node name="water" type="Polygon2D" parent="water"] 293 | color = Color( 0.199951, 0.511011, 0.8125, 1 ) 294 | polygon = PoolVector2Array( 0, 0, 128, 0, 128, 128, 0, 128 ) 295 | -------------------------------------------------------------------------------- /source/default_bus_layout.tres: -------------------------------------------------------------------------------- 1 | [gd_resource type="AudioBusLayout" format=2] 2 | 3 | [resource] 4 | 5 | bus/0/name = "Master" 6 | bus/0/solo = false 7 | bus/0/mute = false 8 | bus/0/bypass_fx = false 9 | bus/0/volume_db = 0.0 10 | bus/0/send = "" 11 | bus/1/name = "music" 12 | bus/1/solo = false 13 | bus/1/mute = false 14 | bus/1/bypass_fx = false 15 | bus/1/volume_db = 0.0 16 | bus/1/send = "Master" 17 | bus/2/name = "effects" 18 | bus/2/solo = false 19 | bus/2/mute = false 20 | bus/2/bypass_fx = false 21 | bus/2/volume_db = 0.0 22 | bus/2/send = "Master" 23 | 24 | -------------------------------------------------------------------------------- /source/default_env.tres: -------------------------------------------------------------------------------- 1 | [gd_resource type="Environment" load_steps=2 format=2] 2 | 3 | [sub_resource type="ProceduralSky" id=1] 4 | sky_top_color = Color( 0.0470588, 0.454902, 0.976471, 1 ) 5 | sky_horizon_color = Color( 0.556863, 0.823529, 0.909804, 1 ) 6 | sky_curve = 0.25 7 | ground_bottom_color = Color( 0.101961, 0.145098, 0.188235, 1 ) 8 | ground_horizon_color = Color( 0.482353, 0.788235, 0.952941, 1 ) 9 | ground_curve = 0.01 10 | sun_energy = 16.0 11 | 12 | [resource] 13 | background_mode = 2 14 | background_sky = SubResource( 1 ) 15 | -------------------------------------------------------------------------------- /source/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pigdevstudio/platform_template/c2598366c2a711e11ec1ff62b5950caad6fea8c1/source/icon.png -------------------------------------------------------------------------------- /source/icon.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="StreamTexture" 5 | path="res://.import/icon.png-487276ed1e3a0c39cad0279d744ee560.stex" 6 | metadata={ 7 | "vram_texture": false 8 | } 9 | 10 | [deps] 11 | 12 | source_file="res://icon.png" 13 | dest_files=[ "res://.import/icon.png-487276ed1e3a0c39cad0279d744ee560.stex" ] 14 | 15 | [params] 16 | 17 | compress/mode=0 18 | compress/lossy_quality=0.7 19 | compress/hdr_mode=0 20 | compress/bptc_ldr=0 21 | compress/normal_map=0 22 | flags/repeat=0 23 | flags/filter=true 24 | flags/mipmaps=false 25 | flags/anisotropic=false 26 | flags/srgb=2 27 | process/fix_alpha_border=true 28 | process/premult_alpha=false 29 | process/HDR_as_SRGB=false 30 | process/invert_color=false 31 | stream=false 32 | size_limit=0 33 | detect_3d=true 34 | svg/scale=1.0 35 | -------------------------------------------------------------------------------- /source/interface/font/kenney_future.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pigdevstudio/platform_template/c2598366c2a711e11ec1ff62b5950caad6fea8c1/source/interface/font/kenney_future.ttf -------------------------------------------------------------------------------- /source/interface/font/kenney_future_20.tres: -------------------------------------------------------------------------------- 1 | [gd_resource type="DynamicFont" load_steps=2 format=2] 2 | 3 | [ext_resource path="res://interface/font/kenney_future.ttf" type="DynamicFontData" id=1] 4 | 5 | [resource] 6 | 7 | size = 20 8 | use_mipmaps = true 9 | use_filter = true 10 | font_data = ExtResource( 1 ) 11 | _sections_unfolded = [ "Extra Spacing", "Font", "Settings" ] 12 | -------------------------------------------------------------------------------- /source/interface/font/kenney_future_narrow.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pigdevstudio/platform_template/c2598366c2a711e11ec1ff62b5950caad6fea8c1/source/interface/font/kenney_future_narrow.ttf -------------------------------------------------------------------------------- /source/interface/themes/template_theme_scene.tscn: -------------------------------------------------------------------------------- 1 | [gd_scene load_steps=2 format=2] 2 | 3 | [sub_resource type="ButtonGroup" id=1] 4 | 5 | resource_local_to_scene = true 6 | resource_name = "radio" 7 | _sections_unfolded = [ "Resource" ] 8 | 9 | [node name="Theme" type="Control" index="0"] 10 | 11 | anchor_left = 0.0 12 | anchor_top = 0.0 13 | anchor_right = 1.0 14 | anchor_bottom = 1.0 15 | margin_right = -978.0 16 | margin_bottom = -556.0 17 | rect_pivot_offset = Vector2( 0, 0 ) 18 | rect_clip_content = false 19 | focus_mode = 2 20 | mouse_filter = 0 21 | mouse_default_cursor_shape = 0 22 | size_flags_horizontal = 1 23 | size_flags_vertical = 1 24 | _sections_unfolded = [ "Theme" ] 25 | 26 | [node name="CenterContainer" type="CenterContainer" parent="." index="0"] 27 | 28 | anchor_left = 0.0 29 | anchor_top = 0.0 30 | anchor_right = 0.0 31 | anchor_bottom = 0.0 32 | margin_right = 1024.0 33 | margin_bottom = 611.0 34 | rect_pivot_offset = Vector2( 0, 0 ) 35 | rect_clip_content = false 36 | mouse_filter = 0 37 | mouse_default_cursor_shape = 0 38 | size_flags_horizontal = 1 39 | size_flags_vertical = 1 40 | use_top_left = false 41 | 42 | [node name="TabContainer" type="TabContainer" parent="CenterContainer" index="0"] 43 | 44 | anchor_left = 0.0 45 | anchor_top = 0.0 46 | anchor_right = 0.0 47 | anchor_bottom = 0.0 48 | margin_left = 192.0 49 | margin_top = 125.0 50 | margin_right = 832.0 51 | margin_bottom = 485.0 52 | rect_min_size = Vector2( 640, 360 ) 53 | rect_pivot_offset = Vector2( 0, 0 ) 54 | rect_clip_content = false 55 | mouse_filter = 0 56 | mouse_default_cursor_shape = 0 57 | size_flags_horizontal = 3 58 | size_flags_vertical = 3 59 | tab_align = 2 60 | tabs_visible = true 61 | _sections_unfolded = [ "Rect", "Size Flags" ] 62 | 63 | [node name="Buttons" type="PanelContainer" parent="CenterContainer/TabContainer" index="0"] 64 | 65 | anchor_left = 0.0 66 | anchor_top = 0.0 67 | anchor_right = 1.0 68 | anchor_bottom = 1.0 69 | margin_left = 4.0 70 | margin_top = 32.0 71 | margin_right = -4.0 72 | margin_bottom = -4.0 73 | rect_pivot_offset = Vector2( 0, 0 ) 74 | rect_clip_content = false 75 | mouse_filter = 0 76 | mouse_default_cursor_shape = 0 77 | size_flags_horizontal = 3 78 | size_flags_vertical = 3 79 | 80 | [node name="HBoxContainer" type="HBoxContainer" parent="CenterContainer/TabContainer/Buttons" index="0"] 81 | 82 | anchor_left = 0.0 83 | anchor_top = 0.0 84 | anchor_right = 0.0 85 | anchor_bottom = 0.0 86 | margin_left = 7.0 87 | margin_top = 7.0 88 | margin_right = 625.0 89 | margin_bottom = 317.0 90 | rect_pivot_offset = Vector2( 0, 0 ) 91 | rect_clip_content = false 92 | mouse_filter = 1 93 | mouse_default_cursor_shape = 0 94 | size_flags_horizontal = 3 95 | size_flags_vertical = 3 96 | alignment = 0 97 | _sections_unfolded = [ "Size Flags" ] 98 | 99 | [node name="VBoxContainer" type="VBoxContainer" parent="CenterContainer/TabContainer/Buttons/HBoxContainer" index="0"] 100 | 101 | anchor_left = 0.0 102 | anchor_top = 0.0 103 | anchor_right = 0.0 104 | anchor_bottom = 0.0 105 | margin_right = 307.0 106 | margin_bottom = 310.0 107 | rect_pivot_offset = Vector2( 0, 0 ) 108 | rect_clip_content = false 109 | mouse_filter = 1 110 | mouse_default_cursor_shape = 0 111 | size_flags_horizontal = 3 112 | size_flags_vertical = 3 113 | custom_constants/separation = 26 114 | alignment = 0 115 | _sections_unfolded = [ "Size Flags", "custom_constants" ] 116 | 117 | [node name="CheckBox" type="CheckBox" parent="CenterContainer/TabContainer/Buttons/HBoxContainer/VBoxContainer" index="0"] 118 | 119 | anchor_left = 0.0 120 | anchor_top = 0.0 121 | anchor_right = 0.0 122 | anchor_bottom = 0.0 123 | margin_right = 307.0 124 | margin_bottom = 24.0 125 | rect_pivot_offset = Vector2( 0, 0 ) 126 | rect_clip_content = false 127 | focus_mode = 2 128 | mouse_filter = 0 129 | mouse_default_cursor_shape = 0 130 | size_flags_horizontal = 1 131 | size_flags_vertical = 1 132 | toggle_mode = true 133 | enabled_focus_mode = 2 134 | shortcut = null 135 | group = null 136 | text = "A check box" 137 | flat = false 138 | align = 1 139 | 140 | [node name="HSeparator2" type="HSeparator" parent="CenterContainer/TabContainer/Buttons/HBoxContainer/VBoxContainer" index="1"] 141 | 142 | anchor_left = 0.0 143 | anchor_top = 0.0 144 | anchor_right = 0.0 145 | anchor_bottom = 0.0 146 | margin_top = 50.0 147 | margin_right = 307.0 148 | margin_bottom = 54.0 149 | rect_pivot_offset = Vector2( 0, 0 ) 150 | rect_clip_content = false 151 | mouse_filter = 0 152 | mouse_default_cursor_shape = 0 153 | size_flags_horizontal = 1 154 | size_flags_vertical = 1 155 | 156 | [node name="CheckBox2" type="CheckBox" parent="CenterContainer/TabContainer/Buttons/HBoxContainer/VBoxContainer" index="2"] 157 | 158 | anchor_left = 0.0 159 | anchor_top = 0.0 160 | anchor_right = 0.0 161 | anchor_bottom = 0.0 162 | margin_top = 80.0 163 | margin_right = 307.0 164 | margin_bottom = 104.0 165 | rect_pivot_offset = Vector2( 0, 0 ) 166 | rect_clip_content = false 167 | focus_mode = 2 168 | mouse_filter = 0 169 | mouse_default_cursor_shape = 0 170 | size_flags_horizontal = 1 171 | size_flags_vertical = 1 172 | toggle_mode = true 173 | enabled_focus_mode = 2 174 | shortcut = null 175 | group = null 176 | text = "Another checkbox" 177 | flat = false 178 | align = 1 179 | 180 | [node name="HSeparator" type="HSeparator" parent="CenterContainer/TabContainer/Buttons/HBoxContainer/VBoxContainer" index="3"] 181 | 182 | anchor_left = 0.0 183 | anchor_top = 0.0 184 | anchor_right = 0.0 185 | anchor_bottom = 0.0 186 | margin_top = 130.0 187 | margin_right = 307.0 188 | margin_bottom = 134.0 189 | rect_pivot_offset = Vector2( 0, 0 ) 190 | rect_clip_content = false 191 | mouse_filter = 0 192 | mouse_default_cursor_shape = 0 193 | size_flags_horizontal = 1 194 | size_flags_vertical = 1 195 | 196 | [node name="Radio" type="CheckBox" parent="CenterContainer/TabContainer/Buttons/HBoxContainer/VBoxContainer" index="4"] 197 | 198 | anchor_left = 0.0 199 | anchor_top = 0.0 200 | anchor_right = 0.0 201 | anchor_bottom = 0.0 202 | margin_top = 160.0 203 | margin_right = 307.0 204 | margin_bottom = 184.0 205 | rect_pivot_offset = Vector2( 0, 0 ) 206 | rect_clip_content = false 207 | focus_mode = 2 208 | mouse_filter = 0 209 | mouse_default_cursor_shape = 0 210 | size_flags_horizontal = 1 211 | size_flags_vertical = 1 212 | toggle_mode = true 213 | enabled_focus_mode = 2 214 | shortcut = null 215 | group = SubResource( 1 ) 216 | text = "A radio button" 217 | flat = false 218 | align = 1 219 | 220 | [node name="Radio2" type="CheckBox" parent="CenterContainer/TabContainer/Buttons/HBoxContainer/VBoxContainer" index="5"] 221 | 222 | anchor_left = 0.0 223 | anchor_top = 0.0 224 | anchor_right = 0.0 225 | anchor_bottom = 0.0 226 | margin_top = 210.0 227 | margin_right = 307.0 228 | margin_bottom = 234.0 229 | rect_pivot_offset = Vector2( 0, 0 ) 230 | rect_clip_content = false 231 | focus_mode = 2 232 | mouse_filter = 0 233 | mouse_default_cursor_shape = 0 234 | size_flags_horizontal = 1 235 | size_flags_vertical = 1 236 | toggle_mode = true 237 | enabled_focus_mode = 2 238 | shortcut = null 239 | group = SubResource( 1 ) 240 | text = "Second radio" 241 | flat = false 242 | align = 1 243 | 244 | [node name="VBoxContainer2" type="VBoxContainer" parent="CenterContainer/TabContainer/Buttons/HBoxContainer" index="1"] 245 | 246 | anchor_left = 0.0 247 | anchor_top = 0.0 248 | anchor_right = 0.0 249 | anchor_bottom = 0.0 250 | margin_left = 311.0 251 | margin_right = 618.0 252 | margin_bottom = 310.0 253 | rect_pivot_offset = Vector2( 0, 0 ) 254 | rect_clip_content = false 255 | mouse_filter = 1 256 | mouse_default_cursor_shape = 0 257 | size_flags_horizontal = 3 258 | size_flags_vertical = 3 259 | alignment = 0 260 | _sections_unfolded = [ "Size Flags" ] 261 | 262 | [node name="Button" type="Button" parent="CenterContainer/TabContainer/Buttons/HBoxContainer/VBoxContainer2" index="0"] 263 | 264 | anchor_left = 0.0 265 | anchor_top = 0.0 266 | anchor_right = 0.0 267 | anchor_bottom = 0.0 268 | margin_right = 307.0 269 | margin_bottom = 100.0 270 | rect_pivot_offset = Vector2( 0, 0 ) 271 | rect_clip_content = false 272 | focus_mode = 2 273 | mouse_filter = 0 274 | mouse_default_cursor_shape = 0 275 | size_flags_horizontal = 3 276 | size_flags_vertical = 3 277 | toggle_mode = false 278 | enabled_focus_mode = 2 279 | shortcut = null 280 | group = null 281 | text = "Just" 282 | flat = false 283 | clip_text = true 284 | align = 1 285 | _sections_unfolded = [ "Size Flags" ] 286 | 287 | [node name="Button2" type="Button" parent="CenterContainer/TabContainer/Buttons/HBoxContainer/VBoxContainer2" index="1"] 288 | 289 | anchor_left = 0.0 290 | anchor_top = 0.0 291 | anchor_right = 0.0 292 | anchor_bottom = 0.0 293 | margin_top = 104.0 294 | margin_right = 307.0 295 | margin_bottom = 204.0 296 | rect_pivot_offset = Vector2( 0, 0 ) 297 | rect_clip_content = false 298 | focus_mode = 2 299 | mouse_filter = 0 300 | mouse_default_cursor_shape = 0 301 | size_flags_horizontal = 3 302 | size_flags_vertical = 3 303 | toggle_mode = false 304 | enabled_focus_mode = 2 305 | shortcut = null 306 | group = null 307 | text = "Some" 308 | flat = false 309 | clip_text = true 310 | align = 1 311 | _sections_unfolded = [ "Size Flags" ] 312 | 313 | [node name="Button3" type="Button" parent="CenterContainer/TabContainer/Buttons/HBoxContainer/VBoxContainer2" index="2"] 314 | 315 | anchor_left = 0.0 316 | anchor_top = 0.0 317 | anchor_right = 0.0 318 | anchor_bottom = 0.0 319 | margin_top = 208.0 320 | margin_right = 307.0 321 | margin_bottom = 310.0 322 | rect_pivot_offset = Vector2( 0, 0 ) 323 | rect_clip_content = false 324 | focus_mode = 2 325 | mouse_filter = 0 326 | mouse_default_cursor_shape = 0 327 | size_flags_horizontal = 3 328 | size_flags_vertical = 3 329 | toggle_mode = false 330 | enabled_focus_mode = 2 331 | shortcut = null 332 | group = null 333 | text = "Buttons" 334 | flat = false 335 | clip_text = true 336 | align = 1 337 | _sections_unfolded = [ "Size Flags" ] 338 | 339 | [node name="Scrolls" type="PanelContainer" parent="CenterContainer/TabContainer" index="1"] 340 | 341 | editor/display_folded = true 342 | visible = false 343 | anchor_left = 0.0 344 | anchor_top = 0.0 345 | anchor_right = 1.0 346 | anchor_bottom = 1.0 347 | margin_left = 8.25 348 | margin_top = 63.5 349 | margin_right = -7.75 350 | margin_bottom = -8.75 351 | rect_pivot_offset = Vector2( 0, 0 ) 352 | rect_clip_content = false 353 | mouse_filter = 0 354 | mouse_default_cursor_shape = 0 355 | size_flags_horizontal = 3 356 | size_flags_vertical = 3 357 | _sections_unfolded = [ "Rect" ] 358 | 359 | [node name="HBoxContainer" type="HBoxContainer" parent="CenterContainer/TabContainer/Scrolls" index="0"] 360 | 361 | anchor_left = 0.0 362 | anchor_top = 0.0 363 | anchor_right = 0.0 364 | anchor_bottom = 0.0 365 | margin_left = 16.75 366 | margin_top = 20.0 367 | margin_right = 607.25 368 | margin_bottom = 301.0 369 | rect_pivot_offset = Vector2( 0, 0 ) 370 | rect_clip_content = false 371 | mouse_filter = 1 372 | mouse_default_cursor_shape = 0 373 | size_flags_horizontal = 3 374 | size_flags_vertical = 3 375 | custom_constants/separation = 75 376 | alignment = 0 377 | _sections_unfolded = [ "custom_constants" ] 378 | 379 | [node name="ScrollContainer2" type="ScrollContainer" parent="CenterContainer/TabContainer/Scrolls/HBoxContainer" index="0"] 380 | 381 | anchor_left = 0.0 382 | anchor_top = 0.0 383 | anchor_right = 0.0 384 | anchor_bottom = 0.0 385 | margin_right = 257.0 386 | margin_bottom = 281.0 387 | rect_pivot_offset = Vector2( 0, 0 ) 388 | rect_clip_content = true 389 | mouse_filter = 0 390 | mouse_default_cursor_shape = 0 391 | size_flags_horizontal = 3 392 | size_flags_vertical = 3 393 | scroll_horizontal_enabled = true 394 | scroll_horizontal = 0 395 | scroll_vertical_enabled = false 396 | scroll_vertical = 0 397 | _sections_unfolded = [ "Scroll", "Size Flags" ] 398 | 399 | [node name="Lorem" type="CenterContainer" parent="CenterContainer/TabContainer/Scrolls/HBoxContainer/ScrollContainer2" index="0"] 400 | 401 | anchor_left = 0.0 402 | anchor_top = 0.0 403 | anchor_right = 0.0 404 | anchor_bottom = 0.0 405 | margin_right = 800.0 406 | margin_bottom = 281.0 407 | rect_pivot_offset = Vector2( 0, 0 ) 408 | rect_clip_content = false 409 | mouse_filter = 1 410 | mouse_default_cursor_shape = 0 411 | size_flags_horizontal = 3 412 | size_flags_vertical = 3 413 | use_top_left = false 414 | _sections_unfolded = [ "custom_constants" ] 415 | 416 | [node name="Label" type="Label" parent="CenterContainer/TabContainer/Scrolls/HBoxContainer/ScrollContainer2/Lorem" index="0"] 417 | 418 | anchor_left = 0.0 419 | anchor_top = 0.0 420 | anchor_right = 0.0 421 | anchor_bottom = 0.0 422 | margin_top = 15.0 423 | margin_right = 800.0 424 | margin_bottom = 265.0 425 | rect_min_size = Vector2( 800, 250 ) 426 | rect_pivot_offset = Vector2( 0, 0 ) 427 | rect_clip_content = false 428 | mouse_filter = 2 429 | mouse_default_cursor_shape = 0 430 | size_flags_horizontal = 1 431 | size_flags_vertical = 4 432 | text = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent faucibus porta nibh et lacinia. Nullam sed eleifend nisi. Ut iaculis enim sit amet nunc scelerisque, sit amet sollicitudin sem fringilla. Nunc id nunc vitae massa pulvinar sollicitudin. Aenean eu ornare nunc, quis semper felis. Sed lacinia a neque vitae vestibulum. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Suspendisse viverra sapien erat, et vestibulum tellus pretium non. 433 | 434 | Suspendisse potenti. Aliquam porta urna quis lectus consequat commodo. Nam non tortor augue. Praesent et magna at sapien dapibus euismod at sit amet mi. Pellentesque faucibus semper vestibulum. Proin hendrerit ex eget fringilla feugiat. Nulla dictum tempor varius. 435 | 436 | Morbi ut posuere dolor, eu condimentum mi. Aliquam consectetur dolor vitae pharetra pellentesque. Nam quis dignissim odio, eu ullamcorper ligula. Nulla pharetra urna sed tortor laoreet, ut eleifend elit egestas. Aliquam ac dictum libero. Nulla eget convallis metus. Aliquam id ultrices lectus. Nam ut tincidunt nisl, in elementum ante. Aliquam egestas convallis mi, nec tempor turpis ullamcorper ut. Nulla ultricies urna sed metus egestas feugiat. 437 | 438 | Duis feugiat molestie faucibus. Sed eros ipsum, tincidunt non massa quis, luctus pharetra nisi. Suspendisse eget tempor elit, et mollis ipsum. Quisque tellus nibh, elementum vel arcu nec, tincidunt scelerisque sapien. Vivamus commodo id lacus nec sollicitudin. Donec risus turpis, fermentum sit amet lorem et, feugiat faucibus eros. Sed posuere id velit nec viverra. Morbi luctus sapien erat, at malesuada mauris pretium ac. Proin sed felis ligula. 439 | 440 | Sed id purus sit amet tortor pharetra consectetur at ut massa. Duis sit amet est nec mauris pharetra pharetra sit amet sit amet ex. Cras tempus sed odio quis euismod. Duis non elit justo. Integer feugiat, elit nec laoreet sollicitudin, est augue volutpat ex, nec sagittis lacus ante at urna. Nunc congue aliquam auctor. Praesent ornare auctor nibh, quis porttitor dui malesuada quis. Pellentesque in velit a magna finibus placerat. Praesent consequat, nibh tempus porttitor posuere, dolor lorem ornare est, in dapibus mi ipsum in diam." 441 | autowrap = true 442 | clip_text = true 443 | percent_visible = 1.0 444 | lines_skipped = 0 445 | max_lines_visible = -1 446 | _sections_unfolded = [ "Rect" ] 447 | 448 | [node name="ScrollContainer" type="ScrollContainer" parent="CenterContainer/TabContainer/Scrolls/HBoxContainer" index="1"] 449 | 450 | anchor_left = 0.0 451 | anchor_top = 0.0 452 | anchor_right = 0.0 453 | anchor_bottom = 0.0 454 | margin_left = 332.0 455 | margin_right = 590.0 456 | margin_bottom = 281.0 457 | rect_pivot_offset = Vector2( 0, 0 ) 458 | rect_clip_content = true 459 | mouse_filter = 0 460 | mouse_default_cursor_shape = 0 461 | size_flags_horizontal = 3 462 | size_flags_vertical = 3 463 | scroll_horizontal_enabled = true 464 | scroll_horizontal = 0 465 | scroll_vertical_enabled = true 466 | scroll_vertical = 0 467 | _sections_unfolded = [ "Size Flags" ] 468 | 469 | [node name="Lorem" type="CenterContainer" parent="CenterContainer/TabContainer/Scrolls/HBoxContainer/ScrollContainer" index="0"] 470 | 471 | anchor_left = 0.0 472 | anchor_top = 0.0 473 | anchor_right = 0.0 474 | anchor_bottom = 0.0 475 | margin_right = 258.0 476 | margin_bottom = 800.0 477 | rect_pivot_offset = Vector2( 0, 0 ) 478 | rect_clip_content = false 479 | mouse_filter = 1 480 | mouse_default_cursor_shape = 0 481 | size_flags_horizontal = 3 482 | size_flags_vertical = 3 483 | use_top_left = false 484 | _sections_unfolded = [ "Size Flags" ] 485 | 486 | [node name="Label2" type="Label" parent="CenterContainer/TabContainer/Scrolls/HBoxContainer/ScrollContainer/Lorem" index="0"] 487 | 488 | anchor_left = 0.0 489 | anchor_top = 0.0 490 | anchor_right = 0.0 491 | anchor_bottom = 0.0 492 | margin_left = 16.0 493 | margin_right = 241.0 494 | margin_bottom = 800.0 495 | rect_min_size = Vector2( 225, 800 ) 496 | rect_pivot_offset = Vector2( 0, 0 ) 497 | rect_clip_content = false 498 | mouse_filter = 2 499 | mouse_default_cursor_shape = 0 500 | size_flags_horizontal = 1 501 | size_flags_vertical = 4 502 | text = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent faucibus porta nibh et lacinia. Nullam sed eleifend nisi. Ut iaculis enim sit amet nunc scelerisque, sit amet sollicitudin sem fringilla. Nunc id nunc vitae massa pulvinar sollicitudin. Aenean eu ornare nunc, quis semper felis. Sed lacinia a neque vitae vestibulum. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Suspendisse viverra sapien erat, et vestibulum tellus pretium non. 503 | 504 | Suspendisse potenti. Aliquam porta urna quis lectus consequat commodo. Nam non tortor augue. Praesent et magna at sapien dapibus euismod at sit amet mi. Pellentesque faucibus semper vestibulum. Proin hendrerit ex eget fringilla feugiat. Nulla dictum tempor varius. 505 | 506 | Morbi ut posuere dolor, eu condimentum mi. Aliquam consectetur dolor vitae pharetra pellentesque. Nam quis dignissim odio, eu ullamcorper ligula. Nulla pharetra urna sed tortor laoreet, ut eleifend elit egestas. Aliquam ac dictum libero. Nulla eget convallis metus. Aliquam id ultrices lectus. Nam ut tincidunt nisl, in elementum ante. Aliquam egestas convallis mi, nec tempor turpis ullamcorper ut. Nulla ultricies urna sed metus egestas feugiat. 507 | 508 | Duis feugiat molestie faucibus. Sed eros ipsum, tincidunt non massa quis, luctus pharetra nisi. Suspendisse eget tempor elit, et mollis ipsum. Quisque tellus nibh, elementum vel arcu nec, tincidunt scelerisque sapien. Vivamus commodo id lacus nec sollicitudin. Donec risus turpis, fermentum sit amet lorem et, feugiat faucibus eros. Sed posuere id velit nec viverra. Morbi luctus sapien erat, at malesuada mauris pretium ac. Proin sed felis ligula. 509 | 510 | Sed id purus sit amet tortor pharetra consectetur at ut massa. Duis sit amet est nec mauris pharetra pharetra sit amet sit amet ex. Cras tempus sed odio quis euismod. Duis non elit justo. Integer feugiat, elit nec laoreet sollicitudin, est augue volutpat ex, nec sagittis lacus ante at urna. Nunc congue aliquam auctor. Praesent ornare auctor nibh, quis porttitor dui malesuada quis. Pellentesque in velit a magna finibus placerat. Praesent consequat, nibh tempus porttitor posuere, dolor lorem ornare est, in dapibus mi ipsum in diam." 511 | autowrap = true 512 | clip_text = true 513 | percent_visible = 1.0 514 | lines_skipped = 0 515 | max_lines_visible = -1 516 | _sections_unfolded = [ "Rect" ] 517 | 518 | [node name="Ranges" type="PanelContainer" parent="CenterContainer/TabContainer" index="2"] 519 | 520 | editor/display_folded = true 521 | visible = false 522 | anchor_left = 0.0 523 | anchor_top = 0.0 524 | anchor_right = 1.0 525 | anchor_bottom = 1.0 526 | margin_left = 12.75 527 | margin_top = 64.0 528 | margin_right = -11.5 529 | margin_bottom = -12.75 530 | rect_min_size = Vector2( 615, 321 ) 531 | rect_pivot_offset = Vector2( 0, 0 ) 532 | rect_clip_content = false 533 | mouse_filter = 0 534 | mouse_default_cursor_shape = 0 535 | size_flags_horizontal = 3 536 | size_flags_vertical = 3 537 | _sections_unfolded = [ "Rect" ] 538 | 539 | [node name="HBoxContainer" type="HBoxContainer" parent="CenterContainer/TabContainer/Ranges" index="0"] 540 | 541 | anchor_left = 0.0 542 | anchor_top = 0.0 543 | anchor_right = 0.0 544 | anchor_bottom = 0.0 545 | margin_left = 16.75 546 | margin_top = 20.0 547 | margin_right = 623.25 548 | margin_bottom = 287.25 549 | rect_pivot_offset = Vector2( 0, 0 ) 550 | rect_clip_content = false 551 | mouse_filter = 1 552 | mouse_default_cursor_shape = 0 553 | size_flags_horizontal = 1 554 | size_flags_vertical = 1 555 | custom_constants/separation = 50 556 | alignment = 0 557 | _sections_unfolded = [ "custom_constants" ] 558 | 559 | [node name="ProgressBar" type="ProgressBar" parent="CenterContainer/TabContainer/Ranges/HBoxContainer" index="0"] 560 | 561 | anchor_left = 0.0 562 | anchor_top = 0.0 563 | anchor_right = 0.0 564 | anchor_bottom = 0.0 565 | margin_right = 278.0 566 | margin_bottom = 33.0 567 | rect_pivot_offset = Vector2( 0, 0 ) 568 | rect_clip_content = false 569 | mouse_filter = 0 570 | mouse_default_cursor_shape = 0 571 | size_flags_horizontal = 3 572 | size_flags_vertical = 0 573 | min_value = 0.0 574 | max_value = 100.0 575 | step = 1.0 576 | page = 0.0 577 | value = 41.911 578 | exp_edit = false 579 | rounded = false 580 | percent_visible = true 581 | _sections_unfolded = [ "Percent", "Size Flags" ] 582 | 583 | [node name="VBoxContainer" type="VBoxContainer" parent="CenterContainer/TabContainer/Ranges/HBoxContainer" index="1"] 584 | 585 | anchor_left = 0.0 586 | anchor_top = 0.0 587 | anchor_right = 0.0 588 | anchor_bottom = 0.0 589 | margin_left = 328.0 590 | margin_right = 606.0 591 | margin_bottom = 267.0 592 | rect_pivot_offset = Vector2( 0, 0 ) 593 | rect_clip_content = false 594 | mouse_filter = 1 595 | mouse_default_cursor_shape = 0 596 | size_flags_horizontal = 3 597 | size_flags_vertical = 3 598 | custom_constants/separation = 18 599 | alignment = 0 600 | _sections_unfolded = [ "Size Flags", "custom_constants" ] 601 | 602 | [node name="HSlider" type="HSlider" parent="CenterContainer/TabContainer/Ranges/HBoxContainer/VBoxContainer" index="0"] 603 | 604 | anchor_left = 0.0 605 | anchor_top = 0.0 606 | anchor_right = 0.0 607 | anchor_bottom = 0.0 608 | margin_right = 278.0 609 | margin_bottom = 20.0 610 | rect_pivot_offset = Vector2( 0, 0 ) 611 | rect_clip_content = false 612 | focus_mode = 2 613 | mouse_filter = 0 614 | mouse_default_cursor_shape = 0 615 | size_flags_horizontal = 1 616 | size_flags_vertical = 0 617 | min_value = 0.0 618 | max_value = 100.0 619 | step = 1.0 620 | page = 0.0 621 | value = 0.0 622 | exp_edit = false 623 | rounded = false 624 | editable = true 625 | tick_count = 0 626 | ticks_on_borders = false 627 | focus_mode = 2 628 | 629 | [node name="VSlider" type="VSlider" parent="CenterContainer/TabContainer/Ranges/HBoxContainer/VBoxContainer" index="1"] 630 | 631 | anchor_left = 0.0 632 | anchor_top = 0.0 633 | anchor_right = 0.0 634 | anchor_bottom = 0.0 635 | margin_top = 38.0 636 | margin_right = 20.0 637 | margin_bottom = 267.0 638 | rect_pivot_offset = Vector2( 0, 0 ) 639 | rect_clip_content = false 640 | focus_mode = 2 641 | mouse_filter = 0 642 | mouse_default_cursor_shape = 0 643 | size_flags_horizontal = 0 644 | size_flags_vertical = 3 645 | min_value = 0.0 646 | max_value = 100.0 647 | step = 1.0 648 | page = 0.0 649 | value = 0.0 650 | exp_edit = false 651 | rounded = false 652 | editable = true 653 | tick_count = 0 654 | ticks_on_borders = false 655 | focus_mode = 2 656 | _sections_unfolded = [ "Size Flags" ] 657 | 658 | [connection signal="value_changed" from="CenterContainer/TabContainer/Ranges/HBoxContainer/VBoxContainer/HSlider" to="CenterContainer/TabContainer/Ranges/HBoxContainer/ProgressBar" method="set_value"] 659 | 660 | [connection signal="value_changed" from="CenterContainer/TabContainer/Ranges/HBoxContainer/VBoxContainer/VSlider" to="CenterContainer/TabContainer/Ranges/HBoxContainer/ProgressBar" method="set_value"] 661 | 662 | 663 | -------------------------------------------------------------------------------- /source/juiceness/pop_score/pop_label.gd: -------------------------------------------------------------------------------- 1 | extends Node2D 2 | 3 | export (Vector2) var final_scale = Vector2(1.5, 1.5) 4 | export (float) var float_length = 100 5 | export (float) var duration = 0.25 6 | 7 | 8 | func _ready(): 9 | pop() 10 | 11 | func pop(): 12 | $tween.interpolate_property(self, "scale", scale, final_scale, duration, 13 | Tween.TRANS_BACK, Tween.EASE_IN_OUT) 14 | $tween.start() 15 | yield($tween, "tween_completed") 16 | $tween.interpolate_property(self, "position", position, 17 | position - Vector2(0, float_length), duration, Tween.TRANS_BACK, 18 | Tween.EASE_IN) 19 | $tween.interpolate_property(self, "modulate", modulate, Color(1, 1, 1, 0), 20 | duration, Tween.TRANS_LINEAR, Tween.EASE_IN) 21 | $tween.start() 22 | yield($tween, "tween_completed") 23 | queue_free() 24 | -------------------------------------------------------------------------------- /source/juiceness/pop_score/pop_label.tscn: -------------------------------------------------------------------------------- 1 | [gd_scene load_steps=2 format=2] 2 | 3 | [ext_resource path="res://juiceness/pop_score/pop_label.gd" type="Script" id=1] 4 | 5 | [node name="pop_score" type="Node2D"] 6 | position = Vector2( 528, 328 ) 7 | script = ExtResource( 1 ) 8 | duration = 0.5 9 | 10 | [node name="label" type="Label" parent="."] 11 | margin_left = -64.0 12 | margin_top = -16.0 13 | margin_right = 64.0 14 | margin_bottom = 16.0 15 | rect_pivot_offset = Vector2( 64, 16 ) 16 | text = "500" 17 | align = 1 18 | valign = 1 19 | 20 | [node name="tween" type="Tween" parent="."] 21 | -------------------------------------------------------------------------------- /source/juiceness/shake_camera/rigged_camera/camera_rig.gd: -------------------------------------------------------------------------------- 1 | extends RemoteTransform2D 2 | 3 | var camera = null 4 | 5 | func _ready(): 6 | camera = get_node(remote_path) 7 | 8 | func shake(strength = camera.shake_strength, 9 | time = camera.get_node("timer").wait_time): 10 | camera.shake(strength, time) 11 | -------------------------------------------------------------------------------- /source/juiceness/shake_camera/rigged_camera/camera_rig.tscn: -------------------------------------------------------------------------------- 1 | [gd_scene load_steps=2 format=2] 2 | 3 | [ext_resource path="res://juiceness/shake_camera/rigged_camera/camera_rig.gd" type="Script" id=1] 4 | 5 | [node name="camera_rig" type="RemoteTransform2D"] 6 | 7 | remote_path = NodePath("") 8 | use_global_coordinates = true 9 | update_position = true 10 | update_rotation = true 11 | update_scale = true 12 | script = ExtResource( 1 ) 13 | 14 | 15 | -------------------------------------------------------------------------------- /source/juiceness/shake_camera/shake_camera.gd: -------------------------------------------------------------------------------- 1 | extends Camera2D 2 | 3 | export (float) var shake_strength = 10 4 | 5 | 6 | func _ready(): 7 | set_process(false) 8 | 9 | func _process(delta): 10 | offset.x = rand_range(-shake_strength, shake_strength) 11 | offset.y = rand_range(-shake_strength, shake_strength) 12 | 13 | func shake(strength = shake_strength, time = $timer.wait_time): 14 | 15 | var default_time = $timer.wait_time 16 | var default_strength = shake_strength 17 | 18 | shake_strength = strength 19 | $timer.wait_time = time 20 | 21 | set_process(true) 22 | $timer.start() 23 | yield($timer, "timeout") 24 | 25 | set_process(false) 26 | offset = Vector2(0, 0) 27 | shake_strength = default_strength 28 | $timer.wait_time = default_time 29 | -------------------------------------------------------------------------------- /source/juiceness/shake_camera/shake_camera.tscn: -------------------------------------------------------------------------------- 1 | [gd_scene load_steps=2 format=2] 2 | 3 | [ext_resource path="res://juiceness/shake_camera/shake_camera.gd" type="Script" id=1] 4 | 5 | [node name="shake_camera" type="Camera2D"] 6 | 7 | anchor_mode = 1 8 | rotating = false 9 | current = true 10 | zoom = Vector2( 1, 1 ) 11 | limit_left = -10000000 12 | limit_top = -10000000 13 | limit_right = 10000000 14 | limit_bottom = 10000000 15 | limit_smoothed = false 16 | drag_margin_h_enabled = true 17 | drag_margin_v_enabled = true 18 | smoothing_enabled = false 19 | smoothing_speed = 5.0 20 | offset_v = 0.0 21 | offset_h = 0.0 22 | drag_margin_left = 0.2 23 | drag_margin_top = 0.2 24 | drag_margin_right = 0.2 25 | drag_margin_bottom = 0.2 26 | editor_draw_screen = true 27 | editor_draw_limits = false 28 | editor_draw_drag_margin = false 29 | script = ExtResource( 1 ) 30 | shake_strength = 10 31 | 32 | [node name="timer" type="Timer" parent="." index="0"] 33 | 34 | process_mode = 1 35 | wait_time = 1.0 36 | one_shot = false 37 | autostart = false 38 | 39 | 40 | -------------------------------------------------------------------------------- /source/levels/template_level.tscn: -------------------------------------------------------------------------------- 1 | [gd_scene load_steps=13 format=2] 2 | 3 | [ext_resource path="res://objects/ladder/ladder.tscn" type="PackedScene" id=1] 4 | [ext_resource path="res://objects/pass_through_platform/pass_through_platform.tscn" type="PackedScene" id=2] 5 | [ext_resource path="res://actors/template/template_actor.tscn" type="PackedScene" id=3] 6 | [ext_resource path="res://juiceness/shake_camera/rigged_camera/camera_rig.tscn" type="PackedScene" id=4] 7 | [ext_resource path="res://juiceness/shake_camera/shake_camera.tscn" type="PackedScene" id=5] 8 | 9 | [sub_resource type="GDScript" id=1] 10 | script/source = "extends VBoxContainer 11 | 12 | func _process(delta): 13 | $spam.text = str(int($spam/timer.time_left))" 14 | 15 | [sub_resource type="GDScript" id=2] 16 | script/source = "extends HBoxContainer 17 | 18 | var coins = 0 19 | 20 | func _ready(): 21 | var t = \"x: {amount}\" 22 | $amount.text = t.format({\"amount\":coins}) 23 | func add_coin(): 24 | coins += 1 25 | var t = \"x: {amount}\" 26 | $amount.text = t.format({\"amount\":coins}) 27 | " 28 | 29 | [sub_resource type="GDScript" id=3] 30 | script/source = "extends HBoxContainer 31 | 32 | var score = 0 33 | 34 | func _ready(): 35 | var t = \"score: {amount}\" 36 | $amount.text = t.format({\"amount\":score}) 37 | 38 | func increase_score(amount): 39 | score += amount 40 | var t = \"score: {amount}\" 41 | $amount.text = t.format({\"amount\":score})" 42 | 43 | [sub_resource type="GDScript" id=4] 44 | script/source = "extends Node2D 45 | 46 | export (NodePath) var coins_interface 47 | export (NodePath) var score_interface 48 | func _ready(): 49 | for c in get_children(): 50 | c.connect(\"tree_exited\", get_node(coins_interface), \"add_coin\") 51 | c.connect(\"tree_exited\", get_node(score_interface), 52 | \"increase_score\", [100])" 53 | 54 | [sub_resource type="GDScript" id=5] 55 | script/source = "extends Node2D 56 | export (NodePath) var score_interface 57 | 58 | const SCORE = preload(\"res://juiceness/pop_score/pop_label.tscn\") 59 | 60 | func _ready(): 61 | for c in get_children(): 62 | c.connect(\"tree_exited\", get_node(score_interface), 63 | \"increase_score\", [500]) 64 | c.connect(\"tree_exited\", self, \"child_died\", [c]) 65 | 66 | func child_died(child): 67 | var s = SCORE.instance() 68 | s.position = child.position 69 | s.get_node(\"label\").text = str(int(500)) 70 | add_child(s)" 71 | 72 | [sub_resource type="PhysicsMaterial" id=6] 73 | friction = 0.0 74 | 75 | [sub_resource type="PhysicsMaterial" id=7] 76 | friction = 0.0 77 | 78 | [node name="template_level" type="Node2D"] 79 | 80 | [node name="interface" type="CanvasLayer" parent="."] 81 | pause_mode = 2 82 | editor/display_folded = true 83 | 84 | [node name="control" type="Control" parent="interface"] 85 | pause_mode = 1 86 | visible = false 87 | margin_right = 72.0 88 | margin_bottom = 40.0 89 | 90 | [node name="time" type="VBoxContainer" parent="interface/control"] 91 | editor/display_folded = true 92 | margin_left = 488.0 93 | margin_top = 8.0 94 | margin_right = 528.0 95 | margin_bottom = 50.0 96 | custom_constants/separation = 14 97 | script = SubResource( 1 ) 98 | 99 | [node name="title" type="Label" parent="interface/control/time"] 100 | margin_right = 40.0 101 | margin_bottom = 14.0 102 | text = "Time:" 103 | 104 | [node name="spam" type="Label" parent="interface/control/time"] 105 | margin_top = 28.0 106 | margin_right = 40.0 107 | margin_bottom = 42.0 108 | text = "{time}" 109 | 110 | [node name="timer" type="Timer" parent="interface/control/time/spam"] 111 | wait_time = 120.0 112 | one_shot = true 113 | autostart = true 114 | 115 | [node name="coins" type="HBoxContainer" parent="interface/control"] 116 | margin_left = 656.0 117 | margin_right = 750.0 118 | margin_bottom = 42.0 119 | script = SubResource( 2 ) 120 | 121 | [node name="coin" type="TextureRect" parent="interface/control/coins"] 122 | margin_right = 16.0 123 | margin_bottom = 42.0 124 | size_flags_horizontal = 3 125 | size_flags_vertical = 3 126 | stretch_mode = 4 127 | 128 | [node name="amount" type="Label" parent="interface/control/coins"] 129 | margin_left = 20.0 130 | margin_right = 94.0 131 | margin_bottom = 42.0 132 | size_flags_horizontal = 3 133 | size_flags_vertical = 3 134 | text = "x: {amount}" 135 | valign = 1 136 | 137 | [node name="score" type="HBoxContainer" parent="interface/control"] 138 | editor/display_folded = true 139 | margin_left = 872.0 140 | margin_right = 974.0 141 | margin_bottom = 42.0 142 | script = SubResource( 3 ) 143 | 144 | [node name="amount" type="Label" parent="interface/control/score"] 145 | margin_right = 102.0 146 | margin_bottom = 42.0 147 | size_flags_horizontal = 3 148 | size_flags_vertical = 3 149 | text = "score: {amount}" 150 | valign = 1 151 | 152 | [node name="coins" type="Node2D" parent="."] 153 | script = SubResource( 4 ) 154 | coins_interface = NodePath("../interface/control/coins") 155 | score_interface = NodePath("../interface/control/score") 156 | 157 | [node name="enemies" type="Node2D" parent="."] 158 | z_index = -1 159 | script = SubResource( 5 ) 160 | score_interface = NodePath("../interface/control/score") 161 | 162 | [node name="wall_left" type="StaticBody2D" parent="."] 163 | editor/display_folded = true 164 | position = Vector2( -8, 16 ) 165 | physics_material_override = SubResource( 6 ) 166 | 167 | [node name="shape" type="CollisionPolygon2D" parent="wall_left"] 168 | polygon = PoolVector2Array( 8, -8, 8, 504, -24, 504, -24, -8 ) 169 | 170 | [node name="shape2" type="CollisionPolygon2D" parent="wall_left"] 171 | position = Vector2( -212, 4 ) 172 | polygon = PoolVector2Array( 8, -8, 8, 504, -24, 504, -24, -8 ) 173 | 174 | [node name="wall_right" type="StaticBody2D" parent="."] 175 | editor/display_folded = true 176 | position = Vector2( 1930, 20 ) 177 | physics_material_override = SubResource( 7 ) 178 | 179 | [node name="shape" type="CollisionPolygon2D" parent="wall_right"] 180 | polygon = PoolVector2Array( 8, -8, 8, 504, -24, 504, -24, -8 ) 181 | 182 | [node name="tile_map" type="TileMap" parent="."] 183 | format = 1 184 | __meta__ = { 185 | "_edit_lock_": true 186 | } 187 | 188 | [node name="floor" type="StaticBody2D" parent="."] 189 | 190 | [node name="shape" type="CollisionPolygon2D" parent="floor"] 191 | polygon = PoolVector2Array( 0, 520, 1904, 520, 1904, 592, 0, 592 ) 192 | 193 | [node name="background_music" type="AudioStreamPlayer" parent="."] 194 | bus = "music" 195 | 196 | [node name="slope" type="StaticBody2D" parent="."] 197 | editor/display_folded = true 198 | 199 | [node name="shape" type="CollisionPolygon2D" parent="slope"] 200 | position = Vector2( -50, 0 ) 201 | polygon = PoolVector2Array( 400, 520, 560, 460, 810, 460, 810, 520 ) 202 | 203 | [node name="shape2" type="CollisionPolygon2D" parent="slope"] 204 | position = Vector2( 1780, 390 ) 205 | polygon = PoolVector2Array( 128, 4, 0, 132, 128, 132 ) 206 | 207 | [node name="ladder" parent="." instance=ExtResource( 1 )] 208 | position = Vector2( 1077.6, 168 ) 209 | 210 | [node name="ladder2" parent="." instance=ExtResource( 1 )] 211 | position = Vector2( 1248, -184 ) 212 | 213 | [node name="pass_through_platform" parent="." instance=ExtResource( 2 )] 214 | position = Vector2( 824, -56 ) 215 | 216 | [node name="pass_through_platform2" parent="." instance=ExtResource( 2 )] 217 | position = Vector2( 976, -184 ) 218 | 219 | [node name="pass_through_platform3" parent="." instance=ExtResource( 2 )] 220 | position = Vector2( 1112, 168 ) 221 | 222 | [node name="template_actor" parent="." instance=ExtResource( 3 )] 223 | position = Vector2( 576, 96 ) 224 | 225 | [node name="camera_rig" parent="template_actor" instance=ExtResource( 4 )] 226 | remote_path = NodePath("../../shake_camera") 227 | 228 | [node name="shake_camera" parent="." instance=ExtResource( 5 )] 229 | position = Vector2( 576, 96 ) 230 | -------------------------------------------------------------------------------- /source/objects/ladder/ladder.tscn: -------------------------------------------------------------------------------- 1 | [gd_scene format=2] 2 | 3 | [node name="ladder" type="Position2D"] 4 | 5 | _sections_unfolded = [ "Collision" ] 6 | 7 | [node name="top" type="StaticBody2D" parent="." index="0"] 8 | 9 | input_pickable = false 10 | collision_layer = 4 11 | collision_mask = 0 12 | constant_linear_velocity = Vector2( 0, 0 ) 13 | constant_angular_velocity = 0.0 14 | friction = 1.0 15 | bounce = 0.0 16 | _sections_unfolded = [ "Collision" ] 17 | 18 | [node name="shape" type="CollisionPolygon2D" parent="top" index="0"] 19 | 20 | build_mode = 0 21 | polygon = PoolVector2Array( -40, 0, -40, 64, 40, 64, 40, 0 ) 22 | 23 | [node name="bottom" type="Area2D" parent="." index="1"] 24 | 25 | input_pickable = true 26 | gravity_vec = Vector2( 0, 1 ) 27 | gravity = 98.0 28 | linear_damp = 0.1 29 | angular_damp = 1.0 30 | collision_layer = 4 31 | collision_mask = 0 32 | audio_bus_override = false 33 | audio_bus_name = "Master" 34 | _sections_unfolded = [ "Collision" ] 35 | 36 | [node name="shape" type="CollisionPolygon2D" parent="bottom" index="0"] 37 | 38 | build_mode = 0 39 | polygon = PoolVector2Array( -40, 0, 40, 0, 40, 272, -40, 272 ) 40 | 41 | 42 | -------------------------------------------------------------------------------- /source/objects/pass_through_platform/pass_through_platform.tscn: -------------------------------------------------------------------------------- 1 | [gd_scene format=2] 2 | 3 | [node name="pass_through_platform" type="StaticBody2D"] 4 | 5 | input_pickable = false 6 | collision_layer = 8 7 | collision_mask = 0 8 | constant_linear_velocity = Vector2( 0, 0 ) 9 | constant_angular_velocity = 0.0 10 | friction = 1.0 11 | bounce = 0.0 12 | _sections_unfolded = [ "Collision", "Transform" ] 13 | 14 | [node name="shape" type="CollisionPolygon2D" parent="." index="0"] 15 | 16 | build_mode = 0 17 | polygon = PoolVector2Array( 0, 0, 0, 64, 232, 64, 232, 0 ) 18 | one_way_collision = true 19 | 20 | 21 | -------------------------------------------------------------------------------- /source/objects/pickup.tscn: -------------------------------------------------------------------------------- 1 | [gd_scene format=2] 2 | 3 | [node name="pickup" type="Area2D" groups=[ 4 | "pickup", 5 | ]] 6 | 7 | input_pickable = true 8 | gravity_vec = Vector2( 0, 1 ) 9 | gravity = 98.0 10 | linear_damp = 0.1 11 | angular_damp = 1.0 12 | audio_bus_override = false 13 | audio_bus_name = "Master" 14 | 15 | [node name="sprite" type="Sprite" parent="." index="0"] 16 | 17 | [node name="shape" type="CollisionShape2D" parent="." index="1"] 18 | -------------------------------------------------------------------------------- /source/project.godot: -------------------------------------------------------------------------------- 1 | ; Engine configuration file. 2 | ; It's best edited using the editor UI and not directly, 3 | ; since the parameters that go here are not all obvious. 4 | ; 5 | ; Format: 6 | ; [section] ; section goes between [] 7 | ; param=value ; assign values to parameters 8 | 9 | config_version=4 10 | 11 | _global_script_classes=[ ] 12 | _global_script_class_icons={ 13 | 14 | } 15 | 16 | [application] 17 | 18 | config/name="Platform Template" 19 | run/main_scene="res://levels/template_level.tscn" 20 | config/icon="res://icon.png" 21 | 22 | [display] 23 | 24 | window/stretch/mode="viewport" 25 | window/stretch/aspect="keep_width" 26 | 27 | [editor_plugins] 28 | 29 | enabled=PoolStringArray( ) 30 | 31 | [input] 32 | 33 | jump_1={ 34 | "deadzone": 0.5, 35 | "events": [ Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":32,"unicode":0,"echo":false,"script":null) 36 | , Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":0,"button_index":0,"pressure":0.0,"pressed":false,"script":null) 37 | ] 38 | } 39 | up_1={ 40 | "deadzone": 0.5, 41 | "events": [ Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":87,"unicode":0,"echo":false,"script":null) 42 | , Object(InputEventJoypadMotion,"resource_local_to_scene":false,"resource_name":"","device":0,"axis":1,"axis_value":-1.0,"script":null) 43 | ] 44 | } 45 | left_1={ 46 | "deadzone": 0.5, 47 | "events": [ Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":65,"unicode":0,"echo":false,"script":null) 48 | , Object(InputEventJoypadMotion,"resource_local_to_scene":false,"resource_name":"","device":0,"axis":0,"axis_value":-1.0,"script":null) 49 | ] 50 | } 51 | right_1={ 52 | "deadzone": 0.5, 53 | "events": [ Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":68,"unicode":0,"echo":false,"script":null) 54 | , Object(InputEventJoypadMotion,"resource_local_to_scene":false,"resource_name":"","device":0,"axis":0,"axis_value":1.0,"script":null) 55 | ] 56 | } 57 | down_1={ 58 | "deadzone": 0.5, 59 | "events": [ Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":83,"unicode":0,"echo":false,"script":null) 60 | , Object(InputEventJoypadMotion,"resource_local_to_scene":false,"resource_name":"","device":0,"axis":1,"axis_value":1.0,"script":null) 61 | ] 62 | } 63 | dash_1={ 64 | "deadzone": 0.5, 65 | "events": [ Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":16777237,"unicode":0,"echo":false,"script":null) 66 | , Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":0,"button_index":1,"pressure":0.0,"pressed":false,"script":null) 67 | ] 68 | } 69 | left_2={ 70 | "deadzone": 0.5, 71 | "events": [ Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":16777231,"unicode":0,"echo":false,"script":null) 72 | , Object(InputEventJoypadMotion,"resource_local_to_scene":false,"resource_name":"","device":1,"axis":0,"axis_value":-1.0,"script":null) 73 | ] 74 | } 75 | right_2={ 76 | "deadzone": 0.5, 77 | "events": [ Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":16777233,"unicode":0,"echo":false,"script":null) 78 | , Object(InputEventJoypadMotion,"resource_local_to_scene":false,"resource_name":"","device":1,"axis":0,"axis_value":1.0,"script":null) 79 | ] 80 | } 81 | up_2={ 82 | "deadzone": 0.5, 83 | "events": [ Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":16777232,"unicode":0,"echo":false,"script":null) 84 | , Object(InputEventJoypadMotion,"resource_local_to_scene":false,"resource_name":"","device":1,"axis":1,"axis_value":-1.0,"script":null) 85 | ] 86 | } 87 | down_2={ 88 | "deadzone": 0.5, 89 | "events": [ Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":16777234,"unicode":0,"echo":false,"script":null) 90 | , Object(InputEventJoypadMotion,"resource_local_to_scene":false,"resource_name":"","device":1,"axis":1,"axis_value":1.0,"script":null) 91 | ] 92 | } 93 | jump_2={ 94 | "deadzone": 0.5, 95 | "events": [ Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":16777232,"unicode":0,"echo":false,"script":null) 96 | , Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":1,"button_index":0,"pressure":0.0,"pressed":false,"script":null) 97 | ] 98 | } 99 | dash_2={ 100 | "deadzone": 0.5, 101 | "events": [ Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":16777238,"unicode":0,"echo":false,"script":null) 102 | , Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":1,"button_index":1,"pressure":0.0,"pressed":false,"script":null) 103 | ] 104 | } 105 | 106 | [layer_names] 107 | 108 | 2d_physics/layer_1="general" 109 | 2d_physics/layer_2="actors" 110 | 2d_physics/layer_3="ladders" 111 | 2d_physics/layer_4="pass_through" 112 | 113 | [node] 114 | 115 | name_casing=2 116 | 117 | [rendering] 118 | 119 | environment/default_clear_color=Color( 0.191406, 0.191406, 0.191406, 1 ) 120 | environment/default_environment="res://default_env.tres" 121 | --------------------------------------------------------------------------------