public override bool Process() { if (NetworkManager.IsClient) { return(false); } // find unit to spawn string[] baseUnits = new string[] { "Squirrel", "Turtle", "Foot_Animated" }; int level = Mathf.Max(1, Mathf.Min(4, (Spell.Skill / 4) + 1)); string unitName = baseUnits[UnityEngine.Random.Range(0, 3)] + ((level > 1) ? string.Format(".{0}", level) : ""); MapUnit unit = new MapUnit(unitName); if (unit.Class == null) { Debug.LogFormat("Failed to spawn summoned unit {0}", unitName); return(false); } unit.Player = Spell.User.Player; unit.Tag = MapLogic.Instance.GetFreeUnitTag(); if (!unit.RandomizePosition(Spell.User.X, Spell.User.Y, 2, false)) { // invalid position, don't add unit unit.Dispose(); return(false); } unit.SummonTimeMax = 30; unit.SummonTime = 0; MapLogic.Instance.Objects.Add(unit); return(false); }
public bool Process() { if (!MapLogic.Instance.IsLoaded) { return(false); } MapUnit unit = MapLogic.Instance.GetUnitByTag(Tag); if (unit == null) { Debug.LogFormat("Attempted to delete nonexistent unit {0}", Tag); } else { unit.Dispose(); } return(true); }
public override bool Process() { if (NetworkManager.IsClient) { return(false); } if (TargetX < 0 || TargetX >= MapLogic.Instance.Width || TargetY < 0 || TargetY >= MapLogic.Instance.Height) { return(false); } // check if this cell is blocked by something MapNode node = MapLogic.Instance.Nodes[TargetX, TargetY]; // find any corpse at X/Y // we cannot use regular cells for this... because dead unit is unlinked from world for (int i = 0; i < MapLogic.Instance.Objects.Count; i++) { MapObject o = MapLogic.Instance.Objects[i]; if (!(o is MapUnit)) { continue; } MapUnit u = (MapUnit)o; if (u.IsAlive || u.IsDying || u.IsFlying) { continue; } if (u.Class.ID == 69 || // ghost (u.Class.ID >= 89 && u.Class.ID <= 92) || // skeleton fighter (u.Class.ID >= 93 && u.Class.ID <= 96) || // skeleton archer (u.Class.ID >= 97 && u.Class.ID <= 98) || // skeleton mage (u.Class.ID >= 82 && u.Class.ID <= 85) || // zombie fighter (u.Class.ID >= 86 && u.Class.ID <= 88)) // zombie archer { continue; // don't allow resurrecting undead } if (u.BoneFrame > 3) { continue; } if (TargetX >= u.X && TargetX < u.X + u.Width && TargetY >= u.Y && TargetY < u.Y + u.Height) { float raiseHpMult; string raiseName; switch (u.BoneFrame) { case 0: raiseHpMult = 1f; raiseName = "F_Zombie.1"; break; case 1: raiseHpMult = 0.5f; raiseName = "F_Zombie.1"; break; case 2: raiseHpMult = 0.5f; raiseName = "F_Skeleton.1"; break; default: raiseHpMult = 0.5f; raiseName = "Ghost"; break; } MapUnit unit = new MapUnit(raiseName); if (unit.Class == null) { Debug.LogFormat("Failed to spawn resurrected unit {0}", raiseName); return(false); } unit.Player = Spell.User.Player; unit.Tag = MapLogic.Instance.GetFreeUnitTag(); unit.SetPosition(TargetX, TargetY, false); if (!unit.Interaction.CheckWalkableForUnit(TargetX, TargetY, false)) { // invalid position, don't add unit // (but still delete bone) u.BoneFrame = 4; u.DoUpdateView = true; if (NetworkManager.IsServer) { Server.NotifyUnitBoneFrame(u); } unit.Dispose(); return(false); } unit.CoreStats.HealthMax = (int)(u.CoreStats.HealthMax * raiseHpMult); unit.UpdateItems(); MapLogic.Instance.Objects.Add(unit); u.BoneFrame = 4; // invisible corpse u.DoUpdateView = true; if (NetworkManager.IsServer) { Server.NotifyUnitBoneFrame(u); } return(false); } } return(false); }