#NoTrayIcon FileEncoding, UTF-8-RAW #SingleInstance OFF SetFormat, float, 0.10 #NoTrayIcon file_path = %1% Loop { if (file_path == "") { default_path := GetDefaultPath() FileSelectFile, file_path, 3, %default_path%, Please select a .pmat file, Supported files(*.pmat) } if (ErrorLevel == 1) { ExitApp } if (FileExist(file_path) == "") { Msgbox, This file does not exist file_path := "" } else { break } } file := FileOpen(file_path, "r") if (file.Read(file.ReadChar()) != "CM3D2_PMATERIAL") { MsgBox, This is not a CM3D2 .pmat file ExitApp } data := Object() version := file.ReadInt() int := file.ReadInt() name := ReadString(file) float := SetFloat(file.ReadFloat()) shader := ReadString(file) SplitPath, file_path, OutFileName, OutDir, OutExtension, OutNameNoExt, OutDrive Gui, Add, Text, xm0 ym0 W300 H20 Center, %A_Space%%OutFileName% Gui, Add, Text, xm0 y+0 W100 H20 Center, File Version Gui, Add, Edit, x+0 yp+0 W200 H20 vVversion, %version% Gui, Add, Text, xm0 y+0 W100 H20 Center, Name hash Gui, Add, Edit, x+0 yp+0 W200 H20 vVint ReadOnly, %int% Gui, Add, Text, xm0 y+0 W100 H20 Center, Material name Gui, Add, Edit, x+0 yp+0 W200 H20 vVname gGname, %name% Gui, Add, Text, xm0 y+0 W100 H20 Center, Priority? Gui, Add, Edit, x+0 yp+0 W200 H20 vVfloat, %float% Gui, Add, Text, xm0 y+0 W100 H20 Center, Shader Gui, Add, Edit, x+0 yp+0 W200 H20 vVshader, %shader% Gui, Add, Button, xm0 y+5 W300 H50 GMySubmit, Save Gui, Show, AutoSize return Gname: Gui, Submit, NoHide hash := string_hash(Vname) GuiControl, Text, Vint, %hash% return MySubmit: Gui, Submit, NoHide file := FileOpen(file_path, "w") WriteString(file, "CM3D2_PMATERIAL") file.WriteInt(Vversion) file.WriteInt(Vint) WriteString(file, Vname) file.WriteFloat(Vfloat) WriteString(file, Vshader) file.close() return GetStringLength(string) { count = 0 Loop, Parse, string { if (RegExMatch(A_LoopField, "^[^\x01-\x7E]$") != 0) { count += 3 } else { count += 1 } } return count } ReadString(file, size=-1) { if (size <= -1) { size := 0 chars := Object() Loop { char := file.ReadUChar() chars[A_Index] := char if (char < 128) { break } } num := GetMaxIndex(chars) Loop, %num% { char := chars[A_Index] multi := 256 ** (A_Index - 1) size += char * multi if (1 < A_Index) { size -= (multi / 2) * (char + 1) } } } string := "" count = 0 Loop, 9999 { if (size <= count) { break } s := file.Read(1) string := string . s count += GetStringLength(s) if (GetStringLength(s) == 0) { pos := file.Pos MsgBox, Failed to read file(Path: %pos%)`nQuit ExitApp } } return string } WriteString(file, string) { len := GetStringLength(string) if (128 <= len) { temp := Mod(len, 128) + 128 file.WriteChar(temp) temp := Floor(len / 128) file.WriteChar(temp) } else { file.WriteChar(len) } file.Write(string) } GetMaxIndex(obj) { value := obj.MaxIndex() if (value == "") { return 0 } return value } GetDefaultPath() { RegRead, path, HKEY_CURRENT_USER, Software\KISS\カスタムメイド3D2, InstallPath if (ErrorLevel == 0) { path = %path%GameData\ } else { path := A_ScriptDir } return path } SetFloat(f) { f := RegExReplace(f, "(\.0)0+$", "$1") f := RegExReplace(f, "([1-9])0+$", "$1") return f } string_hash(s) { h = 0 Loop, Parse, s { c := A_LoopField h := (31 * h + Asc(c)) & 0xFFFFFFFF } return ((h + 0x80000000) & 0xFFFFFFFF) - 0x80000000 } GuiEscape: GuiClose: ExitApp return