minervamaga

Untitled

Nov 4th, 2019
198
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 11.66 KB | None | 0 0
  1. using CustomGuildChallenges.API;
  2. using Microsoft.Xna.Framework;
  3. using Microsoft.Xna.Framework.Graphics;
  4. using StardewModdingAPI;
  5. using StardewValley;
  6. using StardewValley.Locations;
  7. using StardewValley.Menus;
  8. using StardewValley.Objects;
  9. using System;
  10. using System.Collections.Generic;
  11. using System.Text;
  12. using xTile.Dimensions;
  13.  
  14. namespace CustomGuildChallenges
  15. {
  16.     /// <summary>
  17.     ///     Custom implementation of the adventure guild
  18.     ///     Required in order to update the slayer list and rewards
  19.     /// </summary>
  20.     public class CustomAdventureGuild : AdventureGuild
  21.     {
  22.  
  23.         /// <summary>
  24.         ///     SMAPI API - used for saving and loading JSON files
  25.         /// </summary>
  26.         internal readonly IModHelper Helper;
  27.  
  28.         /// <summary>
  29.         ///     SMAPI Log Utility
  30.         /// </summary>
  31.         internal readonly IMonitor Monitor;
  32.         public const string StandardMapPath = "Maps\\AdventureGuild";
  33.         public const string StandardMapName = "AdventureGuild";
  34.  
  35.         protected bool talkedToGil;
  36.         protected readonly NPC Gil = new NPC(null, new Vector2(-1000f, -1000f), "AdventureGuild", 2, "Gil", false, null, Game1.content.Load<Texture2D>("Portraits\\Gil"));
  37.  
  38.         #region Constructors
  39.  
  40.         public CustomAdventureGuild() : base(StandardMapPath, StandardMapName)
  41.         {
  42.         }
  43.  
  44.         /// <summary>
  45.         ///     Loads custom slayer challenge list with custom map path and name
  46.         /// </summary>
  47.         /// <param name="map"></param>
  48.         /// <param name="name"></param>
  49.         /// <param name="customChallengeList"></param>
  50.         public CustomAdventureGuild(string map, string name) : base(map, name)
  51.         {
  52.         }
  53.  
  54.         internal bool HasMarlon()
  55.         {
  56.             foreach(var character in characters)
  57.             {
  58.                 if (character.Name == "Marlon") return true;
  59.             }
  60.  
  61.             return false;
  62.         }
  63.  
  64.         internal void AddMarlon()
  65.         {
  66.             addCharacter(new NPC(new AnimatedSprite("Characters\\Marlon", 0, 16, 32), new Vector2(320f, 704f), "AdventureGuild", 2, "Marlon", false, null, Game1.content.Load<Texture2D>("Portraits\\Marlon")));
  67.         }
  68.  
  69.         #endregion
  70.  
  71.         // Required to reimplement Monster Kill List and Gil's rewards
  72.         public override bool checkAction(Location tileLocation, xTile.Dimensions.Rectangle viewport, Farmer who)
  73.         {
  74.             switch ((map.GetLayer("Buildings").Tiles[tileLocation] != null) ? map.GetLayer("Buildings").Tiles[tileLocation].TileIndex : (-1))
  75.             {
  76.                 case 1306:
  77.                     ShowNewMonsterKillList();
  78.                     Monitor.Log("Showing custom kill list for CustomGuildChallenges", LogLevel.Trace);
  79.                     return true;
  80.                 case 1291:
  81.                 case 1292:
  82.                 case 1355:
  83.                 case 1356:
  84.                 case 1357:
  85.                 case 1358:
  86.                     TalkToGil();
  87.                     return true;
  88.                 default:
  89.                     return base.checkAction(tileLocation, viewport, who);
  90.             }
  91.  
  92.         }
  93.  
  94.  
  95.         /// <summary>
  96.         ///     Creates the reward item using StardewValley.Objects.ObjectFactory
  97.         /// </summary>
  98.         /// <param name="rewardType"></param>
  99.         /// <param name="rewardItemNumber"></param>
  100.         /// <returns></returns>
  101.         public virtual Item CreateReward(int rewardType, int rewardItemNumber, int rewardItemStack)
  102.         {
  103.             Monitor.Log("Recreating rewards", LogLevel.Trace);
  104.             switch (rewardType)
  105.             {
  106.                 case (int)ItemType.Hat:
  107.                     return new Hat(rewardItemNumber);
  108.                 case (int)ItemType.Ring:
  109.                     return new Ring(rewardItemNumber);
  110.                 case (int)ItemType.SpecialItem:
  111.                     return new SpecialItem(rewardItemNumber);
  112.                 case (int)ItemType.Boots:
  113.                     return new StardewValley.Objects.Boots(rewardItemNumber);
  114.                 default:
  115.                     return ObjectFactory.getItemFromDescription((byte)rewardType, rewardItemNumber, rewardItemStack);
  116.             }
  117.  
  118.         }
  119.  
  120.         // Required to reset talkedToGil flag
  121.         protected override void resetLocalState()
  122.         {
  123.             base.resetLocalState();
  124.             talkedToGil = false;
  125.  
  126.         }
  127.  
  128.         protected override void resetSharedState()
  129.         {
  130.             if (Game1.IsMultiplayer)
  131.             {
  132.                 base.resetSharedState();
  133.             }
  134.  
  135.             else return;
  136.  
  137.             //Debug.WriteLine(characters.Count + " characters found.");
  138.         }
  139.  
  140.         /// <summary>
  141.         ///     Build strings for display when viewing challenge list on guild wall
  142.         /// </summary>
  143.         protected virtual void ShowNewMonsterKillList()
  144.         {
  145.             if (!Game1.player.mailReceived.Contains("checkedMonsterBoard"))
  146.             {
  147.                 Game1.player.mailReceived.Add("checkedMonsterBoard");
  148.  
  149.                 Monitor.Log("Added monster board mail flag", LogLevel.Trace);
  150.             }
  151.  
  152.             StringBuilder stringBuilder = new StringBuilder();
  153.             stringBuilder.Append(Game1.content.LoadString("Strings\\Locations:AdventureGuild_KillList_Header").Replace('\n', '^') + "^");
  154.  
  155.             Monitor.Log("Build header string", LogLevel.Trace);
  156.  
  157.  
  158.             foreach (var challenge in ConfigChallengeHelper.ChallengeList)
  159.             {
  160.                 int kills = 0;
  161.                 foreach(var monsterName in challenge.Info.MonsterNames)
  162.                 {
  163.                     kills += Game1.player.stats.getMonstersKilled(monsterName);
  164.                 }
  165.  
  166.                 stringBuilder.Append(KillListLine(challenge.Info.ChallengeName, kills, challenge.Info.RequiredKillCount));
  167.                 Monitor.Log("Updated kill count", LogLevel.Trace);
  168.             }
  169.  
  170.             stringBuilder.Append(Game1.content.LoadString("Strings\\Locations:AdventureGuild_KillList_Footer").Replace('\n', '^'));
  171.             Monitor.Log("Replace footer", LogLevel.Trace);
  172.             Game1.drawLetterMessage(stringBuilder.ToString());
  173.  
  174.         }
  175.  
  176.        /// <summary>
  177.        ///      Checks to see if there are new rewards. If not, display a dialogue from Gil
  178.        /// </summary>
  179.         protected virtual void TalkToGil()
  180.         {
  181.             int specialItemsCollected = 0;
  182.             List<Item> rewards = new List<Item>();
  183.             List<SlayerChallenge> completedChallenges = new List<SlayerChallenge>();
  184.  
  185.             // Check for available rewards
  186.             foreach(var challenge in ConfigChallengeHelper.ChallengeList)
  187.             {
  188.                 if (challenge.CollectedReward) continue;
  189.  
  190.                 int kills = 0;
  191.                 foreach (var monsterName in challenge.Info.MonsterNames)
  192.                 {
  193.                     kills += Game1.player.stats.getMonstersKilled(monsterName);
  194.                     Monitor.Log("Updated stats", LogLevel.Trace);
  195.  
  196.                 }
  197.  
  198.                 if (kills >= challenge.Info.RequiredKillCount)
  199.                 {
  200.                     var rewardItem = CreateReward(challenge.Info.RewardType, challenge.Info.RewardItemNumber, challenge.Info.RewardItemStack);
  201.                     Monitor.Log("Creating rewards", LogLevel.Trace);
  202.  
  203.                     if (rewardItem == null)
  204.                     {
  205.                         throw new Exception("Invalid reward parameters for challenge " + challenge.Info.ChallengeName + ":\n" +
  206.                             "Reward Type: " + challenge.Info.RewardType + "\n" +
  207.                             "Reward Item Number: " + challenge.Info.RewardItemNumber + "\n");
  208.                     }
  209.                     else if(challenge.Info.RewardType == 0 && challenge.Info.RewardItemNumber == 434)   // Stardrop award
  210.                     {
  211.                         Game1.drawDialogue(Gil, ConfigChallengeHelper.Config.GilSpecialGiftDialogue);
  212.  
  213.                         Game1.player.holdUpItemThenMessage(rewardItem, true);
  214.                         specialItemsCollected++;
  215.  
  216.                         challenge.CollectedReward = true;
  217.                         Monitor.Log("You got a stardrop, congratulations!", LogLevel.Info);
  218.  
  219.                         break;
  220.                     }
  221.                     // Add special section for special item
  222.                     else if (rewardItem is SpecialItem specialItem)
  223.                     {
  224.                         Game1.drawDialogue(Gil, ConfigChallengeHelper.Config.GilSpecialGiftDialogue);
  225.  
  226.                         Game1.player.holdUpItemThenMessage(specialItem, true);
  227.                         specialItem.actionWhenReceived(Game1.player);
  228.  
  229.                         specialItemsCollected++;
  230.                         challenge.CollectedReward = true;
  231.                         Monitor.Log("Special item awarded", LogLevel.Trace);
  232.  
  233.                         break;
  234.                     }
  235.                     else
  236.                     {
  237.                         completedChallenges.Add(challenge);
  238.                         Monitor.Log("Challenge complete!", LogLevel.Trace);
  239.                     }
  240.                 }
  241.             }
  242.  
  243.             // Display rewards/dialogue for talking to Gil
  244.             if(specialItemsCollected > 0)
  245.             {
  246.                 return;
  247.             }
  248.             else if(completedChallenges.Count > 0)
  249.             {
  250.                 Item rewardItem;
  251.                 foreach(var challenge in completedChallenges)
  252.                 {
  253.                     rewardItem = CreateReward(challenge.Info.RewardType, challenge.Info.RewardItemNumber, challenge.Info.RewardItemStack);
  254.                     if (rewardItem is StardewValley.Object)
  255.                     {
  256.                         rewardItem.specialItem = true;
  257.                         rewards.Add(rewardItem);
  258.                     }
  259.                     else if (!Game1.player.hasOrWillReceiveMail("Gil_" + challenge.Info.ChallengeName + "_" + rewardItem.Name))
  260.                     {
  261.                         Game1.player.mailReceived.Add("Gil_" + challenge.Info.ChallengeName + "_" + rewardItem.Name);
  262.                         rewards.Add(rewardItem);
  263.                         Monitor.Log("Adding mail flag", LogLevel.Trace);
  264.                     }
  265.  
  266.                     challenge.CollectedReward = true;
  267.                 }
  268.  
  269.                 Game1.activeClickableMenu = new ItemGrabMenu(rewards);
  270.             }
  271.             else if(talkedToGil)
  272.             {
  273.                 Game1.drawDialogue(Gil, ConfigChallengeHelper.Config.GilSleepingDialogue);
  274.             }
  275.             else
  276.             {
  277.                 Game1.drawDialogue(Gil, ConfigChallengeHelper.Config.GilNoRewardDialogue);
  278.                 talkedToGil = true;
  279.             }
  280.         }
  281.  
  282.         /// <summary>
  283.         ///     Generates a single challenge line for the challenge board
  284.         ///     Localization done in the config files
  285.         /// </summary>
  286.         /// <param name="challengeName"></param>
  287.         /// <param name="killCount"></param>
  288.         /// <param name="target"></param>
  289.         /// <returns></returns>
  290.         protected virtual string KillListLine(string challengeName, int killCount, int target)
  291.         {
  292.             Monitor.Log("Creating kill list", LogLevel.Trace);
  293.             if (killCount == 0)
  294.             {
  295.                 return "0/" + target + " ????\n\n^";
  296.             }
  297.             else if (killCount >= target)
  298.             {
  299.                 return killCount + " " + challengeName + " * \n\n ^";
  300.             }
  301.             else
  302.             {
  303.                 return killCount + "/" + target + " " + challengeName + " \n\n ^";
  304.             }
  305.         }
  306.  
  307.        
  308.     }
  309. }
Advertisement
Add Comment
Please, Sign In to add comment