File size: 2,683 Bytes
ac55997
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
using System;
using Photon.Deterministic;

namespace Quantum
{
  partial struct TurnData
  {
    public void Update(Frame f)
    {
      var config = f.FindAsset<TurnConfig>(ConfigRef.Id);
      if (config == null || !config.UsesTimer || Status != TurnStatus.Active)
      {
        return;
      }
      Ticks++;
      if (Ticks >= config.TurnDurationInTicks)
      {
        f.Signals.OnTurnEnded(this, TurnEndReason.Time);
      }
    }

    public void AccumulateStats(TurnData from)
    {
      Ticks += from.Ticks;
      Number++;
    }

    public void SetType(TurnType newType, Frame f = null)
    {
      if (Type == newType)
      {
        return;
      }
      var previousType = Type;
      Type = newType;
      f?.Events.TurnTypeChanged(this, previousType);
    }

    public void SetStatus(TurnStatus newStatus, Frame f = null)
    {
      if (Status == newStatus)
      {
        return;
      }
      var previousStatus = Status;
      Status = newStatus;
      f?.Events.TurnStatusChanged(this, previousStatus);
      if (Status == TurnStatus.Active)
      {
        f?.Events.TurnActivated(this);
      }
    }

    // frame is only necessary if caller wants to raise events
    public void ResetTicks(Frame f = null)
    {
      ResetData(Type, Status, Entity, Player, ConfigRef, f);
    }

    public void Reset(TurnConfig config, TurnType type, TurnStatus status, Frame f = null)
    {
      ResetData(type, status, Entity, Player, config, f);
    }

    public void Reset(EntityRef entity, PlayerRef owner, Frame f = null)
    {
      ResetData(Type, Status, entity, owner, ConfigRef, f);
    }

    public void Reset(TurnConfig config, TurnType type, TurnStatus status, EntityRef entity, PlayerRef owner, Frame f = null)
    {
      ResetData(type, status, entity, owner, config, f);
    }

    private void ResetData(TurnType type, TurnStatus status, EntityRef entity, PlayerRef owner, AssetRefTurnConfig config, Frame f = null)
    {
      if (entity != EntityRef.None)
      {
        Entity = entity;
      }
      if (owner != PlayerRef.None)
      {
        Player = owner;
      }

      if (config != null)
      {
        ConfigRef = config;
      }

      var previousType = Type;
      Type = type;
      var previousStatus = Status;
      Status = status;

      Ticks = 0;

      if (Type != previousType)
      {
        f?.Events.TurnTypeChanged(this, previousType);
      }

      if (Status != previousStatus)
      {
        f?.Events.TurnStatusChanged(this, previousStatus);
        if (Status == TurnStatus.Active)
        {
          f?.Events.TurnActivated(this);
        }
      }

      f?.Events.TurnTimerReset(this);
    }
  }
}