Skip to content

Commit

Permalink
Update MapCellState to hold optinal chest key instead of chest object
Browse files Browse the repository at this point in the history
Client only needs to know if the chest is locked and that it is a chest - server handles spawn info
  • Loading branch information
ethanmoffat committed Apr 8, 2022
1 parent b7f95ee commit 291e930
Show file tree
Hide file tree
Showing 8 changed files with 97 additions and 57 deletions.
1 change: 1 addition & 0 deletions EOLib/Domain/Character/WalkValidationActions.cs
Expand Up @@ -49,6 +49,7 @@ public bool CanMoveToCoordinates(int gridX, int gridY)
var cellState = _mapCellStateProvider.GetCellStateAt(gridX, gridY);
return IsCellStateWalkable(cellState);
}

public bool IsCellStateWalkable(IMapCellState cellState)
{
var mc = _characterProvider.MainCharacter;
Expand Down
16 changes: 0 additions & 16 deletions EOLib/Domain/Map/Chest.cs

This file was deleted.

2 changes: 1 addition & 1 deletion EOLib/Domain/Map/IMapCellState.cs
Expand Up @@ -20,7 +20,7 @@ public interface IMapCellState

Option<ICharacter> Character { get; }

Option<IChest> Chest { get; }
Option<ChestKey> ChestKey { get; }

Option<IWarp> Warp { get; }

Expand Down
4 changes: 2 additions & 2 deletions EOLib/Domain/Map/MapCellState.cs
Expand Up @@ -20,7 +20,7 @@ public class MapCellState : IMapCellState

public Option<ICharacter> Character { get; set; }

public Option<IChest> Chest { get; set; }
public Option<ChestKey> ChestKey { get; set; }

public Option<IWarp> Warp { get; set; }

Expand All @@ -33,7 +33,7 @@ public MapCellState()
TileSpec = TileSpec.None;
NPC = Option.None<INPC>();
Character = Option.None<ICharacter>();
Chest = Option.None<IChest>();
ChestKey = Option.None<ChestKey>();
Warp = Option.None<IWarp>();
Sign = Option.None<ISign>();
}
Expand Down
4 changes: 2 additions & 2 deletions EOLib/Domain/Map/MapCellStateProvider.cs
Expand Up @@ -33,7 +33,7 @@ public IMapCellState GetCellStateAt(int x, int y)

var tileSpec = CurrentMap.Tiles[y, x];
var warp = CurrentMap.Warps[y, x];
var chest = CurrentMap.Chests.FirstOrDefault(c => c.X == x && c.Y == y);
var chest = CurrentMap.Chests.Where(c => c.X == x && c.Y == y && c.Key != ChestKey.None).Select(c => c.Key).FirstOrDefault();
var sign = CurrentMap.Signs.FirstOrDefault(s => s.X == x && s.Y == y);

var character = _mapStateProvider.Characters.Values.Concat(new[] { _characterProvider.MainCharacter })
Expand All @@ -48,7 +48,7 @@ public IMapCellState GetCellStateAt(int x, int y)
Items = items.ToList(),
TileSpec = tileSpec,
Warp = warp.SomeNotNull().Map<IWarp>(w => new Warp(w)),
Chest = chest.SomeNotNull().Map<IChest>(c => new Chest(c)),
ChestKey = chest.SomeNotNull(),
Sign = sign.SomeNotNull().Map<ISign>(s => new Sign(s)),
Character = character,
NPC = npc
Expand Down
53 changes: 53 additions & 0 deletions EOLib/Domain/Map/UnlockChestValidator.cs
@@ -0,0 +1,53 @@
using System.Linq;
using AutomaticTypeMapper;
using EOLib.Domain.Character;
using EOLib.IO.Map;
using EOLib.IO.Repositories;
using Optional;

namespace EOLib.Domain.Map
{
[AutoMappedType]
public class UnlockChestValidator : IUnlockChestValidator
{
private readonly ICharacterInventoryProvider _characterInventoryProvider;
private readonly IEIFFileProvider _eifFileProvider;

public UnlockChestValidator(ICharacterInventoryProvider characterInventoryProvider,
IEIFFileProvider eifFileProvider)
{
_characterInventoryProvider = characterInventoryProvider;
_eifFileProvider = eifFileProvider;
}

public bool CanMainCharacterOpenChest(ChestKey requiredKey)
{
return GetRequiredKeyName(requiredKey).Match(
some: keyName => _characterInventoryProvider
.ItemInventory
.Where(x => _eifFileProvider.EIFFile[x.ItemID].Type == IO.ItemType.Key)
.Select(x => _eifFileProvider.EIFFile[x.ItemID].Name)
.Any(keyName.Equals),
none: () => true);
}

public Option<string> GetRequiredKeyName(ChestKey requiredKey)
{
switch (requiredKey)
{
case ChestKey.Normal: return Option.Some("Normal Key");
case ChestKey.Silver: return Option.Some("Silver Key");
case ChestKey.Crystal: return Option.Some("Crystal Key");
case ChestKey.Wraith: return Option.Some("Wraith Key");
default: return Option.None<string>();
}
}
}

public interface IUnlockChestValidator
{
bool CanMainCharacterOpenChest(ChestKey requiredKey);

Option<string> GetRequiredKeyName(ChestKey requiredKey);
}
}
6 changes: 5 additions & 1 deletion EndlessClient/Controllers/MapInteractionController.cs
Expand Up @@ -14,6 +14,7 @@
using EOLib.Domain.Interact;
using EOLib.Domain.Item;
using EOLib.Domain.Map;
using EOLib.IO.Map;
using EOLib.Localization;
using Optional;
using Optional.Collections;
Expand Down Expand Up @@ -92,7 +93,10 @@ public void LeftClick(IMapCellState cellState, IMouseCursorRenderer mouseRendere
var messageBox = _eoMessageBoxFactory.CreateMessageBox(sign.Message, sign.Title);
messageBox.ShowDialog();
}
else if (cellState.Chest.HasValue) { /* TODO: chest interaction */ }
else if (cellState.TileSpec == TileSpec.Chest)
{
// todo: chest request, show dialog
}
else if (_characterProvider.MainCharacter.RenderProperties.SitState != SitState.Standing)
{
_characterActions.ToggleSit();
Expand Down
68 changes: 33 additions & 35 deletions EndlessClient/Input/UnwalkableTileActions.cs
@@ -1,4 +1,5 @@
using AutomaticTypeMapper;
using EndlessClient.Dialogs;
using EndlessClient.Dialogs.Factories;
using EndlessClient.HUD;
using EOLib.Domain.Character;
Expand All @@ -20,24 +21,30 @@ public class UnwalkableTileActions : IUnwalkableTileActions
private readonly IStatusLabelSetter _statusLabelSetter;
private readonly ICurrentMapStateRepository _currentMapStateRepository;
private readonly IUnlockDoorValidator _unlockDoorValidator;
private readonly IUnlockChestValidator _unlockChestValidator;
private readonly IEOMessageBoxFactory _eoMessageBoxFactory;
private readonly IPacketSendService _packetSendService;
private readonly IEOMessageBoxFactory _messageBoxFactory;

public UnwalkableTileActions(IMapCellStateProvider mapCellStateProvider,
ICharacterProvider characterProvider,
IStatusLabelSetter statusLabelSetter,
ICurrentMapStateRepository currentMapStateRepository,
IUnlockDoorValidator unlockDoorValidator,
IEOMessageBoxFactory eoMessageBoxFactory,
IPacketSendService packetSendService)
ICharacterProvider characterProvider,
IStatusLabelSetter statusLabelSetter,
ICurrentMapStateRepository currentMapStateRepository,
IUnlockDoorValidator unlockDoorValidator,
IUnlockChestValidator unlockChestValidator,
IEOMessageBoxFactory eoMessageBoxFactory,
IPacketSendService packetSendService,
IEOMessageBoxFactory messageBoxFactory)
{
_mapCellStateProvider = mapCellStateProvider;
_characterProvider = characterProvider;
_statusLabelSetter = statusLabelSetter;
_currentMapStateRepository = currentMapStateRepository;
_unlockDoorValidator = unlockDoorValidator;
_unlockChestValidator = unlockChestValidator;
_eoMessageBoxFactory = eoMessageBoxFactory;
_packetSendService = packetSendService;
_messageBoxFactory = messageBoxFactory;
}

public void HandleUnwalkableTile()
Expand Down Expand Up @@ -116,36 +123,27 @@ private void HandleWalkToTileSpec(IMapCellState cellState)
case TileSpec.ChairAll:
HandleWalkToChair();
break;
case TileSpec.Chest: //todo: chests
//if (!walkValid)
//{
// var chest = OldWorld.Instance.ActiveMapRenderer.MapRef.Chests.Single(_c => _c.X == destX && _c.Y == destY);
// if (chest != null)
// {
// string requiredKey = null;
// switch (Character.CanOpenChest(chest))
// {
// case ChestKey.Normal: requiredKey = "Normal Key"; break;
// case ChestKey.Silver: requiredKey = "Silver Key"; break;
// case ChestKey.Crystal: requiredKey = "Crystal Key"; break;
// case ChestKey.Wraith: requiredKey = "Wraith Key"; break;
// default:
// ChestDialog.Show(((EOGame)Game).API, (byte)chest.X, (byte)chest.Y);
// break;
// }
case TileSpec.Chest:
cellState.ChestKey.Match(
some: key =>
{
if (!_unlockChestValidator.CanMainCharacterOpenChest(key))
{
var dlg = _messageBoxFactory.CreateMessageBox(DialogResourceID.CHEST_LOCKED);
dlg.ShowDialog();
// if (requiredKey != null)
// {
// EOMessageBox.Show(DialogResourceID.CHEST_LOCKED, XNADialogButtons.Ok, EOMessageBoxStyle.SmallDialogSmallHeader);
// ((EOGame)Game).Hud.SetStatusLabel(EOResourceID.STATUS_LABEL_TYPE_WARNING, EOResourceID.STATUS_LABEL_THE_CHEST_IS_LOCKED_EXCLAMATION,
// " - " + requiredKey);
// }
// }
// else
// {
// ChestDialog.Show(((EOGame)Game).API, destX, destY);
// }
//}
var requiredKey = _unlockChestValidator.GetRequiredKeyName(key);
_statusLabelSetter.SetStatusLabel(EOResourceID.STATUS_LABEL_TYPE_WARNING, EOResourceID.STATUS_LABEL_THE_CHEST_IS_LOCKED_EXCLAMATION, " - " + requiredKey);
}
else
{
// todo: chest request, show dialog
}
},
none: () =>
{
// todo: chest request, show dialog
});
break;
case TileSpec.BankVault: //todo: locker
//walkValid = Renderer.NoWall;
Expand Down

0 comments on commit 291e930

Please sign in to comment.