| @@ -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/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/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/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/_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/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] | |||
| [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="."] | |||
| 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="."] | |||
| @@ -435,5 +430,3 @@ anchor_bottom = 1.0 | |||
| margin_left = 0.0319824 | |||
| margin_right = -50.0 | |||
| alignment = 1 | |||
| [editable path="Player"] | |||
| @@ -1,7 +1,7 @@ | |||
| [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/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] | |||
| 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 | |||
| # 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 lastAttackTime : int = 0 | |||
| # physics | |||
| var airborneSpeed : float = 3.0 | |||
| var walkSpeed : float = 5.0 | |||
| @@ -23,14 +18,6 @@ var vel := Vector3() | |||
| onready var camera = get_node("CameraOrbit") | |||
| onready var interactCast = get_node("InteractRayCast") | |||
| 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): | |||
| # attack input | |||
| @@ -99,19 +86,16 @@ func _physics_process (delta): | |||
| # called when we collect a coin | |||
| func give_gold (amount): | |||
| var gold = Controller.player_infos.gold | |||
| gold += amount | |||
| # update the UI | |||
| ui.update_gold_text(gold) | |||
| Controller.player_infos.gold = gold | |||
| # called when an enemy deals damage to us | |||
| 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 curHp <= 0: | |||
| if Controller.player_infos.curHp <= 0: | |||
| die() | |||
| # called when our health reaches 0 | |||
| @@ -142,7 +126,6 @@ func die (): | |||
| # called when we press the interact button | |||
| func try_interact(): | |||
| # is the ray cast colliding with an enemy? | |||
| if interactCast.is_colliding(): | |||
| # 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 | |||
| var player_infos := PlayerInfos.new() | |||
| var player_input_enabled := true setget player_input_enabled_set | |||
| 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 | |||
| 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 | |||
| func update_health_bar (curHp, maxHp): | |||
| func update_health_bar (curHp): | |||
| fetch_components() | |||
| var maxHp : int = Controller.player_infos.maxHp | |||
| healthBar.value = (100 / maxHp) * curHp | |||
| # called when our gold changes | |||
| @@ -10,20 +10,45 @@ config_version=4 | |||
| _global_script_classes=[ { | |||
| "base": "Node", | |||
| "class": "BaseLevel", | |||
| "language": "GDScript", | |||
| "path": "res://jrpg/scripts/levels/base_level.gd" | |||
| }, { | |||
| "base": "Node", | |||
| "class": "BasisInteraction", | |||
| "language": "GDScript", | |||
| "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", | |||
| "class": "ChoicesBox", | |||
| "language": "GDScript", | |||
| "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", | |||
| "class": "SpeechText", | |||
| "language": "GDScript", | |||
| "path": "res://jrpg/scripts/ui/speech_text.gd" | |||
| }, { | |||
| "base": "BaseLevel", | |||
| "class": "TestLevel", | |||
| "language": "GDScript", | |||
| "path": "res://jrpg/scripts/misc/test_level.gd" | |||
| }, { | |||
| "base": "Node", | |||
| "class": "YarnImporter", | |||
| "language": "GDScript", | |||
| @@ -45,9 +70,14 @@ _global_script_classes=[ { | |||
| "path": "res://addons/yarn_spinner/yarn_script.gd" | |||
| } ] | |||
| _global_script_class_icons={ | |||
| "BaseLevel": "", | |||
| "BasisInteraction": "", | |||
| "CharacterData": "", | |||
| "ChoicesBox": "", | |||
| "Player": "", | |||
| "PlayerInfos": "", | |||
| "SpeechText": "", | |||
| "TestLevel": "", | |||
| "YarnImporter": "", | |||
| "YarnRunner": "", | |||
| "YarnRunnerNode": "", | |||