AI starts up automatically, special tiles are in
This commit is contained in:
parent
586098b3cf
commit
e7ee38dd1e
|
@ -50,6 +50,8 @@ public class GameBoard : EntityBase, IAutoSerialize, IAutoDeserialize {
|
|||
// Tile timing
|
||||
private int TilesUntilActivator = 3;
|
||||
int nextActivator = -1;
|
||||
private int ActivatorsUntilSpecial = 10;
|
||||
int nextSpecial = -1;
|
||||
|
||||
public float nextRootX = -1, nextRootY = 12;
|
||||
|
||||
|
@ -65,6 +67,11 @@ public class GameBoard : EntityBase, IAutoSerialize, IAutoDeserialize {
|
|||
|
||||
lastActivatorColor = activator.color;
|
||||
|
||||
if (++nextSpecial >= ActivatorsUntilSpecial) {
|
||||
nextSpecial = 0;
|
||||
activator.kind = TileKind.Special;
|
||||
}
|
||||
|
||||
if (Random.value > 0.5f) {
|
||||
pair.left = activator;
|
||||
} else {
|
||||
|
@ -108,8 +115,9 @@ public class GameBoard : EntityBase, IAutoSerialize, IAutoDeserialize {
|
|||
case DelayState.Collapse:
|
||||
if (timeInState > airCollapseTime) {
|
||||
board = Collapse(board); // Remove air
|
||||
board = SpecialActivation(board, out bool didSpecial);
|
||||
board = ActivateOnce(board, out bool didActivate);
|
||||
if (didActivate) {
|
||||
if (didActivate || didSpecial) {
|
||||
delayState = DelayState.Combo;
|
||||
++Combo;
|
||||
} else {
|
||||
|
@ -459,6 +467,48 @@ public class GameBoard : EntityBase, IAutoSerialize, IAutoDeserialize {
|
|||
return bs;
|
||||
}
|
||||
|
||||
// Activate all special tiles
|
||||
BoardState SpecialActivation(BoardState bs, out bool didActivate) {
|
||||
|
||||
didActivate = false;
|
||||
//return bs; // Test short-circuit
|
||||
|
||||
for (int x = 0; x < bs.Count; ++x) {
|
||||
var col = bs[x];
|
||||
for (int y = 0; y < col.Count; ++y) {
|
||||
var tile = col[y];
|
||||
if (tile.kind == TileKind.Special) {
|
||||
if (y > 0) {
|
||||
// Get the color of the tile we are on top of
|
||||
var under = col[y - 1];
|
||||
tile.kind = TileKind.Activiting;
|
||||
tile.color = under.color;
|
||||
bs = ActivateAllColor(bs, under.color);
|
||||
didActivate = true;
|
||||
} else {
|
||||
// Special tile is on the bottom, swap it to a random activating tile
|
||||
tile = TileInfo.CreateRandomActivatorTile();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return bs;
|
||||
}
|
||||
|
||||
BoardState ActivateAllColor(BoardState bs,TileColor tc) {
|
||||
for (int x = 0; x < bs.Count; ++x) {
|
||||
var col = bs[x];
|
||||
for (int y = 0; y < col.Count; ++y) {
|
||||
var tile = col[y];
|
||||
if (tile.color == tc) {
|
||||
tile.kind = TileKind.Activiting;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return bs;
|
||||
}
|
||||
|
||||
int CountActivations(BoardState bs) {
|
||||
int total = 0;
|
||||
foreach(var col in bs) {
|
||||
|
@ -620,12 +670,16 @@ public class GameBoard : EntityBase, IAutoSerialize, IAutoDeserialize {
|
|||
public void Setup(){
|
||||
board = BoardStateExtension.Initialize();
|
||||
|
||||
StopAllCoroutines(); // Murder all coroutines :'D
|
||||
// This is to reset the AI
|
||||
|
||||
// Build the list of possible placements the AI may use
|
||||
PossiblePlacements = GetAllPossibilities();
|
||||
|
||||
lastActivatorColor = TileInfo.CreateRandomActivatorTile().color;
|
||||
|
||||
nextActivator = TilesUntilActivator;
|
||||
nextSpecial = ActivatorsUntilSpecial;
|
||||
delayState = DelayState.None;
|
||||
timeInState = 0;
|
||||
|
||||
|
@ -690,6 +744,8 @@ public class GameBoard : EntityBase, IAutoSerialize, IAutoDeserialize {
|
|||
repeat = false;
|
||||
bs = Collapse(bs);
|
||||
bs = Activate(bs);
|
||||
bs = SpecialActivation(bs, out bool didActivate);
|
||||
|
||||
var newActivations = CountActivations(bs);
|
||||
if (newActivations > 0) {
|
||||
comboLength += 1;
|
||||
|
@ -811,14 +867,21 @@ public class GameBoard : EntityBase, IAutoSerialize, IAutoDeserialize {
|
|||
}
|
||||
|
||||
[ContextMenu("Startup AI")]
|
||||
public void StartAI() {
|
||||
public void StartAIDefault() {
|
||||
StartAI();
|
||||
}
|
||||
|
||||
public void StartAI(float thinkTime = 0.5f) {
|
||||
AIEnabled = true;
|
||||
AIMoveTime = thinkTime;
|
||||
StartCoroutine(AIThink());
|
||||
}
|
||||
|
||||
public bool AIEnabled = false;
|
||||
public float AIMoveTime = 0.5f;
|
||||
IEnumerator AIThink() {
|
||||
yield return null; // Wait a frame before trying any shit
|
||||
|
||||
int totalMoves = 0;
|
||||
while (delayState != DelayState.Loss) {
|
||||
if (!AIEnabled)
|
||||
|
|
|
@ -14,6 +14,9 @@ public class GameBoardInstance : MonoBehaviour {
|
|||
public Sprite[] lit;
|
||||
public Sprite[] activators;
|
||||
|
||||
[Header("AI difficulty, 0(easy)-3(hardest)")]
|
||||
public int AIDifficulty = 1;
|
||||
|
||||
private void Awake() {
|
||||
instance = this;
|
||||
}
|
||||
|
@ -35,7 +38,9 @@ public class GameBoardInstance : MonoBehaviour {
|
|||
|
||||
player1.Setup();
|
||||
player2.Setup();
|
||||
}
|
||||
|
||||
player2.StartAI(new[] { 0.5f, 0.2f, 0.1f, 0f }[AIDifficulty]);
|
||||
}
|
||||
|
||||
GameTransition.Instance.state = GameState.InGame;
|
||||
}
|
||||
|
|
|
@ -26,6 +26,10 @@ public class TileRender : MonoBehaviour {
|
|||
case TileKind.Activiting:
|
||||
sprites = GameBoardInstance.instance.lit;
|
||||
break;
|
||||
case TileKind.Special:
|
||||
int timeSprite = (int)(Time.time * 4);
|
||||
renderer.sprite = GameBoardInstance.instance.activators[timeSprite % 4];
|
||||
return;
|
||||
default:
|
||||
sprites = null;
|
||||
Debug.LogErrorFormat(this.gameObject,"{0}, {1}, {2} not supported by tile display", tile.color, tile.kind, tile.counter);
|
||||
|
|
Loading…
Reference in New Issue