Skip to content

Commit

Permalink
Wire up trade actions to context menu. Finish implementing trade dial…
Browse files Browse the repository at this point in the history
…og actions.
  • Loading branch information
ethanmoffat committed Sep 16, 2022
1 parent a4524c2 commit a461571
Show file tree
Hide file tree
Showing 8 changed files with 178 additions and 38 deletions.
26 changes: 26 additions & 0 deletions EndlessClient/Dialogs/Actions/InGameDialogActions.cs
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ public class InGameDialogActions : IInGameDialogActions
private readonly ISkillmasterDialogFactory _skillmasterDialogFactory;
private readonly IBardDialogFactory _bardDialogFactory;
private readonly IScrollingListDialogFactory _scrollingListDialogFactory;
private readonly ITradeDialogFactory _tradeDialogFactory;
private readonly ISfxPlayer _sfxPlayer;
private readonly IShopDialogFactory _shopDialogFactory;
private readonly IQuestDialogFactory _questDialogFactory;
Expand All @@ -49,6 +50,7 @@ public InGameDialogActions(IFriendIgnoreListDialogFactory friendIgnoreListDialog
ISkillmasterDialogFactory skillmasterDialogFactory,
IBardDialogFactory bardDialogFactory,
IScrollingListDialogFactory scrollingListDialogFactory,
ITradeDialogFactory tradeDialogFactory,
ISfxPlayer sfxPlayer)
{
_friendIgnoreListDialogFactory = friendIgnoreListDialogFactory;
Expand All @@ -65,6 +67,7 @@ public InGameDialogActions(IFriendIgnoreListDialogFactory friendIgnoreListDialog
_skillmasterDialogFactory = skillmasterDialogFactory;
_bardDialogFactory = bardDialogFactory;
_scrollingListDialogFactory = scrollingListDialogFactory;
_tradeDialogFactory = tradeDialogFactory;
_sfxPlayer = sfxPlayer;
_shopDialogFactory = shopDialogFactory;
_questDialogFactory = questDialogFactory;
Expand Down Expand Up @@ -281,6 +284,25 @@ public void ShowMessageDialog(string title, IReadOnlyList<string> messages)
});
}

public void ShowTradeDialog()
{
_activeDialogRepository.TradeDialog.MatchNone(() =>
{
var dlg = _tradeDialogFactory.Create();
dlg.DialogClosed += (_, _) => _activeDialogRepository.TradeDialog = Option.None<TradeDialog>();
_activeDialogRepository.TradeDialog = Option.Some(dlg);

UseDefaultDialogSounds(dlg);

dlg.Show();
});
}

public void CloseTradeDialog()
{
_activeDialogRepository.TradeDialog.MatchSome(dlg => dlg.Close());
}

private void UseDefaultDialogSounds(ScrollingListDialog dialog)
{
UseDefaultDialogSounds((BaseEODialog)dialog);
Expand Down Expand Up @@ -334,5 +356,9 @@ public interface IInGameDialogActions
void ShowBardDialog();

void ShowMessageDialog(string title, IReadOnlyList<string> messages);

void ShowTradeDialog();

void CloseTradeDialog();
}
}
36 changes: 28 additions & 8 deletions EndlessClient/Dialogs/Actions/TradeDialogActions.cs
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
using AutomaticTypeMapper;
using EndlessClient.Dialogs.Factories;
using EndlessClient.HUD;
using EOLib.Config;
using EOLib.Domain.Map;
using EOLib.Domain.Character;
using EOLib.Domain.Notifiers;
using EOLib.Domain.Trade;
using EOLib.Localization;
Expand All @@ -13,15 +14,30 @@ namespace EndlessClient.Dialogs.Actions
public class TradeDialogActions : ITradeEventNotifier
{
private readonly ITradeActions _tradeActions;
private readonly IInGameDialogActions _inGameDialogActions;
private readonly IEOMessageBoxFactory _messageBoxFactory;
private readonly IStatusLabelSetter _statusLabelSetter;
private readonly ILocalizedStringFinder _localizedStringFinder;
private readonly ITradeProvider _tradeProvider;
private readonly ICharacterProvider _characterProvider;
private readonly IConfigurationProvider _configurationProvider;

public TradeDialogActions(ITradeActions tradeActions,
IInGameDialogActions inGameDialogActions,
IEOMessageBoxFactory messageBoxFactory,
IStatusLabelSetter statusLabelSetter,
ILocalizedStringFinder localizedStringFinder,
ITradeProvider tradeProvider,
ICharacterProvider characterProvider,
IConfigurationProvider configurationProvider)
{
_tradeActions = tradeActions;
_inGameDialogActions = inGameDialogActions;
_messageBoxFactory = messageBoxFactory;
_statusLabelSetter = statusLabelSetter;
_localizedStringFinder = localizedStringFinder;
_tradeProvider = tradeProvider;
_characterProvider = characterProvider;
_configurationProvider = configurationProvider;
}

Expand All @@ -44,24 +60,28 @@ public void NotifyTradeRequest(short playerId, string name)

public void NotifyTradeAccepted()
{
// todo: show trade dialog
_inGameDialogActions.ShowTradeDialog();

// todo: status label
//m_game.Hud.SetStatusLabel(EOResourceID.STATUS_LABEL_TYPE_ACTION, EOResourceID.STATUS_LABEL_TRADE_YOU_ARE_TRADING_WITH,
// otherName + " " + OldWorld.GetString(EOResourceID.STATUS_LABEL_DRAG_AND_DROP_ITEMS));
var otherName = _tradeProvider.PlayerOneOffer.PlayerID == _characterProvider.MainCharacter.ID
? _tradeProvider.PlayerOneOffer.PlayerName
: _tradeProvider.PlayerTwoOffer.PlayerName;
_statusLabelSetter.SetStatusLabel(EOResourceID.STATUS_LABEL_TYPE_ACTION,
EOResourceID.STATUS_LABEL_TRADE_YOU_ARE_TRADING_WITH,
$"{otherName} {_localizedStringFinder.GetString(EOResourceID.STATUS_LABEL_DRAG_AND_DROP_ITEMS)}");
}

public void NotifyTradeClose(bool cancel)
{
// todo: close trade dialog
_inGameDialogActions.CloseTradeDialog();

if (cancel)
{
//m_game.Hud.SetStatusLabel(EOResourceID.STATUS_LABEL_TYPE_ACTION, EOResourceID.STATUS_LABEL_TRADE_ABORTED);
_statusLabelSetter.SetStatusLabel(EOResourceID.STATUS_LABEL_TYPE_ACTION, EOResourceID.STATUS_LABEL_TRADE_ABORTED);
}
else
{
//EOMessageBox.Show(DialogResourceID.TRADE_SUCCESS, EODialogButtons.Ok, EOMessageBoxStyle.SmallDialogSmallHeader);
var dlg = _messageBoxFactory.CreateMessageBox(DialogResourceID.TRADE_SUCCESS);
dlg.ShowDialog();
}
}
}
Expand Down
7 changes: 7 additions & 0 deletions EndlessClient/Dialogs/BaseEODialog.cs
Original file line number Diff line number Diff line change
Expand Up @@ -34,5 +34,12 @@ public override void CenterInGameView()
if (_isInGame())
DrawPosition = new Vector2(DrawPosition.X, (330 - DrawArea.Height)/2f);
}

protected override void OnUpdateControl(GameTime gameTime)
{
ChildControlClickHandled = false;

base.OnUpdateControl(gameTime);
}
}
}
80 changes: 80 additions & 0 deletions EndlessClient/Dialogs/Factories/TradeDialogFactory.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,80 @@
using AutomaticTypeMapper;
using EndlessClient.Dialogs.Services;
using EndlessClient.HUD.Inventory;
using EndlessClient.HUD;
using EndlessClient.Rendering.Map;
using EOLib.Domain.Character;
using EOLib.Domain.Trade;
using EOLib.Graphics;
using EOLib.IO.Repositories;
using EOLib.Localization;
using EndlessClient.ControlSets;
using EndlessClient.HUD.Panels;

namespace EndlessClient.Dialogs.Factories
{
[AutoMappedType]
public class TradeDialogFactory : ITradeDialogFactory
{
private readonly INativeGraphicsManager _nativeGraphicsManager;
private readonly ITradeActions _tradeActions;
private readonly ILocalizedStringFinder _localizedStringFinder;
private readonly IEODialogButtonService _dialogButtonService;
private readonly IEOMessageBoxFactory _messageBoxFactory;
private readonly IStatusLabelSetter _statusLabelSetter;
private readonly IInventorySpaceValidator _inventorySpaceValidator;
private readonly ITradeProvider _tradeProvider;
private readonly ICharacterProvider _characterProvider;
private readonly IEIFFileProvider _eifFileProvider;
private readonly IMapItemGraphicProvider _mapItemGraphicProvider;
private readonly IHudControlProvider _hudControlProvider;

public TradeDialogFactory(INativeGraphicsManager nativeGraphicsManager,
ITradeActions tradeActions,
ILocalizedStringFinder localizedStringFinder,
IEODialogButtonService dialogButtonService,
IEOMessageBoxFactory messageBoxFactory,
IStatusLabelSetter statusLabelSetter,
IInventorySpaceValidator inventorySpaceValidator,
ITradeProvider tradeProvider,
ICharacterProvider characterProvider,
IEIFFileProvider eifFileProvider,
IMapItemGraphicProvider mapItemGraphicProvider,
IHudControlProvider hudControlProvider)
{
_nativeGraphicsManager = nativeGraphicsManager;
_tradeActions = tradeActions;
_localizedStringFinder = localizedStringFinder;
_dialogButtonService = dialogButtonService;
_messageBoxFactory = messageBoxFactory;
_statusLabelSetter = statusLabelSetter;
_inventorySpaceValidator = inventorySpaceValidator;
_tradeProvider = tradeProvider;
_characterProvider = characterProvider;
_eifFileProvider = eifFileProvider;
_mapItemGraphicProvider = mapItemGraphicProvider;
_hudControlProvider = hudControlProvider;
}

public TradeDialog Create()
{
return new TradeDialog(_nativeGraphicsManager,
_tradeActions,
_localizedStringFinder,
_dialogButtonService,
_messageBoxFactory,
_statusLabelSetter,
_inventorySpaceValidator,
_tradeProvider,
_characterProvider,
_eifFileProvider,
_mapItemGraphicProvider,
_hudControlProvider.GetComponent<InventoryPanel>(HUD.Controls.HudControlIdentifier.InventoryPanel));
}
}

public interface ITradeDialogFactory
{
TradeDialog Create();
}
}
2 changes: 0 additions & 2 deletions EndlessClient/Dialogs/ScrollingListDialog.cs
Original file line number Diff line number Diff line change
Expand Up @@ -364,8 +364,6 @@ public override void Initialize()

protected override void OnUpdateControl(GameTime gameTime)
{
ChildControlClickHandled = false;

if (_listItems.Count > _scrollBar.LinesToRender)
{
for (int i = 0; i < _listItems.Count; ++i)
Expand Down
3 changes: 2 additions & 1 deletion EndlessClient/Dialogs/TradeDialog.cs
Original file line number Diff line number Diff line change
Expand Up @@ -156,7 +156,8 @@ public override void Initialize()
_cancel.Initialize();
}

protected override void OnUpdateControl(GameTime gameTime)
public void Close() => Close(XNADialogResult.NO_BUTTON_PRESSED);

{
var updateItemVisibility = false;

Expand Down
57 changes: 30 additions & 27 deletions EndlessClient/Rendering/ContextMenuRenderer.cs
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
using EOLib.Domain.Chat;
using EOLib.Domain.Interact;
using EOLib.Domain.Party;
using EOLib.Domain.Trade;
using EOLib.Graphics;
using EOLib.Localization;
using Microsoft.Xna.Framework;
Expand Down Expand Up @@ -46,6 +47,7 @@ private enum MenuAction
private readonly IInGameDialogActions _inGameDialogActions;
private readonly IPaperdollActions _paperdollActions;
private readonly IPartyActions _partyActions;
private readonly ITradeActions _tradeActions;
private readonly IStatusLabelSetter _statusLabelSetter;
private readonly IFriendIgnoreListService _friendIgnoreListService;
private readonly IHudControlProvider _hudControlProvider;
Expand All @@ -54,13 +56,14 @@ private enum MenuAction
private readonly IPartyDataProvider _partyDataProvider;
private readonly ICharacterRenderer _characterRenderer;

//private DateTime? m_lastTradeRequestedTime;
private static DateTime? _lastTradeRequestedTime;
private static DateTime? _lastPartyRequestTime;

public ContextMenuRenderer(INativeGraphicsManager nativeGraphicsManager,
IInGameDialogActions inGameDialogActions,
IPaperdollActions paperdollActions,
IPartyActions partyActions,
ITradeActions tradeActions,
IStatusLabelSetter statusLabelSetter,
IFriendIgnoreListService friendIgnoreListService,
IHudControlProvider hudControlProvider,
Expand All @@ -73,6 +76,7 @@ public ContextMenuRenderer(INativeGraphicsManager nativeGraphicsManager,
_inGameDialogActions = inGameDialogActions;
_paperdollActions = paperdollActions;
_partyActions = partyActions;
_tradeActions = tradeActions;
_statusLabelSetter = statusLabelSetter;
_friendIgnoreListService = friendIgnoreListService;
_hudControlProvider = hudControlProvider;
Expand Down Expand Up @@ -222,10 +226,10 @@ private Action GetActionFromMenuAction(MenuAction menuAction)
switch (menuAction)
{
case MenuAction.Paperdoll: return ShowPaperdollAction;
case MenuAction.Book: return () => { };//return _eventShowBook;
case MenuAction.Book: return ShowBook;
case MenuAction.Join: return JoinParty;
case MenuAction.Invite: return InviteToParty;
case MenuAction.Trade: return () => { }; //return _eventTrade;
case MenuAction.Trade: return Trade;
case MenuAction.Whisper: return PrivateMessage;
case MenuAction.Friend: return AddFriend;
case MenuAction.Ignore: return AddIgnore;
Expand All @@ -239,10 +243,9 @@ private void ShowPaperdollAction()
_inGameDialogActions.ShowPaperdollDialog(_characterRenderer.Character, isMainCharacter: false);
}

//private void _eventShowBook(object arg1, EventArgs arg2)
//{
// EOMessageBox.Show("TODO: Show quest info", "TODO ITEM", EODialogButtons.Ok, EOMessageBoxStyle.SmallDialogSmallHeader);
//}
private void ShowBook()
{
}

private void JoinParty()
{
Expand Down Expand Up @@ -282,26 +285,26 @@ private void InviteToParty()
_statusLabelSetter.SetStatusLabel(EOResourceID.STATUS_LABEL_TYPE_ACTION, _characterRenderer.Character.Name, EOResourceID.STATUS_LABEL_PARTY_IS_INVITED);
}

//private void _eventTrade(object arg1, EventArgs arg2)
//{
// if (OldWorld.Instance.MainPlayer.ActiveCharacter.CurrentMap == OldWorld.Instance.JailMap)
// EOMessageBox.Show(OldWorld.GetString(EOResourceID.JAIL_WARNING_CANNOT_TRADE),
// OldWorld.GetString(EOResourceID.STATUS_LABEL_TYPE_WARNING),
// EODialogButtons.Ok, EOMessageBoxStyle.SmallDialogSmallHeader);
// else
// {
// if(m_lastTradeRequestedTime != null && (DateTime.Now - m_lastTradeRequestedTime.Value).TotalSeconds < Constants.TradeRequestTimeoutSeconds)
// {
// ((EOGame)Game).Hud.SetStatusLabel(EOResourceID.STATUS_LABEL_TYPE_WARNING, EOResourceID.STATUS_LABEL_TRADE_RECENTLY_REQUESTED);
// return;
// }
// m_lastTradeRequestedTime = DateTime.Now;
// if (!m_api.TradeRequest((short)m_rend.Character.ID))
// ((EOGame)Game).DoShowLostConnectionDialogAndReturnToMainMenu();
// //todo: is this correct text?
// ((EOGame)Game).Hud.SetStatusLabel(EOResourceID.STATUS_LABEL_TYPE_ACTION, EOResourceID.STATUS_LABEL_TRADE_REQUESTED_TO_TRADE);
// }
//}
private void Trade()
{
// see: https://github.com/ethanmoffat/EndlessClient/issues/193
//if (OldWorld.Instance.MainPlayer.ActiveCharacter.CurrentMap == OldWorld.Instance.JailMap)
// EOMessageBox.Show(OldWorld.GetString(EOResourceID.JAIL_WARNING_CANNOT_TRADE),
// OldWorld.GetString(EOResourceID.STATUS_LABEL_TYPE_WARNING),
// EODialogButtons.Ok, EOMessageBoxStyle.SmallDialogSmallHeader);

if (_lastTradeRequestedTime != null && (DateTime.Now - _lastTradeRequestedTime.Value).TotalSeconds < Constants.TradeRequestTimeoutSeconds)
{
_statusLabelSetter.SetStatusLabel(EOResourceID.STATUS_LABEL_TYPE_WARNING, EOResourceID.STATUS_LABEL_TRADE_RECENTLY_REQUESTED);
return;
}

_lastTradeRequestedTime = DateTime.Now;

_tradeActions.RequestTrade((short)_characterRenderer.Character.ID);

_statusLabelSetter.SetStatusLabel(EOResourceID.STATUS_LABEL_TYPE_ACTION, EOResourceID.STATUS_LABEL_TRADE_REQUESTED_TO_TRADE);
}

private void PrivateMessage()
{
Expand Down
Loading

0 comments on commit a461571

Please sign in to comment.