using System;
using UnityEngine;
namespace VRCBilliardsCE.Packages.com.vrcbilliards.vrcbce.Runtime.Scripts
{
///
/// Eightball code.
///
public partial class PoolStateManager
{
private void Initialize8Ball()
{
ballsArePocketed = new[]
{
false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false
};
for (int i = 0, k = 0; i < 5; i++)
{
for (int j = 0; j <= i; j++)
{
currentBallPositions[rackOrder8Ball[k++]] = new Vector3
(
SPOT_POSITION_X + (i * BALL_PL_Y) + UnityEngine.Random.Range(-RANDOMIZE_F, RANDOMIZE_F),
0.0f,
((-i + (j * 2)) * BALL_PL_X) + UnityEngine.Random.Range(-RANDOMIZE_F, RANDOMIZE_F)
);
currentBallVelocities[k] = Vector3.zero;
currentAngularVelocities[k] = Vector3.zero;
}
}
TeamColors();
}
private void HandleEightBallEndOfTurn(
bool is8Sink,
out int numberOfSunkBlues,
out int numberOfSunkOranges,
ref bool isCorrectBallSunk,
ref bool isOpponentColourSunk,
ref bool foulCondition,
out bool deferLossCondition,
out bool winCondition
)
{
var isBlue = !isOpen && (isTeam2Turn && isTeam2Blue || !isTeam2Turn && !isTeam2Blue);
numberOfSunkBlues = GetNumberOfSunkBlues();
numberOfSunkOranges = GetNumberOfSunkOranges();
var isWrongHit = IsFirstEightBallHitFoul(firstHitBallThisTurn, numberOfSunkBlues, numberOfSunkOranges);
// What balls got sunk this turn?
for (var i = 2; i < NUMBER_OF_SIMULATED_BALLS; i++)
{
if (ballsArePocketed[i] == oldBallsArePocketed[i])
continue;
if (isOpen)
isCorrectBallSunk = true;
else if (isBlue)
{
if (i > 1 && i < 9)
isCorrectBallSunk = true;
else
isOpponentColourSunk = true;
}
else
{
if (i >= 9)
isCorrectBallSunk = true;
else
isOpponentColourSunk = true;
}
}
winCondition = isBlue ? numberOfSunkBlues == 7 && is8Sink : numberOfSunkOranges == 7 && is8Sink;
if (isWrongHit)
{
if (logger)
logger._Log(name, "foul, wrong ball hit");
foulCondition = true;
}
else if (firstHitBallThisTurn == 0)
{
if (logger)
logger._Log(name, "foul, no ball hit");
foulCondition = true;
}
deferLossCondition = is8Sink;
}
private int GetNumberOfSunkOranges()
{
var num = 0;
for (var i = 9; i < 16; i++)
{
if (ballsArePocketed[i])
{
num++;
}
}
return num;
}
private int GetNumberOfSunkBlues()
{
var num = 0;
for (var i = 2; i < 9; i++)
{
if (ballsArePocketed[i])
{
num++;
}
}
return num;
}
private void ApplyEightBallTableColour(bool isTeam2Color)
{
if (!isOpen)
{
if (isTeam2Color)
{
if (isTeam2Blue)
{
tableSrcColour = tableBlue;
cueRenderObjs[0].material.SetColor(uniformCueColour, tableOrange * 0.33f);
cueRenderObjs[1].material.SetColor(uniformCueColour, tableBlue);
}
else
{
tableSrcColour = tableOrange;
cueRenderObjs[0].material.SetColor(uniformCueColour, tableBlue * 0.33f);
cueRenderObjs[1].material.SetColor(uniformCueColour, tableOrange);
}
}
else
{
if (isTeam2Blue)
{
tableSrcColour = tableOrange;
cueRenderObjs[0].material.SetColor(uniformCueColour, tableOrange);
cueRenderObjs[1].material.SetColor(uniformCueColour, tableBlue * 0.33f);
}
else
{
tableSrcColour = tableBlue;
cueRenderObjs[0].material.SetColor(uniformCueColour, tableBlue);
cueRenderObjs[1].material.SetColor(uniformCueColour, tableOrange * 0.33f);
}
}
}
else
{
tableSrcColour = pointerColour2;
cueRenderObjs[Convert.ToInt32(this.isTeam2Turn)].materials[0].SetColor(uniformCueColour, tableWhite);
cueRenderObjs[Convert.ToInt32(!this.isTeam2Turn)].materials[0].SetColor(uniformCueColour, tableBlack);
}
}
private void InitializeEightBallVisuals()
{
pointerColourErr = tableRed;
pointerColour2 = tableWhite;
pointerColour0 = tableBlue;
pointerColour1 = tableOrange;
foreach (MeshRenderer meshRenderer in ballRenderers)
{
meshRenderer.material.SetTexture(MainTex, sets[0]);
}
pointerClothColour = fabricGray;
if (marker9ball)
{
marker9ball.SetActive(false);
}
if (pocketBlockers)
{
pocketBlockers.SetActive(false);
}
// Reset mesh filters on balls that change them
ballTransforms[0].GetComponent().sharedMesh = cueballMeshes[0];
ballTransforms[9].GetComponent().sharedMesh = nineBall;
for (int i = 0; i < NUMBER_OF_SIMULATED_BALLS; i++)
{
if (ballTransforms[i])
{
ballTransforms[i].gameObject.SetActive(true);
}
if (ballShadowPosConstraints[i])
{
ballShadowPosConstraints[i].gameObject.SetActive(true);
}
}
}
private void ReportEightBallScore()
{
if (logger)
{
logger._Log(name, "ReportEightBallScore");
}
int sunkBlues = 0;
int sunkOranges = 0;
for (int i = 2; i < 9; i++)
{
if (ballsArePocketed[i])
{
sunkBlues++;
}
}
for (int i = 9; i < 16; i++)
{
if (ballsArePocketed[i])
{
sunkOranges++;
}
}
if (isGameInMenus)
{
if (isTeam2Winner && ballsArePocketed[1])
{
if (isTeam2Blue)
{
sunkBlues++;
}
else
{
sunkOranges++;
}
}
}
var teamAScore = isTeam2Blue ? sunkOranges : sunkBlues;
var teamBScore = isTeam2Blue ? sunkBlues : sunkOranges;
poolMenu._SetScore(false, teamAScore);
poolMenu._SetScore(true, teamBScore);
if (slogger)
{
slogger.OscReportScoresUpdated(isGameOver, turnID, teamAScore, isFoul, teamBScore);
}
}
private bool IsFirstEightBallHitFoul(int hitBallID, int numberOfSunkBlues, int numberOfSunkOranges)
{
if (isOpen)
return hitBallID == 1;
var isBlue = isTeam2Turn && isTeam2Blue || !isTeam2Turn && !isTeam2Blue;
var winCondition = isBlue ? numberOfSunkBlues == 7 && ballsArePocketed[1] : numberOfSunkOranges == 7 && ballsArePocketed[1];
// Even if you sunk black, if you hit the wrong ball first you still lose.
if (winCondition)
return hitBallID != 1;
// The seven blue balls are stored at idx 2-8.
if (isBlue)
return hitBallID < 2 || hitBallID > 8;
// The seven orange balls are stored at idx 9-15.
return hitBallID < 9;
}
}
}