From a42acb817649391fc4acb426c2d5f045a599bb9b Mon Sep 17 00:00:00 2001 From: zhiyang7 Date: Sun, 29 Jan 2023 09:24:00 +0800 Subject: [PATCH] Merge with latest branch --- build/0Harmony.dll | Bin 241152 -> 350720 bytes build/0Harmony.xml | 3693 ----------------- build/common.targets | 10 +- build/define-constant.targets | 7 +- src/Loader/Loader.csproj | 2 +- .../ConsoleWriting/ColorfulConsoleWriter.cs | 2 +- .../SMAPI.Mods.VirtualKeyboard.csproj | 2 +- .../SMAPI.Toolkit.CoreInterfaces.csproj | 3 +- .../Framework/LowLevelEnvironmentUtility.cs | 3 - src/SMAPI.Toolkit/SMAPI.Toolkit.csproj | 4 +- src/SMAPI.sln | 38 +- src/SMAPI/Constants.cs | 7 +- src/SMAPI/Context.cs | 5 +- .../Events/AssetsInvalidatedEventArgs.cs | 9 +- .../ContentManagers/ModContentManager.cs | 28 +- .../Framework/Input/GamePadStateBuilder.cs | 2 +- .../Framework/ModLoading/AssemblyLoader.cs | 2 +- .../ModLoading/AssemblyParseResult.cs | 2 +- .../ModLoading/Finders/FieldFinder.cs | 2 +- src/SMAPI/Framework/ModLoading/ModMetadata.cs | 4 +- .../ModLoading/PlatformAssemblyMap.cs | 2 +- .../RewriteFacades/DebrisMethods.cs | 85 - .../ModLoading/RewriteFacades/Game1Methods.cs | 4 +- .../RewriteFacades/HarmonyInstanceMethods.cs | 16 - .../RewriteFacades/IClickableMenuMethods.cs | 3 + .../ModLoading/RewriteFacades/NPCMethods.cs | 22 - .../RewriteFacades/SpriteTextMethods.cs | 2 + .../RewriteFacades/WeatherDebrisMethods.cs | 19 - .../HeuristicFieldAccessibilityRewriter.cs | 8 +- .../ReferenceToMissingMemberRewriter.cs | 8 +- src/SMAPI/Framework/Monitor.cs | 8 + src/SMAPI/Framework/SCore.cs | 28 +- src/SMAPI/Framework/SGame.cs | 1769 +++----- src/SMAPI/Framework/SGameRunner.cs | 6 + .../StateTracking/LocationTracker.cs | 16 +- .../StateTracking/WorldLocationsTracker.cs | 4 +- src/SMAPI/Framework/Translator.cs | 2 +- src/SMAPI/Framework/WatcherCore.cs | 2 +- src/SMAPI/IMultiplayerPeer.cs | 2 +- src/SMAPI/Metadata/CoreAssetPropagator.cs | 45 +- src/SMAPI/Metadata/InstructionMetadata.cs | 28 +- src/SMAPI/Mobile/IsExternalInit.cs | 7 + src/SMAPI/Mobile/MobileMemoryExtension.cs | 23 + src/SMAPI/Mobile/MobileTypeExtension.cs | 34 + src/SMAPI/Patches/JunimoHarvesterPatch.cs | 30 +- src/SMAPI/Patches/LocationSwitchPatch.cs | 16 +- src/SMAPI/Patches/MusicBankPatch.cs | 14 +- src/SMAPI/Patches/OnAppPausePatch.cs | 44 +- src/SMAPI/Patches/SaveBackupPatch.cs | 47 +- src/SMAPI/Patches/SaveGamePatch.cs | 54 +- src/SMAPI/Patches/SpriteFontPatch.cs | 16 +- src/SMAPI/Patches/ThreadSilenceExitPatch.cs | 44 +- src/SMAPI/Resources/Resource.designer.cs | 175 +- src/SMAPI/SGameConsole.cs | 4 +- src/SMAPI/SMAPI.csproj | 159 +- src/SMAPI/SMainActivity.cs | 59 +- src/SMAPI/Utilities/Keybind.cs | 4 + 57 files changed, 957 insertions(+), 5677 deletions(-) delete mode 100644 build/0Harmony.xml delete mode 100644 src/SMAPI/Framework/ModLoading/RewriteFacades/DebrisMethods.cs delete mode 100644 src/SMAPI/Framework/ModLoading/RewriteFacades/NPCMethods.cs delete mode 100644 src/SMAPI/Framework/ModLoading/RewriteFacades/WeatherDebrisMethods.cs create mode 100644 src/SMAPI/Mobile/IsExternalInit.cs create mode 100644 src/SMAPI/Mobile/MobileMemoryExtension.cs create mode 100644 src/SMAPI/Mobile/MobileTypeExtension.cs diff --git a/build/0Harmony.dll b/build/0Harmony.dll index 72ca2b61010fba570cfa42f15e917c84324bfbdc..1564f1c563c1b77d1a7d67c8403b3047bde22495 100644 GIT binary patch literal 350720 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

}+0NEG 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 M6}~9>^J{^B1GM_PDgXcg literal 241152 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 diff --git a/build/0Harmony.xml b/build/0Harmony.xml deleted file mode 100644 index f1b9b4cf..00000000 --- a/build/0Harmony.xml +++ /dev/null @@ -1,3693 +0,0 @@ - - - - 0Harmony - - - -

A factory to create delegate types - - - Default constructor - - - Creates a delegate type for a method - The method - The new delegate type - - - - A getter delegate type - Type that getter gets field/property value from - Type of the value that getter gets - The instance get getter uses - An delegate - - - - A setter delegate type - Type that setter sets field/property value for - Type of the value that setter sets - The instance the setter uses - The value the setter uses - An delegate - - - - A constructor delegate type - Type that constructor creates - An delegate - - - - A helper class for fast access to getters and setters - - - Creates an instantiation delegate - Type that constructor creates - The new instantiation delegate - - - - Creates an getter delegate for a property - Type that getter reads property from - Type of the property that gets accessed - The property - The new getter delegate - - - - Creates an getter delegate for a field - Type that getter reads field from - Type of the field that gets accessed - The field - The new getter delegate - - - - Creates an getter delegate for a field (with a list of possible field names) - Type that getter reads field/property from - Type of the field/property that gets accessed - A list of possible field names - The new getter delegate - - - - Creates an setter delegate - Type that setter assigns property value to - Type of the property that gets assigned - The property - The new setter delegate - - - - Creates an setter delegate for a field - Type that setter assigns field value to - Type of the field that gets assigned - The field - The new getter delegate - - - - A delegate to invoke a method - The instance - The method parameters - The method result - - - A helper class to invoke method with delegates - - - Creates a fast invocation handler from a method - The method to invoke - Controls if boxed value object is accessed/updated directly - The - - - The directBoxValueAccess option controls how value types passed by reference (e.g. ref int, out my_struct) are handled in the arguments array - passed to the fast invocation handler. - Since the arguments array is an object array, any value types contained within it are actually references to a boxed value object. - Like any other object, there can be other references to such boxed value objects, other than the reference within the arguments array. - For example, - - var val = 5; - var box = (object)val; - var arr = new object[] { box }; - handler(arr); // for a method with parameter signature: ref/out/in int - - - - - If directBoxValueAccess is true, the boxed value object is accessed (and potentially updated) directly when the handler is called, - such that all references to the boxed object reflect the potentially updated value. - In the above example, if the method associated with the handler updates the passed (boxed) value to 10, both box and arr[0] - now reflect the value 10. Note that the original val is not updated, since boxing always copies the value into the new boxed value object. - - - If directBoxValueAccess is false (default), the boxed value object in the arguments array is replaced with a "reboxed" value object, - such that potential updates to the value are reflected only in the arguments array. - In the above example, if the method associated with the handler updates the passed (boxed) value to 10, only arr[0] now reflects the value 10. - - - - - A low level memory helper - - - - Mark method for no inlining (currently only works on Mono) - The method/constructor to change - - - - Detours a method - The original method/constructor - The replacement method/constructor - An error string - - - - Writes a jump to memory - The memory address - Jump destination - An error string - - - - Gets the start of a method in memory - The method/constructor - [out] Details of the exception - The method start address - - - - special parameter names that can be used in prefix and postfix methods - - - Patch function helpers - - - Sorts patch methods by their priority rules - The original method - Patches to sort - Use debug mode - The sorted patch methods - - - - Creates new replacement method with the latest patches and detours the original method - The original method - Information describing the patches - The newly created replacement method - - - - Creates a patch sorter - Array of patches that will be sorted - Use debugging - - - Sorts internal PatchSortingWrapper collection and caches the results. - After first run the result is provided from the cache. - The original method - The sorted patch methods - - - Checks if the sorter was created with the same patch list and as a result can be reused to - get the sorted order of the patches. - List of patches to check against - true if equal - - - Removes one unresolved dependency from the least important patch. - - - Outputs all unblocked patches from the waiting list to results list - - - Adds patch to both results list and handled patches set - Patch to add - - - Wrapper used over the Patch object to allow faster dependency access and - dependency removal in case of cyclic dependencies - - - Create patch wrapper object used for sorting - Patch to wrap - - - Determines how patches sort - The other patch - integer to define sort order (-1, 0, 1) - - - Determines whether patches are equal - The other patch - true if equal - - - Hash function - A hash code - - - Bidirectionally registers Patches as after dependencies - List of dependencies to register - - - Bidirectionally registers Patches as before dependencies - List of dependencies to register - - - Bidirectionally removes Patch from after dependencies - Patch to remove - - - Bidirectionally removes Patch from before dependencies - Patch to remove - - - Specifies the type of method - - - - This is a normal method - - - This is a getter - - - This is a setter - - - This is a constructor - - - This is a static constructor - - - This targets the MoveNext method of the enumerator result - - - Specifies the type of argument - - - - This is a normal argument - - - This is a reference argument (ref) - - - This is an out argument (out) - - - This is a pointer argument (&) - - - Specifies the type of patch - - - - Any patch - - - A prefix patch - - - A postfix patch - - - A transpiler - - - A finalizer - - - A reverse patch - - - Specifies the type of reverse patch - - - - Use the unmodified original method (directly from IL) - - - Use the original as it is right now including previous patches but excluding future ones - - - Specifies the type of method call dispatching mechanics - - - - Call the method using dynamic dispatching if method is virtual (including overriden) - - - This is the built-in form of late binding (a.k.a. dynamic binding) and is the default dispatching mechanic in C#. - This directly corresponds with the instruction. - - - For virtual (including overriden) methods, the instance type's most-derived/overriden implementation of the method is called. - For non-virtual (including static) methods, same behavior as : the exact specified method implementation is called. - - - Note: This is not a fully dynamic dispatch, since non-virtual (including static) methods are still called non-virtually. - A fully dynamic dispatch in C# involves using - the dynamic type - (actually a fully dynamic binding, since even the name and overload resolution happens at runtime), which does not support. - - - - - Call the method using static dispatching, regardless of whether method is virtual (including overriden) or non-virtual (including static) - - - a.k.a. non-virtual dispatching, early binding, or static binding. - This directly corresponds with the instruction. - - - For both virtual (including overriden) and non-virtual (including static) methods, the exact specified method implementation is called, without virtual/override mechanics. - - - - - The base class for all Harmony annotations (not meant to be used directly) - - - - The common information for all attributes - - - Annotation to define your Harmony patch methods - - - - An empty annotation can be used together with TargetMethod(s) - - - - An annotation that specifies a class to patch - The declaring class/type - - - - An annotation that specifies a method, property or constructor to patch - The declaring class/type - The argument types of the method or constructor to patch - - - - An annotation that specifies a method, property or constructor to patch - The declaring class/type - The name of the method, property or constructor to patch - - - - An annotation that specifies a method, property or constructor to patch - The declaring class/type - The name of the method, property or constructor to patch - An array of argument types to target overloads - - - - An annotation that specifies a method, property or constructor to patch - The declaring class/type - The name of the method, property or constructor to patch - An array of argument types to target overloads - Array of - - - - An annotation that specifies a method, property or constructor to patch - The declaring class/type - The - - - - An annotation that specifies a method, property or constructor to patch - The declaring class/type - The - An array of argument types to target overloads - - - - An annotation that specifies a method, property or constructor to patch - The declaring class/type - The - An array of argument types to target overloads - Array of - - - - An annotation that specifies a method, property or constructor to patch - The declaring class/type - The name of the method, property or constructor to patch - The - - - - An annotation that specifies a method, property or constructor to patch - The name of the method, property or constructor to patch - - - - An annotation that specifies a method, property or constructor to patch - The name of the method, property or constructor to patch - An array of argument types to target overloads - - - - An annotation that specifies a method, property or constructor to patch - The name of the method, property or constructor to patch - An array of argument types to target overloads - An array of - - - - An annotation that specifies a method, property or constructor to patch - The name of the method, property or constructor to patch - The - - - - An annotation that specifies a method, property or constructor to patch - The - - - - An annotation that specifies a method, property or constructor to patch - The - An array of argument types to target overloads - - - - An annotation that specifies a method, property or constructor to patch - The - An array of argument types to target overloads - An array of - - - - An annotation that specifies a method, property or constructor to patch - An array of argument types to target overloads - - - - An annotation that specifies a method, property or constructor to patch - An array of argument types to target overloads - An array of - - - - An annotation that specifies a method, property or constructor to patch - The full name of the declaring class/type - The name of the method, property or constructor to patch - The - - - - Annotation to define the original method for delegate injection - - - - An annotation that specifies a class to patch - The declaring class/type - - - - An annotation that specifies a method, property or constructor to patch - The declaring class/type - The argument types of the method or constructor to patch - - - - An annotation that specifies a method, property or constructor to patch - The declaring class/type - The name of the method, property or constructor to patch - - - - An annotation that specifies a method, property or constructor to patch - The declaring class/type - The name of the method, property or constructor to patch - An array of argument types to target overloads - - - - An annotation that specifies a method, property or constructor to patch - The declaring class/type - The name of the method, property or constructor to patch - An array of argument types to target overloads - Array of - - - - An annotation that specifies a method, property or constructor to patch - The declaring class/type - The - - - - An annotation that specifies a method, property or constructor to patch - The declaring class/type - The - An array of argument types to target overloads - - - - An annotation that specifies a method, property or constructor to patch - The declaring class/type - The - An array of argument types to target overloads - Array of - - - - An annotation that specifies a method, property or constructor to patch - The declaring class/type - The name of the method, property or constructor to patch - The - - - - An annotation that specifies a method, property or constructor to patch - The name of the method, property or constructor to patch - - - - An annotation that specifies a method, property or constructor to patch - The name of the method, property or constructor to patch - An array of argument types to target overloads - - - - An annotation that specifies a method, property or constructor to patch - The name of the method, property or constructor to patch - An array of argument types to target overloads - An array of - - - - An annotation that specifies a method, property or constructor to patch - The name of the method, property or constructor to patch - The - - - - An annotation that specifies call dispatching mechanics for the delegate - The - - - - An annotation that specifies a method, property or constructor to patch - The - An array of argument types to target overloads - - - - An annotation that specifies a method, property or constructor to patch - The - An array of argument types to target overloads - An array of - - - - An annotation that specifies a method, property or constructor to patch - An array of argument types to target overloads - - - - An annotation that specifies a method, property or constructor to patch - An array of argument types to target overloads - An array of - - - - Annotation to define your standin methods for reverse patching - - - - An annotation that specifies the type of reverse patching - The of the reverse patch - - - - A Harmony annotation to define that all methods in a class are to be patched - - - - A Harmony annotation - - - - A Harmony annotation to define patch priority - The priority - - - - A Harmony annotation - - - - A Harmony annotation to define that a patch comes before another patch - The array of harmony IDs of the other patches - - - - A Harmony annotation - - - A Harmony annotation to define that a patch comes after another patch - The array of harmony IDs of the other patches - - - - A Harmony annotation - - - A Harmony annotation to debug a patch (output uses to log to your Desktop) - - - - Specifies the Prepare function in a patch class - - - - Specifies the Cleanup function in a patch class - - - - Specifies the TargetMethod function in a patch class - - - - Specifies the TargetMethods function in a patch class - - - - Specifies the Prefix function in a patch class - - - - Specifies the Postfix function in a patch class - - - - Specifies the Transpiler function in a patch class - - - - Specifies the Finalizer function in a patch class - - - - A Harmony annotation - - - - The name of the original argument - - - - The index of the original argument - - - - The new name of the original argument - - - - An annotation to declare injected arguments by name - - - - An annotation to declare injected arguments by index - Zero-based index - - - - An annotation to declare injected arguments by renaming them - Name of the original argument - New name - - - - An annotation to declare injected arguments by index and renaming them - Zero-based index - New name - - - - An abstract wrapper around OpCode and their operands. Used by transpilers - - - - The opcode - - - - The operand - - - - All labels defined on this instruction - - - - All exception block boundaries defined on this instruction - - - - Creates a new CodeInstruction with a given opcode and optional operand - The opcode - The operand - - - - Create a full copy (including labels and exception blocks) of a CodeInstruction - The to copy - - - - Clones a CodeInstruction and resets its labels and exception blocks - A lightweight copy of this code instruction - - - - Clones a CodeInstruction, resets labels and exception blocks and sets its opcode - The opcode - A copy of this CodeInstruction with a new opcode - - - - Clones a CodeInstruction, resets labels and exception blocks and sets its operand - The operand - A copy of this CodeInstruction with a new operand - - - - Creates a CodeInstruction calling a method (CALL) - The class/type where the method is declared - The name of the method (case sensitive) - Optional parameters to target a specific overload of the method - Optional list of types that define the generic version of the method - A code instruction that calls the method matching the arguments - - - - Creates a CodeInstruction calling a method (CALL) - The target method in the form TypeFullName:MethodName, where the type name matches a form recognized by Type.GetType like Some.Namespace.Type. - Optional parameters to target a specific overload of the method - Optional list of types that define the generic version of the method - A code instruction that calls the method matching the arguments - - - - Creates a CodeInstruction calling a method (CALL) - The lambda expression using the method - - - - - Creates a CodeInstruction calling a method (CALL) - The lambda expression using the method - - - - - Creates a CodeInstruction calling a method (CALL) - The lambda expression using the method - - - - - Creates a CodeInstruction calling a method (CALL) - The lambda expression using the method - - - - - Returns an instruction to call the specified closure - The delegate type to emit - The closure that defines the method to call - A that calls the closure as a method - - - - Creates a CodeInstruction loading a field (LD[S]FLD[A]) - The class/type where the field is defined - The name of the field (case sensitive) - Use address of field - - - - Creates a CodeInstruction storing to a field (ST[S]FLD) - The class/type where the field is defined - The name of the field (case sensitive) - - - - Returns a string representation of the code instruction - A string representation of the code instruction - - - - Exception block types - - - - The beginning of an exception block - - - - The beginning of a catch block - - - - The beginning of an except filter block (currently not supported to use in a patch) - - - - The beginning of a fault block - - - - The beginning of a finally block - - - - The end of an exception block - - - - An exception block - - - - Block type - - - - Catch type - - - - Creates an exception block - The - The catch type - - - - The Harmony instance is the main entry to Harmony. After creating one with an unique identifier, it is used to patch and query the current application domain - - - - The unique identifier - - - - Set to true before instantiating Harmony to debug Harmony or use an environment variable to set HARMONY_DEBUG to '1' like this: cmd /C "set HARMONY_DEBUG=1 && game.exe" - This is for full debugging. To debug only specific patches, use the attribute - - - - Creates a new Harmony instance - A unique identifier (you choose your own) - A Harmony instance - - - - Searches the current assembly for Harmony annotations and uses them to create patches - This method can fail to use the correct assembly when being inlined. It calls StackTrace.GetFrame(1) which can point to the wrong method/assembly. If you are unsure or run into problems, use PatchAll(Assembly.GetExecutingAssembly()) instead. - - - - Creates a empty patch processor for an original method - The original method/constructor - A new instance - - - - Creates a patch class processor from an annotated class - The class/type - A new instance - - - - Creates a reverse patcher for one of your stub methods - The original method/constructor - The stand-in stub method as - A new instance - - - - Searches an assembly for Harmony annotations and uses them to create patches - The assembly - - - - Creates patches by manually specifying the methods - The original method/constructor - An optional prefix method wrapped in a object - An optional postfix method wrapped in a object - An optional transpiler method wrapped in a object - An optional finalizer method wrapped in a object - The replacement method that was created to patch the original method - - - - Patches a foreign method onto a stub method of yours and optionally applies transpilers during the process - The original method/constructor you want to duplicate - Your stub method as that will become the original. Needs to have the correct signature (either original or whatever your transpilers generates) - An optional transpiler as method that will be applied during the process - The replacement method that was created to patch the stub method - - - - Unpatches methods by patching them with zero patches. Fully unpatching is not supported. Be careful, unpatching is global - The optional Harmony ID to restrict unpatching to a specific Harmony instance - This method could be static if it wasn't for the fact that unpatching creates a new replacement method that contains your harmony ID - - - - Unpatches a method by patching it with zero patches. Fully unpatching is not supported. Be careful, unpatching is global - The original method/constructor - The - The optional Harmony ID to restrict unpatching to a specific Harmony instance - - - - Unpatches a method by patching it with zero patches. Fully unpatching is not supported. Be careful, unpatching is global - The original method/constructor - The patch method as method to remove - - - - Test for patches from a specific Harmony ID - The Harmony ID - True if patches for this ID exist - - - - Gets patch information for a given original method - The original method/constructor - The patch information as - - - - Gets the methods this instance has patched - An enumeration of original methods/constructors - - - - Gets all patched original methods in the appdomain - An enumeration of patched original methods/constructors - - - - Gets the original method from a given replacement method - A replacement method, for example from a stacktrace - The original method/constructor or null if not found - - - - Tries to get the method from a stackframe including dynamic replacement methods - The - For normal frames, frame.GetMethod() is returned. For frames containing patched methods, the replacement method is returned or null if no method can be found - - - - Gets the original method from the stackframe and uses original if method is a dynamic replacement - The - The original method from that stackframe - - - Gets Harmony version for all active Harmony instances - [out] The current Harmony version - A dictionary containing assembly versions keyed by Harmony IDs - - - - Under Mono, HarmonyException wraps IL compile errors with detailed information about the failure - - - - Default serialization constructor (not implemented) - The info - The context - - - - Get a list of IL instructions in pairs of offset+code - A list of key/value pairs which represent an offset and the code at that offset - - - - Get a list of IL instructions without offsets - A list of - - - - Get the error offset of the errornous IL instruction - The offset - - - - Get the index of the errornous IL instruction - The index into the list of instructions or -1 if not found - - - - A wrapper around a method to use it as a patch (for example a Prefix) - - - - The original method - - - - Class/type declaring this patch - - - - Patch method name - - - - Optional patch - - - - Array of argument types of the patch method - - - - of the patch - - - - Install this patch before patches with these Harmony IDs - - - - Install this patch after patches with these Harmony IDs - - - - Reverse patch type, see - - - - Create debug output for this patch - - - - Whether to use (true) or (false) mechanics - for -attributed delegate - - - - Default constructor - - - - Creates a patch from a given method - The original method - - - - Creates a patch from a given method - The original method - The patch - A list of harmony IDs that should come after this patch - A list of harmony IDs that should come before this patch - Set to true to generate debug output - - - - Creates a patch from a given method - The patch class/type - The patch method name - The optional argument types of the patch method (for overloaded methods) - - - - Gets the names of all internal patch info fields - A list of field names - - - - Merges annotations - The list of to merge - The merged - - - - Returns a string that represents the annotation - A string representation - - - - Annotation extensions - - - - Copies annotation information - The source - The destination - - - - Clones an annotation - The to clone - A copied - - - - Merges annotations - The master - The detail - A new, merged - - - - Gets all annotations on a class/type - The class/type - A list of all - - - - Gets merged annotations on a class/type - The class/type - The merged - - - - Gets all annotations on a method - The method/constructor - A list of - - - - Gets merged annotations on a method - The method/constructor - The merged - - - - - A mutable representation of an inline signature, similar to Mono.Cecil's CallSite. - Used by the calli instruction, can be used by transpilers - - - - - See - - - - See - - - - See - - - - The list of all parameter types or function pointer signatures received by the call site - - - - The return type or function pointer signature returned by the call site - - - - Returns a string representation of the inline signature - A string representation of the inline signature - - - - - A mutable representation of a parameter type with an attached type modifier, - similar to Mono.Cecil's OptionalModifierType / RequiredModifierType and C#'s modopt / modreq - - - - - Whether this is a modopt (optional modifier type) or a modreq (required modifier type) - - - - The modifier type attached to the parameter type - - - - The modified parameter type - - - - Returns a string representation of the modifier type - A string representation of the modifier type - - - - Patch serialization - - - - Control the binding of a serialized object to a type - Specifies the assembly name of the serialized object - Specifies the type name of the serialized object - The type of the object the formatter creates a new instance of - - - - Serializes a patch info - The - The serialized data - - - - Deserialize a patch info - The serialized data - A - - - - Compare function to sort patch priorities - The patch - Zero-based index - The priority - A standard sort integer (-1, 0, 1) - - - - Serializable patch information - - - - Prefixes as an array of - - - - Postfixes as an array of - - - - Transpilers as an array of - - - - Finalizers as an array of - - - - Returns if any of the patches wants debugging turned on - - - - Adds prefixes - An owner (Harmony ID) - The patch methods - - - - Adds a prefix - - - Removes prefixes - The owner of the prefixes, or * for all - - - - Adds postfixes - An owner (Harmony ID) - The patch methods - - - - Adds a postfix - - - Removes postfixes - The owner of the postfixes, or * for all - - - - Adds transpilers - An owner (Harmony ID) - The patch methods - - - - Adds a transpiler - - - Removes transpilers - The owner of the transpilers, or * for all - - - - Adds finalizers - An owner (Harmony ID) - The patch methods - - - - Adds a finalizer - - - Removes finalizers - The owner of the finalizers, or * for all - - - - Removes a patch using its method - The method of the patch to remove - - - - Gets a concatenated list of patches - The Harmony instance ID adding the new patches - The patches to add - The current patches - - - - Gets a list of patches with any from the given owner removed - The owner of the methods, or * for all - The current patches - - - - A serializable patch - - - - Zero-based index - - - - The owner (Harmony ID) - - - - The priority, see - - - - Keep this patch before the patches indicated in the list of Harmony IDs - - - - Keep this patch after the patches indicated in the list of Harmony IDs - - - - A flag that will log the replacement method via every time this patch is used to build the replacement, even in the future - - - - The method of the static patch method - - - - Creates a patch - The method of the patch - Zero-based index - An owner (Harmony ID) - The priority, see - A list of Harmony IDs for patches that should run after this patch - A list of Harmony IDs for patches that should run before this patch - A flag that will log the replacement method via every time this patch is used to build the replacement, even in the future - - - - Creates a patch - The method of the patch - Zero-based index - An owner (Harmony ID) - - - Get the patch method or a DynamicMethod if original patch method is a patch factory - The original method/constructor - The method of the patch - - - - Determines whether patches are equal - The other patch - true if equal - - - - Determines how patches sort - The other patch - integer to define sort order (-1, 0, 1) - - - - Hash function - A hash code - - - - A PatchClassProcessor used to turn on a class/type into patches - - - - Creates a patch class processor by pointing out a class. Similar to PatchAll() but without searching through all classes. - The Harmony instance - The class to process (need to have at least a [HarmonyPatch] attribute) - - - - Applies the patches - A list of all created replacement methods or null if patch class is not annotated - - - - A group of patches - - - - A collection of prefix - - - - A collection of postfix - - - - A collection of transpiler - - - - A collection of finalizer - - - - Gets all owners (Harmony IDs) or all known patches - The patch owners - - - - Creates a group of patches - An array of prefixes as - An array of postfixes as - An array of transpileres as - An array of finalizeres as - - - - A PatchProcessor handles patches on a method/constructor - - - - Creates an empty patch processor - The Harmony instance - The original method/constructor - - - - Adds a prefix - The prefix as a - A for chaining calls - - - - Adds a prefix - The prefix method - A for chaining calls - - - - Adds a postfix - The postfix as a - A for chaining calls - - - - Adds a postfix - The postfix method - A for chaining calls - - - - Adds a transpiler - The transpiler as a - A for chaining calls - - - - Adds a transpiler - The transpiler method - A for chaining calls - - - - Adds a finalizer - The finalizer as a - A for chaining calls - - - - Adds a finalizer - The finalizer method - A for chaining calls - - - - Gets all patched original methods in the appdomain - An enumeration of patched method/constructor - - - - Applies all registered patches - The generated replacement method - - - - Unpatches patches of a given type and/or Harmony ID - The patch type - Harmony ID or * for any - A for chaining calls - - - - Unpatches a specific patch - The method of the patch - A for chaining calls - - - - Gets patch information on an original - The original method/constructor - The patch information as - - - - Sort patch methods by their priority rules - The original method - Patches to sort - The sorted patch methods - - - - Gets Harmony version for all active Harmony instances - [out] The current Harmony version - A dictionary containing assembly version keyed by Harmony ID - - - - Creates a new empty generator to use when reading method bodies - A new - - - - Creates a new generator matching the method/constructor to use when reading method bodies - The original method/constructor to copy method information from - A new - - - - Returns the methods unmodified list of code instructions - The original method/constructor - Optionally an existing generator that will be used to create all local variables and labels contained in the result (if not specified, an internal generator is used) - A list containing all the original - - - - Returns the methods unmodified list of code instructions - The original method/constructor - A new generator that now contains all local variables and labels contained in the result - A list containing all the original - - - - Returns the methods current list of code instructions after all existing transpilers have been applied - The original method/constructor - Apply only the first count of transpilers - Optionally an existing generator that will be used to create all local variables and labels contained in the result (if not specified, an internal generator is used) - A list of - - - - Returns the methods current list of code instructions after all existing transpilers have been applied - The original method/constructor - A new generator that now contains all local variables and labels contained in the result - Apply only the first count of transpilers - A list of - - - - A low level way to read the body of a method. Used for quick searching in methods - The original method - All instructions as opcode/operand pairs - - - - A low level way to read the body of a method. Used for quick searching in methods - The original method - An existing generator that will be used to create all local variables and labels contained in the result - All instructions as opcode/operand pairs - - - - A patch priority - - - - Patch last - - - - Patch with very low priority - - - - Patch with low priority - - - - Patch with lower than normal priority - - - - Patch with normal priority - - - - Patch with higher than normal priority - - - - Patch with high priority - - - - Patch with very high priority - - - - Patch first - - - - A reverse patcher - - - - Creates a reverse patcher - The Harmony instance - The original method/constructor - Your stand-in stub method as - - - - Applies the patch - The type of patch, see - The generated replacement method - - - - A collection of commonly used transpilers - - - - A transpiler that replaces all occurrences of a given method with another one using the same signature - The enumeration of to act on - Method or constructor to search for - Method or constructor to replace with - Modified enumeration of - - - - A transpiler that alters instructions that match a predicate by calling an action - The enumeration of to act on - A predicate selecting the instructions to change - An action to apply to matching instructions - Modified enumeration of - - - - A transpiler that logs a text at the beginning of the method - The instructions to act on - The log text - Modified enumeration of - - - - A helper class for reflection related functions - - - - Shortcut for to simplify the use of reflections and make it work for any access level - - - - Shortcut for to simplify the use of reflections and make it work for any access level but only within the current type - - - - Enumerates all assemblies in the current app domain, excluding visual studio assemblies - An enumeration of - - - Gets a type by name. Prefers a full name with namespace but falls back to the first type matching the name otherwise - The name - A type or null if not found - - - - Gets all successfully loaded types from a given assembly - The assembly - An array of types - - This calls and returns , while catching any thrown . - If such an exception is thrown, returns the successfully loaded types (, - filtered for non-null values). - - - - - Enumerates all successfully loaded types in the current app domain, excluding visual studio assemblies - An enumeration of all in all assemblies, excluding visual studio assemblies - - - Applies a function going up the type hierarchy and stops at the first non-null result - Result type of func() - The class/type to start with - The evaluation function returning T - The first non-null result, or null if no match - - The type hierarchy of a class or value type (including struct) does NOT include implemented interfaces, - and the type hierarchy of an interface is only itself (regardless of whether that interface implements other interfaces). - The top-most type in the type hierarchy of all non-interface types (including value types) is . - - - - - Applies a function going into inner types and stops at the first non-null result - Generic type parameter - The class/type to start with - The evaluation function returning T - The first non-null result, or null if no match - - - - Gets the reflection information for a directly declared field - The class/type where the field is defined - The name of the field - A field or null when type/name is null or when the field cannot be found - - - - Gets the reflection information for a directly declared field - The member in the form TypeFullName:MemberName, where TypeFullName matches the form recognized by Type.GetType like Some.Namespace.Type. - A field or null when the field cannot be found - - - - Gets the reflection information for a field by searching the type and all its super types - The class/type where the field is defined - The name of the field (case sensitive) - A field or null when type/name is null or when the field cannot be found - - - - Gets the reflection information for a field by searching the type and all its super types - The member in the form TypeFullName:MemberName, where TypeFullName matches the form recognized by Type.GetType like Some.Namespace.Type. - A field or null when the field cannot be found - - - - Gets the reflection information for a field - The class/type where the field is declared - The zero-based index of the field inside the class definition - A field or null when type is null or when the field cannot be found - - - - Gets the reflection information for a directly declared property - The class/type where the property is declared - The name of the property (case sensitive) - A property or null when type/name is null or when the property cannot be found - - - - Gets the reflection information for a directly declared property - The member in the form TypeFullName:MemberName, where TypeFullName matches the form recognized by Type.GetType like Some.Namespace.Type. - A property or null when the property cannot be found - - - - Gets the reflection information for the getter method of a directly declared property - The class/type where the property is declared - The name of the property (case sensitive) - A method or null when type/name is null or when the property cannot be found - - - - Gets the reflection information for the getter method of a directly declared property - The member in the form TypeFullName:MemberName, where TypeFullName matches the form recognized by Type.GetType like Some.Namespace.Type. - A method or null when the property cannot be found - - - - Gets the reflection information for the setter method of a directly declared property - The class/type where the property is declared - The name of the property (case sensitive) - A method or null when type/name is null or when the property cannot be found - - - - Gets the reflection information for the Setter method of a directly declared property - The member in the form TypeFullName:MemberName, where TypeFullName matches the form recognized by Type.GetType like Some.Namespace.Type. - A method or null when the property cannot be found - - - - Gets the reflection information for a property by searching the type and all its super types - The class/type - The name - A property or null when type/name is null or when the property cannot be found - - - - Gets the reflection information for a property by searching the type and all its super types - The member in the form TypeFullName:MemberName, where TypeFullName matches the form recognized by Type.GetType like Some.Namespace.Type. - A property or null when the property cannot be found - - - - Gets the reflection information for the getter method of a property by searching the type and all its super types - The class/type - The name - A method or null when type/name is null or when the property cannot be found - - - - Gets the reflection information for the getter method of a property by searching the type and all its super types - The member in the form TypeFullName:MemberName, where TypeFullName matches the form recognized by Type.GetType like Some.Namespace.Type. - A method or null when type/name is null or when the property cannot be found - - - - Gets the reflection information for the setter method of a property by searching the type and all its super types - The class/type - The name - A method or null when type/name is null or when the property cannot be found - - - - Gets the reflection information for the setter method of a property by searching the type and all its super types - The member in the form TypeFullName:MemberName, where TypeFullName matches the form recognized by Type.GetType like Some.Namespace.Type. - A method or null when type/name is null or when the property cannot be found - - - - Gets the reflection information for a directly declared method - The class/type where the method is declared - The name of the method (case sensitive) - Optional parameters to target a specific overload of the method - Optional list of types that define the generic version of the method - A method or null when type/name is null or when the method cannot be found - - - - Gets the reflection information for a directly declared method - The member in the form TypeFullName:MemberName, where TypeFullName matches the form recognized by Type.GetType like Some.Namespace.Type. - Optional parameters to target a specific overload of the method - Optional list of types that define the generic version of the method - A method or null when the method cannot be found - - - - Gets the reflection information for a method by searching the type and all its super types - The class/type where the method is declared - The name of the method (case sensitive) - Optional parameters to target a specific overload of the method - Optional list of types that define the generic version of the method - A method or null when type/name is null or when the method cannot be found - - - - Gets the reflection information for a method by searching the type and all its super types - The member in the form TypeFullName:MemberName, where TypeFullName matches the form recognized by Type.GetType like Some.Namespace.Type. - Optional parameters to target a specific overload of the method - Optional list of types that define the generic version of the method - A method or null when the method cannot be found - - - - Gets the method of an enumerator method - Enumerator method that creates the enumerator - The internal method of the enumerator or null if no valid enumerator is detected - - - Gets the names of all method that are declared in a type - The declaring class/type - A list of method names - - - - Gets the names of all method that are declared in the type of the instance - An instance of the type to search in - A list of method names - - - - Gets the names of all fields that are declared in a type - The declaring class/type - A list of field names - - - - Gets the names of all fields that are declared in the type of the instance - An instance of the type to search in - A list of field names - - - - Gets the names of all properties that are declared in a type - The declaring class/type - A list of property names - - - - Gets the names of all properties that are declared in the type of the instance - An instance of the type to search in - A list of property names - - - - Gets the type of any class member of - A member - The class/type of this member - - - - Test if a class member is actually an concrete implementation - A member - True if the member is a declared - - - - Gets the real implementation of a class member - A member - The member itself if its declared. Otherwise the member that is actually implemented in some base type - - - - Gets the reflection information for a directly declared constructor - The class/type where the constructor is declared - Optional parameters to target a specific overload of the constructor - Optional parameters to only consider static constructors - A constructor info or null when type is null or when the constructor cannot be found - - - - Gets the reflection information for a constructor by searching the type and all its super types - The class/type where the constructor is declared - Optional parameters to target a specific overload of the method - Optional parameters to only consider static constructors - A constructor info or null when type is null or when the method cannot be found - - - - Gets reflection information for all declared constructors - The class/type where the constructors are declared - Optional parameters to only consider static constructors - A list of constructor infos - - - - Gets reflection information for all declared methods - The class/type where the methods are declared - A list of methods - - - - Gets reflection information for all declared properties - The class/type where the properties are declared - A list of properties - - - - Gets reflection information for all declared fields - The class/type where the fields are declared - A list of fields - - - - Gets the return type of a method or constructor - The method/constructor - The return type - - - - Given a type, returns the first inner type matching a recursive search by name - The class/type to start searching at - The name of the inner type (case sensitive) - The inner type or null if type/name is null or if a type with that name cannot be found - - - - Given a type, returns the first inner type matching a recursive search with a predicate - The class/type to start searching at - The predicate to search with - The inner type or null if type/predicate is null or if a type with that name cannot be found - - - - Given a type, returns the first method matching a predicate - The class/type to start searching at - The predicate to search with - The method or null if type/predicate is null or if a type with that name cannot be found - - - - Given a type, returns the first constructor matching a predicate - The class/type to start searching at - The predicate to search with - The constructor info or null if type/predicate is null or if a type with that name cannot be found - - - - Given a type, returns the first property matching a predicate - The class/type to start searching at - The predicate to search with - The property or null if type/predicate is null or if a type with that name cannot be found - - - - Returns an array containing the type of each object in the given array - An array of objects - An array of types or an empty array if parameters is null (if an object is null, the type for it will be object) - - - - Creates an array of input parameters for a given method and a given set of potential inputs - The method/constructor you are planing to call - The possible input parameters in any order - An object array matching the method signature - - - - A readable/assignable reference delegate to an instance field of a class or static field (NOT an instance field of a struct) - - An arbitrary type if the field is static; otherwise the class that defines the field, or a parent class (including ), - implemented interface, or derived class of this type - - - The type of the field; or if the field's type is a reference type (a class or interface, NOT a struct or other value type), - a type that is assignable from that type; or if the field's type is an enum type, - either that type or the underlying integral type of that enum type - - The runtime instance to access the field (ignored and can be omitted for static fields) - A readable/assignable reference to the field - Null instance passed to a non-static field ref delegate - - Instance of invalid type passed to a non-static field ref delegate - (this can happen if is a parent class or interface of the field's declaring type) - - - - This delegate cannot be used for instance fields of structs, since a struct instance passed to the delegate would be passed by - value and thus would be a copy that only exists within the delegate's invocation. This is fine for a readonly reference, - but makes assignment futile. Use instead. - - - Note that is not required to be the field's declaring type. It can be a parent class (including ), - implemented interface, or a derived class of the field's declaring type ("instanceOfT is FieldDeclaringType" must be possible). - Specifically, must be assignable from OR to the field's declaring type. - Technically, this allows Nullable, although Nullable is only relevant for structs, and since only static fields of structs - are allowed for this delegate, and the instance passed to such a delegate is ignored, this hardly matters. - - - Similarly, is not required to be the field's field type, unless that type is a non-enum value type. - It can be a parent class (including object) or implemented interface of the field's field type. It cannot be a derived class. - This variance is not allowed for value types, since that would require boxing/unboxing, which is not allowed for ref values. - Special case for enum types: can also be the underlying integral type of the enum type. - Specifically, for reference types, must be assignable from - the field's field type; for non-enum value types, must be exactly the field's field type; for enum types, - must be either the field's field type or the underyling integral type of that field type. - - - This delegate supports static fields, even those defined in structs, for legacy reasons. - For such static fields, is effectively ignored. - Consider using (and StaticFieldRefAccess methods that return it) instead for static fields. - - - - - - Creates a field reference delegate for an instance field of a class - The class that defines the instance field, or derived class of this type - - The type of the field; or if the field's type is a reference type (a class or interface, NOT a struct or other value type), - a type that is assignable from that type; or if the field's type is an enum type, - either that type or the underlying integral type of that enum type - - The name of the field - A readable/assignable delegate - - - For backwards compatibility, there is no class constraint on . - Instead, the non-value-type check is done at runtime within the method. - - - - - - Creates an instance field reference for a specific instance of a class - The class that defines the instance field, or derived class of this type - - The type of the field; or if the field's type is a reference type (a class or interface, NOT a struct or other value type), - a type that is assignable from that type; or if the field's type is an enum type, - either that type or the underlying integral type of that enum type - - The instance - The name of the field - A readable/assignable reference to the field - - - This method is meant for one-off access to a field's value for a single instance. - If you need to access a field's value for potentially multiple instances, use instead. - FieldRefAccess<T, F>(instance, fieldName) is functionally equivalent to FieldRefAccess<T, F>(fieldName)(instance). - - - For backwards compatibility, there is no class constraint on . - Instead, the non-value-type check is done at runtime within the method. - - - - - - Creates a field reference delegate for an instance field of a class or static field (NOT an instance field of a struct) - - The type of the field; or if the field's type is a reference type (a class or interface, NOT a struct or other value type), - a type that is assignable from that type; or if the field's type is an enum type, - either that type or the underlying integral type of that enum type - - - The type that defines the field, or derived class of this type; must not be a struct type unless the field is static - - The name of the field - - A readable/assignable delegate with T=object - (for static fields, the instance delegate parameter is ignored) - - - - This method is meant for cases where the given type is only known at runtime and thus can't be used as a type parameter T - in e.g. . - - - This method supports static fields, even those defined in structs, for legacy reasons. - Consider using (and other overloads) instead for static fields. - - - - - - Creates a field reference delegate for an instance field of a class or static field (NOT an instance field of a struct) - type of the field - The member in the form TypeFullName:MemberName, where TypeFullName matches the form recognized by Type.GetType like Some.Namespace.Type. - A readable/assignable delegate with T=object - - - Creates a field reference delegate for an instance field of a class or static field (NOT an instance field of a struct) - - An arbitrary type if the field is static; otherwise the class that defines the field, or a parent class (including ), - implemented interface, or derived class of this type ("instanceOfT is FieldDeclaringType" must be possible) - - - The type of the field; or if the field's type is a reference type (a class or interface, NOT a struct or other value type), - a type that is assignable from that type; or if the field's type is an enum type, - either that type or the underlying integral type of that enum type - - The field - A readable/assignable delegate - - - This method is meant for cases where the field has already been obtained, avoiding the field searching cost in - e.g. . - - - This method supports static fields, even those defined in structs, for legacy reasons. - For such static fields, is effectively ignored. - Consider using (and other overloads) instead for static fields. - - - For backwards compatibility, there is no class constraint on . - Instead, the non-value-type check is done at runtime within the method. - - - - - - Creates a field reference for an instance field of a class - - The type that defines the field; or a parent class (including ), implemented interface, or derived class of this type - ("instanceOfT is FieldDeclaringType" must be possible) - - - The type of the field; or if the field's type is a reference type (a class or interface, NOT a struct or other value type), - a type that is assignable from that type; or if the field's type is an enum type, - either that type or the underlying integral type of that enum type - - The instance - The field - A readable/assignable reference to the field - - - This method is meant for one-off access to a field's value for a single instance and where the field has already been obtained. - If you need to access a field's value for potentially multiple instances, use instead. - FieldRefAccess<T, F>(instance, fieldInfo) is functionally equivalent to FieldRefAccess<T, F>(fieldInfo)(instance). - - - For backwards compatibility, there is no class constraint on . - Instead, the non-value-type check is done at runtime within the method. - - - - - - A readable/assignable reference delegate to an instance field of a struct - The struct that defines the instance field - - The type of the field; or if the field's type is a reference type (a class or interface, NOT a struct or other value type), - a type that is assignable from that type; or if the field's type is an enum type, - either that type or the underlying integral type of that enum type - - A reference to the runtime instance to access the field - A readable/assignable reference to the field - - - - Creates a field reference delegate for an instance field of a struct - The struct that defines the instance field - - The type of the field; or if the field's type is a reference type (a class or interface, NOT a struct or other value type), - a type that is assignable from that type; or if the field's type is an enum type, - either that type or the underlying integral type of that enum type - - The name of the field - A readable/assignable delegate - - - - Creates an instance field reference for a specific instance of a struct - The struct that defines the instance field - - The type of the field; or if the field's type is a reference type (a class or interface, NOT a struct or other value type), - a type that is assignable from that type; or if the field's type is an enum type, - either that type or the underlying integral type of that enum type - - The instance - The name of the field - A readable/assignable reference to the field - - - This method is meant for one-off access to a field's value for a single instance. - If you need to access a field's value for potentially multiple instances, use instead. - StructFieldRefAccess<T, F>(ref instance, fieldName) is functionally equivalent to StructFieldRefAccess<T, F>(fieldName)(ref instance). - - - - - - Creates a field reference delegate for an instance field of a struct - The struct that defines the instance field - - The type of the field; or if the field's type is a reference type (a class or interface, NOT a struct or other value type), - a type that is assignable from that type; or if the field's type is an enum type, - either that type or the underlying integral type of that enum type - - The field - A readable/assignable delegate - - - This method is meant for cases where the field has already been obtained, avoiding the field searching cost in - e.g. . - - - - - - Creates a field reference for an instance field of a struct - The struct that defines the instance field - - The type of the field; or if the field's type is a reference type (a class or interface, NOT a struct or other value type), - a type that is assignable from that type; or if the field's type is an enum type, - either that type or the underlying integral type of that enum type - - The instance - The field - A readable/assignable reference to the field - - - This method is meant for one-off access to a field's value for a single instance and where the field has already been obtained. - If you need to access a field's value for potentially multiple instances, use instead. - StructFieldRefAccess<T, F>(ref instance, fieldInfo) is functionally equivalent to StructFieldRefAccess<T, F>(fieldInfo)(ref instance). - - - - - - A readable/assignable reference delegate to a static field - - The type of the field; or if the field's type is a reference type (a class or interface, NOT a struct or other value type), - a type that is assignable from that type; or if the field's type is an enum type, - either that type or the underlying integral type of that enum type - - A readable/assignable reference to the field - - - - Creates a static field reference - The type (can be class or struct) the field is defined in - - The type of the field; or if the field's type is a reference type (a class or interface, NOT a struct or other value type), - a type that is assignable from that type; or if the field's type is an enum type, - either that type or the underlying integral type of that enum type - - The name of the field - A readable/assignable reference to the field - - - - Creates a static field reference - - The type of the field; or if the field's type is a reference type (a class or interface, NOT a struct or other value type), - a type that is assignable from that type; or if the field's type is an enum type, - either that type or the underlying integral type of that enum type - - The type (can be class or struct) the field is defined in - The name of the field - A readable/assignable reference to the field - - - - Creates a static field reference - The type of the field - The member in the form TypeFullName:MemberName, where TypeFullName matches the form recognized by Type.GetType like Some.Namespace.Type. - A readable/assignable reference to the field - - - - Creates a static field reference - An arbitrary type (by convention, the type the field is defined in) - - The type of the field; or if the field's type is a reference type (a class or interface, NOT a struct or other value type), - a type that is assignable from that type; or if the field's type is an enum type, - either that type or the underlying integral type of that enum type - - The field - A readable/assignable reference to the field - - The type parameter is only used in exception messaging and to distinguish between this method overload - and the overload (which returns a rather than a reference). - - - - - Creates a static field reference delegate - - The type of the field; or if the field's type is a reference type (a class or interface, NOT a struct or other value type), - a type that is assignable from that type; or if the field's type is an enum type, - either that type or the underlying integral type of that enum type - - The field - A readable/assignable delegate - - - - Creates a delegate to a given method - The delegate Type - The method to create a delegate from. - - Only applies for instance methods. If null (default), returned delegate is an open (a.k.a. unbound) instance delegate - where an instance is supplied as the first argument to the delegate invocation; else, delegate is a closed (a.k.a. bound) - instance delegate where the delegate invocation always applies to the given . - - - Only applies for instance methods. If true (default) and is virtual, invocation of the delegate - calls the instance method virtually (the instance type's most-derived/overriden implementation of the method is called); - else, invocation of the delegate calls the exact specified (this is useful for calling base class methods) - Note: if false and is an interface method, an ArgumentException is thrown. - - A delegate of given to given - - - Delegate invocation is more performant and more convenient to use than - at a one-time setup cost. - - - Works for both type of static and instance methods, both open and closed (a.k.a. unbound and bound) instance methods, - and both class and struct methods. - - - - - - Creates a delegate to a given method - The delegate Type - The method in the form TypeFullName:MemberName, where TypeFullName matches the form recognized by Type.GetType like Some.Namespace.Type. - - Only applies for instance methods. If null (default), returned delegate is an open (a.k.a. unbound) instance delegate - where an instance is supplied as the first argument to the delegate invocation; else, delegate is a closed (a.k.a. bound) - instance delegate where the delegate invocation always applies to the given . - - - Only applies for instance methods. If true (default) and is virtual, invocation of the delegate - calls the instance method virtually (the instance type's most-derived/overriden implementation of the method is called); - else, invocation of the delegate calls the exact specified (this is useful for calling base class methods) - Note: if false and is an interface method, an ArgumentException is thrown. - - A delegate of given to given - - - Delegate invocation is more performant and more convenient to use than - at a one-time setup cost. - - - Works for both type of static and instance methods, both open and closed (a.k.a. unbound and bound) instance methods, - and both class and struct methods. - - - - - - Creates a delegate for a given delegate definition, attributed with [] - The delegate Type, attributed with [] - - Only applies for instance methods. If null (default), returned delegate is an open (a.k.a. unbound) instance delegate - where an instance is supplied as the first argument to the delegate invocation; else, delegate is a closed (a.k.a. bound) - instance delegate where the delegate invocation always applies to the given . - - A delegate of given to the method specified via [] - attributes on - - This calls with the method and virtualCall arguments - determined from the [] attributes on , - and the given (for closed instance delegates). - - - - - Returns who called the current method - The calling method/constructor (excluding the caller) - - - - Rethrows an exception while preserving its stack trace (throw statement typically clobbers existing stack traces) - The exception to rethrow - - - - True if the current runtime is based on Mono, false otherwise (.NET) - - - - True if the current runtime is .NET Framework, false otherwise (.NET Core or Mono, although latter isn't guaranteed) - - - - True if the current runtime is .NET Core, false otherwise (Mono or .NET Framework) - - - - Throws a missing member runtime exception - The type that is involved - A list of names - - - - Gets default value for a specific type - The class/type - The default value - - - - Creates an (possibly uninitialized) instance of a given type - The class/type - The new instance - - - - Creates an (possibly uninitialized) instance of a given type - The class/type - The new instance - - - - - A cache for the or similar Add methods for different types. - - - - Makes a deep copy of any object - The type of the instance that should be created; for legacy reasons, this must be a class or interface - The original object - A copy of the original object but of type T - - - - Makes a deep copy of any object - The type of the instance that should be created - The original object - [out] The copy of the original object - Optional value transformation function (taking a field name and src/dst instances) - The optional path root to start with - - - - Makes a deep copy of any object - The original object - The type of the instance that should be created - Optional value transformation function (taking a field name and src/dst instances) - The optional path root to start with - The copy of the original object - - - - Tests if a type is a struct - The type - True if the type is a struct - - - - Tests if a type is a class - The type - True if the type is a class - - - - Tests if a type is a value type - The type - True if the type is a value type - - - - Tests if a type is an integer type - The type - True if the type represents some integer - - - - Tests if a type is a floating point type - The type - True if the type represents some floating point - - - - Tests if a type is a numerical type - The type - True if the type represents some number - - - - Tests if a type is void - The type - True if the type is void - - - - Test whether an instance is of a nullable type - Type of instance - An instance to test - True if instance is of nullable type, false if not - - - - Tests whether a type or member is static, as defined in C# - The type or member - True if the type or member is static - - - - Tests whether a type is static, as defined in C# - The type - True if the type is static - - - - Tests whether a property is static, as defined in C# - The property - True if the property is static - - - - Tests whether an event is static, as defined in C# - The event - True if the event is static - - - - Calculates a combined hash code for an enumeration of objects - The objects - The hash code - - - - A CodeInstruction match - - - The name of the match - - - The matched opcodes - - - The matched operands - - - The jumps from the match - - - The jumps to the match - - - The match predicate - - - Creates a code match - The optional opcode - The optional operand - The optional name - - - - Creates a code match that calls a method - The lambda expression using the method - The optional name - - - - Creates a code match that calls a method - The lambda expression using the method - The optional name - - - - Creates a code match - The CodeInstruction - An optional name - - - - Creates a code match - The predicate - An optional name - - - - Returns a string that represents the match - A string representation - - - - A CodeInstruction matcher - - - The current position - The index or -1 if out of bounds - - - - Gets the number of code instructions in this matcher - The count - - - - Checks whether the position of this CodeMatcher is within bounds - True if this CodeMatcher is valid - - - - Checks whether the position of this CodeMatcher is outside its bounds - True if this CodeMatcher is invalid - - - - Gets the remaining code instructions - The remaining count - - - - Gets the opcode at the current position - The opcode - - - - Gets the operand at the current position - The operand - - - - Gets the labels at the current position - The labels - - - - Gets the exception blocks at the current position - The blocks - - - - Creates an empty code matcher - - - Creates a code matcher from an enumeration of instructions - The instructions (transpiler argument) - An optional IL generator - - - - Makes a clone of this instruction matcher - A copy of this matcher - - - - Gets instructions at the current position - The instruction - - - - Gets instructions at the current position with offset - The offset - The instruction - - - - Gets all instructions - A list of instructions - - - - Gets all instructions as an enumeration - A list of instructions - - - - Gets some instructions counting from current position - Number of instructions - A list of instructions - - - - Gets all instructions within a range - The start index - The end index - A list of instructions - - - - Gets all instructions within a range (relative to current position) - The start offset - The end offset - A list of instructions - - - - Gets a list of all distinct labels - The instructions (transpiler argument) - A list of Labels - - - - Reports a failure - The method involved - The logger - True if current position is invalid and error was logged - - - - Throw an InvalidOperationException if current state is invalid (position out of bounds / last match failed) - Explanation of where/why the exception was thrown that will be added to the exception message - The same code matcher - - - - Throw an InvalidOperationException if current state is invalid (position out of bounds / last match failed), - or if the matches do not match at current position - Explanation of where/why the exception was thrown that will be added to the exception message - Some code matches - The same code matcher - - - - Throw an InvalidOperationException if current state is invalid (position out of bounds / last match failed), - or if the matches do not match at any point between current position and the end - Explanation of where/why the exception was thrown that will be added to the exception message - Some code matches - The same code matcher - - - - Throw an InvalidOperationException if current state is invalid (position out of bounds / last match failed), - or if the matches do not match at any point between current position and the start - Explanation of where/why the exception was thrown that will be added to the exception message - Some code matches - The same code matcher - - - - Throw an InvalidOperationException if current state is invalid (position out of bounds / last match failed), - or if the check function returns false - Explanation of where/why the exception was thrown that will be added to the exception message - Function that checks validity of current state. If it returns false, an exception is thrown - The same code matcher - - - - Sets an instruction at current position - The instruction to set - The same code matcher - - - - Sets instruction at current position and advances - The instruction - The same code matcher - - - - Sets opcode and operand at current position - The opcode - The operand - The same code matcher - - - - Sets opcode and operand at current position and advances - The opcode - The operand - The same code matcher - - - - Sets opcode at current position and advances - The opcode - The same code matcher - - - - Sets operand at current position and advances - The operand - The same code matcher - - - - Creates a label at current position - [out] The label - The same code matcher - - - - Creates a label at a position - The position - [out] The new label - The same code matcher - - - - Creates a label at a position - The offset - [out] The new label - The same code matcher - - - - Adds an enumeration of labels to current position - The labels - The same code matcher - - - - Adds an enumeration of labels at a position - The position - The labels - The same code matcher - - - - Sets jump to - Branch instruction - Destination for the jump - [out] The created label - The same code matcher - - - - Inserts some instructions - The instructions - The same code matcher - - - - Inserts an enumeration of instructions - The instructions - The same code matcher - - - - Inserts a branch - The branch opcode - Branch destination - The same code matcher - - - - Inserts some instructions and advances the position - The instructions - The same code matcher - - - - Inserts an enumeration of instructions and advances the position - The instructions - The same code matcher - - - - Inserts a branch and advances the position - The branch opcode - Branch destination - The same code matcher - - - - Removes current instruction - The same code matcher - - - - Removes some instruction from current position by count - Number of instructions - The same code matcher - - - - Removes the instructions in a range - The start - The end - The same code matcher - - - - Removes the instructions in a offset range - The start offset - The end offset - The same code matcher - - - - Advances the current position - The offset - The same code matcher - - - - Moves the current position to the start - The same code matcher - - - - Moves the current position to the end - The same code matcher - - - - Searches forward with a predicate and advances position - The predicate - The same code matcher - - - - Searches backwards with a predicate and reverses position - The predicate - The same code matcher - - - - Matches forward and advances position to beginning of matching sequence - Some code matches - The same code matcher - - - - Matches forward and advances position to ending of matching sequence - Some code matches - The same code matcher - - - - Matches backwards and reverses position to beginning of matching sequence - Some code matches - The same code matcher - - - - Matches backwards and reverses position to ending of matching sequence - Some code matches - The same code matcher - - - - Repeats a match action until boundaries are met - The match action - An optional action that is executed when no match is found - The same code matcher - - - - Gets a match by its name - The match name - An instruction - - - - General extensions for common cases - - - - Joins an enumeration with a value converter and a delimiter to a string - The inner type of the enumeration - The enumeration - An optional value converter (from T to string) - An optional delimiter - The values joined into a string - - - - Converts an array of types (for example methods arguments) into a human readable form - The array of types - A human readable description including brackets - - - - A full description of a type - The type - A human readable description - - - - A a full description of a method or a constructor without assembly details but with generics - The method/constructor - A human readable description - - - - A helper converting parameter infos to types - The array of parameter infos - An array of types - - - - A helper to access a value via key from a dictionary - The key type - The value type - The dictionary - The key - The value for the key or the default value (of T) if that key does not exist - - - - A helper to access a value via key from a dictionary with extra casting - The value type - The dictionary - The key - The value for the key or the default value (of T) if that key does not exist or cannot be cast to T - - - - Escapes Unicode and ASCII non printable characters - The string to convert - The string to convert - A string literal surrounded by - - - - Extensions for - - - - Returns if an is initialized and valid - The - - - - Shortcut for testing whether the operand is equal to a non-null value - The - The value - True if the operand has the same type and is equal to the value - - - - Shortcut for testing whether the operand is equal to a non-null value - The - The value - True if the operand is equal to the value - This is an optimized version of for - - - - Shortcut for code.opcode == opcode && code.OperandIs(operand) - The - The - The operand value - True if the opcode is equal to the given opcode and the operand has the same type and is equal to the given operand - - - - Shortcut for code.opcode == opcode && code.OperandIs(operand) - The - The - The operand value - True if the opcode is equal to the given opcode and the operand is equal to the given operand - This is an optimized version of for - - - - Tests for any form of Ldarg* - The - The (optional) index - True if it matches one of the variations - - - - Tests for Ldarga/Ldarga_S - The - The (optional) index - True if it matches one of the variations - - - - Tests for Starg/Starg_S - The - The (optional) index - True if it matches one of the variations - - - - Tests for any form of Ldloc* - The - The optional local variable - True if it matches one of the variations - - - - Tests for any form of Stloc* - The - The optional local variable - True if it matches one of the variations - - - - Tests if the code instruction branches - The - The label if the instruction is a branch operation or if not - True if the instruction branches - - - - Tests if the code instruction calls the method/constructor - The - The method - True if the instruction calls the method or constructor - - - - Tests if the code instruction loads a constant - The - True if the instruction loads a constant - - - - Tests if the code instruction loads an integer constant - The - The integer constant - True if the instruction loads the constant - - - - Tests if the code instruction loads a floating point constant - The - The floating point constant - True if the instruction loads the constant - - - - Tests if the code instruction loads an enum constant - The - The enum - True if the instruction loads the constant - - - - Tests if the code instruction loads a string constant - The - The string - True if the instruction loads the constant - - - - Tests if the code instruction loads a field - The - The field - Set to true if the address of the field is loaded - True if the instruction loads the field - - - - Tests if the code instruction stores a field - The - The field - True if the instruction stores this field - - - - Adds labels to the code instruction and return it - The - One or several to add - The same code instruction - - - Adds labels to the code instruction and return it - The - An enumeration of - The same code instruction - - - Extracts all labels from the code instruction and returns them - The - A list of - - - Moves all labels from the code instruction to another one - The to move the labels from - The other to move the labels to - The code instruction labels were moved from (now empty) - - - Moves all labels from another code instruction to the current one - The to move the labels to - The other to move the labels from - The code instruction that received the labels - - - Adds ExceptionBlocks to the code instruction and return it - The - One or several to add - The same code instruction - - - Adds ExceptionBlocks to the code instruction and return it - The - An enumeration of - The same code instruction - - - Extracts all ExceptionBlocks from the code instruction and returns them - The - A list of - - - Moves all ExceptionBlocks from the code instruction to another one - The to move the ExceptionBlocks from - The other to move the ExceptionBlocks to - The code instruction blocks were moved from (now empty) - - - Moves all ExceptionBlocks from another code instruction to the current one - The to move the ExceptionBlocks to - The other to move the ExceptionBlocks from - The code instruction that received the blocks - - - General extensions for collections - - - - A simple way to execute code for every element in a collection - The inner type of the collection - The collection - The action to execute - - - - A simple way to execute code for elements in a collection matching a condition - The inner type of the collection - The collection - The predicate - The action to execute - - - - A helper to add an item to a collection - The inner type of the collection - The collection - The item to add - The collection containing the item - - - - A helper to add an item to an array - The inner type of the collection - The array - The item to add - The array containing the item - - - - A helper to add items to an array - The inner type of the collection - The array - The items to add - The array containing the items - - - - General extensions for collections - - - - Tests a class member if it has an IL method body (external methods for example don't have a body) - The member to test - Returns true if the member has an IL body or false if not - - - A file log for debugging - - - - Set this to make Harmony write its log content to this stream - - - - Full pathname of the log file, defaults to a file called harmony.log.txt on your Desktop - - - - The indent character. The default is tab - - - - The current indent level - - - - Changes the indentation level - The value to add to the indentation level - - - - Log a string in a buffered way. Use this method only if you are sure that FlushBuffer will be called - or else logging information is incomplete in case of a crash - The string to log - - - - Logs a list of string in a buffered way. Use this method only if you are sure that FlushBuffer will be called - or else logging information is incomplete in case of a crash - A list of strings to log (they will not be re-indented) - - - - Returns the log buffer and optionally empties it - True to empty the buffer - The buffer. - - - - Replaces the buffer with new lines - The lines to store - - - - Flushes the log buffer to disk (use in combination with LogBuffered) - - - - Log a string directly to disk. Slower method that prevents missing information in case of a crash - The string to log. - - - - Log a string directly to disk if Harmony.DEBUG is true. Slower method that prevents missing information in case of a crash - The string to log. - - - - Resets and deletes the log - - - - Logs some bytes as hex values - The pointer to some memory - The length of bytes to log - - - - A helper class to retrieve reflection info for non-private methods - - - - Given a lambda expression that calls a method, returns the method info - The lambda expression using the method - The method in the lambda expression - - - - Given a lambda expression that calls a method, returns the method info - The generic type - The lambda expression using the method - The method in the lambda expression - - - - Given a lambda expression that calls a method, returns the method info - The generic type - The generic result type - The lambda expression using the method - The method in the lambda expression - - - - Given a lambda expression that calls a method, returns the method info - The lambda expression using the method - The method in the lambda expression - - - - A reflection helper to read and write private elements - The result type defined by GetValue() - - - - Creates a traverse instance from an existing instance - The existing instance - - - - Gets/Sets the current value - The value to read or write - - - - A reflection helper to read and write private elements - - - - Creates a new traverse instance from a class/type - The class/type - A instance - - - - Creates a new traverse instance from a class T - The class - A instance - - - - Creates a new traverse instance from an instance - The object - A instance - - - - Creates a new traverse instance from a named type - The type name, for format see - A instance - - - - Creates a new and empty traverse instance - - - - Creates a new traverse instance from a class/type - The class/type - - - - Creates a new traverse instance from an instance - The object - - - - Gets the current value - The value - - - - Gets the current value - The type of the value - The value - - - - Invokes the current method with arguments and returns the result - The method arguments - The value returned by the method - - - - Invokes the current method with arguments and returns the result - The type of the value - The method arguments - The value returned by the method - - - - Sets a value of the current field or property - The value - The same traverse instance - - - - Gets the type of the current field or property - The type - - - - Moves the current traverse instance to a inner type - The type name - A traverse instance - - - - Moves the current traverse instance to a field - The type name - A traverse instance - - - - Moves the current traverse instance to a field - The type of the field - The type name - A traverse instance - - - - Gets all fields of the current type - A list of field names - - - - Moves the current traverse instance to a property - The type name - Optional property index - A traverse instance - - - - Moves the current traverse instance to a field - The type of the property - The type name - Optional property index - A traverse instance - - - - Gets all properties of the current type - A list of property names - - - - Moves the current traverse instance to a method - The name of the method - The arguments defining the argument types of the method overload - A traverse instance - - - - Moves the current traverse instance to a method - The name of the method - The argument types of the method - The arguments for the method - A traverse instance - - - - Gets all methods of the current type - A list of method names - - - - Checks if the current traverse instance is for a field - True if its a field - - - - Checks if the current traverse instance is for a property - True if its a property - - - - Checks if the current traverse instance is for a method - True if its a method - - - - Checks if the current traverse instance is for a type - True if its a type - - - - Iterates over all fields of the current type and executes a traverse action - Original object - The action receiving a instance for each field - - - - Iterates over all fields of the current type and executes a traverse action - Original object - Target object - The action receiving a pair of instances for each field pair - - - - Iterates over all fields of the current type and executes a traverse action - Original object - Target object - The action receiving a dot path representing the field pair and the instances - - - - Iterates over all properties of the current type and executes a traverse action - Original object - The action receiving a instance for each property - - - - Iterates over all properties of the current type and executes a traverse action - Original object - Target object - The action receiving a pair of instances for each property pair - - - - Iterates over all properties of the current type and executes a traverse action - Original object - Target object - The action receiving a dot path representing the property pair and the instances - - - - A default field action that copies fields to fields - - - - Returns a string that represents the current traverse - A string representation - - - - diff --git a/build/common.targets b/build/common.targets index f7f57593..4022e5e5 100644 --- a/build/common.targets +++ b/build/common.targets @@ -20,7 +20,7 @@ repo. It imports the other MSBuild files as needed. $(DefineConstants);SMAPI_FOR_WINDOWS - true + false None @@ -50,10 +50,10 @@ repo. It imports the other MSBuild files as needed. - - - - + + + + diff --git a/build/define-constant.targets b/build/define-constant.targets index 3d3ae38f..9bf5fc32 100644 --- a/build/define-constant.targets +++ b/build/define-constant.targets @@ -8,11 +8,6 @@ False - $(DefineConstants);HARMONY_1 - $(DefineConstants);SMAPI_FOR_MOBILE;ANDROID_TARGET_GOOGLE;ANDROID_TARGET_MOBILE_LEGACY;HARMONY_1 - $(DefineConstants);SMAPI_FOR_MOBILE;ANDROID_TARGET_GOOGLE;ANDROID_TARGET_GOOGLE_145;HARMONY_1 - $(DefineConstants);SMAPI_FOR_MOBILE;ANDROID_TARGET_GOOGLE;ANDROID_TARGET_GOOGLE_MONOANDROID10;MonoAndroid10;HARMONY_1 - $(DefineConstants);SMAPI_FOR_MOBILE;ANDROID_TARGET_AMAZON;HARMONY_1 - $(DefineConstants);SMAPI_FOR_MOBILE;ANDROID_TARGET_SAMSUNG;HARMONY_1 + $(DefineConstants);SMAPI_FOR_MOBILE;ANDROID_TARGET_GOOGLE;MonoAndroid10 diff --git a/src/Loader/Loader.csproj b/src/Loader/Loader.csproj index 47e38839..b7f498d2 100644 --- a/src/Loader/Loader.csproj +++ b/src/Loader/Loader.csproj @@ -17,7 +17,7 @@ Resource Off false - v10.0 + v12.0 Properties\AndroidManifest.xml Resources Assets diff --git a/src/SMAPI.Internal/ConsoleWriting/ColorfulConsoleWriter.cs b/src/SMAPI.Internal/ConsoleWriting/ColorfulConsoleWriter.cs index 78db0d65..7c94ae16 100644 --- a/src/SMAPI.Internal/ConsoleWriting/ColorfulConsoleWriter.cs +++ b/src/SMAPI.Internal/ConsoleWriting/ColorfulConsoleWriter.cs @@ -15,7 +15,7 @@ namespace StardewModdingAPI.Internal.ConsoleWriting private readonly IDictionary? Colors; /// Whether the current console supports color formatting. - [MemberNotNullWhen(true, nameof(ColorfulConsoleWriter.Colors))] + // [MemberNotNullWhen(true, nameof(ColorfulConsoleWriter.Colors))] private bool SupportsColor { get; } diff --git a/src/SMAPI.Mods.VirtualKeyboard/SMAPI.Mods.VirtualKeyboard.csproj b/src/SMAPI.Mods.VirtualKeyboard/SMAPI.Mods.VirtualKeyboard.csproj index 04de4130..47863bce 100644 --- a/src/SMAPI.Mods.VirtualKeyboard/SMAPI.Mods.VirtualKeyboard.csproj +++ b/src/SMAPI.Mods.VirtualKeyboard/SMAPI.Mods.VirtualKeyboard.csproj @@ -9,7 +9,7 @@ Properties StardewModdingAPI.Mods.VirtualKeyboard VirtualKeyboard - v4.5 + v4.8 512 true diff --git a/src/SMAPI.Toolkit.CoreInterfaces/SMAPI.Toolkit.CoreInterfaces.csproj b/src/SMAPI.Toolkit.CoreInterfaces/SMAPI.Toolkit.CoreInterfaces.csproj index 4c92b4db..fd920295 100644 --- a/src/SMAPI.Toolkit.CoreInterfaces/SMAPI.Toolkit.CoreInterfaces.csproj +++ b/src/SMAPI.Toolkit.CoreInterfaces/SMAPI.Toolkit.CoreInterfaces.csproj @@ -3,8 +3,9 @@ StardewModdingAPI Provides toolkit interfaces which are available to SMAPI mods. net5.0; netstandard2.0 + latest true - + diff --git a/src/SMAPI.Toolkit/Framework/LowLevelEnvironmentUtility.cs b/src/SMAPI.Toolkit/Framework/LowLevelEnvironmentUtility.cs index f464f4bb..03f6bfe7 100644 --- a/src/SMAPI.Toolkit/Framework/LowLevelEnvironmentUtility.cs +++ b/src/SMAPI.Toolkit/Framework/LowLevelEnvironmentUtility.cs @@ -3,9 +3,6 @@ using System.Diagnostics; using System.Diagnostics.CodeAnalysis; using System.Linq; using System.Reflection; -#if SMAPI_FOR_WINDOWS -using System.Management; -#endif using System.Runtime.InteropServices; using StardewModdingAPI.Toolkit.Utilities; diff --git a/src/SMAPI.Toolkit/SMAPI.Toolkit.csproj b/src/SMAPI.Toolkit/SMAPI.Toolkit.csproj index 033009c7..94d7fcbc 100644 --- a/src/SMAPI.Toolkit/SMAPI.Toolkit.csproj +++ b/src/SMAPI.Toolkit/SMAPI.Toolkit.csproj @@ -5,12 +5,14 @@ A library which encapsulates mod-handling logic for mod managers and tools. Not intended for use by mods. net5.0; netstandard2.0 true + latest - + + diff --git a/src/SMAPI.sln b/src/SMAPI.sln index d3f0ff4a..042b1ae1 100644 --- a/src/SMAPI.sln +++ b/src/SMAPI.sln @@ -27,8 +27,8 @@ EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "build", "build", "{09CF91E5-5BAB-4650-A200-E5EA9A633046}" ProjectSection(SolutionItems) = preProject ..\build\common.targets = ..\build\common.targets - ..\build\deploy-local-smapi.targets = ..\build\deploy-local-smapi.targets ..\build\define-constant.targets = ..\build\define-constant.targets + ..\build\deploy-local-smapi.targets = ..\build\deploy-local-smapi.targets ..\build\find-game-folder.targets = ..\build\find-game-folder.targets EndProjectSection EndProject @@ -59,14 +59,11 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SMAPI.ModBuildConfig.Analyz EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SMAPI.Tests", "SMAPI.Tests\SMAPI.Tests.csproj", "{AA95884B-7097-476E-92C8-D0500DE9D6D1}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SMAPI", "SMAPI\SMAPI.csproj", "{EBD13EAB-E70B-4D9F-92C2-C34A21E1FA32}" -EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SMAPI.Installer", "SMAPI.Installer\SMAPI.Installer.csproj", "{0A9BB24F-15FF-4C26-B1A2-81F7AE316518}" ProjectSection(ProjectDependencies) = postProject {0634EA4C-3B8F-42DB-AEA6-CA9E4EF6E92F} = {0634EA4C-3B8F-42DB-AEA6-CA9E4EF6E92F} {491E775B-EAD0-44D4-B6CA-F1FC3E316D33} = {491E775B-EAD0-44D4-B6CA-F1FC3E316D33} {CD53AD6F-97F4-4872-A212-50C2A0FD3601} = {CD53AD6F-97F4-4872-A212-50C2A0FD3601} - {EBD13EAB-E70B-4D9F-92C2-C34A21E1FA32} = {EBD13EAB-E70B-4D9F-92C2-C34A21E1FA32} EndProjectSection EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SMAPI.ModBuildConfig", "SMAPI.ModBuildConfig\SMAPI.ModBuildConfig.csproj", "{1B3821E6-D030-402C-B3A1-7CA45C2800EA}" @@ -113,17 +110,9 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SMAPI.Tests.ModApiProvider" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SMAPI.Tests.ModApiConsumer", "SMAPI.Tests.ModApiConsumer\SMAPI.Tests.ModApiConsumer.csproj", "{2A4DF030-E8B1-4BBD-AA93-D4DE68CB9D85}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SMAPI", "SMAPI\SMAPI.csproj", "{EBD13EAB-E70B-4D9F-92C2-C34A21E1FA32}" +EndProject Global - GlobalSection(SharedMSBuildProjectFiles) = preSolution - SMAPI.Internal\SMAPI.Internal.projitems*{0634ea4c-3b8f-42db-aea6-ca9e4ef6e92f}*SharedItemsImports = 5 - SMAPI.Internal\SMAPI.Internal.projitems*{0a9bb24f-15ff-4c26-b1a2-81f7ae316518}*SharedItemsImports = 5 - SMAPI.Internal.Patching\SMAPI.Internal.Patching.projitems*{6c16e948-3e5c-47a7-bf4b-07a7469a87a5}*SharedItemsImports = 13 - SMAPI.Internal\SMAPI.Internal.projitems*{80efd92f-728f-41e0-8a5b-9f6f49a91899}*SharedItemsImports = 5 - SMAPI.Internal\SMAPI.Internal.projitems*{85208f8d-6fd1-4531-be05-7142490f59fe}*SharedItemsImports = 13 - SMAPI.Internal\SMAPI.Internal.projitems*{cd53ad6f-97f4-4872-a212-50c2a0fd3601}*SharedItemsImports = 5 - SMAPI.Internal\SMAPI.Internal.projitems*{ebd13eab-e70b-4d9f-92c2-c34a21e1fa32}*SharedItemsImports = 5 - SMAPI.Internal.Patching\SMAPI.Internal.Patching.projitems*{e6da2198-7686-4f1d-b312-4a4dc70884c0}*SharedItemsImports = 5 - EndGlobalSection GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU Release|Any CPU = Release|Any CPU @@ -134,15 +123,9 @@ Global {680B2641-81EA-467C-86A5-0E81CDC57ED0}.Release|Any CPU.ActiveCfg = Release|Any CPU {680B2641-81EA-467C-86A5-0E81CDC57ED0}.Release|Any CPU.Build.0 = Release|Any CPU {AA95884B-7097-476E-92C8-D0500DE9D6D1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {AA95884B-7097-476E-92C8-D0500DE9D6D1}.Debug|Any CPU.Build.0 = Debug|Any CPU {AA95884B-7097-476E-92C8-D0500DE9D6D1}.Release|Any CPU.ActiveCfg = Release|Any CPU {AA95884B-7097-476E-92C8-D0500DE9D6D1}.Release|Any CPU.Build.0 = Release|Any CPU - {EBD13EAB-E70B-4D9F-92C2-C34A21E1FA32}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {EBD13EAB-E70B-4D9F-92C2-C34A21E1FA32}.Debug|Any CPU.Build.0 = Debug|Any CPU - {EBD13EAB-E70B-4D9F-92C2-C34A21E1FA32}.Release|Any CPU.ActiveCfg = Release|Any CPU - {EBD13EAB-E70B-4D9F-92C2-C34A21E1FA32}.Release|Any CPU.Build.0 = Release|Any CPU {0A9BB24F-15FF-4C26-B1A2-81F7AE316518}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {0A9BB24F-15FF-4C26-B1A2-81F7AE316518}.Debug|Any CPU.Build.0 = Debug|Any CPU {0A9BB24F-15FF-4C26-B1A2-81F7AE316518}.Release|Any CPU.ActiveCfg = Release|Any CPU {0A9BB24F-15FF-4C26-B1A2-81F7AE316518}.Release|Any CPU.Build.0 = Release|Any CPU {1B3821E6-D030-402C-B3A1-7CA45C2800EA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU @@ -174,7 +157,6 @@ Global {ED8E41FA-DDFA-4A77-932E-9853D279A129}.Release|Any CPU.ActiveCfg = Release|Any CPU {ED8E41FA-DDFA-4A77-932E-9853D279A129}.Release|Any CPU.Build.0 = Release|Any CPU {80EFD92F-728F-41E0-8A5B-9F6F49A91899}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {80EFD92F-728F-41E0-8A5B-9F6F49A91899}.Debug|Any CPU.Build.0 = Debug|Any CPU {80EFD92F-728F-41E0-8A5B-9F6F49A91899}.Release|Any CPU.ActiveCfg = Release|Any CPU {80EFD92F-728F-41E0-8A5B-9F6F49A91899}.Release|Any CPU.Build.0 = Release|Any CPU {29CCE9C9-6811-415D-A681-A6D47073924D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU @@ -193,6 +175,10 @@ Global {2A4DF030-E8B1-4BBD-AA93-D4DE68CB9D85}.Debug|Any CPU.Build.0 = Debug|Any CPU {2A4DF030-E8B1-4BBD-AA93-D4DE68CB9D85}.Release|Any CPU.ActiveCfg = Release|Any CPU {2A4DF030-E8B1-4BBD-AA93-D4DE68CB9D85}.Release|Any CPU.Build.0 = Release|Any CPU + {EBD13EAB-E70B-4D9F-92C2-C34A21E1FA32}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {EBD13EAB-E70B-4D9F-92C2-C34A21E1FA32}.Debug|Any CPU.Build.0 = Debug|Any CPU + {EBD13EAB-E70B-4D9F-92C2-C34A21E1FA32}.Release|Any CPU.ActiveCfg = Release|Any CPU + {EBD13EAB-E70B-4D9F-92C2-C34A21E1FA32}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -207,11 +193,11 @@ Global {6C16E948-3E5C-47A7-BF4B-07A7469A87A5} = {82D22ED7-A0A7-4D64-8E92-4B6A5E74ED11} {680B2641-81EA-467C-86A5-0E81CDC57ED0} = {82D22ED7-A0A7-4D64-8E92-4B6A5E74ED11} {AA95884B-7097-476E-92C8-D0500DE9D6D1} = {82D22ED7-A0A7-4D64-8E92-4B6A5E74ED11} - {29CCE9C9-6811-415D-A681-A6D47073924D} = {6BBCA4D1-213F-4843-B910-DF2D66E3D8CF} - {45D7D2FB-6B70-45D1-A595-6E289D6A3468} = {6BBCA4D1-213F-4843-B910-DF2D66E3D8CF} {0634EA4C-3B8F-42DB-AEA6-CA9E4EF6E92F} = {AE9A4D46-E910-4293-8BC4-673F85FFF6A5} {491E775B-EAD0-44D4-B6CA-F1FC3E316D33} = {AE9A4D46-E910-4293-8BC4-673F85FFF6A5} {CD53AD6F-97F4-4872-A212-50C2A0FD3601} = {AE9A4D46-E910-4293-8BC4-673F85FFF6A5} + {29CCE9C9-6811-415D-A681-A6D47073924D} = {6BBCA4D1-213F-4843-B910-DF2D66E3D8CF} + {45D7D2FB-6B70-45D1-A595-6E289D6A3468} = {6BBCA4D1-213F-4843-B910-DF2D66E3D8CF} {4D661178-38FB-43E4-AA5F-9B0406919344} = {09CF91E5-5BAB-4650-A200-E5EA9A633046} {CAA1488E-842B-433D-994D-1D3D0B5DD125} = {09CF91E5-5BAB-4650-A200-E5EA9A633046} {3B5BF14D-F612-4C83-9EF6-E3EBFCD08766} = {4D661178-38FB-43E4-AA5F-9B0406919344} @@ -221,4 +207,10 @@ Global GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {70143042-A862-47A8-A677-7C819DDC90DC} EndGlobalSection + GlobalSection(SharedMSBuildProjectFiles) = preSolution + SMAPI.Internal\SMAPI.Internal.projitems*{0634ea4c-3b8f-42db-aea6-ca9e4ef6e92f}*SharedItemsImports = 5 + SMAPI.Internal.Patching\SMAPI.Internal.Patching.projitems*{6c16e948-3e5c-47a7-bf4b-07a7469a87a5}*SharedItemsImports = 13 + SMAPI.Internal\SMAPI.Internal.projitems*{85208f8d-6fd1-4531-be05-7142490f59fe}*SharedItemsImports = 13 + SMAPI.Internal\SMAPI.Internal.projitems*{cd53ad6f-97f4-4872-a212-50c2a0fd3601}*SharedItemsImports = 5 + EndGlobalSection EndGlobal diff --git a/src/SMAPI/Constants.cs b/src/SMAPI/Constants.cs index 482ba291..1b80003c 100644 --- a/src/SMAPI/Constants.cs +++ b/src/SMAPI/Constants.cs @@ -13,11 +13,7 @@ using StardewModdingAPI.Framework.ModLoading; using StardewModdingAPI.Toolkit.Framework; using StardewModdingAPI.Toolkit.Utilities; using StardewValley; -#if HARMONY_2 using HarmonyLib; -#else -using Harmony; -#endif namespace StardewModdingAPI { /// Contains constants that are accessed before the game itself has been loaded. @@ -44,6 +40,9 @@ namespace StardewModdingAPI public static string StardewValleyBasePath { get; } = Path.Combine(EarlyConstants.StorageBasePath, "StardewValley"); /// The path to the internal folder. public static string ExecutionPath { get; } = Path.Combine(EarlyConstants.StardewValleyBasePath, "smapi-internal"); + + /// The path to the game folder. + public static string GamePath { get; } = ExecutionPath; #else /// The path to the game folder. public static string GamePath { get; } = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location)!; diff --git a/src/SMAPI/Context.cs b/src/SMAPI/Context.cs index c822908e..f27c9310 100644 --- a/src/SMAPI/Context.cs +++ b/src/SMAPI/Context.cs @@ -91,8 +91,11 @@ namespace StardewModdingAPI public static bool HasRemotePlayers => Context.IsMultiplayer && !Game1.hasLocalClientsOnly; /// Whether the current player is the main player. This is always true in single-player, and true when hosting in multiplayer. +#if SMAPI_FOR_MOBILE + public static bool IsMainPlayer => Game1.IsMasterGame && Context.ScreenId == 0;// && TitleMenu.subMenu is not FarmhandMenu; +#else public static bool IsMainPlayer => Game1.IsMasterGame && Context.ScreenId == 0 && TitleMenu.subMenu is not FarmhandMenu; - +#endif /********* ** Public methods diff --git a/src/SMAPI/Events/AssetsInvalidatedEventArgs.cs b/src/SMAPI/Events/AssetsInvalidatedEventArgs.cs index 614cdf49..b23dbbc0 100644 --- a/src/SMAPI/Events/AssetsInvalidatedEventArgs.cs +++ b/src/SMAPI/Events/AssetsInvalidatedEventArgs.cs @@ -11,11 +11,18 @@ namespace StardewModdingAPI.Events ** Accessors *********/ /// The asset names that were invalidated. +#if SMAPI_FOR_MOBILE + public IReadOnlyCollection Names { get; } +#else public IReadOnlySet Names { get; } - +#endif /// The with any locale codes stripped. /// For example, if contains a locale like Data/Bundles.fr-FR, this will have the name without locale like Data/Bundles. If the name has no locale, this field is equivalent. +#if SMAPI_FOR_MOBILE + public IReadOnlyCollection NamesWithoutLocale { get; } +#else public IReadOnlySet NamesWithoutLocale { get; } +#endif /********* diff --git a/src/SMAPI/Framework/ContentManagers/ModContentManager.cs b/src/SMAPI/Framework/ContentManagers/ModContentManager.cs index 19d20d90..6088c7ac 100644 --- a/src/SMAPI/Framework/ContentManagers/ModContentManager.cs +++ b/src/SMAPI/Framework/ContentManagers/ModContentManager.cs @@ -88,8 +88,6 @@ namespace StardewModdingAPI.Framework.ContentManagers #if SMAPI_FOR_MOBILE this.Reflector = reflection; #endif - } - this.TryLocalizeKeys = false; } @@ -140,16 +138,7 @@ namespace StardewModdingAPI.Framework.ContentManagers ".json" => this.LoadDataFile(assetName, file), ".png" => this.LoadImageFile(assetName, file), ".tbin" or ".tmx" => this.LoadMapFile(assetName, file), - ".xnb" => { - asset = this.RawLoad(assetName, useCache: false); - if (asset is Map map) - { - this.NormalizeTilesheetPaths(map); - this.FixCustomTilesheetPaths(map, relativeMapPath: assetName); - } - this.ModedLoad(assetName, language) - // this.LoadXnbFile(assetName) - }, + ".xnb" => this.LoadXnbFile(assetName), _ => this.HandleUnknownFileType(assetName, file) }; } @@ -290,7 +279,11 @@ namespace StardewModdingAPI.Framework.ContentManagers } // convert to XNA pixel format +#if SMAPI_FOR_MOBILE + var pixels = new Color[rawPixels.Length]; +#else var pixels = GC.AllocateUninitializedArray(rawPixels.Length); +#endif for (int i = 0; i < pixels.Length; i++) { SKPMColor pixel = rawPixels[i]; @@ -322,6 +315,16 @@ namespace StardewModdingAPI.Framework.ContentManagers /// The asset name relative to the loader root directory. private T LoadXnbFile(IAssetName assetName) { +// #if SMAPI_FOR_MOBILE +// T asset = this.RawLoad(assetName, useCache: false); +// if (asset is Map map) +// { +// this.NormalizeTilesheetPaths(map); +// this.FixCustomTilesheetPaths(map, relativeMapPath: assetName); +// } +// +// return this.ModedLoad(assetName.Name, language); +// #else if (typeof(IRawTextureData).IsAssignableFrom(typeof(T))) this.ThrowLoadError(assetName, ContentLoadErrorType.Other, $"can't read XNB file as type {typeof(IRawTextureData)}; that type can only be read from a PNG file."); @@ -340,6 +343,7 @@ namespace StardewModdingAPI.Framework.ContentManagers } return asset; +// #endif } /// Handle a request to load a file type that isn't supported by SMAPI. diff --git a/src/SMAPI/Framework/Input/GamePadStateBuilder.cs b/src/SMAPI/Framework/Input/GamePadStateBuilder.cs index 814ad9a8..007bf9c4 100644 --- a/src/SMAPI/Framework/Input/GamePadStateBuilder.cs +++ b/src/SMAPI/Framework/Input/GamePadStateBuilder.cs @@ -41,7 +41,7 @@ namespace StardewModdingAPI.Framework.Input ** Accessors *********/ /// Whether the gamepad is currently connected. - [MemberNotNullWhen(true, nameof(GamePadStateBuilder.ButtonStates))] + // [MemberNotNullWhen(true, nameof(GamePadStateBuilder.ButtonStates))] public bool IsConnected { get; } diff --git a/src/SMAPI/Framework/ModLoading/AssemblyLoader.cs b/src/SMAPI/Framework/ModLoading/AssemblyLoader.cs index f4534dc1..1f529205 100644 --- a/src/SMAPI/Framework/ModLoading/AssemblyLoader.cs +++ b/src/SMAPI/Framework/ModLoading/AssemblyLoader.cs @@ -405,7 +405,7 @@ namespace StardewModdingAPI.Framework.ModLoading } // find or rewrite code - InstructionMetadata instructionMetadata = new InstructionMetadata(); + InstructionMetadata instructionMetadata = new InstructionMetadata(this.Monitor); IInstructionHandler[] handlers = instructionMetadata.GetHandlers(this.ParanoidMode, platformChanged, this.RewriteMods).ToArray(); RecursiveRewriter rewriter = new RecursiveRewriter( module: module, diff --git a/src/SMAPI/Framework/ModLoading/AssemblyParseResult.cs b/src/SMAPI/Framework/ModLoading/AssemblyParseResult.cs index b133f8d6..90ba4253 100644 --- a/src/SMAPI/Framework/ModLoading/AssemblyParseResult.cs +++ b/src/SMAPI/Framework/ModLoading/AssemblyParseResult.cs @@ -21,7 +21,7 @@ namespace StardewModdingAPI.Framework.ModLoading public AssemblyLoadStatus Status; /// Whether the is loaded and ready (i.e. the is not or ). - [MemberNotNullWhen(true, nameof(AssemblyParseResult.Definition))] + // [MemberNotNullWhen(true, nameof(AssemblyParseResult.Definition))] public bool HasDefinition => this.Status == AssemblyLoadStatus.Okay; diff --git a/src/SMAPI/Framework/ModLoading/Finders/FieldFinder.cs b/src/SMAPI/Framework/ModLoading/Finders/FieldFinder.cs index 1aaa6561..2cded71a 100644 --- a/src/SMAPI/Framework/ModLoading/Finders/FieldFinder.cs +++ b/src/SMAPI/Framework/ModLoading/Finders/FieldFinder.cs @@ -73,7 +73,7 @@ namespace StardewModdingAPI.Framework.ModLoading.Finders return fieldRef != null && fieldRef.DeclaringType.FullName == this.FullTypeName - && fieldRef.Name == this.FieldName; + && this.FieldNames.Contains(fieldRef.Name); } } } diff --git a/src/SMAPI/Framework/ModLoading/ModMetadata.cs b/src/SMAPI/Framework/ModLoading/ModMetadata.cs index ac7a6bbd..e7c6e43e 100644 --- a/src/SMAPI/Framework/ModLoading/ModMetadata.cs +++ b/src/SMAPI/Framework/ModLoading/ModMetadata.cs @@ -82,7 +82,7 @@ namespace StardewModdingAPI.Framework.ModLoading public ModEntryModel? UpdateCheckData { get; private set; } /// - [MemberNotNullWhen(true, nameof(ModMetadata.ContentPack))] + // [MemberNotNullWhen(true, nameof(ModMetadata.ContentPack))] [SuppressMessage("ReSharper", "ConditionalAccessQualifierIsNonNullableAccordingToAPIContract", Justification = "The manifest may be null for broken mods while loading.")] public bool IsContentPack => this.Manifest?.ContentPackFor != null; @@ -184,7 +184,7 @@ namespace StardewModdingAPI.Framework.ModLoading } /// - [MemberNotNullWhen(true, nameof(IModInfo.Manifest))] + // [MemberNotNullWhen(true, nameof(IModInfo.Manifest))] public bool HasManifest() { return this.Manifest != null; diff --git a/src/SMAPI/Framework/ModLoading/PlatformAssemblyMap.cs b/src/SMAPI/Framework/ModLoading/PlatformAssemblyMap.cs index 1b82935c..8187d036 100644 --- a/src/SMAPI/Framework/ModLoading/PlatformAssemblyMap.cs +++ b/src/SMAPI/Framework/ModLoading/PlatformAssemblyMap.cs @@ -55,7 +55,7 @@ namespace StardewModdingAPI.Framework.ModLoading this.Targets = targetAssemblies; this.TargetReferences = this.Targets.ToDictionary(assembly => assembly, assembly => AssemblyNameReference.Parse(assembly.FullName)); #if SMAPI_FOR_MOBILE - this.TargetModules = this.Targets.ToDictionary(assembly => assembly, assembly => ModuleDefinition.ReadModule(Path.Combine(Constants.ExecutionPath, assembly.Modules.Single().FullyQualifiedName), new ReaderParameters { InMemory = true })); + this.TargetModules = this.Targets.ToDictionary(assembly => assembly, assembly => ModuleDefinition.ReadModule(Path.Combine(Constants.GamePath, assembly.Modules.Single().FullyQualifiedName), new ReaderParameters { InMemory = true })); #else this.TargetModules = this.Targets.ToDictionary(assembly => assembly, assembly => ModuleDefinition.ReadModule(assembly.Modules.Single().FullyQualifiedName, new ReaderParameters { InMemory = true })); #endif diff --git a/src/SMAPI/Framework/ModLoading/RewriteFacades/DebrisMethods.cs b/src/SMAPI/Framework/ModLoading/RewriteFacades/DebrisMethods.cs deleted file mode 100644 index 9f05a576..00000000 --- a/src/SMAPI/Framework/ModLoading/RewriteFacades/DebrisMethods.cs +++ /dev/null @@ -1,85 +0,0 @@ -#if SMAPI_FOR_MOBILE -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using Microsoft.Xna.Framework; -using StardewValley; - -namespace StardewModdingAPI.Framework.ModLoading.RewriteFacades -{ - public class DebrisMethods : Debris - { - public DebrisMethods(Item item, Vector2 debrisOrigin) - : base() - { - base.init(item, debrisOrigin); - } - - public DebrisMethods(int objectIndex, Vector2 debrisOrigin, Vector2 playerPosition) - : base() - { - base.init(objectIndex, debrisOrigin, playerPosition); - } - - public DebrisMethods(Item item, Vector2 debrisOrigin, Vector2 targetLocation) - : base() - { - base.init(item, debrisOrigin, targetLocation); - } - - public DebrisMethods(string spriteSheet, int numberOfChunks, Vector2 debrisOrigin) - : base() - { - base.init(spriteSheet, numberOfChunks, debrisOrigin); - } - - public DebrisMethods(string spriteSheet, Rectangle sourceRect, int numberOfChunks, Vector2 debrisOrigin) - : base() - { - base.init(spriteSheet, sourceRect, numberOfChunks, debrisOrigin); - } - - public DebrisMethods(int debrisType, int numberOfChunks, Vector2 debrisOrigin, Vector2 playerPosition) - : base() - { - base.init(debrisType, numberOfChunks, debrisOrigin, playerPosition); - } - - public DebrisMethods(int number, Vector2 debrisOrigin, Color messageColor, float scale, Character toHover) - : base() - { - base.init(number, debrisOrigin, messageColor, scale, toHover); - } - - public DebrisMethods(int debrisType, int numberOfChunks, Vector2 debrisOrigin, Vector2 playerPosition, float velocityMultiplayer) - : base() - { - base.init(debrisType, numberOfChunks, debrisOrigin, playerPosition, velocityMultiplayer); - } - - public DebrisMethods(string message, int numberOfChunks, Vector2 debrisOrigin, Color messageColor, float scale, float rotation) - : base() - { - base.init(message, numberOfChunks, debrisOrigin, messageColor, scale, rotation); - } - - public DebrisMethods(string spriteSheet, Rectangle sourceRect, int numberOfChunks, Vector2 debrisOrigin, Vector2 playerPosition, int groundLevel) - : base() - { - base.init(spriteSheet, sourceRect, numberOfChunks, debrisOrigin, playerPosition, groundLevel); - } - - public DebrisMethods(int type, int numberOfChunks, Vector2 debrisOrigin, Vector2 playerPosition, int groundLevel, int color = -1) - : base() - { - base.init(type, numberOfChunks, debrisOrigin, playerPosition, groundLevel, color); - } - public DebrisMethods(string spriteSheet, Rectangle sourceRect, int numberOfChunks, Vector2 debrisOrigin, Vector2 playerPosition, int groundLevel, int sizeOfSourceRectSquares) - : base() - { - base.init(spriteSheet, sourceRect, numberOfChunks, debrisOrigin, playerPosition, groundLevel, sizeOfSourceRectSquares); - } - } -} -#endif diff --git a/src/SMAPI/Framework/ModLoading/RewriteFacades/Game1Methods.cs b/src/SMAPI/Framework/ModLoading/RewriteFacades/Game1Methods.cs index cbc2dbc8..3954ff1c 100644 --- a/src/SMAPI/Framework/ModLoading/RewriteFacades/Game1Methods.cs +++ b/src/SMAPI/Framework/ModLoading/RewriteFacades/Game1Methods.cs @@ -11,6 +11,7 @@ namespace StardewModdingAPI.Framework.ModLoading.RewriteFacades { public class Game1Methods : Game1 { +#if SMAPI_LEGACY_PATCH public static RainDrop[] RainDropsProp => (typeof(RainManager).GetField("_rainDropList", BindingFlags.NonPublic | BindingFlags.Instance).GetValue(RainManager.Instance) as List).ToArray(); public static bool IsRainingProp @@ -45,6 +46,7 @@ namespace StardewModdingAPI.Framework.ModLoading.RewriteFacades { RainManager.Instance.Update(Game1.currentGameTime); } +#endif [SuppressMessage("ReSharper", "CS0109", Justification = "The 'new' modifier applies when compiled on Windows.")] public static new void warpFarmer(string locationName, int tileX, int tileY, bool flip) @@ -54,7 +56,7 @@ namespace StardewModdingAPI.Framework.ModLoading.RewriteFacades public static void removeSquareDebrisFromTile(int tileX, int tileY) { - Game1.currentLocation.debris.debrisNetCollection.Filter(debris => { + Game1.currentLocation.debris.Filter(debris => { if ((debris.debrisType == 2) && (((int)(debris.Chunks[0].position.X / 64f)) == tileX)) { return (debris.chunkFinalYLevel / 0x40) != tileY; diff --git a/src/SMAPI/Framework/ModLoading/RewriteFacades/HarmonyInstanceMethods.cs b/src/SMAPI/Framework/ModLoading/RewriteFacades/HarmonyInstanceMethods.cs index 236d3450..6130d0b2 100644 --- a/src/SMAPI/Framework/ModLoading/RewriteFacades/HarmonyInstanceMethods.cs +++ b/src/SMAPI/Framework/ModLoading/RewriteFacades/HarmonyInstanceMethods.cs @@ -1,22 +1,14 @@ #if SMAPI_FOR_MOBILE using System.Reflection; using System.Reflection.Emit; -#if HARMONY_2 using HarmonyLib; -#else -using Harmony; -#endif namespace StardewModdingAPI.Framework.ModLoading.RewriteFacades { public class HarmonyInstanceMethods { public static MethodInfo Patch( -#if HARMONY_2 Harmony instance, -#else - HarmonyInstance instance, -#endif MethodBase original, HarmonyMethod prefix = null, HarmonyMethod postfix = null, @@ -33,22 +25,14 @@ namespace StardewModdingAPI.Framework.ModLoading.RewriteFacades return null; } public static void PatchAll( -#if HARMONY_2 Harmony instance -#else - HarmonyInstance instance -#endif ) { if (Constants.HarmonyEnabled) instance.PatchAll(); } public static void PatchAllToAssembly( -#if HARMONY_2 Harmony instance, -#else - HarmonyInstance instance, -#endif Assembly assembly) { if (Constants.HarmonyEnabled) diff --git a/src/SMAPI/Framework/ModLoading/RewriteFacades/IClickableMenuMethods.cs b/src/SMAPI/Framework/ModLoading/RewriteFacades/IClickableMenuMethods.cs index dba74484..edf67b0c 100644 --- a/src/SMAPI/Framework/ModLoading/RewriteFacades/IClickableMenuMethods.cs +++ b/src/SMAPI/Framework/ModLoading/RewriteFacades/IClickableMenuMethods.cs @@ -10,11 +10,14 @@ namespace StardewModdingAPI.Framework.ModLoading.RewriteFacades { public class IClickableMenuMethods : IClickableMenu { +#if SMAPI_LEGACY_PATCH + [SuppressMessage("ReSharper", "CS0109", Justification = "The 'new' modifier applies when compiled on Windows.")] public static new void drawHoverText(SpriteBatch b, string text, SpriteFont font, int xOffset = 0, int yOffset = 0, int moneyAmounttoDisplayAtBottom = -1, string boldTitleText = null, int healAmountToDisplay = -1, string[] buffIconsToDsiplay = null, Item hoveredItem = null, int currencySymbol = 0, int extraItemToShowIndex = -1, int extraItemToShowAmount = -1, int overideX = -1, int overrideY = -1, float alpha = 1, CraftingRecipe craftingIngrediants = null, IList additional_craft_materials = null) { drawHoverText(b, text, font, xOffset, yOffset, moneyAmounttoDisplayAtBottom, boldTitleText, healAmountToDisplay, buffIconsToDsiplay, hoveredItem, currencySymbol, extraItemToShowIndex, extraItemToShowAmount, overideX, overrideY, alpha, craftingIngrediants, -1, 80, -1, additional_craft_materials); } +#endif [SuppressMessage("ReSharper", "CS0109", Justification = "The 'new' modifier applies when compiled on Windows.")] public new void drawHorizontalPartition(SpriteBatch b, int yPosition, bool small = false, int red = -1, int green = -1, int blue = -1) diff --git a/src/SMAPI/Framework/ModLoading/RewriteFacades/NPCMethods.cs b/src/SMAPI/Framework/ModLoading/RewriteFacades/NPCMethods.cs deleted file mode 100644 index 05c37b7f..00000000 --- a/src/SMAPI/Framework/ModLoading/RewriteFacades/NPCMethods.cs +++ /dev/null @@ -1,22 +0,0 @@ -#if SMAPI_FOR_MOBILE -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using StardewValley; - -namespace StardewModdingAPI.Framework.ModLoading.RewriteFacades -{ - public class NPCMethods : NPC - { - public void reloadSprite() - { - base.reloadSprite(Game1.emergencyLoading); - } - public void checkSchedule(int timeOfDay) - { - base.checkSchedule(timeOfDay, Game1.emergencyLoading); - } - } -} -#endif diff --git a/src/SMAPI/Framework/ModLoading/RewriteFacades/SpriteTextMethods.cs b/src/SMAPI/Framework/ModLoading/RewriteFacades/SpriteTextMethods.cs index f11e6657..7f8e5b68 100644 --- a/src/SMAPI/Framework/ModLoading/RewriteFacades/SpriteTextMethods.cs +++ b/src/SMAPI/Framework/ModLoading/RewriteFacades/SpriteTextMethods.cs @@ -25,10 +25,12 @@ namespace StardewModdingAPI.Framework.ModLoading.RewriteFacades SpriteText.drawString(b, s, x, y, 999999, -1, 999999, alpha, 0.088f, false, 0, placeHolderWidthText, color, scroll_text_alignment); } +#if SMAPI_LEGACY_PATCH public static void drawStringWithScrollBackground(SpriteBatch b, string s, int x, int y, string placeHolderWidthText, float alpha, int color) { SpriteText.drawStringWithScrollBackground(b, s, x, y, placeHolderWidthText, alpha, color, 0.088f); } +#endif } } #endif diff --git a/src/SMAPI/Framework/ModLoading/RewriteFacades/WeatherDebrisMethods.cs b/src/SMAPI/Framework/ModLoading/RewriteFacades/WeatherDebrisMethods.cs deleted file mode 100644 index 65c1338a..00000000 --- a/src/SMAPI/Framework/ModLoading/RewriteFacades/WeatherDebrisMethods.cs +++ /dev/null @@ -1,19 +0,0 @@ -#if SMAPI_FOR_MOBILE -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using Microsoft.Xna.Framework; -using StardewValley; - -namespace StardewModdingAPI.Framework.ModLoading.RewriteFacades -{ - public class WeatherDebrisMethods : WeatherDebris - { - public WeatherDebrisMethods(Vector2 position, int which, float rotationVelocity, float dx, float dy) - : base(position, which, dx, dy) - { - } - } -} -#endif diff --git a/src/SMAPI/Framework/ModLoading/Rewriters/HeuristicFieldAccessibilityRewriter.cs b/src/SMAPI/Framework/ModLoading/Rewriters/HeuristicFieldAccessibilityRewriter.cs index d85c9f38..b0530351 100644 --- a/src/SMAPI/Framework/ModLoading/Rewriters/HeuristicFieldAccessibilityRewriter.cs +++ b/src/SMAPI/Framework/ModLoading/Rewriters/HeuristicFieldAccessibilityRewriter.cs @@ -1,11 +1,7 @@ using System; using System.Collections.Generic; using System.Reflection; -#if HARMONY_2 using HarmonyLib; -#else -using Harmony; -#endif using Mono.Cecil; using Mono.Cecil.Cil; using StardewModdingAPI.Framework.ModLoading.Framework; @@ -27,10 +23,10 @@ namespace StardewModdingAPI.Framework.ModLoading.Rewriters *********/ /// Construct an instance. /// The assembly names to which to rewrite broken references. - public HeuristicFieldAccessibilityRewriter(string[] rewriteReferencesToAssemblies) + public HeuristicFieldAccessibilityRewriter(HashSet rewriteReferencesToAssemblies) : base(defaultPhrase: "field visibility changed to private") // ignored since we specify phrases { - this.RewriteReferencesToAssemblies = new HashSet(rewriteReferencesToAssemblies); + this.RewriteReferencesToAssemblies = rewriteReferencesToAssemblies; } /// diff --git a/src/SMAPI/Framework/ModLoading/Rewriters/ReferenceToMissingMemberRewriter.cs b/src/SMAPI/Framework/ModLoading/Rewriters/ReferenceToMissingMemberRewriter.cs index 8f8bb5e3..0801b96b 100644 --- a/src/SMAPI/Framework/ModLoading/Rewriters/ReferenceToMissingMemberRewriter.cs +++ b/src/SMAPI/Framework/ModLoading/Rewriters/ReferenceToMissingMemberRewriter.cs @@ -1,6 +1,6 @@ using System.Collections.Generic; using System.Linq; -using Harmony; +using HarmonyLib; using Mono.Cecil; using Mono.Cecil.Cil; using StardewModdingAPI.Framework.ModLoading.Framework; @@ -15,7 +15,7 @@ namespace StardewModdingAPI.Framework.ModLoading.Finders ** Fields *********/ /// The assembly names to which to heuristically detect broken references. - private readonly HashSet ValidateReferencesToAssemblies; + private readonly ISet ValidateReferencesToAssemblies; /********* @@ -23,10 +23,10 @@ namespace StardewModdingAPI.Framework.ModLoading.Finders *********/ /// Construct an instance. /// The assembly names to which to heuristically detect broken references. - public ReferenceToMissingMemberRewriter(string[] validateReferencesToAssemblies) + public ReferenceToMissingMemberRewriter(ISet validateReferencesToAssemblies) : base(defaultPhrase: "") { - this.ValidateReferencesToAssemblies = new HashSet(validateReferencesToAssemblies); + this.ValidateReferencesToAssemblies = validateReferencesToAssemblies; } /// diff --git a/src/SMAPI/Framework/Monitor.cs b/src/SMAPI/Framework/Monitor.cs index 3940fc4a..37f629f7 100644 --- a/src/SMAPI/Framework/Monitor.cs +++ b/src/SMAPI/Framework/Monitor.cs @@ -25,10 +25,18 @@ namespace StardewModdingAPI.Framework private readonly LogFileManager LogFile; /// The maximum length of the values. +#if SMAPI_FOR_MOBILE + private static readonly int MaxLevelLength = ((LogLevel[]) Enum.GetValues(typeof (LogLevel))).Max(level => level.ToString().Length); +#else private static readonly int MaxLevelLength = Enum.GetValues().Max(level => level.ToString().Length); +#endif /// The cached representation for each level when added to a log header. +#if SMAPI_FOR_MOBILE + private static readonly Dictionary LogStrings = ((ConsoleLogLevel[]) Enum.GetValues(typeof (ConsoleLogLevel))).ToDictionary(level => level, level => level.ToString().ToUpper().PadRight(Monitor.MaxLevelLength)); +#else private static readonly Dictionary LogStrings = Enum.GetValues().ToDictionary(level => level, level => level.ToString().ToUpper().PadRight(Monitor.MaxLevelLength)); +#endif /// A cache of messages that should only be logged once. private readonly HashSet LogOnceCache = new(); diff --git a/src/SMAPI/Framework/SCore.cs b/src/SMAPI/Framework/SCore.cs index aecbcb6c..a95ddd8c 100644 --- a/src/SMAPI/Framework/SCore.cs +++ b/src/SMAPI/Framework/SCore.cs @@ -51,6 +51,7 @@ using StardewModdingAPI.Toolkit.Utilities; using StardewModdingAPI.Toolkit.Utilities.PathLookups; using StardewModdingAPI.Utilities; using StardewValley; +using StardewValley.Menus; #if SMAPI_FOR_MOBILE using StardewValley.Mobile; #endif @@ -111,10 +112,7 @@ namespace StardewModdingAPI.Framework private SGameRunner Game = null!; // initialized very early #endif /// Manages input visible to the game. - private SInputState Input => SGame.Input; - - /// The game's core multiplayer utility. - private SMultiplayer Multiplayer => SGame.Multiplayer; + private SInputState Input => Instance.Input; /// SMAPI's content manager. private ContentCoordinator ContentCore = null!; // initialized very early @@ -166,8 +164,11 @@ namespace StardewModdingAPI.Framework #endif /// A list of queued commands to parse and execute. +#if SMAPI_FOR_MOBILE + internal readonly CommandQueue RawCommandQueue = new(); +#else private readonly CommandQueue RawCommandQueue = new(); - +#endif /// A list of commands to execute on each screen. private readonly PerScreen> ScreenCommandQueue = new(() => new List()); @@ -314,14 +315,14 @@ namespace StardewModdingAPI.Framework // new ScheduleErrorPatch(this.LogManager.MonitorForGame) // ); // add exit handler - this.CancellationToken.Token.Register(() => - { - if (this.IsGameRunning) - { - this.LogManager.WriteCrashLog(); - this.Game.Exit(); - } - }); + // this.CancellationToken.Token.Register(() => + // { + // if (this.IsGameRunning) + // { + // this.LogManager.WriteCrashLog(); + // this.Game.Exit(); + // } + // }); // set window titles this.UpdateWindowTitles(); @@ -1677,6 +1678,7 @@ namespace StardewModdingAPI.Framework this.Monitor.Log("Checking for updates..."); #if !SMAPI_FOR_MOBILE + // check SMAPI version { ISemanticVersion? updateFound = null; diff --git a/src/SMAPI/Framework/SGame.cs b/src/SMAPI/Framework/SGame.cs index 1646c4fa..851fad79 100644 --- a/src/SMAPI/Framework/SGame.cs +++ b/src/SMAPI/Framework/SGame.cs @@ -14,6 +14,7 @@ using StardewModdingAPI.Internal; using StardewModdingAPI.Utilities; using StardewValley; using StardewValley.BellsAndWhistles; +using StardewValley.Events; using StardewValley.Locations; using StardewValley.Menus; using StardewValley.Tools; @@ -22,6 +23,7 @@ using xTile.Layers; using xTile.Tiles; #if SMAPI_FOR_MOBILE using System.Collections.Generic; +using System.Threading.Tasks; using StardewValley.Minigames; using Rectangle = Microsoft.Xna.Framework.Rectangle; using SObject = StardewValley.Object; @@ -63,35 +65,10 @@ namespace StardewModdingAPI.Framework private readonly Action OnContentLoaded; #if SMAPI_FOR_MOBILE - private readonly IReflectedField DrawActiveClickableMenuField; - private readonly IReflectedField SpriteBatchBeginNextIDField; - private readonly IReflectedField DrawHudField; - private readonly IReflectedField> FarmerShadowsField; private readonly IReflectedField DebugStringBuilderField; - private readonly IReflectedField LightingBlendField; + private readonly IReflectedField NewDayTaskField; - private readonly IReflectedMethod SpriteBatchBeginMethod; - private readonly IReflectedMethod _spriteBatchBeginMethod; - private readonly IReflectedMethod _spriteBatchEndMethod; - private readonly IReflectedMethod DrawLoadingDotDotDotMethod; - private readonly IReflectedMethod CheckToReloadGameLocationAfterDrawFailMethod; private readonly IReflectedMethod DrawTapToMoveTargetMethod; - private readonly IReflectedMethod DrawDayTimeMoneyBoxMethod; - private readonly IReflectedMethod DrawAfterMapMethod; - private readonly IReflectedMethod DrawToolbarMethod; - private readonly IReflectedMethod DrawVirtualJoypadMethod; - private readonly IReflectedMethod DrawMenuMouseCursorMethod; - private readonly IReflectedMethod DrawFadeToBlackFullScreenRectMethod; - private readonly IReflectedMethod DrawChatBoxMethod; - private readonly IReflectedMethod DrawDialogueBoxForPinchZoomMethod; - private readonly IReflectedMethod DrawUnscaledActiveClickableMenuForPinchZoomMethod; - private readonly IReflectedMethod DrawNativeScaledActiveClickableMenuForPinchZoomMethod; - - // ReSharper disable once InconsistentNaming - private readonly IReflectedMethod DrawHUDMessagesMethod; - - // ReSharper disable once InconsistentNaming - private readonly IReflectedMethod DrawTutorialUIMethod; private readonly IReflectedMethod DrawGreenPlacementBoundsMethod; #endif @@ -125,16 +102,7 @@ namespace StardewModdingAPI.Framework /// Construct a content manager to read game content files. /// This must be static because the game accesses it before the constructor is called. - [NonInstancedStatic] - public static Func? CreateContentManagerImpl; - -#if SMAPI_FOR_MOBILE - public static SGame instance; - - public bool IsGameSuspended; - - public bool IsAfterInitialize = false; -#endif + [NonInstancedStatic] public static Func? CreateContentManagerImpl; /********* ** Public methods @@ -161,7 +129,7 @@ namespace StardewModdingAPI.Framework Game1.input = this.InitialInput = input; Game1.multiplayer = this.InitialMultiplayer = multiplayer; Game1.hooks = modHooks; - this._locations = new ObservableCollection(); + // this._locations = new ObservableCollection(); // init SMAPI this.Monitor = monitor; @@ -172,33 +140,12 @@ namespace StardewModdingAPI.Framework this.OnContentLoaded = onContentLoaded; #if SMAPI_FOR_MOBILE - SGame.instance = this; // init reflection fields - this.DrawActiveClickableMenuField = this.Reflection.GetField(this, "_drawActiveClickableMenu"); - this.SpriteBatchBeginNextIDField = this.Reflection.GetField(typeof(Game1), "_spriteBatchBeginNextID"); - this.DrawHudField = this.Reflection.GetField(this, "_drawHUD"); - this.FarmerShadowsField = this.Reflection.GetField>(this, "_farmerShadows"); this.DebugStringBuilderField = this.Reflection.GetField(typeof(Game1), "_debugStringBuilder"); - this.LightingBlendField = this.Reflection.GetField(this, "lightingBlend"); - this.SpriteBatchBeginMethod = this.Reflection.GetMethod(this, "SpriteBatchBegin", new[] {typeof(float)}); - this._spriteBatchBeginMethod = this.Reflection.GetMethod(this, "_spriteBatchBegin", new[] {typeof(SpriteSortMode), typeof(BlendState), typeof(SamplerState), typeof(DepthStencilState), typeof(RasterizerState), typeof(Effect), typeof(Matrix)}); - this._spriteBatchEndMethod = this.Reflection.GetMethod(this, "_spriteBatchEnd", new Type[] { }); - this.DrawLoadingDotDotDotMethod = this.Reflection.GetMethod(this, "DrawLoadingDotDotDot", new[] {typeof(GameTime)}); - this.CheckToReloadGameLocationAfterDrawFailMethod = this.Reflection.GetMethod(this, "CheckToReloadGameLocationAfterDrawFail", new[] {typeof(string), typeof(Exception)}); - this.DrawTapToMoveTargetMethod = this.Reflection.GetMethod(this, "DrawTapToMoveTarget", new Type[] { }); - this.DrawDayTimeMoneyBoxMethod = this.Reflection.GetMethod(this, "DrawDayTimeMoneyBox", new Type[] { }); - this.DrawAfterMapMethod = this.Reflection.GetMethod(this, "DrawAfterMap", new Type[] { }); - this.DrawToolbarMethod = this.Reflection.GetMethod(this, "DrawToolbar", new Type[] { }); - this.DrawVirtualJoypadMethod = this.Reflection.GetMethod(this, "DrawVirtualJoypad", new Type[] { }); - this.DrawMenuMouseCursorMethod = this.Reflection.GetMethod(this, "DrawMenuMouseCursor", new Type[] { }); - this.DrawFadeToBlackFullScreenRectMethod = this.Reflection.GetMethod(this, "DrawFadeToBlackFullScreenRect", new Type[] { }); - this.DrawChatBoxMethod = this.Reflection.GetMethod(this, "DrawChatBox", new Type[] { }); - this.DrawDialogueBoxForPinchZoomMethod = this.Reflection.GetMethod(this, "DrawDialogueBoxForPinchZoom", new Type[] { }); - this.DrawUnscaledActiveClickableMenuForPinchZoomMethod = this.Reflection.GetMethod(this, "DrawUnscaledActiveClickableMenuForPinchZoom", new Type[] { }); - this.DrawNativeScaledActiveClickableMenuForPinchZoomMethod = this.Reflection.GetMethod(this, "DrawNativeScaledActiveClickableMenuForPinchZoom", new Type[] { }); - this.DrawHUDMessagesMethod = this.Reflection.GetMethod(this, "DrawHUDMessages", new Type[] { }); - this.DrawTutorialUIMethod = this.Reflection.GetMethod(this, "DrawTutorialUI", new Type[] { }); - this.DrawGreenPlacementBoundsMethod = this.Reflection.GetMethod(this, "DrawGreenPlacementBounds", new Type[] { }); + this.NewDayTaskField = this.Reflection.GetField(this, "_newDayTask"); + + this.DrawTapToMoveTargetMethod = this.Reflection.GetMethod(this, "DrawTapToMoveTarget"); + this.DrawGreenPlacementBoundsMethod = this.Reflection.GetMethod(this, "DrawGreenPlacementBounds"); #endif } @@ -257,7 +204,7 @@ namespace StardewModdingAPI.Framework if (this.IsFirstTick) { this.Input.TrueUpdate(); - this.Watchers = new WatcherCore(this.Input, (ObservableCollection)this._locations); + this.Watchers = new WatcherCore(this.Input, this._locations); } // update @@ -277,7 +224,7 @@ namespace StardewModdingAPI.Framework /// The render target, if any. [SuppressMessage("ReSharper", "InconsistentNaming", Justification = "copied from game code as-is")] #if SMAPI_FOR_MOBILE - protected override void _draw(GameTime gameTime, RenderTarget2D target_screen, RenderTarget2D toBuffer = null) + protected override void _draw(GameTime gameTime, RenderTarget2D target_screen) { Context.IsInDrawLoop = true; try @@ -316,7 +263,7 @@ namespace StardewModdingAPI.Framework return; } - this.DrawImpl(gameTime, target_screen, toBuffer); + this.DrawImpl(gameTime, target_screen); this.DrawCrashTimer.Reset(); } catch (Exception ex) @@ -415,1200 +362,766 @@ namespace StardewModdingAPI.Framework [SuppressMessage("SMAPI.CommonErrors", "AvoidNetField", Justification = "copied from game code as-is")] [SuppressMessage("ReSharper", "ConditionIsAlwaysTrueOrFalse", Justification = "Deliberate to minimize chance of errors when copying event calls into new versions of this code.")] #if SMAPI_FOR_MOBILE - private void DrawImpl(GameTime gameTime, RenderTarget2D target_screen, RenderTarget2D toBuffer = null) + private void DrawImpl(GameTime gameTime, RenderTarget2D target_screen) { - var events = this.Events; - if (Game1.skipNextDrawCall) + showingHealthBar = false; + if ((this.NewDayTaskField.GetValue() != null) || this.isLocalMultiplayerNewDayActive) { - Game1.skipNextDrawCall = false; + base.GraphicsDevice.Clear(bgColor); } else { - this.DrawHudField.SetValue(false); - this.DrawActiveClickableMenuField.SetValue(false); - Game1.showingHealthBar = false; - if (Game1._newDayTask != null) + Matrix? nullable; + if (target_screen != null) { - if (!Game1.showInterDayScroll) - return; - this.DrawSavingDotDotDot(); + SetRenderTarget(target_screen); + } + + if (this.IsSaving) + { + base.GraphicsDevice.Clear(bgColor); + PushUIMode(); + IClickableMenu activeClickableMenu = Game1.activeClickableMenu; + if (activeClickableMenu != null) + { + nullable = null; + spriteBatch.Begin(SpriteSortMode.Deferred, BlendState.AlphaBlend, SamplerState.PointClamp, null, null, null, nullable); + activeClickableMenu.draw(spriteBatch); + spriteBatch.End(); + } + + if (overlayMenu != null) + { + spriteBatch.Begin(SpriteSortMode.Deferred, BlendState.AlphaBlend, SamplerState.PointClamp, null, null, null, null); + overlayMenu.draw(spriteBatch); + spriteBatch.End(); + } + + PopUIMode(); } else { - if (target_screen != null && toBuffer == null) + base.GraphicsDevice.Clear(bgColor); + if (((Game1.activeClickableMenu != null) && options.showMenuBackground) && (Game1.activeClickableMenu.showWithoutTransparencyIfOptionIsSet() && !this.takingMapScreenshot)) { - this.GraphicsDevice.SetRenderTarget(target_screen); - } - - if (this.IsSaving) - { - this.GraphicsDevice.Clear(Game1.bgColor); - this.renderScreenBuffer(BlendState.Opaque, toBuffer); - if (Game1.activeClickableMenu != null) + PushUIMode(); + spriteBatch.Begin(SpriteSortMode.Deferred, BlendState.AlphaBlend, SamplerState.PointClamp, null, null, null, null); + Game1.activeClickableMenu.drawBackground(spriteBatch); + for (IClickableMenu menu2 = Game1.activeClickableMenu; menu2 != null; menu2 = menu2.GetChildMenu()) { - if (Game1.IsActiveClickableMenuNativeScaled) - { - Game1.BackupViewportAndZoom(divideByZoom: true); - Game1.SetSpriteBatchBeginNextID("A1"); - this.SpriteBatchBeginMethod.Invoke(Game1.NativeZoomLevel); - events.Rendering.RaiseEmpty(); - try - { - events.RenderingActiveMenu.RaiseEmpty(); - Game1.activeClickableMenu.draw(Game1.spriteBatch); - events.RenderedActiveMenu.RaiseEmpty(); - } - catch (Exception ex) - { - this.Monitor.Log($"The {Game1.activeClickableMenu.GetType().FullName} menu crashed while drawing itself during save. SMAPI will force it to exit to avoid crashing the game.\n{ex.GetLogSummary()}", LogLevel.Error); - Game1.activeClickableMenu.exitThisMenu(); - } - - this._spriteBatchEndMethod.Invoke(); - Game1.RestoreViewportAndZoom(); - } - else - { - Game1.BackupViewportAndZoom(); - Game1.SetSpriteBatchBeginNextID("A2"); - this.SpriteBatchBeginMethod.Invoke(1f); - events.Rendering.RaiseEmpty(); - try - { - events.RenderingActiveMenu.RaiseEmpty(); - Game1.activeClickableMenu.draw(Game1.spriteBatch); - events.RenderedActiveMenu.RaiseEmpty(); - } - catch (Exception ex) - { - this.Monitor.Log($"The {Game1.activeClickableMenu.GetType().FullName} menu crashed while drawing itself during save. SMAPI will force it to exit to avoid crashing the game.\n{ex.GetLogSummary()}", LogLevel.Error); - Game1.activeClickableMenu.exitThisMenu(); - } - - events.Rendered.RaiseEmpty(); - this._spriteBatchEndMethod.Invoke(); - Game1.RestoreViewportAndZoom(); - } + menu2.draw(spriteBatch); } - if (Game1.overlayMenu == null) - return; - Game1.BackupViewportAndZoom(); - Game1.SetSpriteBatchBeginNextID("B"); - this._spriteBatchBeginMethod.Invoke(SpriteSortMode.Deferred, BlendState.AlphaBlend, SamplerState.PointClamp, null, null, null, null); - Game1.overlayMenu.draw(Game1.spriteBatch); - this._spriteBatchEndMethod.Invoke(); - Game1.RestoreViewportAndZoom(); + if (specialCurrencyDisplay != null) + { + specialCurrencyDisplay.Draw(spriteBatch); + } + + spriteBatch.End(); + this.drawOverlays(spriteBatch); + PopUIMode(); } else { - this.GraphicsDevice.Clear(Game1.bgColor); - if (Game1.activeClickableMenu != null && Game1.options.showMenuBackground && Game1.activeClickableMenu.showWithoutTransparencyIfOptionIsSet() && !this.takingMapScreenshot) + if (emergencyLoading) { - Matrix scale = Matrix.CreateScale(1f); - Game1.SetSpriteBatchBeginNextID("C"); - this._spriteBatchBeginMethod.Invoke(SpriteSortMode.Deferred, BlendState.AlphaBlend, SamplerState.PointClamp, null, null, null, scale); - events.Rendering.RaiseEmpty(); - try + if (!SeenConcernedApeLogo) { - Game1.activeClickableMenu.drawBackground(Game1.spriteBatch); - events.RenderingActiveMenu.RaiseEmpty(); - Game1.activeClickableMenu.draw(Game1.spriteBatch); - events.RenderedActiveMenu.RaiseEmpty(); - } - catch (Exception ex) - { - this.Monitor.Log($"The {Game1.activeClickableMenu.GetType().FullName} menu crashed while drawing itself. SMAPI will force it to exit to avoid crashing the game.\n{ex.GetLogSummary()}", LogLevel.Error); - Game1.activeClickableMenu.exitThisMenu(); + PushUIMode(); + nullable = null; + spriteBatch.Begin(SpriteSortMode.Deferred, BlendState.AlphaBlend, SamplerState.PointClamp, null, null, null, nullable); + if (logoFadeTimer < 0x1388) + { + spriteBatch.Draw(staminaRect, new Rectangle(0, 0, Game1.viewport.Width, Game1.viewport.Height), Color.White); + } + + if (logoFadeTimer > 0x1194) + { + float num = Math.Min((float)1f, (float)(((float)(logoFadeTimer - 0x1194)) / 500f)); + spriteBatch.Draw(staminaRect, new Rectangle(0, 0, Game1.viewport.Width, Game1.viewport.Height), Color.Black * num); + } + + spriteBatch.Draw(titleButtonsTexture, new Vector2((float)(Game1.viewport.Width / 2), (float)((Game1.viewport.Height / 2) - 90)), new Rectangle(0xab + ((((logoFadeTimer / 100) % 2) == 0) ? 0x6f : 0), 0x137, 0x6f, 60), Color.White * ((logoFadeTimer < 500) ? (((float)logoFadeTimer) / 500f) : ((logoFadeTimer > 0x1194) ? (1f - (((float)(logoFadeTimer - 0x1194)) / 500f)) : 1f)), 0f, Vector2.Zero, (float)3f, SpriteEffects.None, 0.2f); + spriteBatch.Draw(titleButtonsTexture, new Vector2((float)((Game1.viewport.Width / 2) - 0x105), (float)((Game1.viewport.Height / 2) - 0x66)), new Rectangle((((logoFadeTimer / 100) % 2) == 0) ? 0x55 : 0, 0x132, 0x55, 0x45), Color.White * ((logoFadeTimer < 500) ? (((float)logoFadeTimer) / 500f) : ((logoFadeTimer > 0x1194) ? (1f - (((float)(logoFadeTimer - 0x1194)) / 500f)) : 1f)), 0f, Vector2.Zero, (float)3f, SpriteEffects.None, 0.2f); + spriteBatch.End(); + PopUIMode(); } - events.Rendered.RaiseEmpty(); - this._spriteBatchEndMethod.Invoke(); - this.drawOverlays(Game1.spriteBatch); - this.renderScreenBufferTargetScreen(target_screen); - if (Game1.overlayMenu == null) - return; - Game1.SetSpriteBatchBeginNextID("D"); - this._spriteBatchBeginMethod.Invoke(SpriteSortMode.Deferred, BlendState.AlphaBlend, SamplerState.PointClamp, null, null, null, new Matrix?()); - Game1.overlayMenu.draw(Game1.spriteBatch); - this._spriteBatchEndMethod.Invoke(); + logoFadeTimer -= gameTime.ElapsedGameTime.Milliseconds; + } + + if (Game1.gameMode == 11) + { + spriteBatch.Begin(SpriteSortMode.Deferred, BlendState.AlphaBlend, SamplerState.PointClamp, null, null, null, null); + spriteBatch.DrawString(dialogueFont, content.LoadString(@"Strings\StringsFromCSFiles:Game1.cs.3685"), new Vector2(16f, 16f), Color.HotPink); + spriteBatch.DrawString(dialogueFont, content.LoadString(@"Strings\StringsFromCSFiles:Game1.cs.3686"), new Vector2(16f, 32f), new Color(0, 0xff, 0)); + spriteBatch.DrawString(dialogueFont, parseText(errorMessage, dialogueFont, graphics.GraphicsDevice.Viewport.Width, 1f), new Vector2(16f, 48f), Color.White); + spriteBatch.End(); + } + else if (currentMinigame != null) + { + currentMinigame.draw(spriteBatch); + if ((globalFade && !menuUp) && (!nameSelectUp || messagePause)) + { + PushUIMode(); + spriteBatch.Begin(SpriteSortMode.Deferred, BlendState.AlphaBlend, SamplerState.PointClamp, null, null, null, null); + spriteBatch.Draw(fadeToBlackRect, graphics.GraphicsDevice.Viewport.Bounds, Color.Black * ((Game1.gameMode == 0) ? (1f - fadeToBlackAlpha) : fadeToBlackAlpha)); + spriteBatch.End(); + PopUIMode(); + } + + PushUIMode(); + this.drawOverlays(spriteBatch); + PopUIMode(); + SetRenderTarget(target_screen); + } + else if (showingEndOfNightStuff) + { + PushUIMode(); + spriteBatch.Begin(SpriteSortMode.Deferred, BlendState.AlphaBlend, SamplerState.PointClamp, null, null, null, null); + if (Game1.activeClickableMenu != null) + { + for (IClickableMenu menu3 = Game1.activeClickableMenu; menu3 != null; menu3 = menu3.GetChildMenu()) + { + menu3.draw(spriteBatch); + } + } + + spriteBatch.End(); + this.drawOverlays(spriteBatch); + PopUIMode(); + } + else if ((Game1.gameMode == 6) || ((Game1.gameMode == 3) && (currentLocation == null))) + { + PushUIMode(); + base.GraphicsDevice.Clear(bgColor); + spriteBatch.Begin(SpriteSortMode.Deferred, BlendState.AlphaBlend, SamplerState.PointClamp, null, null, null, null); + string str = ""; + for (int i = 0; i < ((gameTime.TotalGameTime.TotalMilliseconds % 999.0) / 333.0); i++) + { + str = str + "."; + } + + string text1 = content.LoadString(@"Strings\StringsFromCSFiles:Game1.cs.3688"); + string s = text1 + str; + string str3 = text1 + "... "; + int width = SpriteText.getWidthOfString(str3, 0xf423f); + int height = 0x40; + int x = 0x40; + int y = graphics.GraphicsDevice.Viewport.GetTitleSafeArea().Bottom - height; + int num6 = 20; + x = (xEdge > 0) ? (0x33 + xEdge) : (0x33 + num6); + y = (uiViewport.Height - 0x3f) - num6; + SpriteText.drawString(spriteBatch, s, x, y, 0xf423f, width, height, 1f, 0.88f, false, 0, str3, -1, SpriteText.ScrollTextAlignment.Left); + spriteBatch.End(); + this.drawOverlays(spriteBatch); + byte gameMode = Game1.gameMode; + PopUIMode(); } else { - if (Game1.emergencyLoading) + if (Game1.gameMode == 0) { - if (!Game1.SeenConcernedApeLogo) - { - Game1.SetSpriteBatchBeginNextID("E"); - this._spriteBatchBeginMethod.Invoke(SpriteSortMode.Deferred, BlendState.AlphaBlend, SamplerState.PointClamp, null, null, null, new Matrix?()); - if (Game1.logoFadeTimer < 5000) - { - Game1.spriteBatch.Draw(Game1.staminaRect, new Rectangle(0, 0, Game1.viewport.Width, Game1.viewport.Height), Color.White); - } - - if (Game1.logoFadeTimer > 4500) - { - float scale = Math.Min(1f, (Game1.logoFadeTimer - 4500) / 500f); - Game1.spriteBatch.Draw(Game1.staminaRect, new Rectangle(0, 0, Game1.viewport.Width, Game1.viewport.Height), Color.Black * scale); - } - - Game1.spriteBatch.Draw( - Game1.titleButtonsTexture, - new Vector2(Game1.viewport.Width / 2, Game1.viewport.Height / 2 - 90), - new Rectangle(171 + (Game1.logoFadeTimer / 100 % 2 == 0 ? 111 : 0), 311, 111, 60), - Color.White * (Game1.logoFadeTimer < 500 ? Game1.logoFadeTimer / 500f : Game1.logoFadeTimer > 4500 ? 1f - (Game1.logoFadeTimer - 4500) / 500f : 1f), - 0f, - Vector2.Zero, - 3f, - SpriteEffects.None, - 0.2f); - Game1.spriteBatch.Draw( - Game1.titleButtonsTexture, - new Vector2(Game1.viewport.Width / 2 - 261, Game1.viewport.Height / 2 - 102), - new Rectangle(Game1.logoFadeTimer / 100 % 2 == 0 ? 85 : 0, 306, 85, 69), - Color.White * (Game1.logoFadeTimer < 500 ? Game1.logoFadeTimer / 500f : Game1.logoFadeTimer > 4500 ? 1f - (Game1.logoFadeTimer - 4500) / 500f : 1f), - 0f, - Vector2.Zero, - 3f, - SpriteEffects.None, - 0.2f); - this._spriteBatchEndMethod.Invoke(); - } - - Game1.logoFadeTimer -= gameTime.ElapsedGameTime.Milliseconds; - } - - if (Game1.gameMode == Game1.errorLogMode) - { - Game1.SetSpriteBatchBeginNextID("F"); - this._spriteBatchBeginMethod.Invoke(SpriteSortMode.Deferred, BlendState.AlphaBlend, SamplerState.PointClamp, null, null, null, new Matrix?()); - events.Rendering.RaiseEmpty(); - Game1.spriteBatch.DrawString(Game1.dialogueFont, Game1.content.LoadString("Strings\\StringsFromCSFiles:Game1.cs.3685"), new Vector2(16f, 16f), Color.HotPink); - Game1.spriteBatch.DrawString(Game1.dialogueFont, Game1.content.LoadString("Strings\\StringsFromCSFiles:Game1.cs.3686"), new Vector2(16f, 32f), new Color(0, 255, 0)); - Game1.spriteBatch.DrawString(Game1.dialogueFont, Game1.parseText(Game1.errorMessage, Game1.dialogueFont, Game1.graphics.GraphicsDevice.Viewport.Width), new Vector2(16f, 48f), Color.White); - events.Rendered.RaiseEmpty(); - this._spriteBatchEndMethod.Invoke(); - } - else if (Game1.currentMinigame != null) - { - Game1.currentMinigame.draw(Game1.spriteBatch); - if (Game1.globalFade && !Game1.menuUp && (!Game1.nameSelectUp || Game1.messagePause)) - { - Game1.SetSpriteBatchBeginNextID("G"); - this._spriteBatchBeginMethod.Invoke(SpriteSortMode.Deferred, BlendState.AlphaBlend, SamplerState.PointClamp, null, null, null, new Matrix?()); - Game1.spriteBatch.Draw(Game1.fadeToBlackRect, Game1.graphics.GraphicsDevice.Viewport.Bounds, - Color.Black * (Game1.gameMode == Game1.titleScreenGameMode ? 1f - Game1.fadeToBlackAlpha : Game1.fadeToBlackAlpha)); - this._spriteBatchEndMethod.Invoke(); - } - - this.drawOverlays(Game1.spriteBatch); - this.renderScreenBufferTargetScreen(target_screen); - if (Game1.currentMinigame is FishingGame && Game1.activeClickableMenu != null) - { - Game1.SetSpriteBatchBeginNextID("A-A"); - this.SpriteBatchBeginMethod.Invoke(1f); - Game1.activeClickableMenu.draw(Game1.spriteBatch); - this._spriteBatchEndMethod.Invoke(); - this.drawOverlays(Game1.spriteBatch); - } - else if (Game1.currentMinigame is FantasyBoardGame && Game1.activeClickableMenu != null) - { - if (Game1.IsActiveClickableMenuNativeScaled) - { - Game1.BackupViewportAndZoom(true); - Game1.SetSpriteBatchBeginNextID("A1"); - this.SpriteBatchBeginMethod.Invoke(Game1.NativeZoomLevel); - Game1.activeClickableMenu.draw(Game1.spriteBatch); - this._spriteBatchEndMethod.Invoke(); - Game1.RestoreViewportAndZoom(); - } - else - { - Game1.BackupViewportAndZoom(); - Game1.SetSpriteBatchBeginNextID("A2"); - this.SpriteBatchBeginMethod.Invoke(1f); - Game1.activeClickableMenu.draw(Game1.spriteBatch); - this._spriteBatchEndMethod.Invoke(); - Game1.RestoreViewportAndZoom(); - } - } - - this.DrawVirtualJoypadMethod.Invoke(); - } - else if (Game1.showingEndOfNightStuff) - { - this.renderScreenBuffer(BlendState.Opaque); - Game1.BackupViewportAndZoom(divideByZoom: true); - Game1.SetSpriteBatchBeginNextID("A-B"); - this.SpriteBatchBeginMethod.Invoke(Game1.NativeZoomLevel); - events.Rendering.RaiseEmpty(); - if (Game1.activeClickableMenu != null) - { - try - { - events.RenderingActiveMenu.RaiseEmpty(); - Game1.activeClickableMenu.draw(Game1.spriteBatch); - events.RenderedActiveMenu.RaiseEmpty(); - } - catch (Exception ex) - { - this.Monitor.Log($"The {Game1.activeClickableMenu.GetType().FullName} menu crashed while drawing itself during end-of-night-stuff. SMAPI will force it to exit to avoid crashing the game.\n{ex.GetLogSummary()}", LogLevel.Error); - Game1.activeClickableMenu.exitThisMenu(); - } - } - - events.Rendered.RaiseEmpty(); - this._spriteBatchEndMethod.Invoke(); - this.drawOverlays(Game1.spriteBatch); - Game1.RestoreViewportAndZoom(); - } - else if (Game1.gameMode == Game1.loadingMode || Game1.gameMode == Game1.playingGameMode && Game1.currentLocation == null) - { - this.SpriteBatchBeginMethod.Invoke(1f); - events.Rendering.RaiseEmpty(); - this._spriteBatchEndMethod.Invoke(); - this.DrawLoadingDotDotDotMethod.Invoke(gameTime); - this.SpriteBatchBeginMethod.Invoke(1f); - events.Rendered.RaiseEmpty(); - this._spriteBatchEndMethod.Invoke(); - this.drawOverlays(Game1.spriteBatch); - this.renderScreenBufferTargetScreen(target_screen); - if (Game1.overlayMenu != null) - { - Game1.SetSpriteBatchBeginNextID("H"); - this._spriteBatchBeginMethod.Invoke(SpriteSortMode.Deferred, BlendState.AlphaBlend, SamplerState.PointClamp, null, null, null, new Matrix?()); - Game1.overlayMenu.draw(Game1.spriteBatch); - this._spriteBatchEndMethod.Invoke(); - } - - //base.Draw(gameTime); + nullable = null; + spriteBatch.Begin(SpriteSortMode.Deferred, BlendState.AlphaBlend, SamplerState.PointClamp, null, null, null, nullable); } else { - Rectangle rectangle; - byte batchOpens = 0; - if (Game1.gameMode == Game1.titleScreenGameMode) + if (((Game1.gameMode == 3) && (dayOfMonth == 0)) && newDay) { - Game1.SetSpriteBatchBeginNextID("I"); - this._spriteBatchBeginMethod.Invoke(SpriteSortMode.Deferred, BlendState.AlphaBlend, SamplerState.PointClamp, null, null, null, new Matrix?()); - if (++batchOpens == 1) - events.Rendering.RaiseEmpty(); + base.Draw(gameTime); + return; } - else if (!Game1.drawGame) + + if (drawLighting) { - Game1.SetSpriteBatchBeginNextID("J"); - this._spriteBatchBeginMethod.Invoke(SpriteSortMode.Deferred, BlendState.NonPremultiplied, SamplerState.PointClamp, null, null, null, new Matrix?()); - if (++batchOpens == 1) - events.Rendering.RaiseEmpty(); - } - else if (Game1.drawGame) - { - if (Game1.drawLighting && Game1.currentLocation != null) + Color ambientLight; + SetRenderTarget(lightmap); + base.GraphicsDevice.Clear(Color.White * 0f); + Matrix identity = Matrix.Identity; + if (this.useUnscaledLighting) { - this.GraphicsDevice.SetRenderTarget(Game1.lightmap); - this.GraphicsDevice.Clear(Color.White * 0f); - Game1.SetSpriteBatchBeginNextID("K"); - this._spriteBatchBeginMethod.Invoke(SpriteSortMode.Deferred, BlendState.NonPremultiplied, SamplerState.PointClamp, null, null, null, new Matrix?()); - if (++batchOpens == 1) - events.Rendering.RaiseEmpty(); - Color color1 = !Game1.currentLocation.Name.StartsWith("UndergroundMine") || !(Game1.currentLocation is MineShaft) - ? Game1.ambientLight.Equals(Color.White) || RainManager.Instance.isRaining && (bool) Game1.currentLocation.isOutdoors ? Game1.outdoorLight : - Game1.ambientLight - : ((MineShaft) Game1.currentLocation).getLightingColor(gameTime); - Game1.spriteBatch.Draw(Game1.staminaRect, Game1.lightmap.Bounds, color1); - foreach (LightSource currentLightSource in Game1.currentLightSources) - { - if (!RainManager.Instance.isRaining && !Game1.isDarkOut() || currentLightSource.lightContext.Value != LightSource.LightContext.WindowLight) - { - if (currentLightSource.PlayerID != 0L && currentLightSource.PlayerID != Game1.player.UniqueMultiplayerID) - { - Farmer farmerMaybeOffline = Game1.getFarmerMaybeOffline(currentLightSource.PlayerID); - if (farmerMaybeOffline == null || farmerMaybeOffline.currentLocation != null && farmerMaybeOffline.currentLocation.Name != Game1.currentLocation.Name || farmerMaybeOffline.hidden) - continue; - } - } - - if (Utility.isOnScreen(currentLightSource.position, (int) (currentLightSource.radius * 64.0 * 4.0))) - { - Texture2D lightTexture = currentLightSource.lightTexture; - Vector2 position = Game1.GlobalToLocal(Game1.viewport, currentLightSource.position) / (Game1.options.lightingQuality / 2); - Rectangle? sourceRectangle = currentLightSource.lightTexture.Bounds; - Color color = currentLightSource.color; - Rectangle bounds = currentLightSource.lightTexture.Bounds; - double x = bounds.Center.X; - bounds = currentLightSource.lightTexture.Bounds; - double y = bounds.Center.Y; - Vector2 origin = new Vector2((float) x, (float) y); - double num = (double) currentLightSource.radius / (Game1.options.lightingQuality / 2); - Game1.spriteBatch.Draw(lightTexture, position, sourceRectangle, color, 0.0f, origin, (float) num, SpriteEffects.None, 0.9f); - } - } - - this._spriteBatchEndMethod.Invoke(); - this.GraphicsDevice.SetRenderTarget(target_screen); + identity = Matrix.CreateScale(options.zoomLevel); } - if (Game1.bloomDay && Game1.bloom != null) + spriteBatch.Begin(SpriteSortMode.Deferred, BlendState.NonPremultiplied, SamplerState.PointClamp, null, null, null, new Matrix?(identity)); + if (currentLocation.Name.StartsWith("UndergroundMine") && (currentLocation is MineShaft)) { - Game1.bloom.BeginDraw(); + ambientLight = (currentLocation as MineShaft).getLightingColor(gameTime); } - - this.GraphicsDevice.Clear(Game1.bgColor); - Game1.SetSpriteBatchBeginNextID("L"); - this._spriteBatchBeginMethod.Invoke(SpriteSortMode.Deferred, BlendState.AlphaBlend, SamplerState.PointClamp, null, null, null, new Matrix?()); - if (++batchOpens == 1) - events.Rendering.RaiseEmpty(); - events.RenderingWorld.RaiseEmpty(); - this.SpriteBatchBeginNextIDField.SetValue("L1"); - if (Game1.background != null) + else if (!Game1.ambientLight.Equals(Color.White) && (!IsRainingHere(null) || (currentLocation.isOutdoors == null))) { - Game1.background.draw(Game1.spriteBatch); - } - - this.SpriteBatchBeginNextIDField.SetValue("L2"); - Game1.mapDisplayDevice.BeginScene(Game1.spriteBatch); - this.SpriteBatchBeginNextIDField.SetValue("L3"); - try - { - if (Game1.currentLocation != null) - { - Game1.currentLocation.Map.GetLayer("Back").Draw(Game1.mapDisplayDevice, Game1.viewport, Location.Origin, wrapAround: false, 4); - this.SpriteBatchBeginNextIDField.SetValue("L4"); - } - } - catch (KeyNotFoundException exception) - { - this.CheckToReloadGameLocationAfterDrawFailMethod.Invoke("Back", exception); - } - - this.SpriteBatchBeginNextIDField.SetValue("L5"); - if (Game1.currentLocation != null) - { - Game1.currentLocation.drawWater(Game1.spriteBatch); - } - - this.SpriteBatchBeginNextIDField.SetValue("L6"); - this.FarmerShadowsField.GetValue().Clear(); - this.SpriteBatchBeginNextIDField.SetValue("L7"); - if (Game1.currentLocation != null && Game1.currentLocation.currentEvent != null && !Game1.currentLocation.currentEvent.isFestival && Game1.currentLocation.currentEvent.farmerActors.Count > 0) - { - this.SpriteBatchBeginNextIDField.SetValue("L8"); - foreach (Farmer farmerActor in Game1.currentLocation.currentEvent.farmerActors) - { - if (farmerActor.IsLocalPlayer && Game1.displayFarmer || !farmerActor.hidden) - { - this.FarmerShadowsField.GetValue().Add(farmerActor); - } - } - - this.SpriteBatchBeginNextIDField.SetValue("L9"); + ambientLight = Game1.ambientLight; } else { - this.SpriteBatchBeginNextIDField.SetValue("L10"); - if (Game1.currentLocation != null) - { - this.SpriteBatchBeginNextIDField.SetValue("L11"); - foreach (Farmer farmer in Game1.currentLocation.farmers) - { - if (farmer.IsLocalPlayer && Game1.displayFarmer || !farmer.hidden) - { - this.FarmerShadowsField.GetValue().Add(farmer); - } - } - - this.SpriteBatchBeginNextIDField.SetValue("L12"); - } + ambientLight = outdoorLight; } - this.SpriteBatchBeginNextIDField.SetValue("L13"); - if (Game1.currentLocation != null && !Game1.currentLocation.shouldHideCharacters()) + float num8 = 1f; + if (player.hasBuff(0x1a)) { - this.SpriteBatchBeginNextIDField.SetValue("L14"); - if (Game1.CurrentEvent == null) + if (ambientLight == Color.White) { - this.SpriteBatchBeginNextIDField.SetValue("L15"); - foreach (NPC character in Game1.currentLocation.characters) - { - try - { - if (!character.swimming) - { - if (!character.HideShadow) - { - if (!character.IsInvisible) - { - if (!Game1.currentLocation.shouldShadowBeDrawnAboveBuildingsLayer(character.getTileLocation())) - Game1.spriteBatch.Draw( - Game1.shadowTexture, - Game1.GlobalToLocal(Game1.viewport, character.Position + new Vector2(character.Sprite.SpriteWidth * 4 / 2f, character.GetBoundingBox().Height + (character.IsMonster ? 0 : 12))), - Game1.shadowTexture.Bounds, - Color.White, - 0.0f, - new Vector2(Game1.shadowTexture.Bounds.Center.X, Game1.shadowTexture.Bounds.Center.Y), - (float) (4.0 + character.yJumpOffset / 40.0) * (float) character.scale, - SpriteEffects.None, - Math.Max(0.0f, character.getStandingY() / 10000f) - 1E-06f); - } - } - } - } - catch (Exception ex) - { - Dictionary dictionary1 = new Dictionary(); - if (character != null) - { - dictionary1["name"] = character.name; - dictionary1["Sprite"] = (character.Sprite != null).ToString(); - Dictionary dictionary2 = dictionary1; - character.GetBoundingBox(); - bool flag = true; - string str1 = flag.ToString(); - dictionary2["BoundingBox"] = str1; - Dictionary dictionary3 = dictionary1; - flag = true; - string str2 = flag.ToString(); - dictionary3["shadowTexture.Bounds"] = str2; - Dictionary dictionary4 = dictionary1; - flag = Game1.currentLocation != null; - string str3 = flag.ToString(); - dictionary4["currentLocation"] = str3; - } - - Dictionary dictionary5 = dictionary1; - Microsoft.AppCenter.Crashes.ErrorAttachmentLog[] errorAttachmentLogArray = Array.Empty(); - Microsoft.AppCenter.Crashes.Crashes.TrackError(ex, dictionary5, errorAttachmentLogArray); - } - } - - this.SpriteBatchBeginNextIDField.SetValue("L16"); + ambientLight = new Color(0.75f, 0.75f, 0.75f); } else { - this.SpriteBatchBeginNextIDField.SetValue("L17"); - foreach (NPC actor in Game1.CurrentEvent.actors) + ambientLight.R = (byte)Utility.Lerp((float)ambientLight.R, 255f, 0.5f); + ambientLight.G = (byte)Utility.Lerp((float)ambientLight.G, 255f, 0.5f); + ambientLight.B = (byte)Utility.Lerp((float)ambientLight.B, 255f, 0.5f); + } + + num8 = 0.33f; + } + + spriteBatch.Draw(staminaRect, lightmap.Bounds, ambientLight); + foreach (LightSource source in currentLightSources) + { + if ((!IsRainingHere(null) && !isDarkOut()) || (source.lightContext.Value != LightSource.LightContext.WindowLight)) + { + if ((source.PlayerID != 0) && (source.PlayerID != player.UniqueMultiplayerID)) { - if (!actor.swimming && !actor.HideShadow && !Game1.currentLocation.shouldShadowBeDrawnAboveBuildingsLayer(actor.getTileLocation())) + Farmer farmer = getFarmerMaybeOffline(source.PlayerID); + if (((farmer == null) || ((farmer.currentLocation != null) && (farmer.currentLocation.Name != currentLocation.Name))) || (farmer.hidden != null)) { - Game1.spriteBatch.Draw(Game1.shadowTexture, Game1.GlobalToLocal(Game1.viewport, actor.Position + new Vector2(actor.Sprite.SpriteWidth * 4 / 2f, actor.GetBoundingBox().Height + (!actor.IsMonster ? actor.Sprite.SpriteHeight <= 16 ? -4 : 12 : 0))), Game1.shadowTexture.Bounds, Color.White, 0f, new Vector2(Game1.shadowTexture.Bounds.Center.X, Game1.shadowTexture.Bounds.Center.Y), (4f + actor.yJumpOffset / 40f) * (float) actor.scale, SpriteEffects.None, Math.Max(0f, actor.getStandingY() / 10000f) - 1E-06f); + continue; } } - this.SpriteBatchBeginNextIDField.SetValue("L18"); - } - - this.SpriteBatchBeginNextIDField.SetValue("L19"); - foreach (Farmer farmerShadow in this.FarmerShadowsField.GetValue()) - { - if (!Game1.multiplayer.isDisconnecting(farmerShadow.UniqueMultiplayerID) && - !farmerShadow.swimming && - !farmerShadow.isRidingHorse() && - (Game1.currentLocation == null || !Game1.currentLocation.shouldShadowBeDrawnAboveBuildingsLayer(farmerShadow.getTileLocation()))) + if (Utility.isOnScreen((Vector2)source.position, (int)((source.radius * 64f) * 4f))) { - Game1.spriteBatch.Draw( - Game1.shadowTexture, - Game1.GlobalToLocal(farmerShadow.Position + new Vector2(32f, 24f)), - Game1.shadowTexture.Bounds, - Color.White, - 0.0f, - new Vector2(Game1.shadowTexture.Bounds.Center.X, Game1.shadowTexture.Bounds.Center.Y), (float) (4.0 - (!farmerShadow.running && !farmerShadow.UsingTool || farmerShadow.FarmerSprite.currentAnimationIndex <= 1 ? 0.0 : Math.Abs(FarmerRenderer.featureYOffsetPerFrame[farmerShadow.FarmerSprite.CurrentFrame]) * 0.5)), - SpriteEffects.None, - 0.0f); + spriteBatch.Draw(source.lightTexture, GlobalToLocal(Game1.viewport, (Vector2)source.position) / ((float)(options.lightingQuality / 2)), new Rectangle?(source.lightTexture.Bounds), source.color.Value * num8, 0f, new Vector2((float)(source.lightTexture.Bounds.Width / 2), (float)(source.lightTexture.Bounds.Height / 2)), (float)(source.radius / ((float)(options.lightingQuality / 2))), SpriteEffects.None, 0.9f); } } - - this.SpriteBatchBeginNextIDField.SetValue("L20"); } - this.SpriteBatchBeginNextIDField.SetValue("L21"); - try + spriteBatch.End(); + SetRenderTarget(target_screen); + } + + base.GraphicsDevice.Clear(bgColor); + nullable = null; + spriteBatch.Begin(SpriteSortMode.Deferred, BlendState.AlphaBlend, SamplerState.PointClamp, null, null, null, nullable); + if (background != null) + { + background.draw(spriteBatch); + } + + currentLocation.drawBackground(spriteBatch); + mapDisplayDevice.BeginScene(spriteBatch); + currentLocation.Map.GetLayer("Back").Draw(mapDisplayDevice, Game1.viewport, Location.Origin, false, 4); + currentLocation.drawWater(spriteBatch); + spriteBatch.End(); + nullable = null; + spriteBatch.Begin(SpriteSortMode.FrontToBack, BlendState.AlphaBlend, SamplerState.PointClamp, null, null, null, nullable); + currentLocation.drawFloorDecorations(spriteBatch); + spriteBatch.End(); + nullable = null; + spriteBatch.Begin(SpriteSortMode.Deferred, BlendState.AlphaBlend, SamplerState.PointClamp, null, null, null, nullable); + this._farmerShadows.Clear(); + if (((currentLocation.currentEvent != null) && !currentLocation.currentEvent.isFestival) && (currentLocation.currentEvent.farmerActors.Count > 0)) + { + foreach (Farmer farmer2 in currentLocation.currentEvent.farmerActors) { - if (Game1.currentLocation != null) + if ((farmer2.IsLocalPlayer && displayFarmer) || (farmer2.hidden == null)) { - Game1.currentLocation.Map.GetLayer("Buildings").Draw(Game1.mapDisplayDevice, Game1.viewport, Location.Origin, wrapAround: false, 4); + this._farmerShadows.Add(farmer2); } } - catch (KeyNotFoundException exception2) + } + else + { + foreach (Farmer farmer3 in currentLocation.farmers) { - this.CheckToReloadGameLocationAfterDrawFailMethod.Invoke("Buildings", exception2); - } - - this.SpriteBatchBeginNextIDField.SetValue("L22"); - Game1.mapDisplayDevice.EndScene(); - this.SpriteBatchBeginNextIDField.SetValue("L23"); - if (Game1.currentLocation != null && Game1.currentLocation.tapToMove.targetNPC != null) - { - Game1.spriteBatch.Draw(Game1.mouseCursors, Game1.GlobalToLocal(Game1.viewport, Game1.currentLocation.tapToMove.targetNPC.Position + new Vector2(Game1.currentLocation.tapToMove.targetNPC.Sprite.SpriteWidth * 4 / 2f - 32f, Game1.currentLocation.tapToMove.targetNPC.GetBoundingBox().Height + (!Game1.currentLocation.tapToMove.targetNPC.IsMonster ? 12 : 0) - 32)), new Rectangle(194, 388, 16, 16), Color.White, 0f, Vector2.Zero, 4f, SpriteEffects.None, 0.58f); - } - - this.SpriteBatchBeginNextIDField.SetValue("L24"); - this._spriteBatchEndMethod.Invoke(); - this.SpriteBatchBeginNextIDField.SetValue("L25"); - Game1.SetSpriteBatchBeginNextID("M"); - this._spriteBatchBeginMethod.Invoke(SpriteSortMode.FrontToBack, BlendState.AlphaBlend, SamplerState.PointClamp, null, null, null, new Matrix?()); - this.SpriteBatchBeginNextIDField.SetValue("M1"); - if (Game1.currentLocation != null && !Game1.currentLocation.shouldHideCharacters()) - { - this.SpriteBatchBeginNextIDField.SetValue("M2"); - if (Game1.CurrentEvent == null) + if ((farmer3.IsLocalPlayer && displayFarmer) || (farmer3.hidden == null)) { - this.SpriteBatchBeginNextIDField.SetValue("M3"); - foreach (NPC character2 in Game1.currentLocation.characters) + this._farmerShadows.Add(farmer3); + } + } + } + + if (!currentLocation.shouldHideCharacters()) + { + if (CurrentEvent == null) + { + foreach (NPC npc in currentLocation.characters) + { + if (((npc.swimming == null) && !npc.HideShadow) && (!npc.IsInvisible && !this.checkCharacterTilesForShadowDrawFlag(npc))) { - if (!character2.swimming && !character2.HideShadow && Game1.currentLocation.shouldShadowBeDrawnAboveBuildingsLayer(character2.getTileLocation())) - { - Game1.spriteBatch.Draw( - Game1.shadowTexture, - Game1.GlobalToLocal(Game1.viewport, character2.Position + new Vector2(character2.Sprite.SpriteWidth * 4 / 2f, character2.GetBoundingBox().Height + (!character2.IsMonster ? 12 : 0))), - Game1.shadowTexture.Bounds, - Color.White, - 0f, - new Vector2(Game1.shadowTexture.Bounds.Center.X, Game1.shadowTexture.Bounds.Center.Y), - (4f + character2.yJumpOffset / 40f) * (float) character2.scale, SpriteEffects.None, - Math.Max(0f, character2.getStandingY() / 10000f) - 1E-06f); - } + spriteBatch.Draw(shadowTexture, GlobalToLocal(Game1.viewport, (npc.GetShadowOffset() + npc.Position) + new Vector2(((float)(npc.GetSpriteWidthForPositioning() * 4)) / 2f, (float)(npc.GetBoundingBox().Height + (npc.IsMonster ? 0 : 12)))), new Rectangle?(shadowTexture.Bounds), Color.White, 0f, new Vector2((float)shadowTexture.Bounds.Center.X, (float)shadowTexture.Bounds.Center.Y), Math.Max((float)0f, (float)((4f + (((float)npc.yJumpOffset) / 40f)) * npc.scale)), SpriteEffects.None, Math.Max((float)0f, (float)(((float)npc.getStandingY()) / 10000f)) - 1E-06f); } - - this.SpriteBatchBeginNextIDField.SetValue("M4"); } - else + } + else + { + foreach (NPC npc2 in CurrentEvent.actors) { - this.SpriteBatchBeginNextIDField.SetValue("M5"); - foreach (NPC actor2 in Game1.CurrentEvent.actors) + if ((((CurrentEvent == null) || !CurrentEvent.ShouldHideCharacter(npc2)) && ((npc2.swimming == null) && !npc2.HideShadow)) && !this.checkCharacterTilesForShadowDrawFlag(npc2)) { - if (!actor2.swimming && !actor2.HideShadow && Game1.currentLocation.shouldShadowBeDrawnAboveBuildingsLayer(actor2.getTileLocation())) - { - Game1.spriteBatch.Draw( - Game1.shadowTexture, - Game1.GlobalToLocal(Game1.viewport, actor2.Position + new Vector2(actor2.Sprite.SpriteWidth * 4 / 2f, actor2.GetBoundingBox().Height + (!actor2.IsMonster ? 12 : 0))), - Game1.shadowTexture.Bounds, - Color.White, - 0f, - new Vector2(Game1.shadowTexture.Bounds.Center.X, Game1.shadowTexture.Bounds.Center.Y), - (4f + actor2.yJumpOffset / 40f) * (float) actor2.scale, - SpriteEffects.None, - Math.Max(0f, actor2.getStandingY() / 10000f) - 1E-06f); - } + spriteBatch.Draw(shadowTexture, GlobalToLocal(Game1.viewport, (npc2.GetShadowOffset() + npc2.Position) + new Vector2(((float)(npc2.GetSpriteWidthForPositioning() * 4)) / 2f, (float)(npc2.GetBoundingBox().Height + (npc2.IsMonster ? 0 : ((npc2.Sprite.SpriteHeight <= 0x10) ? -4 : 12))))), new Rectangle?(shadowTexture.Bounds), Color.White, 0f, new Vector2((float)shadowTexture.Bounds.Center.X, (float)shadowTexture.Bounds.Center.Y), (float)(Math.Max((float)0f, (float)(4f + (((float)npc2.yJumpOffset) / 40f))) * npc2.scale), SpriteEffects.None, Math.Max((float)0f, (float)(((float)npc2.getStandingY()) / 10000f)) - 1E-06f); } - - this.SpriteBatchBeginNextIDField.SetValue("M6"); } + } - foreach (Farmer farmerShadow in this.FarmerShadowsField.GetValue()) + foreach (Farmer farmer4 in this._farmerShadows) + { + if (((!multiplayer.isDisconnecting(farmer4.UniqueMultiplayerID) && (farmer4.swimming == null)) && (!farmer4.isRidingHorse() && !farmer4.IsSitting())) && ((currentLocation == null) || !this.checkCharacterTilesForShadowDrawFlag(farmer4))) { - this.SpriteBatchBeginNextIDField.SetValue("M7"); - float layerDepth = System.Math.Max(0.0001f, farmerShadow.getDrawLayer() + 0.00011f) - 0.0001f; - if (!farmerShadow.swimming && !farmerShadow.isRidingHorse() && Game1.currentLocation != null && Game1.currentLocation.shouldShadowBeDrawnAboveBuildingsLayer(farmerShadow.getTileLocation())) + spriteBatch.Draw(shadowTexture, GlobalToLocal((farmer4.GetShadowOffset() + farmer4.Position) + new Vector2(32f, 24f)), new Rectangle?(shadowTexture.Bounds), Color.White, 0f, new Vector2((float)shadowTexture.Bounds.Center.X, (float)shadowTexture.Bounds.Center.Y), (float)(4f - (((farmer4.running || farmer4.UsingTool) && (farmer4.FarmerSprite.currentAnimationIndex > 1)) ? (Math.Abs(FarmerRenderer.featureYOffsetPerFrame[farmer4.FarmerSprite.CurrentFrame]) * 0.5f) : 0f)), SpriteEffects.None, 0f); + } + } + } + + Layer layer = currentLocation.Map.GetLayer("Buildings"); + layer.Draw(mapDisplayDevice, Game1.viewport, Location.Origin, false, 4); + mapDisplayDevice.EndScene(); + if ((currentLocation != null) && (currentLocation.tapToMove.targetNPC != null)) + { + spriteBatch.Draw(mouseCursors, GlobalToLocal(Game1.viewport, currentLocation.tapToMove.targetNPC.Position + new Vector2((((float)(currentLocation.tapToMove.targetNPC.Sprite.SpriteWidth * 4)) / 2f) - 32f, (float)((currentLocation.tapToMove.targetNPC.GetBoundingBox().Height + (currentLocation.tapToMove.targetNPC.IsMonster ? 0 : 12)) - 0x20))), new Rectangle(0xc2, 0x184, 0x10, 0x10), Color.White, 0f, Vector2.Zero, (float)4f, SpriteEffects.None, 0.58f); + } + + spriteBatch.End(); + nullable = null; + spriteBatch.Begin(SpriteSortMode.FrontToBack, BlendState.AlphaBlend, SamplerState.PointClamp, null, null, null, nullable); + if (!currentLocation.shouldHideCharacters()) + { + if (CurrentEvent == null) + { + foreach (NPC npc3 in currentLocation.characters) + { + if (((npc3.swimming == null) && !npc3.HideShadow) && ((npc3.isInvisible == null) && this.checkCharacterTilesForShadowDrawFlag(npc3))) { - Game1.spriteBatch.Draw( - Game1.shadowTexture, - Game1.GlobalToLocal(farmerShadow.Position + new Vector2(32f, 24f)), - Game1.shadowTexture.Bounds, - Color.White, - 0.0f, - new Vector2(Game1.shadowTexture.Bounds.Center.X, Game1.shadowTexture.Bounds.Center.Y), - (float) (4.0 - (!farmerShadow.running && !farmerShadow.UsingTool || farmerShadow.FarmerSprite.currentAnimationIndex <= 1 ? 0.0 : Math.Abs(FarmerRenderer.featureYOffsetPerFrame[farmerShadow.FarmerSprite.CurrentFrame]) * 0.5)), - SpriteEffects.None, - layerDepth); + spriteBatch.Draw(shadowTexture, GlobalToLocal(Game1.viewport, (npc3.GetShadowOffset() + npc3.Position) + new Vector2(((float)(npc3.GetSpriteWidthForPositioning() * 4)) / 2f, (float)(npc3.GetBoundingBox().Height + (npc3.IsMonster ? 0 : 12)))), new Rectangle?(shadowTexture.Bounds), Color.White, 0f, new Vector2((float)shadowTexture.Bounds.Center.X, (float)shadowTexture.Bounds.Center.Y), Math.Max((float)0f, (float)((4f + (((float)npc3.yJumpOffset) / 40f)) * npc3.scale)), SpriteEffects.None, Math.Max((float)0f, (float)(((float)npc3.getStandingY()) / 10000f)) - 1E-06f); } - - this.SpriteBatchBeginNextIDField.SetValue("M8"); } } - - this.SpriteBatchBeginNextIDField.SetValue("M9"); - if ((Game1.eventUp || Game1.killScreen) && !Game1.killScreen && Game1.currentLocation?.currentEvent != null) + else { - this.SpriteBatchBeginNextIDField.SetValue("M10"); - Game1.currentLocation.currentEvent.draw(Game1.spriteBatch); - this.SpriteBatchBeginNextIDField.SetValue("M11"); - } - - this.SpriteBatchBeginNextIDField.SetValue("M12"); - if (Game1.currentLocation != null && Game1.player.currentUpgrade != null && Game1.player.currentUpgrade.daysLeftTillUpgradeDone <= 3 && Game1.currentLocation.Name.Equals("Farm")) - { - this.SpriteBatchBeginNextIDField.SetValue("M13"); - Game1.spriteBatch.Draw( - Game1.player.currentUpgrade.workerTexture, - Game1.GlobalToLocal(Game1.viewport, Game1.player.currentUpgrade.positionOfCarpenter), - Game1.player.currentUpgrade.getSourceRectangle(), - Color.White, - 0f, - Vector2.Zero, - 1f, - SpriteEffects.None, - (Game1.player.currentUpgrade.positionOfCarpenter.Y + 48f) / 10000f); - this.SpriteBatchBeginNextIDField.SetValue("M14"); - } - - this.SpriteBatchBeginNextIDField.SetValue("M15"); - Game1.currentLocation?.draw(Game1.spriteBatch); - foreach (Vector2 key in Game1.crabPotOverlayTiles.Keys) - { - Tile tile = Game1.currentLocation.Map.GetLayer("Buildings").Tiles[(int) key.X, (int) key.Y]; - if (tile != null) + foreach (NPC npc4 in CurrentEvent.actors) { - Vector2 local = Game1.GlobalToLocal(Game1.viewport, key * 64f); - Location location = new Location((int) local.X, (int) local.Y); - Game1.mapDisplayDevice.DrawTile(tile, location, (float) (((double) key.Y * 64.0 - 1.0) / 10000.0)); - } - } - - this.SpriteBatchBeginNextIDField.SetValue("M16"); - if (Game1.player.ActiveObject == null && (Game1.player.UsingTool || Game1.pickingTool) && Game1.player.CurrentTool != null && (!Game1.player.CurrentTool.Name.Equals("Seeds") || Game1.pickingTool)) - { - this.SpriteBatchBeginNextIDField.SetValue("M17"); - Game1.drawTool(Game1.player); - this.SpriteBatchBeginNextIDField.SetValue("M18"); - } - - this.SpriteBatchBeginNextIDField.SetValue("M19"); - if (Game1.currentLocation != null && Game1.currentLocation.Name.Equals("Farm")) - { - this.SpriteBatchBeginNextIDField.SetValue("M20"); - this.drawFarmBuildings(); - this.SpriteBatchBeginNextIDField.SetValue("M21"); - } - - if (Game1.tvStation >= 0) - { - this.SpriteBatchBeginNextIDField.SetValue("M22"); - Game1.spriteBatch.Draw( - Game1.tvStationTexture, - Game1.GlobalToLocal(Game1.viewport, new Vector2(400f, 160f)), - new Rectangle(Game1.tvStation * 24, 0, 24, 15), - Color.White, - 0f, - Vector2.Zero, - 4f, - SpriteEffects.None, - 1E-08f); - this.SpriteBatchBeginNextIDField.SetValue("M23"); - } - - this.SpriteBatchBeginNextIDField.SetValue("M24"); - if (Game1.panMode) - { - this.SpriteBatchBeginNextIDField.SetValue("M25"); - Game1.spriteBatch.Draw(Game1.fadeToBlackRect, new Rectangle((int) Math.Floor((Game1.getOldMouseX() + Game1.viewport.X) / 64.0) * 64 - Game1.viewport.X, (int) Math.Floor((Game1.getOldMouseY() + Game1.viewport.Y) / 64.0) * 64 - Game1.viewport.Y, 64, 64), Color.Lime * 0.75f); - this.SpriteBatchBeginNextIDField.SetValue("M26"); - foreach (Warp warp in Game1.currentLocation?.warps) - { - Game1.spriteBatch.Draw(Game1.fadeToBlackRect, new Rectangle(warp.X * 64 - Game1.viewport.X, warp.Y * 64 - Game1.viewport.Y, 64, 64), Color.Red * 0.75f); - } - - this.SpriteBatchBeginNextIDField.SetValue("M27"); - } - - this.SpriteBatchBeginNextIDField.SetValue("M28"); - Game1.mapDisplayDevice.BeginScene(Game1.spriteBatch); - this.SpriteBatchBeginNextIDField.SetValue("M29"); - try - { - Game1.currentLocation?.Map.GetLayer("Front").Draw(Game1.mapDisplayDevice, Game1.viewport, Location.Origin, wrapAround: false, 4); - this.SpriteBatchBeginNextIDField.SetValue("M30"); - } - catch (KeyNotFoundException exception3) - { - this.CheckToReloadGameLocationAfterDrawFailMethod.Invoke("Front", exception3); - } - - this.SpriteBatchBeginNextIDField.SetValue("M31"); - Game1.mapDisplayDevice.EndScene(); - this.SpriteBatchBeginNextIDField.SetValue("M32"); - Game1.currentLocation?.drawAboveFrontLayer(Game1.spriteBatch); - this.SpriteBatchBeginNextIDField.SetValue("M33"); - if (Game1.currentLocation != null && - Game1.currentLocation.tapToMove.targetNPC == null && - (Game1.displayHUD || Game1.eventUp) && - Game1.currentBillboard == 0 && - Game1.gameMode == Game1.playingGameMode && - !Game1.freezeControls && - !Game1.panMode && - !Game1.HostPaused) - { - this.SpriteBatchBeginNextIDField.SetValue("M34"); - this.DrawTapToMoveTargetMethod.Invoke(); - this.SpriteBatchBeginNextIDField.SetValue("M35"); - } - - this.SpriteBatchBeginNextIDField.SetValue("M36"); - this._spriteBatchEndMethod.Invoke(); - Game1.SetSpriteBatchBeginNextID("N"); - this._spriteBatchBeginMethod.Invoke(SpriteSortMode.Deferred, BlendState.AlphaBlend, SamplerState.PointClamp, null, null, null, new Matrix?()); - if (Game1.currentLocation != null && - Game1.displayFarmer && - Game1.player.ActiveObject != null && - (bool) Game1.player.ActiveObject.bigCraftable && - this.checkBigCraftableBoundariesForFrontLayer() && - Game1.currentLocation.Map.GetLayer("Front").PickTile(new Location(Game1.player.getStandingX(), Game1.player.getStandingY()), Game1.viewport.Size) == null) - { - Game1.drawPlayerHeldObject(Game1.player); - } - else if (Game1.displayFarmer && Game1.player.ActiveObject != null) - { - if (Game1.currentLocation != null && Game1.currentLocation.Map.GetLayer("Front").PickTile(new Location((int) Game1.player.Position.X, (int) Game1.player.Position.Y - 38), Game1.viewport.Size) == null || Game1.currentLocation.Map.GetLayer("Front").PickTile(new Location((int) Game1.player.Position.X, (int) Game1.player.Position.Y - 38), Game1.viewport.Size).TileIndexProperties.ContainsKey("FrontAlways")) - { - Layer layer1 = Game1.currentLocation.Map.GetLayer("Front"); - rectangle = Game1.player.GetBoundingBox(); - Location mapDisplayLocation1 = new Location(rectangle.Right, (int) Game1.player.Position.Y - 38); - Size size1 = Game1.viewport.Size; - if (layer1.PickTile(mapDisplayLocation1, size1) != null) + if ((((CurrentEvent == null) || !CurrentEvent.ShouldHideCharacter(npc4)) && ((npc4.swimming == null) && !npc4.HideShadow)) && this.checkCharacterTilesForShadowDrawFlag(npc4)) { - Layer layer2 = Game1.currentLocation.Map.GetLayer("Front"); - rectangle = Game1.player.GetBoundingBox(); - Location mapDisplayLocation2 = new Location(rectangle.Right, (int) Game1.player.Position.Y - 38); - Size size2 = Game1.viewport.Size; - if (layer2.PickTile(mapDisplayLocation2, size2).TileIndexProperties.ContainsKey("FrontAlways")) - goto label_183; + spriteBatch.Draw(shadowTexture, GlobalToLocal(Game1.viewport, (npc4.GetShadowOffset() + npc4.Position) + new Vector2(((float)(npc4.GetSpriteWidthForPositioning() * 4)) / 2f, (float)(npc4.GetBoundingBox().Height + (npc4.IsMonster ? 0 : 12)))), new Rectangle?(shadowTexture.Bounds), Color.White, 0f, new Vector2((float)shadowTexture.Bounds.Center.X, (float)shadowTexture.Bounds.Center.Y), Math.Max((float)0f, (float)((4f + (((float)npc4.yJumpOffset) / 40f)) * npc4.scale)), SpriteEffects.None, Math.Max((float)0f, (float)(((float)npc4.getStandingY()) / 10000f)) - 1E-06f); } - else - goto label_183; } - - Game1.drawPlayerHeldObject(Game1.player); } - label_183: - if (Game1.currentLocation != null - && (Game1.player.UsingTool || Game1.pickingTool) - && Game1.player.CurrentTool != null - && (!Game1.player.CurrentTool.Name.Equals("Seeds") || Game1.pickingTool) - && Game1.currentLocation.Map.GetLayer("Front").PickTile(new Location(Game1.player.getStandingX(), (int) Game1.player.Position.Y - 38), Game1.viewport.Size) != null && Game1.currentLocation.Map.GetLayer("Front").PickTile(new Location(Game1.player.getStandingX(), Game1.player.getStandingY()), Game1.viewport.Size) == null) - Game1.drawTool(Game1.player); - if (Game1.currentLocation != null && Game1.currentLocation.Map.GetLayer("AlwaysFront") != null) + foreach (Farmer farmer5 in this._farmerShadows) { - Game1.mapDisplayDevice.BeginScene(Game1.spriteBatch); - try + float layerDepth = Math.Max((float)0.0001f, (float)(farmer5.getDrawLayer() + 0.00011f)) - 0.0001f; + if ((((farmer5.swimming == null) && !farmer5.isRidingHorse()) && (!farmer5.IsSitting() && (currentLocation != null))) && this.checkCharacterTilesForShadowDrawFlag(farmer5)) { - Game1.currentLocation.Map.GetLayer("AlwaysFront").Draw(Game1.mapDisplayDevice, Game1.viewport, Location.Origin, wrapAround: false, 4); + spriteBatch.Draw(shadowTexture, GlobalToLocal((farmer5.GetShadowOffset() + farmer5.Position) + new Vector2(32f, 24f)), new Rectangle?(shadowTexture.Bounds), Color.White, 0f, new Vector2((float)shadowTexture.Bounds.Center.X, (float)shadowTexture.Bounds.Center.Y), (float)(4f - (((farmer5.running || farmer5.UsingTool) && (farmer5.FarmerSprite.currentAnimationIndex > 1)) ? (Math.Abs(FarmerRenderer.featureYOffsetPerFrame[farmer5.FarmerSprite.CurrentFrame]) * 0.5f) : 0f)), SpriteEffects.None, layerDepth); } - catch (KeyNotFoundException exception4) - { - this.CheckToReloadGameLocationAfterDrawFailMethod.Invoke("AlwaysFront", exception4); - } - - Game1.mapDisplayDevice.EndScene(); } + } - if (Game1.toolHold > 400f && Game1.player.CurrentTool.UpgradeLevel >= 1 && Game1.player.canReleaseTool) + if ((eventUp || killScreen) && (!killScreen && (currentLocation.currentEvent != null))) + { + currentLocation.currentEvent.draw(spriteBatch); + } + + if (((player.currentUpgrade != null) && (player.currentUpgrade.daysLeftTillUpgradeDone <= 3)) && currentLocation.Name.Equals("Farm")) + { + spriteBatch.Draw(player.currentUpgrade.workerTexture, GlobalToLocal(Game1.viewport, player.currentUpgrade.positionOfCarpenter), new Rectangle?(player.currentUpgrade.getSourceRectangle()), Color.White, 0f, Vector2.Zero, (float)1f, SpriteEffects.None, (player.currentUpgrade.positionOfCarpenter.Y + 48f) / 10000f); + } + + currentLocation.draw(spriteBatch); + foreach (KeyValuePair pair in crabPotOverlayTiles) + { + Vector2 key = pair.Key; + Tile tile = layer.Tiles[(int)key.X, (int)key.Y]; + if (tile != null) { - Color color = Color.White; - switch ((int) ((double) Game1.toolHold / 600.0) + 2) - { - case 1: - color = Tool.copperColor; - break; - case 2: - color = Tool.steelColor; - break; - case 3: - color = Tool.goldColor; - break; - case 4: - color = Tool.iridiumColor; - break; - } + Vector2 vector2 = GlobalToLocal(Game1.viewport, key * 64f); + Location location = new Location((int)vector2.X, (int)vector2.Y); + mapDisplayDevice.DrawTile(tile, location, ((key.Y * 64f) - 1f) / 10000f); + } + } - Game1.spriteBatch.Draw(Game1.littleEffect, new Rectangle((int) Game1.player.getLocalPosition(Game1.viewport).X - 2, (int) Game1.player.getLocalPosition(Game1.viewport).Y - (!Game1.player.CurrentTool.Name.Equals("Watering Can") ? 64 : 0) - 2, (int) (Game1.toolHold % 600f * 0.08f) + 4, 12), Color.Black); - Game1.spriteBatch.Draw(Game1.littleEffect, new Rectangle((int) Game1.player.getLocalPosition(Game1.viewport).X, (int) Game1.player.getLocalPosition(Game1.viewport).Y - (!Game1.player.CurrentTool.Name.Equals("Watering Can") ? 64 : 0), (int) (Game1.toolHold % 600f * 0.08f), 8), color); + if (eventUp && (currentLocation.currentEvent != null)) + { + string messageToScreen = currentLocation.currentEvent.messageToScreen; + } + + if (((player.ActiveObject == null) && (player.UsingTool || pickingTool)) && ((player.CurrentTool != null) && (!player.CurrentTool.Name.Equals("Seeds") || pickingTool))) + { + drawTool(player); + } + + if (currentLocation.Name.Equals("Farm")) + { + this.drawFarmBuildings(); + } + + if (tvStation >= 0) + { + spriteBatch.Draw(tvStationTexture, GlobalToLocal(Game1.viewport, new Vector2(400f, 160f)), new Rectangle(tvStation * 0x18, 0, 0x18, 15), Color.White, 0f, Vector2.Zero, (float)4f, SpriteEffects.None, 1E-08f); + } + + if (panMode) + { + spriteBatch.Draw(fadeToBlackRect, new Rectangle((((int)Math.Floor((double)(((double)(getOldMouseX() + Game1.viewport.X)) / 64.0))) * 0x40) - Game1.viewport.X, (((int)Math.Floor((double)(((double)(getOldMouseY() + Game1.viewport.Y)) / 64.0))) * 0x40) - Game1.viewport.Y, 0x40, 0x40), Color.Lime * 0.75f); + foreach (Warp warp in currentLocation.warps) + { + spriteBatch.Draw(fadeToBlackRect, new Rectangle((warp.X * 0x40) - Game1.viewport.X, (warp.Y * 0x40) - Game1.viewport.Y, 0x40, 0x40), Color.Red * 0.75f); + } + } + + mapDisplayDevice.BeginScene(spriteBatch); + currentLocation.Map.GetLayer("Front").Draw(mapDisplayDevice, Game1.viewport, Location.Origin, false, 4); + mapDisplayDevice.EndScene(); + currentLocation.drawAboveFrontLayer(spriteBatch); + if ((((currentLocation.tapToMove.targetNPC == null) && (displayHUD || eventUp)) && (((currentBillboard == 0) && (Game1.gameMode == 3)) && (!freezeControls && !panMode))) && !HostPaused) + { + this.DrawTapToMoveTargetMethod.Invoke(); + } + + spriteBatch.End(); + nullable = null; + spriteBatch.Begin(SpriteSortMode.Deferred, BlendState.AlphaBlend, SamplerState.PointClamp, null, null, null, nullable); + if (currentLocation.Map.GetLayer("AlwaysFront") != null) + { + mapDisplayDevice.BeginScene(spriteBatch); + currentLocation.Map.GetLayer("AlwaysFront").Draw(mapDisplayDevice, Game1.viewport, Location.Origin, false, 4); + mapDisplayDevice.EndScene(); + } + + if (((toolHold > 400f) && (player.CurrentTool.UpgradeLevel >= 1)) && player.canReleaseTool) + { + Color white = Color.White; + switch ((((int)(toolHold / 600f)) + 2)) + { + case 1: + white = Tool.copperColor; + break; + + case 2: + white = Tool.steelColor; + break; + + case 3: + white = Tool.goldColor; + break; + + case 4: + white = Tool.iridiumColor; + break; } + spriteBatch.Draw(littleEffect, new Rectangle(((int)player.getLocalPosition(Game1.viewport).X) - 2, (((int)player.getLocalPosition(Game1.viewport).Y) - (player.CurrentTool.Name.Equals("Watering Can") ? 0 : 0x40)) - 2, ((int)((toolHold % 600f) * 0.08f)) + 4, 12), Color.Black); + spriteBatch.Draw(littleEffect, new Rectangle((int)player.getLocalPosition(Game1.viewport).X, ((int)player.getLocalPosition(Game1.viewport).Y) - (player.CurrentTool.Name.Equals("Watering Can") ? 0 : 0x40), (int)((toolHold % 600f) * 0.08f), 8), white); + } + + if (!IsFakedBlackScreen()) + { this.drawWeather(gameTime, target_screen); - if (Game1.farmEvent != null) - { - Game1.farmEvent.draw(Game1.spriteBatch); - } - - if (Game1.currentLocation != null && Game1.currentLocation.LightLevel > 0f && Game1.timeOfDay < 2000) - { - Game1.spriteBatch.Draw(Game1.fadeToBlackRect, Game1.graphics.GraphicsDevice.Viewport.Bounds, Color.Black * Game1.currentLocation.LightLevel); - } - - if (Game1.screenGlow) - { - Game1.spriteBatch.Draw(Game1.fadeToBlackRect, Game1.graphics.GraphicsDevice.Viewport.Bounds, Game1.screenGlowColor * Game1.screenGlowAlpha); - } - - Game1.currentLocation?.drawAboveAlwaysFrontLayer(Game1.spriteBatch); - if (Game1.player.CurrentTool != null && Game1.player.CurrentTool is FishingRod && ((Game1.player.CurrentTool as FishingRod).isTimingCast || (Game1.player.CurrentTool as FishingRod).castingChosenCountdown > 0f || (Game1.player.CurrentTool as FishingRod).fishCaught || (Game1.player.CurrentTool as FishingRod).showingTreasure)) - { - Game1.player.CurrentTool.draw(Game1.spriteBatch); - } - - this._spriteBatchEndMethod.Invoke(); - Game1.SetSpriteBatchBeginNextID("O"); - this._spriteBatchBeginMethod.Invoke(SpriteSortMode.FrontToBack, BlendState.AlphaBlend, SamplerState.PointClamp, null, null, null, new Matrix?()); - if (Game1.eventUp && Game1.currentLocation != null && Game1.currentLocation.currentEvent != null) - { - Game1.currentLocation.currentEvent.drawAboveAlwaysFrontLayer(Game1.spriteBatch); - foreach (NPC actor in Game1.currentLocation.currentEvent.actors) - { - if (actor.isEmoting) - { - Vector2 localPosition = actor.getLocalPosition(Game1.viewport); - localPosition.Y -= 140f; - if (actor.Age == 2) - { - localPosition.Y += 32f; - } - else if (actor.Gender == 1) - { - localPosition.Y += 10f; - } - - Game1.spriteBatch.Draw(Game1.emoteSpriteSheet, localPosition, new Rectangle(actor.CurrentEmoteIndex * 16 % Game1.emoteSpriteSheet.Width, actor.CurrentEmoteIndex * 16 / Game1.emoteSpriteSheet.Width * 16, 16, 16), Color.White, 0f, Vector2.Zero, 4f, SpriteEffects.None, actor.getStandingY() / 10000f); - } - } - } - - this._spriteBatchEndMethod.Invoke(); - if (Game1.drawLighting) - { - Game1.SetSpriteBatchBeginNextID("P"); - this._spriteBatchBeginMethod.Invoke(SpriteSortMode.Deferred, this.LightingBlendField.GetValue(), SamplerState.LinearClamp, null, null, null, new Matrix?()); - Game1.spriteBatch.Draw(Game1.lightmap, Vector2.Zero, Game1.lightmap.Bounds, Color.White, 0f, Vector2.Zero, Game1.options.lightingQuality / 2, SpriteEffects.None, 1f); - if (RainManager.Instance.isRaining && Game1.currentLocation != null && (bool) Game1.currentLocation.isOutdoors && !(Game1.currentLocation is Desert)) - { - Game1.spriteBatch.Draw(Game1.staminaRect, Game1.graphics.GraphicsDevice.Viewport.Bounds, Color.OrangeRed * 0.45f); - } - - this._spriteBatchEndMethod.Invoke(); - } - - Game1.SetSpriteBatchBeginNextID("Q"); - this._spriteBatchBeginMethod.Invoke(SpriteSortMode.Deferred, BlendState.AlphaBlend, SamplerState.PointClamp, null, null, null, new Matrix?()); - events.RenderedWorld.RaiseEmpty(); - if (Game1.drawGrid) - { - int num = -Game1.viewport.X % 64; - float num2 = -Game1.viewport.Y % 64; - int num3 = num; - while (true) - { - int num4 = num3; - int width = Game1.graphics.GraphicsDevice.Viewport.Width; - if (num4 < width) - { - int x = num3; - int y = (int) num2; - int height = Game1.graphics.GraphicsDevice.Viewport.Height; - Rectangle destinationRectangle = new Rectangle(x, y, 1, height); - Color color = Color.Red * 0.5f; - Game1.spriteBatch.Draw(Game1.staminaRect, destinationRectangle, color); - num3 += 64; - } - else - break; - } - - float num5 = num2; - while (true) - { - double num4 = num5; - double height = Game1.graphics.GraphicsDevice.Viewport.Height; - if (num4 < height) - { - int x = num; - int y = (int) num5; - int width = Game1.graphics.GraphicsDevice.Viewport.Width; - Rectangle destinationRectangle = new Rectangle(x, y, width, 1); - Color color = Color.Red * 0.5f; - Game1.spriteBatch.Draw(Game1.staminaRect, destinationRectangle, color); - num5 += 64f; - } - else - break; - } - } - - if (Game1.currentBillboard != 0 && !this.takingMapScreenshot) - this.drawBillboard(); - if ((Game1.displayHUD || Game1.eventUp) - && Game1.currentBillboard == 0 - && Game1.gameMode == Game1.playingGameMode - && !Game1.freezeControls - && !Game1.panMode - && !Game1.HostPaused) - { - if (Game1.currentLocation != null - && !Game1.eventUp - && Game1.farmEvent == null -// && Game1.currentBillboard == 0 -// && Game1.gameMode == Game1.playingGameMode - && !this.takingMapScreenshot - && Game1.isOutdoorMapSmallerThanViewport()) - { - int width1 = -Math.Min(Game1.viewport.X, 4096); - int height1 = Game1.graphics.GraphicsDevice.Viewport.Height; - Rectangle destinationRectangle1 = new Rectangle(0, 0, width1, height1); - Color black1 = Color.Black; - Game1.spriteBatch.Draw(Game1.fadeToBlackRect, destinationRectangle1, black1); - int x = -Game1.viewport.X + Game1.currentLocation.map.Layers[0].LayerWidth * 64; - int width2 = Math.Min(4096, Game1.graphics.GraphicsDevice.Viewport.Width - (-Game1.viewport.X + Game1.currentLocation.map.Layers[0].LayerWidth * 64)); - int height2 = Game1.graphics.GraphicsDevice.Viewport.Height; - Rectangle destinationRectangle2 = new Rectangle(x, 0, width2, height2); - Color black2 = Color.Black; - Game1.spriteBatch.Draw(Game1.fadeToBlackRect, destinationRectangle2, black2); - } - - this.DrawHudField.SetValue(false); - if ((Game1.displayHUD || Game1.eventUp) && Game1.currentBillboard == 0 && Game1.gameMode == 3 && !Game1.freezeControls && !Game1.panMode && !Game1.HostPaused && !this.takingMapScreenshot) this.DrawHudField.SetValue(true); - this.DrawGreenPlacementBoundsMethod.Invoke(); - } } if (Game1.farmEvent != null) { - Game1.farmEvent.draw(Game1.spriteBatch); + Game1.farmEvent.draw(spriteBatch); } - if (Game1.dialogueUp && !Game1.nameSelectUp && !Game1.messagePause && (Game1.activeClickableMenu == null || !(Game1.activeClickableMenu is DialogueBox))) + if ((currentLocation.LightLevel > 0f) && (timeOfDay < 0x7d0)) { - this.drawDialogueBox(); + spriteBatch.Draw(fadeToBlackRect, graphics.GraphicsDevice.Viewport.Bounds, Color.Black * currentLocation.LightLevel); } - if (Game1.progressBar && !this.takingMapScreenshot) + if (screenGlow) { - int x1 = (Game1.graphics.GraphicsDevice.Viewport.GetTitleSafeArea().Width - Game1.dialogueWidth) / 2; - rectangle = Game1.graphics.GraphicsDevice.Viewport.GetTitleSafeArea(); - int y1 = rectangle.Bottom - 128; - Rectangle destinationRectangle1 = new Rectangle(x1, y1, Game1.dialogueWidth, 32); - Game1.spriteBatch.Draw(Game1.fadeToBlackRect, destinationRectangle1, Color.LightGray); - int x2 = (Game1.graphics.GraphicsDevice.Viewport.GetTitleSafeArea().Width - Game1.dialogueWidth) / 2; - rectangle = Game1.graphics.GraphicsDevice.Viewport.GetTitleSafeArea(); - int y2 = rectangle.Bottom - 128; - int width = (int) (Game1.pauseAccumulator / (double) Game1.pauseTime * Game1.dialogueWidth); - Rectangle destinationRectangle2 = new Rectangle(x2, y2, width, 32); - Game1.spriteBatch.Draw(Game1.staminaRect, destinationRectangle2, Color.DimGray); + spriteBatch.Draw(fadeToBlackRect, graphics.GraphicsDevice.Viewport.Bounds, screenGlowColor * screenGlowAlpha); } - if (RainManager.Instance.isRaining && Game1.currentLocation != null && (bool) Game1.currentLocation.isOutdoors && !(Game1.currentLocation is Desert)) + currentLocation.drawAboveAlwaysFrontLayer(spriteBatch); + if (((player.CurrentTool != null) && (player.CurrentTool is FishingRod)) && (((player.CurrentTool as FishingRod).isTimingCast || ((player.CurrentTool as FishingRod).castingChosenCountdown > 0f)) || ((player.CurrentTool as FishingRod).fishCaught || (player.CurrentTool as FishingRod).showingTreasure))) { - Rectangle bounds = Game1.graphics.GraphicsDevice.Viewport.Bounds; - Color color = Color.Blue * 0.2f; - Game1.spriteBatch.Draw(Game1.staminaRect, bounds, color); + player.CurrentTool.draw(spriteBatch); } - if ((Game1.messagePause || Game1.globalFade) && Game1.dialogueUp && !this.takingMapScreenshot) + spriteBatch.End(); + nullable = null; + spriteBatch.Begin(SpriteSortMode.FrontToBack, BlendState.AlphaBlend, SamplerState.PointClamp, null, null, null, nullable); + if (eventUp && (currentLocation.currentEvent != null)) { - this.drawDialogueBox(); - } - - if (!this.takingMapScreenshot) - { - foreach (TemporaryAnimatedSprite overlayTempSprite in Game1.screenOverlayTempSprites) + foreach (NPC npc5 in currentLocation.currentEvent.actors) { - overlayTempSprite.draw(Game1.spriteBatch, localPosition: true); - } - } - - if (Game1.debugMode) - { - StringBuilder debugStringBuilder = this.DebugStringBuilderField.GetValue(); - debugStringBuilder.Clear(); - if (Game1.panMode) - { - debugStringBuilder.Append((Game1.getOldMouseX() + Game1.viewport.X) / 64); - debugStringBuilder.Append(","); - debugStringBuilder.Append((Game1.getOldMouseY() + Game1.viewport.Y) / 64); - } - else - { - debugStringBuilder.Append("player: "); - debugStringBuilder.Append(Game1.player.getStandingX() / 64); - debugStringBuilder.Append(", "); - debugStringBuilder.Append(Game1.player.getStandingY() / 64); - } - - debugStringBuilder.Append(" mouseTransparency: "); - debugStringBuilder.Append(Game1.mouseCursorTransparency); - debugStringBuilder.Append(" mousePosition: "); - debugStringBuilder.Append(Game1.getMouseX()); - debugStringBuilder.Append(","); - debugStringBuilder.Append(Game1.getMouseY()); - debugStringBuilder.Append(Environment.NewLine); - debugStringBuilder.Append(" mouseWorldPosition: "); - debugStringBuilder.Append(Game1.getMouseX() + Game1.viewport.X); - debugStringBuilder.Append(","); - debugStringBuilder.Append(Game1.getMouseY() + Game1.viewport.Y); - debugStringBuilder.Append("debugOutput: "); - debugStringBuilder.Append(Game1.debugOutput); - Game1.spriteBatch.DrawString(Game1.smallFont, debugStringBuilder, new Vector2(this.GraphicsDevice.Viewport.GetTitleSafeArea().X, this.GraphicsDevice.Viewport.GetTitleSafeArea().Y + Game1.smallFont.LineSpacing * 8), Color.Red, 0f, Vector2.Zero, 1f, SpriteEffects.None, 0.09999999f); - } - - if (Game1.showKeyHelp && !this.takingMapScreenshot) - { - Game1.spriteBatch.DrawString(Game1.smallFont, Game1.keyHelpString, new Vector2(64f, Game1.viewport.Height - 64 - (Game1.dialogueUp ? 192 + (Game1.isQuestion ? Game1.questionChoices.Count * 64 : 0) : 0) - Game1.smallFont.MeasureString(Game1.keyHelpString).Y), Color.LightGray, 0f, Vector2.Zero, 1f, SpriteEffects.None, 0.9999999f); - } - - if (Game1.activeClickableMenu != null) - { - this.DrawActiveClickableMenuField.SetValue(true); - if (Game1.activeClickableMenu is CarpenterMenu) - { - ((CarpenterMenu) Game1.activeClickableMenu).DrawPlacementSquares(Game1.spriteBatch); - } - else if (Game1.activeClickableMenu is MuseumMenu) - { - ((MuseumMenu) Game1.activeClickableMenu).DrawPlacementGrid(Game1.spriteBatch); - } - - if (!Game1.IsActiveClickableMenuUnscaled && !Game1.IsActiveClickableMenuNativeScaled) - { - try + if (npc5.isEmoting) { + Vector2 position = npc5.getLocalPosition(Game1.viewport); + if (npc5.NeedsBirdieEmoteHack()) + { + position.X += 64f; + } - events.RenderingActiveMenu.RaiseEmpty(); - Game1.activeClickableMenu.draw(Game1.spriteBatch); - events.RenderedActiveMenu.RaiseEmpty(); - } - catch (Exception ex) - { - this.Monitor.Log($"The {Game1.activeClickableMenu.GetType().FullName} menu crashed while drawing itself during end-of-night-stuff. SMAPI will force it to exit to avoid crashing the game.\n{ex.GetLogSummary()}", LogLevel.Error); - Game1.activeClickableMenu.exitThisMenu(); + position.Y -= 140f; + if (npc5.Age == 2) + { + position.Y += 32f; + } + else if (npc5.Gender == 1) + { + position.Y += 10f; + } + + spriteBatch.Draw(emoteSpriteSheet, position, new Rectangle((npc5.CurrentEmoteIndex * 0x10) % emoteSpriteSheet.Width, ((npc5.CurrentEmoteIndex * 0x10) / emoteSpriteSheet.Width) * 0x10, 0x10, 0x10), Color.White, 0f, Vector2.Zero, (float)4f, SpriteEffects.None, ((float)npc5.getStandingY()) / 10000f); } } - - } - else if (Game1.farmEvent != null) - { - Game1.farmEvent.drawAboveEverything(Game1.spriteBatch); } - if (Game1.emoteMenu != null && !this.takingMapScreenshot) - Game1.emoteMenu.draw(Game1.spriteBatch); - if (Game1.HostPaused) + spriteBatch.End(); + if (drawLighting && !IsFakedBlackScreen()) { - string s = Game1.content.LoadString("Strings\\StringsFromCSFiles:DayTimeMoneyBox.cs.10378"); - SpriteText.drawStringWithScrollCenteredAt(Game1.spriteBatch, s, 96, 32); - } - - this._spriteBatchEndMethod.Invoke(); - this.drawOverlays(Game1.spriteBatch, false); - this.renderScreenBuffer(BlendState.Opaque, toBuffer); - if (this.DrawHudField.GetValue()) - { - this.DrawDayTimeMoneyBoxMethod.Invoke(); - Game1.SetSpriteBatchBeginNextID("A-C"); - this.SpriteBatchBeginMethod.Invoke(1f); - events.RenderingHud.RaiseEmpty(); - this.DrawHUD(); - events.RenderedHud.RaiseEmpty(); - if (Game1.currentLocation != null && !(Game1.activeClickableMenu is GameMenu) && !(Game1.activeClickableMenu is QuestLog)) - Game1.currentLocation.drawAboveAlwaysFrontLayerText(Game1.spriteBatch); - - this.DrawAfterMapMethod.Invoke(); - this._spriteBatchEndMethod.Invoke(); - if (TutorialManager.Instance != null) + nullable = null; + spriteBatch.Begin(SpriteSortMode.Deferred, this.lightingBlend, SamplerState.LinearClamp, null, null, null, nullable); + Viewport viewport = base.GraphicsDevice.Viewport; + viewport.Bounds = (target_screen != null) ? target_screen.Bounds : base.GraphicsDevice.PresentationParameters.Bounds; + base.GraphicsDevice.Viewport = viewport; + float scale = options.lightingQuality / 2; + if (this.useUnscaledLighting) { - Game1.SetSpriteBatchBeginNextID("A-D"); - this.SpriteBatchBeginMethod.Invoke(Game1.options.zoomLevel); - TutorialManager.Instance.draw(Game1.spriteBatch); - this._spriteBatchEndMethod.Invoke(); + scale /= options.zoomLevel; } - this.DrawToolbarMethod.Invoke(); - this.DrawMenuMouseCursorMethod.Invoke(); + spriteBatch.Draw(lightmap, Vector2.Zero, new Rectangle?(lightmap.Bounds), Color.White, 0f, Vector2.Zero, scale, SpriteEffects.None, 1f); + if ((IsRainingHere(null) && (currentLocation.isOutdoors != null)) && !(currentLocation is Desert)) + { + spriteBatch.Draw(staminaRect, viewport.Bounds, Color.OrangeRed * 0.45f); + } + + spriteBatch.End(); } - if (this.DrawHudField.GetValue() || Game1.player.CanMove) this.DrawVirtualJoypadMethod.Invoke(); - this.DrawFadeToBlackFullScreenRectMethod.Invoke(); - Game1.SetSpriteBatchBeginNextID("A-E"); - this.SpriteBatchBeginMethod.Invoke(1f); - this.DrawChatBoxMethod.Invoke(); - this._spriteBatchEndMethod.Invoke(); - if (this.DrawActiveClickableMenuField.GetValue()) + nullable = null; + spriteBatch.Begin(SpriteSortMode.Deferred, BlendState.AlphaBlend, SamplerState.PointClamp, null, null, null, nullable); + if (drawGrid) { - try + int x = -Game1.viewport.X % 0x40; + float num13 = -Game1.viewport.Y % 0x40; + for (int i = x; i < graphics.GraphicsDevice.Viewport.Width; i += 0x40) { - if (Game1.activeClickableMenu is DialogueBox) - { - Game1.BackupViewportAndZoom(true); - this.SpriteBatchBeginMethod.Invoke(Game1.NativeZoomLevel); - events.RenderingActiveMenu.RaiseEmpty(); - this._spriteBatchEndMethod.Invoke(); - Game1.RestoreViewportAndZoom(); - - this.DrawDialogueBoxForPinchZoomMethod.Invoke(); - - Game1.BackupViewportAndZoom(true); - this.SpriteBatchBeginMethod.Invoke(Game1.NativeZoomLevel); - events.RenderedActiveMenu.RaiseEmpty(); - this._spriteBatchEndMethod.Invoke(); - Game1.RestoreViewportAndZoom(); - } - if (Game1.IsActiveClickableMenuUnscaled && !(Game1.activeClickableMenu is DialogueBox)) - { - Game1.BackupViewportAndZoom(); - this.SpriteBatchBeginMethod.Invoke(1f); - events.RenderingActiveMenu.RaiseEmpty(); - this._spriteBatchEndMethod.Invoke(); - Game1.RestoreViewportAndZoom(); - - this.DrawUnscaledActiveClickableMenuForPinchZoomMethod.Invoke(); - - Game1.BackupViewportAndZoom(); - this.SpriteBatchBeginMethod.Invoke(1f); - events.RenderedActiveMenu.RaiseEmpty(); - this._spriteBatchEndMethod.Invoke(); - Game1.RestoreViewportAndZoom(); - } - if (Game1.IsActiveClickableMenuNativeScaled) - { - Game1.BackupViewportAndZoom(true); - this.SpriteBatchBeginMethod.Invoke(Game1.NativeZoomLevel); - events.RenderingActiveMenu.RaiseEmpty(); - this._spriteBatchEndMethod.Invoke(); - Game1.RestoreViewportAndZoom(); - - this.DrawNativeScaledActiveClickableMenuForPinchZoomMethod.Invoke(); - - Game1.BackupViewportAndZoom(true); - this.SpriteBatchBeginMethod.Invoke(Game1.NativeZoomLevel); - events.RenderedActiveMenu.RaiseEmpty(); - this._spriteBatchEndMethod.Invoke(); - Game1.RestoreViewportAndZoom(); - } - } - catch (Exception ex) - { - this.Monitor.Log($"The {Game1.activeClickableMenu.GetType().FullName} menu crashed while drawing itself during end-of-night-stuff. SMAPI will force it to exit to avoid crashing the game.\n{ex.GetLogSummary()}", LogLevel.Error); - Game1.activeClickableMenu.exitThisMenu(); + spriteBatch.Draw(staminaRect, new Rectangle(i, (int)num13, 1, graphics.GraphicsDevice.Viewport.Height), Color.Red * 0.5f); } - if (Game1.IsActiveClickableMenuNativeScaled) - this.SpriteBatchBeginMethod.Invoke(Game1.NativeZoomLevel); - else - this.SpriteBatchBeginMethod.Invoke(Game1.options.zoomLevel); - events.Rendered.RaiseEmpty(); - this._spriteBatchEndMethod.Invoke(); + for (float j = num13; j < graphics.GraphicsDevice.Viewport.Height; j += 64f) + { + spriteBatch.Draw(staminaRect, new Rectangle(x, (int)j, graphics.GraphicsDevice.Viewport.Width, 1), Color.Red * 0.5f); + } + } + + if (ShouldShowOnscreenUsernames() && (currentLocation != null)) + { + currentLocation.DrawFarmerUsernames(spriteBatch); + } + + if ((currentBillboard != 0) && !this.takingMapScreenshot) + { + this.drawBillboard(); + } + + if (((!eventUp && (Game1.farmEvent == null)) && ((currentBillboard == 0) && (Game1.gameMode == 3))) && (!this.takingMapScreenshot && isOutdoorMapSmallerThanViewport())) + { + spriteBatch.Draw(fadeToBlackRect, new Rectangle(0, 0, -Game1.viewport.X, graphics.GraphicsDevice.Viewport.Height), Color.Black); + spriteBatch.Draw(fadeToBlackRect, new Rectangle(-Game1.viewport.X + (currentLocation.map.Layers[0].LayerWidth * 0x40), 0, graphics.GraphicsDevice.Viewport.Width - (-Game1.viewport.X + (currentLocation.map.Layers[0].LayerWidth * 0x40)), graphics.GraphicsDevice.Viewport.Height), Color.Black); + spriteBatch.Draw(fadeToBlackRect, new Rectangle(0, 0, graphics.GraphicsDevice.Viewport.Width, -Game1.viewport.Y), Color.Black); + spriteBatch.Draw(fadeToBlackRect, new Rectangle(0, -Game1.viewport.Y + (currentLocation.map.Layers[0].LayerHeight * 0x40), graphics.GraphicsDevice.Viewport.Width, graphics.GraphicsDevice.Viewport.Height - (-Game1.viewport.Y + (currentLocation.map.Layers[0].LayerHeight * 0x40))), Color.Black); + } + + spriteBatch.End(); + PushUIMode(); + nullable = null; + spriteBatch.Begin(SpriteSortMode.Deferred, BlendState.AlphaBlend, SamplerState.PointClamp, null, null, null, nullable); + if (((displayHUD || eventUp) && ((currentBillboard == 0) && (Game1.gameMode == 3))) && ((!freezeControls && !panMode) && (!HostPaused && !this.takingMapScreenshot))) + { + this.drawHUD(); + if (!this.takingMapScreenshot) + { + this.DrawGreenPlacementBoundsMethod.Invoke(); + } + } + else if (Game1.activeClickableMenu == null) + { + FarmEvent farmEvent = Game1.farmEvent; + } + + if ((hudMessages.Count > 0) && !this.takingMapScreenshot) + { + for (int i = hudMessages.Count - 1; i >= 0; i--) + { + hudMessages[i].draw(spriteBatch, i); + } + } + + spriteBatch.End(); + PopUIMode(); + nullable = null; + spriteBatch.Begin(SpriteSortMode.Deferred, BlendState.AlphaBlend, SamplerState.PointClamp, null, null, null, nullable); + } + + if (Game1.farmEvent != null) + { + Game1.farmEvent.draw(spriteBatch); + spriteBatch.End(); + nullable = null; + spriteBatch.Begin(SpriteSortMode.Deferred, BlendState.AlphaBlend, SamplerState.PointClamp, null, null, null, nullable); + } + + PushUIMode(); + if (((dialogueUp && !nameSelectUp) && !messagePause) && (((Game1.activeClickableMenu == null) || !(Game1.activeClickableMenu is DialogueBox)) && !this.takingMapScreenshot)) + { + this.drawDialogueBox(); + } + + if (progressBar && !this.takingMapScreenshot) + { + spriteBatch.Draw(fadeToBlackRect, new Rectangle((graphics.GraphicsDevice.Viewport.GetTitleSafeArea().Width - dialogueWidth) / 2, graphics.GraphicsDevice.Viewport.GetTitleSafeArea().Bottom - 0x80, dialogueWidth, 0x20), Color.LightGray); + spriteBatch.Draw(staminaRect, new Rectangle((graphics.GraphicsDevice.Viewport.GetTitleSafeArea().Width - dialogueWidth) / 2, graphics.GraphicsDevice.Viewport.GetTitleSafeArea().Bottom - 0x80, (int)((pauseAccumulator / pauseTime) * dialogueWidth), 0x20), Color.DimGray); + } + + spriteBatch.End(); + PopUIMode(); + nullable = null; + spriteBatch.Begin(SpriteSortMode.Deferred, BlendState.AlphaBlend, SamplerState.PointClamp, null, null, null, nullable); + if ((eventUp && (currentLocation != null)) && (currentLocation.currentEvent != null)) + { + currentLocation.currentEvent.drawAfterMap(spriteBatch); + } + + if (((!IsFakedBlackScreen() && IsRainingHere(null)) && ((currentLocation != null) && (currentLocation.isOutdoors != null))) && !(currentLocation is Desert)) + { + spriteBatch.Draw(staminaRect, graphics.GraphicsDevice.Viewport.Bounds, Color.Blue * 0.2f); + } + + if (((fadeToBlack || globalFade) && !menuUp) && ((!nameSelectUp || messagePause) && !this.takingMapScreenshot)) + { + spriteBatch.End(); + PushUIMode(); + nullable = null; + spriteBatch.Begin(SpriteSortMode.Deferred, BlendState.AlphaBlend, SamplerState.PointClamp, null, null, null, nullable); + spriteBatch.Draw(fadeToBlackRect, graphics.GraphicsDevice.Viewport.Bounds, Color.Black * ((Game1.gameMode == 0) ? (1f - fadeToBlackAlpha) : fadeToBlackAlpha)); + spriteBatch.End(); + PopUIMode(); + nullable = null; + spriteBatch.Begin(SpriteSortMode.Deferred, BlendState.AlphaBlend, SamplerState.PointClamp, null, null, null, nullable); + } + else if ((flashAlpha > 0f) && !this.takingMapScreenshot) + { + if (options.screenFlash) + { + spriteBatch.Draw(fadeToBlackRect, graphics.GraphicsDevice.Viewport.Bounds, Color.White * Math.Min(1f, flashAlpha)); + } + + flashAlpha -= 0.1f; + } + + if ((messagePause || globalFade) && (dialogueUp && !this.takingMapScreenshot)) + { + this.drawDialogueBox(); + } + + if (!this.takingMapScreenshot) + { + List.Enumerator enumerator7; + using (enumerator7 = screenOverlayTempSprites.GetEnumerator()) + { + while (enumerator7.MoveNext()) + { + enumerator7.Current.draw(spriteBatch, true, 0, 0, 1f); + } + } + + spriteBatch.End(); + PushUIMode(); + nullable = null; + spriteBatch.Begin(SpriteSortMode.Deferred, BlendState.AlphaBlend, SamplerState.PointClamp, null, null, null, nullable); + using (enumerator7 = uiOverlayTempSprites.GetEnumerator()) + { + while (enumerator7.MoveNext()) + { + enumerator7.Current.draw(spriteBatch, true, 0, 0, 1f); + } + } + + spriteBatch.End(); + PopUIMode(); + nullable = null; + spriteBatch.Begin(SpriteSortMode.Deferred, BlendState.AlphaBlend, SamplerState.PointClamp, null, null, null, nullable); + } + + if (debugMode) + { + StringBuilder text = this.DebugStringBuilderField.GetValue(); + text.Clear(); + if (panMode) + { + text.Append((int)((getOldMouseX() + Game1.viewport.X) / 0x40)); + text.Append(","); + text.Append((int)((getOldMouseY() + Game1.viewport.Y) / 0x40)); } else { - this.SpriteBatchBeginMethod.Invoke(Game1.options.zoomLevel); - events.Rendered.RaiseEmpty(); - this._spriteBatchEndMethod.Invoke(); + text.Append("player: "); + text.Append((int)(player.getStandingX() / 0x40)); + text.Append(", "); + text.Append((int)(player.getStandingY() / 0x40)); } - if (this.DrawHudField.GetValue() && Game1.hudMessages.Count > 0 && (!Game1.eventUp || Game1.isFestival())) - { - Game1.SetSpriteBatchBeginNextID("A-F"); - this.SpriteBatchBeginMethod.Invoke(Game1.NativeZoomLevel); - this.DrawHUDMessagesMethod.Invoke(); - this._spriteBatchEndMethod.Invoke(); - } - - if (Game1.CurrentEvent != null && Game1.CurrentEvent.skippable && !Game1.CurrentEvent.skipped && (Game1.activeClickableMenu == null || Game1.activeClickableMenu != null && !(Game1.activeClickableMenu is MenuWithInventory))) - { - Game1.SetSpriteBatchBeginNextID("A-G"); - this.SpriteBatchBeginMethod.Invoke(Game1.NativeZoomLevel); - Game1.CurrentEvent.DrawSkipButton(Game1.spriteBatch); - this._spriteBatchEndMethod.Invoke(); - } - - this.DrawTutorialUIMethod.Invoke(); + text.Append(" mouseTransparency: "); + text.Append(mouseCursorTransparency); + text.Append(" mousePosition: "); + text.Append(getMouseX()); + text.Append(","); + text.Append(getMouseY()); + text.Append(Environment.NewLine); + text.Append(" mouseWorldPosition: "); + text.Append((int)(getMouseX() + Game1.viewport.X)); + text.Append(","); + text.Append((int)(getMouseY() + Game1.viewport.Y)); + text.Append(" debugOutput: "); + text.Append(debugOutput); + spriteBatch.DrawString(smallFont, text, new Vector2((float)base.GraphicsDevice.Viewport.GetTitleSafeArea().X, (float)(base.GraphicsDevice.Viewport.GetTitleSafeArea().Y + (smallFont.LineSpacing * 8))), Color.Red, 0f, Vector2.Zero, (float)1f, SpriteEffects.None, 0.9999999f); } + + spriteBatch.End(); + PushUIMode(); + spriteBatch.Begin(SpriteSortMode.Deferred, BlendState.AlphaBlend, SamplerState.PointClamp, null, null, null, null); + if (showKeyHelp && !this.takingMapScreenshot) + { + spriteBatch.DrawString(smallFont, keyHelpString, new Vector2(64f, ((Game1.viewport.Height - 0x40) - (dialogueUp ? (0xc0 + (isQuestion ? (questionChoices.Count * 0x40) : 0)) : 0)) - smallFont.MeasureString(keyHelpString).Y), Color.LightGray, 0f, Vector2.Zero, (float)1f, SpriteEffects.None, 0.9999999f); + } + + if ((Game1.activeClickableMenu != null) && !this.takingMapScreenshot) + { + for (IClickableMenu menu4 = Game1.activeClickableMenu; menu4 != null; menu4 = menu4.GetChildMenu()) + { + menu4.draw(spriteBatch); + } + } + else if (Game1.farmEvent != null) + { + Game1.farmEvent.drawAboveEverything(spriteBatch); + } + + if (specialCurrencyDisplay != null) + { + specialCurrencyDisplay.Draw(spriteBatch); + } + + if ((emoteMenu != null) && !this.takingMapScreenshot) + { + emoteMenu.draw(spriteBatch); + } + + if (HostPaused && !this.takingMapScreenshot) + { + string s = content.LoadString(@"Strings\StringsFromCSFiles:DayTimeMoneyBox.cs.10378"); + SpriteText.drawStringWithScrollBackground(spriteBatch, s, 0x60, 0x20, "", 1f, -1, SpriteText.ScrollTextAlignment.Left); + } + + spriteBatch.End(); + this.drawOverlays(spriteBatch); + PopUIMode(); } } } diff --git a/src/SMAPI/Framework/SGameRunner.cs b/src/SMAPI/Framework/SGameRunner.cs index 213fe561..e021263a 100644 --- a/src/SMAPI/Framework/SGameRunner.cs +++ b/src/SMAPI/Framework/SGameRunner.cs @@ -53,6 +53,12 @@ namespace StardewModdingAPI.Framework /// The singleton instance. public static SGameRunner Instance => (SGameRunner)GameRunner.instance; +#if SMAPI_FOR_MOBILE + public bool IsGameSuspended; + + public bool IsAfterInitialize = false; +#endif + /********* ** Public methods diff --git a/src/SMAPI/Framework/StateTracking/LocationTracker.cs b/src/SMAPI/Framework/StateTracking/LocationTracker.cs index 8ba1bee1..7ed6baf7 100644 --- a/src/SMAPI/Framework/StateTracking/LocationTracker.cs +++ b/src/SMAPI/Framework/StateTracking/LocationTracker.cs @@ -70,17 +70,19 @@ namespace StardewModdingAPI.Framework.StateTracking this.Location = location; // init watchers - this.BuildingsWatcher = location is BuildableGameLocation buildableLocation ? WatcherFactory.ForNetCollection(buildableLocation.buildings) : WatcherFactory.ForImmutableCollection(); + this.BuildingsWatcher = location is BuildableGameLocation buildableLocation ? + WatcherFactory.ForNetCollection($"{this.Name}.{nameof(buildableLocation.buildings)}", buildableLocation.buildings) : + WatcherFactory.ForImmutableCollection(); #if SMAPI_FOR_MOBILE - this.DebrisWatcher = WatcherFactory.ForNetCollection(location.debris.debrisNetCollection); - // this.DebrisWatcher = WatcherFactory.ForNetCollection($"{this.Name}.{nameof(location.debris)}", location.debris); + // this.DebrisWatcher = WatcherFactory.ForNetCollection(location.debris.debrisNetCollection); + this.DebrisWatcher = WatcherFactory.ForNetCollection($"{this.Name}.{nameof(location.debris)}", location.debris); #else this.DebrisWatcher = WatcherFactory.ForNetCollection(location.debris); #endif - this.LargeTerrainFeaturesWatcher = WatcherFactory.ForNetCollection(location.largeTerrainFeatures); - this.NpcsWatcher = WatcherFactory.ForNetCollection(location.characters); - this.ObjectsWatcher = WatcherFactory.ForNetDictionary(location.netObjects); - this.TerrainFeaturesWatcher = WatcherFactory.ForNetDictionary(location.terrainFeatures); + this.LargeTerrainFeaturesWatcher = WatcherFactory.ForNetCollection($"{this.Name}.{nameof(location.largeTerrainFeatures)}", location.largeTerrainFeatures); + this.NpcsWatcher = WatcherFactory.ForNetCollection($"{this.Name}.{nameof(location.characters)}", location.characters); + this.ObjectsWatcher = WatcherFactory.ForNetDictionary($"{this.Name}.{nameof(location.netObjects)}", location.netObjects); + this.TerrainFeaturesWatcher = WatcherFactory.ForNetDictionary($"{this.Name}.{nameof(location.terrainFeatures)}", location.terrainFeatures); this.FurnitureWatcher = WatcherFactory.ForNetCollection($"{this.Name}.{nameof(location.furniture)}", location.furniture); this.Watchers.AddRange(new IWatcher[] diff --git a/src/SMAPI/Framework/StateTracking/WorldLocationsTracker.cs b/src/SMAPI/Framework/StateTracking/WorldLocationsTracker.cs index ca6988ad..cbb09bf2 100644 --- a/src/SMAPI/Framework/StateTracking/WorldLocationsTracker.cs +++ b/src/SMAPI/Framework/StateTracking/WorldLocationsTracker.cs @@ -60,9 +60,9 @@ namespace StardewModdingAPI.Framework.StateTracking /// The game's list of locations. /// The game's list of active mine locations. /// The game's list of active volcano locations. - public WorldLocationsTracker(ObservableCollection locations, IList activeMineLocations, IList activeVolcanoLocations) + public WorldLocationsTracker(IList locations, IList activeMineLocations, IList activeVolcanoLocations) { - this.LocationListWatcher = WatcherFactory.ForObservableCollection($"{this.Name}.{nameof(locations)}", locations); + this.LocationListWatcher = WatcherFactory.ForReferenceList($"{this.Name}.{nameof(locations)}", locations); this.MineLocationListWatcher = WatcherFactory.ForReferenceList($"{this.Name}.{nameof(activeMineLocations)}", activeMineLocations); this.VolcanoLocationListWatcher = WatcherFactory.ForReferenceList($"{this.Name}.{nameof(activeVolcanoLocations)}", activeVolcanoLocations); } diff --git a/src/SMAPI/Framework/Translator.cs b/src/SMAPI/Framework/Translator.cs index 3beee250..adc78a82 100644 --- a/src/SMAPI/Framework/Translator.cs +++ b/src/SMAPI/Framework/Translator.cs @@ -41,7 +41,7 @@ namespace StardewModdingAPI.Framework /// Set the current locale and pre-cache translations. /// The current locale. /// The game's current language code. - [MemberNotNull(nameof(Translator.ForLocale), nameof(Translator.Locale))] + // [MemberNotNull(nameof(Translator.ForLocale), nameof(Translator.Locale))] public void SetLocale(string locale, LocalizedContentManager.LanguageCode localeEnum) { this.Locale = locale.ToLower().Trim(); diff --git a/src/SMAPI/Framework/WatcherCore.cs b/src/SMAPI/Framework/WatcherCore.cs index 35f27cc7..82cdeccb 100644 --- a/src/SMAPI/Framework/WatcherCore.cs +++ b/src/SMAPI/Framework/WatcherCore.cs @@ -57,7 +57,7 @@ namespace StardewModdingAPI.Framework /// Construct an instance. /// Manages input visible to the game. /// The observable list of game locations. - public WatcherCore(SInputState inputState, ObservableCollection gameLocations) + public WatcherCore(SInputState inputState, IList gameLocations) { // init watchers this.CursorWatcher = WatcherFactory.ForEquatable(nameof(inputState.CursorPosition), () => inputState.CursorPosition); diff --git a/src/SMAPI/IMultiplayerPeer.cs b/src/SMAPI/IMultiplayerPeer.cs index 8b0062b5..faaefba4 100644 --- a/src/SMAPI/IMultiplayerPeer.cs +++ b/src/SMAPI/IMultiplayerPeer.cs @@ -19,7 +19,7 @@ namespace StardewModdingAPI bool IsSplitScreen { get; } /// Whether the player has SMAPI installed. - [MemberNotNullWhen(true, nameof(IMultiplayerPeer.Platform), nameof(IMultiplayerPeer.GameVersion), nameof(IMultiplayerPeer.ApiVersion), nameof(IMultiplayerPeer.Mods))] + // [MemberNotNullWhen(true, nameof(IMultiplayerPeer.Platform), nameof(IMultiplayerPeer.GameVersion), nameof(IMultiplayerPeer.ApiVersion), nameof(IMultiplayerPeer.Mods))] bool HasSmapi { get; } /// The player's screen ID, if applicable. diff --git a/src/SMAPI/Metadata/CoreAssetPropagator.cs b/src/SMAPI/Metadata/CoreAssetPropagator.cs index 4cf457e7..9cc2f342 100644 --- a/src/SMAPI/Metadata/CoreAssetPropagator.cs +++ b/src/SMAPI/Metadata/CoreAssetPropagator.cs @@ -444,7 +444,7 @@ namespace StardewModdingAPI.Metadata return true; #if SMAPI_FOR_MOBILE - case "loosesprites\\mobileatlas_manually_made": // Game1.LoadContent + case "loosesprites/mobileatlas_manually_made": // Game1.LoadContent Game1.mobileSpriteSheet = content.Load(key); Game1.dayTimeMoneyBox.questButton.texture = Game1.mobileSpriteSheet; Game1.dayTimeMoneyBox.buttonF8.texture = Game1.mobileSpriteSheet; @@ -452,49 +452,6 @@ namespace StardewModdingAPI.Metadata return true; #endif - /**** - ** Content\TileSheets - ****/ - case "tilesheets\\critters": // Critter constructor - this.ReloadCritterTextures(content, key); - return true; - - case "tilesheets\\crops": // Game1.LoadContent - Game1.cropSpriteSheet = content.Load(key); - return true; - - case "tilesheets\\debris": // Game1.LoadContent - Game1.debrisSpriteSheet = content.Load(key); - return true; - - case "tilesheets\\emotes": // Game1.LoadContent - Game1.emoteSpriteSheet = content.Load(key); - return true; - - case "tilesheets\\furniture": // Game1.LoadContent - Furniture.furnitureTexture = content.Load(key); - return true; - - case "tilesheets\\projectiles": // Game1.LoadContent - Projectile.projectileSheet = content.Load(key); - return true; - - case "tilesheets\\rain": // Game1.LoadContent - Game1.rainTexture = content.Load(key); - return true; - - case "tilesheets\\tools": // Game1.ResetToolSpriteSheet -#if SMAPI_FOR_MOBILE - Game1.toolSpriteSheet = content.Load(key); -#else - Game1.ResetToolSpriteSheet(); -#endif - return true; - - case "tilesheets\\weapons": // Game1.LoadContent - Tool.weaponsTexture = content.Load(key); - return true; - case "loosesprites/suspensionbridge": // SuspensionBridge constructor return changed | (!ignoreWorld && this.UpdateSuspensionBridges(content, assetName)); diff --git a/src/SMAPI/Metadata/InstructionMetadata.cs b/src/SMAPI/Metadata/InstructionMetadata.cs index 23ac0917..8dcf24bd 100644 --- a/src/SMAPI/Metadata/InstructionMetadata.cs +++ b/src/SMAPI/Metadata/InstructionMetadata.cs @@ -1,10 +1,6 @@ using System; using System.Collections.Generic; -#if HARMONY_2 using HarmonyLib; -#else -using Harmony; -#endif using Microsoft.Xna.Framework.Content; using Microsoft.Xna.Framework.Graphics; using StardewModdingAPI.Events; @@ -29,7 +25,7 @@ namespace StardewModdingAPI.Metadata *********/ /// The assembly names to which to heuristically detect broken references. /// The current implementation only works correctly with assemblies that should always be present. - private readonly ISet ValidateReferencesToAssemblies = new HashSet { "StardewModdingAPI", "Stardew Valley", "StardewValley", "Netcode" }; + private readonly HashSet ValidateReferencesToAssemblies = new() { "StardewModdingAPI", "Stardew Valley", "StardewValley", "Netcode" }; private readonly IMonitor Monitor; @@ -57,9 +53,13 @@ namespace StardewModdingAPI.Metadata yield return new FieldReplaceRewriter() .AddField(typeof(DecoratableLocation), "furniture", typeof(GameLocation), nameof(GameLocation.furniture)) .AddField(typeof(Farm), "resourceClumps", typeof(GameLocation), nameof(GameLocation.resourceClumps)) +#if SMAPI_FOR_MOBILE + .AddField(typeof(ItemGrabMenu), "context", typeof(ItemGrabMenu), "specialObject") +#endif .AddField(typeof(MineShaft), "resourceClumps", typeof(GameLocation), nameof(GameLocation.resourceClumps)); #if SMAPI_FOR_MOBILE +#if SMAPI_LEGACY_PATCH // Redirect reference yield return new TypeFieldToAnotherTypePropertyRewriter(typeof(Game1), typeof(Game1Methods), "isRaining", nameof(Game1Methods.IsRainingProp)); #if !ANDROID_TARGET_MOBILE_LEGACY @@ -67,10 +67,12 @@ namespace StardewModdingAPI.Metadata #endif yield return new TypeFieldToAnotherTypePropertyRewriter(typeof(Game1), typeof(Game1Methods), "isDebrisWeather", nameof(Game1Methods.IsDebrisWeatherProp)); yield return new TypeFieldToAnotherTypePropertyRewriter(typeof(Game1), typeof(Game1Methods), "rainDrops", nameof(Game1Methods.RainDropsProp)); - yield return new TypeFieldToAnotherTypePropertyRewriter(typeof(Game1), typeof(WeatherDebrisManager), "debrisWeather","weatherDebrisList", "Instance"); + + // yield return new TypeFieldToAnotherTypePropertyRewriter(typeof(Game1), typeof(WeatherDebrisManager), "debrisWeather","weatherDebrisList", "Instance"); +#endif yield return new TypeFieldToAnotherTypePropertyRewriter(typeof(Game1), typeof(Game1Methods), "onScreenMenus", "onScreenMenus"); yield return new PropertyToFieldRewriter(typeof(Game1), "toolSpriteSheet", "toolSpriteSheet"); - yield return new TypeFieldToAnotherTypeFieldRewriter(typeof(GameLocation), typeof(DebrisManager), "debris", this.Monitor, "debrisNetCollection"); + // yield return new TypeFieldToAnotherTypeFieldRewriter(typeof(GameLocation), typeof(DebrisManager), "debris", this.Monitor, "debrisNetCollection"); // Menu fix yield return new TypeFieldToAnotherTypePropertyRewriter(typeof(MenuWithInventory), typeof(MenuWithInventoryMethods), "trashCan", nameof(MenuWithInventoryMethods.TrashCanProp)); @@ -89,22 +91,16 @@ namespace StardewModdingAPI.Metadata yield return new MethodParentRewriter(typeof(Game1), typeof(Game1Methods)); yield return new MethodParentRewriter(typeof(IClickableMenu), typeof(IClickableMenuMethods)); yield return new MethodParentRewriter(typeof(SpriteText), typeof(SpriteTextMethods)); - yield return new MethodParentRewriter(typeof(NPC), typeof(NPCMethods)); yield return new MethodParentRewriter(typeof(Utility), typeof(UtilityMethods)); //Constructor Rewrites yield return new MethodParentRewriter(typeof(MapPage), typeof(MapPageMethods)); yield return new MethodParentRewriter(typeof(ItemGrabMenu), typeof(ItemGrabMenuMethods)); - yield return new MethodParentRewriter(typeof(WeatherDebris), typeof(WeatherDebrisMethods)); - yield return new MethodParentRewriter(typeof(Debris), typeof(DebrisMethods)); yield return new MethodParentRewriter(typeof(InventoryMenu), typeof(InventoryMenuMethods)); yield return new MethodParentRewriter(typeof(MenuWithInventory), typeof(MenuWithInventoryMethods)); yield return new MethodParentRewriter(typeof(GameMenu), typeof(GameMenuMethods)); yield return new MethodParentRewriter(typeof(CraftingPageMobile), typeof(CraftingPageMobileMethods)); - //Field Rewriters - yield return new FieldReplaceRewriter(typeof(ItemGrabMenu), "context", "specialObject"); - #endif // heuristic rewrites @@ -129,15 +125,9 @@ namespace StardewModdingAPI.Metadata // MonoMod fix if (!Constants.HarmonyEnabled) { -#if HARMONY_2 yield return new MethodToAnotherStaticMethodRewriter(typeof(Harmony), (method) => method.Name == "Patch", typeof(HarmonyInstanceMethods), "Patch"); yield return new MethodToAnotherStaticMethodRewriter(typeof(Harmony), (method) => method.Name == "PatchAll" && method.Parameters.Count == 0, typeof(HarmonyInstanceMethods), "PatchAll"); yield return new MethodToAnotherStaticMethodRewriter(typeof(Harmony), (method) => method.Name == "PatchAll" && method.Parameters.Count == 1, typeof(HarmonyInstanceMethods), "PatchAllToAssembly"); -#else - yield return new MethodToAnotherStaticMethodRewriter(typeof(HarmonyInstance), (method) => method.Name == "Patch", typeof(HarmonyInstanceMethods), "Patch"); - yield return new MethodToAnotherStaticMethodRewriter(typeof(HarmonyInstance), (method) => method.Name == "PatchAll" && method.Parameters.Count == 0, typeof(HarmonyInstanceMethods), "PatchAll"); - yield return new MethodToAnotherStaticMethodRewriter(typeof(HarmonyInstance), (method) => method.Name == "PatchAll" && method.Parameters.Count == 1, typeof(HarmonyInstanceMethods), "PatchAllToAssembly"); -#endif } if(Constants.RewriteMissing) diff --git a/src/SMAPI/Mobile/IsExternalInit.cs b/src/SMAPI/Mobile/IsExternalInit.cs new file mode 100644 index 00000000..66a88a4c --- /dev/null +++ b/src/SMAPI/Mobile/IsExternalInit.cs @@ -0,0 +1,7 @@ +using System.ComponentModel; + +namespace System.Runtime.CompilerServices +{ + [EditorBrowsable(EditorBrowsableState.Never)] + internal class IsExternalInit{} +} diff --git a/src/SMAPI/Mobile/MobileMemoryExtension.cs b/src/SMAPI/Mobile/MobileMemoryExtension.cs new file mode 100644 index 00000000..034d72a5 --- /dev/null +++ b/src/SMAPI/Mobile/MobileMemoryExtension.cs @@ -0,0 +1,23 @@ +namespace System; +using Internal.Runtime.CompilerServices; +using System.Collections.Generic; +using System.Globalization; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; +using System.Text; + +public static class MobileMemoryExtension +{ + + /// Indicates whether a specified value is found in a read-only span. Values are compared using IEquatable{T}.Equals(T). + /// The span to search. + /// The value to search for. + /// The type of the span. + /// + /// if found, otherwise. + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static bool Contains(this ReadOnlySpan span, T value) where T : IEquatable + { + return span.IndexOf(value) >= 0; + } +} diff --git a/src/SMAPI/Mobile/MobileTypeExtension.cs b/src/SMAPI/Mobile/MobileTypeExtension.cs new file mode 100644 index 00000000..a51847b0 --- /dev/null +++ b/src/SMAPI/Mobile/MobileTypeExtension.cs @@ -0,0 +1,34 @@ +namespace System; + +using System.Collections; +using System.Collections.Generic; +using System.Diagnostics; +using System.Diagnostics.CodeAnalysis; +using System.Globalization; +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; +using System.Threading; + +public static class MobileTypeExtension +{ + + /// Determines whether the current type can be assigned to a variable of the specified . + /// The type to compare with the current type. + /// + /// if any of the following conditions is true: + /// + /// - The current instance and represent the same type. + /// + /// - The current type is derived either directly or indirectly from . The current type is derived directly from if it inherits from ; the current type is derived indirectly from if it inherits from a succession of one or more classes that inherit from . + /// + /// - is an interface that the current type implements. + /// + /// - The current type is a generic type parameter, and represents one of the constraints of the current type. + /// + /// - The current type represents a value type, and represents Nullable<c> (Nullable(Of c) in Visual Basic). + /// + /// if none of these conditions are true, or if or is . + public static bool IsAssignableTo(this Type type, [NotNullWhen(true)] Type? targetType) => (object) targetType != null && targetType.IsAssignableFrom(type); + +} diff --git a/src/SMAPI/Patches/JunimoHarvesterPatch.cs b/src/SMAPI/Patches/JunimoHarvesterPatch.cs index ebc8adbf..fabcc488 100644 --- a/src/SMAPI/Patches/JunimoHarvesterPatch.cs +++ b/src/SMAPI/Patches/JunimoHarvesterPatch.cs @@ -4,13 +4,9 @@ using System.Diagnostics.CodeAnalysis; using System.Linq; using System.Reflection; using System.Reflection.Emit; -#if HARMONY_2 using HarmonyLib; -#else -using Harmony; -#endif using Microsoft.Xna.Framework; -using StardewModdingAPI.Framework.Patching; +using StardewModdingAPI.Internal.Patching; using StardewValley; using StardewValley.Buildings; using StardewValley.Characters; @@ -21,7 +17,7 @@ namespace StardewModdingAPI.Patches /// Patch methods must be static for Harmony to work correctly. See the Harmony documentation before renaming patch arguments. [SuppressMessage("ReSharper", "InconsistentNaming", Justification = "Argument names are defined by Harmony and methods are named for clarity.")] [SuppressMessage("ReSharper", "IdentifierTypo", Justification = "Argument names are defined by Harmony and methods are named for clarity.")] - internal class JunimoHarvesterPatch : IHarmonyPatch + internal class JunimoHarvesterPatch : BasePatcher { /********* ** Fields @@ -43,22 +39,9 @@ namespace StardewModdingAPI.Patches /********* ** Public methods *********/ - /// Construct an instance. - /// Writes messages to the console and log file on behalf of the game. - public JunimoHarvesterPatch(IMonitor monitor) - { - Monitor = monitor; - } - /// Apply the Harmony patch. /// The Harmony instance. - public void Apply( -#if HARMONY_2 - Harmony harmony -#else - HarmonyInstance harmony -#endif - ) + public override void Apply(Harmony harmony, IMonitor monitor) { harmony.Patch( original: AccessTools.DeclaredConstructor(typeof(JunimoHarvester), new System.Type[] { typeof(Vector2), typeof(JunimoHut), typeof(int), typeof(Color?)}), @@ -67,6 +50,13 @@ namespace StardewModdingAPI.Patches ); } + /// Construct an instance. + /// Writes messages to the console and log file on behalf of the game. + public JunimoHarvesterPatch(IMonitor monitor) + { + Monitor = monitor; + } + /********* ** Private methods diff --git a/src/SMAPI/Patches/LocationSwitchPatch.cs b/src/SMAPI/Patches/LocationSwitchPatch.cs index ee30af08..d5a8de9c 100644 --- a/src/SMAPI/Patches/LocationSwitchPatch.cs +++ b/src/SMAPI/Patches/LocationSwitchPatch.cs @@ -1,12 +1,8 @@ #if SMAPI_FOR_MOBILE using System; using System.Diagnostics.CodeAnalysis; -#if HARMONY_2 using HarmonyLib; -#else -using Harmony; -#endif -using StardewModdingAPI.Framework.Patching; +using StardewModdingAPI.Internal.Patching; using StardewValley; using StardewValley.Characters; @@ -16,7 +12,7 @@ namespace StardewModdingAPI.Patches /// Patch methods must be static for Harmony to work correctly. See the Harmony documentation before renaming patch arguments. [SuppressMessage("ReSharper", "InconsistentNaming", Justification = "Argument names are defined by Harmony and methods are named for clarity.")] [SuppressMessage("ReSharper", "IdentifierTypo", Justification = "Argument names are defined by Harmony and methods are named for clarity.")] - internal class LocationSwitchPatch : IHarmonyPatch + internal class LocationSwitchPatch : BasePatcher { /********* ** Fields @@ -47,13 +43,7 @@ namespace StardewModdingAPI.Patches /// Apply the Harmony patch. /// The Harmony instance. - public void Apply( -#if HARMONY_2 - Harmony harmony -#else - HarmonyInstance harmony -#endif - ) + public override void Apply(Harmony harmony, IMonitor monitor) { harmony.Patch( original: AccessTools.Property(typeof(Game1), "currentLocation").SetMethod, diff --git a/src/SMAPI/Patches/MusicBankPatch.cs b/src/SMAPI/Patches/MusicBankPatch.cs index 7c1ebed6..e0110bd9 100644 --- a/src/SMAPI/Patches/MusicBankPatch.cs +++ b/src/SMAPI/Patches/MusicBankPatch.cs @@ -3,19 +3,15 @@ using System; using System.Collections.Generic; using System.Diagnostics.CodeAnalysis; using System.IO; -using Microsoft.AppCenter.Crashes; -#if HARMONY_2 +// using Microsoft.AppCenter.Crashes; using HarmonyLib; -#else -using Harmony; -#endif using StardewModdingAPI.Framework; -using StardewModdingAPI.Framework.Patching; +using StardewModdingAPI.Internal.Patching; using StardewValley; namespace StardewModdingAPI.Patches { - internal class MusicBankPatch : IHarmonyPatch + internal class MusicBankPatch : BasePatcher { /********* ** Accessors @@ -37,7 +33,7 @@ namespace StardewModdingAPI.Patches /// Apply the Harmony patch. /// The Harmony instance. - public void Apply(HarmonyInstance harmony) + public override void Apply(Harmony harmony, IMonitor monitor) { harmony.Patch(AccessTools.Method(typeof(Game1), "FetchMusicXWBPath"), new HarmonyMethod(AccessTools.Method(this.GetType(), nameof(MusicBankPatch.Game_FetchMusicXWBPathPrefix)))); @@ -68,7 +64,7 @@ namespace StardewModdingAPI.Patches } catch (System.Exception ex) { - Microsoft.AppCenter.Crashes.Crashes.TrackError(ex, (IDictionary) null, Array.Empty()); + // Microsoft.AppCenter.Crashes.Crashes.TrackError(ex, (IDictionary) null, Array.Empty()); return true; } __result = str; diff --git a/src/SMAPI/Patches/OnAppPausePatch.cs b/src/SMAPI/Patches/OnAppPausePatch.cs index 8751dc3e..95f8e31f 100644 --- a/src/SMAPI/Patches/OnAppPausePatch.cs +++ b/src/SMAPI/Patches/OnAppPausePatch.cs @@ -2,18 +2,14 @@ using System; using System.Diagnostics.CodeAnalysis; using System.Reflection; -#if HARMONY_2 using HarmonyLib; -#else -using Harmony; -#endif using StardewModdingAPI.Framework; -using StardewModdingAPI.Framework.Patching; +using StardewModdingAPI.Internal.Patching; using StardewValley; namespace StardewModdingAPI.Patches { - internal class OnAppPausePatch : IHarmonyPatch + internal class OnAppPausePatch : BasePatcher { /********* ** Accessors @@ -35,19 +31,11 @@ namespace StardewModdingAPI.Patches /// Apply the Harmony patch. /// The Harmony instance. -#if HARMONY_2 - public void Apply(Harmony harmony) + public override void Apply(Harmony harmony, IMonitor monitor) { harmony.Patch(AccessTools.Method(typeof(Game1), nameof(Game1.OnAppPause)), - finalizer:new HarmonyMethod(AccessTools.Method(this.GetType(), nameof(OnAppPausePatch.Game_OnAppPauseFinalizer)))); + finalizer: new HarmonyMethod(AccessTools.Method(this.GetType(), nameof(OnAppPausePatch.Game_OnAppPauseFinalizer)))); } -#else - public void Apply(HarmonyInstance harmony) - { - harmony.Patch(AccessTools.Method(typeof(Game1), nameof(Game1.OnAppPause)), - new HarmonyMethod(AccessTools.Method(this.GetType(), nameof(OnAppPausePatch.Game_OnAppPausePrefix)))); - } -#endif /********* ** Private methods @@ -55,36 +43,16 @@ namespace StardewModdingAPI.Patches /// The method to call instead of . /// This method must be static for Harmony to work correctly. See the Harmony documentation before renaming arguments. [SuppressMessage("ReSharper", "InconsistentNaming", Justification = "Argument names are defined by Harmony.")] -#if HARMONY_2 private static Exception Game_OnAppPauseFinalizer(Exception __exception) { if (__exception != null) { OnAppPausePatch.Monitor.Log($"Failed during OnAppPause method :\n{__exception.InnerException ?? __exception}", LogLevel.Error); } + return null; } -#else - private static bool Game_OnAppPausePrefix(Game1 __instance, MethodInfo __originalMethod) - { - const string key = nameof(OnAppPausePatch.Game_OnAppPausePrefix); - if (!PatchHelper.StartIntercept(key)) - return true; - try - { - __originalMethod.Invoke(__instance, new object[] { }); - } - catch (Exception ex) - { - OnAppPausePatch.Monitor.Log($"Failed during OnAppPause method :\n{ex.InnerException ?? ex}", LogLevel.Error); - } - finally - { - PatchHelper.StopIntercept(key); - } - return false; - } } -#endif } #endif + diff --git a/src/SMAPI/Patches/SaveBackupPatch.cs b/src/SMAPI/Patches/SaveBackupPatch.cs index 4a437b67..74c4c247 100644 --- a/src/SMAPI/Patches/SaveBackupPatch.cs +++ b/src/SMAPI/Patches/SaveBackupPatch.cs @@ -2,19 +2,15 @@ using System; using System.Diagnostics.CodeAnalysis; using System.Reflection; -#if HARMONY_2 using HarmonyLib; -#else -using Harmony; -#endif using StardewModdingAPI.Framework; using StardewModdingAPI.Framework.Events; -using StardewModdingAPI.Framework.Patching; +using StardewModdingAPI.Internal.Patching; using StardewValley; namespace StardewModdingAPI.Patches { - internal class SaveBackupPatch : IHarmonyPatch + internal class SaveBackupPatch : BasePatcher { /********* ** Accessors @@ -44,8 +40,7 @@ namespace StardewModdingAPI.Patches /// Apply the Harmony patch. /// The Harmony instance. -#if HARMONY_2 - public void Apply(Harmony harmony) + public override void Apply(Harmony harmony, IMonitor monitor) { MethodInfo makeFullBackup = AccessTools.Method(typeof(Game1), nameof(Game1.MakeFullBackup)); MethodInfo saveWholeBackup = AccessTools.Method(typeof(Game1), nameof(Game1.saveWholeBackup)); @@ -56,25 +51,13 @@ namespace StardewModdingAPI.Patches harmony.Patch(makeFullBackup, new HarmonyMethod(prefix), finalizer: new HarmonyMethod(finalizer)); harmony.Patch(saveWholeBackup, new HarmonyMethod(prefix), finalizer: new HarmonyMethod(finalizer)); } -#else - public void Apply(HarmonyInstance harmony) - { - MethodInfo makeFullBackup = AccessTools.Method(typeof(Game1), nameof(Game1.MakeFullBackup)); - MethodInfo saveWholeBackup = AccessTools.Method(typeof(Game1), nameof(Game1.saveWholeBackup)); - MethodInfo prefix = AccessTools.Method(this.GetType(), nameof(SaveBackupPatch.GameSave_Prefix)); - - harmony.Patch(makeFullBackup, new HarmonyMethod(prefix)); - harmony.Patch(saveWholeBackup, new HarmonyMethod(prefix)); - } -#endif /********* ** Private methods *********/ /// The method to call instead of . /// This method must be static for Harmony to work correctly. See the Harmony documentation before renaming arguments. [SuppressMessage("ReSharper", "InconsistentNaming", Justification = "Argument names are defined by Harmony.")] -#if HARMONY_2 private static bool GameSave_Prefix() { SaveBackupPatch.Events.Saving.RaiseEmpty(); @@ -92,30 +75,6 @@ namespace StardewModdingAPI.Patches SaveBackupPatch.Events.Saved.RaiseEmpty(); return null; } -#else - private static bool GameSave_Prefix(MethodInfo __originalMethod) - { - const string key = nameof(SaveBackupPatch.GameSave_Prefix); - if (!PatchHelper.StartIntercept(key)) - return true; - SaveBackupPatch.Events.Saving.RaiseEmpty(); - try - { - __originalMethod.Invoke(null, new object[] { }); - } - catch (Exception ex) - { - SaveBackupPatch.Monitor.Log($"Failed to save the game :\n{ex.InnerException ?? ex}", LogLevel.Error); - Game1.addHUDMessage(new HUDMessage("An error occurs during save the game.Check the error log for details.", HUDMessage.error_type)); - } - finally - { - PatchHelper.StopIntercept(key); - } - SaveBackupPatch.Events.Saved.RaiseEmpty(); - return false; - } -#endif } } #endif diff --git a/src/SMAPI/Patches/SaveGamePatch.cs b/src/SMAPI/Patches/SaveGamePatch.cs index d6b1a9b4..77a2b74a 100644 --- a/src/SMAPI/Patches/SaveGamePatch.cs +++ b/src/SMAPI/Patches/SaveGamePatch.cs @@ -4,21 +4,17 @@ using System.Collections.Generic; using System.Diagnostics.CodeAnalysis; using System.IO; using System.Reflection; -#if HARMONY_2 using HarmonyLib; -#else -using Harmony; -#endif -using Microsoft.AppCenter.Crashes; +// using Microsoft.AppCenter.Crashes; using Microsoft.Xna.Framework; using StardewModdingAPI.Framework; -using StardewModdingAPI.Framework.Patching; +using StardewModdingAPI.Internal.Patching; using StardewValley; using StardewValley.Menus; namespace StardewModdingAPI.Patches { - internal class SaveGamePatch : IHarmonyPatch + internal class SaveGamePatch : BasePatcher { /********* ** Accessors @@ -47,8 +43,7 @@ namespace StardewModdingAPI.Patches /// Apply the Harmony patch. /// The Harmony instance. -#if HARMONY_2 - public void Apply(Harmony harmony) + public override void Apply(Harmony harmony, IMonitor monitor) { harmony.Patch( original: AccessTools.Method(typeof(SaveGame), "HandleLoadError"), @@ -59,19 +54,6 @@ namespace StardewModdingAPI.Patches finalizer: new HarmonyMethod(this.GetType(), nameof(SaveGamePatch.SaveGameMenu_UpdateFinalizer)) ); } -#else - public void Apply(HarmonyInstance harmony) - { - harmony.Patch( - original: AccessTools.Method(typeof(SaveGame), "HandleLoadError"), - prefix: new HarmonyMethod(this.GetType(), nameof(SaveGamePatch.Prefix)) - ); - harmony.Patch( - original: AccessTools.Method(typeof(SaveGameMenu), "update"), - prefix: new HarmonyMethod(this.GetType(), nameof(SaveGamePatch.SaveGameMenu_UpdatePrefix)) - ); - } -#endif /********* ** Private methods @@ -138,8 +120,8 @@ namespace StardewModdingAPI.Patches } catch (Exception ex) { - ErrorAttachmentLog[] errorAttachmentLogArray = Array.Empty(); - Crashes.TrackError(ex, null, errorAttachmentLogArray); + // ErrorAttachmentLog[] errorAttachmentLogArray = Array.Empty(); + // Crashes.TrackError(ex, null, errorAttachmentLogArray); failed = true; } } @@ -174,7 +156,6 @@ namespace StardewModdingAPI.Patches /// The method to call instead of . /// This method must be static for Harmony to work correctly. See the Harmony documentation before renaming arguments. [SuppressMessage("ReSharper", "InconsistentNaming", Justification = "Argument names are defined by Harmony.")] -#if HARMONY_2 private static Exception SaveGameMenu_UpdateFinalizer(SaveGameMenu __instance, Exception __exception) { if(__exception != null) { @@ -184,29 +165,6 @@ namespace StardewModdingAPI.Patches } return null; } -#else - private static bool SaveGameMenu_UpdatePrefix(SaveGameMenu __instance, GameTime time, MethodInfo __originalMethod) - { - const string key = nameof(SaveGamePatch.SaveGameMenu_UpdatePrefix); - if (!PatchHelper.StartIntercept(key)) - return true; - try - { - __originalMethod.Invoke(__instance, new object[] {time}); - } - catch (Exception ex) - { - SaveGamePatch.Monitor.Log($"Failed during SaveGameMenu.update method :\n{ex.InnerException ?? ex}", LogLevel.Error); - __instance.complete(); - Game1.addHUDMessage(new HUDMessage("An error occurs during save the game.Check the error log for details.", HUDMessage.error_type)); - } - finally - { - PatchHelper.StopIntercept(key); - } - return false; - } -#endif } } #endif diff --git a/src/SMAPI/Patches/SpriteFontPatch.cs b/src/SMAPI/Patches/SpriteFontPatch.cs index 6b49a5d6..937d664f 100644 --- a/src/SMAPI/Patches/SpriteFontPatch.cs +++ b/src/SMAPI/Patches/SpriteFontPatch.cs @@ -1,12 +1,8 @@ #if SMAPI_FOR_MOBILE using System.Diagnostics.CodeAnalysis; -#if HARMONY_2 using HarmonyLib; -#else -using Harmony; -#endif using Microsoft.Xna.Framework.Graphics; -using StardewModdingAPI.Framework.Patching; +using StardewModdingAPI.Internal.Patching; using StardewValley.Characters; namespace StardewModdingAPI.Patches @@ -15,7 +11,7 @@ namespace StardewModdingAPI.Patches /// Patch methods must be static for Harmony to work correctly. See the Harmony documentation before renaming patch arguments. [SuppressMessage("ReSharper", "InconsistentNaming", Justification = "Argument names are defined by Harmony and methods are named for clarity.")] [SuppressMessage("ReSharper", "IdentifierTypo", Justification = "Argument names are defined by Harmony and methods are named for clarity.")] - internal class SpriteFontPatch : IHarmonyPatch + internal class SpriteFontPatch : BasePatcher { /********* ** Fields @@ -46,13 +42,7 @@ namespace StardewModdingAPI.Patches /// Apply the Harmony patch. /// The Harmony instance. - public void Apply( -#if HARMONY_2 - Harmony harmony -#else - HarmonyInstance harmony -#endif - ) + public override void Apply(Harmony harmony, IMonitor monitor) { harmony.Patch( original: AccessTools.Method(typeof(SpriteFont), "MeasureString", new System.Type[] { typeof(string)}), diff --git a/src/SMAPI/Patches/ThreadSilenceExitPatch.cs b/src/SMAPI/Patches/ThreadSilenceExitPatch.cs index 55a39804..ffc529d7 100644 --- a/src/SMAPI/Patches/ThreadSilenceExitPatch.cs +++ b/src/SMAPI/Patches/ThreadSilenceExitPatch.cs @@ -2,12 +2,8 @@ using System; using System.Diagnostics.CodeAnalysis; using System.Threading; -#if HARMONY_2 using HarmonyLib; -#else -using Harmony; -#endif -using StardewModdingAPI.Framework.Patching; +using StardewModdingAPI.Internal.Patching; namespace StardewModdingAPI.Patches { @@ -15,7 +11,7 @@ namespace StardewModdingAPI.Patches /// Patch methods must be static for Harmony to work correctly. See the Harmony documentation before renaming patch arguments. [SuppressMessage("ReSharper", "InconsistentNaming", Justification = "Argument names are defined by Harmony and methods are named for clarity.")] [SuppressMessage("ReSharper", "IdentifierTypo", Justification = "Argument names are defined by Harmony and methods are named for clarity.")] - internal class ThreadSilenceExitPatch : IHarmonyPatch + internal class ThreadSilenceExitPatch : BasePatcher { /********* ** Fields @@ -46,23 +42,13 @@ namespace StardewModdingAPI.Patches /// Apply the Harmony patch. /// The Harmony instance. -#if HARMONY_2 - public void Apply(Harmony harmony) + public override void Apply(Harmony harmony, IMonitor monitor) { harmony.Patch( original: AccessTools.Method(Type.GetType("System.Threading.ThreadHelper"), "ThreadStart_Context"), finalizer: new HarmonyMethod(this.GetType(), nameof(ThreadSilenceExitPatch.ThreadStart_Finalizer)) ); } -#else - public void Apply(HarmonyInstance harmony) - { - harmony.Patch( - original: AccessTools.Method(Type.GetType("System.Threading.ThreadHelper"), "ThreadStart_Context"), - prefix: new HarmonyMethod(this.GetType(), nameof(ThreadSilenceExitPatch.ThreadStart_Finalizer)) - ); - } -#endif /********* ** Private methods @@ -70,7 +56,6 @@ namespace StardewModdingAPI.Patches /// The method to call instead of . /// The thread context. /// Returns whether to execute the original method. -#if HARMONY_2 private static Exception ThreadStart_Finalizer(Exception __exception) { if (__exception != null) { @@ -78,29 +63,6 @@ namespace StardewModdingAPI.Patches } return null; } -#else - private static bool ThreadStart_Finalizer(object state) - { - try - { - object _start = state.GetType().GetField("_start", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance).GetValue(state); - if (_start is ThreadStart) - { - ((ThreadStart)_start)(); - } - else - { - object _startArg = state.GetType().GetField("_startArg", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance).GetValue(state); - ((ParameterizedThreadStart)_start)(_startArg); - } - } - catch (Exception ex) - { - Monitor.Log($"Thread failed:\n{ex.InnerException ?? ex}", LogLevel.Error); - } - return false; - } -#endif } } #endif diff --git a/src/SMAPI/Resources/Resource.designer.cs b/src/SMAPI/Resources/Resource.designer.cs index cc1e943b..03941b5c 100644 --- a/src/SMAPI/Resources/Resource.designer.cs +++ b/src/SMAPI/Resources/Resource.designer.cs @@ -14,7 +14,7 @@ namespace StardewModdingAPI { - [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Xamarin.Android.Build.Tasks", "1.0.0.0")] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Xamarin.Android.Build.Tasks", "13.1.0.5")] public partial class Resource { @@ -244,97 +244,73 @@ namespace StardewModdingAPI public static int action_text = 2131034115; // aapt resource value: 0x7F050005 - public static int appIcon = 2131034117; + public static int async = 2131034117; // aapt resource value: 0x7F050006 - public static int async = 2131034118; + public static int blocking = 2131034118; // aapt resource value: 0x7F050007 - public static int blocking = 2131034119; + public static int chronometer = 2131034119; // aapt resource value: 0x7F050008 - public static int chronometer = 2131034120; + public static int forever = 2131034120; // aapt resource value: 0x7F050009 - public static int description = 2131034121; + public static int icon = 2131034121; // aapt resource value: 0x7F05000A - public static int forever = 2131034122; + public static int icon_group = 2131034122; // aapt resource value: 0x7F05000B - public static int icon = 2131034123; + public static int info = 2131034123; // aapt resource value: 0x7F05000C - public static int icon_group = 2131034124; + public static int italic = 2131034124; // aapt resource value: 0x7F05000D - public static int info = 2131034125; + public static int line1 = 2131034125; // aapt resource value: 0x7F05000E - public static int italic = 2131034126; + public static int line3 = 2131034126; // aapt resource value: 0x7F05000F - public static int line1 = 2131034127; + public static int normal = 2131034127; // aapt resource value: 0x7F050010 - public static int line3 = 2131034128; + public static int notification_background = 2131034128; // aapt resource value: 0x7F050011 - public static int normal = 2131034129; + public static int notification_main_column = 2131034129; // aapt resource value: 0x7F050012 - public static int notificationLayout = 2131034130; + public static int notification_main_column_container = 2131034130; // aapt resource value: 0x7F050013 - public static int notification_background = 2131034131; + public static int right_icon = 2131034131; // aapt resource value: 0x7F050014 - public static int notification_main_column = 2131034132; + public static int right_side = 2131034132; // aapt resource value: 0x7F050015 - public static int notification_main_column_container = 2131034133; + public static int tag_transition_group = 2131034133; // aapt resource value: 0x7F050016 - public static int progress_bar = 2131034134; + public static int tag_unhandled_key_event_manager = 2131034134; // aapt resource value: 0x7F050017 - public static int progress_bar_frame = 2131034135; + public static int tag_unhandled_key_listeners = 2131034135; // aapt resource value: 0x7F050018 - public static int progress_text = 2131034136; + public static int text = 2131034136; // aapt resource value: 0x7F050019 - public static int right_icon = 2131034137; + public static int text2 = 2131034137; // aapt resource value: 0x7F05001A - public static int right_side = 2131034138; + public static int time = 2131034138; // aapt resource value: 0x7F05001B - public static int spacer = 2131034139; - - // aapt resource value: 0x7F05001C - public static int tag_transition_group = 2131034140; - - // aapt resource value: 0x7F05001D - public static int tag_unhandled_key_event_manager = 2131034141; - - // aapt resource value: 0x7F05001E - public static int tag_unhandled_key_listeners = 2131034142; - - // aapt resource value: 0x7F05001F - public static int text = 2131034143; - - // aapt resource value: 0x7F050020 - public static int text2 = 2131034144; - - // aapt resource value: 0x7F050021 - public static int time = 2131034145; - - // aapt resource value: 0x7F050022 - public static int time_remaining = 2131034146; - - // aapt resource value: 0x7F050023 - public static int title = 2131034147; + public static int title = 2131034139; static Id() { @@ -383,9 +359,6 @@ namespace StardewModdingAPI // aapt resource value: 0x7F070005 public static int notification_template_part_time = 2131165189; - // aapt resource value: 0x7F070006 - public static int status_bar_ongoing_event_progress_bar = 2131165190; - static Layout() { global::Android.Runtime.ResourceIdManager.UpdateIdValues(); @@ -406,76 +379,7 @@ namespace StardewModdingAPI public static int hello = 2131230721; // aapt resource value: 0x7F080002 - public static int kilobytes_per_second = 2131230722; - - // aapt resource value: 0x7F080003 - public static int notification_download_complete = 2131230723; - - // aapt resource value: 0x7F080004 - public static int notification_download_failed = 2131230724; - - // aapt resource value: 0x7F080005 - public static int state_completed = 2131230725; - - // aapt resource value: 0x7F080006 - public static int state_connecting = 2131230726; - - // aapt resource value: 0x7F080007 - public static int state_downloading = 2131230727; - - // aapt resource value: 0x7F080008 - public static int state_failed = 2131230728; - - // aapt resource value: 0x7F080009 - public static int state_failed_cancelled = 2131230729; - - // aapt resource value: 0x7F08000A - public static int state_failed_fetching_url = 2131230730; - - // aapt resource value: 0x7F08000B - public static int state_failed_sdcard_full = 2131230731; - - // aapt resource value: 0x7F08000C - public static int state_failed_unlicensed = 2131230732; - - // aapt resource value: 0x7F08000D - public static int state_fetching_url = 2131230733; - - // aapt resource value: 0x7F08000E - public static int state_idle = 2131230734; - - // aapt resource value: 0x7F08000F - public static int state_paused_by_request = 2131230735; - - // aapt resource value: 0x7F080010 - public static int state_paused_network_setup_failure = 2131230736; - - // aapt resource value: 0x7F080011 - public static int state_paused_network_unavailable = 2131230737; - - // aapt resource value: 0x7F080012 - public static int state_paused_roaming = 2131230738; - - // aapt resource value: 0x7F080013 - public static int state_paused_sdcard_unavailable = 2131230739; - - // aapt resource value: 0x7F080014 - public static int state_paused_wifi_disabled = 2131230740; - - // aapt resource value: 0x7F080015 - public static int state_paused_wifi_unavailable = 2131230741; - - // aapt resource value: 0x7F080016 - public static int state_unknown = 2131230742; - - // aapt resource value: 0x7F080017 - public static int status_bar_notification_info_overflow = 2131230743; - - // aapt resource value: 0x7F080018 - public static int time_remaining = 2131230744; - - // aapt resource value: 0x7F080019 - public static int time_remaining_notification = 2131230745; + public static int status_bar_notification_info_overflow = 2131230722; static String() { @@ -491,40 +395,25 @@ namespace StardewModdingAPI { // aapt resource value: 0x7F090000 - public static int ButtonBackground = 2131296256; + public static int TextAppearance_Compat_Notification = 2131296256; // aapt resource value: 0x7F090001 - public static int NotificationText = 2131296257; + public static int TextAppearance_Compat_Notification_Info = 2131296257; // aapt resource value: 0x7F090002 - public static int NotificationTextSecondary = 2131296258; + public static int TextAppearance_Compat_Notification_Line2 = 2131296258; // aapt resource value: 0x7F090003 - public static int NotificationTextShadow = 2131296259; + public static int TextAppearance_Compat_Notification_Time = 2131296259; // aapt resource value: 0x7F090004 - public static int NotificationTitle = 2131296260; + public static int TextAppearance_Compat_Notification_Title = 2131296260; // aapt resource value: 0x7F090005 - public static int TextAppearance_Compat_Notification = 2131296261; + public static int Widget_Compat_NotificationActionContainer = 2131296261; // aapt resource value: 0x7F090006 - public static int TextAppearance_Compat_Notification_Info = 2131296262; - - // aapt resource value: 0x7F090007 - public static int TextAppearance_Compat_Notification_Line2 = 2131296263; - - // aapt resource value: 0x7F090008 - public static int TextAppearance_Compat_Notification_Time = 2131296264; - - // aapt resource value: 0x7F090009 - public static int TextAppearance_Compat_Notification_Title = 2131296265; - - // aapt resource value: 0x7F09000A - public static int Widget_Compat_NotificationActionContainer = 2131296266; - - // aapt resource value: 0x7F09000B - public static int Widget_Compat_NotificationActionText = 2131296267; + public static int Widget_Compat_NotificationActionText = 2131296262; static Style() { diff --git a/src/SMAPI/SGameConsole.cs b/src/SMAPI/SGameConsole.cs index 01e55788..85bfbbe3 100644 --- a/src/SMAPI/SGameConsole.cs +++ b/src/SMAPI/SGameConsole.cs @@ -108,10 +108,10 @@ namespace StardewModdingAPI this.isVisible = false; Game1.activeClickableMenu = null; Game1.playSound("bigDeSelect"); - SMainActivity.Instance.core.CommandQueue.Enqueue(command); + SMainActivity.Instance.core.RawCommandQueue.Add(command); return; } - SMainActivity.Instance.core.CommandQueue.Enqueue(command); + SMainActivity.Instance.core.RawCommandQueue.Add(command); } } diff --git a/src/SMAPI/SMAPI.csproj b/src/SMAPI/SMAPI.csproj index 4df2c9e1..c611d153 100644 --- a/src/SMAPI/SMAPI.csproj +++ b/src/SMAPI/SMAPI.csproj @@ -18,8 +18,8 @@ Resources\Resource.designer.cs Off false - MonoAndroid - v10.0 + v12.0 + net5.0-android true $(DefineConstants) @@ -33,7 +33,6 @@ prompt 4 latest - 8.0 armeabi-v7a;x86;arm64-v8a;x86_64 @@ -44,7 +43,7 @@ $(DefineConstants);TRACE prompt 4 - 8.0 + latest armeabi-v7a;x86;arm64-v8a;x86_64 false None @@ -70,7 +69,7 @@ app.manifest - + @@ -85,7 +84,6 @@ - @@ -115,99 +113,24 @@ - - - 2.0.0 - - - 2.0.0 - - - 2.0.0 - - - - - - - + - ..\..\..\Downloads\StardewValleyAndroidStuff\base_1.4.5.151\assemblies_decrypt\StardewValley.dll + ..\..\..\Downloads\StardewValleyAndroidStuff\base_1.5.6.31\assemblies\StardewValley.dll - ..\..\..\Downloads\StardewValleyAndroidStuff\base_1.4.5.151\assemblies_decrypt\StardewValley.GameData.dll + ..\..\..\Downloads\StardewValleyAndroidStuff\base_1.5.6.31\assemblies\StardewValley.GameData.dll - ..\..\..\Downloads\StardewValleyAndroidStuff\base_1.4.5.151\assemblies_decrypt\xTile.dll + ..\..\..\Downloads\StardewValleyAndroidStuff\base_1.5.6.31\assemblies\xTile.dll - - - - - ..\..\..\Downloads\StardewValleyAndroidStuff\base_1.4.5.145\assemblies\StardewValley.dll - - - ..\..\..\Downloads\StardewValleyAndroidStuff\base_1.4.5.145\assemblies\StardewValley.GameData.dll - - - ..\..\..\Downloads\StardewValleyAndroidStuff\base_1.4.5.145\assemblies\MonoGame.Framework.dll - - - ..\..\..\Downloads\StardewValleyAndroidStuff\base_1.4.5.145\assemblies\xTile.dll - - - - - - ..\..\..\Downloads\StardewValleyAndroidStuff\base_1.4.4.128\assemblies\StardewValley.dll - - - ..\..\..\Downloads\StardewValleyAndroidStuff\base_1.4.4.128\assemblies\MonoGame.Framework.dll - - - ..\..\..\Downloads\StardewValleyAndroidStuff\base_1.4.4.128\assemblies\xTile.dll - - - - - - ..\..\..\Downloads\StardewValleyAndroidStuff\samsung_base_1.4.5.144\assemblies\StardewValley.dll - - - ..\..\..\Downloads\StardewValleyAndroidStuff\samsung_base_1.4.5.144\assemblies\StardewValley.GameData.dll - - - ..\..\..\Downloads\StardewValleyAndroidStuff\samsung_base_1.4.5.144\assemblies\MonoGame.Framework.dll - - - ..\..\..\Downloads\StardewValleyAndroidStuff\samsung_base_1.4.5.144\assemblies\xTile.dll - - - - - - ..\..\..\Downloads\StardewValleyAndroidStuff\amazon_base_1.4.5.144\assemblies\StardewValley.dll - - - ..\..\..\Downloads\StardewValleyAndroidStuff\amazon_base_1.4.5.144\assemblies\StardewValley.GameData.dll - - - ..\..\..\Downloads\StardewValleyAndroidStuff\amazon_base_1.4.5.144\assemblies\MonoGame.Framework.dll - - - ..\..\..\Downloads\StardewValleyAndroidStuff\amazon_base_1.4.5.144\assemblies\xTile.dll + + ..\..\..\Downloads\StardewValleyAndroidStuff\base_1.5.6.31\assemblies\BmFont.dll - - 3.6.0.862 - - ..\..\..\Downloads\StardewValleyAndroidStuff\base_1.4.5.145\assemblies\MonoGame.Framework.dll - - - ..\..\..\Downloads\StardewValleyAndroidStuff\base_1.4.5.145\assemblies\MonoGame.Framework.Content.Pipeline.dll + ..\..\..\Downloads\StardewValleyAndroidStuff\base_1.5.6.31\assemblies\MonoGame.Framework.dll @@ -219,45 +142,39 @@ ..\..\build\0Harmony.dll - - ..\Loader\libs\MonoMod.RuntimeDetour.dll - - - ..\Loader\libs\MonoMod.Utils.dll - - ..\SMAPI.Toolkit\bin\Debug\net4.5\SMAPI.Toolkit.dll + ..\SMAPI.Toolkit\bin\Debug\netstandard2.0\SMAPI.Toolkit.dll - ..\SMAPI.Toolkit.CoreInterfaces\bin\Debug\net4.5\SMAPI.Toolkit.CoreInterfaces.dll + ..\SMAPI.Toolkit.CoreInterfaces\bin\Debug\netstandard2.0\SMAPI.Toolkit.CoreInterfaces.dll - - ..\Loader\libs\TMXTile.dll - - - ..\Loader\libs\Microsoft.AppCenter.dll - - - ..\Loader\libs\Microsoft.AppCenter.Analytics.dll - - - ..\Loader\libs\Microsoft.AppCenter.Analytics.Android.Bindings.dll - - - ..\Loader\libs\Microsoft.AppCenter.Android.Bindings.dll - - - ..\Loader\libs\Microsoft.AppCenter.Crashes.dll - - - ..\Loader\libs\Microsoft.AppCenter.Crashes.Android.Bindings.dll - - - + + 3.8.1.303 + + + 2.88.3 + 28.0.0.3 + + 28.0.0.3 + + + + + + + ..\..\build\Pintail.dll + + + ..\..\build\TMXTile.dll + + + + + @@ -274,6 +191,10 @@ + + + + diff --git a/src/SMAPI/SMainActivity.cs b/src/SMAPI/SMainActivity.cs index 002cdd43..7c94fae2 100644 --- a/src/SMAPI/SMainActivity.cs +++ b/src/SMAPI/SMainActivity.cs @@ -7,7 +7,6 @@ using Android.Runtime; using Android.Support.V4.App; using Android.Support.V4.Content; using Android.Views; -using Google.Android.Vending.Licensing; using System; using System.Collections.Generic; using StardewModdingAPI.Framework; @@ -16,9 +15,7 @@ using System.Reflection; using Java.Interop; using System.Linq; using File = Java.IO.File; -using Microsoft.AppCenter; using Newtonsoft.Json; -using Microsoft.AppCenter.Crashes; using Android.Content; using Android.Util; using Java.Lang; @@ -29,17 +26,9 @@ using Thread = System.Threading.Thread; namespace StardewModdingAPI { [Activity(Label = "SMAPI Stardew Valley", Icon = "@mipmap/ic_launcher", Theme = "@style/Theme.Splash", MainLauncher = true, AlwaysRetainTaskState = true, LaunchMode = LaunchMode.SingleInstance, ScreenOrientation = ScreenOrientation.SensorLandscape, ConfigurationChanges = (ConfigChanges.Keyboard | ConfigChanges.KeyboardHidden | ConfigChanges.Orientation | ConfigChanges.ScreenLayout | ConfigChanges.ScreenSize | ConfigChanges.UiMode))] -#if !ANDROID_TARGET_GOOGLE public class SMainActivity: MainActivity -#else - public class SMainActivity : MainActivity, ILicenseCheckerCallback, IJavaObject, IDisposable, IJavaPeerable -#endif { internal SCore core; - private LicenseChecker _licenseChecker; -#if ANDROID_TARGET_GOOGLE - private ServerManagedPolicyExtended _serverManagedPolicyExtended; -#endif public static SMainActivity Instance; @@ -124,10 +113,6 @@ namespace StardewModdingAPI } catch (Exception) { } } - Type[] services = {typeof(Microsoft.AppCenter.Analytics.Analytics), typeof(Microsoft.AppCenter.Crashes.Crashes)}; - AppCenter.Start(Constants.MicrosoftAppSecret, services); - AppCenter.SetUserId(Constants.ApiVersion.ToString()); - } catch { @@ -164,7 +149,7 @@ namespace StardewModdingAPI modPath = "StardewValley/Mods"; } - this.core = new SCore(System.IO.Path.Combine(EarlyConstants.StorageBasePath, modPath), false); + this.core = new SCore(System.IO.Path.Combine(EarlyConstants.StorageBasePath, modPath), false, false); this.core.RunInteractively(); typeof(MainActivity).GetField("_game1", BindingFlags.Instance | BindingFlags.NonPublic)?.SetValue(this, this.core.Game); @@ -187,7 +172,6 @@ namespace StardewModdingAPI SAlertDialogUtil.AlertMessage($"SMAPI failed to initialize: {ex}", callback: type => { - Crashes.TrackError(ex); this.Finish(); }); } @@ -223,49 +207,8 @@ namespace StardewModdingAPI private void CheckUsingServerManagedPolicy() { -#if ANDROID_TARGET_GOOGLE - this._serverManagedPolicyExtended = new ServerManagedPolicyExtended(this, new AESObfuscator(new byte[15] - { - 46, - 65, - 30, - 128, - 103, - 57, - 74, - 64, - 51, - 88, - 95, - 45, - 77, - 117, - 36 - }, this.PackageName, Settings.Secure.GetString(this.ContentResolver, "android_id"))); - this._licenseChecker = new LicenseChecker(this, this._serverManagedPolicyExtended, "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAry4fecehDpCohQk4XhiIZX9ylIGUThWZxfN9qwvQyTh53hvnpQl/lCrjfflKoPz6gz5jJn6JI1PTnoBy/iXVx1+kbO99qBgJE2V8PS5pq+Usbeqqmqqzx4lEzhiYQ2um92v4qkldNYZFwbTODYPIMbSbaLm7eK9ZyemaRbg9ssAl4QYs0EVxzDK1DjuXilRk28WxiK3lNJTz4cT38bfs4q6Zvuk1vWUvnMqcxiugox6c/9j4zZS5C4+k+WY6mHjUMuwssjCY3G+aImWDSwnU3w9G41q8EoPvJ1049PIi7GJXErusTYZITmqfonyejmSFLPt8LHtux9AmJgFSrC3UhwIDAQAB"); - this._licenseChecker.CheckAccess(this); -#endif } -#if ANDROID_TARGET_GOOGLE - public new void Allow(PolicyResponse response) - { - typeof(MainActivity).GetMethod("CheckToDownloadExpansion", BindingFlags.Instance | BindingFlags.NonPublic)?.Invoke(this, null); - } - - public new void DontAllow(PolicyResponse response) - { - switch (response) - { - case PolicyResponse.Retry: - typeof(MainActivity).GetMethod("WaitThenCheckForValidLicence")?.Invoke(this, null); - break; - case PolicyResponse.Licensed: - typeof(MainActivity).GetMethod("CheckToDownloadExpansion", BindingFlags.Instance | BindingFlags.NonPublic)?.Invoke(this, null); - break; - } - } -#endif } } #endif diff --git a/src/SMAPI/Utilities/Keybind.cs b/src/SMAPI/Utilities/Keybind.cs index 3532620d..2622f376 100644 --- a/src/SMAPI/Utilities/Keybind.cs +++ b/src/SMAPI/Utilities/Keybind.cs @@ -54,7 +54,11 @@ namespace StardewModdingAPI.Utilities } // parse buttons +#if SMAPI_FOR_MOBILE + string[] rawButtons = input.Split('+', StringSplitOptions.RemoveEmptyEntries); +#else string[] rawButtons = input.Split('+', StringSplitOptions.TrimEntries); +#endif SButton[] buttons = new SButton[rawButtons.Length]; List rawErrors = new List(); for (int i = 0; i < buttons.Length; i++)