| @@ -0,0 +1,9 @@ | |||||
| [gd_resource type="Resource" load_steps=3 format=2] | |||||
| [ext_resource path="res://jrpg/scripts/entities/data/character_data.gd" type="Script" id=1] | |||||
| [ext_resource path="res://jrpg/scenes/entities/Enemy.tscn" type="PackedScene" id=2] | |||||
| [resource] | |||||
| script = ExtResource( 1 ) | |||||
| name = "Basic Enemy" | |||||
| scene = ExtResource( 2 ) | |||||
| @@ -0,0 +1,9 @@ | |||||
| [gd_resource type="Resource" load_steps=3 format=2] | |||||
| [ext_resource path="res://jrpg/scripts/entities/data/character_data.gd" type="Script" id=1] | |||||
| [ext_resource path="res://jrpg/scenes/entities/Player.tscn" type="PackedScene" id=2] | |||||
| [resource] | |||||
| script = ExtResource( 1 ) | |||||
| name = "Player" | |||||
| scene = ExtResource( 2 ) | |||||
| @@ -1,19 +1,17 @@ | |||||
| [gd_scene load_steps=30 format=2] | |||||
| [gd_scene load_steps=28 format=2] | |||||
| [ext_resource path="res://jrpg/scenes/entities/Enemy.tscn" type="PackedScene" id=1] | |||||
| [ext_resource path="res://jrpg/scripts/levels/spawner.gd" type="Script" id=1] | |||||
| [ext_resource path="res://jrpg/scenes/ui/HUD.tscn" type="PackedScene" id=2] | [ext_resource path="res://jrpg/scenes/ui/HUD.tscn" type="PackedScene" id=2] | ||||
| [ext_resource path="res://jrpg/scenes/entities/Pickup.tscn" type="PackedScene" id=3] | [ext_resource path="res://jrpg/scenes/entities/Pickup.tscn" type="PackedScene" id=3] | ||||
| [ext_resource path="res://jrpg/scenes/ui/SpeechText.tscn" type="PackedScene" id=4] | [ext_resource path="res://jrpg/scenes/ui/SpeechText.tscn" type="PackedScene" id=4] | ||||
| [ext_resource path="res://jrpg/scenes/ui/ChoicesBox.tscn" type="PackedScene" id=5] | [ext_resource path="res://jrpg/scenes/ui/ChoicesBox.tscn" type="PackedScene" id=5] | ||||
| [ext_resource path="res://jrpg/scenes/entities/Player.tscn" type="PackedScene" id=6] | |||||
| [ext_resource path="res://jrpg/characters/player.tres" type="Resource" id=6] | |||||
| [ext_resource path="res://jrpg/misc/jrpg_env.tres" type="Environment" id=7] | [ext_resource path="res://jrpg/misc/jrpg_env.tres" type="Environment" id=7] | ||||
| [ext_resource path="res://jrpg/models/nature/dirt.material" type="Material" id=8] | [ext_resource path="res://jrpg/models/nature/dirt.material" type="Material" id=8] | ||||
| [ext_resource path="res://jrpg/models/nature/grass.material" type="Material" id=9] | [ext_resource path="res://jrpg/models/nature/grass.material" type="Material" id=9] | ||||
| [ext_resource path="res://jrpg/models/nature/_defaultMat.material" type="Material" id=10] | [ext_resource path="res://jrpg/models/nature/_defaultMat.material" type="Material" id=10] | ||||
| [ext_resource path="res://jrpg/scripts/ui/speech_panel.gd" type="Script" id=11] | [ext_resource path="res://jrpg/scripts/ui/speech_panel.gd" type="Script" id=11] | ||||
| [ext_resource path="res://jrpg/scripts/entities/components/interactions/talk_interaction.gd" type="Script" id=12] | |||||
| [ext_resource path="res://jrpg/scripts/entities/npc.gd" type="Script" id=13] | |||||
| [ext_resource path="res://jrpg/yarn_scripts/npc_debug.yarn" type="Resource" id=14] | |||||
| [ext_resource path="res://jrpg/characters/basic_enemy.tres" type="Resource" id=12] | |||||
| [ext_resource path="res://jrpg/scripts/misc/test_level.gd" type="Script" id=15] | [ext_resource path="res://jrpg/scripts/misc/test_level.gd" type="Script" id=15] | ||||
| [sub_resource type="ArrayMesh" id=1] | [sub_resource type="ArrayMesh" id=1] | ||||
| @@ -392,18 +390,15 @@ transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 15.6138, 3.8056, 3.13732 ) | |||||
| [node name="WorldEnvironment" type="WorldEnvironment" parent="."] | [node name="WorldEnvironment" type="WorldEnvironment" parent="."] | ||||
| environment = ExtResource( 7 ) | environment = ExtResource( 7 ) | ||||
| [node name="Player" parent="." instance=ExtResource( 6 )] | |||||
| transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.45297, 0 ) | |||||
| ui_path = NodePath("../../TestLVL/CanvasLayer/UI") | |||||
| [node name="Enemy Spawner" type="Spatial" parent="."] | |||||
| transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 3.42834, 0, 8.41565 ) | |||||
| script = ExtResource( 1 ) | |||||
| character_data = ExtResource( 12 ) | |||||
| [node name="Enemy" parent="." instance=ExtResource( 1 )] | |||||
| transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, -4.06601, 0.281974, 5.23785 ) | |||||
| script = ExtResource( 13 ) | |||||
| [node name="TalkInteraction" type="Node" parent="Enemy"] | |||||
| script = ExtResource( 12 ) | |||||
| yarnScript = ExtResource( 14 ) | |||||
| speechPanel_path = NodePath("../../../TestLVL/CanvasLayer/SpeechPanel") | |||||
| [node name="Player Spawner" type="Spatial" parent="."] | |||||
| transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, -0.218717, 0, -1.84536 ) | |||||
| script = ExtResource( 1 ) | |||||
| character_data = ExtResource( 6 ) | |||||
| [node name="CanvasLayer" type="CanvasLayer" parent="."] | [node name="CanvasLayer" type="CanvasLayer" parent="."] | ||||
| @@ -435,5 +430,3 @@ anchor_bottom = 1.0 | |||||
| margin_left = 0.0319824 | margin_left = 0.0319824 | ||||
| margin_right = -50.0 | margin_right = -50.0 | ||||
| alignment = 1 | alignment = 1 | ||||
| [editable path="Player"] | |||||
| @@ -1,7 +1,7 @@ | |||||
| [gd_scene load_steps=4 format=2] | [gd_scene load_steps=4 format=2] | ||||
| [ext_resource path="res://jrpg/models/chars/Zombie_Male.glb" type="PackedScene" id=1] | [ext_resource path="res://jrpg/models/chars/Zombie_Male.glb" type="PackedScene" id=1] | ||||
| [ext_resource path="res://jrpg/scripts/entities/enemy.gd" type="Script" id=2] | |||||
| [ext_resource path="res://jrpg/scripts/entities/npc.gd" type="Script" id=2] | |||||
| [sub_resource type="CapsuleShape" id=1] | [sub_resource type="CapsuleShape" id=1] | ||||
| radius = 0.5 | radius = 0.5 | ||||
| @@ -0,0 +1,6 @@ | |||||
| extends Resource | |||||
| class_name CharacterData | |||||
| export var name : String | |||||
| export var scene : PackedScene | |||||
| @@ -0,0 +1,48 @@ | |||||
| extends Object | |||||
| class_name PlayerInfos | |||||
| # curHp | |||||
| var curHp : int = 10 setget curHp_set, curHp_get | |||||
| signal curHp_update | |||||
| func curHp_set(value): | |||||
| curHp = value | |||||
| emit_signal("curHp_update", value) | |||||
| func curHp_get(): | |||||
| return curHp | |||||
| # maxHp | |||||
| var maxHp : int = 10 setget maxHp_set, maxHp_get | |||||
| signal maxHp_update | |||||
| func maxHp_set(value): | |||||
| maxHp = value | |||||
| emit_signal("maxHp_update", value) | |||||
| func maxHp_get(): | |||||
| return maxHp | |||||
| # damage | |||||
| var damage : int = 1 setget damage_set, damage_get | |||||
| signal damage_update | |||||
| func damage_set(value): | |||||
| damage = value | |||||
| emit_signal("damage_update", value) | |||||
| func damage_get(): | |||||
| return damage | |||||
| # gold | |||||
| var gold : int = 0 setget gold_set, gold_get | |||||
| signal gold_update | |||||
| func gold_set(value): | |||||
| gold = value | |||||
| emit_signal("gold_update", value) | |||||
| func gold_get(): | |||||
| return gold | |||||
| @@ -1,15 +1,10 @@ | |||||
| extends KinematicBody | extends KinematicBody | ||||
| # stats | |||||
| var curHp : int = 10 | |||||
| var maxHp : int = 10 | |||||
| var damage : int = 1 | |||||
| var gold : int = 0 | |||||
| class_name Player | |||||
| var attackRate : float = 0.3 | var attackRate : float = 0.3 | ||||
| var lastAttackTime : int = 0 | var lastAttackTime : int = 0 | ||||
| # physics | # physics | ||||
| var airborneSpeed : float = 3.0 | var airborneSpeed : float = 3.0 | ||||
| var walkSpeed : float = 5.0 | var walkSpeed : float = 5.0 | ||||
| @@ -23,14 +18,6 @@ var vel := Vector3() | |||||
| onready var camera = get_node("CameraOrbit") | onready var camera = get_node("CameraOrbit") | ||||
| onready var interactCast = get_node("InteractRayCast") | onready var interactCast = get_node("InteractRayCast") | ||||
| onready var anim = get_node("Casual2_Female/AnimationPlayer") | onready var anim = get_node("Casual2_Female/AnimationPlayer") | ||||
| export var ui_path : NodePath | |||||
| onready var ui = get_node(ui_path) | |||||
| # called when the node is initialized | |||||
| func _ready (): | |||||
| # initialize the UI | |||||
| ui.update_health_bar(curHp, maxHp) | |||||
| ui.update_gold_text(gold) | |||||
| func _process(delta): | func _process(delta): | ||||
| # attack input | # attack input | ||||
| @@ -99,19 +86,16 @@ func _physics_process (delta): | |||||
| # called when we collect a coin | # called when we collect a coin | ||||
| func give_gold (amount): | func give_gold (amount): | ||||
| var gold = Controller.player_infos.gold | |||||
| gold += amount | gold += amount | ||||
| # update the UI | |||||
| ui.update_gold_text(gold) | |||||
| Controller.player_infos.gold = gold | |||||
| # called when an enemy deals damage to us | # called when an enemy deals damage to us | ||||
| func take_damage (damageToTake): | func take_damage (damageToTake): | ||||
| curHp -= damageToTake | |||||
| # update the UI | |||||
| ui.update_health_bar(curHp, maxHp) | |||||
| Controller.player_infos.curHp -= damageToTake | |||||
| # if our health is 0, die | # if our health is 0, die | ||||
| if curHp <= 0: | |||||
| if Controller.player_infos.curHp <= 0: | |||||
| die() | die() | ||||
| # called when our health reaches 0 | # called when our health reaches 0 | ||||
| @@ -142,7 +126,6 @@ func die (): | |||||
| # called when we press the interact button | # called when we press the interact button | ||||
| func try_interact(): | func try_interact(): | ||||
| # is the ray cast colliding with an enemy? | # is the ray cast colliding with an enemy? | ||||
| if interactCast.is_colliding(): | if interactCast.is_colliding(): | ||||
| # play the animation | # play the animation | ||||
| @@ -0,0 +1,10 @@ | |||||
| extends Node | |||||
| class_name BaseLevel | |||||
| func _enter_tree(): | |||||
| Controller.player_input_enabled = true | |||||
| func _exit_tree(): | |||||
| Controller.player_input_enabled = false | |||||
| Input.set_mouse_mode(Input.MOUSE_MODE_VISIBLE) | |||||
| @@ -0,0 +1,8 @@ | |||||
| extends Node | |||||
| export var character_data : Resource | |||||
| func _ready(): | |||||
| var inst = character_data.scene.instance() | |||||
| inst.name = character_data.name | |||||
| add_child(inst) | |||||
| @@ -1,5 +1,7 @@ | |||||
| extends Node | extends Node | ||||
| var player_infos := PlayerInfos.new() | |||||
| var player_input_enabled := true setget player_input_enabled_set | var player_input_enabled := true setget player_input_enabled_set | ||||
| signal player_input_change | signal player_input_change | ||||
| @@ -1,8 +1,3 @@ | |||||
| extends Node | |||||
| extends BaseLevel | |||||
| func _enter_tree(): | |||||
| Controller.player_input_enabled = true | |||||
| func _exit_tree(): | |||||
| Controller.player_input_enabled = false | |||||
| Input.set_mouse_mode(Input.MOUSE_MODE_VISIBLE) | |||||
| class_name TestLevel | |||||
| @@ -5,9 +5,16 @@ onready var healthBar = get_node(healthBar_path) | |||||
| export var goldText_path : NodePath | export var goldText_path : NodePath | ||||
| onready var goldText = get_node(goldText_path) | onready var goldText = get_node(goldText_path) | ||||
| func _ready(): | |||||
| Controller.player_infos.connect("curHp_update", self, "update_health_bar") | |||||
| Controller.player_infos.connect("gold_update", self, "update_gold_text") | |||||
| update_health_bar(Controller.player_infos.curHp) | |||||
| update_gold_text(Controller.player_infos.gold) | |||||
| # called when we take damage | # called when we take damage | ||||
| func update_health_bar (curHp, maxHp): | |||||
| func update_health_bar (curHp): | |||||
| fetch_components() | fetch_components() | ||||
| var maxHp : int = Controller.player_infos.maxHp | |||||
| healthBar.value = (100 / maxHp) * curHp | healthBar.value = (100 / maxHp) * curHp | ||||
| # called when our gold changes | # called when our gold changes | ||||
| @@ -10,20 +10,45 @@ config_version=4 | |||||
| _global_script_classes=[ { | _global_script_classes=[ { | ||||
| "base": "Node", | "base": "Node", | ||||
| "class": "BaseLevel", | |||||
| "language": "GDScript", | |||||
| "path": "res://jrpg/scripts/levels/base_level.gd" | |||||
| }, { | |||||
| "base": "Node", | |||||
| "class": "BasisInteraction", | "class": "BasisInteraction", | ||||
| "language": "GDScript", | "language": "GDScript", | ||||
| "path": "res://jrpg/scripts/entities/components/interactions/basis_interaction.gd" | "path": "res://jrpg/scripts/entities/components/interactions/basis_interaction.gd" | ||||
| }, { | }, { | ||||
| "base": "Resource", | |||||
| "class": "CharacterData", | |||||
| "language": "GDScript", | |||||
| "path": "res://jrpg/scripts/entities/data/character_data.gd" | |||||
| }, { | |||||
| "base": "VBoxContainer", | "base": "VBoxContainer", | ||||
| "class": "ChoicesBox", | "class": "ChoicesBox", | ||||
| "language": "GDScript", | "language": "GDScript", | ||||
| "path": "res://jrpg/scripts/ui/choices_box.gd" | "path": "res://jrpg/scripts/ui/choices_box.gd" | ||||
| }, { | }, { | ||||
| "base": "KinematicBody", | |||||
| "class": "Player", | |||||
| "language": "GDScript", | |||||
| "path": "res://jrpg/scripts/entities/player.gd" | |||||
| }, { | |||||
| "base": "Object", | |||||
| "class": "PlayerInfos", | |||||
| "language": "GDScript", | |||||
| "path": "res://jrpg/scripts/entities/model/player_infos.gd" | |||||
| }, { | |||||
| "base": "Label", | "base": "Label", | ||||
| "class": "SpeechText", | "class": "SpeechText", | ||||
| "language": "GDScript", | "language": "GDScript", | ||||
| "path": "res://jrpg/scripts/ui/speech_text.gd" | "path": "res://jrpg/scripts/ui/speech_text.gd" | ||||
| }, { | }, { | ||||
| "base": "BaseLevel", | |||||
| "class": "TestLevel", | |||||
| "language": "GDScript", | |||||
| "path": "res://jrpg/scripts/misc/test_level.gd" | |||||
| }, { | |||||
| "base": "Node", | "base": "Node", | ||||
| "class": "YarnImporter", | "class": "YarnImporter", | ||||
| "language": "GDScript", | "language": "GDScript", | ||||
| @@ -45,9 +70,14 @@ _global_script_classes=[ { | |||||
| "path": "res://addons/yarn_spinner/yarn_script.gd" | "path": "res://addons/yarn_spinner/yarn_script.gd" | ||||
| } ] | } ] | ||||
| _global_script_class_icons={ | _global_script_class_icons={ | ||||
| "BaseLevel": "", | |||||
| "BasisInteraction": "", | "BasisInteraction": "", | ||||
| "CharacterData": "", | |||||
| "ChoicesBox": "", | "ChoicesBox": "", | ||||
| "Player": "", | |||||
| "PlayerInfos": "", | |||||
| "SpeechText": "", | "SpeechText": "", | ||||
| "TestLevel": "", | |||||
| "YarnImporter": "", | "YarnImporter": "", | ||||
| "YarnRunner": "", | "YarnRunner": "", | ||||
| "YarnRunnerNode": "", | "YarnRunnerNode": "", | ||||