Ejemplo n.º 1
0
        public override IActiveEffect OnCast(Farmer player, int level, int targetX, int targetY)
        {
            if (player != Game1.player)
            {
                return(null);
            }

            var ms = player.currentLocation as MineShaft;

            if (ms == null)
            {
                return(null);
            }

            int target = ms.mineLevel + 1 + 2 * level;

            if (ms.mineLevel <= 120 && target >= 120)
            {
                // We don't want the player to go through the bottom of the
                // original mine and into the skull cavern.
                target = 120;
            }

            Game1.enterMine(target);

            player.AddCustomSkillExperience(Magic.Skill, 5);
            return(null);
        }
Ejemplo n.º 2
0
        public override IActiveEffect OnCast(Farmer player, int level, int targetX, int targetY)
        {
            if (player != Game1.player)
            {
                return(null);
            }

            foreach (var buff in Game1.buffsDisplay.otherBuffs)
            {
                if (buff.source == "spell:life:buff")
                {
                    return(null);
                }
            }

            //Game1.buffsDisplay.clearAllBuffs();
            Mod.Instance.Helper.Reflection.GetField <NetArray <int, NetInt> >(Game1.player, "appliedBuffs").GetValue().Clear();
            Game1.player.attack = 0;

            int l = level + 1;
            int farm = l, fish = l, mine = l, luck = l, forage = l, def = 0 /*1*/, atk = 2;

            atk = l switch
            {
                2 => 5,
                3 => 10,
                _ => atk
            };

            Game1.buffsDisplay.addOtherBuff(new Buff(farm, fish, mine, 0, luck, forage, 0, 0, 0, 0, def, atk, 60 + level * 120, "spell:life:buff", "Buff (spell)"));
            player.AddCustomSkillExperience(Magic.Skill, 10);
            return(null);
        }
    }
Ejemplo n.º 3
0
 public override IActiveEffect onCast(Farmer player, int level, int targetX, int targetY)
 {
     player.position.X = enterX;
     player.position.Y = enterY;
     player.AddCustomSkillExperience(Magic.Skill, 5);
     return(null);
 }
Ejemplo n.º 4
0
        public override IActiveEffect OnCast(Farmer player, int level, int targetX, int targetY)
        {
            if (player != Game1.player)
            {
                return(null);
            }

            foreach (var buff in Game1.buffsDisplay.otherBuffs)
            {
                if (buff.source == "spell:life:buff")
                {
                    return(null);
                }
            }

            Game1.player.removeBuffAttributes();
            Game1.player.attack = 0;

            int l = level + 1;
            int farm = l, fish = l, mine = l, luck = l, forage = l, def = 0 /*1*/, atk = 2;

            atk = l switch
            {
                2 => 5,
                3 => 10,
                _ => atk
            };

            Game1.buffsDisplay.addOtherBuff(new Buff(farm, fish, mine, 0, luck, forage, 0, 0, 0, 0, def, atk, 60 + level * 120, "spell:life:buff", "Buff (spell)"));
            player.AddCustomSkillExperience(Magic.Skill, 10);
            return(null);
        }
    }
Ejemplo n.º 5
0
 public override IActiveEffect OnCast(Farmer player, int level, int targetX, int targetY)
 {
     player.consumeObject(336, 1);
     Game1.timeOfDay -= 200;
     player.AddCustomSkillExperience(Magic.Skill, 25);
     return(null);
 }
Ejemplo n.º 6
0
        public override IActiveEffect OnCast(Farmer player, int level, int targetX, int targetY)
        {
            player.position.X = targetX - player.GetBoundingBox().Width / 2;
            player.position.Y = targetY - player.GetBoundingBox().Height / 2;
            player.LocalSound("powerup");
            player.AddCustomSkillExperience(Magic.Skill, 4);

            return(null);
        }
Ejemplo n.º 7
0
        public override IActiveEffect onCast(Farmer player, int level, int targetX, int targetY)
        {
            int health = 10 + 15 * level + (player.CombatLevel + 1) * 2;

            player.health += health;
            player.currentLocation.debris.Add(new Debris(health, new Vector2((float)(Game1.player.getStandingX() + 8), (float)Game1.player.getStandingY()), Color.Green, 1f, (Character)Game1.player));
            Game1.playSound("healSound");
            player.AddCustomSkillExperience(Magic.Skill, health / 2);

            return(null);
        }
Ejemplo n.º 8
0
        public override IActiveEffect onCast(Farmer player, int level, int targetX, int targetY)
        {
            var num            = Game1.random.Next(player.friendshipData.Count());
            var friendshipData = player.friendshipData[new List <string>(player.friendshipData.Keys)[num]];

            friendshipData.Points             = Math.Max(0, friendshipData.Points - 250);
            player.team.sharedDailyLuck.Value = 0.12;
            Game1.playSound("death");
            player.AddCustomSkillExperience(Magic.Skill, 50);

            return(null);
        }
Ejemplo n.º 9
0
            /// <summary>Update the effect state if needed.</summary>
            /// <param name="e">The update tick event args.</param>
            /// <returns>Returns true if the effect is still active, or false if it can be discarded.</returns>
            public bool Update(UpdateTickedEventArgs e)
            {
                if (jumping)
                {
                    if (player.yJumpVelocity == 0 && prevJumpVel < 0)
                    {
                        landX   = player.position.X;
                        landY   = player.position.Y;
                        jumping = false;
                    }
                    prevJumpVel = player.yJumpVelocity;
                }
                if (!jumping)
                {
                    if (--timer > 0)
                    {
                        return(true);
                    }
                    timer = 10;

                    int spotsForCurrRadius = 1 + currRad * 7;
                    for (int i = 0; i < spotsForCurrRadius; ++i)
                    {
                        Game1.playSound("hoeHit");
                        float ix = landX + (float)Math.Cos(Math.PI * 2 / spotsForCurrRadius * i) * currRad * Game1.tileSize;
                        float iy = landY + (float)Math.Sin(Math.PI * 2 / spotsForCurrRadius * i) * currRad * Game1.tileSize;
                        player.currentLocation.temporarySprites.Add(new TemporaryAnimatedSprite(6, new Vector2(ix, iy), Color.White, 8, Game1.random.NextDouble() < 0.5, 30, 0, -1, -1f, -1, 0));
                        player.currentLocation.temporarySprites.Add(new TemporaryAnimatedSprite(12, new Vector2(ix, iy), Color.White, 8, Game1.random.NextDouble() < 0.5, 50f, 0, -1, -1f, -1, 0));
                    }
                    ++currRad;

                    foreach (var character in player.currentLocation.characters)
                    {
                        if (character is Monster mob)
                        {
                            if (Vector2.Distance(new Vector2(landX, landY), mob.position) < currRad * Game1.tileSize)
                            {
                                // TODO: Use location damage method for xp and quest progress
                                mob.takeDamage((level + 1) * 5 * (player.CombatLevel + 1), 0, 0, false, 0, player);
                                player.AddCustomSkillExperience(Magic.Skill, 3);
                            }
                        }
                    }

                    if (currRad >= 1 + (level + 1) * 2)
                    {
                        return(false);
                    }
                }

                return(true);
            }
Ejemplo n.º 10
0
        public override void behaviorOnCollisionWithMonster(NPC npc, GameLocation loc)
        {
            if (!(npc is Monster))
            {
                return;
            }

            bool didDmg = loc.damageMonster(npc.GetBoundingBox(), damage, damage + 1, false, source);

            if (source != null && didDmg)
            {
                source.AddCustomSkillExperience(Magic.Skill, damage / ((theOneWhoFiredMe.Get(loc) as Farmer).CombatLevel + 1));
            }
            disappear(loc);
        }
Ejemplo n.º 11
0
        public override IActiveEffect onCast(Farmer player, int level, int targetX, int targetY)
        {
            level   += 1;
            targetX /= Game1.tileSize;
            targetY /= Game1.tileSize;
            Vector2 target = new Vector2(targetX, targetY);

            int num = 0;

            GameLocation loc = player.currentLocation;

            for (int ix = targetX - level; ix <= targetX + level; ++ix)
            {
                for (int iy = targetY - level; iy <= targetY + level; ++iy)
                {
                    if (player.getCurrentMana() <= 3)
                    {
                        return(null);
                    }

                    Vector2 pos = new Vector2(ix, iy);
                    if (!loc.terrainFeatures.ContainsKey(pos))
                    {
                        continue;
                    }

                    HoeDirt dirt = loc.terrainFeatures[pos] as HoeDirt;
                    if (dirt == null || dirt.state.Value != HoeDirt.dry)
                    {
                        continue;
                    }

                    dirt.state.Value = HoeDirt.watered;

                    loc.temporarySprites.Add(new TemporaryAnimatedSprite(13, new Vector2(ix * (float)Game1.tileSize, iy * (float)Game1.tileSize), Color.White, 10, Game1.random.NextDouble() < 0.5, 70f, 0, Game1.tileSize, (float)(((double)iy * (double)Game1.tileSize + (double)(Game1.tileSize / 2)) / 10000.0 - 0.00999999977648258), -1, 0)
                    {
                        delayBeforeAnimationStart = num * 10
                    });
                    num++;

                    player.addMana(-4);
                    player.AddCustomSkillExperience(Magic.Skill, 1);
                    Game1.playSound("wateringCan");
                }
            }

            return(null);
        }
Ejemplo n.º 12
0
        public override IActiveEffect OnCast(Farmer player, int level, int targetX, int targetY)
        {
            level   += 1;
            targetX /= Game1.tileSize;
            targetY /= Game1.tileSize;

            int num = 0;

            GameLocation loc = player.currentLocation;

            for (int tileX = targetX - level; tileX <= targetX + level; ++tileX)
            {
                for (int tileY = targetY - level; tileY <= targetY + level; ++tileY)
                {
                    if (player.GetCurrentMana() <= 3)
                    {
                        return(null);
                    }

                    Vector2 tile = new Vector2(tileX, tileY);

                    if (!loc.terrainFeatures.TryGetValue(tile, out TerrainFeature feature) || feature is not HoeDirt dirt)
                    {
                        continue;
                    }

                    if (dirt.state.Value != HoeDirt.dry)
                    {
                        continue;
                    }

                    dirt.state.Value = HoeDirt.watered;

                    loc.temporarySprites.Add(new TemporaryAnimatedSprite(13, new Vector2(tileX * (float)Game1.tileSize, tileY * (float)Game1.tileSize), Color.White, 10, Game1.random.NextDouble() < 0.5, 70f, 0, Game1.tileSize, (float)((tileY * (double)Game1.tileSize + Game1.tileSize / 2) / 10000.0 - 0.00999999977648258))
                    {
                        delayBeforeAnimationStart = num * 10
                    });
                    num++;

                    player.AddMana(-4);
                    player.AddCustomSkillExperience(Magic.Skill, 1);
                    loc.localSoundAt("wateringCan", tile);
                }
            }

            return(null);
        }
Ejemplo n.º 13
0
        public override IActiveEffect onCast(Farmer player, int level, int targetX, int targetY)
        {
            if (player != Game1.player)
            {
                return(null);
            }

            foreach (var buff in Game1.buffsDisplay.otherBuffs)
            {
                if (buff.source == "spell:life:haste")
                {
                    return(null);
                }
            }

            Game1.buffsDisplay.addOtherBuff(new Buff(0, 0, 0, 0, 0, 0, 0, 0, 0, level + 1, 0, 0, 60 + level * 120, "spell:air:haste", "Haste (spell)"));
            player.AddCustomSkillExperience(Magic.Skill, 5);
            return(null);
        }
Ejemplo n.º 14
0
        public override IActiveEffect OnCast(Farmer player, int level, int targetX, int targetY)
        {
            if (player != Game1.player)
            {
                return(null);
            }

            int power = level switch
            {
                1 => 8,
                2 => 16,
                _ => 4
            };

            player.currentLocation.sharedLights.Add(this.GetUnusedLightSourceId(player.currentLocation), new LightSource(1, Game1.player.position, power));
            player.AddCustomSkillExperience(Magic.Skill, level);

            return(null);
        }
Ejemplo n.º 15
0
        /// <summary>Update the effect state if needed.</summary>
        /// <param name="e">The update tick event args.</param>
        /// <returns>Returns true if the effect is still active, or false if it can be discarded.</returns>
        public bool Update(UpdateTickedEventArgs e)
        {
            // decrease height until zero
            height -= (int)yVelocity;
            if (height > 0)
            {
                return(true);
            }

            // trigger explosion
            {
                Game1.playSound("explosion");
                for (int i = 0; i < 10; ++i)
                {
                    for (int ix = -i; ix <= i; ++ix)
                    {
                        for (int iy = -i; iy <= i; ++iy)
                        {
                            Game1.createRadialDebris(loc, Game1.objectSpriteSheetName, new Rectangle(352, 400, 32, 32), 4, (int)this.position.X + ix * 20, (int)this.position.Y + iy * 20, 15 - 14 + rand.Next(15 - 14), (int)((double)this.position.Y / (double)Game1.tileSize) + 1, new Color(255, 255, 255, 255), 4.0f);
                        }
                    }
                }
                foreach (var npc in source.currentLocation.characters)
                {
                    if (npc is Monster mob)
                    {
                        float rad = 8 * 64;
                        if (Vector2.Distance(mob.position, new Vector2(position.X, position.Y)) <= rad)
                        {
                            // TODO: Use location damage method for xp and quest progress
                            mob.takeDamage(300, 0, 0, false, 0, source);
                            source.AddCustomSkillExperience(Magic.Skill, 5);
                        }
                    }
                }
                loc.explode(new Vector2((int)position.X / Game1.tileSize, (int)position.Y / Game1.tileSize), 4 + 2, source);
                return(false);
            }
        }
Ejemplo n.º 16
0
        public override IActiveEffect OnCast(Farmer player, int level, int targetX, int targetY)
        {
            TendrilGroup tendrils = new TendrilGroup();

            foreach (var npc in player.currentLocation.characters)
            {
                if (npc is Monster mob)
                {
                    float rad = Game1.tileSize;
                    int   dur = 11 * 60;
                    if (Vector2.Distance(mob.position, new Vector2(targetX, targetY)) <= rad)
                    {
                        tendrils.Add(new Tendril(mob, new Vector2(targetX, targetY), rad, dur));
                        player.AddCustomSkillExperience(Magic.Skill, 3);
                    }
                }
            }

            return(tendrils.Any()
                ? tendrils
                : null);
        }
Ejemplo n.º 17
0
        public override IActiveEffect onCast(Farmer player, int level, int targetX, int targetY)
        {
            if (player != Game1.player)
            {
                return(null);
            }

            int power = 4;

            if (level == 1)
            {
                power = 8;
            }
            else if (level == 2)
            {
                power = 16;
            }

            player.currentLocation.sharedLights.Add(getUnusedLightSourceID(player.currentLocation), new LightSource(1, Game1.player.position, power));
            player.AddCustomSkillExperience(Magic.Skill, level);

            return(null);
        }
Ejemplo n.º 18
0
        public override IActiveEffect onCast(Farmer player, int level, int targetX, int targetY)
        {
            level   += 1;
            targetX /= Game1.tileSize;
            targetY /= Game1.tileSize;
            Vector2 target = new Vector2(targetX, targetY);

            Tool dummyHoe = new Hoe();

            Mod.instance.Helper.Reflection.GetField <Farmer>(dummyHoe, "lastUser").SetValue(player);

            GameLocation loc = player.currentLocation;

            for (int ix = targetX - level; ix <= targetX + level; ++ix)
            {
                for (int iy = targetY - level; iy <= targetY + level; ++iy)
                {
                    if (player.getCurrentMana() <= 2)
                    {
                        return(null);
                    }

                    Vector2 pos = new Vector2(ix, iy);
                    if (loc.terrainFeatures.ContainsKey(pos))
                    {
                        continue; // ?
                    }
                    if (loc.objects.ContainsKey(pos))
                    {
                        var obj = loc.objects[pos];
                        if (obj.ParentSheetIndex == 590)
                        {
                            loc.digUpArtifactSpot(ix, iy, player);
                            loc.objects.Remove(pos);
                            player.addMana(-1);
                        }
                        else if (obj.performToolAction(dummyHoe, loc))
                        {
                            if (obj.Type == "Crafting" && obj.Fragility != 2)
                            {
                                loc.debris.Add(new Debris(obj.bigCraftable.Value ? -obj.ParentSheetIndex : obj.ParentSheetIndex, pos, pos));
                            }
                            obj.performRemoveAction(pos, loc);
                            loc.objects.Remove(pos);
                            player.addMana(-1);
                        }
                    }

                    if (loc.terrainFeatures.ContainsKey(pos))
                    {
                        if (loc.terrainFeatures[pos].performToolAction(dummyHoe, 0, pos, loc))
                        {
                            loc.terrainFeatures.Remove(pos);
                            player.addMana(-1);
                        }
                    }

                    if (loc.doesTileHaveProperty(ix, iy, "Diggable", "Back") != null && !loc.isTileOccupied(pos, ""))
                    {
                        loc.makeHoeDirt(pos);
                        Game1.playSound("hoeHit");
                        Game1.removeSquareDebrisFromTile(ix, iy);
                        loc.temporarySprites.Add(new TemporaryAnimatedSprite(12, new Vector2(ix * (float)Game1.tileSize, iy * (float)Game1.tileSize), Color.White, 8, Game1.random.NextDouble() < 0.5, 50f, 0, -1, -1f, -1, 0));
                        loc.temporarySprites.Add(new TemporaryAnimatedSprite(6, new Vector2(ix * (float)Game1.tileSize, iy * (float)Game1.tileSize), Color.White, 8, Game1.random.NextDouble() < 0.5, Vector2.Distance(pos, target) * 30f, 0, -1, -1f, -1, 0));
                        loc.checkForBuriedItem(ix, iy, false, false);
                        player.addMana(-3);
                        player.AddCustomSkillExperience(Magic.Skill, 2);
                    }
                }
            }

            return(null);
        }
Ejemplo n.º 19
0
 public override IActiveEffect onCast(Farmer player, int level, int targetX, int targetY)
 {
     player.AddCustomSkillExperience(Magic.Skill, 25);
     return(new SpiritEffect(player));
 }
Ejemplo n.º 20
0
        public override IActiveEffect onCast(Farmer player, int level, int targetX, int targetY)
        {
            level   += 1;
            targetX /= Game1.tileSize;
            targetY /= Game1.tileSize;
            Vector2 target = new Vector2(targetX, targetY);

            Tool dummyAxe  = new Axe(); dummyAxe.UpgradeLevel = level;
            Tool dummyPick = new Pickaxe(); dummyPick.UpgradeLevel = level;

            Mod.instance.Helper.Reflection.GetField <Farmer>(dummyAxe, "lastUser").SetValue(player);
            Mod.instance.Helper.Reflection.GetField <Farmer>(dummyPick, "lastUser").SetValue(player);

            GameLocation loc = player.currentLocation;

            for (int ix = targetX - level; ix <= targetX + level; ++ix)
            {
                for (int iy = targetY - level; iy <= targetY + level; ++iy)
                {
                    if (player.getCurrentMana() <= 0)
                    {
                        return(null);
                    }

                    Vector2 pos = new Vector2(ix, iy);

                    if (loc.objects.ContainsKey(pos))
                    {
                        var obj = loc.objects[pos];
                        if (obj.performToolAction(dummyAxe, loc))
                        {
                            if (obj.Type == "Crafting" && obj.Fragility != 2)
                            {
                                loc.debris.Add(new Debris(obj.bigCraftable.Value ? -obj.ParentSheetIndex : obj.ParentSheetIndex, pos, pos));
                            }
                            obj.performRemoveAction(pos, loc);
                            loc.objects.Remove(pos);
                            player.addMana(-3);
                            player.AddCustomSkillExperience(Magic.Skill, 1);
                        }
                        else
                        {
                            var oldStam = player.stamina;
                            dummyPick.DoFunction(loc, ix * Game1.tileSize, iy * Game1.tileSize, 0, player);
                            player.stamina = oldStam;
                            player.addMana(-3);
                            player.AddCustomSkillExperience(Magic.Skill, 1);
                        }
                    }

                    // Trees
                    if (level >= 2)
                    {
                        if (loc.terrainFeatures.ContainsKey(pos) && !(loc.terrainFeatures[pos] is HoeDirt))
                        {
                            TerrainFeature tf = loc.terrainFeatures[pos];
                            if (tf is Tree)
                            {
                                player.addMana(-3);
                            }
                            if (tf.performToolAction(dummyAxe, 0, pos, loc) || tf is Grass || (tf is Tree && tf.performToolAction(dummyAxe, 0, pos, loc)))
                            {
                                if (tf is Tree)
                                {
                                    player.AddCustomSkillExperience(Magic.Skill, 5);
                                }
                                loc.terrainFeatures.Remove(pos);
                            }
                            if (tf is Grass && loc is Farm)
                            {
                                (loc as Farm).tryToAddHay(1);
                                Game1.playSound("swordswipe");
                                loc.temporarySprites.Add(new TemporaryAnimatedSprite(28, pos * (float)Game1.tileSize + new Vector2((float)Game1.random.Next(-Game1.pixelZoom * 4, Game1.pixelZoom * 4), (float)Game1.random.Next(-Game1.pixelZoom * 4, Game1.pixelZoom * 4)), Color.Green, 8, Game1.random.NextDouble() < 0.5, (float)Game1.random.Next(60, 100), 0, -1, -1f, -1, 0));
                                loc.temporarySprites.Add(new TemporaryAnimatedSprite(Game1.objectSpriteSheetName, Game1.getSourceRectForStandardTileSheet(Game1.objectSpriteSheet, 178, 16, 16), 750f, 1, 0, player.position - new Vector2(0.0f, (float)(Game1.tileSize * 2)), false, false, player.position.Y / 10000f, 0.005f, Color.White, (float)Game1.pixelZoom, -0.005f, 0.0f, 0.0f, false)
                                {
                                    motion     = { Y = -1f },
                                    layerDepth = (float)(1.0 - (double)Game1.random.Next(100) / 10000.0),
                                    delayBeforeAnimationStart = Game1.random.Next(350)
                                });
                            }
                        }
                    }

                    if (level >= 3)
                    {
                        ICollection <ResourceClump> clumps = (NetCollection <ResourceClump>)loc.GetType().GetField("resourceClumps", BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance).GetValue(loc);
                        if (loc is Woods)
                        {
                            clumps = (loc as Woods).stumps;
                        }
                        if (clumps != null)
                        {
                            foreach (var rc in clumps)
                            {
                                if (new Rectangle((int)rc.tile.X, (int)rc.tile.Y, rc.width.Value, rc.height.Value).Contains(ix, iy))
                                {
                                    player.addMana(-3);
                                    if (rc.performToolAction(dummyAxe, 1, pos, loc) || rc.performToolAction(dummyPick, 1, pos, loc))
                                    {
                                        clumps.Remove(rc);
                                        player.AddCustomSkillExperience(Magic.Skill, 10);
                                    }
                                    break;
                                }
                            }
                        }
                    }
                }
            }

            return(null);
        }
Ejemplo n.º 21
0
 public void AddExperienceForCustomSkill(Farmer farmer, string skill, int amt)
 {
     farmer.AddCustomSkillExperience(skill, amt);
 }
Ejemplo n.º 22
0
        public override IActiveEffect OnCast(Farmer player, int level, int targetX, int targetY)
        {
            level   += 1;
            targetX /= Game1.tileSize;
            targetY /= Game1.tileSize;

            // create fake tools
            Axe     axe     = new();
            Pickaxe pickaxe = new();

            foreach (var tool in new Tool[] { axe, pickaxe })
            {
                tool.UpgradeLevel = level;
                tool.IsEfficient  = true; // don't drain stamina
                Mod.Instance.Helper.Reflection.GetField <Farmer>(tool, "lastUser").SetValue(player);
            }

            // scan location
            GameLocation loc = player.currentLocation;

            for (int tileX = targetX - level; tileX <= targetX + level; ++tileX)
            {
                for (int tileY = targetY - level; tileY <= targetY + level; ++tileY)
                {
                    if (player.GetCurrentMana() <= 0)
                    {
                        return(null);
                    }

                    Vector2 tile      = new(tileX, tileY);
                    Vector2 toolPixel = (tile * Game1.tileSize) + new Vector2(Game1.tileSize / 2f); // center of tile

                    if (loc.objects.TryGetValue(tile, out SObject obj))
                    {
                        // select tool
                        Tool tool = null;
                        if (this.IsAxeDebris(loc, obj))
                        {
                            tool = axe;
                        }
                        else if (this.IsPickaxeDebris(loc, obj))
                        {
                            tool = pickaxe;
                        }

                        // apply
                        if (tool == null)
                        {
                            continue;
                        }
                        player.lastClick = toolPixel;
                        tool.DoFunction(loc, (int)toolPixel.X, (int)toolPixel.Y, 0, player);

                        if (!loc.objects.ContainsKey(tile))
                        {
                            player.AddMana(-3);
                            player.AddCustomSkillExperience(Magic.Skill, 1);
                        }
                    }

                    // Trees
                    if (level >= 2)
                    {
                        if (loc.terrainFeatures.TryGetValue(tile, out TerrainFeature feature) && feature is not HoeDirt or Flooring)
                        {
                            if (feature is Tree)
                            {
                                player.AddMana(-3);
                            }
                            if (feature.performToolAction(axe, 0, tile, loc) || feature is Grass || (feature is Tree && feature.performToolAction(axe, 0, tile, loc)))
                            {
                                if (feature is Tree)
                                {
                                    player.AddCustomSkillExperience(Magic.Skill, 5);
                                }
                                loc.terrainFeatures.Remove(tile);
                            }
                            if (feature is Grass && loc is Farm farm)
                            {
                                farm.tryToAddHay(1);
                                loc.localSoundAt("swordswipe", tile);
                                farm.temporarySprites.Add(new TemporaryAnimatedSprite(28, tile * Game1.tileSize + new Vector2(Game1.random.Next(-Game1.pixelZoom * 4, Game1.pixelZoom * 4), Game1.random.Next(-Game1.pixelZoom * 4, Game1.pixelZoom * 4)), Color.Green, 8, Game1.random.NextDouble() < 0.5, Game1.random.Next(60, 100)));
                                farm.temporarySprites.Add(new TemporaryAnimatedSprite(Game1.objectSpriteSheetName, Game1.getSourceRectForStandardTileSheet(Game1.objectSpriteSheet, 178, 16, 16), 750f, 1, 0, player.position - new Vector2(0.0f, Game1.tileSize * 2), false, false, player.position.Y / 10000f, 0.005f, Color.White, Game1.pixelZoom, -0.005f, 0.0f, 0.0f)
                                {
                                    motion     = { Y = -1f },
                                    layerDepth = (float)(1.0 - Game1.random.Next(100) / 10000.0),
                                    delayBeforeAnimationStart = Game1.random.Next(350)
                                });
                            }
                        }
                    }

                    if (level >= 3)
                    {
                        ICollection <ResourceClump> clumps = loc.resourceClumps;

                        if (loc is Woods woods)
                        {
                            clumps = woods.stumps;
                        }
                        if (clumps != null)
                        {
                            foreach (var rc in clumps)
                            {
                                if (new Rectangle((int)rc.tile.X, (int)rc.tile.Y, rc.width.Value, rc.height.Value).Contains(tileX, tileY))
                                {
                                    player.AddMana(-3);
                                    if (rc.performToolAction(axe, 1, tile, loc) || rc.performToolAction(pickaxe, 1, tile, loc))
                                    {
                                        clumps.Remove(rc);
                                        player.AddCustomSkillExperience(Magic.Skill, 10);
                                    }
                                    break;
                                }
                            }
                        }
                    }
                }
            }

            return(null);
        }
Ejemplo n.º 23
0
        public override IActiveEffect OnCast(Farmer player, int level, int targetX, int targetY)
        {
            level   += 1;
            targetX /= Game1.tileSize;
            targetY /= Game1.tileSize;

            Tool dummyAxe  = new Axe(); dummyAxe.UpgradeLevel = level;
            Tool dummyPick = new Pickaxe(); dummyPick.UpgradeLevel = level;

            Mod.Instance.Helper.Reflection.GetField <Farmer>(dummyAxe, "lastUser").SetValue(player);
            Mod.Instance.Helper.Reflection.GetField <Farmer>(dummyPick, "lastUser").SetValue(player);

            GameLocation loc = player.currentLocation;

            for (int tileX = targetX - level; tileX <= targetX + level; ++tileX)
            {
                for (int tileY = targetY - level; tileY <= targetY + level; ++tileY)
                {
                    if (player.GetCurrentMana() <= 0)
                    {
                        return(null);
                    }

                    Vector2 tile = new Vector2(tileX, tileY);

                    if (loc.objects.TryGetValue(tile, out SObject obj))
                    {
                        if (obj.performToolAction(dummyAxe, loc))
                        {
                            if (obj.Type == "Crafting" && obj.Fragility != 2)
                            {
                                loc.debris.Add(new Debris(obj.bigCraftable.Value ? -obj.ParentSheetIndex : obj.ParentSheetIndex, tile, tile));
                            }
                            obj.performRemoveAction(tile, loc);
                            loc.objects.Remove(tile);
                            player.AddMana(-3);
                            player.AddCustomSkillExperience(Magic.Skill, 1);
                        }
                        else
                        {
                            float oldStam = player.stamina;
                            dummyPick.DoFunction(loc, tileX * Game1.tileSize, tileY * Game1.tileSize, 0, player);
                            player.stamina = oldStam;
                            player.AddMana(-3);
                            player.AddCustomSkillExperience(Magic.Skill, 1);
                        }
                    }

                    // Trees
                    if (level >= 2)
                    {
                        if (loc.terrainFeatures.TryGetValue(tile, out TerrainFeature feature) && !(feature is HoeDirt))
                        {
                            if (feature is Tree)
                            {
                                player.AddMana(-3);
                            }
                            if (feature.performToolAction(dummyAxe, 0, tile, loc) || feature is Grass || (feature is Tree && feature.performToolAction(dummyAxe, 0, tile, loc)))
                            {
                                if (feature is Tree)
                                {
                                    player.AddCustomSkillExperience(Magic.Skill, 5);
                                }
                                loc.terrainFeatures.Remove(tile);
                            }
                            if (feature is Grass && loc is Farm farm)
                            {
                                farm.tryToAddHay(1);
                                loc.localSoundAt("swordswipe", tile);
                                farm.temporarySprites.Add(new TemporaryAnimatedSprite(28, tile * Game1.tileSize + new Vector2(Game1.random.Next(-Game1.pixelZoom * 4, Game1.pixelZoom * 4), Game1.random.Next(-Game1.pixelZoom * 4, Game1.pixelZoom * 4)), Color.Green, 8, Game1.random.NextDouble() < 0.5, Game1.random.Next(60, 100)));
                                farm.temporarySprites.Add(new TemporaryAnimatedSprite(Game1.objectSpriteSheetName, Game1.getSourceRectForStandardTileSheet(Game1.objectSpriteSheet, 178, 16, 16), 750f, 1, 0, player.position - new Vector2(0.0f, Game1.tileSize * 2), false, false, player.position.Y / 10000f, 0.005f, Color.White, Game1.pixelZoom, -0.005f, 0.0f, 0.0f)
                                {
                                    motion     = { Y = -1f },
                                    layerDepth = (float)(1.0 - Game1.random.Next(100) / 10000.0),
                                    delayBeforeAnimationStart = Game1.random.Next(350)
                                });
                            }
                        }
                    }

                    if (level >= 3)
                    {
                        ICollection <ResourceClump> clumps = loc.resourceClumps;

                        if (loc is Woods woods)
                        {
                            clumps = woods.stumps;
                        }
                        if (clumps != null)
                        {
                            foreach (var rc in clumps)
                            {
                                if (new Rectangle((int)rc.tile.X, (int)rc.tile.Y, rc.width.Value, rc.height.Value).Contains(tileX, tileY))
                                {
                                    player.AddMana(-3);
                                    if (rc.performToolAction(dummyAxe, 1, tile, loc) || rc.performToolAction(dummyPick, 1, tile, loc))
                                    {
                                        clumps.Remove(rc);
                                        player.AddCustomSkillExperience(Magic.Skill, 10);
                                    }
                                    break;
                                }
                            }
                        }
                    }
                }
            }

            return(null);
        }
Ejemplo n.º 24
0
        public override IActiveEffect OnCast(Farmer player, int level, int targetX, int targetY)
        {
            level   += 1;
            targetX /= Game1.tileSize;
            targetY /= Game1.tileSize;
            Vector2 target = new Vector2(targetX, targetY);

            Tool dummyHoe = new Hoe();

            Mod.Instance.Helper.Reflection.GetField <Farmer>(dummyHoe, "lastUser").SetValue(player);

            GameLocation loc = player.currentLocation;

            for (int tileX = targetX - level; tileX <= targetX + level; ++tileX)
            {
                for (int tileY = targetY - level; tileY <= targetY + level; ++tileY)
                {
                    if (player.GetCurrentMana() <= 2)
                    {
                        return(null);
                    }

                    Vector2 tile = new Vector2(tileX, tileY);
                    if (loc.terrainFeatures.ContainsKey(tile))
                    {
                        continue; // ?
                    }
                    if (loc.objects.TryGetValue(tile, out SObject obj))
                    {
                        if (obj.ParentSheetIndex == 590)
                        {
                            loc.digUpArtifactSpot(tileX, tileY, player);
                            loc.objects.Remove(tile);
                            player.AddMana(-1);
                        }
                        else if (obj.performToolAction(dummyHoe, loc))
                        {
                            if (obj.Type == "Crafting" && obj.Fragility != 2)
                            {
                                loc.debris.Add(new Debris(obj.bigCraftable.Value ? -obj.ParentSheetIndex : obj.ParentSheetIndex, tile, tile));
                            }
                            obj.performRemoveAction(tile, loc);
                            loc.objects.Remove(tile);
                            player.AddMana(-1);
                        }
                    }

                    if (loc.terrainFeatures.TryGetValue(tile, out TerrainFeature feature))
                    {
                        if (feature.performToolAction(dummyHoe, 0, tile, loc))
                        {
                            loc.terrainFeatures.Remove(tile);
                            player.AddMana(-1);
                        }
                    }

                    if (loc.doesTileHaveProperty(tileX, tileY, "Diggable", "Back") != null && !loc.isTileOccupied(tile))
                    {
                        loc.makeHoeDirt(tile);
                        loc.playSoundAt("hoeHit", tile);
                        Game1.removeSquareDebrisFromTile(tileX, tileY);
                        loc.temporarySprites.Add(new TemporaryAnimatedSprite(12, new Vector2(tileX * (float)Game1.tileSize, tileY * (float)Game1.tileSize), Color.White, 8, Game1.random.NextDouble() < 0.5, 50f));
                        loc.temporarySprites.Add(new TemporaryAnimatedSprite(6, new Vector2(tileX * (float)Game1.tileSize, tileY * (float)Game1.tileSize), Color.White, 8, Game1.random.NextDouble() < 0.5, Vector2.Distance(tile, target) * 30f));
                        loc.checkForBuriedItem(tileX, tileY, false, false, player);
                        player.AddMana(-3);
                        player.AddCustomSkillExperience(Magic.Skill, 2);
                    }
                }
            }

            return(null);
        }