mirror of
https://github.com/sampletext32/ParkanPlayground.git
synced 2025-12-11 04:51:21 +04:00
Material parsing and viewing
This commit is contained in:
@@ -21,6 +21,14 @@ public static class Extensions
|
|||||||
return BinaryPrimitives.ReadUInt32LittleEndian(buf);
|
return BinaryPrimitives.ReadUInt32LittleEndian(buf);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static ushort ReadUInt16LittleEndian(this Stream fs)
|
||||||
|
{
|
||||||
|
Span<byte> buf = stackalloc byte[2];
|
||||||
|
fs.ReadExactly(buf);
|
||||||
|
|
||||||
|
return BinaryPrimitives.ReadUInt16LittleEndian(buf);
|
||||||
|
}
|
||||||
|
|
||||||
public static float ReadFloatLittleEndian(this Stream fs)
|
public static float ReadFloatLittleEndian(this Stream fs)
|
||||||
{
|
{
|
||||||
Span<byte> buf = stackalloc byte[4];
|
Span<byte> buf = stackalloc byte[4];
|
||||||
|
|||||||
82
MaterialLib/Interpolate.c
Normal file
82
MaterialLib/Interpolate.c
Normal file
@@ -0,0 +1,82 @@
|
|||||||
|
|
||||||
|
void __cdecl
|
||||||
|
Interpolate(MaterialExternal *src1_ptr,MaterialExternal *src2_ptr,float progress,
|
||||||
|
MaterialExternal *dst_ptr,uint targetFlags)
|
||||||
|
|
||||||
|
{
|
||||||
|
if ((targetFlags & 2) == 0) {
|
||||||
|
(dst_ptr->stage).diffuse.R = (src1_ptr->stage).diffuse.R;
|
||||||
|
(dst_ptr->stage).diffuse.G = (src1_ptr->stage).diffuse.G;
|
||||||
|
(dst_ptr->stage).diffuse.B = (src1_ptr->stage).diffuse.B;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
(dst_ptr->stage).diffuse.R =
|
||||||
|
((src2_ptr->stage).diffuse.R - (src1_ptr->stage).diffuse.R) * progress +
|
||||||
|
(src1_ptr->stage).diffuse.R;
|
||||||
|
(dst_ptr->stage).diffuse.G =
|
||||||
|
((src2_ptr->stage).diffuse.G - (src1_ptr->stage).diffuse.G) * progress +
|
||||||
|
(src1_ptr->stage).diffuse.G;
|
||||||
|
(dst_ptr->stage).diffuse.B =
|
||||||
|
((src2_ptr->stage).diffuse.B - (src1_ptr->stage).diffuse.B) * progress +
|
||||||
|
(src1_ptr->stage).diffuse.B;
|
||||||
|
}
|
||||||
|
if ((targetFlags & 1) == 0) {
|
||||||
|
(dst_ptr->stage).ambient.R = (src1_ptr->stage).ambient.R;
|
||||||
|
(dst_ptr->stage).ambient.G = (src1_ptr->stage).ambient.G;
|
||||||
|
(dst_ptr->stage).ambient.B = (src1_ptr->stage).ambient.B;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
(dst_ptr->stage).ambient.R =
|
||||||
|
((src2_ptr->stage).ambient.R - (src1_ptr->stage).ambient.R) * progress +
|
||||||
|
(src1_ptr->stage).ambient.R;
|
||||||
|
(dst_ptr->stage).ambient.G =
|
||||||
|
((src2_ptr->stage).ambient.G - (src1_ptr->stage).ambient.G) * progress +
|
||||||
|
(src1_ptr->stage).ambient.G;
|
||||||
|
(dst_ptr->stage).ambient.B =
|
||||||
|
((src2_ptr->stage).ambient.B - (src1_ptr->stage).ambient.B) * progress +
|
||||||
|
(src1_ptr->stage).ambient.B;
|
||||||
|
}
|
||||||
|
if ((targetFlags & 4) == 0) {
|
||||||
|
(dst_ptr->stage).specular.R = (src1_ptr->stage).specular.R;
|
||||||
|
(dst_ptr->stage).specular.G = (src1_ptr->stage).specular.G;
|
||||||
|
(dst_ptr->stage).specular.B = (src1_ptr->stage).specular.B;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
(dst_ptr->stage).specular.R =
|
||||||
|
((src2_ptr->stage).specular.R - (src1_ptr->stage).specular.R) * progress +
|
||||||
|
(src1_ptr->stage).specular.R;
|
||||||
|
(dst_ptr->stage).specular.G =
|
||||||
|
((src2_ptr->stage).specular.G - (src1_ptr->stage).specular.G) * progress +
|
||||||
|
(src1_ptr->stage).specular.G;
|
||||||
|
(dst_ptr->stage).specular.B =
|
||||||
|
((src2_ptr->stage).specular.B - (src1_ptr->stage).specular.B) * progress +
|
||||||
|
(src1_ptr->stage).specular.B;
|
||||||
|
}
|
||||||
|
if ((targetFlags & 8) == 0) {
|
||||||
|
(dst_ptr->stage).emissive.R = (src1_ptr->stage).emissive.R;
|
||||||
|
(dst_ptr->stage).emissive.G = (src1_ptr->stage).emissive.G;
|
||||||
|
(dst_ptr->stage).emissive.B = (src1_ptr->stage).emissive.B;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
(dst_ptr->stage).emissive.R =
|
||||||
|
((src2_ptr->stage).emissive.R - (src1_ptr->stage).emissive.R) * progress +
|
||||||
|
(src1_ptr->stage).emissive.R;
|
||||||
|
(dst_ptr->stage).emissive.G =
|
||||||
|
((src2_ptr->stage).emissive.G - (src1_ptr->stage).emissive.G) * progress +
|
||||||
|
(src1_ptr->stage).emissive.G;
|
||||||
|
(dst_ptr->stage).emissive.B =
|
||||||
|
((src2_ptr->stage).emissive.B - (src1_ptr->stage).emissive.B) * progress +
|
||||||
|
(src1_ptr->stage).emissive.B;
|
||||||
|
}
|
||||||
|
if ((targetFlags & 0x10) != 0) {
|
||||||
|
(dst_ptr->stage).ambient.A =
|
||||||
|
((src2_ptr->stage).ambient.A - (src1_ptr->stage).ambient.A) * progress +
|
||||||
|
(src1_ptr->stage).ambient.A;
|
||||||
|
(dst_ptr->stage).Power = (src1_ptr->stage).Power;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
(dst_ptr->stage).ambient.A = (src1_ptr->stage).ambient.A;
|
||||||
|
(dst_ptr->stage).Power = (src1_ptr->stage).Power;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
137
MaterialLib/MaterialFile.cs
Normal file
137
MaterialLib/MaterialFile.cs
Normal file
@@ -0,0 +1,137 @@
|
|||||||
|
namespace MaterialLib;
|
||||||
|
|
||||||
|
public class MaterialFile
|
||||||
|
{
|
||||||
|
// === Metadata (not from file content) ===
|
||||||
|
public string FileName { get; set; }
|
||||||
|
public int Version { get; set; } // From NRes ElementCount
|
||||||
|
public int Magic1 { get; set; } // From NRes Magic1
|
||||||
|
|
||||||
|
// === Derived from Version/ElementCount ===
|
||||||
|
public int MaterialRenderingType { get; set; } // (Version >> 2) & 0xF - 0=Standard, 1=Special, 2=Particle
|
||||||
|
public bool SupportsBumpMapping { get; set; } // (Version & 2) != 0
|
||||||
|
public int IsParticleEffect { get; set; } // Version & 40 - 0=Normal, 8=Particle/Effect
|
||||||
|
|
||||||
|
// === File Content (in read order) ===
|
||||||
|
// Read order: StageCount (ushort), AnimCount (ushort), then conditionally blend modes and params
|
||||||
|
|
||||||
|
// Global Blend Modes (read if Magic1 >= 2)
|
||||||
|
public BlendMode SourceBlendMode { get; set; } // Default: Unknown (0xFF)
|
||||||
|
public BlendMode DestBlendMode { get; set; } // Default: Unknown (0xFF)
|
||||||
|
|
||||||
|
// Global Parameters (read if Magic1 > 2 and > 3 respectively)
|
||||||
|
public float GlobalAlphaMultiplier { get; set; } // Default: 1.0 (always 1.0 in all 628 materials)
|
||||||
|
public float GlobalEmissiveIntensity { get; set; } // Default: 0.0 (0=no glow, rare values: 1000, 10000)
|
||||||
|
|
||||||
|
public List<MaterialStage> Stages { get; set; } = new();
|
||||||
|
public List<MaterialAnimation> Animations { get; set; } = new();
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum BlendMode : byte
|
||||||
|
{
|
||||||
|
Zero = 1,
|
||||||
|
One = 2,
|
||||||
|
SrcColor = 3,
|
||||||
|
InvSrcColor = 4,
|
||||||
|
SrcAlpha = 5,
|
||||||
|
InvSrcAlpha = 6,
|
||||||
|
DestAlpha = 7,
|
||||||
|
InvDestAlpha = 8,
|
||||||
|
DestColor = 9,
|
||||||
|
InvDestColor = 10,
|
||||||
|
SrcAlphaSat = 11,
|
||||||
|
BothSrcAlpha = 12,
|
||||||
|
BothInvSrcAlpha = 13,
|
||||||
|
|
||||||
|
// Custom or Unknown
|
||||||
|
Unknown = 0xFF
|
||||||
|
}
|
||||||
|
|
||||||
|
public class MaterialStage
|
||||||
|
{
|
||||||
|
// === FILE READ ORDER (34 bytes per stage) ===
|
||||||
|
// This matches the order bytes are read from the file (decompiled.c lines 159-217)
|
||||||
|
// NOT the C struct memory layout (which is Diffuse, Ambient, Specular, Emissive)
|
||||||
|
|
||||||
|
// 1. Ambient Color (4 bytes, read first from file)
|
||||||
|
public float AmbientR;
|
||||||
|
public float AmbientG;
|
||||||
|
public float AmbientB;
|
||||||
|
public float AmbientA; // Scaled by 0.01 when read from file
|
||||||
|
|
||||||
|
// 2. Diffuse Color (4 bytes, read second from file)
|
||||||
|
public float DiffuseR;
|
||||||
|
public float DiffuseG;
|
||||||
|
public float DiffuseB;
|
||||||
|
public float DiffuseA;
|
||||||
|
|
||||||
|
// 3. Specular Color (4 bytes, read third from file)
|
||||||
|
public float SpecularR;
|
||||||
|
public float SpecularG;
|
||||||
|
public float SpecularB;
|
||||||
|
public float SpecularA;
|
||||||
|
|
||||||
|
// 4. Emissive Color (4 bytes, read fourth from file)
|
||||||
|
public float EmissiveR;
|
||||||
|
public float EmissiveG;
|
||||||
|
public float EmissiveB;
|
||||||
|
public float EmissiveA;
|
||||||
|
|
||||||
|
// 5. Power (1 byte → float, read fifth from file)
|
||||||
|
public float Power;
|
||||||
|
|
||||||
|
// 6. Texture Stage Index (1 byte, read sixth from file)
|
||||||
|
// 255 = not set/default, 0-47 = reference to specific texture stage
|
||||||
|
public int TextureStageIndex;
|
||||||
|
|
||||||
|
// 7. Texture Name (16 bytes, read seventh from file)
|
||||||
|
public string TextureName { get; set; }
|
||||||
|
}
|
||||||
|
|
||||||
|
public class MaterialAnimation
|
||||||
|
{
|
||||||
|
// === File Read Order ===
|
||||||
|
|
||||||
|
// Combined field (4 bytes): bits 3-31 = Target, bits 0-2 = LoopMode
|
||||||
|
public AnimationTarget Target;
|
||||||
|
public AnimationLoopMode LoopMode;
|
||||||
|
|
||||||
|
// Key count (2 bytes), then keys
|
||||||
|
public List<AnimKey> Keys { get; set; } = new();
|
||||||
|
|
||||||
|
// Cached description for UI (computed once during parsing)
|
||||||
|
public string TargetDescription { get; set; } = string.Empty;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
[Flags]
|
||||||
|
public enum AnimationTarget : int
|
||||||
|
{
|
||||||
|
// NOTE: This is a BITSET (flags enum). Multiple flags can be combined.
|
||||||
|
// When a flag is SET, that component is INTERPOLATED between stages.
|
||||||
|
// When a flag is NOT SET, that component is COPIED from the source stage (no interpolation).
|
||||||
|
// If ALL flags are 0, the ENTIRE stage is copied without any interpolation.
|
||||||
|
|
||||||
|
Ambient = 1, // 0x01 - Interpolates Ambient RGB (Interpolate.c lines 23-37)
|
||||||
|
Diffuse = 2, // 0x02 - Interpolates Diffuse RGB (Interpolate.c lines 7-21)
|
||||||
|
Specular = 4, // 0x04 - Interpolates Specular RGB (Interpolate.c lines 39-53)
|
||||||
|
Emissive = 8, // 0x08 - Interpolates Emissive RGB (Interpolate.c lines 55-69)
|
||||||
|
Power = 16 // 0x10 - Interpolates Ambient.A and sets Power (Interpolate.c lines 71-76)
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public enum AnimationLoopMode : int
|
||||||
|
{
|
||||||
|
Loop = 0,
|
||||||
|
PingPong = 1,
|
||||||
|
Clamp = 2,
|
||||||
|
Random = 3
|
||||||
|
}
|
||||||
|
|
||||||
|
public struct AnimKey
|
||||||
|
{
|
||||||
|
// === File Read Order (6 bytes per key) ===
|
||||||
|
public ushort StageIndex; // Read first
|
||||||
|
public ushort DurationMs; // Read second
|
||||||
|
public ushort InterpolationCurve; // Read third - Always 0 (linear interpolation) in all 1848 keys
|
||||||
|
}
|
||||||
5
MaterialLib/MaterialLib.csproj
Normal file
5
MaterialLib/MaterialLib.csproj
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
<Project Sdk="Microsoft.NET.Sdk">
|
||||||
|
<ItemGroup>
|
||||||
|
<ProjectReference Include="..\Common\Common.csproj" />
|
||||||
|
</ItemGroup>
|
||||||
|
</Project>
|
||||||
176
MaterialLib/MaterialParser.cs
Normal file
176
MaterialLib/MaterialParser.cs
Normal file
@@ -0,0 +1,176 @@
|
|||||||
|
using System.Buffers.Binary;
|
||||||
|
using System.Text;
|
||||||
|
|
||||||
|
namespace MaterialLib;
|
||||||
|
|
||||||
|
public static class MaterialParser
|
||||||
|
{
|
||||||
|
public static MaterialFile ReadFromStream(Stream fs, string fileName, int elementCount, int magic1)
|
||||||
|
{
|
||||||
|
var file = new MaterialFile
|
||||||
|
{
|
||||||
|
FileName = fileName,
|
||||||
|
Version = elementCount,
|
||||||
|
Magic1 = magic1
|
||||||
|
};
|
||||||
|
|
||||||
|
// Derived fields
|
||||||
|
file.MaterialRenderingType = elementCount >> 2 & 0xf;
|
||||||
|
file.SupportsBumpMapping = (elementCount & 2) != 0;
|
||||||
|
file.IsParticleEffect = elementCount & 40;
|
||||||
|
|
||||||
|
// Reading content
|
||||||
|
var stageCount = fs.ReadUInt16LittleEndian();
|
||||||
|
var animCount = fs.ReadUInt16LittleEndian();
|
||||||
|
|
||||||
|
uint magic = (uint)magic1;
|
||||||
|
|
||||||
|
// Defaults found in C code
|
||||||
|
file.GlobalAlphaMultiplier = 1.0f; // field8_0x15c
|
||||||
|
file.GlobalEmissiveIntensity = 0.0f; // field9_0x160
|
||||||
|
file.SourceBlendMode = BlendMode.Unknown; // field6_0x154
|
||||||
|
file.DestBlendMode = BlendMode.Unknown; // field7_0x158
|
||||||
|
|
||||||
|
if (magic >= 2)
|
||||||
|
{
|
||||||
|
file.SourceBlendMode = (BlendMode)fs.ReadByte();
|
||||||
|
file.DestBlendMode = (BlendMode)fs.ReadByte();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (magic > 2)
|
||||||
|
{
|
||||||
|
file.GlobalAlphaMultiplier = fs.ReadFloatLittleEndian();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (magic > 3)
|
||||||
|
{
|
||||||
|
file.GlobalEmissiveIntensity = fs.ReadFloatLittleEndian();
|
||||||
|
}
|
||||||
|
|
||||||
|
// --- 2. Material Stages ---
|
||||||
|
const float Inv255 = 1.0f / 255.0f;
|
||||||
|
const float Field7Mult = 0.01f;
|
||||||
|
Span<byte> textureNameBuffer = stackalloc byte[16];
|
||||||
|
|
||||||
|
for (int i = 0; i < stageCount; i++)
|
||||||
|
{
|
||||||
|
var stage = new MaterialStage();
|
||||||
|
|
||||||
|
// === FILE READ ORDER (matches decompiled.c lines 159-217) ===
|
||||||
|
|
||||||
|
// 1. Ambient (4 bytes, A scaled by 0.01) - Lines 159-168
|
||||||
|
stage.AmbientR = fs.ReadByte() * Inv255;
|
||||||
|
stage.AmbientG = fs.ReadByte() * Inv255;
|
||||||
|
stage.AmbientB = fs.ReadByte() * Inv255;
|
||||||
|
stage.AmbientA = fs.ReadByte() * Field7Mult; // 0.01 scaling
|
||||||
|
|
||||||
|
// 2. Diffuse (4 bytes) - Lines 171-180
|
||||||
|
stage.DiffuseR = fs.ReadByte() * Inv255;
|
||||||
|
stage.DiffuseG = fs.ReadByte() * Inv255;
|
||||||
|
stage.DiffuseB = fs.ReadByte() * Inv255;
|
||||||
|
stage.DiffuseA = fs.ReadByte() * Inv255;
|
||||||
|
|
||||||
|
// 3. Specular (4 bytes) - Lines 183-192
|
||||||
|
stage.SpecularR = fs.ReadByte() * Inv255;
|
||||||
|
stage.SpecularG = fs.ReadByte() * Inv255;
|
||||||
|
stage.SpecularB = fs.ReadByte() * Inv255;
|
||||||
|
stage.SpecularA = fs.ReadByte() * Inv255;
|
||||||
|
|
||||||
|
// 4. Emissive (4 bytes) - Lines 195-204
|
||||||
|
stage.EmissiveR = fs.ReadByte() * Inv255;
|
||||||
|
stage.EmissiveG = fs.ReadByte() * Inv255;
|
||||||
|
stage.EmissiveB = fs.ReadByte() * Inv255;
|
||||||
|
stage.EmissiveA = fs.ReadByte() * Inv255;
|
||||||
|
|
||||||
|
// 5. Power (1 byte → float) - Line 207
|
||||||
|
stage.Power = (float)fs.ReadByte();
|
||||||
|
|
||||||
|
// 6. Texture Stage Index (1 byte) - Line 210
|
||||||
|
stage.TextureStageIndex = fs.ReadByte();
|
||||||
|
|
||||||
|
// 7. Texture Name (16 bytes) - Lines 212-217
|
||||||
|
textureNameBuffer.Clear();
|
||||||
|
fs.ReadExactly(textureNameBuffer);
|
||||||
|
stage.TextureName = Encoding.ASCII.GetString(textureNameBuffer).TrimEnd('\0');
|
||||||
|
|
||||||
|
file.Stages.Add(stage);
|
||||||
|
}
|
||||||
|
|
||||||
|
// --- 3. Animations ---
|
||||||
|
for (int i = 0; i < animCount; i++)
|
||||||
|
{
|
||||||
|
var anim = new MaterialAnimation();
|
||||||
|
|
||||||
|
uint typeAndParams = fs.ReadUInt32LittleEndian();
|
||||||
|
anim.Target = (AnimationTarget)(typeAndParams >> 3);
|
||||||
|
anim.LoopMode = (AnimationLoopMode)(typeAndParams & 7);
|
||||||
|
|
||||||
|
ushort keyCount = fs.ReadUInt16LittleEndian();
|
||||||
|
|
||||||
|
for (int k = 0; k < keyCount; k++)
|
||||||
|
{
|
||||||
|
var key = new AnimKey
|
||||||
|
{
|
||||||
|
StageIndex = fs.ReadUInt16LittleEndian(),
|
||||||
|
DurationMs = fs.ReadUInt16LittleEndian(),
|
||||||
|
InterpolationCurve = fs.ReadUInt16LittleEndian()
|
||||||
|
};
|
||||||
|
anim.Keys.Add(key);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Precompute description for UI to avoid per-frame allocations
|
||||||
|
anim.TargetDescription = ComputeTargetDescription(anim.Target);
|
||||||
|
|
||||||
|
file.Animations.Add(anim);
|
||||||
|
}
|
||||||
|
|
||||||
|
return file;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static string ComputeTargetDescription(AnimationTarget target)
|
||||||
|
{
|
||||||
|
// Precompute the description once during parsing
|
||||||
|
if ((int)target == 0)
|
||||||
|
return "No interpolation - entire stage is copied as-is (Flags: 0x0)";
|
||||||
|
|
||||||
|
var parts = new List<string>();
|
||||||
|
|
||||||
|
if ((target & AnimationTarget.Ambient) != 0)
|
||||||
|
parts.Add("Ambient RGB");
|
||||||
|
if ((target & AnimationTarget.Diffuse) != 0)
|
||||||
|
parts.Add("Diffuse RGB");
|
||||||
|
if ((target & AnimationTarget.Specular) != 0)
|
||||||
|
parts.Add("Specular RGB");
|
||||||
|
if ((target & AnimationTarget.Emissive) != 0)
|
||||||
|
parts.Add("Emissive RGB");
|
||||||
|
if ((target & AnimationTarget.Power) != 0)
|
||||||
|
parts.Add("Ambient.A + Power");
|
||||||
|
|
||||||
|
return $"Interpolates: {string.Join(", ", parts)} | Other components copied (Flags: 0x{(int)target:X})";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Helper extensions
|
||||||
|
internal static class StreamExtensions
|
||||||
|
{
|
||||||
|
public static float ReadFloatLittleEndian(this Stream stream)
|
||||||
|
{
|
||||||
|
Span<byte> buffer = stackalloc byte[4];
|
||||||
|
stream.ReadExactly(buffer);
|
||||||
|
return BinaryPrimitives.ReadSingleLittleEndian(buffer);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static ushort ReadUInt16LittleEndian(this Stream stream)
|
||||||
|
{
|
||||||
|
Span<byte> buffer = stackalloc byte[2];
|
||||||
|
stream.ReadExactly(buffer);
|
||||||
|
return BinaryPrimitives.ReadUInt16LittleEndian(buffer);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static uint ReadUInt32LittleEndian(this Stream stream)
|
||||||
|
{
|
||||||
|
Span<byte> buffer = stackalloc byte[4];
|
||||||
|
stream.ReadExactly(buffer);
|
||||||
|
return BinaryPrimitives.ReadUInt32LittleEndian(buffer);
|
||||||
|
}
|
||||||
|
}
|
||||||
290
MaterialLib/decompiled.c
Normal file
290
MaterialLib/decompiled.c
Normal file
@@ -0,0 +1,290 @@
|
|||||||
|
|
||||||
|
/* returns index into g_MaterialGlobalDescriptors */
|
||||||
|
|
||||||
|
int __fastcall LoadMaterialByName(char *itemname)
|
||||||
|
|
||||||
|
{
|
||||||
|
char *pcVar1;
|
||||||
|
undefined1 *puVar2;
|
||||||
|
byte *pbVar3;
|
||||||
|
uint uVar4;
|
||||||
|
undefined4 *puVar5;
|
||||||
|
int iVar6;
|
||||||
|
int iVar7;
|
||||||
|
MaterialGlobalDescriptor_ptr_4_undefined4 piVar8;
|
||||||
|
nres_metadata_item *pnVar8;
|
||||||
|
int iVar9;
|
||||||
|
MaterialStageWorldDllInternal *pMVar10;
|
||||||
|
int iVar11;
|
||||||
|
ITexture **ppIVar12;
|
||||||
|
MaterialAnimationKey *pMVar13;
|
||||||
|
MaterialGlobalDescriptor *pMVar14;
|
||||||
|
float unaff_EBX;
|
||||||
|
MaterialStageExternal *pfVar16;
|
||||||
|
ushort unaff_DI;
|
||||||
|
MaterialAnimation *pMVar15;
|
||||||
|
uint uVar16;
|
||||||
|
int iStack_90;
|
||||||
|
uint uStack_8c;
|
||||||
|
char acStack_88 [8];
|
||||||
|
int iStack_80;
|
||||||
|
char acStack_58 [88];
|
||||||
|
|
||||||
|
iVar6 = (*(*g_material_resfile)->get_index_in_file_by_itemname)(g_material_resfile,itemname);
|
||||||
|
if (iVar6 < 0) {
|
||||||
|
sprintf(acStack_58,s_Material_%s_not_found._100246f8,itemname);
|
||||||
|
/* WARNING: Subroutine does not return */
|
||||||
|
write_error_to_file_and_msgbox(acStack_58,(void *)0x0);
|
||||||
|
}
|
||||||
|
iVar7 = 0;
|
||||||
|
if (0 < g_MaterialGlobalDescriptor_count) {
|
||||||
|
pMVar14 = g_MaterialGlobalDescriptors;
|
||||||
|
do {
|
||||||
|
if (pMVar14->index_in_file == iVar6) {
|
||||||
|
if (-1 < iVar7) {
|
||||||
|
g_MaterialGlobalDescriptors[iVar7].RefCount =
|
||||||
|
g_MaterialGlobalDescriptors[iVar7].RefCount + 1;
|
||||||
|
return iVar7;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
iVar7 += 1;
|
||||||
|
pMVar14 = pMVar14 + 1;
|
||||||
|
} while (iVar7 < g_MaterialGlobalDescriptor_count);
|
||||||
|
}
|
||||||
|
iVar7 = 0;
|
||||||
|
if (0 < g_MaterialGlobalDescriptor_count) {
|
||||||
|
piVar8 = &g_MaterialGlobalDescriptors[0].RefCount;
|
||||||
|
do {
|
||||||
|
if (ADJ(piVar8)->RefCount == 0) break;
|
||||||
|
iVar7 += 1;
|
||||||
|
piVar8 = piVar8 + 0x5c;
|
||||||
|
} while (iVar7 < g_MaterialGlobalDescriptor_count);
|
||||||
|
}
|
||||||
|
if (iVar7 == g_MaterialGlobalDescriptor_count) {
|
||||||
|
g_MaterialGlobalDescriptor_count += 1;
|
||||||
|
}
|
||||||
|
iStack_80 = iVar7;
|
||||||
|
g_currentMaterialFileData_ptr =
|
||||||
|
(*(*g_material_resfile)->get_item_data_ptr_by_index)(g_material_resfile,iVar6,1);
|
||||||
|
pnVar8 = (*(*g_material_resfile)->get_metadata_ptr)(g_material_resfile);
|
||||||
|
uVar16 = 0;
|
||||||
|
uVar4 = pnVar8[iVar6].magic1;
|
||||||
|
if ((pnVar8[iVar6].element_count_or_version & 1) != 0) {
|
||||||
|
uVar16 = 0x200000;
|
||||||
|
}
|
||||||
|
g_MaterialGlobalDescriptors[iVar7].extra_meta.field0_0x0 = 0;
|
||||||
|
g_MaterialGlobalDescriptors[iVar7].extra_meta.field2_0x8 = 0;
|
||||||
|
g_MaterialGlobalDescriptors[iVar7].extra_meta.field1_0x4 =
|
||||||
|
pnVar8[iVar6].element_count_or_version >> 2 & 0xf;
|
||||||
|
iVar9 = g_bumpmapping_enabled_value;
|
||||||
|
if (((pnVar8[iVar6].element_count_or_version & 2) != 0) &&
|
||||||
|
((g_MaterialGlobalDescriptors[iVar7].extra_meta.field0_0x0 = 1, iVar9 == 0 ||
|
||||||
|
(g_supports_texture_mode_6 == 0)))) {
|
||||||
|
uVar16 |= 0x80000;
|
||||||
|
}
|
||||||
|
if ((pnVar8[iVar6].element_count_or_version & 0x40) != 0) {
|
||||||
|
g_MaterialGlobalDescriptors[iVar7].extra_meta.field2_0x8 = 1;
|
||||||
|
}
|
||||||
|
iVar9 = 0;
|
||||||
|
g_MaterialGlobalDescriptors[iVar7].RefCount = g_MaterialGlobalDescriptors[iVar7].RefCount + 1;
|
||||||
|
puVar5 = g_currentMaterialFileData_ptr;
|
||||||
|
g_MaterialGlobalDescriptors[iVar7].index_in_file = iVar6;
|
||||||
|
iVar6 = 0;
|
||||||
|
do {
|
||||||
|
pcVar1 = (char *)(iVar9 + (int)puVar5);
|
||||||
|
iVar9 += 1;
|
||||||
|
acStack_88[iVar6 + -0x1c] = *pcVar1;
|
||||||
|
iVar6 += 1;
|
||||||
|
} while (iVar6 < 2);
|
||||||
|
g_MaterialGlobalDescriptors[iVar7].stageCount = (uint)unaff_DI;
|
||||||
|
iVar6 = 0;
|
||||||
|
do {
|
||||||
|
iVar11 = iVar9;
|
||||||
|
iVar9 = iVar11 + 1;
|
||||||
|
acStack_88[iVar6 + -0x1c] = *(char *)(iVar11 + (int)puVar5);
|
||||||
|
iVar6 += 1;
|
||||||
|
} while (iVar6 < 2);
|
||||||
|
DAT_10128674 = iVar9;
|
||||||
|
g_MaterialGlobalDescriptors[iVar7].animCount = (uint)unaff_DI;
|
||||||
|
if (0x13 < unaff_DI) {
|
||||||
|
/* WARNING: Subroutine does not return */
|
||||||
|
write_error_to_file_and_msgbox(s_Too_many_animations_for_material_100246cc,(void *)0x0);
|
||||||
|
}
|
||||||
|
g_MaterialGlobalDescriptors[iVar7].field8_0x15c = 1.0;
|
||||||
|
g_MaterialGlobalDescriptors[iVar7].field9_0x160 = 0;
|
||||||
|
if (uVar4 < 2) {
|
||||||
|
g_MaterialGlobalDescriptors[iVar7].field6_0x154 = 0xff;
|
||||||
|
g_MaterialGlobalDescriptors[iVar7].field7_0x158 = 0xff;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
g_MaterialGlobalDescriptors[iVar7].field6_0x154 = (uint)*(byte *)(iVar9 + (int)puVar5);
|
||||||
|
iVar6 = iVar11 + 3;
|
||||||
|
DAT_10128674 = iVar6;
|
||||||
|
g_MaterialGlobalDescriptors[iVar7].field7_0x158 = (uint)*(byte *)(iVar11 + 2 + (int)puVar5);
|
||||||
|
if (2 < uVar4) {
|
||||||
|
iVar9 = 0;
|
||||||
|
do {
|
||||||
|
puVar2 = (undefined1 *)(iVar6 + (int)puVar5);
|
||||||
|
iVar6 += 1;
|
||||||
|
(&stack0xffffff68)[iVar9] = *puVar2;
|
||||||
|
iVar9 += 1;
|
||||||
|
} while (iVar9 < 4);
|
||||||
|
DAT_10128674 = iVar6;
|
||||||
|
g_MaterialGlobalDescriptors[iVar7].field8_0x15c = unaff_EBX;
|
||||||
|
if (3 < uVar4) {
|
||||||
|
iVar9 = 0;
|
||||||
|
do {
|
||||||
|
puVar2 = (undefined1 *)(iVar6 + (int)puVar5);
|
||||||
|
iVar6 += 1;
|
||||||
|
(&stack0xffffff68)[iVar9] = *puVar2;
|
||||||
|
iVar9 += 1;
|
||||||
|
} while (iVar9 < 4);
|
||||||
|
DAT_10128674 = iVar6;
|
||||||
|
g_MaterialGlobalDescriptors[iVar7].field9_0x160 = unaff_EBX;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
pMVar10 = (MaterialStageWorldDllInternal *)
|
||||||
|
_malloc(g_MaterialGlobalDescriptors[iVar7].stageCount * 0x4c);
|
||||||
|
g_MaterialGlobalDescriptors[iVar7].stages = pMVar10;
|
||||||
|
iVar6 = 0;
|
||||||
|
if (0 < g_MaterialGlobalDescriptors[iVar7].stageCount) {
|
||||||
|
iVar9 = 0;
|
||||||
|
do {
|
||||||
|
pfVar16 = (MaterialStageExternal *)
|
||||||
|
((int)&((g_MaterialGlobalDescriptors[iVar7].stages)->diffuse).R + iVar9);
|
||||||
|
pbVar3 = (byte *)(DAT_10128674 + (int)g_currentMaterialFileData_ptr);
|
||||||
|
DAT_10128674 += 1;
|
||||||
|
(pfVar16->ambient).R = (float)*pbVar3 * 1/255f;
|
||||||
|
pbVar3 = (byte *)(DAT_10128674 + (int)g_currentMaterialFileData_ptr);
|
||||||
|
DAT_10128674 += 1;
|
||||||
|
(pfVar16->ambient).G = (float)*pbVar3 * 1/255f;
|
||||||
|
pbVar3 = (byte *)(DAT_10128674 + (int)g_currentMaterialFileData_ptr);
|
||||||
|
DAT_10128674 += 1;
|
||||||
|
(pfVar16->ambient).B = (float)*pbVar3 * 1/255f;
|
||||||
|
pbVar3 = (byte *)(DAT_10128674 + (int)g_currentMaterialFileData_ptr);
|
||||||
|
DAT_10128674 += 1;
|
||||||
|
(pfVar16->ambient).A = (float)*pbVar3 * 0.01;
|
||||||
|
pbVar3 = (byte *)(DAT_10128674 + (int)g_currentMaterialFileData_ptr);
|
||||||
|
DAT_10128674 += 1;
|
||||||
|
(pfVar16->diffuse).R = (float)*pbVar3 * 1/255f;
|
||||||
|
pbVar3 = (byte *)(DAT_10128674 + (int)g_currentMaterialFileData_ptr);
|
||||||
|
DAT_10128674 += 1;
|
||||||
|
(pfVar16->diffuse).G = (float)*pbVar3 * 1/255f;
|
||||||
|
pbVar3 = (byte *)(DAT_10128674 + (int)g_currentMaterialFileData_ptr);
|
||||||
|
DAT_10128674 += 1;
|
||||||
|
(pfVar16->diffuse).B = (float)*pbVar3 * 1/255f;
|
||||||
|
pbVar3 = (byte *)(DAT_10128674 + (int)g_currentMaterialFileData_ptr);
|
||||||
|
DAT_10128674 += 1;
|
||||||
|
(pfVar16->diffuse).A = (float)*pbVar3 * 1/255f;
|
||||||
|
pbVar3 = (byte *)(DAT_10128674 + (int)g_currentMaterialFileData_ptr);
|
||||||
|
DAT_10128674 += 1;
|
||||||
|
(pfVar16->specular).R = (float)*pbVar3 * 1/255f;
|
||||||
|
pbVar3 = (byte *)(DAT_10128674 + (int)g_currentMaterialFileData_ptr);
|
||||||
|
DAT_10128674 += 1;
|
||||||
|
(pfVar16->specular).G = (float)*pbVar3 * 1/255f;
|
||||||
|
pbVar3 = (byte *)(DAT_10128674 + (int)g_currentMaterialFileData_ptr);
|
||||||
|
DAT_10128674 += 1;
|
||||||
|
(pfVar16->specular).B = (float)*pbVar3 * 1/255f;
|
||||||
|
pbVar3 = (byte *)(DAT_10128674 + (int)g_currentMaterialFileData_ptr);
|
||||||
|
DAT_10128674 += 1;
|
||||||
|
(pfVar16->specular).A = (float)*pbVar3 * 1/255f;
|
||||||
|
pbVar3 = (byte *)(DAT_10128674 + (int)g_currentMaterialFileData_ptr);
|
||||||
|
DAT_10128674 += 1;
|
||||||
|
(pfVar16->emissive).R = (float)*pbVar3 * 1/255f;
|
||||||
|
pbVar3 = (byte *)(DAT_10128674 + (int)g_currentMaterialFileData_ptr);
|
||||||
|
DAT_10128674 += 1;
|
||||||
|
(pfVar16->emissive).G = (float)*pbVar3 * 1/255f;
|
||||||
|
pbVar3 = (byte *)(DAT_10128674 + (int)g_currentMaterialFileData_ptr);
|
||||||
|
DAT_10128674 += 1;
|
||||||
|
(pfVar16->emissive).B = (float)*pbVar3 * 1/255f;
|
||||||
|
pbVar3 = (byte *)(DAT_10128674 + (int)g_currentMaterialFileData_ptr);
|
||||||
|
DAT_10128674 += 1;
|
||||||
|
(pfVar16->emissive).A = (float)*pbVar3 * 1/255f;
|
||||||
|
pbVar3 = (byte *)(DAT_10128674 + (int)g_currentMaterialFileData_ptr);
|
||||||
|
DAT_10128674 += 1;
|
||||||
|
pfVar16->Power = (float)(uint)*pbVar3;
|
||||||
|
pcVar1 = (char *)(DAT_10128674 + (int)g_currentMaterialFileData_ptr);
|
||||||
|
DAT_10128674 = DAT_10128674 + 1;
|
||||||
|
pfVar16->current_m_LL_ITexture = (ITexture **)(int)*pcVar1;
|
||||||
|
iVar11 = 0;
|
||||||
|
do {
|
||||||
|
pcVar1 = (char *)(DAT_10128674 + (int)g_currentMaterialFileData_ptr);
|
||||||
|
DAT_10128674 += 1;
|
||||||
|
acStack_88[iVar11] = *pcVar1;
|
||||||
|
iVar11 += 1;
|
||||||
|
} while (iVar11 < 0x10);
|
||||||
|
if (acStack_88[0] == '\0') {
|
||||||
|
pfVar16->m_LL_ITexture = (ITexture **)0xffffffff;
|
||||||
|
pfVar16->current_m_LL_ITexture = (ITexture **)0xffffffff;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
ppIVar12 = (ITexture **)LoadAndCacheTexture(acStack_88,uVar16);
|
||||||
|
pfVar16->m_LL_ITexture = ppIVar12;
|
||||||
|
}
|
||||||
|
iVar6 += 1;
|
||||||
|
iVar9 += 0x4c;
|
||||||
|
} while (iVar6 < g_MaterialGlobalDescriptors[iVar7].stageCount);
|
||||||
|
}
|
||||||
|
iVar6 = 0;
|
||||||
|
if (0 < g_MaterialGlobalDescriptors[iVar7].animCount) {
|
||||||
|
pMVar15 = g_MaterialGlobalDescriptors[iVar7].animations;
|
||||||
|
do {
|
||||||
|
puVar5 = g_currentMaterialFileData_ptr;
|
||||||
|
iVar9 = 0;
|
||||||
|
do {
|
||||||
|
pcVar1 = (char *)(DAT_10128674 + (int)g_currentMaterialFileData_ptr);
|
||||||
|
DAT_10128674 += 1;
|
||||||
|
acStack_88[iVar9 + -4] = *pcVar1;
|
||||||
|
iVar9 += 1;
|
||||||
|
} while (iVar9 < 4);
|
||||||
|
pMVar15->FieldSelector = (int)uStack_8c >> 3;
|
||||||
|
pMVar15->loop_mode = uStack_8c & 7;
|
||||||
|
iVar9 = 0;
|
||||||
|
do {
|
||||||
|
pcVar1 = (char *)(DAT_10128674 + (int)puVar5);
|
||||||
|
DAT_10128674 += 1;
|
||||||
|
acStack_88[iVar9 + -0x1c] = *pcVar1;
|
||||||
|
iVar9 += 1;
|
||||||
|
} while (iVar9 < 2);
|
||||||
|
pMVar15->keyCount = (uint)unaff_DI;
|
||||||
|
pMVar13 = (MaterialAnimationKey *)_malloc((uint)unaff_DI << 3);
|
||||||
|
pMVar15->keys = pMVar13;
|
||||||
|
iVar9 = 0;
|
||||||
|
if (0 < (int)pMVar15->keyCount) {
|
||||||
|
do {
|
||||||
|
iVar11 = 0;
|
||||||
|
do {
|
||||||
|
pcVar1 = (char *)(DAT_10128674 + (int)g_currentMaterialFileData_ptr);
|
||||||
|
DAT_10128674 += 1;
|
||||||
|
acStack_88[iVar11 + -0x1c] = *pcVar1;
|
||||||
|
iVar11 += 1;
|
||||||
|
} while (iVar11 < 2);
|
||||||
|
pMVar15->keys[iVar9].stage_index = (uint)unaff_DI;
|
||||||
|
iVar11 = 0;
|
||||||
|
do {
|
||||||
|
pcVar1 = (char *)(DAT_10128674 + (int)g_currentMaterialFileData_ptr);
|
||||||
|
DAT_10128674 += 1;
|
||||||
|
acStack_88[iVar11 + -0x1c] = *pcVar1;
|
||||||
|
iVar11 += 1;
|
||||||
|
} while (iVar11 < 2);
|
||||||
|
pMVar15->keys[iVar9].duration_ms = unaff_DI;
|
||||||
|
iVar11 = 0;
|
||||||
|
do {
|
||||||
|
pcVar1 = (char *)(DAT_10128674 + (int)g_currentMaterialFileData_ptr);
|
||||||
|
DAT_10128674 += 1;
|
||||||
|
acStack_88[iVar11 + -0x1c] = *pcVar1;
|
||||||
|
iVar11 += 1;
|
||||||
|
} while (iVar11 < 2);
|
||||||
|
pMVar15->keys[iVar9].field2_0x6 = unaff_DI;
|
||||||
|
iVar9 += 1;
|
||||||
|
} while (iVar9 < (int)pMVar15->keyCount);
|
||||||
|
}
|
||||||
|
iVar6 += 1;
|
||||||
|
pMVar15 = pMVar15 + 1;
|
||||||
|
} while (iVar6 < g_MaterialGlobalDescriptors[iVar7].animCount);
|
||||||
|
}
|
||||||
|
return iStack_90;
|
||||||
|
}
|
||||||
|
|
||||||
@@ -60,6 +60,7 @@ public class App
|
|||||||
serviceCollection.AddSingleton(new ScrViewModel());
|
serviceCollection.AddSingleton(new ScrViewModel());
|
||||||
serviceCollection.AddSingleton(new VarsetViewModel());
|
serviceCollection.AddSingleton(new VarsetViewModel());
|
||||||
serviceCollection.AddSingleton(new CpDatSchemeViewModel());
|
serviceCollection.AddSingleton(new CpDatSchemeViewModel());
|
||||||
|
serviceCollection.AddSingleton(new MaterialViewModel());
|
||||||
|
|
||||||
var serviceProvider = serviceCollection.BuildServiceProvider();
|
var serviceProvider = serviceCollection.BuildServiceProvider();
|
||||||
|
|
||||||
|
|||||||
291
NResUI/ImGuiUI/MaterialExplorerPanel.cs
Normal file
291
NResUI/ImGuiUI/MaterialExplorerPanel.cs
Normal file
@@ -0,0 +1,291 @@
|
|||||||
|
using System.Numerics;
|
||||||
|
using ImGuiNET;
|
||||||
|
using MaterialLib;
|
||||||
|
using NResUI.Abstractions;
|
||||||
|
using NResUI.Models;
|
||||||
|
|
||||||
|
namespace NResUI.ImGuiUI;
|
||||||
|
|
||||||
|
public class MaterialExplorerPanel : IImGuiPanel
|
||||||
|
{
|
||||||
|
private readonly MaterialViewModel _viewModel;
|
||||||
|
|
||||||
|
public MaterialExplorerPanel(MaterialViewModel viewModel)
|
||||||
|
{
|
||||||
|
_viewModel = viewModel;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void OnImGuiRender()
|
||||||
|
{
|
||||||
|
if (ImGui.Begin("Material Explorer"))
|
||||||
|
{
|
||||||
|
if (!_viewModel.HasFile)
|
||||||
|
{
|
||||||
|
ImGui.Text("No Material file opened");
|
||||||
|
}
|
||||||
|
else if (_viewModel.Error != null)
|
||||||
|
{
|
||||||
|
ImGui.TextColored(new Vector4(1, 0, 0, 1), $"Error: {_viewModel.Error}");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
var mat = _viewModel.MaterialFile!;
|
||||||
|
|
||||||
|
ImGui.Text($"File: {_viewModel.FilePath}");
|
||||||
|
ImGui.Separator();
|
||||||
|
|
||||||
|
// === FILE READ SEQUENCE ===
|
||||||
|
|
||||||
|
if (ImGui.CollapsingHeader("1. Metadata & Derived Fields", ImGuiTreeNodeFlags.DefaultOpen))
|
||||||
|
{
|
||||||
|
ImGui.TextDisabled("(Not from file content)");
|
||||||
|
ImGui.Text($"File Name: {mat.FileName}");
|
||||||
|
ImGui.Text($"Version (ElementCount): {mat.Version}");
|
||||||
|
ImGui.Text($"Magic1: {mat.Magic1}");
|
||||||
|
|
||||||
|
ImGui.Separator();
|
||||||
|
ImGui.TextDisabled("(Derived from Version)");
|
||||||
|
ImGui.Text($"Material Rendering Type: {mat.MaterialRenderingType}");
|
||||||
|
if (ImGui.IsItemHovered())
|
||||||
|
{
|
||||||
|
ImGui.SetTooltip("0=Standard, 1=Special, 2=Particle/Effect");
|
||||||
|
}
|
||||||
|
ImGui.Text($"Supports Bump Mapping: {mat.SupportsBumpMapping}");
|
||||||
|
ImGui.Text($"Is Particle Effect: {mat.IsParticleEffect}");
|
||||||
|
if (ImGui.IsItemHovered())
|
||||||
|
{
|
||||||
|
ImGui.SetTooltip("0=Normal material, 8=Particle/Effect (e.g., jet engines)");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ImGui.CollapsingHeader("2. File Header (Read Order)", ImGuiTreeNodeFlags.DefaultOpen))
|
||||||
|
{
|
||||||
|
ImGui.Text($"Stage Count: {mat.Stages.Count}");
|
||||||
|
ImGui.SameLine();
|
||||||
|
ImGui.TextDisabled("(2 bytes, ushort)");
|
||||||
|
|
||||||
|
ImGui.Text($"Animation Count: {mat.Animations.Count}");
|
||||||
|
ImGui.SameLine();
|
||||||
|
ImGui.TextDisabled("(2 bytes, ushort)");
|
||||||
|
|
||||||
|
ImGui.Separator();
|
||||||
|
ImGui.TextDisabled($"(Read if Magic1 >= 2)");
|
||||||
|
ImGui.Text($"Source Blend Mode: {mat.SourceBlendMode}");
|
||||||
|
if (ImGui.IsItemHovered())
|
||||||
|
{
|
||||||
|
ImGui.SetTooltip(GetBlendModeDescription(mat.SourceBlendMode));
|
||||||
|
}
|
||||||
|
ImGui.SameLine();
|
||||||
|
ImGui.TextDisabled("(1 byte)");
|
||||||
|
|
||||||
|
ImGui.Text($"Dest Blend Mode: {mat.DestBlendMode}");
|
||||||
|
if (ImGui.IsItemHovered())
|
||||||
|
{
|
||||||
|
ImGui.SetTooltip(GetBlendModeDescription(mat.DestBlendMode));
|
||||||
|
}
|
||||||
|
ImGui.SameLine();
|
||||||
|
ImGui.TextDisabled("(1 byte)");
|
||||||
|
|
||||||
|
ImGui.Separator();
|
||||||
|
ImGui.TextDisabled($"(Read if Magic1 > 2)");
|
||||||
|
ImGui.Text($"Global Alpha Multiplier: {mat.GlobalAlphaMultiplier:F3}");
|
||||||
|
if (ImGui.IsItemHovered())
|
||||||
|
{
|
||||||
|
ImGui.SetTooltip("Always 1.0 in all 628 materials - global alpha multiplier");
|
||||||
|
}
|
||||||
|
ImGui.SameLine();
|
||||||
|
ImGui.TextDisabled("(4 bytes, float)");
|
||||||
|
|
||||||
|
ImGui.Separator();
|
||||||
|
ImGui.TextDisabled($"(Read if Magic1 > 3)");
|
||||||
|
ImGui.Text($"Global Emissive Intensity: {mat.GlobalEmissiveIntensity:F3}");
|
||||||
|
if (ImGui.IsItemHovered())
|
||||||
|
{
|
||||||
|
ImGui.SetTooltip("0=no glow (99.4%), rare values: 1000, 10000");
|
||||||
|
}
|
||||||
|
ImGui.SameLine();
|
||||||
|
ImGui.TextDisabled("(4 bytes, float)");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ImGui.CollapsingHeader($"3. Stages ({mat.Stages.Count}) - 34 bytes each", ImGuiTreeNodeFlags.DefaultOpen))
|
||||||
|
{
|
||||||
|
for (int i = 0; i < mat.Stages.Count; i++)
|
||||||
|
{
|
||||||
|
var stage = mat.Stages[i];
|
||||||
|
if (ImGui.TreeNode($"Stage {i}: {stage.TextureName}"))
|
||||||
|
{
|
||||||
|
ImGui.TextDisabled("=== File Read Order (34 bytes) ===");
|
||||||
|
|
||||||
|
// 1. Ambient (4 bytes)
|
||||||
|
ImGui.Text("1. Ambient Color:");
|
||||||
|
ImGui.SameLine();
|
||||||
|
ImGui.TextDisabled("(4 bytes, A scaled by 0.01)");
|
||||||
|
var ambient = new Vector4(stage.AmbientR, stage.AmbientG, stage.AmbientB, stage.AmbientA);
|
||||||
|
ImGui.ColorEdit4("##Ambient", ref ambient, ImGuiColorEditFlags.NoInputs);
|
||||||
|
ImGui.SameLine();
|
||||||
|
ImGui.Text($"RGBA: ({stage.AmbientR:F3}, {stage.AmbientG:F3}, {stage.AmbientB:F3}, {stage.AmbientA:F3})");
|
||||||
|
|
||||||
|
// 2. Diffuse (4 bytes)
|
||||||
|
ImGui.Text("2. Diffuse Color:");
|
||||||
|
ImGui.SameLine();
|
||||||
|
ImGui.TextDisabled("(4 bytes)");
|
||||||
|
var diffuse = new Vector4(stage.DiffuseR, stage.DiffuseG, stage.DiffuseB, stage.DiffuseA);
|
||||||
|
ImGui.ColorEdit4("##Diffuse", ref diffuse, ImGuiColorEditFlags.NoInputs);
|
||||||
|
ImGui.SameLine();
|
||||||
|
ImGui.Text($"RGBA: ({stage.DiffuseR:F3}, {stage.DiffuseG:F3}, {stage.DiffuseB:F3}, {stage.DiffuseA:F3})");
|
||||||
|
|
||||||
|
// 3. Specular (4 bytes)
|
||||||
|
ImGui.Text("3. Specular Color:");
|
||||||
|
ImGui.SameLine();
|
||||||
|
ImGui.TextDisabled("(4 bytes)");
|
||||||
|
var specular = new Vector4(stage.SpecularR, stage.SpecularG, stage.SpecularB, stage.SpecularA);
|
||||||
|
ImGui.ColorEdit4("##Specular", ref specular, ImGuiColorEditFlags.NoInputs);
|
||||||
|
ImGui.SameLine();
|
||||||
|
ImGui.Text($"RGBA: ({stage.SpecularR:F3}, {stage.SpecularG:F3}, {stage.SpecularB:F3}, {stage.SpecularA:F3})");
|
||||||
|
|
||||||
|
// 4. Emissive (4 bytes)
|
||||||
|
ImGui.Text("4. Emissive Color:");
|
||||||
|
ImGui.SameLine();
|
||||||
|
ImGui.TextDisabled("(4 bytes)");
|
||||||
|
var emissive = new Vector4(stage.EmissiveR, stage.EmissiveG, stage.EmissiveB, stage.EmissiveA);
|
||||||
|
ImGui.ColorEdit4("##Emissive", ref emissive, ImGuiColorEditFlags.NoInputs);
|
||||||
|
ImGui.SameLine();
|
||||||
|
ImGui.Text($"RGBA: ({stage.EmissiveR:F3}, {stage.EmissiveG:F3}, {stage.EmissiveB:F3}, {stage.EmissiveA:F3})");
|
||||||
|
|
||||||
|
// 5. Power (1 byte)
|
||||||
|
ImGui.Text($"5. Power: {stage.Power:F3}");
|
||||||
|
ImGui.SameLine();
|
||||||
|
ImGui.TextDisabled("(1 byte -> float)");
|
||||||
|
|
||||||
|
// 6. Texture Stage Index (1 byte)
|
||||||
|
ImGui.Text($"6. Texture Stage Index: {stage.TextureStageIndex}");
|
||||||
|
if (ImGui.IsItemHovered())
|
||||||
|
{
|
||||||
|
ImGui.SetTooltip("255 = not set/default, 0-47 = reference to specific texture stage");
|
||||||
|
}
|
||||||
|
ImGui.SameLine();
|
||||||
|
ImGui.TextDisabled("(1 byte)");
|
||||||
|
|
||||||
|
// 7. Texture Name (16 bytes)
|
||||||
|
ImGui.Text($"7. Texture Name: {stage.TextureName}");
|
||||||
|
ImGui.SameLine();
|
||||||
|
ImGui.TextDisabled("(16 bytes, ASCII)");
|
||||||
|
|
||||||
|
ImGui.TreePop();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ImGui.CollapsingHeader($"4. Animations ({mat.Animations.Count})"))
|
||||||
|
{
|
||||||
|
for (int i = 0; i < mat.Animations.Count; i++)
|
||||||
|
{
|
||||||
|
var anim = mat.Animations[i];
|
||||||
|
if (ImGui.TreeNode($"Anim {i}: {anim.Target} ({anim.LoopMode})"))
|
||||||
|
{
|
||||||
|
ImGui.TextDisabled("=== File Read Order ===");
|
||||||
|
|
||||||
|
// Combined field (4 bytes)
|
||||||
|
ImGui.Text("1. Target & Loop Mode:");
|
||||||
|
ImGui.SameLine();
|
||||||
|
ImGui.TextDisabled("(4 bytes combined)");
|
||||||
|
|
||||||
|
ImGui.Indent();
|
||||||
|
ImGui.Text($"Target (bits 3-31): {anim.Target}");
|
||||||
|
if (ImGui.IsItemHovered())
|
||||||
|
{
|
||||||
|
ImGui.SetTooltip(anim.TargetDescription);
|
||||||
|
}
|
||||||
|
|
||||||
|
ImGui.Text($"Loop Mode (bits 0-2): {anim.LoopMode}");
|
||||||
|
if (ImGui.IsItemHovered())
|
||||||
|
{
|
||||||
|
ImGui.SetTooltip(GetAnimationLoopModeDescription(anim.LoopMode));
|
||||||
|
}
|
||||||
|
ImGui.Unindent();
|
||||||
|
|
||||||
|
// Key count (2 bytes)
|
||||||
|
ImGui.Text($"2. Key Count: {anim.Keys.Count}");
|
||||||
|
ImGui.SameLine();
|
||||||
|
ImGui.TextDisabled("(2 bytes, ushort)");
|
||||||
|
|
||||||
|
// Keys (6 bytes each)
|
||||||
|
ImGui.Text($"3. Keys ({anim.Keys.Count} × 6 bytes):");
|
||||||
|
if (ImGui.BeginTable($"keys_{i}", 4, ImGuiTableFlags.Borders | ImGuiTableFlags.RowBg))
|
||||||
|
{
|
||||||
|
ImGui.TableSetupColumn("#");
|
||||||
|
ImGui.TableSetupColumn("Stage Index (2 bytes)");
|
||||||
|
ImGui.TableSetupColumn("Duration ms (2 bytes)");
|
||||||
|
ImGui.TableSetupColumn("Interpolation (2 bytes)");
|
||||||
|
ImGui.TableHeadersRow();
|
||||||
|
|
||||||
|
int keyIdx = 0;
|
||||||
|
foreach (var key in anim.Keys)
|
||||||
|
{
|
||||||
|
ImGui.TableNextRow();
|
||||||
|
ImGui.TableNextColumn();
|
||||||
|
ImGui.Text(keyIdx.ToString());
|
||||||
|
ImGui.TableNextColumn();
|
||||||
|
ImGui.Text(key.StageIndex.ToString());
|
||||||
|
ImGui.TableNextColumn();
|
||||||
|
ImGui.Text(key.DurationMs.ToString());
|
||||||
|
ImGui.TableNextColumn();
|
||||||
|
ImGui.Text(key.InterpolationCurve.ToString());
|
||||||
|
if (ImGui.IsItemHovered())
|
||||||
|
{
|
||||||
|
ImGui.SetTooltip("Always 0 = linear interpolation");
|
||||||
|
}
|
||||||
|
keyIdx++;
|
||||||
|
}
|
||||||
|
ImGui.EndTable();
|
||||||
|
}
|
||||||
|
ImGui.TreePop();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
ImGui.End();
|
||||||
|
}
|
||||||
|
|
||||||
|
private static string GetBlendModeDescription(BlendMode mode)
|
||||||
|
{
|
||||||
|
return mode switch
|
||||||
|
{
|
||||||
|
BlendMode.Zero => "D3DBLEND_ZERO: Blend factor is (0, 0, 0, 0)",
|
||||||
|
BlendMode.One => "D3DBLEND_ONE: Blend factor is (1, 1, 1, 1)",
|
||||||
|
BlendMode.SrcColor => "D3DBLEND_SRCCOLOR: Blend factor is (Rs, Gs, Bs, As)",
|
||||||
|
BlendMode.InvSrcColor => "D3DBLEND_INVSRCCOLOR: Blend factor is (1-Rs, 1-Gs, 1-Bs, 1-As)",
|
||||||
|
BlendMode.SrcAlpha => "D3DBLEND_SRCALPHA: Blend factor is (As, As, As, As)",
|
||||||
|
BlendMode.InvSrcAlpha => "D3DBLEND_INVSRCALPHA: Blend factor is (1-As, 1-As, 1-As, 1-As)",
|
||||||
|
BlendMode.DestAlpha => "D3DBLEND_DESTALPHA: Blend factor is (Ad, Ad, Ad, Ad)",
|
||||||
|
BlendMode.InvDestAlpha => "D3DBLEND_INVDESTALPHA: Blend factor is (1-Ad, 1-Ad, 1-Ad, 1-Ad)",
|
||||||
|
BlendMode.DestColor => "D3DBLEND_DESTCOLOR: Blend factor is (Rd, Gd, Bd, Ad)",
|
||||||
|
BlendMode.InvDestColor => "D3DBLEND_INVDESTCOLOR: Blend factor is (1-Rd, 1-Gd, 1-Bd, 1-Ad)",
|
||||||
|
BlendMode.SrcAlphaSat => "D3DBLEND_SRCALPHASAT: Blend factor is (f, f, f, 1); f = min(As, 1-Ad)",
|
||||||
|
BlendMode.BothSrcAlpha => "D3DBLEND_BOTHSRCALPHA: Source blend factor is (As, As, As, As) and destination blend factor is (1-As, 1-As, 1-As, 1-As)",
|
||||||
|
BlendMode.BothInvSrcAlpha => "D3DBLEND_BOTHINVSRCALPHA: Source blend factor is (1-As, 1-As, 1-As, 1-As) and destination blend factor is (As, As, As, As)",
|
||||||
|
BlendMode.Unknown => "Unknown/Default (0xFF): No blending or opaque",
|
||||||
|
_ => "Unknown blend mode"
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
private static string GetAnimationTargetDescription(AnimationTarget target)
|
||||||
|
{
|
||||||
|
// NOTE: This method is now only used for fallback/debugging
|
||||||
|
// The actual UI uses MaterialAnimation.TargetDescription which is precomputed during parsing
|
||||||
|
return $"Target flags: 0x{(int)target:X}";
|
||||||
|
}
|
||||||
|
|
||||||
|
private static string GetAnimationLoopModeDescription(AnimationLoopMode mode)
|
||||||
|
{
|
||||||
|
return mode switch
|
||||||
|
{
|
||||||
|
AnimationLoopMode.Loop => "Loop: Animation repeats continuously from start to end",
|
||||||
|
AnimationLoopMode.PingPong => "PingPong: Animation plays forward then backward repeatedly",
|
||||||
|
AnimationLoopMode.Clamp => "Clamp: Animation plays once and holds at the final value",
|
||||||
|
AnimationLoopMode.Random => "Random: Animation selects random keyframes",
|
||||||
|
_ => "Unknown loop mode"
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -18,9 +18,10 @@ public class NResExplorerPanel : IImGuiPanel
|
|||||||
private readonly CpDatSchemeViewModel _cpDatSchemeViewModel;
|
private readonly CpDatSchemeViewModel _cpDatSchemeViewModel;
|
||||||
private readonly MissionTmaViewModel _missionTmaViewModel;
|
private readonly MissionTmaViewModel _missionTmaViewModel;
|
||||||
private readonly ScrViewModel _scrViewModel;
|
private readonly ScrViewModel _scrViewModel;
|
||||||
|
private readonly MaterialViewModel _materialViewModel;
|
||||||
|
|
||||||
public NResExplorerPanel(NResExplorerViewModel viewModel, TexmExplorerViewModel texmExplorerViewModel,
|
public NResExplorerPanel(NResExplorerViewModel viewModel, TexmExplorerViewModel texmExplorerViewModel,
|
||||||
VarsetViewModel varsetViewModel, CpDatSchemeViewModel cpDatSchemeViewModel, MissionTmaViewModel missionTmaViewModel, ScrViewModel scrViewModel)
|
VarsetViewModel varsetViewModel, CpDatSchemeViewModel cpDatSchemeViewModel, MissionTmaViewModel missionTmaViewModel, ScrViewModel scrViewModel, MaterialViewModel materialViewModel)
|
||||||
{
|
{
|
||||||
_viewModel = viewModel;
|
_viewModel = viewModel;
|
||||||
_texmExplorerViewModel = texmExplorerViewModel;
|
_texmExplorerViewModel = texmExplorerViewModel;
|
||||||
@@ -28,6 +29,7 @@ public class NResExplorerPanel : IImGuiPanel
|
|||||||
_cpDatSchemeViewModel = cpDatSchemeViewModel;
|
_cpDatSchemeViewModel = cpDatSchemeViewModel;
|
||||||
_missionTmaViewModel = missionTmaViewModel;
|
_missionTmaViewModel = missionTmaViewModel;
|
||||||
_scrViewModel = scrViewModel;
|
_scrViewModel = scrViewModel;
|
||||||
|
_materialViewModel = materialViewModel;
|
||||||
}
|
}
|
||||||
|
|
||||||
int contextMenuRow = -1;
|
int contextMenuRow = -1;
|
||||||
@@ -272,6 +274,28 @@ public class NResExplorerPanel : IImGuiPanel
|
|||||||
_scrViewModel.SetParseResult(parseResult, Path.Combine(_viewModel.Path!, file.FileName));
|
_scrViewModel.SetParseResult(parseResult, Path.Combine(_viewModel.Path!, file.FileName));
|
||||||
Console.WriteLine("Read .scr from context menu");
|
Console.WriteLine("Read .scr from context menu");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (ImGui.MenuItem("Open as Material"))
|
||||||
|
{
|
||||||
|
using var fs = new FileStream(_viewModel.Path!, FileMode.Open, FileAccess.Read, FileShare.Read);
|
||||||
|
fs.Seek(file.OffsetInFile, SeekOrigin.Begin);
|
||||||
|
|
||||||
|
var buffer = new byte[file.FileLength];
|
||||||
|
fs.ReadExactly(buffer, 0, file.FileLength);
|
||||||
|
using var ms = new MemoryStream(buffer);
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
var parseResult = MaterialLib.MaterialParser.ReadFromStream(ms, file.FileName, (int)file.ElementCount, file.Magic1);
|
||||||
|
_materialViewModel.SetParseResult(parseResult, Path.Combine(_viewModel.Path!, file.FileName));
|
||||||
|
Console.WriteLine("Read Material from context menu");
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
Console.WriteLine($"Error reading material: {ex}");
|
||||||
|
_materialViewModel.SetError(ex.Message);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
ImGui.EndPopup();
|
ImGui.EndPopup();
|
||||||
|
|||||||
26
NResUI/Models/MaterialViewModel.cs
Normal file
26
NResUI/Models/MaterialViewModel.cs
Normal file
@@ -0,0 +1,26 @@
|
|||||||
|
using MaterialLib;
|
||||||
|
|
||||||
|
namespace NResUI.Models;
|
||||||
|
|
||||||
|
public class MaterialViewModel
|
||||||
|
{
|
||||||
|
public MaterialFile? MaterialFile { get; private set; }
|
||||||
|
public string? FilePath { get; private set; }
|
||||||
|
public string? Error { get; private set; }
|
||||||
|
|
||||||
|
public bool HasFile => MaterialFile != null;
|
||||||
|
|
||||||
|
public void SetParseResult(MaterialFile materialFile, string filePath)
|
||||||
|
{
|
||||||
|
MaterialFile = materialFile;
|
||||||
|
FilePath = filePath;
|
||||||
|
Error = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void SetError(string error)
|
||||||
|
{
|
||||||
|
MaterialFile = null;
|
||||||
|
FilePath = null;
|
||||||
|
Error = error;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -23,6 +23,7 @@
|
|||||||
<ProjectReference Include="..\ScrLib\ScrLib.csproj" />
|
<ProjectReference Include="..\ScrLib\ScrLib.csproj" />
|
||||||
<ProjectReference Include="..\TexmLib\TexmLib.csproj" />
|
<ProjectReference Include="..\TexmLib\TexmLib.csproj" />
|
||||||
<ProjectReference Include="..\VarsetLib\VarsetLib.csproj" />
|
<ProjectReference Include="..\VarsetLib\VarsetLib.csproj" />
|
||||||
|
<ProjectReference Include="..\MaterialLib\MaterialLib.csproj" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
</Project>
|
</Project>
|
||||||
|
|||||||
@@ -6,6 +6,7 @@
|
|||||||
</Folder>
|
</Folder>
|
||||||
<Project Path="Common\Common.csproj" Type="Classic C#" />
|
<Project Path="Common\Common.csproj" Type="Classic C#" />
|
||||||
<Project Path="CpDatLib\CpDatLib.csproj" Type="Classic C#" />
|
<Project Path="CpDatLib\CpDatLib.csproj" Type="Classic C#" />
|
||||||
|
<Project Path="MaterialLib\MaterialLib.csproj" Type="Classic C#" />
|
||||||
<Project Path="MissionTmaLib/MissionTmaLib.csproj" />
|
<Project Path="MissionTmaLib/MissionTmaLib.csproj" />
|
||||||
<Project Path="NLUnpacker/NLUnpacker.csproj" />
|
<Project Path="NLUnpacker/NLUnpacker.csproj" />
|
||||||
<Project Path="NResLib/NResLib.csproj" />
|
<Project Path="NResLib/NResLib.csproj" />
|
||||||
|
|||||||
@@ -185,9 +185,9 @@ public static class Msh02
|
|||||||
public Vector3 BottomFrontRight { get; set; }
|
public Vector3 BottomFrontRight { get; set; }
|
||||||
public Vector3 BottomBackRight { get; set; }
|
public Vector3 BottomBackRight { get; set; }
|
||||||
public Vector3 BottomBackLeft { get; set; }
|
public Vector3 BottomBackLeft { get; set; }
|
||||||
public Vector3 TopFrontLeft { get; set; }
|
|
||||||
public Vector3 TopFrontRight { get; set; }
|
|
||||||
public Vector3 TopBackRight { get; set; }
|
public Vector3 TopBackRight { get; set; }
|
||||||
|
public Vector3 TopFrontRight { get; set; }
|
||||||
public Vector3 TopBackLeft { get; set; }
|
public Vector3 TopBackLeft { get; set; }
|
||||||
|
public Vector3 TopFrontLeft { get; set; }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -10,6 +10,7 @@
|
|||||||
<ProjectReference Include="..\PalLib\PalLib.csproj" />
|
<ProjectReference Include="..\PalLib\PalLib.csproj" />
|
||||||
<ProjectReference Include="..\ScrLib\ScrLib.csproj" />
|
<ProjectReference Include="..\ScrLib\ScrLib.csproj" />
|
||||||
<ProjectReference Include="..\VarsetLib\VarsetLib.csproj" />
|
<ProjectReference Include="..\VarsetLib\VarsetLib.csproj" />
|
||||||
|
<ProjectReference Include="..\MaterialLib\MaterialLib.csproj" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
</Project>
|
</Project>
|
||||||
|
|||||||
@@ -1,44 +0,0 @@
|
|||||||
using System.Buffers.Binary;
|
|
||||||
using Common;
|
|
||||||
using MissionTmaLib.Parsing;
|
|
||||||
using NResLib;
|
|
||||||
using PalLib;
|
|
||||||
using ParkanPlayground;
|
|
||||||
using VarsetLib;
|
|
||||||
|
|
||||||
// var cpDatEntryConverter = new CpDatEntryConverter();
|
|
||||||
// cpDatEntryConverter.Convert();
|
|
||||||
|
|
||||||
// var converter = new MshConverter();
|
|
||||||
|
|
||||||
// converter.Convert("E:\\ParkanUnpacked\\fortif.rlb\\133_fr_m_bunker.msh");
|
|
||||||
// converter.Convert("C:\\Program Files (x86)\\Nikita\\Iron Strategy\\DATA\\MAPS\\SC_1\\Land.msh");
|
|
||||||
// converter.Convert("E:\\ParkanUnpacked\\fortif.rlb\\73_fr_m_brige.msh");
|
|
||||||
// converter.Convert("E:\\ParkanUnpacked\\intsys.rlb\\277_MESH_o_pws_l_01.msh");
|
|
||||||
// converter.Convert("E:\\ParkanUnpacked\\static.rlb\\2_MESH_s_stn_0_01.msh");
|
|
||||||
// converter.Convert("E:\\ParkanUnpacked\\bases.rlb\\25_MESH_R_H_02.msh");
|
|
||||||
|
|
||||||
var fs = new FileStream("E:\\ParkanUnpacked\\sys.lib\\1_Palm_PAL.PAL", FileMode.Open,
|
|
||||||
FileAccess.Read, FileShare.Read);
|
|
||||||
|
|
||||||
var palFile = PalParser.ReadFromStream(fs, "1_Palm_PAL.PAL");
|
|
||||||
|
|
||||||
palFile.SaveAsPng("pal.png");
|
|
||||||
|
|
||||||
// foreach (var path in Directory.EnumerateFiles("E:\\ParkanUnpacked\\behpsp.res"))
|
|
||||||
// {
|
|
||||||
// using var fs = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.Read);
|
|
||||||
//
|
|
||||||
// var file = BinaryVarsetFileParser.Parse(fs);
|
|
||||||
//
|
|
||||||
// _ = 5;
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// {
|
|
||||||
// var fs = new FileStream("E:\\ParkanUnpacked\\behpsp.res\\31_00 00 00 00_prof_generator.var", FileMode.Open,
|
|
||||||
// FileAccess.Read, FileShare.Read);
|
|
||||||
//
|
|
||||||
// var file = BinaryVarsetFileParser.Parse(fs);
|
|
||||||
//
|
|
||||||
// _ = 5;
|
|
||||||
// }
|
|
||||||
34
README.md
34
README.md
@@ -187,18 +187,20 @@ IComponent ** LoadSomething(undefined4, undefined4, undefined4, undefined4)
|
|||||||
|
|
||||||
На основе файла `Comp.ini` и первом вызове внутри функции `World3D.dll/CreateObject` ремаппинг id:
|
На основе файла `Comp.ini` и первом вызове внутри функции `World3D.dll/CreateObject` ремаппинг id:
|
||||||
|
|
||||||
| Class ID | ClassName | Function |
|
|
||||||
|:----------:|:-------------:|--------------------------------|
|
|
||||||
| 1 | Landscape | `terrain.dll LoadLandscape` |
|
| Logic ID | ClassName | Function |
|
||||||
| 2 | Agent | `animesh.dll LoadAgent` |
|
|:--------:|:------------:|--------------------------------|
|
||||||
| 3 | Building | `terrain.dll LoadBuilding` |
|
| 1 | Landscape | `terrain.dll LoadLandscape` |
|
||||||
| 4 | Agent | `animesh.dll LoadAgent` |
|
| 2 | Agent | `animesh.dll LoadAgent` |
|
||||||
| 5 | Camera | `terrain.dll LoadCamera` |
|
| 3 | Building | `terrain.dll LoadBuilding` |
|
||||||
| 7 | Atmospehere | `terrain.dll CreateAtmosphere` |
|
| 4 | Agent | `animesh.dll LoadAgent` |
|
||||||
| 9 | Agent | `animesh.dll LoadAgent` |
|
| 5 | Camera | `terrain.dll LoadCamera` |
|
||||||
| 10 | Agent | `animesh.dll LoadAgent` |
|
| 7 | Atmosphere | `terrain.dll CreateAtmosphere` |
|
||||||
| 11 | Research | `misload.dll LoadResearch` |
|
| 9 | Agent | `animesh.dll LoadAgent` |
|
||||||
| 12 | Agent | `animesh.dll LoadAgent` |
|
| 10 | Agent | `animesh.dll LoadAgent` |
|
||||||
|
| 11 | Research | `misload.dll LoadResearch` |
|
||||||
|
| 12 | Agent | `animesh.dll LoadAgent` |
|
||||||
|
|
||||||
Будет дополняться по мере реверса.
|
Будет дополняться по мере реверса.
|
||||||
|
|
||||||
@@ -366,7 +368,7 @@ color
|
|||||||
- `4` - IShader
|
- `4` - IShader
|
||||||
- `5` - ITerrain
|
- `5` - ITerrain
|
||||||
- `6` - IGameObject
|
- `6` - IGameObject
|
||||||
- `7` - ISettings скорее всего
|
- `7` - ISettings
|
||||||
- `8` - ICamera
|
- `8` - ICamera
|
||||||
- `9` - IQueue
|
- `9` - IQueue
|
||||||
- `10` - IControl
|
- `10` - IControl
|
||||||
@@ -388,14 +390,14 @@ color
|
|||||||
- `0x20` - IJointMesh
|
- `0x20` - IJointMesh
|
||||||
- `0x21` - IShadowProcessor (придумал сам implemented by CShade)
|
- `0x21` - IShadowProcessor (придумал сам implemented by CShade)
|
||||||
- `0x22` - unknown (implement by CLandscape)
|
- `0x22` - unknown (implement by CLandscape)
|
||||||
- `0x23` - IGameSettings
|
- `0x23` - IGameSettingsRoot
|
||||||
- `0x24` - IGameObject2
|
- `0x24` - IGameObject2
|
||||||
- `0x25` - unknown (implemented by CAniMesh)
|
- `0x25` - unknown (implemented by CAniMesh)
|
||||||
- `0x26` - unknown (implemented by CAniMesh and CControl)
|
- `0x26` - unknown (implemented by CAniMesh and CControl and CWizard)
|
||||||
- `0x28` - ICollObject
|
- `0x28` - ICollObject
|
||||||
- `0x29` - IPhysicalModel
|
- `0x29` - IPhysicalModel
|
||||||
- `0x101` - I3DRender
|
- `0x101` - I3DRender
|
||||||
- `0x102` - ITexture
|
- `0x102` - ITexture (writable)
|
||||||
- `0x103` - IColorLookup
|
- `0x103` - IColorLookup
|
||||||
- `0x104` - IBitmapFont
|
- `0x104` - IBitmapFont
|
||||||
- `0x105` - INResFile
|
- `0x105` - INResFile
|
||||||
|
|||||||
@@ -26,6 +26,7 @@ public record BinaryVarsetItem<TValue>(
|
|||||||
|
|
||||||
public enum BinaryVarsetValueType
|
public enum BinaryVarsetValueType
|
||||||
{
|
{
|
||||||
|
Float0 = 0,
|
||||||
Int = 1,
|
Int = 1,
|
||||||
Bool = 2,
|
Bool = 2,
|
||||||
Float = 3,
|
Float = 3,
|
||||||
|
|||||||
629
material_field_analysis.csv
Normal file
629
material_field_analysis.csv
Normal file
@@ -0,0 +1,629 @@
|
|||||||
|
FileName,MaterialTypeMaybe,IsTerrainMaybe,SupportsTextureMode6,GlobalTransparencyMaybe,GlobalSelfIlluminationMaybe,StageCount,AnimCount,HasField18NonZero
|
||||||
|
B_PG3,0,0,True,1,000,0,000,1,1,True
|
||||||
|
B_PG4,0,0,True,1,000,0,000,1,1,True
|
||||||
|
B_PG6,0,0,True,1,000,0,000,1,1,True
|
||||||
|
B_PG2,1,0,False,1,000,0,000,1,1,True
|
||||||
|
B_PG5,0,0,True,1,000,0,000,1,1,True
|
||||||
|
B_GEN_05,0,0,True,1,000,0,000,1,1,True
|
||||||
|
B_GEN_06,0,0,True,1,000,0,000,1,1,True
|
||||||
|
B_GEN_07,0,0,True,1,000,0,000,1,1,True
|
||||||
|
B_GEN_08,0,0,True,1,000,0,000,1,1,True
|
||||||
|
B_DD1CL,0,0,True,1,000,0,000,8,1,True
|
||||||
|
B_DD1DK,0,0,True,1,000,0,000,1,1,True
|
||||||
|
B_DD2,0,0,True,1,000,0,000,1,1,True
|
||||||
|
B_RL_06,0,0,True,1,000,0,000,1,1,True
|
||||||
|
B_RL_02,0,0,True,1,000,0,000,1,1,True
|
||||||
|
B_RL_03,0,0,True,1,000,0,000,1,1,True
|
||||||
|
B_RL_19,0,0,True,1,000,0,000,1,1,True
|
||||||
|
B_RL_20,0,0,True,1,000,0,000,1,1,True
|
||||||
|
B_RL_21,0,0,True,1,000,0,000,1,1,True
|
||||||
|
B_S12,0,0,True,1,000,0,000,1,1,True
|
||||||
|
B_S0,0,0,True,1,000,0,000,1,1,True
|
||||||
|
B_S0A1,0,0,True,1,000,0,000,1,1,True
|
||||||
|
B_S1,0,0,True,1,000,0,000,1,1,True
|
||||||
|
B_S10,0,0,True,1,000,0,000,1,1,True
|
||||||
|
B_S2,0,0,True,1,000,0,000,1,1,True
|
||||||
|
B_S13,0,0,True,1,000,0,000,4,1,True
|
||||||
|
B_S14,0,0,True,1,000,0,000,1,1,True
|
||||||
|
B_S6,0,0,True,1,000,0,000,1,1,True
|
||||||
|
B_S3,0,0,True,1,000,0,000,1,1,True
|
||||||
|
B_S4,0,0,True,1,000,0,000,1,1,True
|
||||||
|
B_S5,1,0,False,1,000,0,000,1,1,True
|
||||||
|
B_S7,0,0,True,1,000,0,000,1,1,True
|
||||||
|
B_S0A2,0,0,True,1,000,0,000,1,1,True
|
||||||
|
R_PG3,0,0,True,1,000,0,000,1,1,True
|
||||||
|
R_PG4,0,0,True,1,000,0,000,1,1,True
|
||||||
|
R_PG6,0,0,True,1,000,0,000,1,1,True
|
||||||
|
R_PG7,0,0,True,1,000,0,000,1,1,True
|
||||||
|
R_PG2,1,0,False,1,000,0,000,1,1,True
|
||||||
|
R_PG5,0,0,True,1,000,0,000,1,1,True
|
||||||
|
R_GEN_05,0,0,True,1,000,0,000,1,1,True
|
||||||
|
R_GEN_06,0,0,True,1,000,0,000,1,1,True
|
||||||
|
R_GEN_07,0,0,True,1,000,0,000,1,1,True
|
||||||
|
R_GEN_08,0,0,True,1,000,0,000,1,1,True
|
||||||
|
R_DD1,0,0,True,1,000,0,000,1,1,True
|
||||||
|
R_DD1CL,0,0,True,1,000,0,000,1,1,True
|
||||||
|
R_DD1DK,0,0,True,1,000,0,000,1,1,True
|
||||||
|
R_DD2,0,0,True,1,000,0,000,1,1,True
|
||||||
|
R_RL_06,0,0,True,1,000,0,000,1,1,True
|
||||||
|
R_RL_02,0,0,True,1,000,0,000,1,1,True
|
||||||
|
R_RL_03,0,0,True,1,000,0,000,1,1,True
|
||||||
|
R_RL_20,0,0,True,1,000,0,000,1,1,True
|
||||||
|
R_RL_21,0,0,True,1,000,0,000,1,1,True
|
||||||
|
R_S12,0,0,True,1,000,0,000,1,1,True
|
||||||
|
R_S0,0,0,True,1,000,0,000,1,1,True
|
||||||
|
R_S0A1,0,0,True,1,000,0,000,1,1,True
|
||||||
|
R_S1,0,0,True,1,000,0,000,1,1,True
|
||||||
|
R_S10,0,0,True,1,000,0,000,1,1,True
|
||||||
|
R_S2,0,0,True,1,000,0,000,1,1,True
|
||||||
|
R_S6,0,0,True,1,000,0,000,1,1,True
|
||||||
|
R_S3,0,0,True,1,000,0,000,1,1,True
|
||||||
|
R_S4,0,0,True,1,000,0,000,1,1,True
|
||||||
|
R_S5,1,0,False,1,000,0,000,1,1,True
|
||||||
|
R_S7,0,0,True,1,000,0,000,1,1,True
|
||||||
|
R_S0A2,0,0,True,1,000,0,000,1,1,True
|
||||||
|
R_S13,0,0,True,1,000,0,000,4,1,True
|
||||||
|
R_S14,0,0,True,1,000,0,000,1,1,True
|
||||||
|
SKY1,1,0,False,1,000,0,000,1,1,True
|
||||||
|
B_RLW_4,0,0,True,1,000,0,000,1,1,True
|
||||||
|
R_RLW_4,0,0,True,1,000,0,000,1,1,True
|
||||||
|
DEFAULT,1,0,False,1,000,0,000,1,1,True
|
||||||
|
EXPL1,1,0,False,1,000,0,000,16,1,True
|
||||||
|
JET1,2,8,False,1,000,0,000,6,1,True
|
||||||
|
JET2,2,8,False,1,000,0,000,4,1,True
|
||||||
|
SHOOT1,1,0,False,1,000,0,000,4,1,True
|
||||||
|
JET3,2,8,False,1,000,0,000,1,1,True
|
||||||
|
SUN1,1,0,False,1,000,0,000,1,1,True
|
||||||
|
JET4,2,8,False,1,000,0,000,4,1,True
|
||||||
|
CLOUD1,1,0,False,1,000,0,000,15,1,True
|
||||||
|
SPLASH1,1,0,False,1,000,0,000,5,1,True
|
||||||
|
TRACE1,1,0,False,1,000,0,000,4,1,True
|
||||||
|
TRACE2,1,0,False,1,000,0,000,4,1,True
|
||||||
|
B_COMP_2,0,0,True,1,000,0,000,1,1,True
|
||||||
|
R_COMP_2,0,0,True,1,000,0,000,1,1,True
|
||||||
|
EXPL2,1,0,False,1,000,0,000,16,1,True
|
||||||
|
JET5,2,8,False,1,000,0,000,1,1,True
|
||||||
|
B_COMP_1,0,0,True,1,000,0,000,4,1,True
|
||||||
|
B_COMP_3,1,0,False,1,000,0,000,4,1,True
|
||||||
|
LIGHT1,2,8,False,1,000,0,000,1,1,True
|
||||||
|
BLACK,0,0,False,1,000,0,000,1,1,True
|
||||||
|
R_RLW_5,0,0,True,1,000,0,000,2,1,True
|
||||||
|
JET6,2,8,False,1,000,0,000,6,1,True
|
||||||
|
SHOOT2,1,0,False,1,000,0,000,4,1,True
|
||||||
|
JET7,2,8,False,1,000,0,000,4,1,True
|
||||||
|
SPLASH2,1,0,False,1,000,0,000,5,1,True
|
||||||
|
CLOUD2,1,0,False,1,000,0,000,15,1,True
|
||||||
|
R_MN_01,0,0,True,1,000,0,000,1,1,True
|
||||||
|
B_MN_01,0,0,True,1,000,0,000,1,1,True
|
||||||
|
B_MN_02,0,0,True,1,000,0,000,1,1,True
|
||||||
|
B_COMP_3G,1,0,False,1,000,0,000,4,1,True
|
||||||
|
B_COMP_3R,1,0,False,1,000,0,000,4,1,True
|
||||||
|
B_COMP_3B,1,0,False,1,000,0,000,4,1,True
|
||||||
|
JET8,2,8,False,1,000,0,000,6,1,True
|
||||||
|
JET9,2,8,False,1,000,0,000,4,1,True
|
||||||
|
B_MN_01R,0,0,True,1,000,0,000,4,1,True
|
||||||
|
B_MN_01G,0,0,True,1,000,0,000,4,1,True
|
||||||
|
B_MN_01B,0,0,True,1,000,0,000,4,1,True
|
||||||
|
STONE00,0,0,True,1,000,0,000,1,1,True
|
||||||
|
STONE01,0,0,True,1,000,0,000,1,1,True
|
||||||
|
TREE00,1,0,False,1,000,0,000,1,1,True
|
||||||
|
TREE01,0,0,False,1,000,0,000,1,1,True
|
||||||
|
TREE02,0,0,False,1,000,0,000,1,1,True
|
||||||
|
TREE03,1,0,False,1,000,0,000,1,1,True
|
||||||
|
TREE04,0,0,False,1,000,0,000,1,1,True
|
||||||
|
TREE05,0,0,False,1,000,0,000,1,1,True
|
||||||
|
R_RL_26,0,0,True,1,000,0,000,4,1,True
|
||||||
|
R_RL_26REV,0,0,True,1,000,0,000,4,1,True
|
||||||
|
R_RL_27,0,0,True,1,000,0,000,4,1,True
|
||||||
|
R_RL_27REV,0,0,True,1,000,0,000,4,1,True
|
||||||
|
R_RL_25,0,0,True,1,000,0,000,4,1,True
|
||||||
|
R_RL_25REV,0,0,True,1,000,0,000,4,1,True
|
||||||
|
R_RL_24,0,0,True,1,000,0,000,1,1,True
|
||||||
|
TREE06,1,0,False,1,000,0,000,1,1,True
|
||||||
|
TREE07,1,0,False,1,000,0,000,1,1,True
|
||||||
|
B_HNG_01,0,0,True,1,000,0,000,1,1,True
|
||||||
|
B_HNG_02,1,0,False,1,000,0,000,1,1,True
|
||||||
|
R_PG11,0,0,True,1,000,0,000,1,1,True
|
||||||
|
B_PG11,0,0,True,1,000,0,000,1,1,True
|
||||||
|
B_LIGHT,0,0,False,1,000,0,000,1,1,True
|
||||||
|
B_PG12,0,0,True,1,000,0,000,1,1,True
|
||||||
|
R_PG12,0,0,True,1,000,0,000,1,1,True
|
||||||
|
B_MTP_01,0,0,True,1,000,0,000,1,1,True
|
||||||
|
B_MTP_02,0,0,True,1,000,0,000,3,1,True
|
||||||
|
R_RL_19,0,0,True,1,000,0,000,1,1,True
|
||||||
|
B_RB_04,0,0,True,1,000,0,000,1,1,True
|
||||||
|
R_RB_04,0,0,True,1,000,0,000,1,1,True
|
||||||
|
R_RBW_03,0,0,True,1,000,0,000,1,1,True
|
||||||
|
DUST,1,0,False,1,000,0,000,4,1,True
|
||||||
|
SMOKE,1,0,False,1,000,0,000,4,1,True
|
||||||
|
FIRE_SMOKE,1,0,False,1,000,0,000,26,1,True
|
||||||
|
DARK_CLOUD,1,0,False,1,000,0,000,4,1,True
|
||||||
|
LASER_G,2,8,False,1,000,0,000,4,1,True
|
||||||
|
LASER_R,2,8,False,1,000,0,000,4,1,True
|
||||||
|
GLOW,1,0,False,1,000,0,000,1,1,True
|
||||||
|
LASER_Y,2,8,False,1,000,0,000,4,1,True
|
||||||
|
B_EFFECT_001,1,0,False,1,000,0,000,1,1,True
|
||||||
|
R_RMW_9,0,0,True,1,000,0,000,3,1,True
|
||||||
|
R_PG14,0,0,True,1,000,0,000,1,1,True
|
||||||
|
SHIELD1,2,8,False,1,000,0,000,7,1,True
|
||||||
|
B_LT_01,0,0,True,1,000,0,000,1,1,False
|
||||||
|
B_LT_03,0,0,True,1,000,0,000,1,1,True
|
||||||
|
B_LBL_01,0,0,True,1,000,0,000,8,8,True
|
||||||
|
CUTTER,1,0,False,1,000,0,000,4,1,True
|
||||||
|
GLOW_B,1,0,False,1,000,0,000,1,1,True
|
||||||
|
GLOW_G,1,0,False,1,000,0,000,1,1,True
|
||||||
|
GLOW_R,2,8,False,1,000,0,000,1,1,True
|
||||||
|
TREE08,1,0,False,1,000,0,000,1,1,True
|
||||||
|
TREE09,1,0,False,1,000,0,000,1,1,True
|
||||||
|
TREE10,1,0,False,1,000,0,000,1,1,True
|
||||||
|
TREE11,1,0,False,1,000,0,000,1,1,False
|
||||||
|
TREE12,1,0,False,1,000,0,000,1,1,True
|
||||||
|
TREE13,1,0,False,1,000,0,000,1,1,True
|
||||||
|
TREE14,1,0,False,1,000,0,000,1,1,True
|
||||||
|
TREE15,1,0,False,1,000,0,000,1,1,True
|
||||||
|
BALL_B,1,0,False,1,000,0,000,1,1,True
|
||||||
|
BALL_G,1,0,False,1,000,0,000,1,1,True
|
||||||
|
BALL_R,1,0,False,1,000,0,000,1,1,True
|
||||||
|
BALL_Y,1,0,False,1,000,0,000,1,1,True
|
||||||
|
BALL_W,1,0,False,1,000,0,000,1,1,True
|
||||||
|
GLOW_Y,1,0,False,1,000,0,000,1,1,True
|
||||||
|
GLOW_W,1,0,False,1,000,0,000,1,1,True
|
||||||
|
SPLASH3,1,0,False,1,000,0,000,5,1,True
|
||||||
|
LASER_B,2,8,False,1,000,0,000,4,1,True
|
||||||
|
LIGHT_W,1,0,False,1,000,0,000,1,1,True
|
||||||
|
SHOOT3,1,0,False,1,000,0,000,4,1,True
|
||||||
|
CUTTER_HIT,1,0,False,1,000,0,000,3,1,True
|
||||||
|
RAILGUN_HIT,2,8,False,1,000,0,000,3,1,True
|
||||||
|
EXPL3,1,0,False,1,000,0,000,24,1,True
|
||||||
|
R_PG9,0,0,True,1,000,0,000,1,1,True
|
||||||
|
BIRD_B,0,0,True,1,000,0,000,1,1,True
|
||||||
|
BIRD_T,0,0,True,1,000,0,000,1,1,True
|
||||||
|
BIRD_W,0,0,True,1,000,0,000,1,1,True
|
||||||
|
MATL,0,0,True,1,000,0,000,1,1,True
|
||||||
|
B_MTP_06,0,0,True,1,000,0,000,1,1,True
|
||||||
|
B_MTP_07,0,0,True,1,000,0,000,1,1,True
|
||||||
|
B_MTP_04,0,0,True,1,000,0,000,1,1,True
|
||||||
|
B_MTP_03,0,0,True,1,000,0,000,1,1,True
|
||||||
|
B_MTP_03R,0,0,True,1,000,0,000,1,1,True
|
||||||
|
B_MTP_03B,0,0,True,1,000,0,000,1,1,True
|
||||||
|
B_MTP_05,0,0,True,1,000,0,000,1,1,True
|
||||||
|
B_MTP_06B,0,0,True,1,000,0,000,1,1,True
|
||||||
|
B_MTP_06R,0,0,True,1,000,0,000,1,1,True
|
||||||
|
B_MTP_06G,0,0,True,1,000,0,000,1,1,True
|
||||||
|
B_MTP_06Y,0,0,True,1,000,0,000,1,1,True
|
||||||
|
B_MTP_07Y,0,0,True,1,000,0,000,1,1,True
|
||||||
|
B_MTP_07R,0,0,True,1,000,0,000,1,1,True
|
||||||
|
B_MTP_07G,0,0,True,1,000,0,000,1,1,True
|
||||||
|
B_MTP_07B,0,0,True,1,000,0,000,1,1,True
|
||||||
|
R_PG17,0,0,True,1,000,0,000,1,1,True
|
||||||
|
R_PG18,0,0,True,1,000,0,000,1,1,True
|
||||||
|
R_PG19,0,0,True,1,000,0,000,1,1,True
|
||||||
|
R_PG20,0,0,True,1,000,0,000,1,1,True
|
||||||
|
R_SLD_POD,0,0,True,1,000,0,000,1,1,True
|
||||||
|
R_SLD_GL,1,0,False,1,000,0,000,1,1,True
|
||||||
|
BIRD_U,0,0,True,1,000,0,000,1,1,True
|
||||||
|
SHIELD_R,2,8,False,1,000,0,000,10,1,True
|
||||||
|
SHIELD_G,2,8,False,1,000,0,000,10,1,True
|
||||||
|
SHIELD_B,2,8,False,1,000,0,000,10,1,True
|
||||||
|
B_MTP_07E,0,0,True,1,000,0,000,1,1,True
|
||||||
|
B_MTP_08,0,0,True,1,000,0,000,3,1,True
|
||||||
|
LASER_R_HIT,2,8,False,1,000,0,000,6,1,True
|
||||||
|
LASER_G_HIT,2,8,False,1,000,0,000,6,1,True
|
||||||
|
LASER_B_HIT,2,8,False,1,000,0,000,6,1,True
|
||||||
|
LASER_Y_HIT,2,8,False,1,000,0,000,6,1,True
|
||||||
|
B_P00,0,0,True,1,000,0,000,1,1,True
|
||||||
|
AIGRETTE_Y,1,0,False,1,000,0,000,3,1,True
|
||||||
|
AIGRETTE_R,1,0,False,1,000,0,000,3,1,True
|
||||||
|
AIGRETTE_G,1,0,False,1,000,0,000,3,1,True
|
||||||
|
AIGRETTE_B,1,0,False,1,000,0,000,3,1,True
|
||||||
|
B_LT_01R,0,0,True,1,000,0,000,1,1,False
|
||||||
|
B_LT_01G,0,0,True,1,000,0,000,1,1,False
|
||||||
|
B_LT_01B,0,0,True,1,000,0,000,1,1,False
|
||||||
|
B_LT_01Y,0,0,True,1,000,0,000,1,1,False
|
||||||
|
B_COMP_4,0,0,True,1,000,0,000,1,1,True
|
||||||
|
B_COMP_4R,0,0,True,1,000,0,000,1,1,True
|
||||||
|
B_COMP_4G,0,0,True,1,000,0,000,1,1,True
|
||||||
|
B_COMP_4B,0,0,True,1,000,0,000,1,1,True
|
||||||
|
B_COMP_4Y,0,0,True,1,000,0,000,1,1,True
|
||||||
|
B_LT_03B,0,0,True,1,000,0,000,1,1,True
|
||||||
|
B_LT_03R,0,0,True,1,000,0,000,1,1,True
|
||||||
|
B_LT_03G,0,0,True,1,000,0,000,1,1,True
|
||||||
|
B_LT_03Y,0,0,True,1,000,0,000,1,1,True
|
||||||
|
B_MN_03,0,0,True,1,000,0,000,1,1,True
|
||||||
|
B_MN_03R,0,0,True,1,000,0,000,1,1,True
|
||||||
|
B_MN_03G,0,0,True,1,000,0,000,1,1,True
|
||||||
|
B_MN_03B,0,0,True,1,000,0,000,1,1,True
|
||||||
|
B_MN_03Y,0,0,True,1,000,0,000,1,1,True
|
||||||
|
B_LT_04,0,0,True,1,000,0,000,1,1,True
|
||||||
|
CLOUD3,1,0,False,1,000,0,000,15,1,True
|
||||||
|
B_GEN_09,0,0,True,1,000,0,000,1,1,True
|
||||||
|
R_GEN_09,0,0,True,1,000,0,000,1,1,True
|
||||||
|
B_GEN_08L,0,0,True,1,000,0,000,1,1,True
|
||||||
|
B_S3L,0,0,True,1,000,0,000,1,1,True
|
||||||
|
B_S4L,0,0,True,1,000,0,000,1,1,True
|
||||||
|
PORTAL_001,1,0,False,1,000,0,000,2,1,False
|
||||||
|
PORTAL_004,1,0,False,1,000,0,000,2,1,True
|
||||||
|
B_GEN_10,0,0,True,1,000,0,000,1,1,True
|
||||||
|
B_GEN_11,0,0,True,1,000,0,000,1,1,True
|
||||||
|
HWOY01,1,0,False,1,000,0,000,1,1,True
|
||||||
|
FTREE1,1,0,False,1,000,0,000,1,1,True
|
||||||
|
HTREE1,1,0,False,1,000,0,000,1,1,True
|
||||||
|
KORA,0,0,True,1,000,0,000,1,1,True
|
||||||
|
KORA2,0,0,True,1,000,0,000,1,1,True
|
||||||
|
SKIN02,0,0,True,1,000,0,000,1,1,True
|
||||||
|
B_LT_02,0,0,True,1,000,0,000,1,1,True
|
||||||
|
EXPL4,1,0,False,1,000,0,000,29,1,True
|
||||||
|
SHOOT4,1,0,False,1,000,0,000,4,1,True
|
||||||
|
SPLASH4,1,0,False,1,000,0,000,6,1,True
|
||||||
|
EXPL5,1,0,False,1,000,0,000,4,1,True
|
||||||
|
EXPL6,1,0,False,1,000,0,000,8,1,True
|
||||||
|
SPLASH5,1,0,False,1,000,0,000,6,1,True
|
||||||
|
SPLASH6,1,0,False,1,000,0,000,6,1,True
|
||||||
|
B_MTP_02L,0,0,True,1,000,0,000,3,1,True
|
||||||
|
B_MTP_01L,0,0,True,1,000,0,000,1,1,True
|
||||||
|
B_GEN_05L,0,0,True,1,000,0,000,1,1,True
|
||||||
|
B_P08,1,0,False,1,000,0,000,2,1,True
|
||||||
|
B_P10,1,0,False,1,000,0,000,2,1,True
|
||||||
|
B_P11,1,0,False,1,000,0,000,2,1,True
|
||||||
|
B_P13,1,0,False,1,000,0,000,2,1,True
|
||||||
|
LAMP,1,0,False,1,000,0,000,1,1,True
|
||||||
|
LASER_W_HIT,2,8,False,1,000,0,000,6,1,True
|
||||||
|
SPITTLE_R,1,0,False,1,000,0,000,16,1,True
|
||||||
|
SPITTLE_G,1,0,False,1,000,0,000,16,1,True
|
||||||
|
SHOOT5,1,0,False,1,000,0,000,4,1,True
|
||||||
|
ALIEN_BALL,1,0,False,1,000,0,000,1,1,True
|
||||||
|
ALIENSKIN,0,0,True,1,000,0,000,1,1,True
|
||||||
|
CLOUD_G,1,0,False,1,000,0,000,15,1,True
|
||||||
|
CLOUD_R,1,0,False,1,000,0,000,15,1,True
|
||||||
|
CLOUD_B,1,0,False,1,000,0,000,15,1,True
|
||||||
|
BUILD_SPHERE,1,0,False,1,000,0,000,4,1,True
|
||||||
|
BUILD_MIRACLE,1,0,False,1,000,0,000,4,1,True
|
||||||
|
BUILD_GALO,1,0,False,1,000,0,000,4,1,True
|
||||||
|
SHIELD_Y,2,8,False,1,000,0,000,10,1,True
|
||||||
|
PLAS_BUL,2,8,False,1,000,0,000,4,1,True
|
||||||
|
PLAS_SHOOT,2,8,False,1,000,0,000,6,1,True
|
||||||
|
GLOW_V,1,0,False,1,000,0,000,1,1,True
|
||||||
|
LASER_V,2,8,False,1,000,0,000,4,1,True
|
||||||
|
LASER_V_HIT,2,8,False,1,000,0,000,6,1,True
|
||||||
|
ENV_MOON,1,0,False,1,000,0,000,1,1,True
|
||||||
|
ENV_STARS,1,0,False,1,000,0,000,1,1,True
|
||||||
|
ENV_FLARE_00,2,8,False,1,000,0,000,1,1,True
|
||||||
|
ENV_FLARE_01,2,8,False,1,000,0,000,1,1,True
|
||||||
|
SHOOK,1,0,False,1,000,0,000,4,1,True
|
||||||
|
SHOOK_B,1,0,False,1,000,0,000,4,1,True
|
||||||
|
ENV_CLOUDS,1,0,False,1,000,0,000,1,1,True
|
||||||
|
BUILD_SHOOT,1,0,False,1,000,0,000,1,1,True
|
||||||
|
BUILD_FLY,1,0,False,1,000,0,000,8,1,True
|
||||||
|
ENV_SUN,1,0,False,1,000,0,000,1,1,False
|
||||||
|
FIRE_SMOKE_W,1,0,False,1,000,0,000,23,1,True
|
||||||
|
B_MN_01Y,0,0,True,1,000,0,000,4,1,True
|
||||||
|
R_LBL_01,0,0,True,1,000,0,000,8,8,True
|
||||||
|
TREE16,1,0,False,1,000,0,000,1,1,True
|
||||||
|
B_RBW_3,0,0,True,1,000,0,000,1,1,True
|
||||||
|
SNOWFLAKE,1,0,False,1,000,0,000,1,1,True
|
||||||
|
FIRESTORM,1,0,False,1,000,0,000,8,1,True
|
||||||
|
RAIN_DROP,1,0,False,1,000,0,000,1,1,True
|
||||||
|
B_TELEPORT,1,0,False,1,000,0,000,3,1,True
|
||||||
|
B_TELEPORT2,1,0,False,1,000,0,000,2,1,True
|
||||||
|
WATER,0,0,False,1,000,0,000,1,1,True
|
||||||
|
WATER_DROP,1,0,False,1,000,0,000,6,1,True
|
||||||
|
WATER_DROP_R,1,0,False,1,000,0,000,6,1,True
|
||||||
|
WATER_DROP_G,1,0,False,1,000,0,000,6,1,True
|
||||||
|
WATER_DROP_B,1,0,False,1,000,0,000,6,1,True
|
||||||
|
WATER_M,0,0,False,1,000,0,000,10,1,True
|
||||||
|
B_MTP_04G,0,0,True,1,000,0,000,1,1,True
|
||||||
|
TASER_SHOOT,1,0,False,1,000,0,000,6,1,True
|
||||||
|
SHOOK2,1,0,False,1,000,0,000,4,1,True
|
||||||
|
SHOOK2_B,1,0,False,1,000,0,000,4,1,True
|
||||||
|
TASER_HIT,1,0,False,1,000,0,000,6,1,True
|
||||||
|
B_MTP_07BT,0,0,True,1,000,0,000,3,1,True
|
||||||
|
B_LT_04_PG7,0,0,True,1,000,0,000,1,1,True
|
||||||
|
B_LT_04R_PG7,0,0,True,1,000,0,000,1,1,True
|
||||||
|
B_LT_04G_PG7,0,0,True,1,000,0,000,1,1,True
|
||||||
|
B_LT_04B_PG7,0,0,True,1,000,0,000,1,1,True
|
||||||
|
B_LT_04Y_PG7,0,0,True,1,000,0,000,1,1,True
|
||||||
|
B_RB_04L,0,0,True,1,000,0,000,1,1,True
|
||||||
|
B_PG4L,0,0,True,1,000,0,000,1,1,True
|
||||||
|
B_S6L,0,0,True,1,000,0,000,1,1,True
|
||||||
|
B_PG11L,0,0,True,1,000,0,000,1,1,True
|
||||||
|
B_RBW_3L,0,0,True,1,000,0,000,1,1,True
|
||||||
|
B_RL_06L,0,0,True,1,000,0,000,1,1,True
|
||||||
|
B_DD1DK_DAM,0,0,True,1,000,1000,000,1,1,True
|
||||||
|
B_S0_DAM,0,0,True,1,000,1000,000,1,1,True
|
||||||
|
B_PLT_01,0,0,True,1,000,0,000,1,1,True
|
||||||
|
B_PLT_02,0,0,True,1,000,0,000,1,1,True
|
||||||
|
B_PLT_03,0,0,True,1,000,0,000,1,1,True
|
||||||
|
B_PLT_05,0,0,True,1,000,0,000,1,1,False
|
||||||
|
B_PLT_06,0,0,True,1,000,0,000,1,1,True
|
||||||
|
B_PLT_04,0,0,True,1,000,0,000,2,1,True
|
||||||
|
ENV_LAVA,1,0,False,1,000,0,000,1,1,True
|
||||||
|
ENV_LAVA_M,1,0,False,1,000,0,000,4,1,True
|
||||||
|
DARK_SMOKE,1,0,False,1,000,0,000,17,1,True
|
||||||
|
ENV_CLOUDS_2,1,0,False,1,000,0,000,1,1,True
|
||||||
|
ENV_SUN_2,1,0,False,1,000,0,000,1,1,True
|
||||||
|
ENV_FLARE_01_2,2,8,False,1,000,0,000,1,1,True
|
||||||
|
ENV_FLARE_00_2,2,8,False,1,000,0,000,1,1,True
|
||||||
|
ENV_NEBULA_2,1,0,False,1,000,0,000,1,1,True
|
||||||
|
ENV_MOON_2,1,0,False,1,000,0,000,1,1,True
|
||||||
|
ENV_CLOUDS_3,1,0,False,1,000,0,000,1,1,True
|
||||||
|
ENV_CLOUDS_4,1,0,False,1,000,0,000,1,1,True
|
||||||
|
FIRE_SMOKE_Y,1,0,False,1,000,0,000,23,1,True
|
||||||
|
APKORA,0,0,True,1,000,0,000,1,1,True
|
||||||
|
NTREE1,1,0,False,1,000,0,000,1,1,True
|
||||||
|
B_RU01,0,0,True,1,000,0,000,1,1,True
|
||||||
|
B_RU02,0,0,True,1,000,0,000,1,1,True
|
||||||
|
B_RU03,0,0,True,1,000,0,000,1,1,True
|
||||||
|
FIRE,1,0,False,1,000,0,000,23,1,True
|
||||||
|
PG24,1,0,False,1,000,0,000,1,1,True
|
||||||
|
PG25,1,0,False,1,000,0,000,1,1,True
|
||||||
|
PG26,0,0,True,1,000,0,000,1,1,True
|
||||||
|
ICE2,1,0,False,1,000,0,000,1,1,True
|
||||||
|
ENV_MOON_3,1,0,False,1,000,0,000,1,1,True
|
||||||
|
ENV_MOON_4,1,0,False,1,000,0,000,1,1,True
|
||||||
|
ENV_MOON_5,1,0,False,1,000,0,000,1,1,True
|
||||||
|
ENV_SUN_1,1,0,False,1,000,0,000,1,1,False
|
||||||
|
B_PLT_07,0,0,True,1,000,0,000,1,1,True
|
||||||
|
ENV_CLOUDS_5,1,0,False,1,000,0,000,1,1,True
|
||||||
|
MAT_DROP,1,0,False,1,000,0,000,1,1,True
|
||||||
|
R_TPG02,0,0,True,1,000,0,000,1,1,True
|
||||||
|
R_TPG01,0,0,True,1,000,0,000,1,1,True
|
||||||
|
R_LAUSE2,0,0,True,1,000,0,000,1,1,True
|
||||||
|
R_LAUSE,0,0,True,1,000,0,000,1,1,True
|
||||||
|
R_LAULEG1,0,0,True,1,000,0,000,1,1,True
|
||||||
|
ENV_CLOUDS_6,1,0,False,1,000,0,000,1,1,True
|
||||||
|
R_AIM,0,0,True,1,000,0,000,1,1,True
|
||||||
|
B_FOUND,1,0,False,1,000,0,000,1,1,True
|
||||||
|
ENV_NEBULA_0,1,0,False,1,000,0,000,1,1,True
|
||||||
|
ENV_NEBULA_1,1,0,False,1,000,0,000,1,1,True
|
||||||
|
ENV_NEBULA_3,1,0,False,1,000,0,000,1,1,True
|
||||||
|
ENV_SUN_6,1,0,False,1,000,0,000,1,1,True
|
||||||
|
ENV_SUN_3,1,0,False,1,000,0,000,1,1,False
|
||||||
|
ENV_SUN_4,1,0,False,1,000,0,000,1,1,True
|
||||||
|
ENV_SUN_5,1,0,False,1,000,0,000,1,1,True
|
||||||
|
B_PLT_06_NS,0,0,True,1,000,0,000,1,1,True
|
||||||
|
SNOWFLAKE_B,1,0,False,1,000,0,000,1,1,True
|
||||||
|
B_A_BRIGE,1,0,False,1,000,0,000,4,1,True
|
||||||
|
B_PLT_08,0,0,True,1,000,0,000,1,1,True
|
||||||
|
R_NP01,0,0,True,1,000,0,000,1,1,True
|
||||||
|
R_NP03,0,0,True,1,000,0,000,1,1,True
|
||||||
|
R_NP04,0,0,True,1,000,0,000,1,1,True
|
||||||
|
R_TB08,0,0,True,1,000,0,000,1,1,False
|
||||||
|
R_TB09,0,0,True,1,000,0,000,1,1,True
|
||||||
|
R_TB10,0,0,True,1,000,0,000,1,1,True
|
||||||
|
R_TB12,0,0,True,1,000,0,000,1,1,True
|
||||||
|
R_TB19,0,0,True,1,000,0,000,1,1,True
|
||||||
|
R_NP05,0,0,True,1,000,0,000,1,1,True
|
||||||
|
ENV_LIGHTNING,2,8,False,1,000,0,000,1,1,True
|
||||||
|
MINERALS,1,0,False,1,000,0,000,4,1,True
|
||||||
|
MINERAL_CIRCLE,1,0,False,1,000,0,000,1,1,True
|
||||||
|
MINERAL_RAY,1,0,False,1,000,0,000,4,1,True
|
||||||
|
R_NP06,0,0,True,1,000,0,000,1,1,True
|
||||||
|
R_BG_15,0,0,True,1,000,0,000,1,1,True
|
||||||
|
R_BG_10,0,0,True,1,000,0,000,1,1,False
|
||||||
|
R_BG_11,0,0,True,1,000,0,000,1,1,True
|
||||||
|
R_MG_01,0,0,True,1,000,0,000,1,1,True
|
||||||
|
R_MG_02,0,0,True,1,000,0,000,1,1,True
|
||||||
|
R_LG_01,0,0,True,1,000,0,000,1,1,True
|
||||||
|
R_LG_02,0,0,True,1,000,0,000,1,1,True
|
||||||
|
R_TG_01,0,0,True,1,000,0,000,1,1,True
|
||||||
|
R_TG_02,0,0,True,1,000,0,000,1,1,True
|
||||||
|
R_NP07,0,0,True,1,000,0,000,1,1,True
|
||||||
|
R_NP08,0,0,True,1,000,0,000,1,1,True
|
||||||
|
R_NP09,0,0,True,1,000,0,000,1,1,True
|
||||||
|
R_TB32,0,0,True,1,000,0,000,1,1,True
|
||||||
|
R_TB33,0,0,True,1,000,0,000,1,1,True
|
||||||
|
R_TB34,0,0,True,1,000,0,000,1,1,True
|
||||||
|
R_TB26,0,0,True,1,000,0,000,1,1,False
|
||||||
|
R_GB05,0,0,True,1,000,0,000,1,1,False
|
||||||
|
R_GB10,0,0,True,1,000,0,000,1,1,True
|
||||||
|
R_GB09,0,0,True,1,000,0,000,1,1,True
|
||||||
|
R_FL_PG,0,0,True,1,000,0,000,1,1,True
|
||||||
|
R_NP10,0,0,True,1,000,0,000,1,1,True
|
||||||
|
R_GB17,0,0,True,1,000,0,000,1,1,True
|
||||||
|
R_GB19,0,0,True,1,000,0,000,1,1,True
|
||||||
|
R_GB18,0,0,True,1,000,0,000,1,1,True
|
||||||
|
R_GB16,0,0,True,1,000,0,000,4,1,True
|
||||||
|
R_GB24,0,0,True,1,000,0,000,1,1,True
|
||||||
|
R_GB27,0,0,True,1,000,0,000,1,1,True
|
||||||
|
R_GB33,0,0,True,1,000,0,000,1,1,True
|
||||||
|
R_GB34,0,0,True,1,000,0,000,1,1,False
|
||||||
|
R_GB46,0,0,True,1,000,0,000,1,1,True
|
||||||
|
R_GB45,0,0,True,1,000,0,000,1,1,True
|
||||||
|
R_GB47,0,0,True,1,000,0,000,1,1,True
|
||||||
|
R_GB48,0,0,True,1,000,0,000,1,1,True
|
||||||
|
R_GB50,0,0,True,1,000,0,000,4,1,True
|
||||||
|
R_GB51,0,0,True,1,000,0,000,4,1,True
|
||||||
|
R_GB52,0,0,True,1,000,0,000,4,1,True
|
||||||
|
R_ENG_PG,0,0,True,1,000,0,000,1,1,True
|
||||||
|
R_NM_PG,0,0,True,1,000,0,000,1,1,True
|
||||||
|
R_NRS_PG,0,0,True,1,000,0,000,1,1,True
|
||||||
|
R_NSS_PG,0,0,True,1,000,0,000,1,1,True
|
||||||
|
L00,0,0,False,1,000,0,000,2,2,True
|
||||||
|
L01,0,0,False,1,000,0,000,2,2,True
|
||||||
|
L02,0,0,False,1,000,0,000,2,2,True
|
||||||
|
L03,0,0,False,1,000,0,000,2,2,True
|
||||||
|
L04,0,0,False,1,000,0,000,2,2,True
|
||||||
|
L05,0,0,False,1,000,0,000,2,2,True
|
||||||
|
L06,0,0,False,1,000,0,000,2,2,True
|
||||||
|
L07,0,0,False,1,000,0,000,2,2,True
|
||||||
|
L08,0,0,False,1,000,0,000,2,1,True
|
||||||
|
L09,0,0,False,1,000,0,000,2,2,True
|
||||||
|
L10,0,0,False,1,000,0,000,2,2,True
|
||||||
|
L11,0,0,False,1,000,0,000,2,2,True
|
||||||
|
L13,0,0,False,1,000,0,000,2,2,True
|
||||||
|
L14,0,0,False,1,000,0,000,2,2,True
|
||||||
|
L15,0,0,False,1,000,0,000,2,2,True
|
||||||
|
L16,0,0,False,1,000,0,000,2,2,True
|
||||||
|
L17,0,0,False,1,000,0,000,2,2,True
|
||||||
|
L18,0,0,False,1,000,0,000,2,2,True
|
||||||
|
L19,0,0,False,1,000,0,000,2,2,True
|
||||||
|
L20,0,0,False,1,000,0,000,2,2,True
|
||||||
|
L21,0,0,False,1,000,0,000,2,2,True
|
||||||
|
L22,0,0,False,1,000,0,000,2,2,True
|
||||||
|
L23,0,0,False,1,000,0,000,2,2,True
|
||||||
|
L24,0,0,False,1,000,0,000,2,2,True
|
||||||
|
L25,0,0,False,1,000,0,000,2,2,True
|
||||||
|
L26,0,0,False,1,000,0,000,2,2,True
|
||||||
|
L27,0,0,False,1,000,0,000,2,2,True
|
||||||
|
L28,0,0,False,1,000,0,000,2,2,True
|
||||||
|
L29,0,0,False,1,000,0,000,2,2,True
|
||||||
|
L30,0,0,False,1,000,0,000,2,2,True
|
||||||
|
L31,0,0,False,1,000,0,000,2,2,True
|
||||||
|
L32,0,0,False,1,000,0,000,2,1,True
|
||||||
|
L33,0,0,False,1,000,0,000,2,2,True
|
||||||
|
L34,0,0,False,1,000,0,000,2,2,True
|
||||||
|
L35,0,0,False,1,000,0,000,2,2,True
|
||||||
|
L36,0,0,False,1,000,0,000,2,2,True
|
||||||
|
L37,0,0,False,1,000,0,000,2,2,True
|
||||||
|
L38,0,0,False,1,000,0,000,2,2,True
|
||||||
|
L39,0,0,False,1,000,0,000,2,2,True
|
||||||
|
L40,0,0,False,1,000,0,000,2,2,True
|
||||||
|
L41,0,0,False,1,000,0,000,2,2,True
|
||||||
|
L42,0,0,False,1,000,0,000,2,2,True
|
||||||
|
L43,0,0,False,1,000,0,000,2,2,True
|
||||||
|
R_NP12,0,0,True,1,000,0,000,1,1,True
|
||||||
|
R_NP11,0,0,True,1,000,0,000,1,1,True
|
||||||
|
R_TM05,0,0,True,1,000,0,000,1,1,False
|
||||||
|
R_TM13,0,0,True,1,000,0,000,1,1,True
|
||||||
|
R_TM12,0,0,True,1,000,0,000,1,1,True
|
||||||
|
R_TT05,0,0,True,1,000,0,000,1,1,False
|
||||||
|
R_NTT05,0,0,True,1,000,0,000,4,1,True
|
||||||
|
R_NTT08,0,0,True,1,000,0,000,1,1,True
|
||||||
|
R_NSM_PG,0,0,True,1,000,0,000,1,1,True
|
||||||
|
R_NP13,0,0,True,1,000,0,000,1,1,True
|
||||||
|
R_NTT22,0,0,True,1,000,0,000,1,1,False
|
||||||
|
B_PG30,0,0,True,1,000,0,000,1,1,True
|
||||||
|
B_PG31,0,0,True,1,000,0,000,1,1,True
|
||||||
|
R_PG30,0,0,True,1,000,0,000,1,1,True
|
||||||
|
R_PG31,0,0,True,1,000,0,000,1,1,True
|
||||||
|
ELKA,1,0,False,1,000,0,000,1,1,False
|
||||||
|
TRCH02,0,0,True,1,000,0,000,1,1,False
|
||||||
|
GRASS,1,0,False,1,000,0,000,1,1,True
|
||||||
|
ICE01,1,0,False,1,000,0,000,1,1,True
|
||||||
|
LEAF01,1,0,False,1,000,0,000,1,1,False
|
||||||
|
SUNFLOWR,0,0,True,1,000,0,000,1,1,True
|
||||||
|
BAO01,1,0,False,1,000,0,000,1,1,True
|
||||||
|
DHORNO1,0,0,True,1,000,0,000,1,1,True
|
||||||
|
DHORN01,0,0,True,1,000,0,000,1,1,True
|
||||||
|
TRCH01,1,0,False,1,000,0,000,1,1,True
|
||||||
|
TRCH03,0,0,True,1,000,0,000,1,1,True
|
||||||
|
TRCH04,0,0,True,1,000,0,000,1,1,True
|
||||||
|
TRCH05,0,0,True,1,000,0,000,1,1,True
|
||||||
|
DEFL_B,1,0,False,1,000,0,000,4,1,True
|
||||||
|
ENV_WAVE,2,8,False,1,000,0,000,1,1,True
|
||||||
|
DEFL_G,1,0,False,1,000,0,000,4,1,True
|
||||||
|
SHOOK_BC,1,0,False,1,000,0,000,1,1,True
|
||||||
|
SMOKE_W,1,0,False,1,000,0,000,10,1,True
|
||||||
|
ENV_LAVA_BOT,0,0,False,1,000,10000,000,2,2,True
|
||||||
|
WATER_BOT,0,0,False,1,000,10000,000,2,2,True
|
||||||
|
ENV_WAVE_B,2,8,False,1,000,0,000,1,1,True
|
||||||
|
ENV_WAVE_G,2,8,False,1,000,0,000,1,1,True
|
||||||
|
HLP_RED_ME,0,0,True,1,000,0,000,1,1,True
|
||||||
|
B_COMP_1SI,0,0,True,1,000,0,000,4,1,True
|
||||||
|
HLP_GLOW_B,1,0,False,1,000,0,000,3,1,True
|
||||||
|
HLP_LAMP_B,0,0,True,1,000,0,000,3,1,True
|
||||||
|
HLP_PLACE_B,0,0,True,1,000,0,000,3,1,True
|
||||||
|
HLP_RAY_B,1,0,False,1,000,0,000,3,1,True
|
||||||
|
HLP_SIGN_B,1,0,False,1,000,0,000,3,1,True
|
||||||
|
ENV_WAVE_R,2,8,False,1,000,0,000,1,1,True
|
||||||
|
R_NRS_PGL,0,0,True,1,000,0,000,3,1,True
|
||||||
|
R_NM_RGL,0,0,True,1,000,0,000,3,1,True
|
||||||
|
R_PG_RGL,0,0,True,1,000,0,000,3,1,True
|
||||||
|
R_FL_RGL,0,0,True,1,000,0,000,3,1,True
|
||||||
|
DEFL_BL,2,8,False,1,000,0,000,4,1,True
|
||||||
|
CLOUD2L,2,8,False,1,000,0,000,15,1,True
|
||||||
|
ENV_NLAVA,1,0,False,1,000,0,000,8,1,True
|
||||||
|
ENV_NLAVA_M,1,0,False,1,000,0,000,8,1,True
|
||||||
|
GLOW_ENG,2,8,False,1,000,0,000,1,1,True
|
||||||
|
FIRE_ADD,2,8,False,1,000,0,000,23,1,True
|
||||||
|
SMOKE_ADD,2,8,False,1,000,0,000,4,1,True
|
||||||
|
OK_TEST1,0,0,True,1,000,0,000,1,1,True
|
||||||
|
SMOKE_Y,1,0,False,1,000,0,000,16,1,True
|
||||||
|
SMOKE_Y_ADD,2,8,False,1,000,0,000,16,1,True
|
||||||
|
DUST_Y,1,0,False,1,000,0,000,4,1,True
|
||||||
|
FIRE_SMOKE_G,1,0,False,1,000,0,000,23,1,True
|
||||||
|
FIRE_SMOKE_GADD,2,8,False,1,000,0,000,23,1,True
|
||||||
|
SMOKE_YG,1,0,False,1,000,0,000,16,1,True
|
||||||
|
SMOKE_YG_ADD,2,8,False,1,000,0,000,16,1,True
|
||||||
|
SMOKE_G,1,0,False,1,000,0,000,16,1,True
|
||||||
|
SMOKE_G_ADD,2,8,False,1,000,0,000,16,1,True
|
||||||
|
SPITTLE_G_ADD,2,8,False,1,000,0,000,16,1,True
|
||||||
|
WD_G_ADD,2,8,False,1,000,0,000,6,1,True
|
||||||
|
TOK41,1,0,False,1,000,0,000,1,1,True
|
||||||
|
DUST_ADD,2,8,False,1,000,0,000,4,1,True
|
||||||
|
TOK31,0,0,True,1,000,0,000,1,1,True
|
||||||
|
TOK31DARK,0,0,True,1,000,0,000,1,1,True
|
||||||
|
TOK32,1,0,False,1,000,0,000,4,1,True
|
||||||
|
TOK42,0,0,True,1,000,0,000,1,1,True
|
||||||
|
BUILD_SPHERE_A,1,0,False,1,000,0,000,4,1,True
|
||||||
|
LASER_RN,1,0,False,1,000,0,000,4,1,True
|
||||||
|
TOK43,0,0,True,1,000,0,000,1,1,True
|
||||||
|
TOK43DARK,0,0,True,1,000,0,000,1,1,True
|
||||||
|
TOK43_2,0,0,True,1,000,0,000,4,1,True
|
||||||
|
TOK43_2D,0,0,True,1,000,0,000,1,1,False
|
||||||
|
TOK43A,0,0,True,1,000,0,000,1,1,True
|
||||||
|
SMOKE_R,1,0,False,1,000,0,000,16,1,True
|
||||||
|
SMOKE_R_ADD,2,8,False,1,000,0,000,16,1,True
|
||||||
|
TOK41_RAY,2,8,False,1,000,0,000,8,1,True
|
||||||
|
SMOKE_GG,1,0,False,1,000,0,000,16,1,True
|
||||||
|
SMOKE_GG_ADD,2,8,False,1,000,0,000,16,1,True
|
||||||
|
SMOKE_W_ADD,2,8,False,1,000,0,000,10,1,True
|
||||||
|
TOK41_PLC,1,0,False,1,000,0,000,4,1,True
|
||||||
|
TOK33_BASE,2,8,False,1,000,0,000,4,1,True
|
||||||
|
TOK44_BASE,2,8,False,1,000,0,000,4,1,True
|
||||||
|
SMOKE_W1_ADD,2,8,False,1,000,0,000,10,1,True
|
||||||
|
TOK42W,0,0,True,1,000,0,000,1,1,True
|
||||||
|
TOK42_W4,0,0,True,1,000,0,000,3,1,True
|
||||||
|
TOK42_W1E,0,0,True,1,000,0,000,2,1,True
|
||||||
|
TOK42_W1M,0,0,True,1,000,0,000,2,1,True
|
||||||
|
TOK42_W5,0,0,True,1,000,0,000,2,1,True
|
||||||
|
SMOKE_R1_ADD,2,8,False,1,000,0,000,16,1,True
|
||||||
|
DUST_WORM_ADD,2,8,False,1,000,0,000,4,1,True
|
||||||
|
DUST_WORM,1,0,False,1,000,0,000,4,1,True
|
||||||
|
TOK11,0,0,True,1,000,0,000,1,1,True
|
||||||
|
TOK11_H,0,0,True,1,000,0,000,3,1,True
|
||||||
|
TOK11_Y,0,0,True,1,000,0,000,3,1,True
|
||||||
|
R_RLW_5L,0,0,True,1,000,0,000,1,1,True
|
||||||
|
PMAP_5,0,0,True,1,000,0,000,1,1,True
|
||||||
|
PMAP_42,0,0,True,1,000,0,000,1,1,False
|
||||||
|
PMAP_1,0,0,True,1,000,0,000,1,1,True
|
||||||
|
PMAP_2,0,0,True,1,000,0,000,1,1,True
|
||||||
|
PMAP_3,0,0,True,1,000,0,000,1,1,True
|
||||||
|
PMAP_4,0,0,True,1,000,0,000,1,1,True
|
||||||
|
PMAP_18,0,0,True,1,000,0,000,1,1,True
|
||||||
|
PMAP_31,0,0,True,1,000,0,000,1,1,False
|
||||||
|
PMAP_14,0,0,True,1,000,0,000,1,1,False
|
||||||
|
PMAP_15,0,0,True,1,000,0,000,1,1,True
|
||||||
|
PMAP_16,0,0,True,1,000,0,000,1,1,True
|
||||||
|
PMAP_17,0,0,True,1,000,0,000,1,1,True
|
||||||
|
HLP_GLOW_G,1,0,False,1,000,0,000,3,1,True
|
||||||
|
HLP_LAMP_G,0,0,True,1,000,0,000,3,1,True
|
||||||
|
HLP_PLACE_G,0,0,True,1,000,0,000,3,1,True
|
||||||
|
HLP_RAY_G,1,0,False,1,000,0,000,3,1,True
|
||||||
|
HLP_SIGN_G,1,0,False,1,000,0,000,3,1,True
|
||||||
|
HLP_GLOW_R,1,0,False,1,000,0,000,3,1,True
|
||||||
|
HLP_LAMP_R,0,0,True,1,000,0,000,3,1,True
|
||||||
|
HLP_PLACE_R,0,0,True,1,000,0,000,3,1,True
|
||||||
|
HLP_RAY_R,1,0,False,1,000,0,000,3,1,True
|
||||||
|
R_SRL_25,0,0,True,1,000,0,000,1,1,True
|
||||||
|
R_SRL_25REV,0,0,True,1,000,0,000,1,1,True
|
||||||
|
R_SRL_26,0,0,True,1,000,0,000,1,1,False
|
||||||
|
R_SRL_26REV,0,0,True,1,000,0,000,1,1,True
|
||||||
|
R_SRL_27,0,0,True,1,000,0,000,1,1,True
|
||||||
|
R_SRL_27REV,0,0,True,1,000,0,000,1,1,True
|
||||||
|
DEFL_Y_ADD,2,8,False,1,000,0,000,4,1,True
|
||||||
|
DEFL_Y1_ADD,2,8,False,1,000,0,000,4,1,True
|
||||||
|
TOK51,1,0,False,1,000,0,000,1,1,True
|
||||||
|
TF2,1,0,False,1,000,0,000,1,1,True
|
||||||
|
TF1,0,0,True,1,000,0,000,1,1,True
|
||||||
|
TF1_05,0,0,True,1,000,0,000,1,1,False
|
||||||
|
TF1_06A,0,0,True,1,000,0,000,4,1,True
|
||||||
|
TF1_BLACK,0,0,True,1,000,0,000,1,1,True
|
||||||
|
TF1_06,0,0,True,1,000,0,000,1,1,True
|
||||||
|
LASER_R_ADD,2,8,False,1,000,0,000,6,1,True
|
||||||
|
TOK76_UP,1,0,False,1,000,0,000,3,1,True
|
||||||
|
TOK76_DN,1,0,False,1,000,0,000,1,1,True
|
||||||
|
TOK41_RAYR,2,8,False,1,000,0,000,8,1,True
|
||||||
|
SMOKE_R2_ADD,2,8,False,1,000,0,000,10,1,True
|
||||||
|
JET_R,2,8,False,1,000,0,000,1,1,True
|
||||||
|
JET_G,2,8,False,1,000,0,000,1,1,True
|
||||||
|
Reference in New Issue
Block a user