Sine Morphization implementation
This commit is contained in:
@@ -2,8 +2,8 @@
|
|||||||
state "AppLogic State" as GameJamDungeon_AppLogic_State {
|
state "AppLogic State" as GameJamDungeon_AppLogic_State {
|
||||||
state "SetupGameScene" as GameJamDungeon_AppLogic_State_SetupGameScene
|
state "SetupGameScene" as GameJamDungeon_AppLogic_State_SetupGameScene
|
||||||
state "InGame" as GameJamDungeon_AppLogic_State_InGame
|
state "InGame" as GameJamDungeon_AppLogic_State_InGame
|
||||||
state "MainMenu" as GameJamDungeon_AppLogic_State_MainMenu
|
|
||||||
state "LoadingScreen" as GameJamDungeon_AppLogic_State_LoadingScreen
|
state "LoadingScreen" as GameJamDungeon_AppLogic_State_LoadingScreen
|
||||||
|
state "MainMenu" as GameJamDungeon_AppLogic_State_MainMenu
|
||||||
}
|
}
|
||||||
|
|
||||||
GameJamDungeon_AppLogic_State_InGame --> GameJamDungeon_AppLogic_State_MainMenu : GameOver
|
GameJamDungeon_AppLogic_State_InGame --> GameJamDungeon_AppLogic_State_MainMenu : GameOver
|
||||||
|
|||||||
@@ -168,7 +168,7 @@ public partial class Enemy : CharacterBody3D, IEnemy, IProvide<IEnemyLogic>
|
|||||||
_attackTimer.Timeout -= OnAttackTimeout;
|
_attackTimer.Timeout -= OnAttackTimeout;
|
||||||
}
|
}
|
||||||
|
|
||||||
public Vector3 EnemyGlobalPosition => GlobalPosition;
|
public Vector3 GetEnemyGlobalPosition() => GlobalPosition;
|
||||||
|
|
||||||
public void SetEnemyGlobalPosition(Vector3 target)
|
public void SetEnemyGlobalPosition(Vector3 target)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -22,5 +22,7 @@ public interface IEnemy : IKillable
|
|||||||
|
|
||||||
public void SetEnemyGlobalPosition(Vector3 target);
|
public void SetEnemyGlobalPosition(Vector3 target);
|
||||||
|
|
||||||
|
public Vector3 GetEnemyGlobalPosition();
|
||||||
|
|
||||||
public IDungeonRoom GetCurrentRoom();
|
public IDungeonRoom GetCurrentRoom();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -24,13 +24,15 @@ DropsSoulGemChance = 0.75
|
|||||||
metadata/_custom_type_script = ExtResource("2_oln85")
|
metadata/_custom_type_script = ExtResource("2_oln85")
|
||||||
|
|
||||||
[sub_resource type="CapsuleShape3D" id="CapsuleShape3D_cwfph"]
|
[sub_resource type="CapsuleShape3D" id="CapsuleShape3D_cwfph"]
|
||||||
|
radius = 0.106078
|
||||||
|
height = 1.23076
|
||||||
|
|
||||||
[sub_resource type="CylinderShape3D" id="CylinderShape3D_jbgmx"]
|
[sub_resource type="CylinderShape3D" id="CylinderShape3D_jbgmx"]
|
||||||
height = 5.0
|
height = 5.0
|
||||||
radius = 1.0
|
radius = 1.0
|
||||||
|
|
||||||
[sub_resource type="SphereShape3D" id="SphereShape3D_8vcnq"]
|
[sub_resource type="SphereShape3D" id="SphereShape3D_8vcnq"]
|
||||||
radius = 1.20703
|
radius = 0.762524
|
||||||
|
|
||||||
[node name="Sproingy" type="CharacterBody3D"]
|
[node name="Sproingy" type="CharacterBody3D"]
|
||||||
process_mode = 1
|
process_mode = 1
|
||||||
|
|||||||
@@ -693,6 +693,7 @@ script = ExtResource("1_oh25a")
|
|||||||
|
|
||||||
[node name="Sprite3D" type="Sprite3D" parent="."]
|
[node name="Sprite3D" type="Sprite3D" parent="."]
|
||||||
transform = Transform3D(1.5, 0, 0, 0, 1.5, 0, 0, 0, 1.5, 0, 0, 0)
|
transform = Transform3D(1.5, 0, 0, 0, 1.5, 0, 0, 0, 1.5, 0, 0, 0)
|
||||||
|
pixel_size = 0.003
|
||||||
billboard = 2
|
billboard = 2
|
||||||
alpha_cut = 1
|
alpha_cut = 1
|
||||||
texture_filter = 0
|
texture_filter = 0
|
||||||
|
|||||||
@@ -2,8 +2,8 @@
|
|||||||
state "EnemyLogic State" as GameJamDungeon_EnemyLogic_State {
|
state "EnemyLogic State" as GameJamDungeon_EnemyLogic_State {
|
||||||
state "Alive" as GameJamDungeon_EnemyLogic_State_Alive {
|
state "Alive" as GameJamDungeon_EnemyLogic_State_Alive {
|
||||||
state "Activated" as GameJamDungeon_EnemyLogic_State_Activated {
|
state "Activated" as GameJamDungeon_EnemyLogic_State_Activated {
|
||||||
state "FollowPlayer" as GameJamDungeon_EnemyLogic_State_FollowPlayer
|
|
||||||
state "Attacking" as GameJamDungeon_EnemyLogic_State_Attacking
|
state "Attacking" as GameJamDungeon_EnemyLogic_State_Attacking
|
||||||
|
state "FollowPlayer" as GameJamDungeon_EnemyLogic_State_FollowPlayer
|
||||||
state "Patrolling" as GameJamDungeon_EnemyLogic_State_Patrolling
|
state "Patrolling" as GameJamDungeon_EnemyLogic_State_Patrolling
|
||||||
}
|
}
|
||||||
state "Idle" as GameJamDungeon_EnemyLogic_State_Idle
|
state "Idle" as GameJamDungeon_EnemyLogic_State_Idle
|
||||||
|
|||||||
@@ -5,7 +5,6 @@ using Chickensoft.AutoInject;
|
|||||||
using Chickensoft.Introspection;
|
using Chickensoft.Introspection;
|
||||||
using Godot;
|
using Godot;
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Immutable;
|
|
||||||
using static GameJamDungeon.GameLogic.State;
|
using static GameJamDungeon.GameLogic.State;
|
||||||
|
|
||||||
[Meta(typeof(IAutoNode))]
|
[Meta(typeof(IAutoNode))]
|
||||||
@@ -188,7 +187,6 @@ public partial class Game : Node3D, IGame
|
|||||||
public void EnemyDefeated(Vector3 defeatedLocation, EnemyStatResource resource)
|
public void EnemyDefeated(Vector3 defeatedLocation, EnemyStatResource resource)
|
||||||
{
|
{
|
||||||
Player.GainExp(resource.ExpFromDefeat * GameRepo.EXPRate);
|
Player.GainExp(resource.ExpFromDefeat * GameRepo.EXPRate);
|
||||||
DropRestorative(defeatedLocation);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void DropRestorative(Vector3 vector)
|
private void DropRestorative(Vector3 vector)
|
||||||
|
|||||||
@@ -2,12 +2,12 @@
|
|||||||
state "GameLogic State" as GameJamDungeon_GameLogic_State {
|
state "GameLogic State" as GameJamDungeon_GameLogic_State {
|
||||||
state "GameStarted" as GameJamDungeon_GameLogic_State_GameStarted
|
state "GameStarted" as GameJamDungeon_GameLogic_State_GameStarted
|
||||||
state "Playing" as GameJamDungeon_GameLogic_State_Playing {
|
state "Playing" as GameJamDungeon_GameLogic_State_Playing {
|
||||||
state "FloorClearedDecisionState" as GameJamDungeon_GameLogic_State_FloorClearedDecisionState
|
|
||||||
state "Paused" as GameJamDungeon_GameLogic_State_Paused
|
|
||||||
state "AskForTeleport" as GameJamDungeon_GameLogic_State_AskForTeleport
|
state "AskForTeleport" as GameJamDungeon_GameLogic_State_AskForTeleport
|
||||||
state "Resuming" as GameJamDungeon_GameLogic_State_Resuming
|
state "FloorClearedDecisionState" as GameJamDungeon_GameLogic_State_FloorClearedDecisionState
|
||||||
state "MinimapOpen" as GameJamDungeon_GameLogic_State_MinimapOpen
|
|
||||||
state "InventoryOpened" as GameJamDungeon_GameLogic_State_InventoryOpened
|
state "InventoryOpened" as GameJamDungeon_GameLogic_State_InventoryOpened
|
||||||
|
state "MinimapOpen" as GameJamDungeon_GameLogic_State_MinimapOpen
|
||||||
|
state "Paused" as GameJamDungeon_GameLogic_State_Paused
|
||||||
|
state "Resuming" as GameJamDungeon_GameLogic_State_Resuming
|
||||||
}
|
}
|
||||||
state "Quit" as GameJamDungeon_GameLogic_State_Quit
|
state "Quit" as GameJamDungeon_GameLogic_State_Quit
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -6,7 +6,6 @@
|
|||||||
size = Vector3(0.778381, 0.929947, 0.731567)
|
size = Vector3(0.778381, 0.929947, 0.731567)
|
||||||
|
|
||||||
[node name="ConsumableItem" type="Node3D"]
|
[node name="ConsumableItem" type="Node3D"]
|
||||||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, -1.75, 0)
|
|
||||||
script = ExtResource("1_26bad")
|
script = ExtResource("1_26bad")
|
||||||
|
|
||||||
[node name="Pickup" type="Area3D" parent="."]
|
[node name="Pickup" type="Area3D" parent="."]
|
||||||
@@ -17,7 +16,7 @@ collision_mask = 4
|
|||||||
[node name="Sprite" type="Sprite3D" parent="Pickup"]
|
[node name="Sprite" type="Sprite3D" parent="Pickup"]
|
||||||
unique_name_in_owner = true
|
unique_name_in_owner = true
|
||||||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, -0.0322805, 0)
|
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, -0.0322805, 0)
|
||||||
pixel_size = 0.0015
|
pixel_size = 0.001
|
||||||
billboard = 2
|
billboard = 2
|
||||||
shaded = true
|
shaded = true
|
||||||
double_sided = false
|
double_sided = false
|
||||||
|
|||||||
@@ -45,6 +45,8 @@ public partial class EffectItem : Node3D, IUsableItem
|
|||||||
TeleportEnemiesToCurrentRoom();
|
TeleportEnemiesToCurrentRoom();
|
||||||
if (_effectItemStats.UsableItemTags.Contains(UsableItemTag.KillHalfEnemiesInRoom))
|
if (_effectItemStats.UsableItemTags.Contains(UsableItemTag.KillHalfEnemiesInRoom))
|
||||||
KillHalfEnemiesInRoom();
|
KillHalfEnemiesInRoom();
|
||||||
|
if (_effectItemStats.UsableItemTags.Contains(UsableItemTag.TurnAllEnemiesIntoHealingItem))
|
||||||
|
TurnAllEnemiesInRoomIntoHealingItem();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void SetItemStats(InventoryItemStats inventoryItemStats)
|
public void SetItemStats(InventoryItemStats inventoryItemStats)
|
||||||
@@ -101,8 +103,32 @@ public partial class EffectItem : Node3D, IUsableItem
|
|||||||
var enemyList = currentMonsterRoom.GetEnemiesInCurrentRoom().ToList();
|
var enemyList = currentMonsterRoom.GetEnemiesInCurrentRoom().ToList();
|
||||||
var enemiesToKill = enemyList.Count / 2;
|
var enemiesToKill = enemyList.Count / 2;
|
||||||
for (var i = 0; i < enemiesToKill; i++)
|
for (var i = 0; i < enemiesToKill; i++)
|
||||||
{
|
|
||||||
enemyList[i].Die();
|
enemyList[i].Die();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void TurnAllEnemiesInRoomIntoHealingItem()
|
||||||
|
{
|
||||||
|
var currentRoom = Player.GetCurrentRoom();
|
||||||
|
var currentEnemies = currentRoom.EnemiesInRoom;
|
||||||
|
foreach (var enemy in currentEnemies)
|
||||||
|
{
|
||||||
|
enemy.Die();
|
||||||
|
DropHealingItem(enemy.GetEnemyGlobalPosition());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void DropHealingItem(Vector3 vector)
|
||||||
|
{
|
||||||
|
var consumableFolder = "res://src/items/consumable";
|
||||||
|
var restorativeScene = GD.Load<PackedScene>($"{consumableFolder}/ConsumableItem.tscn");
|
||||||
|
var consumable = restorativeScene.Instantiate<ConsumableItem>();
|
||||||
|
var resourceFiles = DirAccess.GetFilesAt($"{consumableFolder}/resources");
|
||||||
|
var rng = new RandomNumberGenerator();
|
||||||
|
rng.Randomize();
|
||||||
|
var randomResource = resourceFiles[rng.RandiRange(0, resourceFiles.Length - 1)];
|
||||||
|
var randomFile = ResourceLoader.Load<ConsumableItemStats>($"{consumableFolder}/resources/{randomResource}");
|
||||||
|
consumable.SetItemStats(randomFile);
|
||||||
|
Game.AddChild(consumable);
|
||||||
|
consumable.GlobalPosition = vector;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
18
src/items/effect/resources/SineMorphization.tres
Normal file
18
src/items/effect/resources/SineMorphization.tres
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
[gd_resource type="Resource" script_class="EffectItemStats" load_steps=3 format=3 uid="uid://cwh5w1yabwrxf"]
|
||||||
|
|
||||||
|
[ext_resource type="Script" uid="uid://b5w4iw4iqmxtn" path="res://src/items/effect/EffectItemStats.cs" id="1_ksb1c"]
|
||||||
|
[ext_resource type="Texture2D" uid="uid://c7v5pm32sedkg" path="res://src/items/effect/textures/entropic seal.PNG" id="1_vqhky"]
|
||||||
|
|
||||||
|
[resource]
|
||||||
|
script = ExtResource("1_ksb1c")
|
||||||
|
UsableItemTags = Array[int]([5])
|
||||||
|
Name = "Sine Morphization"
|
||||||
|
Description = "Turns all enemies in room to healing item."
|
||||||
|
Texture = ExtResource("1_vqhky")
|
||||||
|
SpawnRate = 0.5
|
||||||
|
ThrowSpeed = 12.0
|
||||||
|
HealHPAmount = 0
|
||||||
|
HealVTAmount = 0
|
||||||
|
ThrowDamage = 5
|
||||||
|
ItemTags = Array[int]([])
|
||||||
|
metadata/_custom_type_script = "uid://b5w4iw4iqmxtn"
|
||||||
@@ -16,7 +16,7 @@
|
|||||||
[ext_resource type="Texture2D" uid="uid://4k6vtn4oip5f" path="res://src/map/dungeon/models/Set A/02. Altar/02_ALTAR_FLOOR_ZER0_VER_TILE4.png" id="14_qqc7i"]
|
[ext_resource type="Texture2D" uid="uid://4k6vtn4oip5f" path="res://src/map/dungeon/models/Set A/02. Altar/02_ALTAR_FLOOR_ZER0_VER_TILE4.png" id="14_qqc7i"]
|
||||||
[ext_resource type="Texture2D" uid="uid://cururtxtgylxf" path="res://src/map/dungeon/models/Set A/02. Altar/02_ALTAR_FLOOR_ZER0_VER_COLUMN.jpg" id="15_ojbcg"]
|
[ext_resource type="Texture2D" uid="uid://cururtxtgylxf" path="res://src/map/dungeon/models/Set A/02. Altar/02_ALTAR_FLOOR_ZER0_VER_COLUMN.jpg" id="15_ojbcg"]
|
||||||
[ext_resource type="PackedScene" uid="uid://d0pl1n1jf77jm" path="res://src/items/effect/EffectItem.tscn" id="16_aqomv"]
|
[ext_resource type="PackedScene" uid="uid://d0pl1n1jf77jm" path="res://src/items/effect/EffectItem.tscn" id="16_aqomv"]
|
||||||
[ext_resource type="Resource" uid="uid://cxfu683mhpu6v" path="res://src/items/effect/resources/DevicBalance.tres" id="17_db2o3"]
|
[ext_resource type="Resource" uid="uid://cwh5w1yabwrxf" path="res://src/items/effect/resources/SineMorphization.tres" id="17_db2o3"]
|
||||||
[ext_resource type="Resource" uid="uid://bptg6eybj5dxk" path="res://src/items/effect/resources/DevicRecall.tres" id="18_ntxe5"]
|
[ext_resource type="Resource" uid="uid://bptg6eybj5dxk" path="res://src/items/effect/resources/DevicRecall.tres" id="18_ntxe5"]
|
||||||
|
|
||||||
[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_3ubi4"]
|
[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_3ubi4"]
|
||||||
|
|||||||
@@ -1,11 +1,11 @@
|
|||||||
@startuml PlayerLogic
|
@startuml PlayerLogic
|
||||||
state "PlayerLogic State" as GameJamDungeon_PlayerLogic_State {
|
state "PlayerLogic State" as GameJamDungeon_PlayerLogic_State {
|
||||||
state "Disabled" as GameJamDungeon_PlayerLogic_State_Disabled
|
|
||||||
state "Alive" as GameJamDungeon_PlayerLogic_State_Alive {
|
state "Alive" as GameJamDungeon_PlayerLogic_State_Alive {
|
||||||
state "Idle" as GameJamDungeon_PlayerLogic_State_Idle
|
|
||||||
state "Attacking" as GameJamDungeon_PlayerLogic_State_Attacking
|
state "Attacking" as GameJamDungeon_PlayerLogic_State_Attacking
|
||||||
|
state "Idle" as GameJamDungeon_PlayerLogic_State_Idle
|
||||||
}
|
}
|
||||||
state "Dead" as GameJamDungeon_PlayerLogic_State_Dead
|
state "Dead" as GameJamDungeon_PlayerLogic_State_Dead
|
||||||
|
state "Disabled" as GameJamDungeon_PlayerLogic_State_Disabled
|
||||||
}
|
}
|
||||||
|
|
||||||
GameJamDungeon_PlayerLogic_State_Alive --> GameJamDungeon_PlayerLogic_State_Alive : PhysicsTick
|
GameJamDungeon_PlayerLogic_State_Alive --> GameJamDungeon_PlayerLogic_State_Alive : PhysicsTick
|
||||||
|
|||||||
Reference in New Issue
Block a user