LADXHD/InGame/Overlay/DialogPath.cs
2023-12-14 17:21:22 -05:00

859 lines
25 KiB
C#

using System.Collections.Generic;
using Microsoft.Xna.Framework;
using ProjectZ.InGame.GameObjects.Things;
using ProjectZ.InGame.GameSystems;
using ProjectZ.InGame.Map;
using ProjectZ.InGame.SaveLoad;
using ProjectZ.InGame.Things;
namespace ProjectZ.InGame.Overlay
{
class DialogAction
{
public virtual void Init() { }
public virtual bool Execute()
{
return true;
}
}
class DialogActionStartDialog : DialogAction
{
private readonly string _key;
public DialogActionStartDialog(string key)
{
_key = key;
}
public override bool Execute()
{
if (Game1.GameManager.InGameOverlay.TextboxOverlay.IsOpen)
return false;
Game1.GameManager.StartDialog(_key);
return true;
}
}
class DialogActionStartPath : DialogAction
{
private readonly string _key;
public DialogActionStartPath(string key)
{
_key = key;
}
public override bool Execute()
{
if (Game1.GameManager.InGameOverlay.TextboxOverlay.IsOpen)
return false;
// add the dialog path as the first element to be executed directly after this dialog
Game1.GameManager.AddFirstDialogPath(_key);
return true;
}
}
class DialogActionDialog : DialogAction
{
private readonly string _key;
private readonly string _choiceKey;
private readonly string[] _choicesKeys;
public DialogActionDialog(string key, string choiceKey, params string[] choices)
{
_key = key;
_choiceKey = choiceKey;
_choicesKeys = choices;
}
public override bool Execute()
{
var choiceHeader = Game1.LanguageManager.GetString(_choiceKey, "error");
var choices = new string[_choicesKeys.Length];
for (var i = 0; i < _choicesKeys.Length; i++)
choices[i] = Game1.LanguageManager.GetString(_choicesKeys[i], "error");
if (Game1.GameManager.InGameOverlay.TextboxOverlay.IsOpen)
return false;
Game1.GameManager.InGameOverlay.TextboxOverlay.StartChoice(_key, choiceHeader, choices);
return true;
}
}
class DialogActionSetVariable : DialogAction
{
private readonly string _key;
private readonly string _value;
public DialogActionSetVariable(string key, string value)
{
_key = key;
_value = value;
}
public override bool Execute()
{
Game1.GameManager.SaveManager.SetString(_key, _value);
return true;
}
}
class DialogActionUpdateObjects : DialogAction
{
public override bool Execute()
{
Game1.GameManager.InGameOverlay.TextboxOverlay.UpdateObjects = true;
return true;
}
}
class DialogActionWait : DialogAction
{
private readonly string _key;
private readonly string _value;
public DialogActionWait(string key, string value)
{
_key = key;
_value = value;
}
public override bool Execute()
{
return Game1.GameManager.SaveManager.GetString(_key) == _value;
}
}
/// <summary>
/// DialogAction used to stop the dialog path for a certain amount of time.
/// </summary>
class DialogActionCountdown : DialogAction
{
private readonly float Time;
private float _counter;
public DialogActionCountdown(float time)
{
Time = time;
}
public override void Init()
{
_counter = Time;
}
public override bool Execute()
{
_counter -= Game1.DeltaTime;
return _counter <= 0;
}
}
class DialogActionFreezePlayer : DialogAction
{
private readonly string _key;
private readonly string _value;
public DialogActionFreezePlayer(string key, string value)
{
_key = key;
_value = value;
}
public override bool Execute()
{
MapManager.ObjLink.FreezePlayer();
return Game1.GameManager.SaveManager.GetString(_key) == _value;
}
}
class DialogActionFreezePlayerTime : DialogAction
{
private float _counter;
private readonly float _time;
public DialogActionFreezePlayerTime(int time)
{
_time = time;
}
public override void Init()
{
_counter = _time;
}
public override bool Execute()
{
// freeze the player while the time is running
var finished = _counter <= 0;
_counter -= Game1.DeltaTime;
MapManager.ObjLink.FreezePlayer();
return finished;
}
}
class DialogActionLockPlayerTime : DialogAction
{
private float _counter;
private readonly float _time;
public DialogActionLockPlayerTime(int time)
{
_time = time;
}
public override void Init()
{
_counter = _time;
}
public override bool Execute()
{
// freeze the player while the time is running
var finished = _counter <= 0;
_counter -= Game1.DeltaTime;
MapManager.ObjLink.SeqLockPlayer();
return finished;
}
}
/// <summary>
/// Lock the player as long as the key is not yet set to the value
/// </summary>
class DialogActionLockPlayer : DialogAction
{
private string _key;
private string _value;
public DialogActionLockPlayer(string key, string value)
{
_key = key;
_value = value;
}
public override bool Execute()
{
MapManager.ObjLink.SeqLockPlayer();
return Game1.GameManager.SaveManager.GetString(_key) == _value;
}
}
class DialogActionShake : DialogAction
{
private readonly int _time;
private readonly int _maxX;
private readonly int _maxY;
private readonly float _shakeSpeedX;
private readonly float _shakeSpeedY;
public DialogActionShake(int time, int maxX, int maxY, float shakeSpeedX, float shakeSpeedY)
{
_time = time;
_maxX = maxX;
_maxY = maxY;
_shakeSpeedX = shakeSpeedX;
_shakeSpeedY = shakeSpeedY;
}
public override bool Execute()
{
Game1.GameManager.ShakeScreen(_time, _maxX, _maxY, _shakeSpeedX, _shakeSpeedY);
return true;
}
}
class DialogActionStopMusic : DialogAction
{
public override bool Execute()
{
Game1.GbsPlayer.Stop();
return true;
}
}
class DialogActionStopMusicTime : DialogAction
{
private readonly int _time;
private readonly int _priority;
public DialogActionStopMusicTime(int time, int priority)
{
_time = time;
_priority = priority;
}
public override bool Execute()
{
Game1.GameManager.StopMusic(_time, _priority);
return true;
}
}
class DialogActionPlayMusic : DialogAction
{
private readonly int _songNr;
private readonly int _priority;
public DialogActionPlayMusic(int songNr, int priority)
{
_songNr = songNr;
_priority = priority;
}
public override bool Execute()
{
if (_priority < 0)
{
Game1.GameManager.StopMusic();
return true;
}
// play the music after the transition if the game is transitioning
if (MapManager.ObjLink.IsTransitioning)
Game1.GameManager.MapManager.NextMap.MapMusic[_priority] = _songNr;
else
{
Game1.GameManager.SetMusic(_songNr, _priority);
if (_songNr >= 0)
Game1.GbsPlayer.Play();
}
return true;
}
}
class DialogActionMusicSpeed : DialogAction
{
private readonly float _playbackSpeed;
public DialogActionMusicSpeed(float playbackSpeed)
{
_playbackSpeed = playbackSpeed;
}
public override bool Execute()
{
#if WINDOWS
Game1.GbsPlayer.Cpu.SetPlaybackSpeed(_playbackSpeed);
#endif
return true;
}
}
class DialogActionSoundEffect : DialogAction
{
private readonly string _soundEffect;
public DialogActionSoundEffect(string soundEffect)
{
_soundEffect = soundEffect;
}
public override bool Execute()
{
Game1.GameManager.PlaySoundEffect(_soundEffect);
return true;
}
}
class DialogActionCheckItem : DialogAction
{
private readonly string _itemName;
private readonly string _resultKey;
private readonly int _count;
public DialogActionCheckItem(string itemName, int count, string resultKey)
{
_itemName = itemName;
_count = count;
_resultKey = resultKey;
}
public override bool Execute()
{
// get the item and check if enough are available
var item = Game1.GameManager.GetItem(_itemName);
var checkState = item != null && item.Count >= _count;
Game1.GameManager.SaveManager.SetString(_resultKey, checkState ? "1" : "0");
return true;
}
}
class DialogActionCooldown : DialogAction
{
private readonly string _resultKey;
private readonly int _cooldownTime;
private double _lastExecutionTime;
public DialogActionCooldown(int cooldownTime, string resultKey)
{
_cooldownTime = cooldownTime;
_resultKey = resultKey;
_lastExecutionTime = -_cooldownTime;
}
public override bool Execute()
{
// check when the last time the check was successful
// this does not work directly after loading the save if it was running shortly after the last save loading
if (_lastExecutionTime <= Game1.TotalGameTime && Game1.TotalGameTime < _lastExecutionTime + _cooldownTime)
{
Game1.GameManager.SaveManager.SetString(_resultKey, "0");
return true;
}
_lastExecutionTime = Game1.TotalGameTime;
Game1.GameManager.SaveManager.SetString(_resultKey, "1");
return true;
}
}
class DialogActionAddItem : DialogAction
{
private readonly string _itemName;
private readonly int _amount;
public DialogActionAddItem(string itemName, int amount)
{
_itemName = itemName;
_amount = amount;
}
public override bool Execute()
{
if (Game1.GameManager.InGameOverlay.TextboxOverlay.IsOpen)
return false;
var item = new GameItemCollected(_itemName);
// use the set amount or that from the item description
if (_amount > 0)
item.Count = _amount;
else
item.Count = Game1.GameManager.ItemManager[_itemName].Count;
MapManager.ObjLink.PickUpItem(item, true);
return true;
}
}
class DialogActionSeqSetPosition : DialogAction
{
private string _animatorId;
private Vector2 _newPosition;
public DialogActionSeqSetPosition(string animatorId, Vector2 newPosition)
{
_animatorId = animatorId;
_newPosition = newPosition;
}
public override bool Execute()
{
var gameSequence = Game1.GameManager.InGameOverlay.GetCurrentGameSequence();
if (gameSequence == null)
return false;
gameSequence.SetPosition(_animatorId, _newPosition);
return true;
}
}
class DialogActionSeqLerp : DialogAction
{
private string _drawableId;
private Vector2 _targetPosition;
private float _moveSpeed;
public DialogActionSeqLerp(string animatorId, Vector2 newPosition, float moveSpeed)
{
_drawableId = animatorId;
_targetPosition = newPosition;
_moveSpeed = moveSpeed;
}
public override bool Execute()
{
var gameSequence = Game1.GameManager.InGameOverlay.GetCurrentGameSequence();
if (gameSequence == null)
return false;
gameSequence.StartPositionTransition(_drawableId, _targetPosition, _moveSpeed);
return true;
}
}
class DialogActionSeqColorLerp : DialogAction
{
private string _drawableId;
private Color _targetColor;
private int _transitionTime;
public DialogActionSeqColorLerp(string animatorId, Color targetColor, int transitionTime)
{
_drawableId = animatorId;
_targetColor = targetColor;
_transitionTime = transitionTime;
}
public override bool Execute()
{
var gameSequence = Game1.GameManager.InGameOverlay.GetCurrentGameSequence();
if (gameSequence == null)
return false;
gameSequence.StartColorTransition(_drawableId, _targetColor, _transitionTime);
return true;
}
}
class DialogActionSeqPlay : DialogAction
{
private string _animatorId;
private string _animationId;
public DialogActionSeqPlay(string animatorId, string animationId)
{
_animatorId = animatorId;
_animationId = animationId;
}
public override bool Execute()
{
var gameSequence = Game1.GameManager.InGameOverlay.GetCurrentGameSequence();
if (gameSequence == null)
return false;
gameSequence.PlayAnimation(_animatorId, _animationId);
return true;
}
}
class DialogActionFinishAnimation : DialogAction
{
private string _animatorId;
private int _stopFrameIndex;
public DialogActionFinishAnimation(string animatorId, int stopFrameIndex)
{
_animatorId = animatorId;
_stopFrameIndex = stopFrameIndex;
}
public override bool Execute()
{
var gameSequence = Game1.GameManager.InGameOverlay.GetCurrentGameSequence();
if (gameSequence == null)
return false;
gameSequence.FinishAnimation(_animatorId, _stopFrameIndex);
return true;
}
}
/// <summary>
/// Only add an amount to an existing item
/// </summary>
class DialogActionAddItemAmount : DialogAction
{
private readonly string _itemName;
private readonly int _amount;
public DialogActionAddItemAmount(string itemName, int amount)
{
_itemName = itemName;
_amount = amount;
}
public override bool Execute()
{
if (Game1.GameManager.InGameOverlay.TextboxOverlay.IsOpen)
return false;
if (Game1.GameManager.GetItem(_itemName) == null)
return true;
var item = new GameItemCollected(_itemName);
if (_amount > 0)
item.Count = _amount;
MapManager.ObjLink.PickUpItem(item, false, false, false);
return true;
}
}
class DialogActionRemoveItem : DialogAction
{
private readonly string _itemName;
private readonly string _resultKey;
private readonly int _count;
public DialogActionRemoveItem(string itemName, int count, string resultKey)
{
_itemName = itemName;
_count = count;
_resultKey = resultKey;
}
public override bool Execute()
{
// remove the item if possible
if (Game1.GameManager.RemoveItem(_itemName, _count))
Game1.GameManager.SaveManager.SetString(_resultKey, "1");
else
Game1.GameManager.SaveManager.SetString(_resultKey, "0");
return true;
}
}
class DialogActionBuyItem : DialogAction
{
private readonly string _key;
public DialogActionBuyItem(string key)
{
_key = key;
}
public override bool Execute()
{
var itemName = Game1.GameManager.SaveManager.GetString("itemShopItem");
var itemPriceString = Game1.GameManager.SaveManager.GetString("itemShopPrice");
var itemPrice = int.Parse(itemPriceString);
var itemCountString = Game1.GameManager.SaveManager.GetString("itemShopCount");
var itemCount = int.Parse(itemCountString);
var baseItem = Game1.GameManager.ItemManager[itemName];
var buyItem = Game1.GameManager.GetItem(baseItem.Name);
var rubyItem = Game1.GameManager.GetItem("ruby");
var ownedCount = 0;
var maxCount = 99;
// check if the player has the mirror shield
if (itemName == "arrow")
buyItem = Game1.GameManager.GetItem("bow");
if (itemName == "shield" && buyItem == null)
buyItem = Game1.GameManager.GetItem("mirrorShield");
if (itemName == "heart")
{
ownedCount = Game1.GameManager.CurrentHealth;
maxCount = Game1.GameManager.MaxHearths * 4;
}
else if (buyItem != null)
{
ownedCount = buyItem.Count;
maxCount = Game1.GameManager.ItemManager[buyItem.Name].MaxCount;
}
if (buyItem != null && buyItem.Name == "powder" && Game1.GameManager.SaveManager.GetString("upgradePowder") == "1")
maxCount += 20;
if (buyItem != null && buyItem.Name == "bomb" && Game1.GameManager.SaveManager.GetString("upgradeBomb") == "1")
maxCount += 30;
if (buyItem != null && buyItem.Name == "bow" && Game1.GameManager.SaveManager.GetString("upgradeBow") == "1")
maxCount += 30;
// does the player already own the item?
if (ownedCount >= maxCount)
{
Game1.GameManager.SaveManager.SetString(_key, "2");
}
// does the player have enough money to buy this item?
else if (rubyItem != null && rubyItem.Count >= itemPrice)
{
var item = new GameItemCollected(itemName);
item.Count = itemCount;
// gets picked up
MapManager.ObjLink.PickUpItem(item, false);
rubyItem.Count -= itemPrice;
Game1.GameManager.SaveManager.SetString(_key, "0");
}
// player does not have enough money
else
{
Game1.GameManager.SaveManager.SetString(_key, "1");
}
return true;
}
}
class DialogActionOpenBook : DialogAction
{
public override bool Execute()
{
Game1.GameManager.InGameOverlay.OpenPhotoOverlay();
return true;
}
}
class DialogActionStartSequence : DialogAction
{
private readonly string _sequenceName;
public DialogActionStartSequence(string sequenceName)
{
_sequenceName = sequenceName;
}
public override bool Execute()
{
Game1.GameManager.InGameOverlay.StartSequence(_sequenceName);
return true;
}
}
class DialogActionCloseOverlay : DialogAction
{
public DialogActionCloseOverlay() { }
public override bool Execute()
{
Game1.GameManager.InGameOverlay.CloseOverlay();
return true;
}
}
class DialogActionFillHearts : DialogAction
{
public DialogActionFillHearts() { }
public override bool Execute()
{
var fullHearts = Game1.GameManager.CurrentHealth >= Game1.GameManager.MaxHearths * 4;
Game1.GameManager.SaveManager.SetString("fullHearts", fullHearts ? "1" : "0");
Game1.GameManager.HealPlayer(99);
ItemDrawHelper.EnableHeartAnimationSound();
return true;
}
}
class DialogActionSpawnObject : DialogAction
{
private readonly string _positionKey;
private readonly string _objectId;
private readonly string _strParameter;
public DialogActionSpawnObject(string positionKey, string objectId, string strParameter)
{
_positionKey = positionKey;
_objectId = objectId;
_strParameter = strParameter;
}
public override bool Execute()
{
// @HACK: this is not really a good way and could lead to problems
// a better way would probably be a way to pass parameters into a dialog path so that the actions could read them
// @HACK: some parameters need the '.' character
var parameters = _strParameter.Split('.');
for (var i = 0; i < parameters.Length; i++)
parameters[i] = parameters[i].Replace("$", ".");
var objectParameter = MapData.GetParameter(_objectId, parameters);
objectParameter[0] = ObjPositionDialog.CurrentMap;
objectParameter[1] = Game1.GameManager.SaveManager.GetInt(_positionKey + "posX");
objectParameter[2] = Game1.GameManager.SaveManager.GetInt(_positionKey + "posY");
ObjPositionDialog.CurrentMap.Objects.SpawnObject(_objectId, objectParameter);
return true;
}
}
class DialogActionChangeMap : DialogAction
{
private readonly string _mapName;
private readonly string _entryName;
public DialogActionChangeMap(string mapName, string entryName)
{
_mapName = mapName;
_entryName = entryName;
}
public override bool Execute()
{
var transitionSystem = (MapTransitionSystem)Game1.GameManager.GameSystems[typeof(MapTransitionSystem)];
transitionSystem.AppendMapChange(_mapName, _entryName, false, false, Color.White, true);
transitionSystem.SetColorMode(Color.White, 1);
MapManager.ObjLink.MapTransitionStart = MapManager.ObjLink.EntityPosition.Position;
MapManager.ObjLink.MapTransitionEnd = MapManager.ObjLink.EntityPosition.Position;
MapManager.ObjLink.TransitionOutWalking = false;
return true;
}
}
class DialogActionSaveHistory : DialogAction
{
private readonly bool _enable;
public DialogActionSaveHistory(bool enable)
{
_enable = enable;
}
public override bool Execute()
{
if (_enable && !Game1.GameManager.SaveManager.HistoryEnabled)
{
SaveGameSaveLoad.FillSaveState(Game1.GameManager);
Game1.GameManager.SaveManager.EnableHistory();
}
// the history will be cleared by the player
else if (!_enable && !MapManager.ObjLink.SavePreItemPickup)
{
SaveGameSaveLoad.ClearSaveState();
Game1.GameManager.SaveManager.DisableHistory();
}
return true;
}
}
class DialogPath
{
public string VariableKey;
public string Condition;
public List<DialogAction> Action = new List<DialogAction>();
public DialogPath(string variableKey, string condition)
{
VariableKey = variableKey;
Condition = condition;
}
public DialogPath(string variableKey)
{
VariableKey = variableKey;
}
}
}