Update drawImpl logic

This commit is contained in:
zhiyang7 2023-02-04 16:31:29 +08:00
parent a797608622
commit 0f94f4609d
5 changed files with 91 additions and 814 deletions

View File

@ -8,6 +8,6 @@
<!-- <BUILD_FOR_MOBILE>SAMSUNG</BUILD_FOR_MOBILE>-->
<!-- <BUILD_FOR_MOBILE>GOOGLE_LEGACY</BUILD_FOR_MOBILE>-->
<COMPILE_WITH_PLUGIN>False</COMPILE_WITH_PLUGIN>
<DefineConstants Condition="'$(BUILD_FOR_MOBILE)' == 'GOOGLE'">SMAPI_FOR_MOBILE;ANDROID_TARGET_GOOGLE;MonoAndroid10</DefineConstants>
<DefineConstants Condition="'$(BUILD_FOR_MOBILE)' == 'GOOGLE'">SMAPI_DEPRECATED;SMAPI_FOR_MOBILE;ANDROID_TARGET_GOOGLE</DefineConstants>
</PropertyGroup>
</Project>

View File

@ -0,0 +1,29 @@
using System.Runtime.CompilerServices;
#nullable enable
namespace System.Collections.Generic
{
/// <summary>An <see cref="T:System.Collections.Generic.IEqualityComparer`1" /> that uses reference equality (<see cref="M:System.Object.ReferenceEquals(System.Object,System.Object)" />) instead of value equality (<see cref="M:System.Object.Equals(System.Object)" />) when comparing two object instances.</summary>
public sealed class ReferenceEqualityComparer : IEqualityComparer<object?>, IEqualityComparer
{
private ReferenceEqualityComparer()
{
}
/// <summary>Gets the singleton <see cref="T:System.Collections.Generic.ReferenceEqualityComparer" /> instance.</summary>
public static ReferenceEqualityComparer Instance { get; } = new ReferenceEqualityComparer();
/// <summary>Determines whether two object references refer to the same object instance.</summary>
/// <param name="x">The first object to compare.</param>
/// <param name="y">The second object to compare.</param>
/// <returns>
/// <see langword="true" /> if both <paramref name="x" /> and <paramref name="y" /> refer to the same object instance or if both are <see langword="null" />; otherwise, <see langword="false" />.</returns>
public bool Equals(object? x, object? y) => x == y;
/// <summary>Returns a hash code for the specified object. The returned hash code is based on the object identity, not on the contents of the object.</summary>
/// <param name="obj">The object for which to retrieve the hash code.</param>
/// <returns>A hash code for the identity of <paramref name="obj" />.</returns>
public int GetHashCode(object? obj) => RuntimeHelpers.GetHashCode(obj);
}
}

View File

@ -48,6 +48,7 @@
<Compile Include="Mobile\EnumerableExtension.cs" />
<Compile Include="Mobile\MobileMemoryExtension.cs" />
<Compile Include="Mobile\MobileTypeExtension.cs" />
<Compile Include="Mobile\ReferenceEqualityComparer.cs" />
<Compile Include="Resources\Resource.Designer.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
</ItemGroup>

View File

@ -289,6 +289,7 @@ namespace StardewModdingAPI
{
// add search paths
resolver.TryAddSearchDirectory(Constants.GamePath);
#if !SMAPI_FOR_MOBILE
resolver.TryAddSearchDirectory(Constants.InternalFilesPath);
// add SMAPI explicitly
@ -303,6 +304,7 @@ namespace StardewModdingAPI
// - 'Stardew Valley': assembly name on Windows;
// - 'Netcode': an assembly that was separate on Windows only before Stardew Valley 1.5.5.
resolver.AddWithExplicitNames(AssemblyDefinition.ReadAssembly(typeof(Game1).Assembly.Location), "StardewValley", "Stardew Valley", "Netcode");
#endif
}
/// <summary>Get metadata for mapping assemblies to the current platform.</summary>

View File

@ -146,7 +146,7 @@ namespace StardewModdingAPI.Framework
#if SMAPI_FOR_MOBILE
// init reflection fields
this.DebugStringBuilderField = this.Reflection.GetField<StringBuilder>(typeof(Game1), "_debugStringBuilder");
this.NewDayTaskField = this.Reflection.GetField<Task>(this, "_newDayTask");
this.NewDayTaskField = this.Reflection.GetField<Task>(typeof(Game1), "_newDayTask");
this.DrawTapToMoveTargetMethod = this.Reflection.GetMethod(this, "DrawTapToMoveTarget");
this.DrawGreenPlacementBoundsMethod = this.Reflection.GetMethod(this, "DrawGreenPlacementBounds");
@ -231,12 +231,12 @@ namespace StardewModdingAPI.Framework
/// <param name="gameTime">A snapshot of the game timing state.</param>
/// <param name="target_screen">The render target, if any.</param>
[SuppressMessage("ReSharper", "InconsistentNaming", Justification = "copied from game code as-is")]
#if SMAPI_FOR_MOBILE
protected override void _draw(GameTime gameTime, RenderTarget2D target_screen)
{
Context.IsInDrawLoop = true;
try
{
#if SMAPI_FOR_MOBILE
if (SGameConsole.Instance.isVisible)
{
Game1.game1.GraphicsDevice.SetRenderTarget(Game1.game1.screen);
@ -270,47 +270,7 @@ namespace StardewModdingAPI.Framework
Game1.spriteBatch.End();
return;
}
this.DrawImpl(gameTime, target_screen);
this.DrawCrashTimer.Reset();
}
catch (Exception ex)
{
// log error
this.Monitor.Log($"An error occured in the overridden draw loop: {ex.GetLogSummary()}", LogLevel.Error);
// exit if irrecoverable
if (!this.DrawCrashTimer.Decrement())
{
this.ExitGameImmediately("The game crashed when drawing, and SMAPI was unable to recover the game.");
return;
}
}
finally
{
// recover sprite batch
try
{
if (Game1.spriteBatch.IsOpen(this.Reflection))
{
this.Monitor.Log("Recovering sprite batch from error...");
Game1.spriteBatch.End();
}
}
catch (Exception innerEx)
{
this.Monitor.Log($"Could not recover sprite batch state: {innerEx.GetLogSummary()}", LogLevel.Error);
}
}
Context.IsInDrawLoop = false;
}
#else
protected override void _draw(GameTime gameTime, RenderTarget2D target_screen)
{
Context.IsInDrawLoop = true;
try
{
#endif
this.DrawImpl(gameTime, target_screen);
this.DrawCrashTimer.Reset();
}
@ -346,7 +306,6 @@ namespace StardewModdingAPI.Framework
}
Context.IsInDrawLoop = false;
}
#endif
#nullable disable
/// <summary>Replicate the game's draw logic with some changes for SMAPI.</summary>
@ -370,780 +329,16 @@ 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)
{
showingHealthBar = false;
if ((this.NewDayTaskField.GetValue() != null) || this.isLocalMultiplayerNewDayActive)
{
base.GraphicsDevice.Clear(bgColor);
}
else
{
Matrix? nullable;
if (target_screen != null)
{
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
{
base.GraphicsDevice.Clear(bgColor);
if (((Game1.activeClickableMenu != null) && options.showMenuBackground) && (Game1.activeClickableMenu.showWithoutTransparencyIfOptionIsSet() && !this.takingMapScreenshot))
{
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())
{
menu2.draw(spriteBatch);
}
if (specialCurrencyDisplay != null)
{
specialCurrencyDisplay.Draw(spriteBatch);
}
spriteBatch.End();
this.drawOverlays(spriteBatch);
PopUIMode();
}
else
{
if (emergencyLoading)
{
if (!SeenConcernedApeLogo)
{
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();
}
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.gameMode == 0)
{
nullable = null;
spriteBatch.Begin(SpriteSortMode.Deferred, BlendState.AlphaBlend, SamplerState.PointClamp, null, null, null, nullable);
}
else
{
if (((Game1.gameMode == 3) && (dayOfMonth == 0)) && newDay)
{
base.Draw(gameTime);
return;
}
if (drawLighting)
{
Color ambientLight;
SetRenderTarget(lightmap);
base.GraphicsDevice.Clear(Color.White * 0f);
Matrix identity = Matrix.Identity;
if (this.useUnscaledLighting)
{
identity = Matrix.CreateScale(options.zoomLevel);
}
spriteBatch.Begin(SpriteSortMode.Deferred, BlendState.NonPremultiplied, SamplerState.PointClamp, null, null, null, new Matrix?(identity));
if (currentLocation.Name.StartsWith("UndergroundMine") && (currentLocation is MineShaft))
{
ambientLight = (currentLocation as MineShaft).getLightingColor(gameTime);
}
else if (!Game1.ambientLight.Equals(Color.White) && (!IsRainingHere(null) || (currentLocation.isOutdoors == null)))
{
ambientLight = Game1.ambientLight;
}
else
{
ambientLight = outdoorLight;
}
float num8 = 1f;
if (player.hasBuff(0x1a))
{
if (ambientLight == Color.White)
{
ambientLight = new Color(0.75f, 0.75f, 0.75f);
}
else
{
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))
{
Farmer farmer = getFarmerMaybeOffline(source.PlayerID);
if (((farmer == null) || ((farmer.currentLocation != null) && (farmer.currentLocation.Name != currentLocation.Name))) || (farmer.hidden != null))
{
continue;
}
}
if (Utility.isOnScreen((Vector2)source.position, (int)((source.radius * 64f) * 4f)))
{
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);
}
}
}
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 ((farmer2.IsLocalPlayer && displayFarmer) || (farmer2.hidden == null))
{
this._farmerShadows.Add(farmer2);
}
}
}
else
{
foreach (Farmer farmer3 in currentLocation.farmers)
{
if ((farmer3.IsLocalPlayer && displayFarmer) || (farmer3.hidden == null))
{
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)))
{
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);
}
}
}
else
{
foreach (NPC npc2 in CurrentEvent.actors)
{
if ((((CurrentEvent == null) || !CurrentEvent.ShouldHideCharacter(npc2)) && ((npc2.swimming == null) && !npc2.HideShadow)) && !this.checkCharacterTilesForShadowDrawFlag(npc2))
{
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);
}
}
}
foreach (Farmer farmer4 in this._farmerShadows)
{
if (((!multiplayer.isDisconnecting(farmer4.UniqueMultiplayerID) && (farmer4.swimming == null)) && (!farmer4.isRidingHorse() && !farmer4.IsSitting())) && ((currentLocation == null) || !this.checkCharacterTilesForShadowDrawFlag(farmer4)))
{
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)))
{
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);
}
}
}
else
{
foreach (NPC npc4 in CurrentEvent.actors)
{
if ((((CurrentEvent == null) || !CurrentEvent.ShouldHideCharacter(npc4)) && ((npc4.swimming == null) && !npc4.HideShadow)) && this.checkCharacterTilesForShadowDrawFlag(npc4))
{
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);
}
}
}
foreach (Farmer farmer5 in this._farmerShadows)
{
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))
{
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);
}
}
}
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<Vector2, int> pair in crabPotOverlayTiles)
{
Vector2 key = pair.Key;
Tile tile = layer.Tiles[(int)key.X, (int)key.Y];
if (tile != null)
{
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);
}
}
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(spriteBatch);
}
if ((currentLocation.LightLevel > 0f) && (timeOfDay < 0x7d0))
{
spriteBatch.Draw(fadeToBlackRect, graphics.GraphicsDevice.Viewport.Bounds, Color.Black * currentLocation.LightLevel);
}
if (screenGlow)
{
spriteBatch.Draw(fadeToBlackRect, graphics.GraphicsDevice.Viewport.Bounds, screenGlowColor * screenGlowAlpha);
}
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)))
{
player.CurrentTool.draw(spriteBatch);
}
spriteBatch.End();
nullable = null;
spriteBatch.Begin(SpriteSortMode.FrontToBack, BlendState.AlphaBlend, SamplerState.PointClamp, null, null, null, nullable);
if (eventUp && (currentLocation.currentEvent != null))
{
foreach (NPC npc5 in currentLocation.currentEvent.actors)
{
if (npc5.isEmoting)
{
Vector2 position = npc5.getLocalPosition(Game1.viewport);
if (npc5.NeedsBirdieEmoteHack())
{
position.X += 64f;
}
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);
}
}
}
spriteBatch.End();
if (drawLighting && !IsFakedBlackScreen())
{
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)
{
scale /= options.zoomLevel;
}
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();
}
nullable = null;
spriteBatch.Begin(SpriteSortMode.Deferred, BlendState.AlphaBlend, SamplerState.PointClamp, null, null, null, nullable);
if (drawGrid)
{
int x = -Game1.viewport.X % 0x40;
float num13 = -Game1.viewport.Y % 0x40;
for (int i = x; i < graphics.GraphicsDevice.Viewport.Width; i += 0x40)
{
spriteBatch.Draw(staminaRect, new Rectangle(i, (int)num13, 1, graphics.GraphicsDevice.Viewport.Height), Color.Red * 0.5f);
}
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<TemporaryAnimatedSprite>.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
{
text.Append("player: ");
text.Append((int)(player.getStandingX() / 0x40));
text.Append(", ");
text.Append((int)(player.getStandingY() / 0x40));
}
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();
}
}
}
}
}
#else
private void DrawImpl(GameTime gameTime, RenderTarget2D target_screen)
{
var events = this.Events;
Game1.showingHealthBar = false;
#if SMAPI_FOR_MOBILE
if ((this.NewDayTaskField.GetValue() != null) || this.isLocalMultiplayerNewDayActive)
#else
if (Game1._newDayTask != null || this.isLocalMultiplayerNewDayActive)
#endif
{
base.GraphicsDevice.Clear(Game1.bgColor);
return;
@ -1217,6 +412,35 @@ namespace StardewModdingAPI.Framework
Game1.PopUIMode();
return;
}
#if SMAPI_FOR_MOBILE
if (Game1.emergencyLoading)
{
if (!Game1.SeenConcernedApeLogo)
{
Game1.PushUIMode();
Game1.spriteBatch.Begin(SpriteSortMode.Deferred, BlendState.AlphaBlend, SamplerState.PointClamp);
if (Game1.logoFadeTimer < 0x1388)
{
Game1.spriteBatch.Draw(Game1.staminaRect, new Rectangle(0, 0, Game1.viewport.Width, Game1.viewport.Height), Color.White);
}
if (Game1.logoFadeTimer > 0x1194)
{
float num = Math.Min((float)1f, (float)(((float)(Game1.logoFadeTimer - 0x1194)) / 500f));
Game1.spriteBatch.Draw(Game1.staminaRect, new Rectangle(0, 0, Game1.viewport.Width, Game1.viewport.Height), Color.Black * num);
}
Game1.spriteBatch.Draw(Game1.titleButtonsTexture, new Vector2((float)(Game1.viewport.Width / 2), (float)((Game1.viewport.Height / 2) - 90)), new Rectangle(0xab + ((((Game1.logoFadeTimer / 100) % 2) == 0) ? 0x6f : 0), 0x137, 0x6f, 60), Color.White * ((Game1.logoFadeTimer < 500) ? (((float)Game1.logoFadeTimer) / 500f) : ((Game1.logoFadeTimer > 0x1194) ? (1f - (((float)(Game1.logoFadeTimer - 0x1194)) / 500f)) : 1f)), 0f, Vector2.Zero, (float)3f, SpriteEffects.None, 0.2f);
Game1.spriteBatch.Draw(Game1.titleButtonsTexture, new Vector2((float)((Game1.viewport.Width / 2) - 0x105), (float)((Game1.viewport.Height / 2) - 0x66)), new Rectangle((((Game1.logoFadeTimer / 100) % 2) == 0) ? 0x55 : 0, 0x132, 0x55, 0x45), Color.White * ((Game1.logoFadeTimer < 500) ? (((float)Game1.logoFadeTimer) / 500f) : ((Game1.logoFadeTimer > 0x1194) ? (1f - (((float)(Game1.logoFadeTimer - 0x1194)) / 500f)) : 1f)), 0f, Vector2.Zero, (float)3f, SpriteEffects.None, 0.2f);
Game1.spriteBatch.End();
Game1.PopUIMode();
}
Game1.logoFadeTimer -= gameTime.ElapsedGameTime.Milliseconds;
return;
}
#endif
if (Game1.gameMode == 11)
{
Game1.spriteBatch.Begin(SpriteSortMode.Deferred, BlendState.AlphaBlend, SamplerState.PointClamp);
@ -1449,6 +673,12 @@ namespace StardewModdingAPI.Framework
Layer building_layer = Game1.currentLocation.Map.GetLayer("Buildings");
building_layer.Draw(Game1.mapDisplayDevice, Game1.viewport, Location.Origin, wrapAround: false, 4);
Game1.mapDisplayDevice.EndScene();
#if SMAPI_FOR_MOBILE
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((((float)(Game1.currentLocation.tapToMove.targetNPC.Sprite.SpriteWidth * 4)) / 2f) - 32f, (float)((Game1.currentLocation.tapToMove.targetNPC.GetBoundingBox().Height + (Game1.currentLocation.tapToMove.targetNPC.IsMonster ? 0 : 12)) - 0x20))), new Rectangle(0xc2, 0x184, 0x10, 0x10), Color.White, 0f, Vector2.Zero, (float)4f, SpriteEffects.None, 0.58f);
}
#endif
Game1.spriteBatch.End();
Game1.spriteBatch.Begin(SpriteSortMode.FrontToBack, BlendState.AlphaBlend, SamplerState.PointClamp);
if (!Game1.currentLocation.shouldHideCharacters())
@ -1529,6 +759,12 @@ namespace StardewModdingAPI.Framework
Game1.currentLocation.Map.GetLayer("Front").Draw(Game1.mapDisplayDevice, Game1.viewport, Location.Origin, wrapAround: false, 4);
Game1.mapDisplayDevice.EndScene();
Game1.currentLocation.drawAboveFrontLayer(Game1.spriteBatch);
#if SMAPI_FOR_MOBILE
if ((((Game1.currentLocation.tapToMove.targetNPC == null) && (Game1.displayHUD || Game1.eventUp)) && (((Game1.currentBillboard == 0) && (Game1.gameMode == 3)) && (!Game1.freezeControls && !Game1.panMode))) && !Game1.HostPaused)
{
this.DrawTapToMoveTargetMethod.Invoke();
}
#endif
Game1.spriteBatch.End();
Game1.spriteBatch.Begin(SpriteSortMode.Deferred, BlendState.AlphaBlend, SamplerState.PointClamp);
if (Game1.currentLocation.Map.GetLayer("AlwaysFront") != null)
@ -1662,6 +898,12 @@ namespace StardewModdingAPI.Framework
events.RenderingHud.RaiseEmpty();
this.drawHUD();
events.RenderedHud.RaiseEmpty();
#if SMAPI_FOR_MOBILE
if (!this.takingMapScreenshot)
{
this.DrawGreenPlacementBoundsMethod.Invoke();
}
#endif
}
else if (Game1.activeClickableMenu == null)
{
@ -1746,7 +988,11 @@ namespace StardewModdingAPI.Framework
}
if (Game1.debugMode)
{
#if SMAPI_FOR_MOBILE
StringBuilder sb = this.DebugStringBuilderField.GetValue();
#else
StringBuilder sb = Game1._debugStringBuilder;
#endif
sb.Clear();
if (Game1.panMode)
{
@ -1823,7 +1069,6 @@ namespace StardewModdingAPI.Framework
this.drawOverlays(Game1.spriteBatch);
Game1.PopUIMode();
}
#endif
#nullable enable
}
}