diff --git a/InteractableArea.gd.uid b/InteractableArea.gd.uid deleted file mode 100644 index ea0fb31..0000000 --- a/InteractableArea.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://b00rxpveu3v4m diff --git a/MapChangeInteract.gd.uid b/MapChangeInteract.gd.uid deleted file mode 100644 index d943996..0000000 --- a/MapChangeInteract.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://cpqmjomfpyifw diff --git a/InteractableArea.gd b/_archive/InteractableArea.gd similarity index 100% rename from InteractableArea.gd rename to _archive/InteractableArea.gd diff --git a/_archive/InteractableArea.gd.uid b/_archive/InteractableArea.gd.uid new file mode 100644 index 0000000..207a383 --- /dev/null +++ b/_archive/InteractableArea.gd.uid @@ -0,0 +1 @@ +uid://cql02fqctrd4r diff --git a/MapChangeInteract.gd b/_archive/MapChangeInteract.gd similarity index 100% rename from MapChangeInteract.gd rename to _archive/MapChangeInteract.gd diff --git a/_archive/MapChangeInteract.gd.uid b/_archive/MapChangeInteract.gd.uid new file mode 100644 index 0000000..5a0a13d --- /dev/null +++ b/_archive/MapChangeInteract.gd.uid @@ -0,0 +1 @@ +uid://dgev713uv0kdk diff --git a/MapChangeInteract.tscn b/_archive/MapChangeInteract.tscn similarity index 100% rename from MapChangeInteract.tscn rename to _archive/MapChangeInteract.tscn diff --git a/cutscene/Cutscene.gd b/_archive/cutscene/Cutscene.gd similarity index 100% rename from cutscene/Cutscene.gd rename to _archive/cutscene/Cutscene.gd diff --git a/cutscene/Cutscene.gd.uid b/_archive/cutscene/Cutscene.gd.uid similarity index 100% rename from cutscene/Cutscene.gd.uid rename to _archive/cutscene/Cutscene.gd.uid diff --git a/cutscene/item/CutsceneItem.gd b/_archive/cutscene/item/CutsceneItem.gd similarity index 100% rename from cutscene/item/CutsceneItem.gd rename to _archive/cutscene/item/CutsceneItem.gd diff --git a/cutscene/item/CutsceneItem.gd.uid b/_archive/cutscene/item/CutsceneItem.gd.uid similarity index 100% rename from cutscene/item/CutsceneItem.gd.uid rename to _archive/cutscene/item/CutsceneItem.gd.uid diff --git a/cutscene/item/CutsceneText.gd b/_archive/cutscene/item/CutsceneText.gd similarity index 100% rename from cutscene/item/CutsceneText.gd rename to _archive/cutscene/item/CutsceneText.gd diff --git a/cutscene/item/CutsceneText.gd.uid b/_archive/cutscene/item/CutsceneText.gd.uid similarity index 100% rename from cutscene/item/CutsceneText.gd.uid rename to _archive/cutscene/item/CutsceneText.gd.uid diff --git a/_archive/entity/EntityMovement.gd b/_archive/entity/EntityMovement.gd new file mode 100644 index 0000000..4d098aa --- /dev/null +++ b/_archive/entity/EntityMovement.gd @@ -0,0 +1,85 @@ +# @tool +# class_name EntityMovement extends Node + +# const FRICTION = 0.01 +# const WALK_SPEED_DEFAULT = 8 +# const RUN_SPEED_DEFAULT = 12 + +# var _inputDir:Vector2 = Vector2.ZERO +# var _running:bool = false + +# @export var body:CharacterBody3D +# @export var rotate:Node3D +# @export var walkSpeed:float = WALK_SPEED_DEFAULT +# @export var runSpeed:float = RUN_SPEED_DEFAULT + +# # +# # Private Methods +# # +# func _applyGravity() -> void: +# if !body.is_on_floor(): +# body.velocity += PHYSICS.GRAVITY * get_process_delta_time() + +# func _applyMovement() -> void: +# if !canMove(): +# return + +# var cameraCurrent = get_viewport().get_camera_3d() +# if !cameraCurrent: +# return + +# # Use camera orientation for movement direction +# var camBasis = cameraCurrent.global_transform.basis + +# # Forward and right vectors, ignore vertical component +# var forward = -camBasis.z +# forward.y = 0 +# forward = forward.normalized() +# var right = camBasis.x +# right.y = 0 +# right = right.normalized() + +# var directionAdjusted = ( +# forward * _inputDir.y + right * _inputDir.x +# ).normalized() +# if directionAdjusted.length() <= 0.01: +# return + +# if rotate: +# var targetRot = atan2(directionAdjusted.x, directionAdjusted.z) +# rotate.rotation.y = targetRot + +# var speed = walkSpeed +# if _running: +# speed = runSpeed + +# body.velocity.x = directionAdjusted.x * speed +# body.velocity.z = directionAdjusted.z * speed + +# func _applyFriction(delta:float) -> void: +# body.velocity.x *= delta * FRICTION +# body.velocity.z *= delta * FRICTION + +# # +# # Protected Methods +# # +# func canMove() -> bool: +# return true + +# # +# # Callbacks +# # +# func _enter_tree() -> void: +# pass + +# func _physics_process(delta:float) -> void: +# if Engine.is_editor_hint(): +# return + +# if !body: +# return + +# _applyGravity() +# _applyFriction(delta) +# _applyMovement() +# body.move_and_slide() diff --git a/entity/EntityMovement.gd.uid b/_archive/entity/EntityMovement.gd.uid similarity index 100% rename from entity/EntityMovement.gd.uid rename to _archive/entity/EntityMovement.gd.uid diff --git a/entity/MapCamera.gd.uid b/_archive/entity/MapCamera.gd.uid similarity index 100% rename from entity/MapCamera.gd.uid rename to _archive/entity/MapCamera.gd.uid diff --git a/entity/NPC.gd.uid b/_archive/entity/NPC.gd.uid similarity index 100% rename from entity/NPC.gd.uid rename to _archive/entity/NPC.gd.uid diff --git a/entity/Player.gd.uid b/_archive/entity/Player.gd.uid similarity index 100% rename from entity/Player.gd.uid rename to _archive/entity/Player.gd.uid diff --git a/entity/npc/NPC.gd b/_archive/entity/npc/NPC.gd similarity index 80% rename from entity/npc/NPC.gd rename to _archive/entity/npc/NPC.gd index 83c878e..1339f6d 100644 --- a/entity/npc/NPC.gd +++ b/_archive/entity/npc/NPC.gd @@ -32,3 +32,12 @@ class_name NPC extends CharacterBody3D if _interact: return _interact.interactType return NPCInteract.InteractType.NONE + +@export var interactText:String: + set(value): + if _interact: + _interact.interactText = value + get: + if _interact: + return _interact.interactText + return "" diff --git a/entity/npc/NPC.gd.uid b/_archive/entity/npc/NPC.gd.uid similarity index 100% rename from entity/npc/NPC.gd.uid rename to _archive/entity/npc/NPC.gd.uid diff --git a/entity/npc/NPC.tscn b/_archive/entity/npc/NPC.tscn similarity index 99% rename from entity/npc/NPC.tscn rename to _archive/entity/npc/NPC.tscn index 9f1328e..c6ce9dd 100644 --- a/entity/npc/NPC.tscn +++ b/_archive/entity/npc/NPC.tscn @@ -31,6 +31,7 @@ body = NodePath("../..") [node name="NPCInteract" type="Node" parent="Scripts"] script = ExtResource("3_binvk") +interactText = "" metadata/_custom_type_script = "uid://dunhfgdwp8wjh" [node name="CollisionShape3D" type="CollisionShape3D" parent="."] diff --git a/entity/npc/NPCForwarder.gd.uid b/_archive/entity/npc/NPCForwarder.gd.uid similarity index 100% rename from entity/npc/NPCForwarder.gd.uid rename to _archive/entity/npc/NPCForwarder.gd.uid diff --git a/_archive/entity/npc/NPCInteract.gd b/_archive/entity/npc/NPCInteract.gd new file mode 100644 index 0000000..9849c75 --- /dev/null +++ b/_archive/entity/npc/NPCInteract.gd @@ -0,0 +1,39 @@ +@tool +class_name NPCInteract extends Node + +enum InteractType { + NONE, + TEXT, + CUTSCENE +} + +@export var interactType:InteractType = InteractType.NONE +@export var interactText:Array[String] = [] + +var interactTextIndex:int = 0 + +func onInteract(_player:Player) -> void: + if interactType == InteractType.TEXT: + interactTextIndex = 0 + UI.TEXTBOX.setText(interactText[interactTextIndex]) + UI.TEXTBOX.textboxClosing.connect(onTextboxClosing) + return + + pass + +func onInteractable(player:Player) -> void: + pass + +func onNotInteractable(player:Player) -> void: + pass + +func _exit_tree() -> void: + UI.TEXTBOX.textboxClosing.disconnect(onTextboxClosing) + +func onTextboxClosing() -> void: + interactTextIndex += 1 + if interactTextIndex < interactText.size(): + UI.TEXTBOX.setText(interactText[interactTextIndex]) + else: + UI.TEXTBOX.textboxClosing.disconnect(onTextboxClosing) + UI.TEXTBOX.setText("") diff --git a/entity/npc/NPCInteract.gd.uid b/_archive/entity/npc/NPCInteract.gd.uid similarity index 100% rename from entity/npc/NPCInteract.gd.uid rename to _archive/entity/npc/NPCInteract.gd.uid diff --git a/_archive/entity/npc/NPCMovement.gd b/_archive/entity/npc/NPCMovement.gd new file mode 100644 index 0000000..47daee0 --- /dev/null +++ b/_archive/entity/npc/NPCMovement.gd @@ -0,0 +1,2 @@ +# @tool +# class_name NPCMovement extends "res://entity/EntityMovement.gd" diff --git a/entity/npc/NPCMovement.gd.uid b/_archive/entity/npc/NPCMovement.gd.uid similarity index 100% rename from entity/npc/NPCMovement.gd.uid rename to _archive/entity/npc/NPCMovement.gd.uid diff --git a/entity/npc/NPCTest.gd b/_archive/entity/npc/NPCTest.gd similarity index 100% rename from entity/npc/NPCTest.gd rename to _archive/entity/npc/NPCTest.gd diff --git a/entity/npc/NPCTest.gd.uid b/_archive/entity/npc/NPCTest.gd.uid similarity index 100% rename from entity/npc/NPCTest.gd.uid rename to _archive/entity/npc/NPCTest.gd.uid diff --git a/_archive/entity/player/Player.gd b/_archive/entity/player/Player.gd new file mode 100644 index 0000000..855fec9 --- /dev/null +++ b/_archive/entity/player/Player.gd @@ -0,0 +1,22 @@ +# @tool +# class_name Player extends CharacterBody3D + +# @export var _movement:PlayerMovement + +# @export var walkSpeed:float: +# set(value): +# if _movement: +# _movement.walkSpeed = value +# get: +# if _movement: +# return _movement.walkSpeed +# return 0.0 + +# @export var runSpeed:float: +# set(value): +# if _movement: +# _movement.runSpeed = value +# get: +# if _movement: +# return _movement.runSpeed +# return 0.0 diff --git a/entity/player/Player.gd.uid b/_archive/entity/player/Player.gd.uid similarity index 100% rename from entity/player/Player.gd.uid rename to _archive/entity/player/Player.gd.uid diff --git a/entity/player/Player.png b/_archive/entity/player/Player.png similarity index 100% rename from entity/player/Player.png rename to _archive/entity/player/Player.png diff --git a/entity/player/Player.png.import b/_archive/entity/player/Player.png.import similarity index 71% rename from entity/player/Player.png.import rename to _archive/entity/player/Player.png.import index 54ad579..598d3d8 100644 --- a/entity/player/Player.png.import +++ b/_archive/entity/player/Player.png.import @@ -3,7 +3,7 @@ importer="texture" type="CompressedTexture2D" uid="uid://xx3qp5xh7tgu" -path.s3tc="res://.godot/imported/Player.png-44a553acafadade6fc26fd4f7692a8d9.s3tc.ctex" +path.s3tc="res://.godot/imported/Player.png-375a5d516004cad2a06e60ddde70664e.s3tc.ctex" metadata={ "imported_formats": ["s3tc_bptc"], "vram_texture": true @@ -11,8 +11,8 @@ metadata={ [deps] -source_file="res://entity/player/Player.png" -dest_files=["res://.godot/imported/Player.png-44a553acafadade6fc26fd4f7692a8d9.s3tc.ctex"] +source_file="res://_archive/entity/player/Player.png" +dest_files=["res://.godot/imported/Player.png-375a5d516004cad2a06e60ddde70664e.s3tc.ctex"] [params] diff --git a/entity/player/Player.png.pxo b/_archive/entity/player/Player.png.pxo similarity index 100% rename from entity/player/Player.png.pxo rename to _archive/entity/player/Player.png.pxo diff --git a/entity/player/Player.tscn b/_archive/entity/player/Player.tscn similarity index 100% rename from entity/player/Player.tscn rename to _archive/entity/player/Player.tscn diff --git a/entity/player/PlayerCamera.gd b/_archive/entity/player/PlayerCamera.gd similarity index 100% rename from entity/player/PlayerCamera.gd rename to _archive/entity/player/PlayerCamera.gd diff --git a/entity/player/PlayerCamera.gd.uid b/_archive/entity/player/PlayerCamera.gd.uid similarity index 100% rename from entity/player/PlayerCamera.gd.uid rename to _archive/entity/player/PlayerCamera.gd.uid diff --git a/entity/player/PlayerInput.gd b/_archive/entity/player/PlayerInput.gd similarity index 100% rename from entity/player/PlayerInput.gd rename to _archive/entity/player/PlayerInput.gd diff --git a/entity/player/PlayerInput.gd.uid b/_archive/entity/player/PlayerInput.gd.uid similarity index 100% rename from entity/player/PlayerInput.gd.uid rename to _archive/entity/player/PlayerInput.gd.uid diff --git a/entity/player/PlayerInteraction.gd b/_archive/entity/player/PlayerInteraction.gd similarity index 100% rename from entity/player/PlayerInteraction.gd rename to _archive/entity/player/PlayerInteraction.gd diff --git a/entity/player/PlayerInteraction.gd.uid b/_archive/entity/player/PlayerInteraction.gd.uid similarity index 100% rename from entity/player/PlayerInteraction.gd.uid rename to _archive/entity/player/PlayerInteraction.gd.uid diff --git a/entity/player/PlayerMaterial.tres b/_archive/entity/player/PlayerMaterial.tres similarity index 100% rename from entity/player/PlayerMaterial.tres rename to _archive/entity/player/PlayerMaterial.tres diff --git a/entity/player/PlayerMovement.gd b/_archive/entity/player/PlayerMovement.gd similarity index 100% rename from entity/player/PlayerMovement.gd rename to _archive/entity/player/PlayerMovement.gd diff --git a/entity/player/PlayerMovement.gd.uid b/_archive/entity/player/PlayerMovement.gd.uid similarity index 100% rename from entity/player/PlayerMovement.gd.uid rename to _archive/entity/player/PlayerMovement.gd.uid diff --git a/event/EventItem.gd b/_archive/event/EventItem.gd similarity index 100% rename from event/EventItem.gd rename to _archive/event/EventItem.gd diff --git a/event/EventItem.gd.uid b/_archive/event/EventItem.gd.uid similarity index 100% rename from event/EventItem.gd.uid rename to _archive/event/EventItem.gd.uid diff --git a/event/EventResource.gd b/_archive/event/EventResource.gd similarity index 100% rename from event/EventResource.gd rename to _archive/event/EventResource.gd diff --git a/event/EventResource.gd.uid b/_archive/event/EventResource.gd.uid similarity index 100% rename from event/EventResource.gd.uid rename to _archive/event/EventResource.gd.uid diff --git a/entity/EntityMovement.gd b/entity/EntityMovement.gd deleted file mode 100644 index 0ad57da..0000000 --- a/entity/EntityMovement.gd +++ /dev/null @@ -1,85 +0,0 @@ -@tool -class_name EntityMovement extends Node - -const FRICTION = 0.01 -const WALK_SPEED_DEFAULT = 8 -const RUN_SPEED_DEFAULT = 12 - -var _inputDir:Vector2 = Vector2.ZERO -var _running:bool = false - -@export var body:CharacterBody3D -@export var rotate:Node3D -@export var walkSpeed:float = WALK_SPEED_DEFAULT -@export var runSpeed:float = RUN_SPEED_DEFAULT - -# -# Private Methods -# -func _applyGravity() -> void: - if !body.is_on_floor(): - body.velocity += PHYSICS.GRAVITY * get_process_delta_time() - -func _applyMovement() -> void: - if !canMove(): - return - - var cameraCurrent = get_viewport().get_camera_3d() - if !cameraCurrent: - return - - # Use camera orientation for movement direction - var camBasis = cameraCurrent.global_transform.basis - - # Forward and right vectors, ignore vertical component - var forward = -camBasis.z - forward.y = 0 - forward = forward.normalized() - var right = camBasis.x - right.y = 0 - right = right.normalized() - - var directionAdjusted = ( - forward * _inputDir.y + right * _inputDir.x - ).normalized() - if directionAdjusted.length() <= 0.01: - return - - if rotate: - var targetRot = atan2(directionAdjusted.x, directionAdjusted.z) - rotate.rotation.y = targetRot - - var speed = walkSpeed - if _running: - speed = runSpeed - - body.velocity.x = directionAdjusted.x * speed - body.velocity.z = directionAdjusted.z * speed - -func _applyFriction(delta:float) -> void: - body.velocity.x *= delta * FRICTION - body.velocity.z *= delta * FRICTION - -# -# Protected Methods -# -func canMove() -> bool: - return true - -# -# Callbacks -# -func _enter_tree() -> void: - pass - -func _physics_process(delta:float) -> void: - if Engine.is_editor_hint(): - return - - if !body: - return - - _applyGravity() - _applyFriction(delta) - _applyMovement() - body.move_and_slide() diff --git a/entity/npc/NPCInteract.gd b/entity/npc/NPCInteract.gd deleted file mode 100644 index 3ff5a26..0000000 --- a/entity/npc/NPCInteract.gd +++ /dev/null @@ -1,20 +0,0 @@ -@tool -class_name NPCInteract extends Node - -enum InteractType { - NONE, - TEXT, - CUTSCENE -} - -@export var interactType:InteractType = InteractType.NONE - -func onInteract(player:Player) -> void: - print("NPC Interacted with by Player: %s" % player.name) - pass - -func onInteractable(player:Player) -> void: - pass - -func onNotInteractable(player:Player) -> void: - pass diff --git a/entity/npc/NPCMovement.gd b/entity/npc/NPCMovement.gd deleted file mode 100644 index a7c28f2..0000000 --- a/entity/npc/NPCMovement.gd +++ /dev/null @@ -1,2 +0,0 @@ -@tool -class_name NPCMovement extends "res://entity/EntityMovement.gd" \ No newline at end of file diff --git a/entity/player/Player.gd b/entity/player/Player.gd deleted file mode 100644 index fa84a88..0000000 --- a/entity/player/Player.gd +++ /dev/null @@ -1,22 +0,0 @@ -@tool -class_name Player extends CharacterBody3D - -@export var _movement:PlayerMovement - -@export var walkSpeed:float: - set(value): - if _movement: - _movement.walkSpeed = value - get: - if _movement: - return _movement.walkSpeed - return 0.0 - -@export var runSpeed:float: - set(value): - if _movement: - _movement.runSpeed = value - get: - if _movement: - return _movement.runSpeed - return 0.0 diff --git a/item/Inventory.gd b/item/Inventory.gd new file mode 100644 index 0000000..d5ce0ec --- /dev/null +++ b/item/Inventory.gd @@ -0,0 +1,78 @@ +class_name Inventory +const Item = preload("res://item/Item.gd") +const ItemStack = preload("res://item/ItemStack.gd") + +var items:Array[ItemStack] = [] + +enum InventorySortType { + ITEM_TYPE, + ITEM_KEY +} + +signal itemAdded(item:Item) +signal itemRemoved(item:Item) +signal itemQuantityChanged(item:Item, quantity:int) +signal inventorySorted(sortBy:InventorySortType, reverse:bool) + +func setItem(item:Item, quantity:int) -> void: + if quantity < 0: + push_error("Cannot set item quantity to negative value, using 0") + quantity = 0 + + # Is item already in inventory? + for itemStack in items: + if itemStack.item != item: + continue + + # Item stack already present. + if quantity == 0: + items.erase(itemStack) + itemRemoved.emit(item) + itemQuantityChanged.emit(item, 0) + else: + itemStack.quantity = quantity + itemQuantityChanged.emit(item, quantity) + return + + # Not in stack, create new stack + var stack:ItemStack = ItemStack.new() + stack.item = item + stack.quantity = quantity + items.append(stack) + itemAdded.emit(item) + itemQuantityChanged.emit(item, quantity) + +func getItemQuantity(item:Item) -> int: + for itemStack in items: + if itemStack.item == item: + return itemStack.quantity + return 0 + +func addItem(item:Item, quantity:int = 1) -> void: + # Add can only take positive quantities, otherwise use set or remove + if quantity <= 0: + push_error("Cannot add non-positive item quantity") + return + self.setItem(item, self.getItemQuantity(item) + quantity) + +func removeItem(item:Item) -> void: + self.setItem(item, 0) + +func sort(sortBy:InventorySortType, reverse:bool = false) -> void: + match sortBy: + InventorySortType.ITEM_TYPE: + items.sort_custom(_sortByItemType) + InventorySortType.ITEM_KEY: + items.sort_custom(_sortByItemKey) + + if reverse: + items.reverse() + + inventorySorted.emit(sortBy, reverse) + +# Sorters +func _sortByItemType(a:ItemStack, b:ItemStack) -> int: + return int(a.item.itemType) - int(b.item.itemType) + +func _sortByItemKey(a:ItemStack, b:ItemStack) -> int: + return a.item.key.casecmp_to(b.item.key) \ No newline at end of file diff --git a/item/Inventory.gd.uid b/item/Inventory.gd.uid new file mode 100644 index 0000000..a4733c2 --- /dev/null +++ b/item/Inventory.gd.uid @@ -0,0 +1 @@ +uid://6ekrdnirg8vr diff --git a/item/Item.gd b/item/Item.gd new file mode 100644 index 0000000..66d9ef8 --- /dev/null +++ b/item/Item.gd @@ -0,0 +1,26 @@ +class_name Item + +# Enum Types +enum ItemType { + NULL, + + MEDICINE, + KEY_ITEM, +} + +# Properties +var itemType:ItemType +var key:String + +# Item Constructor +func _init(key:String, itemType:ItemType) -> void: + self.key = key + self.itemType = itemType + +func getName() -> String: + # For now just return key + return self.key + +# Item Table +static var NULL:Item = Item.new("NULL", ItemType.NULL) +static var POTION:Item = Item.new("POTION", ItemType.MEDICINE) \ No newline at end of file diff --git a/item/Item.gd.uid b/item/Item.gd.uid new file mode 100644 index 0000000..4549d68 --- /dev/null +++ b/item/Item.gd.uid @@ -0,0 +1 @@ +uid://dtav0cqc1bn6g diff --git a/item/ItemStack.gd b/item/ItemStack.gd new file mode 100644 index 0000000..a9dc45e --- /dev/null +++ b/item/ItemStack.gd @@ -0,0 +1,6 @@ +class_name ItemStack + +const Item = preload("res://item/Item.gd") + +var item:Item = Item.NULL +var quantity:int = 0 \ No newline at end of file diff --git a/item/ItemStack.gd.uid b/item/ItemStack.gd.uid new file mode 100644 index 0000000..9dcea58 --- /dev/null +++ b/item/ItemStack.gd.uid @@ -0,0 +1 @@ +uid://c3ytuwkcshyrl diff --git a/map/TestMap.tscn b/map/TestMap.tscn deleted file mode 100644 index 206c0cb..0000000 --- a/map/TestMap.tscn +++ /dev/null @@ -1,24 +0,0 @@ -[gd_scene load_steps=5 format=3 uid="uid://d0ywgijpuqy0r"] - -[ext_resource type="Script" uid="uid://xe6pcuq741xi" path="res://map/TestMap.gd" id="1_6ms5s"] -[ext_resource type="PackedScene" uid="uid://cluuhtfjeodwb" path="res://map/TestMapBase.tscn" id="1_ox0si"] -[ext_resource type="PackedScene" uid="uid://2ch34sio36nv" path="res://entity/player/Player.tscn" id="2_0d2qr"] -[ext_resource type="PackedScene" uid="uid://kabs7mopalmo" path="res://entity/npc/NPC.tscn" id="3_0vfw4"] - -[node name="TestMap" type="Node3D"] -script = ExtResource("1_6ms5s") - -[node name="TestMapBase" parent="." instance=ExtResource("1_ox0si")] - -[node name="Player" parent="." instance=ExtResource("2_0d2qr")] -transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 11.5777, 1.09878, 0) -walkSpeed = 8.0 -runSpeed = 12.0 - -[node name="NPC" parent="." instance=ExtResource("3_0vfw4")] -transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 9.3026, 1.11551, -2.12904) -interactType = 1 - -[node name="Meta" type="Node" parent="."] - -[node name="Cutscenes" type="Node" parent="Meta"] diff --git a/meta/OverworldScene.gd b/meta/OverworldScene.gd index 25c7675..ac704ef 100644 --- a/meta/OverworldScene.gd +++ b/meta/OverworldScene.gd @@ -23,12 +23,12 @@ func onMapChanged(newMap:PackedScene, playerDestinationNodeName:String) -> void: map.add_child(newMapInstance) # Find Player. - if playerDestinationNodeName: - var player = newMapInstance.get_node("Player") - var destNode = newMapInstance.get_node(playerDestinationNodeName) - if player && player is Player && destNode: - player.global_position = destNode.global_position - player.global_rotation.y = destNode.global_rotation.y - elif playerDestinationNodeName: - push_error("Player, or destination node not found in new map.") - pass + # if playerDestinationNodeName: + # var player = newMapInstance.get_node("Player") + # var destNode = newMapInstance.get_node(playerDestinationNodeName) + # if player && player is Player && destNode: + # player.global_position = destNode.global_position + # player.global_rotation.y = destNode.global_rotation.y + # elif playerDestinationNodeName: + # push_error("Player, or destination node not found in new map.") + # pass diff --git a/overworld/entity/Entity.gd b/overworld/entity/Entity.gd new file mode 100644 index 0000000..425c715 --- /dev/null +++ b/overworld/entity/Entity.gd @@ -0,0 +1,18 @@ +class_name Entity extends CharacterBody3D + +enum MovementType { + NONE, + DISABLED, + PLAYER +} + +enum InteractType { + NONE, +}; + + +# Movement settings +@export var movementType:MovementType = MovementType.NONE + +# Interaction settings +@export var interactType:InteractType = InteractType.NONE \ No newline at end of file diff --git a/overworld/entity/Entity.gd.uid b/overworld/entity/Entity.gd.uid new file mode 100644 index 0000000..bd2c75a --- /dev/null +++ b/overworld/entity/Entity.gd.uid @@ -0,0 +1 @@ +uid://c8146flooxeue diff --git a/overworld/entity/Entity.tscn b/overworld/entity/Entity.tscn new file mode 100644 index 0000000..bc6ee62 --- /dev/null +++ b/overworld/entity/Entity.tscn @@ -0,0 +1,70 @@ +[gd_scene load_steps=12 format=3 uid="uid://by4a0r2hp0w6s"] + +[ext_resource type="Script" uid="uid://c8146flooxeue" path="res://overworld/entity/Entity.gd" id="1_8e8ef"] +[ext_resource type="Script" uid="uid://cj122th32iabx" path="res://overworld/entity/EntityMovement.gd" id="2_sfgsm"] +[ext_resource type="Script" uid="uid://8is1soq6i282" path="res://overworld/entity/EntityInteractingArea.gd" id="3_bhm0o"] +[ext_resource type="Script" uid="uid://cr03t63s321wp" path="res://overworld/entity/EntityInteractableArea.gd" id="4_e1jqj"] + +[sub_resource type="CapsuleShape3D" id="CapsuleShape3D_8e8ef"] + +[sub_resource type="CapsuleMesh" id="CapsuleMesh_sfgsm"] + +[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_8e8ef"] +shading_mode = 0 +albedo_color = Color(0.521569, 1, 1, 1) + +[sub_resource type="BoxMesh" id="BoxMesh_8e8ef"] + +[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_sfgsm"] +shading_mode = 0 +albedo_color = Color(1, 0.518134, 0.620745, 1) + +[sub_resource type="BoxShape3D" id="BoxShape3D_sfgsm"] +size = Vector3(0.689728, 0.52002, 0.796997) + +[sub_resource type="BoxShape3D" id="BoxShape3D_bhm0o"] +size = Vector3(1.3, 1.3, 1.3) + +[node name="Entity" type="CharacterBody3D"] +script = ExtResource("1_8e8ef") +metadata/_custom_type_script = "uid://c8146flooxeue" + +[node name="CollisionShape3D" type="CollisionShape3D" parent="."] +shape = SubResource("CapsuleShape3D_8e8ef") + +[node name="MeshInstance3D" type="MeshInstance3D" parent="."] +mesh = SubResource("CapsuleMesh_sfgsm") +surface_material_override/0 = SubResource("StandardMaterial3D_8e8ef") + +[node name="Nose" type="Node3D" parent="."] +transform = Transform3D(0.393905, 0, 0, 0, 0.393905, 0, 0, 0, 0.393905, 0.571181, 0.340915, 0) + +[node name="MeshInstance3D" type="MeshInstance3D" parent="Nose"] +mesh = SubResource("BoxMesh_8e8ef") +surface_material_override/0 = SubResource("StandardMaterial3D_sfgsm") + +[node name="Components" type="Node" parent="."] + +[node name="Movement" type="Node" parent="Components" node_paths=PackedStringArray("entity", "interactingArea")] +script = ExtResource("2_sfgsm") +entity = NodePath("../..") +interactingArea = NodePath("../../EntityInteractingArea") + +[node name="EntityInteractingArea" type="Area3D" parent="." node_paths=PackedStringArray("entity")] +collision_layer = 0 +collision_mask = 2 +script = ExtResource("3_bhm0o") +entity = NodePath("..") + +[node name="CollisionShape3D" type="CollisionShape3D" parent="EntityInteractingArea"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.604726, 0, 0) +shape = SubResource("BoxShape3D_sfgsm") + +[node name="EntityInteractableArea" type="Area3D" parent="." node_paths=PackedStringArray("entity")] +collision_layer = 2 +collision_mask = 0 +script = ExtResource("4_e1jqj") +entity = NodePath("..") + +[node name="CollisionShape3D" type="CollisionShape3D" parent="EntityInteractableArea"] +shape = SubResource("BoxShape3D_bhm0o") diff --git a/overworld/entity/EntityInteractableArea.gd b/overworld/entity/EntityInteractableArea.gd new file mode 100644 index 0000000..5233eb4 --- /dev/null +++ b/overworld/entity/EntityInteractableArea.gd @@ -0,0 +1,16 @@ +class_name EntityInteractableArea extends Area3D +const Entity = preload("res://overworld/entity/Entity.gd") + +@export var entity:Entity + +func isInteractable() -> bool: + return entity && entity.interactType != Entity.InteractType.NONE + +func onInteract() -> void: + if !isInteractable(): + return + + if entity.interactType == Entity.InteractType.NONE: + return + + print("Entity Interacted") \ No newline at end of file diff --git a/overworld/entity/EntityInteractableArea.gd.uid b/overworld/entity/EntityInteractableArea.gd.uid new file mode 100644 index 0000000..6344bf5 --- /dev/null +++ b/overworld/entity/EntityInteractableArea.gd.uid @@ -0,0 +1 @@ +uid://cr03t63s321wp diff --git a/overworld/entity/EntityInteractingArea.gd b/overworld/entity/EntityInteractingArea.gd new file mode 100644 index 0000000..ccecf91 --- /dev/null +++ b/overworld/entity/EntityInteractingArea.gd @@ -0,0 +1,33 @@ +class_name EntityInteractingArea extends Area3D +const Entity = preload("res://overworld/entity/Entity.gd") + +var interactableAreas:Array[EntityInteractableArea] = [] +@export var entity:Entity + +func hasInteraction() -> bool: + return true + +func interact() -> void: + for area in interactableAreas: + area.onInteract() + +func _enter_tree() -> void: + self.area_entered.connect(_onAreaEntered) + self.area_exited.connect(_onAreaExited) + +func _exit_tree() -> void: + self.area_entered.disconnect(_onAreaEntered) + self.area_exited.disconnect(_onAreaExited) + +func _onAreaEntered(area:Area3D) -> void: + if area is EntityInteractableArea: + if area.entity == entity: + return + if !area.isInteractable(): + return + print("EntityInteractingArea: Area Entered") + interactableAreas.append(area) + +func _onAreaExited(area:Area3D) -> void: + print("EntityInteractingArea: Area Exited") + interactableAreas.erase(area) \ No newline at end of file diff --git a/overworld/entity/EntityInteractingArea.gd.uid b/overworld/entity/EntityInteractingArea.gd.uid new file mode 100644 index 0000000..c1fc372 --- /dev/null +++ b/overworld/entity/EntityInteractingArea.gd.uid @@ -0,0 +1 @@ +uid://8is1soq6i282 diff --git a/overworld/entity/EntityMovement.gd b/overworld/entity/EntityMovement.gd new file mode 100644 index 0000000..78be5be --- /dev/null +++ b/overworld/entity/EntityMovement.gd @@ -0,0 +1,80 @@ +class_name EntityMovement extends Node + +const FRICTION = 0.01 +const WALK_SPEED_DEFAULT = 8 +const RUN_SPEED_DEFAULT = 12 + +# var _inputDir:Vector2 = Vector2.ZERO +# var _running:bool = false + +@export var entity:Entity +@export var interactingArea:EntityInteractingArea +# @export var rotate:Node3D +@export var walkSpeed:float = WALK_SPEED_DEFAULT +# @export var runSpeed:float = RUN_SPEED_DEFAULT + +# +# Private Methods +# +func _applyGravity() -> void: + if !entity.is_on_floor(): + entity.velocity += PHYSICS.GRAVITY * get_process_delta_time() + +func _applyPlayerMovement(_delta:float): + if Input.is_action_just_pressed("interact") && interactingArea && interactingArea.hasInteraction(): + interactingArea.interact() + return + + var inputDir:Vector2 = Input.get_vector("move_left", "move_right", "move_back", "move_forward").normalized() + var cameraCurrent = get_viewport().get_camera_3d() + if !cameraCurrent: + return + + # Use camera orientation for movement direction + var camBasis = cameraCurrent.global_transform.basis + + # Forward and right vectors, ignore vertical component + var forward = -camBasis.z + forward.y = 0 + forward = forward.normalized() + var right = camBasis.x + right.y = 0 + right = right.normalized() + + var directionAdjusted = (forward * inputDir.y + right * inputDir.x).normalized() + if directionAdjusted.length() <= 0.01: + return + + var speed = walkSpeed + entity.velocity.x = directionAdjusted.x * speed + entity.velocity.z = directionAdjusted.z * speed + +func _applyMovement(delta:float) -> void: + if !_canMove(): + return + + if entity.movementType == Entity.MovementType.PLAYER: + _applyPlayerMovement(delta) + +func _applyFriction(delta:float) -> void: + entity.velocity.x *= delta * FRICTION + entity.velocity.z *= delta * FRICTION + +func _canMove() -> bool: + return true + +# +# Callbacks +# +func _enter_tree() -> void: + pass + +func _physics_process(delta:float) -> void: + # Entity required to move + if !entity || entity.movementType == Entity.MovementType.DISABLED || !entity.visible: + return + + _applyGravity() + _applyFriction(delta) + _applyMovement(delta) + entity.move_and_slide() \ No newline at end of file diff --git a/overworld/entity/EntityMovement.gd.uid b/overworld/entity/EntityMovement.gd.uid new file mode 100644 index 0000000..adc0cf8 --- /dev/null +++ b/overworld/entity/EntityMovement.gd.uid @@ -0,0 +1 @@ +uid://cj122th32iabx diff --git a/map/TestMap.gd b/overworld/map/TestMap.gd similarity index 100% rename from map/TestMap.gd rename to overworld/map/TestMap.gd diff --git a/map/TestMap.gd.uid b/overworld/map/TestMap.gd.uid similarity index 100% rename from map/TestMap.gd.uid rename to overworld/map/TestMap.gd.uid diff --git a/overworld/map/TestMap.tscn b/overworld/map/TestMap.tscn new file mode 100644 index 0000000..b1275e5 --- /dev/null +++ b/overworld/map/TestMap.tscn @@ -0,0 +1,20 @@ +[gd_scene load_steps=4 format=3 uid="uid://d0ywgijpuqy0r"] + +[ext_resource type="Script" uid="uid://xe6pcuq741xi" path="res://overworld/map/TestMap.gd" id="1_6ms5s"] +[ext_resource type="PackedScene" uid="uid://cluuhtfjeodwb" path="res://overworld/map/TestMapBase.tscn" id="1_ox0si"] +[ext_resource type="PackedScene" uid="uid://by4a0r2hp0w6s" path="res://overworld/entity/Entity.tscn" id="2_jmygs"] + +[node name="TestMap" type="Node3D"] +script = ExtResource("1_6ms5s") + +[node name="NotPlayer" parent="." instance=ExtResource("2_jmygs")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.00883961, 1.11219, 0.0142021) + +[node name="TestMapBase" parent="." instance=ExtResource("1_ox0si")] + +[node name="Player" parent="." instance=ExtResource("2_jmygs")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 3.1915, 1.05, 0.125589) +movementType = 2 + +[node name="Camera3D" type="Camera3D" parent="."] +transform = Transform3D(-0.0384888, -0.605488, 0.794923, -0.0292824, 0.795854, 0.60478, -0.99883, 0, -0.0483617, 5.96324, 4.42257, 0) diff --git a/map/TestMapBase.tscn b/overworld/map/TestMapBase.tscn similarity index 100% rename from map/TestMapBase.tscn rename to overworld/map/TestMapBase.tscn