Esempio n. 1
0
        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);
        }
Esempio n. 2
0
        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);
        }
Esempio n. 3
0
        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);
        }