Samples~/SampleGame/Assets/Scripts/Simulation.cs (103 lines of code) (raw):
// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
// SPDX-License-Identifier: MIT-0
using UnityEngine;
// Logic to initialize the board, receive the chords, determine matches, record scores, repopulate
// the board after a match, send the board for rendering, and send or receive the state of the class from the network code.
[System.Serializable]
public class Simulation
{
private readonly GameLogic _gl;
public Random.State RngState;
public int PlayerIdx;
public int[] BoardColors = new int[9];
public int[] Scores = new int[4];
public bool Playing;
public ulong Frame;
public Simulation(GameLogic gl)
{
_gl = gl;
}
public void ResetBoard()
{
if (_gl.Authoritative)
{
PlayerIdx = 0;
for (int bcNum = 0; bcNum < BoardColors.Length; bcNum++)
{
BoardColors[bcNum] = Random.Range(0, 7);
}
}
}
public void ResetScores()
{
if (_gl.Authoritative)
{
for (int scNum = 0; scNum < Scores.Length; scNum++)
{
Scores[scNum] = _gl.IsConnected(scNum) ? 0 : -1;
}
}
}
public void ResetScore(int playerIdx)
{
Scores[playerIdx] = -1;
}
public void ZeroScore(int playerIdx)
{
Scores[playerIdx] = 0;
}
public bool SimulateOnInput(int playerIdx, Chord inputChord)
{
_gl.Log.WriteLine("SimulateOnInput()");
Debug.Assert(inputChord.Keys.Length == BoardColors.Length);
// test for a match
bool match = false;
int matchColor = -1; // don't know yet
for (int bcNum = 0; bcNum < BoardColors.Length; bcNum++)
{
if (inputChord.Keys[bcNum])
{
if (matchColor == -1)
{
matchColor = BoardColors[bcNum];
}
else
{
if (BoardColors[bcNum] == matchColor)
{
match = true;
}
else
{
match = false;
break;
}
}
}
}
if (match)
{
// yes, a match!
for (int bcNum = 0; bcNum < BoardColors.Length; bcNum++)
{
if (inputChord.Keys[bcNum])
{
BoardColors[bcNum] = Random.Range(0, 7);
Scores[playerIdx]++;
}
}
}
return match;
}
public string Serialize(int playerIdx)
{
PlayerIdx = playerIdx;
RngState = Random.state;
return JsonUtility.ToJson(this);
}
public bool Deserialize(string json)
{
bool priorPlayingState = Playing;
if (!string.IsNullOrEmpty(json))
{
JsonUtility.FromJsonOverwrite(json, this);
Random.state = RngState;
_gl.Status.PlayerIdx = PlayerIdx;
}
return priorPlayingState;
}
}