Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //#define USE_RANDOM_AI
- using UnityEngine;
- using System.Collections;
- using System.Collections.Generic;
- using System.Timers;
- public class Computer : Actor
- {
- #if USE_RANDOM_AI
- public float minTime = 0.1f;
- public float maxTime = 1f;
- private Timer moveTimer;
- private enum Movements
- {
- MoveUp, MoveDown, Place, Nothing,Max
- };
- #endif
- #if PIECE_WAIT_SYSTEM
- private System.Timers.Timer delayTimer;
- private bool delayTimerDone = false;
- #endif //PIECE_WAIT_SYSTEM
- public int randomMoveChance = 0;
- // Use this for initialization
- protected override void Start ()
- {
- base.Start();
- #if PIECE_WAIT_SYSTEM
- delayTimer = new System.Timers.Timer(Random.Range(0, playPieces[playPieces.Count - 1].cooldown * 1000));
- delayTimer.Elapsed += DelayTimerElapsed;
- delayTimer.Start();
- #endif //PIECE_WAIT_SYSTEM
- #if USE_RANDOM_AI
- moveTimer = this.gameObject.AddComponent<Timer>();
- moveTimer.StartTimer(minTime, maxTime, "MoveTimerEnd");
- #endif
- }
- #if PIECE_WAIT_SYSTEM
- void DelayTimerElapsed(object sender, ElapsedEventArgs e)
- {
- delayTimerDone = true;
- /*throw new System.NotImplementedException();*/
- }
- #endif //PIECE_WAIT_SYSTEM
- // Update is called once per frame
- protected override void Update()
- {
- #if !USE_RANDOM_AI && !PIECE_WAIT_SYSTEM
- CalculateMove();//New placement
- #endif
- #if PIECE_WAIT_SYSTEM
- if (delayTimerDone)
- {
- CalculateMove();
- delayTimer.Interval = Random.Range(0, playPieces[playPieces.Count - 1].cooldown * 1000);
- delayTimer.Start();
- delayTimerDone = false;
- }
- #endif
- base.Update();
- }
- //Smart AI
- private void CalculateMove()
- {
- if (Time.timeScale == 0)
- return;
- if (canPlace && !isNotUseable)
- {
- int randomChance = Random.Range(0, 100);
- int selectedPlank = -1;
- if (randomChance < randomMoveChance)
- {
- selectedPlank = Random.Range(0, commonVariable.planks.Count);
- }
- else
- {
- PlayPiece[] playPieces = GameObject.FindObjectsOfType<PlayPiece>();
- float[] powerLane = new float[commonVariable.planks.Count];
- for (int i = 0; i < playPieces.Length; i++)
- {
- if (playPieces[i].power > 0)
- {
- if (playPieces[i].team == this.team)
- {
- powerLane[playPieces[i].placedLane] += playPieces[i].power;
- }
- else
- {
- powerLane[playPieces[i].placedLane] -= playPieces[i].power;
- }
- }
- }
- for (int p = 0; p < powerLane.Length; p++)
- {
- if (this.selectedPiece.pieceType == PlayPiece.PieceType.BARREL)//We got a barrel
- {
- if (powerLane[p] < 0 && powerLane[p] > -100)
- {
- if (selectedPlank >= 0)
- {
- if (powerLane[selectedPlank] < powerLane[p])
- selectedPlank = p;
- }
- else
- {
- selectedPlank = p;
- }
- }
- }
- else
- {
- if (powerLane[p] <= 0 && powerLane[p] > -100)//If we got less power or equal to 0 and there is no barrel there.
- {
- selectedPlank = p;
- if (powerLane[p] + this.selectedPiece.power >= 0)
- selectedPlank = p;
- }
- }
- }
- if (selectedPlank < 0)
- selectedPlank = Random.Range(0, commonVariable.planks.Count);
- }//End not Random
- SelectNewPlank(selectedPlank);
- while (!PlacePiece())//One shall not keep spamming to place when we can't place there!
- {
- selectedPlank = Random.Range(0, commonVariable.planks.Count);
- SelectNewPlank(selectedPlank);
- }
- }//End can place
- }//End function
- #if USE_RANDOM_AI
- private void Movement()
- {
- if (Time.timeScale == 0)
- return;
- int random = Random.Range(0, (int)(Movements.Max -1));
- switch (random)
- {
- case (int)Movements.MoveUp:
- SelectNewPlank(selectedPlank - 1);
- break;
- case (int)Movements.MoveDown:
- SelectNewPlank(selectedPlank + 1);
- break;
- case (int)Movements.Place:
- this.PlacePiece();
- break;
- case (int)Movements.Nothing:
- break;
- default:
- Debug.LogError("Error no move found move:" + random);
- return;
- }
- }
- private void MoveTimerEnd()
- {
- Movement();
- moveTimer.StartTimer(Random.Range(minTime, maxTime), 0, "MoveTimerEnd");
- }
- #endif
- #if PIECE_WAIT_SYSTEM
- private void OnDestroy()
- {
- delayTimer.Stop();
- delayTimer.Elapsed -= DelayTimerElapsed;
- delayTimer.Dispose();
- delayTimer = null;
- }
- #endif
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement