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); }
public override IActiveEffect OnCast(Farmer player, int level, int targetX, int targetY) { int health = 10 + 10 * level; player.health -= health; player.currentLocation.debris.Add(new Debris(health, new Vector2(player.getStandingX() + 8, player.getStandingY()), Color.Red, 1f, player)); player.LocalSound("ow"); Game1.hitShakeTimer = 100 * health; int mana = (int)(health * (BloodManaSpell.ManaRatioBase + BloodManaSpell.ManaRatioIncr * level)); player.AddMana(mana); player.currentLocation.debris.Add(new Debris(mana, new Vector2(player.getStandingX() + 8, player.getStandingY()), Color.Blue, 1f, player)); player.LocalSound("powerup"); /* player.AddCustomSkillExperience(Magic.Skill,-mana); if (player.GetCustomSkillExperience(Magic.Skill) < 0) player.AddCustomSkillExperience(Magic.Skill,-player.getMagicExp()); */ return null; }
/// <summary>Fix the player's magic spells and mana pool to match their skill level if needed.</summary> /// <param name="player">The player to fix.</param> /// <param name="overrideMagicLevel">The magic skill level, or <c>null</c> to get it from the player.</param> public static void FixMagicIfNeeded(Farmer player, int?overrideMagicLevel = null) { // skip if player hasn't learned magic if (!Magic.LearnedMagic && overrideMagicLevel is not > 0) { return; } // get magic info int magicLevel = overrideMagicLevel ?? player.GetCustomSkillLevel(Skill.MagicSkillId); SpellBook spellBook = Game1.player.GetSpellBook(); // fix mana pool { int expectedPoints = magicLevel * MagicConstants.ManaPointsPerLevel; if (player.GetMaxMana() < expectedPoints) { player.SetMaxMana(expectedPoints); player.AddMana(expectedPoints); } } // fix spell bars if (spellBook.Prepared.Count < MagicConstants.SpellBarCount) { spellBook.Mutate(data => { while (spellBook.Prepared.Count < MagicConstants.SpellBarCount) { data.Prepared.Add(new PreparedSpellBar()); } }); } // fix learned spells foreach (string spellId in new[] { "arcane:analyze", "arcane:magicmissle", "arcane:enchant", "arcane:disenchant" }) { spellBook.LearnSpell(spellId, 0, true); } }
public void AddMana(Farmer farmer, int amt) { farmer.AddMana(amt); }
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); }
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); }
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); }