Skip to content

Commit

Permalink
Implement disband guild (#385)
Browse files Browse the repository at this point in the history
  • Loading branch information
ethanmoffat authored Oct 24, 2024
1 parent f380b5d commit e486caa
Show file tree
Hide file tree
Showing 3 changed files with 107 additions and 62 deletions.
4 changes: 4 additions & 0 deletions EOLib.Localization/EOResourceID.cs
Original file line number Diff line number Diff line change
Expand Up @@ -223,6 +223,10 @@ public enum EOResourceID
GUILD_CURRENT_DESCRIPTION = 234,
GUILD_CLICK_HERE_TO_CHANGE_THE_DESCRIPTION = 235,

GUILD_DISBAND_DESCRIPTION_1 = 237,
GUILD_DISBAND_DESCRIPTION_2 = 238,
GUILD_DISBAND_DESCRIPTION_3 = 239,

GUILD_BANK_STATUS = 244,
GUILD_BANK_DESCRIPTION_1 = 245,
GUILD_BANK_DESCRIPTION_2 = 246,
Expand Down
7 changes: 6 additions & 1 deletion EOLib/Domain/Interact/Guild/GuildActions.cs
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
using System.Collections.Generic;
using AutomaticTypeMapper;
using EOLib.Domain.Character;
using EOLib.Domain.Notifiers;
using EOLib.Net.Communication;
using Moffat.EndlessOnline.SDK.Protocol.Net.Client;
using Optional;
Expand Down Expand Up @@ -124,6 +123,11 @@ public void CancelGuildCreate()
{
_guildSessionRepository.CreationSession = Option.None<GuildCreationSession>();
}

public void DisbandGuild()
{
_packetSendService.SendPacket(new GuildJunkClientPacket { SessionId = _guildSessionRepository.SessionID });
}
}

public interface IGuildActions
Expand All @@ -149,5 +153,6 @@ public interface IGuildActions
void ConfirmGuildCreate(GuildCreationSession creationSession);

void CancelGuildCreate();
void DisbandGuild();
}
}
158 changes: 97 additions & 61 deletions EndlessClient/Dialogs/GuildDialog.cs
Original file line number Diff line number Diff line change
Expand Up @@ -48,9 +48,6 @@ private enum GuildDialogState
AssignRank,
RemoveMember,
Disband,

// Bank List Items
Deposit
}

private class State
Expand All @@ -67,6 +64,8 @@ private class State

public static State Management => new(GuildDialogState.Management);

public static State BankAccount => new(GuildDialogState.BankAccount);

public static State GuildLookup => new(GuildDialogState.Lookup);

public static State ViewMembers => new(GuildDialogState.ViewMembers);
Expand All @@ -89,8 +88,6 @@ private class State

public static State Disband => new(GuildDialogState.Disband);

public static State Deposit => new(GuildDialogState.Deposit);

private State(GuildDialogState dialogState)
{
DialogState = dialogState;
Expand All @@ -106,7 +103,7 @@ private State(GuildDialogState dialogState)
case GuildDialogState.LeaveGuild:
case GuildDialogState.RegisterGuild:
case GuildDialogState.WaitingForMembers:
case GuildDialogState.Deposit:
case GuildDialogState.BankAccount:
ListItemStyle = ListDialogItem.ListItemStyle.Small;
break;
}
Expand Down Expand Up @@ -188,15 +185,27 @@ public GuildDialog(INativeGraphicsManager nativeGraphicsManager,
_stateTransitions = new Dictionary<State, Action>
{
{ State.Initial, SetupInitialState },

// top-level state transitions
{ State.Information, SetupInformationState },
{ State.Administration, SetupAdministrationState },
{ State.Management, SetupManagementState },
{ State.Modify, SetupModifyState },
{ State.BankAccount, SetupBankAccountState },

// Information state transitions
// (none: handled elsewhere)
// TODO: investigate if they can be moved here

// Administration state transitions
{ State.JoinGuild, SetupJoinGuildState },
{ State.LeaveGuild, SetupLeaveGuildState },
{ State.RegisterGuild, SetupRegisterGuildState },
{ State.WaitingForMembers, SetupWaitingForMembersState },
{ State.Deposit, SetupDepositState },

// Management state transitions
{ State.Modify, SetupModifyState },
// TODO: ranking states
{ State.Disband, SetupDisbandState },
};

SetState(State.Initial);
Expand Down Expand Up @@ -276,7 +285,7 @@ protected override void OnUnconditionalUpdateControl(GameTime gameTime)
});
break;

case GuildDialogState.Deposit:
case GuildDialogState.BankAccount:
if (_lastGuildBalance != _guildSessionProvider.GuildBalance)
{
_guildBalanceListItem.MatchSome(item =>
Expand Down Expand Up @@ -398,8 +407,8 @@ private void SetupInitialState()
SubText = _localizedStringFinder.GetString(EOResourceID.GUILD_DEPOSIT_TO_GUILD_ACCOUNT),
OffsetY = 45,
};
bankAccountItem.LeftClick += (_, _) => SetStateIfInGuild(State.Deposit);
bankAccountItem.RightClick += (_, _) => SetStateIfInGuild(State.Deposit);
bankAccountItem.LeftClick += (_, _) => SetStateIfInGuild(State.BankAccount);
bankAccountItem.RightClick += (_, _) => SetStateIfInGuild(State.BankAccount);

SetItemList(new List<ListDialogItem> { informationItem, administrationItem, managementItem, bankAccountItem });
}
Expand Down Expand Up @@ -585,34 +594,54 @@ private void SetupManagementState()
SetItemList(new List<ListDialogItem> { modifyGuildItem, manageRankingItem, assignRankItem, removeMemberItem, disbandItem });
}

private void SetupModifyState()
private void SetupBankAccountState()
{
_guildActions.GetGuildDescription(_characterProvider.MainCharacter.GuildTag);
_guildActions.GetGuildBankBalance(_characterProvider.MainCharacter.GuildTag);

AddTextAsListItems(
_contentProvider.Fonts[Constants.FontSize08pt5],
insertLineBreaks: false,
new List<Action> { ShowChangeDescriptionMessageBox },
_localizedStringFinder.GetString(EOResourceID.GUILD_CURRENT_DESCRIPTION),
_guildSessionProvider.GuildDescription,
" ",
_localizedStringFinder.GetString(EOResourceID.GUILD_CLICK_HERE_TO_CHANGE_THE_DESCRIPTION)
insertLineBreaks: true,
new List<Action> { ShowBankDepositMessageBox },
$"{_localizedStringFinder.GetString(EOResourceID.GUILD_BANK_STATUS)} {_guildSessionProvider.GuildBalance}",
_localizedStringFinder.GetString(EOResourceID.GUILD_BANK_DESCRIPTION_1),
_localizedStringFinder.GetString(EOResourceID.GUILD_BANK_DESCRIPTION_2),
_localizedStringFinder.GetString(EOResourceID.GUILD_BANK_DESCRIPTION_3)
);

_modifyGuildDescriptionListItem = Option.Some(ChildControls.OfType<ListDialogItem>().ToList()[1]);
_guildBalanceListItem = Option.Some(ChildControls.OfType<ListDialogItem>().ToList()[0]);

void ShowChangeDescriptionMessageBox()
void ShowBankDepositMessageBox()
{
var dlg = _textInputDialogFactory.Create(_localizedStringFinder.GetString(EOResourceID.GUILD_WORD_DESCRIPTION), 240);
dlg.DialogClosing += (_, e) =>
var hasEnoughMinimumGold = _characterInventoryProvider.ItemInventory
.SingleOrNone(x => x.ItemID == 1)
.Match(some: x => x.Amount >= 1000, none: () => false);
if (!hasEnoughMinimumGold)
{
if (e.Result == XNADialogResult.OK)
var dlg = _messageBoxFactory.CreateMessageBox(DialogResourceID.GUILD_MINIMUM_DEPOSIT_IS_1000);
dlg.ShowDialog();
return;
}

var goldName = _eifFileProvider.EIFFile[1].Name;
var goldInventoryItem = _characterInventoryProvider.ItemInventory.Single(x => x.ItemID == 1);
var transferDialog = _itemTransferDialogFactory.CreateItemTransferDialog(goldName, ItemTransferDialog.TransferType.DropItems, goldInventoryItem.Amount, EOResourceID.DIALOG_TRANSFER_DROP);
transferDialog.DialogClosing += (_, e) =>
{
if (e.Result != XNADialogResult.OK)
return;

if (transferDialog.SelectedAmount < 1000)
{
_guildActions.SetGuildDescription(dlg.ResponseText);
GoBack();
var dlg = _messageBoxFactory.CreateMessageBox(DialogResourceID.GUILD_MINIMUM_DEPOSIT_IS_1000);
dlg.ShowDialog();
return;
}

_guildActions.BankDeposit(transferDialog.SelectedAmount);

GoBack();
};
dlg.ShowDialog();
transferDialog.ShowDialog();
}
}

Expand Down Expand Up @@ -669,54 +698,61 @@ private void SetupWaitingForMembersState()
);
}

private void SetupDepositState()
private void SetupModifyState()
{
_guildActions.GetGuildBankBalance(_characterProvider.MainCharacter.GuildTag);
_guildActions.GetGuildDescription(_characterProvider.MainCharacter.GuildTag);

AddTextAsListItems(
_contentProvider.Fonts[Constants.FontSize08pt5],
insertLineBreaks: true,
new List<Action> { ShowBankDepositMessageBox },
$"{_localizedStringFinder.GetString(EOResourceID.GUILD_BANK_STATUS)} {_guildSessionProvider.GuildBalance}",
_localizedStringFinder.GetString(EOResourceID.GUILD_BANK_DESCRIPTION_1),
_localizedStringFinder.GetString(EOResourceID.GUILD_BANK_DESCRIPTION_2),
_localizedStringFinder.GetString(EOResourceID.GUILD_BANK_DESCRIPTION_3)
insertLineBreaks: false,
new List<Action> { ShowChangeDescriptionMessageBox },
_localizedStringFinder.GetString(EOResourceID.GUILD_CURRENT_DESCRIPTION),
_guildSessionProvider.GuildDescription,
" ",
_localizedStringFinder.GetString(EOResourceID.GUILD_CLICK_HERE_TO_CHANGE_THE_DESCRIPTION)
);

_guildBalanceListItem = Option.Some(ChildControls.OfType<ListDialogItem>().ToList()[0]);
_modifyGuildDescriptionListItem = Option.Some(ChildControls.OfType<ListDialogItem>().ToList()[1]);

void ShowBankDepositMessageBox()
void ShowChangeDescriptionMessageBox()
{
var hasEnoughMinimumGold = _characterInventoryProvider.ItemInventory
.SingleOrNone(x => x.ItemID == 1)
.Match(some: x => x.Amount >= 1000, none: () => false);
if (!hasEnoughMinimumGold)
{
var dlg = _messageBoxFactory.CreateMessageBox(DialogResourceID.GUILD_MINIMUM_DEPOSIT_IS_1000);
dlg.ShowDialog();
return;
}

var goldName = _eifFileProvider.EIFFile[1].Name;
var goldInventoryItem = _characterInventoryProvider.ItemInventory.Single(x => x.ItemID == 1);
var transferDialog = _itemTransferDialogFactory.CreateItemTransferDialog(goldName, ItemTransferDialog.TransferType.DropItems, goldInventoryItem.Amount, EOResourceID.DIALOG_TRANSFER_DROP);
transferDialog.DialogClosing += (_, e) =>
var dlg = _textInputDialogFactory.Create(_localizedStringFinder.GetString(EOResourceID.GUILD_WORD_DESCRIPTION), 240);
dlg.DialogClosing += (_, e) =>
{
if (e.Result != XNADialogResult.OK)
return;

if (transferDialog.SelectedAmount < 1000)
if (e.Result == XNADialogResult.OK)
{
var dlg = _messageBoxFactory.CreateMessageBox(DialogResourceID.GUILD_MINIMUM_DEPOSIT_IS_1000);
dlg.ShowDialog();
return;
_guildActions.SetGuildDescription(dlg.ResponseText);
GoBack();
}
};
dlg.ShowDialog();
}
}

_guildActions.BankDeposit(transferDialog.SelectedAmount);
private void SetupDisbandState()
{
AddTextAsListItems(
_contentProvider.Fonts[Constants.FontSize08pt5],
insertLineBreaks: true,
new List<Action> { ShowDisbandGuildConfirmation },
_localizedStringFinder.GetString(EOResourceID.GUILD_DISBAND),
_localizedStringFinder.GetString(EOResourceID.GUILD_DISBAND_DESCRIPTION_1),
_localizedStringFinder.GetString(EOResourceID.GUILD_DISBAND_DESCRIPTION_2),
_localizedStringFinder.GetString(EOResourceID.GUILD_DISBAND_DESCRIPTION_3)
);

GoBack();
void ShowDisbandGuildConfirmation()
{
var confirmDlg = _messageBoxFactory.CreateMessageBox(DialogResourceID.GUILD_PROMPT_DISBAND_GUILD, EODialogButtons.OkCancel);
confirmDlg.DialogClosing += (_, e) =>
{
if (e.Result == XNADialogResult.OK)
{
_guildActions.DisbandGuild();
_sfxPlayer.PlaySfx(SoundEffectID.LeaveGuild);
}
};
transferDialog.ShowDialog();
confirmDlg.ShowDialog();
}
}

Expand Down

0 comments on commit e486caa

Please sign in to comment.