Skip to content

Instantly share code, notes, and snippets.

@gnalvesteffer
Last active February 6, 2022 09:07
Show Gist options
  • Save gnalvesteffer/3400c9de86b853301f22dc2d5f2edff9 to your computer and use it in GitHub Desktop.
Save gnalvesteffer/3400c9de86b853301f22dc2d5f2edff9 to your computer and use it in GitHub Desktop.
Exanima Mod | Adds more items to the practice arena
void Main()
{
// Get process.
var gameProcess = Process.GetProcessesByName("Exanima").First();
var externalMemory = new ExternalMemory(gameProcess);
var textSectionBaseAddress = 0x401000; // Exanima.exe.text
// Arsenal info.
var totalItemsToLoad = ArsenalItemIds.Length;
// Reload character customization items when navigating in UI.
externalMemory.WriteRaw((IntPtr)textSectionBaseAddress + 0xFFAC0, new byte[] { 0x90, 0x90, 0x90, 0x90, 0x90, 0x90 });
// Set total items to load.
externalMemory.Write((IntPtr)0x60BF0C, totalItemsToLoad);
// Generate array of items to load in novice practice arena. Item size is 0x13.
var newItemArrayAddress = externalMemory.Allocate(totalItemsToLoad * 0x13);
newItemArrayAddress.ToString("x").Dump();
var newItemArrayAddressBytes = BitConverter.GetBytes(newItemArrayAddress.ToInt32());
if (!BitConverter.IsLittleEndian)
{
newItemArrayAddressBytes.Reverse();
}
newItemArrayAddressBytes.Dump();
for (var itemIndex = 0; itemIndex < totalItemsToLoad; ++itemIndex)
{
var itemId = ArsenalItemIds[itemIndex];
var itemAddress = newItemArrayAddress + 0x13 * itemIndex;
externalMemory.Write(itemAddress, itemId); // Item ID
for (var offset = 0x5; offset <= 0x12; ++offset)
{
externalMemory.Write(itemAddress + offset, (byte)new Random(Guid.NewGuid().GetHashCode()).Next(0, 255));
}
//externalMemory.Write(itemAddress + 0x0F, (byte)33); // Color Index 1
}
// Point to new item array.
externalMemory.WriteRaw((IntPtr)textSectionBaseAddress + 0xFFB4C, newItemArrayAddressBytes.Prepend<byte>(0xBD).ToArray());
// Suppress invalid item errors.
externalMemory.WriteRaw((IntPtr)textSectionBaseAddress + 0x177794, new byte[] { 0xC3 });
}
// Sourced from item spreadsheet, filtered to Apparel, Shields, Weapons
int[] ArsenalItemIds = new int[] {
0x1,
0x2,
0x3,
0x4,
0x6,
0x7,
0x8,
0xA,
0xC,
0xD,
0xE,
0xF,
0x13,
0x14,
0x15,
0x16,
0x17,
0x18,
0x19,
0x1A,
0x1E,
0x1F,
0x20,
0x21,
0x22,
0x23,
0x24,
0x25,
0x26,
0x27,
0x28,
0x29,
0x2B,
0x2D,
0x2E,
0x2F,
0x35,
0x36,
0x37,
0x39,
0x3B,
0x3C,
0x3D,
0x3E,
0x3F,
0x40,
0x41,
0x42,
0x43,
0x44,
0x45,
0x4D,
0x4E,
0x4F,
0x50,
0x51,
0x52,
0x53,
0x55,
0x56,
0x59,
0x5D,
0x61,
0x69,
0x6B,
0x6F,
0x76,
0x77,
0x79,
0x7D,
0x7E,
0x7F,
0x80,
0x81,
0x8B,
0x8D,
0x8E,
0x8F,
0x90,
0x91,
0x93,
0x94,
0x95,
0x96,
0x97,
0x98,
0x99,
0x9A,
0x9B,
0x9E,
0x9F,
0xA0,
0xA6,
0xAD,
0xB7,
0xB9,
0xBA,
0xBC,
0xBF,
0xC0,
0xC3,
0xC4,
0xC5,
0xC7,
0xCB,
0xCE,
0xCF,
0xD2,
0xD4,
0xD5,
0xD8,
0xD9,
0xDE,
0xDF,
0xE0,
0xE1,
0xE2,
0xE3,
0xE4,
0xE5,
0xE6,
0xE7,
0xE8,
0xEA,
0xEB,
0xEC,
0xED,
0xEE,
0xEF,
0xF0,
0xF1,
0xF2,
0xF3,
0xF4,
0xF5,
0xF6,
0xF7,
0xF8,
0xF9,
0xFA,
0xFB,
0xFC,
0xFD,
0x106,
0x107,
0x109,
0x10E,
0x10F,
0x117,
0x118,
0x119,
0x11A,
0x11B,
0x11C,
0x11D,
0x11E,
0x11F,
0x120,
0x121,
0x122,
0x123,
0x124,
0x125,
0x126,
0x127,
0x128,
0x13D,
0x13E,
0x13F,
0x140,
0x141,
0x142,
0x143,
0x144,
0x14C,
0x14D,
0x14E,
0x14F,
0x150,
0x151,
0x152,
0x153,
0x154,
0x155,
0x156,
0x157,
0x15F,
0x162,
0x163,
0x16C,
0x16D,
0x16E,
0x16F,
0x170,
0x171,
0x172,
0x173,
0x174,
0x175,
0x176,
0x177,
0x17C,
0x17D,
0x17E,
0x17F,
0x184,
0x185,
0x186,
0x187,
0x188,
0x189,
0x18A,
0x18B,
0x18C,
0x18E,
0x18F,
0x190,
0x191,
0x192,
0x196,
0x197,
0x198,
0x199,
0x19A,
0x19B,
0x19C,
0x19D,
0x19E,
0x19F,
0x1A0,
0x1A1,
0x1A3,
0x1A4,
0x1A5,
0x1A6,
0x1A7,
0x1A8,
0x1A9,
0x1AA,
0x1AB,
0x1AC,
0x1AD,
0x1AE,
0x1B3,
0x1B4,
0x1B5,
0x1B6,
0x1B7,
0x1B8,
0x1B9,
0x1BA,
0x1BB,
0x1BC,
0x1BD,
0x1BE,
0x1BF,
0x1C0,
0x1C1,
0x1C2,
0x1C8,
0x1CA,
0x1CB,
0x1D0,
0x1D1,
0x1D2,
0x1D3,
0x1D4,
0x1D5,
0x1D6,
0x1D8,
0x1D9,
0x1E0,
0x1F1,
0x1F2,
0x1F5,
0x1F6,
0x1F7,
0x1F8,
0x1F9,
0x1FA,
0x1FB,
0x1FC,
0x1FD,
0x1FE,
0x1FF,
0x200,
0x201,
0x202,
0x203,
0x204,
0x205,
0x206,
0x207,
0x208,
0x209,
0x20A,
0x20B,
0x20C,
0x20D,
0x20E,
0x20F,
0x210,
0x211,
0x212,
0x213,
0x214,
0x215,
0x216,
0x217,
0x218,
0x219,
0x21A,
0x21B,
0x21C,
0x21D,
0x21E,
0x21F,
0x220,
0x221,
0x23C,
0x23D,
0x23E,
0x23F,
0x240,
0x241,
0x242,
0x243,
0x244,
0x245,
0x246,
0x247,
0x248,
0x24A,
0x24E,
0x24F,
0x250,
0x252,
0x253,
0x254,
0x255,
0x256,
0x265,
0x266,
0x267,
0x268,
0x269,
0x26A,
0x26C,
0x26D,
0x26E,
0x26F,
0x270,
0x271,
0x272,
0x273,
0x274,
0x275,
0x276,
0x277,
0x278,
0x279,
0x27A,
0x27B,
0x27C,
0x27D,
0x27E,
0x27F,
0x280,
0x281,
0x282,
0x283,
0x284,
0x285,
0x286,
0x287,
0x288,
0x289,
0x28A,
0x28B,
0x28C,
0x28D,
0x28E,
0x28F,
0x290,
0x291,
0x292,
0x293,
0x294,
0x295,
0x296,
0x297,
0x298,
0x29C,
0x29D,
0x29F,
0x2A0,
0x2AB,
0x2AC,
0x2AD,
0x2AE,
0x2AF,
0x2B0,
0x2B1,
0x2B2,
0x2B3,
0x2B4,
0x2B5,
0x2B6,
0x2B7,
0x2B8,
0x2B9,
0x2BA,
0x2BB,
0x2BC,
0x2BD,
0x2BE,
0x2C8,
0x2CF,
0x2D0,
0x2D1,
0x2D9,
0x2EF,
0x315,
0x316,
0x317,
0x318,
0x319,
0x31A,
0x31B,
0x31C,
0x31D,
0x31E,
0x31F,
0x320,
0x321,
0x322,
0x323,
0x324,
0x325,
0x326,
0x327,
0x328,
0x329,
0x32A,
0x32B,
0x32C,
0x32D,
0x32E,
0x32F,
0x330,
0x331,
0x332,
0x333,
0x334,
0x335,
0x336,
0x337,
0x338,
0x339,
0x33A,
0x33B,
0x341,
0x343,
0x34E,
0x350,
0x360,
0x361,
0x362,
0x363,
0x36E,
0x37A,
0x37B,
0x37C,
0x37D,
0x37E,
0x37F,
0x380,
0x381,
0x382,
0x383,
0x384,
0x385,
0x386,
0x388,
0x38D,
0x395,
0x396,
0x3B8,
0x3B9,
0x3BA,
0x3C1,
0x3E7,
0x3E8,
0x3E9,
0x3EA,
0x3EE,
0x3F0,
0x3F1,
0x3F2,
0x3FE,
0x401,
0x409,
0x411,
0x412,
0x41C,
0x41D,
0x41F,
0x420,
0x421,
0x422,
0x423,
0x424,
0x425,
0x426,
0x427,
0x428,
0x429,
0x42A,
0x42B,
0x42C,
0x42D,
0x42E,
0x42F,
0x430,
0x431,
0x432,
0x433,
0x43C,
0x43D,
0x44B,
0x44C,
0x489,
0x48A,
0x48B,
0x48D,
0x48E,
0x48F,
0x490,
0x491,
0x492,
0x493,
0x494,
0x495,
0x496,
0x497,
0x498,
0x499,
0x49A,
0x49B,
0x49C,
0x49D,
};
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment