void OnChange(Virus.Id id, Position from, Position to) { var changed = VirusFromId(id).First(); changed.VirusPosition = to; // Pull up if (1 < to.Y && to.Y < from.Y) { Where(to.WithY(to.Y + 1), downer => Change.Invoke(downer.VirusId, downer.VirusPosition, to)); } // Place if (1 < to.Y && from == Position.Hand()) { Where(to.WithY(to.Y - 1), upper => { if (!( (upper.VirusGrade == Virus.Grade.Big && changed.VirusGrade == Virus.Grade.Mid) || (upper.VirusGrade == Virus.Grade.Mid && changed.VirusGrade == Virus.Grade.Tiny) )) { return; } Absorb.Invoke(upper.VirusId, changed.VirusId); }); } }
void OnBreak(Ruling.Virus.Id id) { var v = viruses[id]; var pos = v.transform.position; Destroy(v.gameObject); StartCoroutine(GenerateBursts(pos)); }
void OnAbsorb(Ruling.Virus.Id eaterId, Ruling.Virus.Id eatenId) { var eater = viruses[eaterId]; eater.Apply(eater.gameObject.transform.position, true); viruses[eatenId].Apply(eater.gameObject.transform.position, false); StartCoroutine(AbsorbWork(eatenId)); }
public IEnumerable <Virus> VirusFromId(Virus.Id id) { foreach (var v in crowd) { if (v.VirusId == id) { yield return(v); } } }
void OnAbsorb(Virus.Id eaterId, Virus.Id eatenId) { var eaten = VirusFromId(eatenId).First(); crowd.Remove(eaten); var eater = VirusFromId(eaterId).First(); if (eater.isCracked || eaten.isCracked) { Break.Invoke(eaterId); } eater.isCracked = true; }
void OnMove(Ruling.Virus.Id id, Ruling.Position from, Ruling.Position to) { var v = viruses[id]; foreach (var found in board.VirusFromId(id)) { var dst = From(to); if (to.IsHand) { heldId = id; dst = new Vector3(positioner.CurrentPos(), 0, 1); } v.Apply(dst, found.isCracked); } }
void OnBreak(Virus.Id brokenId) { var broken = VirusFromId(brokenId).First(); var brokenPos = broken.VirusPosition; if (1 < brokenPos.Y) { Where(brokenPos.WithY(brokenPos.Y - 1), upper => { if (upper.VirusGrade == broken.VirusGrade) { var chain = Chain(upper.VirusId); } }); } if (1 < brokenPos.X) { Where(brokenPos.WithX(brokenPos.X - 1), lefter => { if (lefter.VirusGrade == broken.VirusGrade) { var chain = Chain(lefter.VirusId); } }); } if (brokenPos.X < Width) { Where(brokenPos.WithX(brokenPos.X + 1), righter => { if (righter.VirusGrade == broken.VirusGrade) { var chain = Chain(righter.VirusId); } }); } Where(brokenPos.WithY(brokenPos.Y + 1), downer => Change.Invoke(downer.VirusId, downer.VirusPosition, brokenPos) ); crowd.Remove(broken); }
void Point(Ruling.Virus.Id _id) { score += 10; display.text = "SCORE " + score; }
IEnumerator AbsorbWork(Ruling.Virus.Id eatenId) { yield return(new WaitForSeconds(0.2f)); Destroy(viruses[eatenId].gameObject); }
async Task Chain(Virus.Id toBreak) { await Task.Delay(130); Break.Invoke(toBreak); }