diff --git a/project.godot b/project.godot index 912855b..3540ebb 100644 --- a/project.godot +++ b/project.godot @@ -28,6 +28,11 @@ run/main_scene="res://scenes/debug_level.tscn" config/features=PackedStringArray("4.3", "Forward Plus") config/icon="res://icon.svg" +[autoload] + +MathUtils="*res://singeltons/MathUtils.gd" +DamageHandler="*res://singeltons/DamageHandler.gd" + [display] window/size/viewport_width=1920 diff --git a/resources/PlayerStats.tres b/resources/PlayerStats.tres new file mode 100644 index 0000000..e006ae7 --- /dev/null +++ b/resources/PlayerStats.tres @@ -0,0 +1,36 @@ +[gd_resource type="Resource" script_class="EntityStats" load_steps=12 format=3 uid="uid://qcjre5wwbrs3"] + +[ext_resource type="Script" path="res://scripts/resources/Stats/ArmorStat.gd" id="1_c7135"] +[ext_resource type="Script" path="res://scripts/resources/Entity/EntityStats.gd" id="1_xti0a"] +[ext_resource type="Script" path="res://scripts/resources/Stats/HealthStat.gd" id="2_hsnpy"] +[ext_resource type="Script" path="res://scripts/resources/Stats/MaxHealthStat.gd" id="3_26tso"] +[ext_resource type="Script" path="res://scripts/resources/Stats/MovementSpeedStat.gd" id="4_goc2a"] +[ext_resource type="Script" path="res://scripts/resources/Stats/ShieldStat.gd" id="6_rncik"] + +[sub_resource type="Resource" id="Resource_vbm44"] +script = ExtResource("1_c7135") +_value = 0 + +[sub_resource type="Resource" id="Resource_nyvlf"] +script = ExtResource("2_hsnpy") +_value = 0 + +[sub_resource type="Resource" id="Resource_pxuuc"] +script = ExtResource("3_26tso") +_value = 10 + +[sub_resource type="Resource" id="Resource_vs6ff"] +script = ExtResource("4_goc2a") +_value = 0 + +[sub_resource type="Resource" id="Resource_r5hb1"] +script = ExtResource("6_rncik") +_value = 0 + +[resource] +script = ExtResource("1_xti0a") +max_health = SubResource("Resource_pxuuc") +health = SubResource("Resource_nyvlf") +armor = SubResource("Resource_vbm44") +shield = SubResource("Resource_r5hb1") +movementSpeed = SubResource("Resource_vs6ff") diff --git a/scenes/debug_level.tscn b/scenes/debug_level.tscn index ce0fe3b..c216810 100644 --- a/scenes/debug_level.tscn +++ b/scenes/debug_level.tscn @@ -9,5 +9,14 @@ shadow_enabled = true [node name="CSGBox3D" type="CSGBox3D" parent="."] transform = Transform3D(0.804543, 0.301369, -0.511748, -0.471444, 0.848123, -0.241718, 0.361179, 0.435734, 0.824431, 0, 0, 0) +[node name="CSGBox3D" type="CSGBox3D" parent="CSGBox3D"] +transform = Transform3D(0.804543, 0.301369, -0.511748, -0.471444, 0.848123, -0.241718, 0.361179, 0.435734, 0.824431, 0, 0, 0) + +[node name="CSGBox3D" type="CSGBox3D" parent="CSGBox3D/CSGBox3D"] +transform = Transform3D(0.804543, 0.301369, -0.511748, -0.471444, 0.848123, -0.241718, 0.361179, 0.435734, 0.824431, 0, 0, 0) + +[node name="CSGBox3D" type="CSGBox3D" parent="CSGBox3D/CSGBox3D/CSGBox3D"] +transform = Transform3D(0.804543, 0.301369, -0.511748, -0.471444, 0.848123, -0.241718, 0.361179, 0.435734, 0.824431, 0, 0, 0) + [node name="Camera3D" type="Camera3D" parent="."] transform = Transform3D(1, 0, 0, 0, 0.901077, 0.433659, 0, -0.433659, 0.901077, 0, 1.21776, 2.12747) diff --git a/scripts/Entites/Enemie.gd b/scripts/Entites/Enemie.gd new file mode 100644 index 0000000..cb1170c --- /dev/null +++ b/scripts/Entites/Enemie.gd @@ -0,0 +1 @@ +class_name Enemie extends Entity diff --git a/scripts/Entites/Entity.gd b/scripts/Entites/Entity.gd new file mode 100644 index 0000000..51e4454 --- /dev/null +++ b/scripts/Entites/Entity.gd @@ -0,0 +1,70 @@ +class_name Entity extends Node3D + + +var stats: EntityStats +var equipments: Array[Equipment] +signal died_event(entity: Entity) + +func init_entity(stats: EntityStats): + self.stats = stats; + +func equip(newEquipment: Equipment)-> void: + equipments.append(newEquipment) + +func unequip(equipmentToRemove: Equipment)-> void: + equipments.erase(equipmentToRemove) + + +func get_health()->int: + return stats.health.value + +func get_shield()->int: + return stats.shield.value + +func reduce_shield(damage: int): + stats.shield.value -= damage + if stats.shield.value <= 0: + stats.shield.value = 0 + +func increase_health(additional_health: int): + stats.health.value += additional_health + if stats.health.value > get_max_health(): + stats.health.value = get_max_health() + +func reduce_health(damage: int): + stats.health.value -= damage + if stats.health.value <= 0: + died() + +func died(): + died_event.emit(self) + +func get_max_health()->int: + var max_health = stats.max_health + for equipment in equipments: + max_health += equipment.get_max_health() + return max_health + +func get_armor()->int: + var armor = stats.armor + for equipment in equipments: + armor += equipment.get_armor() + return armor + +func get_max_Shield()->int: + var shield = stats.shield + for equipment in equipments: + shield += equipment.get_max_shield() + return shield + +func get_movement_speed()->int: + var movement_speed = stats.movement_speed + for equipment in equipments: + movement_speed += equipment.get_evement_speed() + return movement_speed + +func get_damage()->int: + var damage = 0 + for equipment in equipments: + damage += equipment.get_damage() + return damage diff --git a/scripts/Entites/PlayerCharacter.gd b/scripts/Entites/PlayerCharacter.gd new file mode 100644 index 0000000..7dbdc09 --- /dev/null +++ b/scripts/Entites/PlayerCharacter.gd @@ -0,0 +1,19 @@ +class_name PlayerCharacter extends Entity + +var mech: Mech + +func init_player_character(stats: EntityStats, mech: Mech): + init_entity(stats) + self.mech = mech; + +func get_max_health() -> int: + return super() + mech.get_max_health() + +func get_armor() -> int: + return super() + mech.get_armor() + +func get_max_Shield() -> int: + return super() + mech.get_shield() + +func get_movement_speed() -> int: + return super() + mech.get_movement_speed() diff --git a/scripts/Items/Attachment.gd b/scripts/Items/Attachment.gd new file mode 100644 index 0000000..83e6caa --- /dev/null +++ b/scripts/Items/Attachment.gd @@ -0,0 +1,16 @@ +class_name Attachment extends Node3D + + +var stats: AttachmentStats + +func init_attachment(stats: AttachmentStats): + self.stats = stats + +func get_damage()->int: + return stats.damage.value + +func get_fire_rate()->int: + return stats.fire_rate.value + +func get_hit_effects()-> Array[Effect]: + return stats.hit_effects.value diff --git a/scripts/Items/Equipment.gd b/scripts/Items/Equipment.gd new file mode 100644 index 0000000..dc54e33 --- /dev/null +++ b/scripts/Items/Equipment.gd @@ -0,0 +1,22 @@ +class_name Equipment extends Node3D + + +var stats: EquipmentStats + +func init_equipment(stats: EquipmentStats): + self.stats = stats; + +func get_armor()-> int: + return stats.armor.value + +func get_max_health()-> int: + return stats.max_health.value + +func get_max_shield()-> int: + return stats.max_shield.value + +func get_evement_speed()-> int: + return stats.movementSpeed.value + +func get_damage()-> int: + return stats.damage.value diff --git a/scripts/Items/Mech/Arms.gd b/scripts/Items/Mech/Arms.gd new file mode 100644 index 0000000..2cab151 --- /dev/null +++ b/scripts/Items/Mech/Arms.gd @@ -0,0 +1 @@ +class_name Arms extends Equipment diff --git a/scripts/Items/Mech/Boots.gd b/scripts/Items/Mech/Boots.gd new file mode 100644 index 0000000..85d4874 --- /dev/null +++ b/scripts/Items/Mech/Boots.gd @@ -0,0 +1 @@ +class_name Boots extends Equipment diff --git a/scripts/Items/Mech/Hydraulics.gd b/scripts/Items/Mech/Hydraulics.gd new file mode 100644 index 0000000..6ddc3d8 --- /dev/null +++ b/scripts/Items/Mech/Hydraulics.gd @@ -0,0 +1 @@ +class_name Hydraulics extends Equipment diff --git a/scripts/Items/Mech/Mech.gd b/scripts/Items/Mech/Mech.gd new file mode 100644 index 0000000..120ea8e --- /dev/null +++ b/scripts/Items/Mech/Mech.gd @@ -0,0 +1,28 @@ +extends Node3D + +class_name Mech + +var boots: Boots +var arms: Arms +var hydraulics: Hydraulics + + +func init_mech(boots: Boots, arms: Arms, hydraulics: Hydraulics): + self.boots = boots + self.arms = arms + self.hydraulics= hydraulics + +func get_max_health()-> int: + return boots.get_max_health() +arms.get_max_health()+hydraulics.get_max_health() + +func get_armor()-> int: + return boots.get_armor()+arms.get_armor()+hydraulics.get_armor() + +func get_max_shield()-> int: + return boots.get_max_shield()+arms.get_max_shield()+hydraulics.get_max_shield() + +func get_damage()-> int: + return boots.get_damage()+arms.get_damage()+hydraulics.get_damage() + +func get_movement_speed()-> int: + return boots.get_evement_speed()+arms.get_evement_speed()+hydraulics.get_evement_speed() diff --git a/scripts/Items/Weapon.gd b/scripts/Items/Weapon.gd new file mode 100644 index 0000000..142c958 --- /dev/null +++ b/scripts/Items/Weapon.gd @@ -0,0 +1,33 @@ +class_name Weapon extends Node3D + +var stats: WeaponStats +var attachments: Array[Attachment] + +func init_weapon(stats: WeaponStats): + self.stats = stats; + +func attach(newAttachment: Attachment)-> void: + attachments.append(newAttachment) + +func unattach(attachmentToRemove: Attachment)-> void: + attachments.erase(attachmentToRemove) + +func get_damage()->int: + var damage = stats.damage + for attachment in attachments: + damage += attachment.get_damage() + return damage + +func get_fire_rate()->int: + var fire_rate = stats.fire_rate + for attachment in attachments: + fire_rate += attachment.get_fire_rate() + return fire_rate + +func get_hit_effects()-> Array[Effect]: + var hit_effects = [] + hit_effects.append_array(stats.hit_effects.value) + for attachment in attachments: + hit_effects.append_array(attachment.get_hit_effects()) + return hit_effects + diff --git a/scripts/resources/Effects/Effect.gd b/scripts/resources/Effects/Effect.gd new file mode 100644 index 0000000..e20dcdc --- /dev/null +++ b/scripts/resources/Effects/Effect.gd @@ -0,0 +1,6 @@ +extends Resource + +class_name Effect + +func apply_effect (orign_entity: Entity, target_entity: Entity)-> void: + assert(false) diff --git a/scripts/resources/Effects/HealEffect.gd b/scripts/resources/Effects/HealEffect.gd new file mode 100644 index 0000000..9a895fe --- /dev/null +++ b/scripts/resources/Effects/HealEffect.gd @@ -0,0 +1,6 @@ +class_name HealEffect extends Effect + +@export var heal_amount: int + +func apply_effect (orign_entity: Entity, target_entity: Entity)-> void: + target_entity.increase_health(heal_amount) diff --git a/scripts/resources/Entity/EntityResource.gd b/scripts/resources/Entity/EntityResource.gd new file mode 100644 index 0000000..f6bedde --- /dev/null +++ b/scripts/resources/Entity/EntityResource.gd @@ -0,0 +1,13 @@ +extends Resource + +class_name EntityResource + +@export var entity_stats: EntityStats +@export var entity_scene: PackedScene + + +func instantiate(parent: Node3D)->Entity: + var entity_instance = entity_scene.instantiate() as Entity + entity_instance.init_entity(entity_stats) + parent.add_child(entity_instance) + return entity_instance diff --git a/scripts/resources/Entity/EntityStats.gd b/scripts/resources/Entity/EntityStats.gd new file mode 100644 index 0000000..7702801 --- /dev/null +++ b/scripts/resources/Entity/EntityStats.gd @@ -0,0 +1,10 @@ +extends Resource + +class_name EntityStats + +@export var max_health: MaxHealthStat +@export var health: HealthStat +@export var armor: ArmorStat +@export var shield: ShieldStat +@export var max_shield: MaxShieldStat +@export var movementSpeed: MovementSpeedStat diff --git a/scripts/resources/Equipment/EquipmentResource.gd b/scripts/resources/Equipment/EquipmentResource.gd new file mode 100644 index 0000000..577d82b --- /dev/null +++ b/scripts/resources/Equipment/EquipmentResource.gd @@ -0,0 +1,14 @@ +extends Resource + +class_name EquipmentResource + +@export var name: String +@export var equipment_stats: EquipmentStats +@export var equipment_scene: PackedScene + + +func instantiate(parent: Node3D)->Equipment: + var equipment_instance = equipment_scene.instantiate() as Equipment + equipment_instance.init_Equipment(equipment_stats) + parent.add_child(equipment_instance) + return equipment_instance diff --git a/scripts/resources/Equipment/EquipmentStats.gd b/scripts/resources/Equipment/EquipmentStats.gd new file mode 100644 index 0000000..f3f0d8a --- /dev/null +++ b/scripts/resources/Equipment/EquipmentStats.gd @@ -0,0 +1,9 @@ +extends Resource + +class_name EquipmentStats + +@export var max_health: MaxHealthStat +@export var armor: ArmorStat +@export var max_shield: MaxShieldStat +@export var movementSpeed: MovementSpeedStat +@export var damage: DamageStat diff --git a/scripts/resources/Equipment/MechParts/ArmsResource.gd b/scripts/resources/Equipment/MechParts/ArmsResource.gd new file mode 100644 index 0000000..596f127 --- /dev/null +++ b/scripts/resources/Equipment/MechParts/ArmsResource.gd @@ -0,0 +1,3 @@ +extends MechPartResource + +class_name ArmsResource diff --git a/scripts/resources/Equipment/MechParts/BootsResource.gd b/scripts/resources/Equipment/MechParts/BootsResource.gd new file mode 100644 index 0000000..3d7ec04 --- /dev/null +++ b/scripts/resources/Equipment/MechParts/BootsResource.gd @@ -0,0 +1,3 @@ +extends MechPartResource + +class_name BootsResource diff --git a/scripts/resources/Equipment/MechParts/HydraulicsResource.gd b/scripts/resources/Equipment/MechParts/HydraulicsResource.gd new file mode 100644 index 0000000..10d9618 --- /dev/null +++ b/scripts/resources/Equipment/MechParts/HydraulicsResource.gd @@ -0,0 +1,3 @@ +extends MechPartResource + +class_name HydraulicsResource diff --git a/scripts/resources/Equipment/MechParts/MechPartResource.gd b/scripts/resources/Equipment/MechParts/MechPartResource.gd new file mode 100644 index 0000000..032c584 --- /dev/null +++ b/scripts/resources/Equipment/MechParts/MechPartResource.gd @@ -0,0 +1,3 @@ +extends EquipmentResource + +class_name MechPartResource diff --git a/scripts/resources/Stats/ArmorStat.gd b/scripts/resources/Stats/ArmorStat.gd new file mode 100644 index 0000000..be4a43a --- /dev/null +++ b/scripts/resources/Stats/ArmorStat.gd @@ -0,0 +1,13 @@ +extends Resource + +class_name ArmorStat + +signal value_changed_signal(currentArmor: int) + +@export var _value: int +var value: int: + get: + return _value + set(new_value): + value = new_value; + value_changed_signal.emit(_value) diff --git a/scripts/resources/Stats/DamageStat.gd b/scripts/resources/Stats/DamageStat.gd new file mode 100644 index 0000000..387510d --- /dev/null +++ b/scripts/resources/Stats/DamageStat.gd @@ -0,0 +1,13 @@ +extends Resource + +class_name DamageStat + +signal value_changed_signal(currentDamage: int) + +@export var _value: int +var value: int: + get: + return _value + set(new_value): + value = new_value; + value_changed_signal.emit(_value) diff --git a/scripts/resources/Stats/Effects/HitEffectsStat.gd b/scripts/resources/Stats/Effects/HitEffectsStat.gd new file mode 100644 index 0000000..0ddec00 --- /dev/null +++ b/scripts/resources/Stats/Effects/HitEffectsStat.gd @@ -0,0 +1,13 @@ +extends Resource + +class_name HitEffectStat + +signal value_changed_signal(effects: Array[Effect]) + +@export var _value: Array[Effect] +var value: Array[Effect]: + get: + return _value + set(new_value): + value = new_value; + value_changed_signal.emit(_value) diff --git a/scripts/resources/Stats/FireRateStat.gd b/scripts/resources/Stats/FireRateStat.gd new file mode 100644 index 0000000..e5b11b0 --- /dev/null +++ b/scripts/resources/Stats/FireRateStat.gd @@ -0,0 +1,13 @@ +extends Resource + +class_name FireRateStat + +signal value_changed_signal(currentFireRate: int) + +@export var _value: int +var value: int: + get: + return _value + set(new_value): + value = new_value; + value_changed_signal.emit(_value) diff --git a/scripts/resources/Stats/HealthStat.gd b/scripts/resources/Stats/HealthStat.gd new file mode 100644 index 0000000..3d7313e --- /dev/null +++ b/scripts/resources/Stats/HealthStat.gd @@ -0,0 +1,13 @@ +extends Resource + +class_name HealthStat + +signal value_changed_signal(currentHealth: int) + +@export var _value: int +var value: int: + get: + return _value + set(new_value): + value = new_value; + value_changed_signal.emit(_value) diff --git a/scripts/resources/Stats/MaxHealthStat.gd b/scripts/resources/Stats/MaxHealthStat.gd new file mode 100644 index 0000000..568e6f7 --- /dev/null +++ b/scripts/resources/Stats/MaxHealthStat.gd @@ -0,0 +1,13 @@ +extends Resource + +class_name MaxHealthStat + +signal value_changed_signal(currentMaxHealth: int) + +@export var _value: int +var value: int: + get: + return _value + set(new_value): + value = new_value; + value_changed_signal.emit(_value) diff --git a/scripts/resources/Stats/MaxShieldStat.gd b/scripts/resources/Stats/MaxShieldStat.gd new file mode 100644 index 0000000..74fc1a4 --- /dev/null +++ b/scripts/resources/Stats/MaxShieldStat.gd @@ -0,0 +1,13 @@ +extends Resource + +class_name MaxShieldStat + +signal value_changed_signal(currentMaxShield: int) + +@export var _value: int +var value: int: + get: + return _value + set(new_value): + value = new_value; + value_changed_signal.emit(_value) diff --git a/scripts/resources/Stats/MovementSpeedStat.gd b/scripts/resources/Stats/MovementSpeedStat.gd new file mode 100644 index 0000000..9c59140 --- /dev/null +++ b/scripts/resources/Stats/MovementSpeedStat.gd @@ -0,0 +1,13 @@ +extends Resource + +class_name MovementSpeedStat + +signal value_changed_signal(currentMovementSpeed: int) + +@export var _value: int +var value: int: + get: + return _value + set(new_value): + value = new_value; + value_changed_signal.emit(_value) diff --git a/scripts/resources/Stats/ShieldStat.gd b/scripts/resources/Stats/ShieldStat.gd new file mode 100644 index 0000000..dcf9a8a --- /dev/null +++ b/scripts/resources/Stats/ShieldStat.gd @@ -0,0 +1,13 @@ +extends Resource + +class_name ShieldStat + +signal value_changed_signal(currentShield: int) + +@export var _value: int +var value: int: + get: + return _value + set(new_value): + value = new_value; + value_changed_signal.emit(_value) diff --git a/scripts/resources/Weapons/Attachments/AttachmentResource.gd b/scripts/resources/Weapons/Attachments/AttachmentResource.gd new file mode 100644 index 0000000..8d92b32 --- /dev/null +++ b/scripts/resources/Weapons/Attachments/AttachmentResource.gd @@ -0,0 +1,13 @@ +extends Resource + +class_name AttachmentResource + +@export var attachment_stats: AttachmentStats +@export var attachment_scene: PackedScene + + +func instantiate(parent: Node3D)->Attachment: + var attachment_instance = attachment_scene.instantiate() as Attachment + attachment_instance.init_Attachment(attachment_stats) + parent.add_child(attachment_instance) + return attachment_instance diff --git a/scripts/resources/Weapons/Attachments/AttachmentStats.gd b/scripts/resources/Weapons/Attachments/AttachmentStats.gd new file mode 100644 index 0000000..121616f --- /dev/null +++ b/scripts/resources/Weapons/Attachments/AttachmentStats.gd @@ -0,0 +1,7 @@ +extends Resource + +class_name AttachmentStats + +@export var damage: DamageStat +@export var fire_rate: FireRateStat +@export var hit_effects: HitEffectStat diff --git a/scripts/resources/Weapons/WeaponResource.gd b/scripts/resources/Weapons/WeaponResource.gd new file mode 100644 index 0000000..699ca7c --- /dev/null +++ b/scripts/resources/Weapons/WeaponResource.gd @@ -0,0 +1,13 @@ +extends Resource + +class_name WeaponResource + +@export var name: String +@export var weapon_stats: WeaponStats +@export var weapon_scene: PackedScene + +func instantiate(parent: Node3D)->Weapon: + var weapon_instance = weapon_scene.instantiate() as Weapon + weapon_instance.init_weapon(weapon_stats) + parent.add_child(weapon_instance) + return weapon_instance diff --git a/scripts/resources/Weapons/WeaponStats.gd b/scripts/resources/Weapons/WeaponStats.gd new file mode 100644 index 0000000..c7e7795 --- /dev/null +++ b/scripts/resources/Weapons/WeaponStats.gd @@ -0,0 +1,8 @@ +extends Resource + +class_name WeaponStats + + +@export var damage: DamageStat +@export var fire_rate: FireRateStat +@export var hit_effects: HitEffectStat diff --git a/singeltons/DamageHandler.gd b/singeltons/DamageHandler.gd new file mode 100644 index 0000000..3d9c01c --- /dev/null +++ b/singeltons/DamageHandler.gd @@ -0,0 +1,20 @@ +extends Object + +func apply_damage(damage_dealer: Entity, damage_receiver: Entity, weapon: Weapon ): + var damage = weapon.get_damage() + damage_dealer.get_damage() + var armor = damage_receiver.get_armor() + var damage_percent = 90*( pow(MathUtils.e, 0.03*armor)) + + var damage_after_armor = damage * damage_percent + if damage_after_armor < 1 : + damage_after_armor = 1 + + var shield = damage_receiver.get_shield() + if shield > 0: + damage_receiver.reduce_shield(damage_after_armor) + else: + damage_receiver.reduce_health(damage_after_armor) + + for effect in weapon.get_hit_effects(): + effect.apply_effect(damage_dealer,damage_receiver) + diff --git a/singeltons/MathUtils.gd b/singeltons/MathUtils.gd new file mode 100644 index 0000000..b264afd --- /dev/null +++ b/singeltons/MathUtils.gd @@ -0,0 +1,3 @@ +extends Object + +var e = 2.718281828459045235360287471352