@@ -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": "", | ||||