Skip to content

Commit

Permalink
Refactor UnwalkableTileActions to not send packets directly. Move sen…
Browse files Browse the repository at this point in the history
…ding of packets for door/chair into appropriate domain model actions classes.
  • Loading branch information
ethanmoffat committed Apr 8, 2022
1 parent 291e930 commit 188b9c0
Show file tree
Hide file tree
Showing 4 changed files with 72 additions and 43 deletions.
15 changes: 15 additions & 0 deletions EOLib/Domain/Character/CharacterActions.cs
Expand Up @@ -79,6 +79,19 @@ public void ToggleSit()
_packetSendService.SendPacket(packet);
}

public void SitInChair()
{
var rp = _characterProvider.MainCharacter.RenderProperties;
var action = rp.SitState == SitState.Chair ? SitAction.Stand : SitAction.Sit;
var packet = new PacketBuilder(PacketFamily.Chair, PacketAction.Request)
.AddChar((byte)action)
.AddChar((byte)rp.GetDestinationX())
.AddChar((byte)rp.GetDestinationY())
.Build();

_packetSendService.SendPacket(packet);
}

public void PrepareCastSpell(int spellId)
{
var packet = new PacketBuilder(PacketFamily.Spell, PacketAction.Request)
Expand Down Expand Up @@ -159,6 +172,8 @@ public interface ICharacterActions

void ToggleSit();

void SitInChair();

void PrepareCastSpell(int spellId);

void CastSpell(int spellId, ISpellTargetable target);
Expand Down
18 changes: 17 additions & 1 deletion EOLib/Domain/Map/MapActions.cs
Expand Up @@ -12,14 +12,17 @@ public class MapActions : IMapActions
private readonly IPacketSendService _packetSendService;
private readonly IItemPickupValidator _itemPickupValidator;
private readonly ICharacterProvider _characterProvider;
private readonly ICurrentMapStateRepository _currentMapStateRepository;

public MapActions(IPacketSendService packetSendService,
IItemPickupValidator itemPickupValidator,
ICharacterProvider characterProvider)
ICharacterProvider characterProvider,
ICurrentMapStateRepository currentMapStateRepository)
{
_packetSendService = packetSendService;
_itemPickupValidator = itemPickupValidator;
_characterProvider = characterProvider;
_currentMapStateRepository = currentMapStateRepository;
}

public void RequestRefresh()
Expand All @@ -42,12 +45,25 @@ public ItemPickupResult PickUpItem(IItem item)

return pickupResult;
}

public void OpenDoor(IWarp warp)
{
var packet = new PacketBuilder(PacketFamily.Door, PacketAction.Open)
.AddChar((byte)warp.X)
.AddChar((byte)warp.Y)
.Build();

_packetSendService.SendPacket(packet);
_currentMapStateRepository.PendingDoors.Add(warp);
}
}

public interface IMapActions
{
void RequestRefresh();

ItemPickupResult PickUpItem(IItem item);

void OpenDoor(IWarp warp);
}
}
16 changes: 14 additions & 2 deletions EndlessClient/Controllers/ArrowKeyController.cs
Expand Up @@ -17,18 +17,24 @@ public class ArrowKeyController : IArrowKeyController
private readonly ICharacterProvider _characterProvider;
private readonly IUnwalkableTileActions _unwalkableTileActions;
private readonly ISpikeTrapActions _spikeTrapActions;
private readonly ICharacterActions _characterActions;
private readonly IMapActions _mapActions;

public ArrowKeyController(IWalkValidationActions walkValidationActions,
ICharacterAnimationActions characterAnimationActions,
ICharacterProvider characterProvider,
IUnwalkableTileActions walkErrorHandler,
ISpikeTrapActions spikeTrapActions)
ISpikeTrapActions spikeTrapActions,
ICharacterActions characterActions,
IMapActions mapActions)
{
_walkValidationActions = walkValidationActions;
_characterAnimationActions = characterAnimationActions;
_characterProvider = characterProvider;
_unwalkableTileActions = walkErrorHandler;
_spikeTrapActions = spikeTrapActions;
_characterActions = characterActions;
_mapActions = mapActions;
}

public bool MoveLeft()
Expand Down Expand Up @@ -99,7 +105,13 @@ private void AttemptToStartWalking()
{
if (!_walkValidationActions.CanMoveToDestinationCoordinates())
{
_unwalkableTileActions.HandleUnwalkableTile();
var (unwalkableAction, cellState) = _unwalkableTileActions.HandleUnwalkableTile();
switch (unwalkableAction)
{
case UnwalkableTileAction.Chest: /* todo: request chest and show dialog */ break;
case UnwalkableTileAction.Chair: _characterActions.SitInChair(); break;
case UnwalkableTileAction.Door: cellState.Warp.MatchSome(w => _mapActions.OpenDoor(w)); break;
}
}
else
{
Expand Down
66 changes: 26 additions & 40 deletions EndlessClient/Input/UnwalkableTileActions.cs
@@ -1,18 +1,22 @@
using AutomaticTypeMapper;
using EndlessClient.Dialogs;
using EndlessClient.Dialogs.Factories;
using EndlessClient.HUD;
using EOLib.Domain.Character;
using EOLib.Domain.Extensions;
using EOLib.Domain.Map;
using EOLib.IO.Map;
using EOLib.Localization;
using EOLib.Net;
using EOLib.Net.Communication;
using Optional;

namespace EndlessClient.Input
{
public enum UnwalkableTileAction
{
None,
Chair,
Chest,
Door,
}

[AutoMappedType]
public class UnwalkableTileActions : IUnwalkableTileActions
{
Expand All @@ -23,7 +27,6 @@ public class UnwalkableTileActions : IUnwalkableTileActions
private readonly IUnlockDoorValidator _unlockDoorValidator;
private readonly IUnlockChestValidator _unlockChestValidator;
private readonly IEOMessageBoxFactory _eoMessageBoxFactory;
private readonly IPacketSendService _packetSendService;
private readonly IEOMessageBoxFactory _messageBoxFactory;

public UnwalkableTileActions(IMapCellStateProvider mapCellStateProvider,
Expand All @@ -33,7 +36,6 @@ public class UnwalkableTileActions : IUnwalkableTileActions
IUnlockDoorValidator unlockDoorValidator,
IUnlockChestValidator unlockChestValidator,
IEOMessageBoxFactory eoMessageBoxFactory,
IPacketSendService packetSendService,
IEOMessageBoxFactory messageBoxFactory)
{
_mapCellStateProvider = mapCellStateProvider;
Expand All @@ -43,27 +45,27 @@ public class UnwalkableTileActions : IUnwalkableTileActions
_unlockDoorValidator = unlockDoorValidator;
_unlockChestValidator = unlockChestValidator;
_eoMessageBoxFactory = eoMessageBoxFactory;
_packetSendService = packetSendService;
_messageBoxFactory = messageBoxFactory;
}

public void HandleUnwalkableTile()
public (UnwalkableTileAction, IMapCellState) HandleUnwalkableTile()
{
if (MainCharacter.RenderProperties.SitState != SitState.Standing)
return;
return (UnwalkableTileAction.None, new MapCellState());

var destX = MainCharacter.RenderProperties.GetDestinationX();
var destY = MainCharacter.RenderProperties.GetDestinationY();

var cellState = _mapCellStateProvider.GetCellStateAt(destX, destY);
cellState.Character.Match(
var action = cellState.Character.Match(
some: c => HandleWalkThroughOtherCharacter(c), //todo: walk through players after certain elapsed time (3-5sec?)
none: () => cellState.Warp.Match(
some: w => HandleWalkToWarpTile(w),
none: () => HandleWalkToTileSpec(cellState)));
return (action, cellState);
}

private void HandleWalkThroughOtherCharacter(ICharacter c)
private UnwalkableTileAction HandleWalkThroughOtherCharacter(ICharacter c)
{
// EOGame.Instance.Hud.SetStatusLabel(EOResourceID.STATUS_LABEL_TYPE_ACTION,
// EOResourceID.STATUS_LABEL_KEEP_MOVING_THROUGH_PLAYER);
Expand All @@ -74,9 +76,10 @@ private void HandleWalkThroughOtherCharacter(ICharacter c)
// _startWalkingThroughPlayerTime = null;
// goto case TileInfoReturnType.IsTileSpec;
// }
return UnwalkableTileAction.None;
}

private void HandleWalkToWarpTile(IWarp warp)
private UnwalkableTileAction HandleWalkToWarpTile(IWarp warp)
{
if (warp.DoorType != DoorSpec.NoDoor)
{
Expand All @@ -93,13 +96,7 @@ private void HandleWalkToWarpTile(IWarp warp)
else if (!_currentMapStateRepository.OpenDoors.Contains(warp) &&
!_currentMapStateRepository.PendingDoors.Contains(warp))
{
var packet = new PacketBuilder(PacketFamily.Door, PacketAction.Open)
.AddChar((byte) warp.X)
.AddChar((byte) warp.Y)
.Build();

_packetSendService.SendPacket(packet);
_currentMapStateRepository.PendingDoors.Add(warp);
return UnwalkableTileAction.Door;
}
}
else if (warp.LevelRequirement > 0 && MainCharacter.Stats[CharacterStat.Level] < warp.LevelRequirement)
Expand All @@ -108,9 +105,11 @@ private void HandleWalkToWarpTile(IWarp warp)
EOResourceID.STATUS_LABEL_NOT_READY_TO_USE_ENTRANCE,
" - LVL " + warp.LevelRequirement);
}

return UnwalkableTileAction.None;
}

private void HandleWalkToTileSpec(IMapCellState cellState)
private UnwalkableTileAction HandleWalkToTileSpec(IMapCellState cellState)
{
switch (cellState.TileSpec)
{
Expand All @@ -121,10 +120,9 @@ private void HandleWalkToTileSpec(IMapCellState cellState)
case TileSpec.ChairDownRight:
case TileSpec.ChairUpLeft:
case TileSpec.ChairAll:
HandleWalkToChair();
break;
return UnwalkableTileAction.Chair;
case TileSpec.Chest:
cellState.ChestKey.Match(
return cellState.ChestKey.Match(
some: key =>
{
if (!_unlockChestValidator.CanMainCharacterOpenChest(key))
Expand All @@ -134,17 +132,17 @@ private void HandleWalkToTileSpec(IMapCellState cellState)
var requiredKey = _unlockChestValidator.GetRequiredKeyName(key);
_statusLabelSetter.SetStatusLabel(EOResourceID.STATUS_LABEL_TYPE_WARNING, EOResourceID.STATUS_LABEL_THE_CHEST_IS_LOCKED_EXCLAMATION, " - " + requiredKey);
return UnwalkableTileAction.None;
}
else
{
// todo: chest request, show dialog
return UnwalkableTileAction.Chest;
}
},
none: () =>
{
// todo: chest request, show dialog
return UnwalkableTileAction.Chest;
});
break;
case TileSpec.BankVault: //todo: locker
//walkValid = Renderer.NoWall;
//if (!walkValid)
Expand All @@ -164,27 +162,15 @@ private void HandleWalkToTileSpec(IMapCellState cellState)
case TileSpec.Jukebox: //todo: jukebox
break;
}
}

private void HandleWalkToChair()
{
// server validates that chair direction is OK and that no one is already sitting there
var rp = _characterProvider.MainCharacter.RenderProperties;
var action = rp.SitState == SitState.Chair ? SitAction.Stand : SitAction.Sit;
var packet = new PacketBuilder(PacketFamily.Chair, PacketAction.Request)
.AddChar((byte)action)
.AddChar((byte)rp.GetDestinationX())
.AddChar((byte)rp.GetDestinationY())
.Build();

_packetSendService.SendPacket(packet);
return UnwalkableTileAction.None;
}

private ICharacter MainCharacter => _characterProvider.MainCharacter;
}

public interface IUnwalkableTileActions
{
void HandleUnwalkableTile();
(UnwalkableTileAction, IMapCellState) HandleUnwalkableTile();
}
}

0 comments on commit 188b9c0

Please sign in to comment.