using System;
using System.Collections;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.Versioning;
using System.Security;
using System.Security.Permissions;
using BepInEx;
using BepInEx.Configuration;
using GODump;
using GoDump;
using UnityEngine;
[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)]
[assembly: IgnoresAccessChecksTo("Assembly-CSharp")]
[assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")]
[assembly: AssemblyCompany("GoDump")]
[assembly: AssemblyConfiguration("Release")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: AssemblyInformationalVersion("1.0.0+acd5189f2c854054f0ace83aed16070b03ad14a1")]
[assembly: AssemblyProduct("GoDump")]
[assembly: AssemblyTitle("GoDump")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("1.0.0.0")]
[module: UnverifiableCode]
namespace GODump
{
internal static class SpriteDump
{
public struct RectP
{
public int x { get; set; }
public int y { get; set; }
public int width { get; set; }
public int height { get; set; }
public int xmin { get; set; }
public int ymin { get; set; }
public int xmax { get; set; }
public int ymax { get; set; }
public RectP(int _x, int _y, int _width, int _height)
{
x = _x;
y = _y;
width = _width;
height = _height;
xmin = _x;
ymin = _y;
xmax = _x + _width - 1;
ymax = _y + _height - 1;
}
}
private static readonly Color[] colors = (Color[])(object)new Color[16777216];
public static void Tk2dFlip(ref Texture2D texture2D)
{
//IL_000e: Unknown result type (might be due to invalid IL or missing references)
//IL_0014: Expected O, but got Unknown
//IL_0023: Unknown result type (might be due to invalid IL or missing references)
Texture2D val = new Texture2D(((Texture)texture2D).height, ((Texture)texture2D).width);
for (int i = 0; i < ((Texture)texture2D).width; i++)
{
for (int j = 0; j < ((Texture)texture2D).height; j++)
{
val.SetPixel(j, i, texture2D.GetPixel(i, j));
}
}
texture2D = val;
}
public static Texture2D TextureReadHack(Texture2D in_tex)
{
//IL_0034: Unknown result type (might be due to invalid IL or missing references)
//IL_0039: Unknown result type (might be due to invalid IL or missing references)
//IL_0052: Unknown result type (might be due to invalid IL or missing references)
//IL_005e: Unknown result type (might be due to invalid IL or missing references)
//IL_0071: Expected O, but got Unknown
RenderTexture temporary = RenderTexture.GetTemporary(((Texture)in_tex).width, ((Texture)in_tex).height, 0, (RenderTextureFormat)7, (RenderTextureReadWrite)1);
Graphics.Blit((Texture)(object)in_tex, temporary);
RenderTexture active = RenderTexture.active;
RenderTexture.active = temporary;
Texture2D val = new Texture2D(((Texture)in_tex).width, ((Texture)in_tex).height);
val.ReadPixels(new Rect(0f, 0f, (float)((Texture)temporary).width, (float)((Texture)temporary).height), 0, 0);
val.Apply();
RenderTexture.active = active;
RenderTexture.ReleaseTemporary(temporary);
return val;
}
public static Texture2D SubTexture(Texture2D in_tex, RectP rectP)
{
//IL_000e: Unknown result type (might be due to invalid IL or missing references)
//IL_0013: Unknown result type (might be due to invalid IL or missing references)
//IL_003b: Unknown result type (might be due to invalid IL or missing references)
//IL_0042: Expected O, but got Unknown
Texture2D val = new Texture2D(rectP.width, rectP.height);
val.SetPixels(in_tex.GetPixels(rectP.x, rectP.y, rectP.width, rectP.height));
val.Apply();
return val;
}
public static Texture2D SubTexturePosition(Texture2D in_tex, RectP rectP)
{
//IL_000c: Unknown result type (might be due to invalid IL or missing references)
//IL_0011: Unknown result type (might be due to invalid IL or missing references)
//IL_001c: Unknown result type (might be due to invalid IL or missing references)
//IL_0060: Unknown result type (might be due to invalid IL or missing references)
//IL_0067: Expected O, but got Unknown
Texture2D val = new Texture2D(((Texture)in_tex).width, ((Texture)in_tex).height);
val.SetPixels(colors);
val.SetPixels(rectP.x, rectP.y, rectP.width, rectP.height, in_tex.GetPixels(rectP.x, rectP.y, rectP.width, rectP.height));
val.Apply();
return val;
}
public static Texture2D SpriteSizeFix(Texture2D in_tex, RectP rectP, RectP border)
{
//IL_000e: Unknown result type (might be due to invalid IL or missing references)
//IL_0014: Expected O, but got Unknown
//IL_00b5: Unknown result type (might be due to invalid IL or missing references)
Texture2D val = new Texture2D(border.width, border.height);
val.SetPixels(colors);
val.SetPixels(rectP.x, rectP.y, rectP.width, rectP.height, in_tex.GetPixels());
for (int i = 0; i < ((Texture)val).width; i++)
{
for (int j = 0; j < ((Texture)val).height; j++)
{
if (((i == rectP.xmin - 1 || i == rectP.xmax + 1) && rectP.ymin - 1 <= j && j <= rectP.ymax + 1) || (rectP.xmin - 1 <= i && i <= rectP.xmax + 1 && (j == rectP.ymin - 1 || j == rectP.ymax + 1)))
{
val.SetPixel(i, j, Color.red);
}
}
}
val.Apply();
return val;
}
public static Texture2D SpriteSizeFixError(Texture2D in_tex, RectP rectP, RectP border)
{
//IL_000e: Unknown result type (might be due to invalid IL or missing references)
//IL_0014: Expected O, but got Unknown
//IL_0256: Unknown result type (might be due to invalid IL or missing references)
Texture2D val = new Texture2D(border.width, border.height);
val.SetPixels(colors);
if (rectP.x < 0 || rectP.y < 0 || rectP.x + rectP.width > ((Texture)in_tex).width || rectP.y + rectP.height > ((Texture)in_tex).height || rectP.x + rectP.width > ((Texture)val).width || rectP.y + rectP.height > ((Texture)val).height)
{
global::GoDump.GoDump.logInfo($"Invalid rectP bounds in SpriteSizeFix for rectP: x={rectP.x}, y={rectP.y}, width={rectP.width}, height={rectP.height}. Adjusting.");
rectP.x = Mathf.Max(0, rectP.x);
rectP.y = Mathf.Max(0, rectP.y);
rectP.width = Mathf.Min(rectP.width, Mathf.Min(((Texture)in_tex).width - rectP.x, ((Texture)val).width - rectP.x));
rectP.height = Mathf.Min(rectP.height, Mathf.Min(((Texture)in_tex).height - rectP.y, ((Texture)val).height - rectP.y));
if (rectP.width <= 0 || rectP.height <= 0)
{
global::GoDump.GoDump.logInfo($"Invalid rectP after adjustment: width={rectP.width}, height={rectP.height}. Returning empty texture.");
return val;
}
}
val.SetPixels(rectP.x, rectP.y, rectP.width, rectP.height, in_tex.GetPixels(0, 0, rectP.width, rectP.height));
for (int i = 0; i < ((Texture)val).width; i++)
{
for (int j = 0; j < ((Texture)val).height; j++)
{
if (((i == rectP.xmin - 1 || i == rectP.xmax + 1) && rectP.ymin - 1 <= j && j <= rectP.ymax + 1) || (rectP.xmin - 1 <= i && i <= rectP.xmax + 1 && (j == rectP.ymin - 1 || j == rectP.ymax + 1)))
{
val.SetPixel(i, j, Color.red);
}
}
}
val.Apply();
return val;
}
public static void SaveTextureToFile(Texture2D tex, string fileName)
{
byte[] buffer = ImageConversion.EncodeToPNG(tex);
Directory.CreateDirectory(Path.GetDirectoryName(fileName));
BinaryWriter binaryWriter = new BinaryWriter(new FileStream(fileName, FileMode.Create, FileAccess.ReadWrite));
binaryWriter.Write(buffer);
binaryWriter.Close();
}
}
[Serializable]
public class SpriteInfo
{
public List<int> sid;
public List<int> sx;
public List<int> sy;
public List<int> sxr;
public List<int> syr;
public List<int> swidth;
public List<int> sheight;
public List<string> scollectionname;
public List<string> spath;
public List<bool> sfilpped;
public SpriteInfo()
{
sid = new List<int>();
sx = new List<int>();
sy = new List<int>();
sxr = new List<int>();
syr = new List<int>();
swidth = new List<int>();
sheight = new List<int>();
scollectionname = new List<string>();
spath = new List<string>();
sfilpped = new List<bool>();
}
public void Add(int _sid, int _sx, int _sy, int _sxr, int _syr, int _swidth, int _sheight, string _scollectionname, string _spath, bool _sfilpped)
{
sid.Add(_sid);
sx.Add(_sx);
sy.Add(_sy);
sxr.Add(_sxr);
syr.Add(_syr);
swidth.Add(_swidth);
sheight.Add(_sheight);
scollectionname.Add(_scollectionname);
spath.Add(_spath);
sfilpped.Add(_sfilpped);
}
}
}
namespace GoDump
{
[BepInPlugin("Yuki.GoDump", "GoDump", "1.0.0")]
public class GoDump : BaseUnityPlugin
{
private const string modGUID = "Yuki.GoDump";
private const string modName = "GoDump";
private const string modVersion = "1.0.0";
private static string _spritePath = "";
private static string _atlasPath = "";
private List<tk2dSpriteCollectionData> clns;
private List<tk2dSpriteAnimation> anims;
private tk2dSpriteAnimation anim;
private string[] animNames;
private int num;
private ConfigEntry<string> dumpAnimName;
private ConfigEntry<string> exportPath;
private ConfigEntry<bool> logCurrentClipId;
private ConfigEntry<KeyCode> logClnKey;
private ConfigEntry<KeyCode> dumpClnKey;
private string currClipAndId = "";
public static GoDump Instance { get; private set; }
private void Awake()
{
((BaseUnityPlugin)this).Logger.LogInfo((object)"Plugin Yuki.GoDump is loaded!");
dumpAnimName = ((BaseUnityPlugin)this).Config.Bind<string>("", "dumpAnimName", "", (ConfigDescription)null);
exportPath = ((BaseUnityPlugin)this).Config.Bind<string>("", "exportPath", "", (ConfigDescription)null);
logCurrentClipId = ((BaseUnityPlugin)this).Config.Bind<bool>("", "LogCurrentClipId", false, (ConfigDescription)null);
logClnKey = ((BaseUnityPlugin)this).Config.Bind<KeyCode>("Key", "logClnKey", (KeyCode)284, (ConfigDescription)null);
dumpClnKey = ((BaseUnityPlugin)this).Config.Bind<KeyCode>("Key", "dumpClnKey", (KeyCode)285, (ConfigDescription)null);
}
private void Start()
{
Instance = this;
clns = new List<tk2dSpriteCollectionData>();
anims = new List<tk2dSpriteAnimation>();
animNames = new string[0];
}
private void Update()
{
//IL_0006: Unknown result type (might be due to invalid IL or missing references)
//IL_0081: Unknown result type (might be due to invalid IL or missing references)
if (Input.GetKeyDown(logClnKey.Value))
{
((BaseUnityPlugin)this).Logger.LogInfo((object)"Log tk2dSpriteAnimation Start");
((BaseUnityPlugin)this).Logger.LogInfo((object)"= = = = = = = = = = = = = = = =");
tk2dSpriteAnimation[] array = Resources.FindObjectsOfTypeAll<tk2dSpriteAnimation>();
foreach (tk2dSpriteAnimation val in array)
{
((BaseUnityPlugin)this).Logger.LogInfo((object)((Object)val).name);
}
((BaseUnityPlugin)this).Logger.LogInfo((object)"= = = = = = = = = = = = = = = =");
((BaseUnityPlugin)this).Logger.LogInfo((object)"Log tk2dSpriteAnimation End");
}
if (Input.GetKeyDown(dumpClnKey.Value))
{
if (exportPath.Value == "")
{
((BaseUnityPlugin)this).Logger.LogInfo((object)"export Path is Empty");
return;
}
if (!Directory.Exists(exportPath.Value))
{
((BaseUnityPlugin)this).Logger.LogInfo((object)("Export Path: " + exportPath.Value + " not exist"));
return;
}
clns.Clear();
anims.Clear();
tk2dSpriteAnimation animation = getAnimation(dumpAnimName.Value);
anims.Add(animation);
animNames = anims.Select((tk2dSpriteAnimation a) => ((Object)a).name).ToArray();
((MonoBehaviour)this).StartCoroutine(HornetSprite());
}
if (Object.op_Implicit((Object)(object)HeroController.instance) && logCurrentClipId.Value && Object.op_Implicit((Object)(object)((Component)HeroController.instance).GetComponent<tk2dSpriteAnimator>()))
{
string text = ((Component)HeroController.instance).GetComponent<tk2dSpriteAnimator>().CurrentClip.name + ((tk2dBaseSprite)((Component)HeroController.instance).GetComponent<tk2dSprite>()).spriteId;
if (currClipAndId != text)
{
currClipAndId = text;
((BaseUnityPlugin)this).Logger.LogInfo((object)text);
}
}
}
private IEnumerator HornetSprite()
{
this.num = 0;
foreach (tk2dSpriteAnimation anim in anims)
{
if (!animNames.Contains(((Object)anim).name))
{
continue;
}
int num = 0;
SpriteInfo spriteInfo = new SpriteInfo();
((BaseUnityPlugin)this).Logger.LogInfo((object)("Begin Dumping sprites in tk2dSpriteAnimator [" + ((Object)anim).name + "]."));
tk2dSpriteAnimationClip[] clips = anim.clips;
foreach (tk2dSpriteAnimationClip val in clips)
{
((BaseUnityPlugin)this).Logger.LogInfo((object)val.name);
num++;
int num2 = -1;
float num3 = -10000f;
float num4 = -10000f;
float num5 = 10000f;
float num6 = 10000f;
tk2dSpriteAnimationFrame[] frames = val.frames;
foreach (tk2dSpriteAnimationFrame val2 in frames)
{
Vector3[] positions = val2.spriteCollection.spriteDefinitions[val2.spriteId].positions;
float num7 = positions.Min((Vector3 v) => v.x);
float num8 = positions.Min((Vector3 v) => v.y);
float num9 = positions.Max((Vector3 v) => v.x);
float num10 = positions.Max((Vector3 v) => v.y);
num5 = ((num5 < num7) ? num5 : num7);
num6 = ((num6 < num8) ? num6 : num8);
num3 = ((num3 > num9) ? num3 : num9);
num4 = ((num4 > num10) ? num4 : num10);
}
frames = val.frames;
foreach (tk2dSpriteAnimationFrame val3 in frames)
{
num2++;
if (val.name == "")
{
continue;
}
tk2dSpriteDefinition val4 = val3.spriteCollection.spriteDefinitions[val3.spriteId];
Vector2[] uvs = val4.uvs;
Vector3[] positions2 = val4.positions;
Texture2D val5 = SpriteDump.TextureReadHack((Texture2D)val4.material.mainTexture);
string text = val3.spriteCollection.spriteCollectionName + "_" + ((Object)val4.material.mainTexture).name;
string text2 = exportPath.Value + "/sprites/" + ((Object)anim).name + "/0.Atlases/" + text + ".png";
string path = exportPath.Value + "/sprites/" + ((Object)anim).name + "/" + $"{num:D3}" + "." + val.name + "/" + text + ".png";
string path2 = exportPath.Value + "/sprites/" + ((Object)anim).name + "/" + $"{num:D3}" + "." + val.name + "/" + $"{num:D3}" + "-" + $"{num2:D2}" + "-" + $"{val3.spriteId:D3}" + "_position.png";
string text3 = ((Object)anim).name + "/" + $"{num:D3}" + "." + val.name + "/" + $"{num:D3}" + "-" + $"{num2:D2}" + "-" + $"{val3.spriteId:D3}" + ".png";
string text4 = exportPath.Value + "/sprites/" + text3;
bool flag = (int)val4.flipped == 1;
float num11 = positions2.Min((Vector3 v) => v.x);
float num12 = positions2.Min((Vector3 v) => v.y);
float num13 = positions2.Max((Vector3 v) => v.x);
float num14 = positions2.Max((Vector3 v) => v.y);
int num15 = (int)(uvs.Min((Vector2 v) => v.x) * (float)((Texture)val5).width);
int num16 = (int)(uvs.Min((Vector2 v) => v.y) * (float)((Texture)val5).height);
int num17 = (int)(uvs.Max((Vector2 v) => v.x) * (float)((Texture)val5).width);
int num18 = (int)(uvs.Max((Vector2 v) => v.y) * (float)((Texture)val5).height);
int num19 = num15;
int num20 = num16;
int num21 = num17;
int num22 = num18;
if (flag)
{
num21 = num18 + num15 - num16;
num22 = num17 - num15 + num16;
}
int num23 = (int)((num5 - num5) / val4.texelSize.x);
int num24 = (int)((num6 - num6) / val4.texelSize.y);
int num25 = (int)((num3 - num5) / val4.texelSize.x);
int num26 = (int)((num4 - num6) / val4.texelSize.y);
int num27 = (int)((num11 - num5) / val4.texelSize.x);
int num28 = (int)((num12 - num6) / val4.texelSize.y);
_ = (num13 - num5) / val4.texelSize.x;
_ = (num14 - num6) / val4.texelSize.y;
SpriteDump.RectP rectP = new SpriteDump.RectP(num15, num16, num17 - num15 + 1, num18 - num16 + 1);
SpriteDump.RectP border = new SpriteDump.RectP(num19 - num27 + num23, num20 - num28 + num24, num25 - num23 + 1, num26 - num24 + 1);
SpriteDump.RectP rectP2 = new SpriteDump.RectP(num27 - num23, num28 - num24, num21 - num19 + 1, num22 - num20 + 1);
if (!File.Exists(text2))
{
SpriteDump.SaveTextureToFile(val5, text2);
this.num++;
}
File.Exists(path);
File.Exists(path2);
spriteInfo.Add(val3.spriteId, num15, num16, rectP2.x, rectP2.y, rectP2.width, rectP2.height, text, text3, flag);
if (!File.Exists(text4))
{
try
{
if (rectP.x < 0 || rectP.y < 0 || rectP.x + rectP.width > ((Texture)val5).width || rectP.y + rectP.height > ((Texture)val5).height)
{
((BaseUnityPlugin)this).Logger.LogWarning((object)("Texture rectangle out of bounds for " + text3 + ". Adjusting uvpixel."));
rectP.x = Mathf.Max(0, rectP.x);
rectP.y = Mathf.Max(0, rectP.y);
rectP.width = Mathf.Min(rectP.width, ((Texture)val5).width - rectP.x);
rectP.height = Mathf.Min(rectP.height, ((Texture)val5).height - rectP.y);
if (rectP.width <= 0 || rectP.height <= 0)
{
((BaseUnityPlugin)this).Logger.LogError((object)("Invalid texture rectangle after adjustment for " + text3 + ". Skipping."));
continue;
}
}
Texture2D texture2D = SpriteDump.SubTexture(val5, rectP);
if (flag)
{
SpriteDump.Tk2dFlip(ref texture2D);
}
Texture2D obj = SpriteDump.SpriteSizeFix(texture2D, rectP2, border);
SpriteDump.SaveTextureToFile(obj, text4);
Object.DestroyImmediate((Object)(object)obj);
Object.DestroyImmediate((Object)(object)texture2D);
this.num++;
}
catch (Exception ex)
{
Texture2D texture2D2 = SpriteDump.SubTexture(val5, rectP);
if (flag)
{
SpriteDump.Tk2dFlip(ref texture2D2);
}
Texture2D obj2 = SpriteDump.SpriteSizeFixError(texture2D2, rectP2, border);
SpriteDump.SaveTextureToFile(obj2, text4);
Object.DestroyImmediate((Object)(object)obj2);
((BaseUnityPlugin)this).Logger.LogInfo((object)(ex.ToString() + " " + text3));
}
}
Object.DestroyImmediate((Object)(object)val5);
}
}
string path3 = exportPath.Value + "/sprites/" + ((Object)anim).name + "/0.Atlases/SpriteInfo.json";
if (!File.Exists(path3))
{
using FileStream stream = File.Create(path3);
using StreamWriter streamWriter = new StreamWriter(stream);
string value = JsonUtility.ToJson((object)spriteInfo, true);
streamWriter.Write(value);
}
((BaseUnityPlugin)this).Logger.LogInfo((object)("End Dumping sprites in tk2dSpriteAnimator [" + ((Object)anim).name + "]."));
}
((BaseUnityPlugin)this).Logger.LogInfo((object)("End Dumping Sprite.png " + this.num + " sprites dumped."));
yield break;
}
private List<tk2dSpriteAnimation> GetUsedIns(tk2dSpriteCollectionData cln, List<tk2dSpriteAnimation> anims)
{
List<tk2dSpriteAnimation> list = new List<tk2dSpriteAnimation>();
foreach (tk2dSpriteAnimation anim in anims)
{
tk2dSpriteAnimationClip[] clips = anim.clips;
for (int i = 0; i < clips.Length; i++)
{
tk2dSpriteAnimationFrame[] frames = clips[i].frames;
for (int j = 0; j < frames.Length; j++)
{
if (((Object)frames[j].spriteCollection).name == ((Object)cln).name && !list.Contains(anim))
{
list.Add(anim);
}
}
}
}
return list;
}
private tk2dSpriteAnimation getAnimation(string name)
{
tk2dSpriteAnimation[] array = Resources.FindObjectsOfTypeAll<tk2dSpriteAnimation>();
foreach (tk2dSpriteAnimation val in array)
{
if (((Object)val).name == name)
{
anim = val;
}
}
return anim;
}
public static void logInfo(string msg)
{
((BaseUnityPlugin)Instance).Logger.LogInfo((object)msg);
}
}
}
namespace System.Runtime.CompilerServices
{
[AttributeUsage(AttributeTargets.Assembly, AllowMultiple = true)]
internal sealed class IgnoresAccessChecksToAttribute : Attribute
{
public IgnoresAccessChecksToAttribute(string assemblyName)
{
}
}
}