droppable items and win

This commit is contained in:
Rendo 2025-07-20 22:11:23 +05:00
commit 5bdbfa4d82
47 changed files with 820 additions and 85 deletions

View file

@ -9,7 +9,10 @@ namespace Newlon;
public partial class LevelController : Node
{
const string REWARD_SCENE_UID = "uid://cwck7e1tt057k";
public static LevelController Instance { get; private set; }
public RewardResource Reward { get; private set; }
private string pathToInitiator;
private bool _isLevelRunning = false;
@ -17,7 +20,7 @@ public partial class LevelController : Node
{
Instance = this;
}
public override void _ExitTree()
{
Instance = null;
@ -31,12 +34,13 @@ public partial class LevelController : Node
{
if (_isLevelRunning)
return;
pathToInitiator = GetTree().CurrentScene.SceneFilePath;
RuntimeLevelData.LevelResource = levelResource;
GetTree().ChangeSceneToPacked(levelTileset);
_isLevelRunning = true;
}
public void RestartLevel()
@ -49,8 +53,32 @@ public partial class LevelController : Node
{
if (_isLevelRunning == false)
return;
RuntimeLevelData.LevelResource = null;
_isLevelRunning = false;
if (Reward != null)
{
GetTree().ChangeSceneToFile(REWARD_SCENE_UID);
}
else
{
ReturnToInitiator();
}
}
public void ReturnToInitiator()
{
if (pathToInitiator == null) return;
GetTree().ChangeSceneToFile(pathToInitiator);
pathToInitiator = null;
}
public void SetReward(RewardResource reward)
{
Reward = reward;
}
}

View file

@ -13,9 +13,12 @@ public partial class LevelRunner : Node
public float waveHealth = 0;
public float waveHealthMax = 0;
public List<RuntimeZombieData> zombies = [];
[Export] private MoneyReward defaultReward;
[Export] private RowSpawner rowSpawner;
[Export] private Timer waveTimer;
[Export] private float approachNotificationTime;
[Export] private AnimationPlayer player;
[Export] private Node rewardParent;
[Signal] public delegate void ResourceChangedEventHandler(AdventureLevelResource resource);
[Signal] public delegate void WaveChangedEventHandler(int to);
[Signal] public delegate void HugeWaveApproachingCallbackEventHandler();
@ -59,7 +62,7 @@ public partial class LevelRunner : Node
rowSpawner.Add(resource.waves[waveIndex].zombiesOrdered);
ClearZombies();
if (waveIndex == resource.waves.Count - 1)
{
EmitSignal(SignalName.FinalWaveInitiated);
@ -110,18 +113,46 @@ public partial class LevelRunner : Node
waveHealthMax += zombie.GetMaxHPMixed();
waveHealth = waveHealthMax;
zombie.HPChangedMixed += OnHPChanged;
if (waveIndex == resource.waves.Count - 1)
{
zombie.HasBeenKilled += (who) =>
{
if (waveHealth <= 0)
{
RuntimeLevelData.Instance.SetLevelState(RuntimeLevelData.LevelStates.Win);
}
};
zombie.HasBeenKilled += OnLastZombieKilled;
}
}
private void OnLastZombieKilled(RuntimeZombieData who)
{
if (waveHealth > 0) return;
RuntimeLevelData.Instance.SetLevelState(RuntimeLevelData.LevelStates.Win);
var reward = resource.reward.Scene.Instantiate<DroppableItem>();
if (reward is DroppableSeedpacket seedpacket && resource.reward is PlantReward plantReward)
{
seedpacket.plant = plantReward.Plant;
}
LevelController.Instance.SetReward(resource.reward);
player.Play("win");
Callable.From(() =>
{
rewardParent.AddChild(reward);
reward.GlobalPosition = who.GlobalPosition + Vector2.Up * FieldParams.TileHeight * 0.5f;
var dropmover = new DropMover();
reward.AddChild(dropmover);
}).CallDeferred();
reward.PickedUp += () =>
{
var tween = CreateTween();
var camera = GetViewport().GetCamera2D();
tween.TweenProperty(reward, "global_position", camera.GlobalPosition, 4.0);
tween.Parallel().TweenProperty(reward, "global_scale", new Vector2(3.0f, 3.0f), 4.0);
tween.TweenInterval(1.0);
tween.TweenCallback(Callable.From(LevelController.Instance.EndLevel));
reward.InputPickable = false;
};
}
}

View file

@ -20,7 +20,7 @@ public partial class LoseCheckbox : Area2D
if (zombieData.HP <= 0) return;
RuntimeLevelData.Instance.SetLevelState(RuntimeLevelData.LevelStates.Loose);
Engine.TimeScale = 1.0;
fadeAnimation.Play("fade");
fadeAnimation.Play("loose");
GetTree().Paused = true;
PhysicsServer2D.SetActive(true);
Callable.From(()=>