Tweaks for setting weather

This commit is contained in:
2025-03-08 10:26:45 +01:00
parent a6c73a9c04
commit 8f262cb4a6
8 changed files with 114 additions and 28 deletions

View File

@@ -106,9 +106,16 @@ public interface IBattle : IScriptSource, IDeepCloneable
bool TrySetChoice(ITurnChoice choice);
/// <summary>
/// Sets the current weather for the battle. If null is passed, this clears the weather.
/// The script that handles the current weather of the battle.
/// </summary>
void SetWeather(StringKey? weatherName);
IReadOnlyScriptContainer WeatherScript { get; }
/// <summary>
/// Sets the current weather for the battle. If null is passed, this clears the weather.
/// A duration can be passed to set the duration of the weather in turns. This duration can be modified by
/// other scripts before the weather is set through the <see cref="Script.ChangeWeatherDuration"/> script hook.
/// </summary>
bool SetWeather(StringKey? weatherName, int duration);
public IScriptSet Volatile { get; }
@@ -343,28 +350,37 @@ public class BattleImpl : ScriptSource, IBattle
EventHook.Invoke(new EndTurnEvent());
}
private readonly ScriptContainer _weatherScript = new();
private ScriptContainer _weatherScript = new();
public IReadOnlyScriptContainer WeatherScript => _weatherScript;
/// <inheritdoc />
public void SetWeather(StringKey? weatherName)
public bool SetWeather(StringKey? weatherName, int duration)
{
if (weatherName.HasValue)
{
if (!Library.ScriptResolver.TryResolve(ScriptCategory.Weather, weatherName.Value, null, out var script))
throw new InvalidOperationException($"Weather script {weatherName} not found.");
if (script is IWeatherScript weatherScript)
{
this.RunScriptHook(x => x.ChangeWeatherDuration(weatherName.Value, ref duration));
weatherScript.SetTurns(duration);
}
_weatherScript.Set(script);
}
else
{
_weatherScript.Clear();
}
return true;
// TODO: Trigger weather change script hooks
}
public IScriptSet Volatile { get; } = new ScriptSet();
/// <inheritdoc />
public StringKey? WeatherName => _weatherScript.Script?.Name;
public StringKey? WeatherName => WeatherScript.Script?.Name;
private readonly ScriptContainer _terrainScript = new();
@@ -415,7 +431,7 @@ public class BattleImpl : ScriptSource, IBattle
/// <inheritdoc />
public override void GetOwnScripts(List<IEnumerable<ScriptContainer>> scripts)
{
scripts.Add(_weatherScript);
scripts.Add(WeatherScript);
scripts.Add(_terrainScript);
scripts.Add(Volatile);
}