From 203e91cdabe9475b4f371b0a571d132df35f9de5 Mon Sep 17 00:00:00 2001 From: Juicy Date: Wed, 19 May 2021 16:22:05 +0200 Subject: [PATCH] Implemented humanoid --- LICENSE | 19 + README.md | 3 + assets/fonts/brass_mono.otf | Bin 0 -> 39012 bytes assets/graphics/template_body_sheet.png | Bin 0 -> 23592 bytes .../graphics/template_body_sheet.png.import | 34 ++ assets/graphics/template_head_sheet.png | Bin 0 -> 21882 bytes .../graphics/template_head_sheet.png.import | 34 ++ assets/graphics/template_humanoid.png | Bin 0 -> 46587 bytes assets/graphics/template_humanoid.png.import | 34 ++ data_management/data_manager.gd | 60 +++ data_management/storable.gd | 44 ++ ingame/camera/camera.gd | 200 +++++++ ingame/camera/ingame_display.material | Bin 0 -> 645 bytes ingame/humanoid/animation_handler.gd | 125 +++++ ingame/humanoid/humanoid.gd | 73 +++ ingame/humanoid/humanoid.tscn | 32 ++ ingame/player/player.gd | 112 ++++ ingame/player/player.tscn | 18 + nodes/event/event.gd | 113 ++++ nodes/event/icon_event.svg | 1 + nodes/event/icon_event.svg.import | 34 ++ nodes/map/icon_map.svg | 1 + nodes/map/icon_map.svg.import | 34 ++ nodes/map/map.gd | 52 ++ nodes/map/map.tscn | 6 + nodes/spawn_marker/spawn_marker.gd | 19 + nodes/spawn_marker/spawn_marker.png | Bin 0 -> 11257 bytes nodes/spawn_marker/spawn_marker.png.import | 34 ++ nodes/spawn_marker/spawn_marker.tscn | 6 + nodes/trigger/icon_trigger.svg | 1 + nodes/trigger/icon_trigger.svg.import | 34 ++ nodes/trigger/passable_trigger.tscn | 8 + nodes/trigger/solid_trigger.tscn | 8 + nodes/trigger/trigger.gd | 31 ++ nodes/trigger/trigger.tscn | 6 + nodes/trigger/trigger_collision_object.gd | 7 + plugin.cfg | 7 + rpgh_engine.tscn | 505 ++++++++++++++++++ system/init.gd | 6 + system/init.tscn | 8 + system/rpgh_engine.gd | 40 ++ ui/bust.material | Bin 0 -> 583 bytes ui/bust_transition.png | Bin 0 -> 18520 bytes ui/bust_transition.png.import | 34 ++ ui/dialog.gd | 221 ++++++++ ui/pause.gd | 20 + ui/textbox.gd | 39 ++ 47 files changed, 2063 insertions(+) create mode 100644 LICENSE create mode 100644 README.md create mode 100644 assets/fonts/brass_mono.otf create mode 100644 assets/graphics/template_body_sheet.png create mode 100644 assets/graphics/template_body_sheet.png.import create mode 100644 assets/graphics/template_head_sheet.png create mode 100644 assets/graphics/template_head_sheet.png.import create mode 100644 assets/graphics/template_humanoid.png create mode 100644 assets/graphics/template_humanoid.png.import create mode 100644 data_management/data_manager.gd create mode 100644 data_management/storable.gd create mode 100644 ingame/camera/camera.gd create mode 100644 ingame/camera/ingame_display.material create mode 100644 ingame/humanoid/animation_handler.gd create mode 100644 ingame/humanoid/humanoid.gd create mode 100644 ingame/humanoid/humanoid.tscn create mode 100644 ingame/player/player.gd create mode 100644 ingame/player/player.tscn create mode 100644 nodes/event/event.gd create mode 100644 nodes/event/icon_event.svg create mode 100644 nodes/event/icon_event.svg.import create mode 100644 nodes/map/icon_map.svg create mode 100644 nodes/map/icon_map.svg.import create mode 100644 nodes/map/map.gd create mode 100644 nodes/map/map.tscn create mode 100644 nodes/spawn_marker/spawn_marker.gd create mode 100644 nodes/spawn_marker/spawn_marker.png create mode 100644 nodes/spawn_marker/spawn_marker.png.import create mode 100644 nodes/spawn_marker/spawn_marker.tscn create mode 100644 nodes/trigger/icon_trigger.svg create mode 100644 nodes/trigger/icon_trigger.svg.import create mode 100644 nodes/trigger/passable_trigger.tscn create mode 100644 nodes/trigger/solid_trigger.tscn create mode 100644 nodes/trigger/trigger.gd create mode 100644 nodes/trigger/trigger.tscn create mode 100644 nodes/trigger/trigger_collision_object.gd create mode 100644 plugin.cfg create mode 100644 rpgh_engine.tscn create mode 100644 system/init.gd create mode 100644 system/init.tscn create mode 100644 system/rpgh_engine.gd create mode 100644 ui/bust.material create mode 100644 ui/bust_transition.png create mode 100644 ui/bust_transition.png.import create mode 100644 ui/dialog.gd create mode 100644 ui/pause.gd create mode 100644 ui/textbox.gd diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..4a44488 --- /dev/null +++ b/LICENSE @@ -0,0 +1,19 @@ +MIT License Copyright (c) 2021 Leon Rauschenberg + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is furnished +to do so, subject to the following conditions: + +The above copyright notice and this permission notice (including the next +paragraph) shall be included in all copies or substantial portions of the +Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS +OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/README.md b/README.md new file mode 100644 index 0000000..794e0cc --- /dev/null +++ b/README.md @@ -0,0 +1,3 @@ +# RPGH_Engine + +A basic Godot framework to build my own little rpg horror games. \o/ \ No newline at end of file diff --git a/assets/fonts/brass_mono.otf b/assets/fonts/brass_mono.otf new file mode 100644 index 0000000000000000000000000000000000000000..f32341b9bcb0230ec475168d66f02fe5fa8705ad GIT binary patch literal 39012 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

aJohxv%01*`h#o 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 X;SYJ%*Hk}Of2#U`|B!R#>XiO(UG$>I literal 0 HcmV?d00001 diff --git a/assets/graphics/template_body_sheet.png b/assets/graphics/template_body_sheet.png new file mode 100644 index 0000000000000000000000000000000000000000..4a53ff6a948f874d8a5c8c317fb004f553095d43 GIT binary patch literal 23592 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 literal 0 HcmV?d00001 diff --git a/assets/graphics/template_head_sheet.png.import b/assets/graphics/template_head_sheet.png.import new file mode 100644 index 0000000..50c2213 --- /dev/null +++ b/assets/graphics/template_head_sheet.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/template_head_sheet.png-ccffc3ebe8cf379534d68b508e65b991.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/rpgh_engine/assets/graphics/template_head_sheet.png" +dest_files=[ "res://.import/template_head_sheet.png-ccffc3ebe8cf379534d68b508e65b991.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=false +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +stream=false +size_limit=0 +detect_3d=false +svg/scale=1.0 diff --git a/assets/graphics/template_humanoid.png b/assets/graphics/template_humanoid.png new file mode 100644 index 0000000000000000000000000000000000000000..681a00b04d0b6c181ab98ff9005514b30d9c00c2 GIT binary patch literal 46587 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%0Dt1 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 YpFRJx)0PB$)&O)}&rG*M+cEtA0Oavu%m4rY literal 0 HcmV?d00001 diff --git a/assets/graphics/template_humanoid.png.import b/assets/graphics/template_humanoid.png.import new file mode 100644 index 0000000..364cb4a --- /dev/null +++ b/assets/graphics/template_humanoid.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/template_humanoid.png-efa89c12906092cd739cf9f69dbb6647.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/rpgh_engine/assets/graphics/template_humanoid.png" +dest_files=[ "res://.import/template_humanoid.png-efa89c12906092cd739cf9f69dbb6647.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=false +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +stream=false +size_limit=0 +detect_3d=false +svg/scale=1.0 diff --git a/data_management/data_manager.gd b/data_management/data_manager.gd new file mode 100644 index 0000000..7602f55 --- /dev/null +++ b/data_management/data_manager.gd @@ -0,0 +1,60 @@ +class_name RPGH_DataManager +extends Node + + +var current_map = null +var game_version: String + +var _game_data = "user://save.json" + +var default_data = { + "options": { + "music_volume": 0.5 + } +} + +var global_data = {} + + +func _ready(): + game_version = ProjectSettings.get_setting("application/config/version") + load_from_file() + print(game_version) + + +func write_in_dictionary(key, value): + global_data[key] = value + + +func save_to_file(): + var f = File.new() + f.open(_game_data, File.WRITE) + f.store_line(to_json(global_data)) + f.close() + + +func load_from_file(): + var f = File.new() + if !f.file_exists(_game_data): + default_data() + return + if f.open(_game_data, File.READ) != OK: + f.close() + return + var text := JSON.parse(f.get_as_text()) + if text.result == null: + default_data() + push_error("Can't parse JSON, Save File is corrupted") + return + else: + return + f.close() + global_data = text.result + + +func default_data(): + global_data = default_data + + +func _on_Button_button_down(): + save_to_file() diff --git a/data_management/storable.gd b/data_management/storable.gd new file mode 100644 index 0000000..b96df92 --- /dev/null +++ b/data_management/storable.gd @@ -0,0 +1,44 @@ +extends RPGH_DataManager +# Just keeps a value that is stored over multiple +# maps and sessions. + +var value setget _set_value, _get_value + +var _key = "" +var _value = null +var map_key = "" +var event_key = "" +var _initial_value = null + +var data + +func _init(key: String, initial_value = null, map = null, event = null): + data = RPGH.get_node("DataManager").global_data + _initial_value = initial_value + + if map != null: + yield(map, "ready") + map_key = map.name + "_" + if event != null: + event_key = event.name + "_" + + _key = map_key + event_key + key + _value = initial_value + + if !data.has(_key): + RPGH.get_node("DataManager").write_in_dictionary(_key, initial_value) + return + else: + return + + +func _set_value(new_value): + _value = new_value + if new_value == _initial_value: + data.erase(_key) + else: + RPGH.get_node("DataManager").write_in_dictionary(_key, _value) + + +func _get_value(): + return _value diff --git a/ingame/camera/camera.gd b/ingame/camera/camera.gd new file mode 100644 index 0000000..feb7a34 --- /dev/null +++ b/ingame/camera/camera.gd @@ -0,0 +1,200 @@ +extends Camera2D + +var _previous_observee_position: Vector2 + +var _previous_camera_setup := CameraSetup.new() +var _target_camera_setup := CameraSetup.new() # This one is used if only one ist set. +var _fade_over_start_timestamp = 0.0 +var _fade_over_duration = 0.0 +var _fade_over_smooth = false + +onready var IngameDisplay = get_node("../../../Display") + + +func _process(_delta): +# if not _previous_observee_position == RPGH.Camera._get_definite_position(): +# _previous_observee_position = RPGH.Camera._get_definite_position() +# _update_camera_position() +# elif RPGH.Camera._is_zoom_invalid: +# _update_camera_position() +# RPGH.Camera._is_zoom_invalid = false + _update_camera_position() + + +func set_camera_setup(camera_setup): + _target_camera_setup = camera_setup + _fade_over_duration = 0.0 + + +func fade_over_camera_setup(camera_setup, duration, smooth = false): + _previous_camera_setup = _target_camera_setup + _target_camera_setup = camera_setup + _fade_over_start_timestamp = OS.get_ticks_msec() * 0.001 + _fade_over_duration = duration + _fade_over_smooth = smooth + + +func _get_definite_position(): + var previous_position = _previous_camera_setup.position + var target_position = _target_camera_setup.position + var ratio = _get_ratio_over_time() + return previous_position.linear_interpolate(target_position, ratio) + + +func _get_definite_zoom(): + var previous_zoom = _previous_camera_setup.zoom + var target_zoom = _target_camera_setup.zoom + var ratio = _get_ratio_over_time() + return lerp(previous_zoom, target_zoom, ratio) + + +func _get_ratio_over_time(): + var current_timestamp = OS.get_ticks_msec() * 0.001 + var passed_time = current_timestamp - _fade_over_start_timestamp + var ratio + if _fade_over_duration > 0.0: + ratio = clamp(passed_time / _fade_over_duration, 0.0, 1.0) + else: + ratio = 1.0 + if _fade_over_smooth: + if ratio <= 0.5: + ratio = pow(ratio * 2.0, 3.0) * 0.5 + else: + ratio = 1.0 - ratio + ratio = pow(ratio * 2.0, 3.0) * 0.5 + ratio = 1.0 - ratio + return ratio + + +func _update_camera_position(): + var definite_position = _get_definite_position() + var definite_zoom = _get_definite_zoom() + + var whole_definite_position = Vector2(floor(definite_position.x), floor(definite_position.y)) + var decimal_part = definite_position - whole_definite_position + var zoomed_decimal_part = decimal_part * -1.6 * definite_zoom + position = whole_definite_position + IngameDisplay.get_material().set_shader_param("offset", zoomed_decimal_part) + IngameDisplay.get_material().set_shader_param("zoom", definite_zoom) + force_update_scroll() + + +class CameraSetup: + var observee: Node2D = null setget ,_get_observee + var pixel_perfect = false setget ,_get_pixel_perfect # Forced if observee is player. + var position = Vector2() setget ,_get_position + var zoom := 1.0 setget _set_zoom, _get_zoom + var limit_left := -INF + var limit_right := INF + var limit_top := -INF + var limit_bottom := INF + + var _previous_observee_position + var _is_zoom_invalid = false + var _cached_position = Vector2() + var _cached_zoom + + +# warning-ignore:shadowed_variable +# warning-ignore:shadowed_variable + func _calculate_and_cache_position_and_zoom(position, zoom): + var zoomed_screen_size = RPGH.DEFAULT_SCREEN_SIZE * zoom + var half_zoomed_screen_size = zoomed_screen_size * 0.5 + + var horizontal_border_alignment = _align_and_squish_borders( + position.x, half_zoomed_screen_size.x, limit_left, limit_right + ) + + _cached_position.x = horizontal_border_alignment[0] + var left_border = horizontal_border_alignment[1] + var right_border = horizontal_border_alignment[2] + var horizontal_size = right_border - left_border + var horizontal_zoom = RPGH.DEFAULT_SCREEN_SIZE.x / horizontal_size + + var vertical_border_alignment = _align_and_squish_borders( + position.y, half_zoomed_screen_size.y, limit_top, limit_bottom + ) + + _cached_position.y = vertical_border_alignment[0] + var top_border = vertical_border_alignment[1] + var bottom_border = vertical_border_alignment[2] + var vertical_size = bottom_border - top_border + var vertical_zoom = RPGH.DEFAULT_SCREEN_SIZE.y / vertical_size + + if _get_pixel_perfect(): + _cached_position = Vector2(floor(_cached_position.x), floor(_cached_position.y)) + _cached_zoom = min(horizontal_zoom, vertical_zoom) + + + func _align_and_squish_borders(current_position, expansion, limit_negative, limit_positive): + #var current_position = position + var left_border = current_position - expansion + var right_border = current_position + expansion + + if limit_negative > left_border: + current_position += limit_negative - left_border + left_border = limit_negative + right_border = current_position + expansion + if limit_positive < right_border: + right_border = limit_positive + current_position = (left_border + right_border) * 0.5 + elif limit_positive < right_border: + current_position += limit_positive - right_border + right_border = limit_positive + left_border = current_position - expansion + if limit_negative > left_border: + left_border = limit_negative + current_position = (left_border + right_border) * 0.5 + + return [current_position, left_border, right_border] + + + func _get_observee(): + if not is_instance_valid(observee): + observee = null + if observee == null: + if RPGH.Player._player_exists: + return RPGH.Player.CameraFocus + else: + return RPGH.Player.CameraFocus # CHANGE THIS PLEASE. #later# CHANGE TO WHAT?! + else: + return observee + + + func _get_pixel_perfect(): + if observee == null: + return true + else: + return pixel_perfect + + + func _get_position(): + var observee_position = _get_observee().global_position + + var is_position_invalid = not observee_position == _previous_observee_position + + if is_position_invalid or _is_zoom_invalid: + _previous_observee_position = observee_position + _is_zoom_invalid = false + _calculate_and_cache_position_and_zoom(observee_position, zoom) + + return _cached_position + + + func _set_zoom(value): + zoom = value + _is_zoom_invalid = true + RPGH.Camera.IngameDisplay.get_material().set_shader_param("zoom", zoom) + + + func _get_zoom(): + var observee_position = _get_observee().global_position + + var is_position_invalid = not observee_position == _previous_observee_position + + if is_position_invalid or _is_zoom_invalid: + _previous_observee_position = observee_position + _is_zoom_invalid = false + _calculate_and_cache_position_and_zoom(observee_position, zoom) + + return _cached_zoom diff --git a/ingame/camera/ingame_display.material b/ingame/camera/ingame_display.material new file mode 100644 index 0000000000000000000000000000000000000000..4ceccfe12e553e57d48a0d48c6edaf88bf832d6f GIT binary patch literal 645 zcmV;00($*YQ$s@n000005C8yR1ONbS0ssIgwJ-f(U;`Z!0G6O=FYs)N2F$>wSnXxG zGnNdkihSjktc+qH7ju|d$R|KWM6w`8RPm>XqjlPm5mMm~R{&Z7UI2HKpz~i8bzhA* zT9bm-WQs4v)`Wjr1f4C4<<;E`eZ8gB&#B&gVe;pd-94bcMr)wozPzTJrz*-@O)oKa zugBfJpt~1cMT$Si2l!{Cpmg_vh3*c}9q!?h*LydfUN zg8#hLiRx!MT`{v!`dga3P@x$FFsM!wE9;_jiuh}k?`y-Y0)^+lj-bcxh=88Qq+D1HghWBO?@|)OZGwt9G7F8X;sm fYqhL|eluJ_06Bje(NX3VSC{Xs= 1.0: + _walk_interpolation_ratio -= 1.0 + emit_signal("tile_reached") + else: + var next_position = _previous_position.linear_interpolate( + _target_position, _walk_interpolation_ratio) + emit_signal("texture_position_updated", next_position) + + +func _handle_sprite_sheet_animation(delta): + _frame_coords = Vector2.ZERO + + if _in_walk_animation: + if _in_idle_frame: + _in_idle_frame = false + _frame_timer = _next_initial_frame_timer + _frame_coords.x = floor(_get_wraped_frame_timer(delta) + 1.0) + else: + if _in_idle_frame: + _frame_coords.x = 0.0 + else: + _handle_after_walk_animation(delta) + + _frame_coords.y = view_direction + + if _frame_coords != _previous_frame_coords: + emit_signal("frame_pushed", _frame_coords) + + +# The humanoid is supposed to finish its walking animation, +# even if it already reached a whole tile. +func _handle_after_walk_animation(delta): + var wraped_previous_frame_timer = wrapf(_previous_frame_timer, 0.0, 4.0) + var wraped_frame_timer = _get_wraped_frame_timer(delta) + + _next_initial_frame_timer = floor(wraped_frame_timer * 0.5) * 2.0 + + var walk_animation_frame = floor(wraped_frame_timer) + 1.0 + + var wraped_2 = wrapf(wraped_frame_timer, 1.0, 3.0) - 1.0 + var previous_wraped_2 = wrapf(wraped_previous_frame_timer, 1.0, 3.0) - 1.0 + + if previous_wraped_2 > wraped_2: + _in_idle_frame = true + _frame_coords.x = 0.0 + else: + _frame_coords.x = walk_animation_frame + + +func _get_wraped_frame_timer(delta): + _previous_frame_timer = _frame_timer + _frame_timer += delta * FRAMES_PER_SECOND + return wrapf(_frame_timer, 0.0, 4.0) diff --git a/ingame/humanoid/humanoid.gd b/ingame/humanoid/humanoid.gd new file mode 100644 index 0000000..f1a040c --- /dev/null +++ b/ingame/humanoid/humanoid.gd @@ -0,0 +1,73 @@ +class_name RPGH_Humanoid +extends YSort + +const DIAGONAL_SPEED_MULTIPLIER = 0.8 +const STEP = 8.0 + +onready var Texture = get_node("Texture") +onready var AnimationHandler = get_node("Texture/AnimationHandler") +onready var CameraFocus = get_node("Texture/CameraFocus") +onready var Body = get_node("Body") + +onready var view_direction_map = { + Vector2(0.0, -1.0) : AnimationHandler.ViewDirection.UP, + Vector2(1.0, -1.0) : AnimationHandler.ViewDirection.UP_RIGHT, + Vector2(1.0, 0.0) : AnimationHandler.ViewDirection.RIGHT, + Vector2(1.0, 1.0) : AnimationHandler.ViewDirection.DOWN_RIGHT, + Vector2(0.0, 1.0) : AnimationHandler.ViewDirection.DOWN, + Vector2(-1.0, 1.0) : AnimationHandler.ViewDirection.DOWN_LEFT, + Vector2(-1.0, 0.0) : AnimationHandler.ViewDirection.LEFT, + Vector2(-1.0, -1.0) : AnimationHandler.ViewDirection.UP_LEFT +} + +# Called when the node enters the scene tree for the first time. +func _ready(): + _check_if_on_tile() + AnimationHandler.set_position(Body.position) + + +# Returns true if the humanoid is moved. +func move(direction: Vector2) -> bool: + var direction_test_list = [ Vector2(direction.x, direction.y), + # Default direction, rotated 45 degrees to the left. + Vector2( + clamp(direction.x + direction.y, -1.0, 1.0), + clamp(direction.y - direction.x, -1.0, 1.0)), + # Default direction, rotated 45 degrees to the right. + Vector2( + clamp(direction.x - direction.y, -1.0, 1.0), + clamp(direction.y + direction.x, -1.0, 1.0)) ] + + # Already setting a few variables in case no test is successful. + AnimationHandler.speed_multiplier = DIAGONAL_SPEED_MULTIPLIER + if direction.x == 0 or direction.y == 0: + AnimationHandler.speed_multiplier = 1.0 + var was_humanoid_moved = false + + for direction_test in direction_test_list: + var step_to_destination = direction_test * STEP + + if !Body.test_move(Body.global_transform, step_to_destination): + AnimationHandler.view_direction = view_direction_map[direction_test] + AnimationHandler.speed_multiplier = DIAGONAL_SPEED_MULTIPLIER + if direction_test.x == 0 or direction_test.y == 0: + AnimationHandler.speed_multiplier = 1.0 + # Finally actually moving the body. + Body.position += step_to_destination + AnimationHandler.start_walk_animation(Body.position) + was_humanoid_moved = true + break + return was_humanoid_moved + + +# Checking if humanoid is positioned on a tile. +func _check_if_on_tile(): + var on_tile = true + if not wrapf(position.x, 0.0, 8.0) == 0.0: + position.x = round(position.x / 8.0) * 8.0 + on_tile = false + if not wrapf(position.y, 0.0, 8.0) == 0.0: + position.y = round(position.y / 8.0) * 8.0 + on_tile = false + if not on_tile: + push_warning("The humanoid was not exactly position on a tile! Please fix this.") diff --git a/ingame/humanoid/humanoid.tscn b/ingame/humanoid/humanoid.tscn new file mode 100644 index 0000000..97fe248 --- /dev/null +++ b/ingame/humanoid/humanoid.tscn @@ -0,0 +1,32 @@ +[gd_scene load_steps=5 format=2] + +[ext_resource path="res://addons/rpgh_engine/ingame/humanoid/humanoid.gd" type="Script" id=1] +[ext_resource path="res://addons/rpgh_engine/assets/graphics/template_humanoid.png" type="Texture" id=2] +[ext_resource path="res://addons/rpgh_engine/ingame/humanoid/animation_handler.gd" type="Script" id=3] + +[sub_resource type="RectangleShape2D" id=1] + +[node name="Humanoid" type="YSort"] +script = ExtResource( 1 ) + +[node name="Texture" type="Sprite" parent="."] +texture = ExtResource( 2 ) +centered = false +offset = Vector2( 0, -14 ) +hframes = 15 +vframes = 8 +frame = 60 + +[node name="AnimationHandler" type="Node" parent="Texture"] +script = ExtResource( 3 ) + +[node name="CameraFocus" type="Position2D" parent="Texture"] +position = Vector2( 12, 8 ) + +[node name="Body" type="KinematicBody2D" parent="."] +collision_layer = 0 +collision_mask = 2 + +[node name="Collision" type="CollisionShape2D" parent="Body"] +position = Vector2( 12, 12 ) +shape = SubResource( 1 ) diff --git a/ingame/player/player.gd b/ingame/player/player.gd new file mode 100644 index 0000000..ea7eebd --- /dev/null +++ b/ingame/player/player.gd @@ -0,0 +1,112 @@ +extends RPGH_Humanoid + +enum Direction { + UP = -1, + LEFT = -1 + NONE = 0, + RIGHT = 1, + DOWN = 1 +} + +# Input variables. +var input_x_axis = Direction.NONE +var input_y_axis = Direction.NONE +var input_interact = false + +var _player_exists = false +var _player_movement_disabled := false +var _player_interact_disabled := false +var _await_interaction = false + +onready var InteractableAntenna = get_node("Body/InteractableAntenna") + + +func spawn(position: Vector2): + Body.position = position + AnimationHandler.set_position(Body.position) + self.Texture.position = position + self.Texture.visible = true + _player_exists = true + + +func despawn(): + self.Texture.visible = false + _player_exists = false + + +# Called when the node enters the scene tree for the first time. +func _ready(): + AnimationHandler.connect( + "texture_position_updated", self, "_on_texture_position_updated") + AnimationHandler.connect( + "tile_reached", self, "_on_tile_reached") + AnimationHandler.connect( + "frame_pushed", self, "_on_frame_pushed") + + +func _physics_process(_delta): + _check_input() + + if !AnimationHandler.is_in_walk_animation(): + if not _get_axis_input_vector() == Vector2.ZERO: + InteractableAntenna.position = _get_axis_input_vector() * STEP * 2.0 + _move_player() + + if input_interact: + if AnimationHandler.is_in_walk_animation(): + yield(AnimationHandler, "tile_reached") + for i in InteractableAntenna.get_overlapping_areas(): + i.trigger() + for i in InteractableAntenna.get_overlapping_bodies(): + i.trigger() + _await_interaction = false + + +# Sets local axis input variables. +func _check_input(): + if not RPGH.Player._player_movement_disabled: + # Handle input_x_axis + if (Input.is_action_pressed("ingame_left") || Input.is_action_pressed("ingame_right")): + if (Input.is_action_just_pressed("ingame_left")): input_x_axis = Direction.LEFT + if (Input.is_action_just_pressed("ingame_right")): input_x_axis = Direction.RIGHT + else: input_x_axis = Direction.NONE + if (Input.is_action_just_released("ingame_left") && Input.is_action_pressed("ingame_right")): input_x_axis = Direction.RIGHT + if (Input.is_action_just_released("ingame_right") && Input.is_action_pressed("ingame_left")): input_x_axis = Direction.LEFT + # Handle input_y_axis + if (Input.is_action_pressed("ingame_up") || Input.is_action_pressed("ingame_down")): + if (Input.is_action_just_pressed("ingame_up")): input_y_axis = Direction.UP + if (Input.is_action_just_pressed("ingame_down")): input_y_axis = Direction.DOWN + else: input_y_axis = Direction.NONE + if (Input.is_action_just_released("ingame_up") && Input.is_action_pressed("ingame_down")): input_y_axis = Direction.DOWN + if (Input.is_action_just_released("ingame_down") && Input.is_action_pressed("ingame_up")): input_y_axis = Direction.UP + else: + input_x_axis = Direction.NONE + input_y_axis = Direction.NONE + if not RPGH.Player._player_interact_disabled: + input_interact = Input.is_action_just_pressed("ingame_interact") + else: + input_interact = false + + +func _move_player() -> bool: + var was_player_moved = not (input_x_axis == 0.0 and input_y_axis == 0.0) + if was_player_moved: + was_player_moved = move(_get_axis_input_vector()) + return was_player_moved + + +func _get_axis_input_vector() -> Vector2: + return Vector2(input_x_axis, input_y_axis) + + +func _on_texture_position_updated(new_position): + self.Texture.position = new_position + + +func _on_tile_reached(): + if !_move_player(): + AnimationHandler.stop_walk_animation() + + +func _on_frame_pushed(frame_coords): + self.Texture.frame_coords = frame_coords diff --git a/ingame/player/player.tscn b/ingame/player/player.tscn new file mode 100644 index 0000000..719788f --- /dev/null +++ b/ingame/player/player.tscn @@ -0,0 +1,18 @@ +[gd_scene load_steps=4 format=2] + +[ext_resource path="res://addons/rpgh_engine/ingame/humanoid/humanoid.tscn" type="PackedScene" id=1] +[ext_resource path="res://addons/rpgh_engine/ingame/player/player.gd" type="Script" id=2] + +[sub_resource type="RectangleShape2D" id=1] + +[node name="Player" instance=ExtResource( 1 )] +script = ExtResource( 2 ) + +[node name="InteractableAntenna" type="Area2D" parent="Body" index="1"] +monitorable = false +collision_layer = 0 +collision_mask = 4 + +[node name="Collision" type="CollisionShape2D" parent="Body/InteractableAntenna" index="0"] +position = Vector2( 12, 12 ) +shape = SubResource( 1 ) diff --git a/nodes/event/event.gd b/nodes/event/event.gd new file mode 100644 index 0000000..cac7e24 --- /dev/null +++ b/nodes/event/event.gd @@ -0,0 +1,113 @@ +class_name RPGH_Event, "res://addons/rpgh_engine/nodes/event/icon_event.svg" +extends Node +# This is the main class for interacting with the RPGH Engine's +# core system. Adds behaviour to the game. + +signal triggered + +export(bool) var auto_start = false +export(bool) var block_player = true + +var map: RPGH_Map = RPGH.get_node("DataManager").current_map +var state setget _set_state, _get_state + +var _state := Storable("State") +var _is_first_run := Storable("IsFirstRun", true) + + +func _ready(): + if auto_start: + _run() + + +func is_first_run() -> bool: + return _is_first_run.value + + +# This function currently simply plays the event without further +# preparations or clean up. So that the event can be called +# within another one. +# +# TODO: automate this somehow please :pray: +func append(): + var filtered_state_value = "default" if _state.value == null else _state.value + var func_state = call(filtered_state_value) + if func_state is GDScriptFunctionState: + yield(func_state, "completed") + _is_first_run.value = false + + +# --- INGAME_CAMERA ----------------------------------------------------------- + + +func set_camera_setup(camera_setup): + RPGH.Camera.set_camera_setup(camera_setup) + + +func fade_over_camera_setup(camera_setup, duration, smooth = false): + RPGH.Camera.fade_over_camera_setup(camera_setup, duration, smooth) + + +func CameraSetup(): + return RPGH.Camera.CameraSetup.new() + + +# --- UI_DIALOG --------------------------------------------------------------- + + +func textbox(id: String, left_bust: Texture = null, right_bust: Texture = null): + RPGH.Dialog.textbox(id, left_bust, right_bust) + + +func screen_text(id: String): + RPGH.Dialog.screen_text(id) + + +func close_textbox(): + var func_state = RPGH.Dialog.close_textbox() + if func_state is GDScriptFunctionState: + yield(func_state, "completed") + if !block_player: + _enable_character_movement() + + +# ----------------------------------------------------------------------------- + +func _run(): + emit_signal("triggered") + if block_player: + RPGH.Player._player_movement_disabled = true + RPGH.Player._player_interact_disabled = true + var filtered_state_value = "default" if _state.value == null else _state.value + var func_state = call(filtered_state_value) + if func_state is GDScriptFunctionState: + yield(func_state, "completed") + close_textbox() + _is_first_run.value = false + _enable_character_movement() + + +func _enable_character_movement(): + RPGH.Player._player_movement_disabled = false + yield(RPGH.get_tree(), "physics_frame") + yield(RPGH.get_tree(), "physics_frame") + RPGH.Player._player_interact_disabled = false + + +func _set_state(new_state): + if !new_state is String: + push_error("State can only be set to string.") + return + _state.value = new_state + + +func _get_state(): + return _state.value + + +# Just a fast wrapper for "storable.gd". +class RPGH_Storable: + extends "res://addons/rpgh_engine/data_management/storable.gd" + func _init(key: String, value = null, map = null, event = null).(key, value, map, event): pass +func Storable(key: String, value = null) -> RPGH_Storable: + return RPGH_Storable.new(name + key, value, map, self) diff --git a/nodes/event/icon_event.svg b/nodes/event/icon_event.svg new file mode 100644 index 0000000..0f8b0dd --- /dev/null +++ b/nodes/event/icon_event.svg @@ -0,0 +1 @@ + diff --git a/nodes/event/icon_event.svg.import b/nodes/event/icon_event.svg.import new file mode 100644 index 0000000..988a857 --- /dev/null +++ b/nodes/event/icon_event.svg.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/icon_event.svg-5b91700846557ab2e64806fd3a2f8e31.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/rpgh_engine/nodes/event/icon_event.svg" +dest_files=[ "res://.import/icon_event.svg-5b91700846557ab2e64806fd3a2f8e31.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=false +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +stream=false +size_limit=0 +detect_3d=false +svg/scale=1.0 diff --git a/nodes/map/icon_map.svg b/nodes/map/icon_map.svg new file mode 100644 index 0000000..9286b06 --- /dev/null +++ b/nodes/map/icon_map.svg @@ -0,0 +1 @@ + diff --git a/nodes/map/icon_map.svg.import b/nodes/map/icon_map.svg.import new file mode 100644 index 0000000..f94401b --- /dev/null +++ b/nodes/map/icon_map.svg.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/icon_map.svg-43ff95cf50e4e38847d7dade7944c61f.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/rpgh_engine/nodes/map/icon_map.svg" +dest_files=[ "res://.import/icon_map.svg-43ff95cf50e4e38847d7dade7944c61f.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=false +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +stream=false +size_limit=0 +detect_3d=false +svg/scale=1.0 diff --git a/nodes/map/map.gd b/nodes/map/map.gd new file mode 100644 index 0000000..97f15a4 --- /dev/null +++ b/nodes/map/map.gd @@ -0,0 +1,52 @@ +tool +class_name RPGH_Map, "res://addons/rpgh_engine/nodes/map/icon_map.svg" +extends YSort + +export(Texture) var top_layer: Texture setget _set_top_layer +export(Texture) var bottom_layer: Texture setget _set_bottom_layer + + +func _init(): + if !Engine.editor_hint: + RPGH.get_node("DataManager").current_map = self + + +func _ready(): + if !Engine.editor_hint: + var top_layer_sprite = Sprite.new() + top_layer_sprite.name = "\\TopLayer" + top_layer_sprite.texture = top_layer + top_layer_sprite.centered = false + top_layer_sprite.z_index = 1 + add_child(top_layer_sprite) + + var bottom_layer_sprite = Sprite.new() + bottom_layer_sprite.name = "\\BottomLayer" + bottom_layer_sprite.texture = bottom_layer + bottom_layer_sprite.centered = false + bottom_layer_sprite.z_index = -1 + add_child(bottom_layer_sprite) + + +func _draw(): + if Engine.editor_hint: + draw_texture(bottom_layer, Vector2()) + draw_texture(top_layer, Vector2()) + + +func _set_top_layer(new_top_layer): + top_layer = new_top_layer + update() + + +func _set_bottom_layer(new_bottom_layer): + bottom_layer = new_bottom_layer + update() + + +# Just a fast wrapper for "storable.gd". +class RPGH_Storable: + extends "res://addons/rpgh_engine/data_management/storable.gd" + func _init(key: String, value = null, map = null, event = null).(key, value, map, event): pass +func Storable(key: String, value = null) -> RPGH_Storable: + return RPGH_Storable.new(key, value, self) diff --git a/nodes/map/map.tscn b/nodes/map/map.tscn new file mode 100644 index 0000000..7e9fc03 --- /dev/null +++ b/nodes/map/map.tscn @@ -0,0 +1,6 @@ +[gd_scene load_steps=2 format=2] + +[ext_resource path="res://addons/rpgh_engine/nodes/map/map.gd" type="Script" id=1] + +[node name="Map" type="YSort"] +script = ExtResource( 1 ) diff --git a/nodes/spawn_marker/spawn_marker.gd b/nodes/spawn_marker/spawn_marker.gd new file mode 100644 index 0000000..7a8785f --- /dev/null +++ b/nodes/spawn_marker/spawn_marker.gd @@ -0,0 +1,19 @@ +tool +extends Node2D + +var _TEXTURE + + +func _init(): + if Engine.editor_hint: + _TEXTURE = load("res://addons/rpgh_engine/nodes/spawn_marker/spawn_marker.png") + + +func _ready(): + if !Engine.editor_hint: + RPGH.Player.spawn(position) + + +func _draw(): + if Engine.editor_hint: + draw_texture(_TEXTURE, Vector2(0.0, -12.0)) diff --git a/nodes/spawn_marker/spawn_marker.png b/nodes/spawn_marker/spawn_marker.png new file mode 100644 index 0000000000000000000000000000000000000000..6c2164d50d1150e7d37acc543c36cac6fab23f5d GIT binary patch literal 11257 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 diff --git a/nodes/trigger/icon_trigger.svg.import b/nodes/trigger/icon_trigger.svg.import new file mode 100644 index 0000000..8c05f90 --- /dev/null +++ b/nodes/trigger/icon_trigger.svg.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/icon_trigger.svg-f9c620bf9d15462f19689f0412c9b2e4.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/rpgh_engine/nodes/trigger/icon_trigger.svg" +dest_files=[ "res://.import/icon_trigger.svg-f9c620bf9d15462f19689f0412c9b2e4.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=false +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +stream=false +size_limit=0 +detect_3d=false +svg/scale=1.0 diff --git a/nodes/trigger/passable_trigger.tscn b/nodes/trigger/passable_trigger.tscn new file mode 100644 index 0000000..cecbb1d --- /dev/null +++ b/nodes/trigger/passable_trigger.tscn @@ -0,0 +1,8 @@ +[gd_scene load_steps=2 format=2] + +[ext_resource path="res://addons/rpgh_engine/nodes/trigger/trigger_collision_object.gd" type="Script" id=1] + +[node name="PassableTrigger" type="Area2D"] +collision_layer = 4 +collision_mask = 0 +script = ExtResource( 1 ) diff --git a/nodes/trigger/solid_trigger.tscn b/nodes/trigger/solid_trigger.tscn new file mode 100644 index 0000000..9d794c8 --- /dev/null +++ b/nodes/trigger/solid_trigger.tscn @@ -0,0 +1,8 @@ +[gd_scene load_steps=2 format=2] + +[ext_resource path="res://addons/rpgh_engine/Nodes/Trigger/trigger_collision_object.gd" type="Script" id=1] + +[node name="SolidTrigger" type="KinematicBody2D"] +collision_layer = 4 +collision_mask = 0 +script = ExtResource( 1 ) diff --git a/nodes/trigger/trigger.gd b/nodes/trigger/trigger.gd new file mode 100644 index 0000000..677524b --- /dev/null +++ b/nodes/trigger/trigger.gd @@ -0,0 +1,31 @@ +class_name RPGH_Trigger, "res://addons/rpgh_engine/nodes/trigger/icon_trigger.svg" +extends Node + +enum TriggerType { + ON_INTERACT, + ON_TOUCH, +} + +export(NodePath) var event = @".." +# Both not functioning yet! +export(TriggerType) var trigger_type = TriggerType.ON_INTERACT +export(bool) var is_passable = false + + +onready var passable_trigger = preload("res://addons/rpgh_engine/nodes/trigger/passable_trigger.tscn") +onready var solid_trigger = preload("res://addons/rpgh_engine/nodes/trigger/solid_trigger.tscn") + + +func _ready(): + var collision_object: CollisionObject2D + + if is_passable: + collision_object = passable_trigger.instance() + else: + collision_object = solid_trigger.instance() + collision_object.set_collision_layer_bit(1, true) + + collision_object.name = name + collision_object.event = get_node(event) + + call_deferred("replace_by", collision_object, true) diff --git a/nodes/trigger/trigger.tscn b/nodes/trigger/trigger.tscn new file mode 100644 index 0000000..9ddeaf9 --- /dev/null +++ b/nodes/trigger/trigger.tscn @@ -0,0 +1,6 @@ +[gd_scene load_steps=2 format=2] + +[ext_resource path="res://addons/rpgh_engine/nodes/trigger/trigger.gd" type="Script" id=1] + +[node name="Trigger" type="Node2D"] +script = ExtResource( 1 ) diff --git a/nodes/trigger/trigger_collision_object.gd b/nodes/trigger/trigger_collision_object.gd new file mode 100644 index 0000000..410aecf --- /dev/null +++ b/nodes/trigger/trigger_collision_object.gd @@ -0,0 +1,7 @@ +extends Node2D + +var event + + +func trigger(): + event._run() diff --git a/plugin.cfg b/plugin.cfg new file mode 100644 index 0000000..cb38be3 --- /dev/null +++ b/plugin.cfg @@ -0,0 +1,7 @@ +[plugin] + +name = "RPGH Engine" +description = "A framework for rpg horror like games." +author = "Leon Rauschenberg" +version = "0.0.1" +script = "plugin.gd" \ No newline at end of file diff --git a/rpgh_engine.tscn b/rpgh_engine.tscn new file mode 100644 index 0000000..cba4f37 --- /dev/null +++ b/rpgh_engine.tscn @@ -0,0 +1,505 @@ +[gd_scene load_steps=22 format=2] + +[ext_resource path="res://addons/rpgh_engine/data_management/data_manager.gd" type="Script" id=1] +[ext_resource path="res://addons/rpgh_engine/system/rpgh_engine.gd" type="Script" id=2] +[ext_resource path="res://addons/rpgh_engine/ingame/camera/ingame_display.material" type="Material" id=3] +[ext_resource path="res://addons/rpgh_engine/ingame/player/player.tscn" type="PackedScene" id=4] +[ext_resource path="res://addons/rpgh_engine/ui/textbox.gd" type="Script" id=5] +[ext_resource path="res://addons/rpgh_engine/ingame/camera/camera.gd" type="Script" id=6] +[ext_resource path="res://game/maps/hobby_room_corrupted/ako_shocked.png" type="Texture" id=7] +[ext_resource path="res://addons/rpgh_engine/ui/dialog.gd" type="Script" id=8] +[ext_resource path="res://addons/rpgh_engine/ui/pause.gd" type="Script" id=9] + +[sub_resource type="ViewportTexture" id=1] +flags = 4 +viewport_path = NodePath("Ingame/Viewport") + +[sub_resource type="Animation" id=2] +resource_name = "DespawnBust" +length = 0.2 +tracks/0/type = "value" +tracks/0/path = NodePath(".:rect_position") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/keys = { +"times": PoolRealArray( 0, 0.2 ), +"transitions": PoolRealArray( 1, 1 ), +"update": 0, +"values": [ Vector2( -50, 0 ), Vector2( -511.111, 0 ) ] +} + +[sub_resource type="Animation" id=3] +resource_name = "SpawnBust" +length = 0.2 +tracks/0/type = "value" +tracks/0/path = NodePath(".:rect_position") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/keys = { +"times": PoolRealArray( 0, 0.2 ), +"transitions": PoolRealArray( 1, 1 ), +"update": 0, +"values": [ Vector2( -511.111, 0 ), Vector2( -50, 0 ) ] +} + +[sub_resource type="Animation" id=4] +length = 0.2 +tracks/0/type = "value" +tracks/0/path = NodePath(".:rect_position") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/keys = { +"times": PoolRealArray( 0, 0.2 ), +"transitions": PoolRealArray( 1, 1 ), +"update": 0, +"values": [ Vector2( 472, 0 ), Vector2( 936, 0 ) ] +} + +[sub_resource type="Animation" id=5] +length = 0.2 +tracks/0/type = "value" +tracks/0/path = NodePath(".:rect_position") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/keys = { +"times": PoolRealArray( 0, 0.2 ), +"transitions": PoolRealArray( 1, 1 ), +"update": 0, +"values": [ Vector2( 936, 0 ), Vector2( 472, 0 ) ] +} + +[sub_resource type="DynamicFontData" id=6] +font_path = "res://addons/rpgh_engine/assets/fonts/brass_mono.otf" + +[sub_resource type="DynamicFont" id=7] +size = 36 +font_data = SubResource( 6 ) + +[sub_resource type="Animation" id=8] +tracks/0/type = "value" +tracks/0/path = NodePath("../../Ingame/Viewport/CanvasModulate:color") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/keys = { +"times": PoolRealArray( 0, 1 ), +"transitions": PoolRealArray( 1, 1 ), +"update": 0, +"values": [ Color( 0.254902, 0.254902, 0.254902, 1 ), Color( 1, 1, 1, 1 ) ] +} + +[sub_resource type="Animation" id=9] +length = 0.2 +tracks/0/type = "value" +tracks/0/path = NodePath("TextboxBackground:polygon") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/keys = { +"times": PoolRealArray( 0, 0.2 ), +"transitions": PoolRealArray( 1, 1 ), +"update": 0, +"values": [ PoolVector2Array( 0, 440, 0, 600, 1024, 600, 1024, 408 ), PoolVector2Array( 0, 712, 0, 600, 1024, 936, 1024, 1200 ) ] +} +tracks/1/type = "value" +tracks/1/path = NodePath("Textbox:percent_visible") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/keys = { +"times": PoolRealArray( 0 ), +"transitions": PoolRealArray( 1 ), +"update": 0, +"values": [ 0.0 ] +} + +[sub_resource type="Animation" id=10] +tracks/0/type = "value" +tracks/0/path = NodePath("Textbox:grow_vertical") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/keys = { +"times": PoolRealArray( 0 ), +"transitions": PoolRealArray( 1 ), +"update": 1, +"values": [ 2 ] +} +tracks/1/type = "value" +tracks/1/path = NodePath("Textbox:fit_content_height") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/keys = { +"times": PoolRealArray( 0 ), +"transitions": PoolRealArray( 1 ), +"update": 1, +"values": [ true ] +} +tracks/2/type = "value" +tracks/2/path = NodePath("Textbox:margin_top") +tracks/2/interp = 1 +tracks/2/loop_wrap = true +tracks/2/imported = false +tracks/2/enabled = true +tracks/2/keys = { +"times": PoolRealArray( 0 ), +"transitions": PoolRealArray( 1 ), +"update": 1, +"values": [ 0.0 ] +} +tracks/3/type = "value" +tracks/3/path = NodePath("Textbox:margin_bottom") +tracks/3/interp = 1 +tracks/3/loop_wrap = true +tracks/3/imported = false +tracks/3/enabled = true +tracks/3/keys = { +"times": PoolRealArray( 0 ), +"transitions": PoolRealArray( 1 ), +"update": 1, +"values": [ 0.0 ] +} +tracks/4/type = "value" +tracks/4/path = NodePath("Textbox:anchor_top") +tracks/4/interp = 1 +tracks/4/loop_wrap = true +tracks/4/imported = false +tracks/4/enabled = true +tracks/4/keys = { +"times": PoolRealArray( 0 ), +"transitions": PoolRealArray( 1 ), +"update": 0, +"values": [ 0.5 ] +} +tracks/5/type = "value" +tracks/5/path = NodePath("Textbox:anchor_bottom") +tracks/5/interp = 1 +tracks/5/loop_wrap = true +tracks/5/imported = false +tracks/5/enabled = true +tracks/5/keys = { +"times": PoolRealArray( 0 ), +"transitions": PoolRealArray( 1 ), +"update": 0, +"values": [ 0.5 ] +} +tracks/6/type = "value" +tracks/6/path = NodePath("../../Ingame/Viewport/CanvasModulate:color") +tracks/6/interp = 1 +tracks/6/loop_wrap = true +tracks/6/imported = false +tracks/6/enabled = true +tracks/6/keys = { +"times": PoolRealArray( 0, 1 ), +"transitions": PoolRealArray( 1, 1 ), +"update": 0, +"values": [ Color( 1, 1, 1, 1 ), Color( 0.254902, 0.254902, 0.254902, 1 ) ] +} + +[sub_resource type="Animation" id=11] +length = 0.2 +tracks/0/type = "value" +tracks/0/path = NodePath("TextboxBackground:polygon") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/keys = { +"times": PoolRealArray( 0, 0.2 ), +"transitions": PoolRealArray( 1, 1 ), +"update": 0, +"values": [ PoolVector2Array( 0, 712, 0, 600, 1024, 936, 1024, 1200 ), PoolVector2Array( 0, 440, 0, 600, 1024, 600, 1024, 408 ) ] +} +tracks/1/type = "value" +tracks/1/path = NodePath("Textbox:anchor_top") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/keys = { +"times": PoolRealArray( 0 ), +"transitions": PoolRealArray( 1 ), +"update": 0, +"values": [ 1.0 ] +} +tracks/2/type = "value" +tracks/2/path = NodePath("Textbox:anchor_bottom") +tracks/2/interp = 1 +tracks/2/loop_wrap = true +tracks/2/imported = false +tracks/2/enabled = true +tracks/2/keys = { +"times": PoolRealArray( 0 ), +"transitions": PoolRealArray( 1 ), +"update": 0, +"values": [ 1.0 ] +} +tracks/3/type = "value" +tracks/3/path = NodePath("Textbox:margin_top") +tracks/3/interp = 1 +tracks/3/loop_wrap = true +tracks/3/imported = false +tracks/3/enabled = true +tracks/3/keys = { +"times": PoolRealArray( 0 ), +"transitions": PoolRealArray( 1 ), +"update": 1, +"values": [ -144.0 ] +} +tracks/4/type = "value" +tracks/4/path = NodePath("Textbox:margin_bottom") +tracks/4/interp = 1 +tracks/4/loop_wrap = true +tracks/4/imported = false +tracks/4/enabled = true +tracks/4/keys = { +"times": PoolRealArray( 0 ), +"transitions": PoolRealArray( 1 ), +"update": 1, +"values": [ -16.0 ] +} + +[sub_resource type="Animation" id=12] +length = 0.64 +step = 0.01 +tracks/0/type = "value" +tracks/0/path = NodePath("TextureRect:anchor_top") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/keys = { +"times": PoolRealArray( 0, 0.1, 0.55, 0.64 ), +"transitions": PoolRealArray( 1, 1, 1, 1 ), +"update": 0, +"values": [ 0.5, 0.0, 0.0, 0.5 ] +} +tracks/1/type = "value" +tracks/1/path = NodePath("TextureRect:anchor_bottom") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/keys = { +"times": PoolRealArray( 0, 0.1, 0.55, 0.64 ), +"transitions": PoolRealArray( 1, 1, 1, 1 ), +"update": 0, +"values": [ 0.5, 1.0, 1.0, 0.5 ] +} +tracks/2/type = "value" +tracks/2/path = NodePath("TextureRect:rect_position") +tracks/2/interp = 2 +tracks/2/loop_wrap = true +tracks/2/imported = false +tracks/2/enabled = true +tracks/2/keys = { +"times": PoolRealArray( 0.1, 0.15, 0.21, 0.26, 0.31, 0.36, 0.41, 0.46, 0.5, 0.52 ), +"transitions": PoolRealArray( 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 ), +"update": 0, +"values": [ Vector2( 0, 0 ), Vector2( -24, 8 ), Vector2( 8, -16 ), Vector2( 32, 16 ), Vector2( -16, -8 ), Vector2( -8, 16 ), Vector2( 16, -24 ), Vector2( -8, 8 ), Vector2( 8, 0 ), Vector2( 0, 0 ) ] +} +tracks/3/type = "value" +tracks/3/path = NodePath("TextureRect:margin_top") +tracks/3/interp = 1 +tracks/3/loop_wrap = true +tracks/3/imported = false +tracks/3/enabled = true +tracks/3/keys = { +"times": PoolRealArray( 0.54 ), +"transitions": PoolRealArray( 1 ), +"update": 1, +"values": [ 0.0 ] +} +tracks/4/type = "value" +tracks/4/path = NodePath("TextureRect:margin_bottom") +tracks/4/interp = 1 +tracks/4/loop_wrap = true +tracks/4/imported = false +tracks/4/enabled = true +tracks/4/keys = { +"times": PoolRealArray( 0.54 ), +"transitions": PoolRealArray( 1 ), +"update": 1, +"values": [ 6.10352e-05 ] +} + +[node name="RPGH Engine" type="Node"] +script = ExtResource( 2 ) + +[node name="DataManager" type="Node" parent="."] +script = ExtResource( 1 ) + +[node name="Ingame" type="Node" parent="."] + +[node name="Viewport" type="Viewport" parent="Ingame"] +size = Vector2( 640, 360 ) +render_target_v_flip = true + +[node name="CanvasModulate" type="CanvasModulate" parent="Ingame/Viewport"] +position = Vector2( 16, 456 ) +z_index = -1 + +[node name="MapContainer" type="YSort" parent="Ingame/Viewport"] +__meta__ = { +"_editor_description_": "Test" +} + +[node name="Player" parent="Ingame/Viewport/MapContainer" instance=ExtResource( 4 )] + +[node name="Camera" type="Camera2D" parent="Ingame/Viewport/MapContainer"] +current = true +script = ExtResource( 6 ) + +[node name="Display" type="TextureRect" parent="Ingame"] +material = ExtResource( 3 ) +anchor_right = 1.0 +anchor_bottom = 1.0 +margin_right = -0.00012207 +rect_pivot_offset = Vector2( 512, 300 ) +texture = SubResource( 1 ) +expand = true +__meta__ = { +"_edit_use_anchors_": false, +"_editor_description_": "" +} + +[node name="UI" type="Node" parent="."] + +[node name="Dialog" type="Control" parent="UI"] +anchor_right = 1.0 +anchor_bottom = 1.0 +script = ExtResource( 8 ) +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="LeftBust" type="TextureRect" parent="UI/Dialog"] +margin_left = 286.0 +margin_right = 886.0 +margin_bottom = 600.0 +expand = true +stretch_mode = 1 +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="AnimationPlayer" type="AnimationPlayer" parent="UI/Dialog/LeftBust"] +anims/DespawnBust = SubResource( 2 ) +anims/SpawnBust = SubResource( 3 ) + +[node name="RightBust" type="TextureRect" parent="UI/Dialog"] +margin_left = 472.0 +margin_right = 1072.0 +margin_bottom = 600.0 +expand = true +stretch_mode = 1 +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="AnimationPlayer" type="AnimationPlayer" parent="UI/Dialog/RightBust"] +anims/DespawnBust = SubResource( 4 ) +anims/SpawnBust = SubResource( 5 ) + +[node name="TextboxBackground" type="Polygon2D" parent="UI/Dialog"] +color = Color( 0.0627451, 0.0588235, 0.0627451, 0.721569 ) +antialiased = true +polygon = PoolVector2Array( 0, 712, 0, 600, 1024, 936, 1024, 1200 ) + +[node name="Textbox" type="RichTextLabel" parent="UI/Dialog"] +anchor_top = 0.5 +anchor_right = 1.0 +anchor_bottom = 0.5 +margin_left = 16.0 +margin_right = -16.0 +grow_vertical = 2 +custom_fonts/normal_font = SubResource( 7 ) +bbcode_enabled = true +visible_characters = 0 +percent_visible = 0.0 +fit_content_height = true +scroll_active = false +script = ExtResource( 5 ) +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="AnimationPlayer" type="AnimationPlayer" parent="UI/Dialog"] +pause_mode = 2 +anims/DespawnScreenText = SubResource( 8 ) +anims/DespawnTextbox = SubResource( 9 ) +anims/SpawnScreenText = SubResource( 10 ) +anims/SpawnTextbox = SubResource( 11 ) + +[node name="Insertion" type="Control" parent="UI"] +anchor_right = 1.0 +anchor_bottom = 1.0 +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="TextureRect" type="TextureRect" parent="UI/Insertion"] +anchor_top = 0.5 +anchor_right = 1.0 +anchor_bottom = 0.5 +margin_right = -0.000732422 +margin_bottom = 6.10352e-05 +texture = ExtResource( 7 ) +expand = true +stretch_mode = 1 +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="AnimationPlayer" type="AnimationPlayer" parent="UI/Insertion"] +anims/FadeInInsertion = SubResource( 12 ) + +[node name="Button" type="Button" parent="UI"] +margin_left = 10.3942 +margin_top = 11.3813 +margin_right = 144.394 +margin_bottom = 31.3813 +text = "Save" +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="Pause" type="Popup" parent="UI"] +pause_mode = 2 +margin_right = 40.0 +margin_bottom = 40.0 +script = ExtResource( 9 ) +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="Label" type="Label" parent="UI/Pause"] +margin_right = 40.0 +margin_bottom = 14.0 + +[node name="Unpause" type="Button" parent="UI/Pause"] +margin_left = 111.702 +margin_top = 218.0 +margin_right = 327.702 +margin_bottom = 238.0 +text = "Resume" +__meta__ = { +"_edit_use_anchors_": false +} + +[connection signal="button_down" from="UI/Button" to="DataManager" method="_on_Button_button_down"] +[connection signal="button_down" from="UI/Pause/Unpause" to="UI/Pause" method="_pause_manager"] diff --git a/system/init.gd b/system/init.gd new file mode 100644 index 0000000..a16054c --- /dev/null +++ b/system/init.gd @@ -0,0 +1,6 @@ +extends Node + +export(String, FILE, "*.tscn") var initial_map + +func _ready(): + RPGH.map = initial_map diff --git a/system/init.tscn b/system/init.tscn new file mode 100644 index 0000000..6161fe5 --- /dev/null +++ b/system/init.tscn @@ -0,0 +1,8 @@ +[gd_scene load_steps=4 format=2] + +[ext_resource path="res://addons/rpgh_engine/system/init.gd" type="Script" id=1] + + + +[node name="Init" type="Node"] +script = ExtResource( 1 ) diff --git a/system/rpgh_engine.gd b/system/rpgh_engine.gd new file mode 100644 index 0000000..198adde --- /dev/null +++ b/system/rpgh_engine.gd @@ -0,0 +1,40 @@ +extends Node + +const DEFAULT_SCREEN_SIZE = Vector2(640, 360) + +var map = null setget set_map +var global_data := {} + +onready var DataManager = get_node("DataManager") +onready var MapContainer = get_node("Ingame/Viewport/MapContainer") +onready var Player = get_node("Ingame/Viewport/MapContainer/Player") +onready var Camera = get_node("Ingame/Viewport/MapContainer/Camera") +onready var Dialog = get_node("UI/Dialog") + +func set_map(value): + if !value == null: + if !map == null: + map.queue_free() + yield(map, "tree_exited") + var instanced_map = _map_to_node(value) + if instanced_map != null: + MapContainer.add_child(instanced_map) + map = instanced_map + print("Map set!") + else: + if !map == null: + map.queue_free() + + +# Pass either a String, a PackedScene or a Node +# directly to certainly get a Node +func _map_to_node(node_information) -> Node: + if node_information is String: + return load(node_information).instance() + elif node_information is PackedScene: + return node_information.instance() + elif node_information is Node: + return node_information + else: + push_error("No supported format was passed for the map!") + return null diff --git a/ui/bust.material b/ui/bust.material new file mode 100644 index 0000000000000000000000000000000000000000..76e7070e24daa36cd2bf6f806be09ad291b0f5fc GIT binary patch literal 583 zcmV-N0=WHBQ$s@n000005C8zJ1ONap0ssIgwJ-f(tphC)0M;2*G(c(F9K$dS!!QiP zus9yCwUoBqz!z-`?S1-=6#+$7MP2+LU5z)}vrbaEetMMCsI?)gDL(*407n2c^3-_Y zMDU&>zxsdSb!UVYHc7iuZy|mE2YjWQ2EKD&ZM2)@9+lcYrf6OMpWy$x&+3$Cs(D?Bsue{{Y@9 zMPs!*DQI1(iUprEcC6EJJJPY6nngzrivnXBJy%AKAqFF@)_Rx&2VQBCu0G78X<&{= z^Jr`|9k-s5!XS*bqY}gdhCH=V8ED4^gTq}^i~L>%;9adG++&G^Hwu1Tcy2tmX6|E(P- ziW8FT7E)EoaO`xhoxF{x^^QQoY9Veyi>eta#XFx0A5nd=d0MgKoO1|hQeF^oe(UFw zaNq^%#+3i8?B&%4wvYcgy*8vbg&~1;5JTa>CXCz~6{e6lXy}sqqTQ2I3jqSbudt0F zvV#$NOy9sOLeMl3rdBKv?R+g3iBY#rBu*PjK*|q}PD~QVoGmN>6bbx44R<#-bge+; V9HEf`QhxqguKq41Kp0X}LqnD50D%Ai literal 0 HcmV?d00001 diff --git a/ui/bust_transition.png b/ui/bust_transition.png new file mode 100644 index 0000000000000000000000000000000000000000..bf112af80da53bb85d4e810496d6bbd028b077cd GIT binary patch literal 18520 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 total_character_count: + visible_characters = -1 + _in_show_characters_animation = false + + +func _input(event): + if event.is_action_pressed("ui_accept"): + if _in_show_characters_animation: # accelerate show characters animation. + _seconds_per_character = 1.0 / ACCELERATED_CHARACTERS_PER_SECOND + else: + emit_signal("accepted") + + +func start_show_characters_animation(): + _in_show_characters_animation = true + _seconds_per_character = 1.0 / CHARACTERS_PER_SECOND + _add_character_timer = 0.0 + visible_characters = 0