private static void WriteMemoryPARAM(PARAM param, int paramOffset, SoulsMemoryHandler memoryHandler) { var BasePtr = memoryHandler.GetParamPtrDS3(paramOffset); var BaseDataPtr = memoryHandler.GetToRowPtrDS3(paramOffset); var RowCount = memoryHandler.GetRowCountDS3(paramOffset); IntPtr DataSectionPtr; int RowId = 0; int rowPtr = 0; for (int i = 0; i < RowCount; i++) { memoryHandler.ReadProcessMemory(BaseDataPtr, ref RowId); memoryHandler.ReadProcessMemory(BaseDataPtr + 0x8, ref rowPtr); DataSectionPtr = IntPtr.Add(BasePtr, rowPtr); BaseDataPtr += 0x18; PARAM.Row row = param[RowId]; if (row != null) { WriteMemoryRow(row, DataSectionPtr, memoryHandler); } } }
private static int WriteMemoryCell(PARAM.Cell cell, IntPtr CellDataPtr, ref int bitFieldPos, ref BitArray bits, SoulsMemoryHandler memoryHandler) { PARAMDEF.DefType displayType = cell.Def.DisplayType; // If this can be simplified, that would be ideal. Currently we have to reconcile DefType, a numerical size in bits, and the Type used for the bitField array if (cell.Def.BitSize != -1) { if (displayType == SoulsFormats.PARAMDEF.DefType.u8) { if (bitFieldPos == 0) { bits = new BitArray(8); } bits.Set(bitFieldPos, Convert.ToBoolean(cell.Value)); bitFieldPos++; if (bitFieldPos == 8) { byte valueRead = 0; memoryHandler.ReadProcessMemory(CellDataPtr, ref valueRead); byte[] bitField = new byte[1]; bits.CopyTo(bitField, 0); bitFieldPos = 0; byte bitbuffer = bitField[0]; if (valueRead != bitbuffer) { memoryHandler.WriteProcessMemory(CellDataPtr, ref bitbuffer); } return(sizeof(byte)); } return(0); } else if (displayType == SoulsFormats.PARAMDEF.DefType.u16) { if (bitFieldPos == 0) { bits = new BitArray(16); } bits.Set(bitFieldPos, Convert.ToBoolean(cell.Value)); bitFieldPos++; if (bitFieldPos == 16) { ushort valueRead = 0; memoryHandler.ReadProcessMemory(CellDataPtr, ref valueRead); ushort[] bitField = new ushort[1]; bits.CopyTo(bitField, 0); bitFieldPos = 0; ushort bitbuffer = bitField[0]; if (valueRead != bitbuffer) { memoryHandler.WriteProcessMemory(CellDataPtr, ref bitbuffer); } return(sizeof(UInt16)); } return(0); } else if (displayType == SoulsFormats.PARAMDEF.DefType.u32) { if (bitFieldPos == 0) { bits = new BitArray(32); } bits.Set(bitFieldPos, Convert.ToBoolean(cell.Value)); bitFieldPos++; if (bitFieldPos == 32) { uint valueRead = 0; memoryHandler.ReadProcessMemory(CellDataPtr, ref valueRead); uint[] bitField = new uint[1]; bits.CopyTo(bitField, 0); bitFieldPos = 0; uint bitbuffer = bitField[0]; if (valueRead != bitbuffer) { memoryHandler.WriteProcessMemory(CellDataPtr, ref bitbuffer); } return(sizeof(UInt32)); } return(0); } } if (displayType == SoulsFormats.PARAMDEF.DefType.f32) { float valueRead = 0f; memoryHandler.ReadProcessMemory(CellDataPtr, ref valueRead); float value = Convert.ToSingle(cell.Value); if (valueRead != value) { memoryHandler.WriteProcessMemory(CellDataPtr, ref value); } return(sizeof(float)); } else if (displayType == SoulsFormats.PARAMDEF.DefType.s32) { int valueRead = 0; memoryHandler.ReadProcessMemory(CellDataPtr, ref valueRead); int value = Convert.ToInt32(cell.Value); if (valueRead != value) { memoryHandler.WriteProcessMemory(CellDataPtr, ref value); } return(sizeof(Int32)); } else if (displayType == SoulsFormats.PARAMDEF.DefType.s16) { short valueRead = 0; memoryHandler.ReadProcessMemory(CellDataPtr, ref valueRead); short value = Convert.ToInt16(cell.Value); if (valueRead != value) { memoryHandler.WriteProcessMemory(CellDataPtr, ref value); } return(sizeof(Int16)); } else if (displayType == SoulsFormats.PARAMDEF.DefType.s8) { sbyte valueRead = 0; memoryHandler.ReadProcessMemory(CellDataPtr, ref valueRead); sbyte value = Convert.ToSByte(cell.Value); if (valueRead != value) { memoryHandler.WriteProcessMemory(CellDataPtr, ref value); } return(sizeof(sbyte)); } else if (displayType == SoulsFormats.PARAMDEF.DefType.u32) { uint valueRead = 0; memoryHandler.ReadProcessMemory(CellDataPtr, ref valueRead); uint value = Convert.ToUInt32(cell.Value); if (valueRead != value) { memoryHandler.WriteProcessMemory(CellDataPtr, ref value); } return(sizeof(UInt32)); } else if (displayType == SoulsFormats.PARAMDEF.DefType.u16) { ushort valueRead = 0; memoryHandler.ReadProcessMemory(CellDataPtr, ref valueRead); ushort value = Convert.ToUInt16(cell.Value); if (valueRead != value) { memoryHandler.WriteProcessMemory(CellDataPtr, ref value); } return(sizeof(UInt16)); } else if (displayType == SoulsFormats.PARAMDEF.DefType.u8) { byte valueRead = 0; memoryHandler.ReadProcessMemory(CellDataPtr, ref valueRead); byte value = Convert.ToByte(cell.Value); if (valueRead != value) { memoryHandler.WriteProcessMemory(CellDataPtr, ref value); } return(sizeof(byte)); } else if (displayType == SoulsFormats.PARAMDEF.DefType.dummy8 || displayType == SoulsFormats.PARAMDEF.DefType.fixstr || displayType == SoulsFormats.PARAMDEF.DefType.fixstrW) { return(cell.Def.ArrayLength); } else { throw new Exception("Unexpected Field Type"); } }