Skip to content

Commit

Permalink
Added decision popup, improved text popup positioning
Browse files Browse the repository at this point in the history
  • Loading branch information
Pyrdacor committed Sep 11, 2020
1 parent eec240d commit 8894be7
Show file tree
Hide file tree
Showing 15 changed files with 374 additions and 202 deletions.
113 changes: 74 additions & 39 deletions Ambermoon.Core/Game.cs
Expand Up @@ -76,7 +76,7 @@ class TimedGameEvent
// Note: These are not meant for ingame stuff but for fade effects etc that use real time.
readonly List<TimedGameEvent> timedEvents = new List<TimedGameEvent>();
readonly Movement movement;
uint currentTicks = 0;
internal uint CurrentTicks { get; private set; } = 0;
uint lastMapTicksReset = 0;
uint lastMoveTicksReset = 0;
readonly NameProvider nameProvider;
Expand Down Expand Up @@ -234,10 +234,10 @@ public void Update(double deltaTime)

uint add = (uint)Util.Round(TicksPerSecond * (float)deltaTime);

if (currentTicks <= uint.MaxValue - add)
currentTicks += add;
if (CurrentTicks <= uint.MaxValue - add)
CurrentTicks += add;
else
currentTicks = (uint)(((long)currentTicks + add) % uint.MaxValue);
CurrentTicks = (uint)(((long)CurrentTicks + add) % uint.MaxValue);

if (ingame)
{
Expand All @@ -247,12 +247,12 @@ public void Update(double deltaTime)
}
else // 2D
{
var animationTicks = currentTicks >= lastMapTicksReset ? currentTicks - lastMapTicksReset : (uint)((long)currentTicks + uint.MaxValue - lastMapTicksReset);
var animationTicks = CurrentTicks >= lastMapTicksReset ? CurrentTicks - lastMapTicksReset : (uint)((long)CurrentTicks + uint.MaxValue - lastMapTicksReset);
renderMap2D.UpdateAnimations(animationTicks);
}
}

var moveTicks = currentTicks >= lastMoveTicksReset ? currentTicks - lastMoveTicksReset : (uint)((long)currentTicks + uint.MaxValue - lastMoveTicksReset);
var moveTicks = CurrentTicks >= lastMoveTicksReset ? CurrentTicks - lastMoveTicksReset : (uint)((long)CurrentTicks + uint.MaxValue - lastMoveTicksReset);

if (moveTicks >= movement.MovementTicks(is3D))
{
Expand All @@ -261,10 +261,10 @@ public void Update(double deltaTime)
else
Move();

lastMoveTicksReset = currentTicks;
lastMoveTicksReset = CurrentTicks;
}

layout.Update(currentTicks);
layout.Update(CurrentTicks);
}

Position GetMousePosition(Position position)
Expand Down Expand Up @@ -296,7 +296,7 @@ void ResetMoveKeys()
keys[(int)Key.Down] = false;
keys[(int)Key.Left] = false;
keys[(int)Key.Right] = false;
lastMoveTicksReset = currentTicks;
lastMoveTicksReset = CurrentTicks;
}

public Color GetTextColor(TextColor textColor) => GetPaletteColor(51, (int)textColor);
Expand Down Expand Up @@ -350,7 +350,7 @@ internal void Start2D(Map map, uint playerX, uint playerY, CharacterDirection di
}

player2D.Visible = true;
player2D.MoveTo(map, playerX, playerY, currentTicks, true, direction);
player2D.MoveTo(map, playerX, playerY, CurrentTicks, true, direction);

var mapOffset = map.MapOffset;
player.Position.X = mapOffset.X + (int)playerX - (int)renderMap2D.ScrollX;
Expand All @@ -376,7 +376,7 @@ internal void Start3D(Map map, uint playerX, uint playerY, CharacterDirection di
is3D = true;
renderMap2D.Destroy();
renderMap3D.SetMap(map, playerX, playerY, direction);
player3D.SetPosition((int)playerX, (int)playerY, currentTicks);
player3D.SetPosition((int)playerX, (int)playerY, CurrentTicks);
if (player2D != null)
player2D.Visible = false;
player.Position.X = (int)playerX;
Expand Down Expand Up @@ -531,32 +531,32 @@ internal void Move(CursorType cursorType)
switch (cursorType)
{
case CursorType.ArrowForward:
player3D.MoveForward(movement.MoveSpeed3D * Global.DistancePerTile, currentTicks);
player3D.MoveForward(movement.MoveSpeed3D * Global.DistancePerTile, CurrentTicks);
break;
case CursorType.ArrowBackward:
player3D.MoveBackward(movement.MoveSpeed3D * Global.DistancePerTile, currentTicks);
player3D.MoveBackward(movement.MoveSpeed3D * Global.DistancePerTile, CurrentTicks);
break;
case CursorType.ArrowStrafeLeft:
player3D.MoveLeft(movement.MoveSpeed3D * Global.DistancePerTile, currentTicks);
player3D.MoveLeft(movement.MoveSpeed3D * Global.DistancePerTile, CurrentTicks);
break;
case CursorType.ArrowStrafeRight:
player3D.MoveRight(movement.MoveSpeed3D * Global.DistancePerTile, currentTicks);
player3D.MoveRight(movement.MoveSpeed3D * Global.DistancePerTile, CurrentTicks);
break;
case CursorType.ArrowTurnLeft:
player3D.TurnLeft(movement.TurnSpeed3D * 0.7f);
player3D.MoveForward(movement.MoveSpeed3D * Global.DistancePerTile * 0.75f, currentTicks);
player3D.MoveForward(movement.MoveSpeed3D * Global.DistancePerTile * 0.75f, CurrentTicks);
break;
case CursorType.ArrowTurnRight:
player3D.TurnRight(movement.TurnSpeed3D * 0.7f);
player3D.MoveForward(movement.MoveSpeed3D * Global.DistancePerTile * 0.75f, currentTicks);
player3D.MoveForward(movement.MoveSpeed3D * Global.DistancePerTile * 0.75f, CurrentTicks);
break;
case CursorType.ArrowRotateLeft:
player3D.TurnLeft(movement.TurnSpeed3D * 0.7f);
player3D.MoveBackward(movement.MoveSpeed3D * Global.DistancePerTile * 0.75f, currentTicks);
player3D.MoveBackward(movement.MoveSpeed3D * Global.DistancePerTile * 0.75f, CurrentTicks);
break;
case CursorType.ArrowRotateRight:
player3D.TurnRight(movement.TurnSpeed3D * 0.7f);
player3D.MoveBackward(movement.MoveSpeed3D * Global.DistancePerTile * 0.75f, currentTicks);
player3D.MoveBackward(movement.MoveSpeed3D * Global.DistancePerTile * 0.75f, CurrentTicks);
break;
default:
clickMoveActive = false;
Expand Down Expand Up @@ -602,15 +602,15 @@ bool Move2D(int x, int y)
{
bool diagonal = x != 0 && y != 0;

if (!player2D.Move(x, y, currentTicks))
if (!player2D.Move(x, y, CurrentTicks))
{
if (!diagonal)
return false;

var prevDirection = player2D.Direction;

if (!player2D.Move(0, y, currentTicks, prevDirection))
return player2D.Move(x, 0, currentTicks, prevDirection);
if (!player2D.Move(0, y, CurrentTicks, prevDirection))
return player2D.Move(x, 0, CurrentTicks, prevDirection);
}

return true;
Expand Down Expand Up @@ -652,7 +652,7 @@ void Move()
Move2D(x, -1);
}
else
player3D.MoveForward(movement.MoveSpeed3D * Global.DistancePerTile, currentTicks);
player3D.MoveForward(movement.MoveSpeed3D * Global.DistancePerTile, CurrentTicks);
}
if (keys[(int)Key.Down] && !keys[(int)Key.Up])
{
Expand All @@ -663,7 +663,7 @@ void Move()
Move2D(x, 1);
}
else
player3D.MoveBackward(movement.MoveSpeed3D * Global.DistancePerTile, currentTicks);
player3D.MoveBackward(movement.MoveSpeed3D * Global.DistancePerTile, CurrentTicks);
}
}

Expand Down Expand Up @@ -719,7 +719,7 @@ public void OnKeyDown(Key key, KeyModifiers modifiers)
int index = key - Key.Num1;
int column = index % 3;
int row = 2 - index / 3;
var newCursorType = layout.PressButton(column + row * 3, currentTicks);
var newCursorType = layout.PressButton(column + row * 3, CurrentTicks);

if (newCursorType != null)
CursorType = newCursorType.Value;
Expand All @@ -732,7 +732,7 @@ public void OnKeyDown(Key key, KeyModifiers modifiers)
break;
}

lastMoveTicksReset = currentTicks;
lastMoveTicksReset = CurrentTicks;
}

public void OnKeyUp(Key key, KeyModifiers modifiers)
Expand Down Expand Up @@ -784,7 +784,7 @@ public void OnMouseUp(Position position, MouseButtons buttons)

if (buttons.HasFlag(MouseButtons.Right))
{
layout.RightMouseUp(renderView.ScreenToGame(position), out CursorType? cursorType, currentTicks);
layout.RightMouseUp(renderView.ScreenToGame(position), out CursorType? cursorType, CurrentTicks);

if (cursorType != null)
CursorType = cursorType.Value;
Expand All @@ -794,7 +794,7 @@ public void OnMouseUp(Position position, MouseButtons buttons)
leftMouseDown = false;
clickMoveActive = false;

layout.LeftMouseUp(renderView.ScreenToGame(position), out CursorType? cursorType, currentTicks);
layout.LeftMouseUp(renderView.ScreenToGame(position), out CursorType? cursorType, CurrentTicks);

if (cursorType != null && cursorType != CursorType.None)
CursorType = cursorType.Value;
Expand Down Expand Up @@ -843,7 +843,7 @@ public void OnMouseDown(Position position, MouseButtons buttons)
else
{
var cursorType = CursorType.Sword;
layout.Click(relativePosition, buttons, ref cursorType, currentTicks);
layout.Click(relativePosition, buttons, ref cursorType, CurrentTicks);
CursorType = cursorType;

if (InputEnable)
Expand Down Expand Up @@ -1042,7 +1042,7 @@ void TriggerMapEvents(MapEventTrigger trigger, Position position)
else // 2D
{
var tilePosition = renderMap2D.PositionToTile(position);
renderMap2D.TriggerEvents(player2D, trigger, (uint)tilePosition.X, (uint)tilePosition.Y, mapManager, currentTicks);
renderMap2D.TriggerEvents(player2D, trigger, (uint)tilePosition.X, (uint)tilePosition.Y, mapManager, CurrentTicks);
}
}

Expand Down Expand Up @@ -1142,8 +1142,8 @@ internal void OpenPartyMember(int slot)
#endregion
#region Character info
layout.FillArea(new Rect(208, 49, 96, 80), Color.LightGray, false);
layout.AddSprite(new Rect(208, 49, 32, 34), Graphics.UIElementOffset + (uint)UICustomGraphic.PortraitBackground, 50, true, 1);
layout.AddSprite(new Rect(208, 49, 32, 34), Graphics.PortraitOffset + partyMember.PortraitIndex - 1, 49, false, 2);
layout.AddSprite(new Rect(208, 49, 32, 34), Graphics.UICustomGraphicOffset + (uint)UICustomGraphic.PortraitBackground, 50, 1);
layout.AddSprite(new Rect(208, 49, 32, 34), Graphics.PortraitOffset + partyMember.PortraitIndex - 1, 49, 2);
layout.AddText(new Rect(242, 49, 62, 7), DataNameProvider.GetRaceName(partyMember.Race));
layout.AddText(new Rect(242, 56, 62, 7), DataNameProvider.GetGenderName(partyMember.Gender));
layout.AddText(new Rect(242, 63, 62, 7), string.Format(DataNameProvider.CharacterInfoAgeString.Replace("000", "0"),
Expand Down Expand Up @@ -1199,7 +1199,7 @@ internal void Teleport(MapChangeEvent mapChangeEvent)
// in non-world 2D so subtract another 1 from y.
player.MoveTo(newMap, mapChangeEvent.X - 1,
mapChangeEvent.Y - (newMap.Type == MapType.Map2D && !newMap.IsWorldMap ? 2u : 1u),
currentTicks, true, mapChangeEvent.Direction);
CurrentTicks, true, mapChangeEvent.Direction);
ShowMap(true);
});
}
Expand Down Expand Up @@ -1278,25 +1278,57 @@ internal void ShowChest(ChestMapEvent chestMapEvent)
});
}

internal void ShowTextPopup(PopupTextEvent popupTextEvent)
internal void ShowTextPopup(PopupTextEvent popupTextEvent, Action<PopupTextEvent.Response> responseHandler)
{
if (popupTextEvent.HasImage)
{
// Those always use a custom layout
layout.SetLayout(LayoutType.Event);

// TODO ...
}
else
{
// Simple text popup
/*var popup = layout.OpenPopup(mapViewArea.Position, (mapViewArea.Width - 32) / 7, 10, true, true); // TODO: sizes and position
popup.AddText(new Rect(mapViewArea.Position + new Position(16, 16), new Size(mapViewArea.Width - 32, 10 * 7)),
Map.Texts[(int)popupTextEvent.TextIndex], TextColor.Gray);*/
var text = renderView.TextProcessor.ProcessText(Map.Texts[(int)popupTextEvent.TextIndex], nameProvider, dictionary);
layout.OpenTextPopup(text, () => InputEnable = true, true, true);
layout.OpenTextPopup(text, () =>
{
InputEnable = true;
responseHandler?.Invoke(PopupTextEvent.Response.Close);
}, true, true);
InputEnable = false;
CursorType = CursorType.Click;
}
}

internal void ShowDecisionPopup(DecisionEvent decisionEvent, Action<PopupTextEvent.Response> responseHandler)
{
var text = renderView.TextProcessor.ProcessText(Map.Texts[(int)decisionEvent.TextIndex], nameProvider, dictionary);
layout.OpenYesNoPopup
(
text,
() =>
{
layout.ClosePopup(false);
InputEnable = true;
responseHandler?.Invoke(PopupTextEvent.Response.Yes);
},
() =>
{
layout.ClosePopup(false);
InputEnable = true;
responseHandler?.Invoke(PopupTextEvent.Response.No);
},
() =>
{
InputEnable = true;
responseHandler?.Invoke(PopupTextEvent.Response.Close);
}
);
InputEnable = false;
CursorType = CursorType.Sword;
}

internal void SetActivePartyMember(int index)
{
var partyMember = GetPartyMember(index);
Expand Down Expand Up @@ -1366,7 +1398,10 @@ internal void CloseWindow()
if (!WindowActive)
return;

currentWindow = lastWindow;
if (currentWindow.Window == lastWindow.Window)
currentWindow = DefaultWindow;
else
currentWindow = lastWindow;

switch (currentWindow.Window)
{
Expand Down
53 changes: 43 additions & 10 deletions Ambermoon.Core/MapExtensions.cs
Expand Up @@ -5,6 +5,7 @@ namespace Ambermoon
{
public enum MapEventTrigger
{
Always,
Move,
Hand,
Eye,
Expand Down Expand Up @@ -48,8 +49,35 @@ public static class MapExtensions
if (!(mapEvent is PopupTextEvent popupTextEvent))
throw new AmbermoonException(ExceptionScope.Data, "Invalid text popup event.");

game.ShowTextPopup(popupTextEvent);
break;
game.ShowTextPopup(popupTextEvent, _ =>
{
TriggerEventChain(map, game, player, MapEventTrigger.Always, x, y, mapManager,
game.CurrentTicks, mapEvent.Next);
});
return null; // next event is only executed after popup response
}
case MapEventType.Decision:
{
if (!(mapEvent is DecisionEvent decisionEvent))
throw new AmbermoonException(ExceptionScope.Data, "Invalid decision event.");

game.ShowDecisionPopup(decisionEvent, response =>
{
if (response == PopupTextEvent.Response.Yes)
{
TriggerEventChain(map, game, player, MapEventTrigger.Always, x, y, mapManager,
game.CurrentTicks, mapEvent.Next);
}
else // Close and No have the same meaning here
{
if (decisionEvent.NoEventIndex != 0xffff)
{
TriggerEventChain(map, game, player, MapEventTrigger.Always, x, y, mapManager,
game.CurrentTicks, map.Events[(int)decisionEvent.NoEventIndex]);
}
}
});
return null; // next event is only executed after popup response
}
case MapEventType.ChangeTile:
{
Expand Down Expand Up @@ -136,6 +164,18 @@ public static class MapExtensions
return mapEvent.Next;
}

static void TriggerEventChain(Map map, Game game, IRenderPlayer player, MapEventTrigger trigger, uint x, uint y,
IMapManager mapManager, uint ticks, MapEvent firstMapEvent)
{
bool lastEventStatus = false;
var mapEvent = firstMapEvent;

while (mapEvent != null)
{
mapEvent = ExecuteEvent(map, game, player, trigger, x, y, mapManager, ticks, mapEvent, ref lastEventStatus);
}
}

public static void TriggerEvents(this Map map, Game game, IRenderPlayer player,
MapEventTrigger trigger, uint x, uint y, IMapManager mapManager, uint ticks)
{
Expand All @@ -150,14 +190,7 @@ public static class MapExtensions
if (mapEventId == 0)
return; // no map events at this position

bool lastEventStatus = false;
var mapEvent = map.EventLists[(int)mapEventId - 1];

while (mapEvent != null)
{
mapEvent = ExecuteEvent(map, game, player, trigger, x, y, mapManager, ticks, mapEvent, ref lastEventStatus);
}
TriggerEventChain(map, game, player, trigger, x, y, mapManager, ticks, map.EventLists[(int)mapEventId - 1]);
}

}
}

0 comments on commit 8894be7

Please sign in to comment.