public override IEnumerator Execute(Board board, Lock locker = null) { if (locker != null) { locker.SignalStart(); } foreach (GameObject g_ in board.tiles) { GridTile g = g_.GetComponent <GridTile>(); if (this.InQuadrant(g.position, board.size)) { g.Animate(new HueSine(), Colors.DOOM, true); g.MakeInAccessible(); if (g.IsInhabited() && g.inhabitant is Agent) { ((Agent)g.inhabitant).DoDamage(1); } // TODO: add accessibility toggle? } } if (locker != null) { locker.SignalStop(); } yield return(null); }
private IEnumerator AnimateWorldCollapse(World world) { int n = 1; collapseLock.SignalStart(); while (world.IsAnimating()) { yield return(null); } foreach (GridObject o in world.gridObjects) { n++; o.Animate(new Fader(), Colors.collapseFadeColor, true); yield return(new WaitForSeconds(3.0f / (n * n))); } List <GridTile> tiles = new List <GridTile>(); foreach (GameObject tile_ in world.board.tiles) { GridTile tile = tile_.GetComponent <GridTile>(); tiles.Add(tile); } foreach (GridTile tile in tiles.OrderBy(i => UnityEngine.Random.Range(0, 100))) { n++; tile.Animate(new Fader(), Colors.collapseFadeColor, true); yield return(new WaitForSeconds(3.0f / (n * n))); } while (world.IsAnimating()) { yield return(null); } Vector3 worldPos = world.board.tiles[2, 2].GetComponent <GridTile>().Center(); Vector2 cameraPos = Camera.main.WorldToScreenPoint(worldPos); GameObject savedText = (GameObject)Instantiate(Resources.Load("SavedIntegText_pf"), uiCanvas.transform); savedText.transform.position = cameraPos; float worldSize = world.scale * 800f; savedText.GetComponent <RectTransform>().sizeDelta = new Vector2(worldSize, worldSize); savedText.GetComponent <Text>().text = "Saved " + Mathf.Ceil((world.integrity * 100)) + "%"; yield return(new WaitForSeconds(3)); Destroy(savedText); collapseLock.SignalStop(); this.DestroyWorld(world); if (worlds.Count == 0) { StartCoroutine(gameController.NewWorld()); } }