From 27c5b663bd619123fb5235c52955117b9d6caf5f Mon Sep 17 00:00:00 2001 From: Ryan Date: Thu, 25 Aug 2022 15:16:12 -0700 Subject: [PATCH] Migrated to new Repo --- .gitignore | 18 + LvdSpec.py | 1209 ++++++ README.html | 1078 ++++++ README.md | 42 +- groundconfig.prcxml | 9044 +++++++++++++++++++++++++++++++++++++++++++ icon.ico | Bin 0 -> 15086 bytes sample.yaml | 77 + 7 files changed, 11467 insertions(+), 1 deletion(-) create mode 100644 .gitignore create mode 100644 LvdSpec.py create mode 100644 README.html create mode 100644 groundconfig.prcxml create mode 100644 icon.ico create mode 100644 sample.yaml diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..5ff1d09 --- /dev/null +++ b/.gitignore @@ -0,0 +1,18 @@ +#LVDSpec +Capture.PNG +Capture2.PNG +tempconfig.prcxml +temp.prc +TestMod/* +sample - Copy.yaml +tempconfig.prcxml +EsnHcxrXAAEizec.jpg +TestMod/groundconfig.prc +EsnHcxjXIAA7ibb.jpg +*.jpg +groundconfig.prc + + +*.txt + +*.ini diff --git a/LvdSpec.py b/LvdSpec.py new file mode 100644 index 0000000..9069e0d --- /dev/null +++ b/LvdSpec.py @@ -0,0 +1,1209 @@ +import os +import os.path +from os import listdir +from pathlib import Path + +from tkinter import * +from tkinter import filedialog +from tkinter import messagebox +import fileinput + +import shutil +import subprocess +import sys +import webbrowser + +import xml.etree.ElementTree as ET +import yaml +import configparser + +import re +import math + +#create ui for program +root = Tk() +root.programName="LVD Spec" +root.title(root.programName) +root.iconbitmap(os.getcwd() +"/icon.ico") +root.withdraw() + +# Check if yaml is installed +package_name = 'yaml' + +import importlib.util +spec = importlib.util.find_spec(package_name) +if spec is None: + print(package_name +" is not installed") + #subcall = ["pip install"+package_name] + #with open('output.txt', 'w+') as stdout_file: + # process_output = subprocess.run(subcall, stdout=stdout_file, stderr=stdout_file, text=True) + # print(process_output.__dict__) + #spec = importlib.util.find_spec(package_name) + #if spec is None: + messagebox.showerror(root.programName,"Please install "+package_name+" to use this program!") + root.destroy() + sys.exit("User does not have "+package_name) + + + +#truncate strings for labels +def truncate(string,direciton=W,limit=20,ellipsis=True): + if (len(string) < 3): + return string + text = "" + addEllipsis = "..." if (ellipsis and (len(string)>limit)) else "" + if direciton == W: + text = addEllipsis+string[len(string)-limit:len(string)] + else: + text = string[0:limit]+addEllipsis + return text +#Why isn't this built in? +def clamp(val, minval, maxval): + if val < minval: return minval + if val > maxval: return maxval + return val + + + +config = configparser.ConfigParser() +defaultConfig = configparser.ConfigParser() +defaultConfig['DEFAULT'] = { + 'parcelDir' : "", + 'arcDir' : "", + 'yamlvd' : "", + 'stageParamsLocation' : "", + 'levelFile' : "" + } +def CreateConfig(): + print("creating valid config") + with open('config.ini', 'w+') as configfile: + defaultConfig.write(configfile) + config.read('config.ini') + +#create a config if necessary +if (not os.path.isfile(os.getcwd() + r"\config.ini")): + CreateConfig() +config.read('config.ini') + + +def UpdateTitle(newtitle=""): + if (newtitle!=""): + newtitle = " - "+newtitle + root.title(root.programName+newtitle) + +root.arcDir = config["DEFAULT"]["arcDir"] +root.stageParamsFolderShortcut = r"/stage/common/shared/param/" + +#make sure that it is a validated parcel folder, otherwise quit +def IsValidParcel(): + #Is this the directory with Parcel.exe? + return (os.path.exists(root.parcelDir + r"/parcel.exe")) + +def SetParcel(): + messagebox.showinfo(root.programName,"Set Parcel directory") + root.parcelDir = filedialog.askdirectory(title = "Select your Parcel directory") + if (root.parcelDir == ""): + root.destroy() + sys.exit("Invalid folder") + if (IsValidParcel() == False): + messagebox.showerror(root.programName,"Please select the root of your Parcel folder") + root.destroy() + sys.exit("Invalid Folder") + +#make sure that it is a validated arc folder, otherwise quit +def IsValidArc(): + #Is this the directory with ArcExplorer.exe? + if (os.path.exists(root.arcDir + r"/ArcExplorer.exe")): + #Has stageParams been extracted? + if (os.path.exists(root.arcDir + r"/export" + root.stageParamsFolderShortcut + "groundconfig.prc")): + return True + else: + messagebox.showerror(root.programName,"Please extra the folder stage/common/shared/param") + root.destroy() + sys.exit("Needs Param Folder") + return False + +#Get Stage Params folder from Valid Arc +def SetStageParams(): + #First, check to see if ArcExplorer Exists + messagebox.showinfo(root.programName,"Set ArcExplorer directory") + root.arcDir = filedialog.askdirectory(title = "Select your ArcExplorer directory") + if (root.arcDir == ""): + root.destroy() + sys.exit("Invalid folder") + if (IsValidArc() == False): + messagebox.showerror(root.programName,"Please select the root of your ArcExplorer folder") + root.destroy() + sys.exit("Invalid Folder") + + root.stageParams = root.arcDir + r"/export"+ root.stageParamsFolderShortcut + #Copy em for our working file + shutil.copy(root.stageParams + "groundconfig.prc", os.getcwd()+"/groundconfig.prc") + +def SetYamlvd(): + messagebox.showinfo(root.programName,"Set Yamlvd directory") + root.yamlvd = filedialog.askdirectory(title = "Select your Yamlvd directory") + if (root.yamlvd == ""): + root.destroy() + sys.exit("Invalid folder") + root.yamlvd = root.yamlvd + r"/yamlvd.exe" + if (os.path.exists(root.yamlvd) == False): + messagebox.showerror(root.programName,"Please select the root of your Yamlvd folder") + root.destroy() + sys.exit("Invalid Folder") + + +#make sure that it is a validated destination folder, otherwise quit +def IsValidModFolder(): + root.modDirName = os.path.basename(root.modDir) + if (root.modDirName == "stage"): + return False + else: + subfolders = [f.path for f in os.scandir(root.modDir) if f.is_dir()] + for dirname in list(subfolders): + if (os.path.basename(dirname) == "stage"): + return True + return False + +#open folder dialogue +def setModDir(quitOnFail=True): + quitOnFail=False + messagebox.showinfo(root.programName,"Select your mod's main folder") + root.modDir = filedialog.askdirectory(title = "Select your mod's main folder") + if (root.modDir == ""): + if (quitOnFail): + root.destroy() + sys.exit("Invalid folder") + return + if (IsValidModFolder() == False): + root.modDir="" + messagebox.showerror(root.programName,"Please select the root of your mod's folder! This folder should contain a stage folder within it!") + if (quitOnFail): + root.destroy() + sys.exit("Not a stage folder") + +#Set Parcel Directory if needed +root.parcelDir = config["DEFAULT"]["parcelDir"] +if (not os.path.isdir(root.parcelDir)): + root.parcelDir = "" +#Get or Set root.parcelDir +if (root.parcelDir == ""): + print("no parcel") + SetParcel() + +#Set Arc Directory and StageParams if needed +root.stageParams = config["DEFAULT"]["stageParamsLocation"] +if (not os.path.isdir(root.stageParams)): + root.stageParams = "" + +#Get or Set root.stageParams +if (root.stageParams == ""): + print("no arc") + SetStageParams() + +config.set("DEFAULT","parcelDir",root.parcelDir) +config.set("DEFAULT","arcDir",root.arcDir) +config.set("DEFAULT","stageParamsLocation",root.stageParams) +with open('config.ini', 'w+') as configfile: + config.write(configfile) + +root.stageName = "" +root.stageLocation = "" + +root.steveTable={ + "Steve_Label":"Steve LVD Settings", + "Steve_material":"soil", + "Steve_origin_x":0, + "Steve_origin_y":0, + "Steve_cell_sensitivity":0, + "Steve_line_offset":0, + "Steve_cell_minilen_side":0, + "Steve_cell_minilen_top":0, + "Steve_cell_minilen_bottom":0 +} +root.steveMaterials=[ +"soil", +"wool", +"sand", +"ice", +] + +root.collisions=[] +root.maxCollisionsTag="Canvas_Collisions To Show" +#root.maxCollisions=50 +root.stageLimit=125 + +root.stageDefaults ={ +"Camera_Label":"Camera Boundaries", +"Camera_Left":-170, +"Camera_Right":170, +"Camera_Top":130, +"Camera_Bottom":-80, +"Camera_CenterX":0, +"Camera_CenterY":0, +"Blast_Label":"Blastzone Boundaries", +"Blast_Left":-240, +"Blast_Right":240, +"Blast_Top":192, +"Blast_Bottom":-140, +"Stage_Label":"Stage Data", +"Stage_Radius":80, +"Stage_Top":47, +"Stage_Bottom":-40, +"Stage_FloorY":0, +"Stage_OriginX":0, +"Stage_OriginY":0, +"Canvas_Label":"Canvas Settings", +""+root.maxCollisionsTag:50 +} + +root.stageDataTable = root.stageDefaults.copy() +def ConvertSteveTag(data): + data = (data.lower()).replace("steve_","Steve_") + if ("top" in data): + data = "Steve_cell_minilen_top" + elif ("side" in data): + data = "Steve_cell_minilen_side" + elif ("bottom" in data): + data = "Steve_cell_minilen_bottom" + return data + +def GetData(data): + if ("Steve" in data): + data = ConvertSteveTag(data) + return root.steveTable[data] + elif (data in root.stageDataTable): + return root.stageDataTable[data] + else: + return +def SetData(data,value): + if ("Steve" in data): + data = ConvertSteveTag(data) + root.steveTable[data] = value + elif (data in root.stageDataTable): + root.stageDataTable[data] = value + if ("Camera" in data): + root.stageDataTable["Camera_CenterX"] = (GetData("Camera_Left")+GetData("Camera_Right"))/2 + root.stageDataTable["Camera_CenterY"] = (GetData("Camera_Top")+GetData("Camera_Bottom"))/2 + else: + print("Error: "+data+" key not found") + +root.levelFile = "" +root.modParams = "" +root.popup = None +root.popupOptions = {} +root.FirstLoad=True +root.Loading=True + +#Deprecated +def SetStageFromRoot(): + print("Open Stage from root:"+root.modDir) + + if (root.modDir==""): + SetYaml(False) + return + SetStage(root.modDir+ "/stage/") + +def SetStageFromLVD(): + stageKey="/stage/" + normalKey="/normal/" + #We need to find whatever is in between stageKey and normalKey + root.stageLocation = root.levelFile[:root.levelFile.index(normalKey)] + root.stageName = root.stageLocation[root.stageLocation.index(stageKey)+len(stageKey):] + print("Stage:"+root.stageName) + if (root.stageName == ""): + messagebox.showerror(root.programName,"There is no valid stage within that stage folder!") + return + root.modParams = root.stageLocation+"/normal/param/" + root.modDir = root.levelFile[:root.levelFile.index(stageKey)] + print("Stage Loaded, stage params should be at "+root.modParams) + +def SetStage(stageDir): + print("Find stage at "+stageDir) + root.stageName = None + subfolders = [s.path for s in os.scandir(stageDir) if s.is_dir()] + for dirname in list(subfolders): + if (dirname != "common"): + root.stageName = os.path.basename(dirname) + if (root.stageName == None): + messagebox.showerror(root.programName,"There is no valid stage within that stage folder!") + return + #root.destroy() + #sys.exit("Not a stage folder") + +def FinishedCreateYaml(): + #create yaml by copying our sample + #root.levelFile = root.modParams+root.stageName+"_spec.yaml" + shutil.copy(os.getcwd() + "/sample.yaml", root.levelFile) + + # Replace all tagged values + with open(root.levelFile, 'r') as file : + filedata = file.read() + + for option in root.popupOptions: + filedata = filedata.replace(option, root.popupOptions[option].get()) + + filedata = filedata.replace("RingL", "-"+root.popupOptions["StageRadius"].get()) + filedata = filedata.replace("RingR", root.popupOptions["StageRadius"].get()) + + # Write to the copy + with open(root.levelFile, 'w') as file: + file.write(filedata) + + #Destroy popup, and return to main + root.popup.destroy() + root.deiconify() + LoadYaml() + +def ClosedCreateYaml(): + root.levelFile="" + root.popup.destroy() + root.deiconify() + LoadYaml() + +def CreateYaml(): + print(root.levelFile) + if (root.levelFile==""): + messagebox.showinfo(root.programName,"Set directory to save yaml to") + root.modParams = filedialog.askdirectory(title = "Select your yaml directory") + if (root.modParams == ""): + return + root.levelFile = root.modParams + SetStageFromLVD() + print("Create Stage:"+root.stageName) + root.levelFile=root.modParams+root.stageName+"_spec.yaml" + + root.popup = Toplevel() + root.popup.title("Create Yaml") + + root.fr_Options = Frame(root.popup) + root.fr_Options.pack(fill = BOTH,expand=1,anchor=N) + root.popupOptions = {} + stageOptions = { + "Label1":"Camera Settings", + "CameraLeft":root.stageDefaults["Camera_Left"],"CameraRight":root.stageDefaults["Camera_Right"], + "CameraTop":root.stageDefaults["Camera_Top"],"CameraBottom":root.stageDefaults["Camera_Bottom"], + "Label2":"Blastzone Settings", + "BlastLeft":root.stageDefaults["Blast_Left"],"BlastRight":root.stageDefaults["Blast_Right"], + "BlastTop":root.stageDefaults["Blast_Top"],"BlastBottom":root.stageDefaults["Blast_Bottom"], + "Label3":"Stage Settings", + "StageRadius":root.stageDefaults["Stage_Radius"],"StageFloorY":root.stageDefaults["Stage_FloorY"], + "StageTop":root.stageDefaults["Stage_Top"],"StageBottom":root.stageDefaults["Stage_Bottom"]} + for option in stageOptions: + if ("Label" in option): + optionFrame = Frame(root.fr_Options) + optionFrame.pack(fill = X,expand=1) + optionName = Label(optionFrame,text=stageOptions[option]) + optionName.pack(fill = BOTH) + continue + optionData = stageOptions[option] + optionFrame = Frame(root.fr_Options) + optionFrame.pack(fill = X,expand=1) + optionName = Entry(optionFrame,width=15) + optionName.insert(0,option) + optionName.configure(state ='disabled') + optionName.pack(side = LEFT, fill = BOTH,anchor=E) + optionValue = Entry(optionFrame,width=15) + optionValue.insert(0,optionData) + optionValue.pack(side = RIGHT, fill = BOTH,expand=1) + root.popupOptions.update({option:optionValue}) + + button = Button(root.popup, text="Create Yaml", command=FinishedCreateYaml,width = 10).pack(side=BOTTOM) + root.popup.protocol("WM_DELETE_WINDOW", ClosedCreateYaml) + root.withdraw(); + +def LoadLastYaml(): + root.levelFile = config["DEFAULT"]["levelFile"] + if (not os.path.exists(root.levelFile)): + root.levelFile = "" + else: + SetStageFromLVD() + Main() + +def SetYaml(automatic=False): + originalYaml = root.levelFile + root.levelFile="" + #Attempt to find automatically first, if valid directory file exists + if (automatic and os.path.isdir(root.modParams)): + if (root.levelFile == ""): + #Automatically comb through modParams to find the first yaml file + paramfiles = [f for f in listdir(root.modParams) if os.path.exists(os.path.join(root.modParams, f))] + root.yaml = {} + for f in list(paramfiles): + filename = os.path.splitext(os.path.basename(f))[0] + extension = os.path.splitext(os.path.basename(f))[1] + if (extension == ".yaml"): + #if (root.stageName in filename): #this checks if the filename contains the stage name, which might not always be the case + root.levelFile = root.modParams +f + break + + if (root.levelFile != ""): + print(os.path.basename(root.levelFile)+" was automatically retrieved") + elif (root.levelFile == "" or not automatic): + #SetYaml manually. First select an lvd/yaml file + #messagebox.showinfo(root.programName,"Select your stage collision file (usually found in stage/normal/params)") + filetypes = ( + ('All File Types', '*.yaml *lvd'), + ('Yaml File', '*.yaml'), + ('LVD File', '*lvd') + ) + desiredFile = filedialog.askopenfilename(title = "Search",filetypes=filetypes,initialdir = root.modParams) + + if (desiredFile == ""): + print("No lvd selected") + #enter manually if rejected, and no current file + if (root.levelFile == "" and originalYaml==""): + messagebox.showwarning(root.programName,"Let's manually create a yaml file then!") + CreateYaml() + #otherwise close window? + else: + root.levelFile=originalYaml + return + + #If it's the same file, do nothing + if (desiredFile == originalYaml): + return + #If accidentally selected the Yaml version instead of the lvd verison, select yaml instead + possibleYaml = desiredFile.replace(".lvd",".yaml") + if (os.path.exists(possibleYaml)): + desiredFile=possibleYaml + + desiredFileName = os.path.basename(desiredFile) + extension = os.path.splitext(desiredFileName)[1] + + #If it's a yaml file, continue to the main program + if (extension == ".yaml"): + root.levelFile = desiredFile + #else yamlvd it + elif (extension == ".lvd"): + print("Use yamlvd") + + #Get or Set Yamlvd + root.yamlvd = config["DEFAULT"]["yamlvd"] + if (not os.path.exists(root.yamlvd)): + root.yamlvd = "" + if (root.yamlvd == ""): + print("no yamlvd") + SetYamlvd() + config.set("DEFAULT","yamlvd",root.yamlvd) + with open('config.ini', 'w+') as configfile: + config.write(configfile) + + #run yamlvd on the lvd file + root.levelFile = desiredFile.replace(".lvd",".yaml") + subcall = [root.yamlvd,desiredFile,root.levelFile] + with open('output.txt', 'a+') as stdout_file: + process_output = subprocess.run(subcall, stdout=stdout_file, stderr=stdout_file, text=True) + print(process_output.__dict__) + #if yamlvd doesn't work with this stage, enter values manually + if (not os.path.exists(root.levelFile)): + #enter manually + messagebox.showwarning(root.programName,"Yamlvd not compatible with this stage! Let's create a yaml file!") + CreateYaml() + return + LoadYaml() + +def LoadYaml(): + root.Loading=True + root.collisions=[] + print("") + print("Loaded New Yaml") + if (root.levelFile != ""): + SetStageFromLVD() + + config.set("DEFAULT","levelFile",root.levelFile) + with open('config.ini', 'w+') as configfile: + config.write(configfile) + Main() + + +def GetConfigFromYaml(): + toReturn = root.modDir + root.stageParamsFolderShortcut + r"groundconfig_" + toReturn = toReturn+os.path.basename(root.levelFile).replace(".yaml","") + toReturn=toReturn+".prcxml" + return toReturn + +def ParseSteve(UseSource=False): + SetData("Steve_Side", 0) + SetData("Steve_Top",0) + SetData("Steve_Bottom", 0) + if (root.stageName == ""): + return + tree = None + treeRoot = None + + sourceGroundInfo = os.getcwd() + r"\groundconfig.prcxml" + if (not os.path.exists(sourceGroundInfo)): + messagebox.showerror(root.programName,"Source Groundconfig missing from this folder") + return + workingGroundInfo = GetConfigFromYaml() + print("Info:"+workingGroundInfo) + if (not UseSource): + if (not os.path.exists(workingGroundInfo)): + UseSource = True + else: + #Make sure the mod has our desired stage + hasStage = False + with open(workingGroundInfo, 'rb') as file: + parser = ET.XMLParser(encoding ='utf-8') + tree = ET.parse(file,parser) + treeRoot = tree.getroot() + for type_tag in treeRoot.findall('struct'): + nodeName = type_tag.get('hash') + if (nodeName != root.stageName): + treeRoot.remove(type_tag) + else: + hasStage=True + UseSource = not hasStage + print("Current mod's groundconfig excludes the desired stage, using source instead") + + root.TempGroundInfo = os.getcwd() + r"\tempconfig.prcxml" + f = open(root.TempGroundInfo, "w") + f.close() + + GroundInfo = sourceGroundInfo if UseSource else workingGroundInfo + + print("Parsing Steve Data...") + #Parse Steve data from main groundconfig file and place it in a temporary file + with open(GroundInfo, 'rb') as file: + parser = ET.XMLParser(encoding ='utf-8') + tree = ET.parse(file,parser) + treeRoot = tree.getroot() + + #remove cell_size + for type_tag in treeRoot.findall('float'): + treeRoot.remove(type_tag) + #remove material_tabel + for type_tag in treeRoot.findall('list'): + treeRoot.remove(type_tag) + #remove everything that isn't this stage + for type_tag in treeRoot.findall('struct'): + nodeName = type_tag.get('hash') + if (nodeName != root.stageName): + treeRoot.remove(type_tag) + else: + for child in type_tag: + childName = "Steve_"+child.get("hash") + if (childName in list(root.steveTable.keys())): + print(childName+":"+child.text) + if (childName!="Steve_material"): + root.steveTable.update({childName:float(child.text)}) + else: + root.steveTable.update({childName:child.text}) + tree.write(root.TempGroundInfo) + print("") + +def exportGroundInfo(): + tempPrc = os.getcwd() +"/temp.prc" + sourcePrc = root.stageParams + "groundconfig.prc" + parcel = root.parcelDir + r"/parcel.exe" + + if (not os.path.exists(sourcePrc)): + messagebox.showerror(root.programName,"Cannot export without ArcExplorer's groundconfig.prc") + return + if (not os.path.exists(parcel)): + messagebox.showerror(root.programName,"Cannot export without Parcel") + return + + tree = None + treeRoot = None + + #Write our changes to TempGroundInfo + with open(root.TempGroundInfo, 'rb') as file: + parser = ET.XMLParser(encoding ='utf-8') + tree = ET.parse(file,parser) + treeRoot = tree.getroot() + + for type_tag in treeRoot.findall('struct'): + nodeName = type_tag.get('hash') + if (nodeName != root.stageName): + treeRoot.remove(type_tag) + else: + for child in type_tag: + childName = "Steve_"+child.get("hash") + if (childName in list(root.steveTable.keys())): + value = GetData(childName) + print("Write:"+childName+":"+str(value)) + child.text = str(value) + tree.write(root.TempGroundInfo) + + + #Patch the source file with our edited values, and create a clone as TempPRC + + subcall = [parcel,"patch",sourcePrc,root.TempGroundInfo,tempPrc] + with open('output.txt', 'a+') as stdout_file: + process_output = subprocess.run(subcall, stdout=stdout_file, stderr=stdout_file, text=True) + print(process_output.__dict__) + print("Temp prc created!") + + #Patch our working folder's prc, as well + workingPrc = os.getcwd() + "/groundconfig.prc" + if (os.path.exists(workingPrc)): + subcall = [parcel,"patch",workingPrc,root.TempGroundInfo,workingPrc] + with open('output.txt', 'a+') as stdout_file: + process_output = subprocess.run(subcall, stdout=stdout_file, stderr=stdout_file, text=True) + print(process_output.__dict__) + + print("Working prc patched!") + #Run parcel with the original and the patch to receive a prcx + else: + messagebox.showwarning(root.programName,"groundconfig.prc missing from LvdSpec") + + #Create Prcx for mod + targetLocation = root.modDir + root.stageParamsFolderShortcut + if (not os.path.exists(targetLocation)): + os.makedirs(targetLocation) + targetFile = GetConfigFromYaml() + + subcall = [parcel,"diff",sourcePrc,tempPrc,targetFile.replace(".prcxml",".prcx")] + with open('output.txt', 'a+') as stdout_file: + process_output = subprocess.run(subcall, stdout=stdout_file, stderr=stdout_file, text=True) + print(process_output.__dict__) + + print("Prcx created!") + + #Copy the temp prcxml to the destination + shutil.copy(root.TempGroundInfo,targetFile) + + #Final part: remove temp and navigate to new folder + os.remove(tempPrc) + messagebox.showinfo(root.programName,"Exported steve parameters as "+os.path.basename(targetFile)+"!" + "\nMake sure you rename the file to 'groundconfig' in your mod file" + "\n" + "\nLVDSpec's groundconfig.prc has also been updated!") + webbrowser.open(targetLocation) + + +def OpenReadMe(): + webbrowser.open('https://github.com/CSharpM7/SharpSmashSuite/tree/main/LvdSpec') +def OpenWiki(): + webbrowser.open('https://github.com/CSharpM7/SharpSmashSuite/wiki') + +root.string_vars = {} + +def OnSteveSliderUpdate(variable): + if (root.Loading): + return + value = root.stageData[variable].get() + value=float(value) + print("Updated "+variable+" with "+str(value)) + root.steveTable.update({variable:value}) + #DrawSteveBlock() + +def OnOriginXSliderUpdate(event): + variable = "Steve_origin_x" + OnSteveSliderUpdate(variable) +def OnOriginYSliderUpdate(event): + variable = "Steve_origin_y" + OnSteveSliderUpdate(variable) +def OnLineSliderUpdate(event): + variable = "Steve_line_offset" + OnSteveSliderUpdate(variable) +def OnSensitivitySliderUpdate(event): + variable = "Steve_cell_sensitivity" + OnSteveSliderUpdate(variable) + +reAlpha='[^0-9,.-]' +def OnSettingUpdated(variable): + #Get Value, only take #s,- and . + value = root.string_vars[variable].get() + value = re.sub(reAlpha, '', value) + #If empty, return + if (value==""): return + + #Make sure the value is a valid float + validValue=True + try: + value=float(value) + except: + validValue=False + print(value+" is invalid for "+variable) + + if (not validValue): return + value=float(value) + + #Convert Collisions to int + if (variable==root.maxCollisionsTag and value != ""): + value=int(value) + #Clamp Radius + elif ("Radius" in variable): + value=min(value,root.stageLimit) + #Clamp Steve Origins + elif ("Steve_origin" in variable): + value=clamp(value,-10,10) + + print("Updated "+variable+" with "+str(value)) + SetData(variable,value) + + if ("Canvas" in variable): + DrawCollisions() + else: + DrawSteveBlock() + if ("Bottom" in variable): + DrawBoundaries() + +def OnSteveSettingUpdated(*args): + if (root.Loading): + return + variable = "Steve_"+args[0] + OnSettingUpdated(variable) + +def OnStageSettingUpdated(*args): + if (root.Loading): + return + variable = "Stage_"+args[0] + OnSettingUpdated(variable) + +def OnCanvasSettingUpdated(*args): + if (root.Loading): + return + variable = "Canvas_"+args[0] + OnSettingUpdated(variable) + + +root.canvasWidth = 576 +root.canvasHeight = 480 +#This should really only run once, maybe I should split this up but idk +def CreateCanvas(): + #Define window stuff + root.geometry("1080x512") + root.deiconify() + root.mainFrame = Frame(root) + root.mainFrame.pack(fill = X,expand=1) + root.my_canvas = Canvas(root.mainFrame,width=root.canvasWidth,height=root.canvasHeight,bg="white") + root.my_canvas.pack(padx=20,pady=20,side=LEFT) + #Rectangle variables for later + root.steveArea = root.my_canvas.create_rectangle(-10,-10,-10,-10,fill = "lime green",tag="steve") + root.cameraArea = root.my_canvas.create_rectangle(-10,-10,-10,-10,outline = "blue",tag="camera") + root.blastArea = root.my_canvas.create_rectangle(-10,-10,-10,-10,outline = "red",tag = "blast") + + #File menu + root.menubar = Menu(root) + root.filemenu = Menu(root.menubar, tearoff=0) + root.filemenu.add_command(label="Load Stage Collision File", command=SetYaml) + root.filemenu.add_command(label="Export Patch File To Mod", command=exportGroundInfo) + root.filemenu.add_separator() + root.filemenu.add_command(label="Exit", command=quit) + root.menubar.add_cascade(label="File", menu=root.filemenu) + + root.helpmenu = Menu(root.menubar, tearoff=0) + root.helpmenu.add_command(label="About", command=OpenReadMe) + root.helpmenu.add_command(label="Wiki", command=OpenWiki) + #root.helpmenu.add_command(label="About...", command=donothing) + root.menubar.add_cascade(label="Help", menu=root.helpmenu) + root.config(menu=root.menubar) + + #Settings displayed on the side, + root.fr_Settings = Frame(root.mainFrame) + root.fr_Settings.pack(pady=20,expand=1,fill=BOTH,side=RIGHT) + root.fr_SteveSettings = Frame(root.fr_Settings) + root.fr_SteveSettings.pack(padx=10,side=LEFT,anchor=N) + root.fr_StageSettings = Frame(root.fr_Settings) + root.fr_StageSettings.pack(padx=10,side=LEFT,anchor=N) + + root.stageData = {} + dataTable = {} + dataTable.update(root.steveTable) + dataTable.update(root.stageDataTable) + for data in dataTable: + frame = root.fr_StageSettings + if ("Steve" in data): + frame = root.fr_SteveSettings + #For labels, don't use Entries + if ("Label" in data): + dataFrame = Frame(frame) + dataFrame.pack(fill = X,expand=1) + dataName = Label(dataFrame,text=dataTable[data]) + dataName.pack(fill = BOTH) + continue + + dataText=re.sub(r'[^a-zA-Z _]', '', data) + dataText=dataText[dataText.index("_")+1:] + dataDefault = str(dataTable[data]) + + dataFrame = Frame(frame) + dataFrame.pack(fill = X,expand=1) + + dataName = Entry(dataFrame) + dataName.insert(0,dataText) + dataName.configure(state ='disabled') + dataName.pack(side = LEFT, fill = BOTH,anchor=E) + dataEntry=None + #For Steve Entries, trace any updates + if ("Steve" in data or "Stage" in data or "Canvas" in data): + #Sensitivity is a slider + if ("sensitivity" in data): + dataEntry = Scale(dataFrame, from_=0, to=1,orient=HORIZONTAL,resolution=0.01) + dataEntry.bind("",OnSensitivitySliderUpdate) + dataEntry.set(dataDefault) + elif ("line" in data): + dataEntry = Scale(dataFrame, from_=0, to=10,orient=HORIZONTAL,resolution=0.01) + dataEntry.bind("",OnLineSliderUpdate) + dataEntry.set(dataDefault) + #Origin is now using textEntry + elif ("Xorigin" in data): + dataEntry = Scale(dataFrame, from_=-10, to=10,orient=HORIZONTAL,resolution=0.01) + dataEntry.set(dataDefault) + if ("_x" in data): + dataEntry.bind("",OnOriginXSliderUpdate) + elif ("_y" in data): + dataEntry.bind("",OnOriginYSliderUpdate) + else: + root.string_vars.update({data:StringVar(name=dataText)}) + var = root.string_vars[data] + if ("Steve" in data): + var.trace_add("write",OnSteveSettingUpdated) + elif ("Stage" in data): + var.trace_add("write",OnStageSettingUpdated) + else: + var.trace_add("write",OnCanvasSettingUpdated) + + dataEntry = Entry(dataFrame,textvariable=var) + dataEntry.insert(0,dataDefault) + + #Material is uneditable + if ("material" in data): + dataEntry.configure(state ='disabled') + #Disable non-editable categories + else: + dataEntry = Entry(dataFrame) + dataEntry.insert(0,dataDefault) + dataEntry.configure(state ='disabled') + dataEntry.pack(side = RIGHT, fill = BOTH,expand=1) + root.stageData.update({data:dataEntry}) + + #Wizard Button + button = Button(root.fr_SteveSettings, text="Wizard", command=OnWizard) + button.pack(side = RIGHT, fill = BOTH,expand=1,pady=10,padx=4) + #Default Button + button = Button(root.fr_SteveSettings, text="Reset Values To Default", command=OnDefault) + button.pack(side = RIGHT, fill = BOTH,expand=1,pady=10,padx=4) + + +def OnDefault(): + res = messagebox.askquestion("LVD Wizard: "+os.path.basename(root.levelFile), "Reset Steve parameters to their original values?") + if res != 'yes': + return + ParseSteve(True) + RefreshValues() + RefreshCanvas() +def OnWizard(): + res = messagebox.askquestion("LVD Wizard: "+os.path.basename(root.levelFile), "Make sure you have all these variables set in Stage Data for this to work!" + "\n" + "\nRadius (Radius of the main ring)" + "\nTop (Y Position of highest platform)" + "\nBase (Y Position of baseline on the main ring, should be a spawn point's y)" + "\nBottom (Y Position of lowest point on the main ring)" + "\nOrigin (A multiple of 50 that is as close to 0,0 as possible. For stages that have been shifted up/left, this could be 0,200 for a highup stage, or 100,0 for a stage that's far to the right)" + "\n" + "\nReady to start Wizard?") + if res != 'yes': + return + isWall= (GetData("Stage_Bottom")0) else originY + lowestSpawn=100 if (len(spawns)>0) else originY + lowestY=0 + for s in spawns: + if (s>highestSpawn): + highestSpawn=s + elif (slargestX and cameraLeftValuecamCX): + x1=camCX + if(x2camCY): + y2=camCY + x1,y1 = GetAdjustedCoordinates(x1,y1) + x2,y2 = GetAdjustedCoordinates(x2,y2) + root.my_canvas.coords(root.steveArea,x1,y1,x2,y2) + + #Create Grid for Steveblock + root.my_canvas.delete('grid_line') + + xO=float(GetData("Steve_origin_x"))+GetData("Stage_OriginX") + yO=float(GetData("Steve_origin_y"))+GetData("Stage_OriginY") + xO,yO = GetAdjustedCoordinates(xO,yO) + maxX=int(GetData("Stage_Radius"))+10 + minY=-20 + maxY=20 + #Vertical Lines + for i in range(-maxX,maxX+1,10): + root.my_canvas.create_line([(xO+i, yO-maxY), (xO+i, yO-minY)], tag='grid_line',fill='dark green') + #Horizontal Lines + for i in range(minY,maxY+1,10): + root.my_canvas.create_line([(xO-maxX, yO-i), (xO+maxX, yO-i)], tag='grid_line',fill='dark green') + + +def DrawBoundaries(): + x1,y1 = GetAdjustedCoordinates(GetData("Camera_Left"),GetData("Camera_Top")) + x2,y2 = GetAdjustedCoordinates(GetData("Camera_Right"),GetData("Camera_Bottom")) + root.my_canvas.coords(root.cameraArea,x1,y1,x2,y2) + + #Draw guidelines for stuff + root.my_canvas.delete('guide_line') + stageBottom = GetData("Stage_Bottom") + empty,stageBottom = GetAdjustedCoordinates(0,stageBottom) + root.my_canvas.create_line([(x1, stageBottom), (x2,stageBottom)], tag='guide_line',fill='black') + + x1,y1 = GetAdjustedCoordinates(GetData("Blast_Left"),GetData("Blast_Top")) + x2,y2 = GetAdjustedCoordinates(GetData("Blast_Right"),GetData("Blast_Bottom")) + root.my_canvas.coords(root.blastArea,x1,y1,x2,y2) + +def DrawCollisions(): + root.my_canvas.delete("collision") + for c in range(min(len(root.collisions),GetData(root.maxCollisionsTag))): + col = root.collisions[c] + for vert in range(len(col)-1): + x1=float(col[vert]["x"]) + y1=float(col[vert]["y"]) + x2=float(col[vert+1]["x"]) + y2=float(col[vert+1]["y"]) + x1,y1 = GetAdjustedCoordinates(x1,y1) + x2,y2 = GetAdjustedCoordinates(x2,y2) + root.my_canvas.create_line(x1,y1,x2,y2, fill = "black",width=2,tags="collision") + +#If yaml file is reloaded, then you should call this +def RefreshCanvas(): + DrawSteveBlock() + DrawBoundaries() + DrawCollisions() + +def RefreshValues(): + print("Refreshing for "+root.stageName) + disableSteve = "disable" if (root.stageLocation=="") else "normal" + for data in root.stageData: + entry = root.stageData[data] + value =str(GetData(data)) + if ("Steve" in data): + entry.configure(state = "normal") + if ("sensitivity" in data or "line" in data or "Xorigin" in data): + entry.set(value) + else: + entry.delete(0,END) + if (root.stageName==""): + entry.insert(0,"?") + else: + entry.insert(0,value) + + if ("material" in data): + entry.configure(state = "disable") + else: + entry.configure(state = disableSteve) + else: + entry.configure(state = "normal") + entry.delete(0,END) + entry.insert(0,value) + if ("Canvas" in data or "Stage" in data): + entry.configure(state = disableSteve) + else: + entry.configure(state = "disable") + root.filemenu.entryconfig("Export Patch File", state=disableSteve) + +def Main(): + print("Running main: "+root.stageName) + if (root.stageName!="" and os.path.exists(root.levelFile)): + UpdateTitle(root.stageName +": "+os.path.basename(root.levelFile)) + + ParseSteve() + ParseYaml() + if (root.FirstLoad): + CreateCanvas() + else: + RefreshValues() + RefreshCanvas() + root.FirstLoad=False + root.Loading=False + +def quit(): + root.withdraw() + sys.exit("user exited") + +LoadLastYaml() +root.mainloop() diff --git a/README.html b/README.html new file mode 100644 index 0000000..2adf234 --- /dev/null +++ b/README.html @@ -0,0 +1,1078 @@ +README

LVD Specî…—

+

Lets you view lvd files (as long as they can be used with yamlvd) and edit block boundaries for Steve on most stages

+

Prerequisitesî…—

+

You’ll need: +- ArcExplorer, as well as a dump of the /stage/common/shared/param/ folder +- Parcel for creating patches of the groundconfig.prc file for each of your mods +- Yamlvd to automatically retrieve Camera Boundary info, or StudioSB to find out the boundaries for your stage +- pyyaml (pip install) to read yaml files

+

Usageî…—

+

When booting for the first time, the program will ask you to locate ArcExplorer, Yamlvd and Parcel. Afterwords, it will ask for the workspace for your mod. This program will also remember the last used workspace on launch. Make sure your mod has a stage/[stage_name]/normal/param folder, and that folder should have an lvd or yaml file in it. If you don’t have a yaml file, this program can run yamlvd for you. If yamlvd doesn’t work with this stage (ie WarioWare), you can manually enter data for the camera,blastzone,and stage radius data.

\ No newline at end of file diff --git a/README.md b/README.md index 630498b..063dc52 100644 --- a/README.md +++ b/README.md @@ -1 +1,41 @@ -# LVDSpec_Repo +# LVD Spec + +Lets you view lvd files (as long as they can be used with yamlvd) and edit block boundaries for Steve on most stages + + +## Dependencies +You'll need: +- [ArcExplorer](https://github.com/ScanMountGoat/ArcExplorer), as well as a dump of the `/stage/common/shared/param/` folder +- [Parcel](https://github.com/blu-dev/parcel/releases/tag/v1.0.0) for creating patches of the `groundconfig.prc` file for each of your mods +- [Yamlvd](https://github.com/jam1garner/lvd-rs/releases) to automatically retrieve Camera Boundary info, or StudioSB to find out the boundaries for your stage +- pyyaml (pip install) to read yaml files + +## Usage + +When booting for the first time, the program will ask you to locate ArcExplorer, Yamlvd and Parcel. This is so we can retrieve the original groundconfig.prc, parse level data, and export the changes you make as a patch file. You'll be greated with a blank canvas, with most of the settings greyed out (as there is no level loaded). Go to File>Load Stage Collision File and select a `.yaml` file to load. If your stage doesn't have a yaml file, you can select a `.lvd` file and this program will run yamlvd for you. If yamlvd doesn't work with this stage (ie Final Destination, WarioWare), you can manually enter data for the camera,blastzone,and stage data. + +Edit the Steve LVD Settings values as you see fit. You can also use the Wizard button to automatically set these values. The Wizard will require that your Stage Data values are accurate, so double check to make sure these values make sense. + +When you're finished, go to File>Export Patch File. This will create a patch file in whichever mod directory you are currently in under stage/common/shared/param. The name will be groundconfig + the name of the yaml file. The program will read from this file whenever you load the same yaml file again. Make sure you rename the new patch file after moving it to your mod on your SD Card. All changes will be saved to the groundconfig.prc in the LVDSpec folder, so if you're making a large mod pack, you might want to use this file instead of trying to combine several different patch files. + +## Terms + +| | +| :- | +| **Steve LVD Settings** | +| **material**: Material type of the weakest block | +| **origin**: Used to offset the steve grid. Should be related to Stage Radius and FloorY| +| **cell sensitivity**: A value between 0 and 1. Not sure what it does| +| **line offset**: A value between 0 and 10. Not sure what it does | +| **Side/Top/Bottom**: Distance from Camera where Steve cannot build a block | +| **Camera Boundaries** | +| **Left/Right/Top/Bottom**: Boundaries for the Camera of the stage | +| **Center**: Center X and Y positions of the camera | +| **Blastzone Boundaries** | +| **Left/Right/Top/Bottom**: Boundaries for the Blastzone of the stage | +| **Stage Data** | +| **Radius**: Width of the stage divided by 2 | +| **Top**: Highest platform; often the highest spawn point | +| **Bottom**: Lowest part of the main stage. Walled stages should have their Bottom value lower than their Camera.Bottom value | +| **FloorY**: Y position of the lowest floor of the stage, often the lowest spawn point | +| **Origin**: Often 0,0; some stages may be shifted up by 200 to avoid hardcoded vertices. Set this to a multiple of 10 so that the Steve Grid shows properly | \ No newline at end of file diff --git a/groundconfig.prcxml b/groundconfig.prcxml new file mode 100644 index 0000000..ee18bee --- /dev/null +++ b/groundconfig.prcxml @@ -0,0 +1,9044 @@ + + + 10 + + + soil + shovel + + + stone + pickaxe + + + soil + shovel + + + soil + shovel + + + wood + axe + + + iron + pickaxe + + + iron + pickaxe + + + wool + shovel + + + soil + shovel + + + soil + shovel + + + sand + shovel + + + soil + shovel + + + soil + shovel + + + ice + shovel + + + ice + pickaxe + + + iron + pickaxe + + + iron + shovel + + + wood + axe + + + stone + pickaxe + + + stone + pickaxe + + + stone + pickaxe + + + wood + axe + + + wool + shovel + + + soil + pickaxe + + + stone + pickaxe + + + soil + shovel + + + iron + pickaxe + + + iron + pickaxe + + + sand + shovel + + + iron + pickaxe + + + stone + shovel + + + stone + shovel + + + wood + pickaxe + + + stone + pickaxe + + + stone + pickaxe + + + soil + shovel + + + stone + shovel + + + iron + pickaxe + + + soil + shovel + + + ice + pickaxe + + + soil + shovel + + + ice + pickaxe + + + wool + shovel + + + stone + pickaxe + + + + soil + 0 + 0 + 1 + 1 + 40 + 60 + 30 + decal + + 0 + 0 + 0 + 12.5 + 2 + 12.5 + 0 + 0 + 0 + + + soil + 0 + 0 + 1 + 1 + 50 + 70 + 10 + decal + + 0 + 0 + 0 + 12.5 + 2 + 12.5 + 0 + 0 + 0 + + + soil + 0 + 0 + 1 + 1 + 40 + 62 + 30 + decal + + 0 + 0 + 0 + 12.5 + 2 + 12.5 + 0 + 0 + 0 + + + soil + 0 + 0 + 1 + 1 + 50 + 70 + 10 + decal + + 0 + 0 + 0 + 12.5 + 2 + 12.5 + 0 + 0 + 0 + + + soil + 0 + 0 + 1 + 1 + 40 + 60 + 30 + decal + + 0 + 0 + 0 + 12.5 + 2 + 12.5 + 0 + 0 + 0 + + + soil + 0 + 7 + 0.8 + 2 + 38 + 50 + 30 + decal + + 0 + 0 + 0 + 12.5 + 1.5 + 12.5 + 0 + 0 + 0 + + + soil + 0 + 0 + 1 + 1 + 50 + 70 + 10 + decal + + 0 + 0 + 0 + 12.5 + 1.5 + 12.5 + 0 + 0 + 0 + + + soil + 0 + 0 + 1 + 1 + 40 + 60 + 30 + decal + + 0 + 0 + 0 + 12.5 + 1.5 + 12.5 + 0 + 0 + 0 + + + soil + 0 + -9 + 1 + 6 + 40 + 48 + 60 + decal + + 0 + 0 + 0 + 12.5 + 1.5 + 12.5 + 0 + 0 + 0 + + + soil + 0 + 0 + 1 + 1 + 50 + 70 + 10 + decal + + 0 + 0 + 0 + 12.5 + 1.5 + 12.5 + 0 + 0 + 0 + + + soil + 0 + 0 + 1 + 1 + 40 + 60 + 30 + decal + + 0 + 0 + 0 + 12.5 + 1.5 + 12.5 + 0 + 0 + 0 + + + soil + 1 + -5.8 + 0.86 + 5.3 + 45 + 95 + 30 + decal + + 0 + 0 + 0 + 12.5 + 2 + 12.5 + 0 + 0 + 0 + + + soil + 0 + 0 + 1 + 1 + 50 + 70 + 10 + decal + + 0 + 0 + 0 + 12.5 + 1.5 + 12.5 + 0 + 0 + 0 + + + soil + 0 + 0 + 1 + 1 + 40 + 60 + 30 + decal + + 0 + 0 + 0 + 12.5 + 1.5 + 12.5 + 0 + 0 + 0 + + + wool + 0 + -0.5 + 0.76 + 4 + 40 + 70 + 28 + decal + + 0 + 0 + 0 + 12.5 + 4 + 12.5 + 0 + 0 + 0 + + + wool + 0 + 0 + 1 + 1 + 50 + 70 + 10 + decal + + 0 + 0 + 0 + 12.5 + 1.5 + 12.5 + 0 + 0 + 0 + + + wool + 0 + 0 + 1 + 1 + 40 + 60 + 30 + decal + + 0 + 0 + 0 + 12.5 + 1.5 + 12.5 + 0 + 0 + 0 + + + soil + 0 + -9 + 1 + 0 + 50 + 58 + 30 + decal + + 0 + 0 + 0 + 12.5 + 1.5 + 12.5 + 0 + 0 + 0 + + + soil + 0 + 0 + 1 + 1 + 50 + 70 + 10 + decal + + 0 + 0 + 0 + 12.5 + 1.5 + 12.5 + 0 + 0 + 0 + + + soil + 0 + 0 + 1 + 1 + 40 + 60 + 30 + decal + + 0 + 0 + 0 + 12.5 + 1.5 + 12.5 + 0 + 0 + 0 + + + soil + -3.32 + -1.5 + 0.8 + 3 + 50 + 50 + 16 + decal + + 0 + 0 + 0 + 12.5 + 3.5 + 12.5 + 0 + 0 + 0 + + + soil + 0 + 0 + 1 + 1 + 50 + 70 + 10 + decal + + 0 + 0 + 0 + 12.5 + 1.5 + 12.5 + 0 + 0 + 0 + + + soil + 0 + 0 + 1 + 1 + 40 + 60 + 30 + decal + + 0 + 0 + 0 + 12.5 + 1.5 + 12.5 + 0 + 0 + 0 + + + sand + -1 + -8 + 0.71 + 5.6 + 18 + 40 + 5 + decal + crack_c + 0 + 0 + 0 + 12.5 + 2 + 12.5 + 0 + 0 + 0 + + + sand + 0 + 0 + 1 + 1 + 50 + 70 + 10 + decal + + 0 + 0 + 0 + 12.5 + 1.5 + 12.5 + 0 + 0 + 0 + + + sand + 0 + 0 + 1 + 1 + 40 + 60 + 30 + decal + + 0 + 0 + 0 + 12.5 + 1.5 + 12.5 + 0 + 0 + 0 + + + soil + 0 + -4 + 0.81 + 5 + 40 + 58 + 30 + decal + + 0 + 0 + 0 + 12.5 + 1.5 + 12.5 + 0 + 0 + 0 + + + soil + 0 + 0 + 1 + 1 + 50 + 70 + 10 + decal + + 0 + 0 + 0 + 12.5 + 1.5 + 12.5 + 0 + 0 + 0 + + + soil + 0 + 0 + 1 + 1 + 40 + 60 + 30 + decal + + 0 + 0 + 0 + 12.5 + 1.5 + 12.5 + 0 + 0 + 0 + + + soil + 2 + 4.5 + 0.9 + 5 + 30 + 25 + 20 + decal + + 0 + 0 + 0 + 12.5 + 3 + 12.5 + 0 + 0 + 0 + + + soil + 0 + 0 + 1 + 1 + 50 + 70 + 10 + decal + + 0 + 0 + 0 + 12.5 + 1.5 + 12.5 + 0 + 0 + 0 + + + soil + 0 + 0 + 1 + 1 + 40 + 60 + 30 + decal + + 0 + 0 + 0 + 12.5 + 1.5 + 12.5 + 0 + 0 + 0 + + + soil + -4.8 + -7.3 + 0.92 + 7.6 + 30 + 35 + 10 + decal + + 0 + 0 + 0 + 12.5 + 1.5 + 12.5 + 0 + 0 + 0 + + + soil + 0 + 0 + 1 + 1 + 50 + 70 + 10 + decal + + 0 + 0 + 0 + 12.5 + 1.5 + 12.5 + 0 + 0 + 0 + + + soil + 0 + 0 + 1 + 1 + 40 + 60 + 30 + decal + + 0 + 0 + 0 + 12.5 + 1.5 + 12.5 + 0 + 0 + 0 + + + soil + 2 + -7.9 + 1 + 0 + 35 + 75 + 4 + decal + crack_c + 0 + 0 + 0 + 12.5 + 1.5 + 12.5 + 0 + 0 + 0 + + + soil + 0 + 0 + 1 + 1 + 50 + 70 + 10 + decal + + 0 + 0 + 0 + 12.5 + 1.5 + 12.5 + 0 + 0 + 0 + + + soil + 0 + 0 + 1 + 1 + 40 + 60 + 30 + decal + + 0 + 0 + 0 + 12.5 + 1.5 + 12.5 + 0 + 0 + 0 + + + soil + -2.6 + -2 + 1 + 6.6 + 25 + 58 + 10 + decal + + 0 + 0 + 0 + 12.5 + 4 + 12.5 + 0 + 0 + 0 + + + soil + 0 + 0 + 1 + 1 + 50 + 70 + 10 + decal + + 0 + 0 + 0 + 12.5 + 1.5 + 12.5 + 0 + 0 + 0 + + + soil + 0 + 0 + 1 + 1 + 40 + 60 + 30 + decal + + 0 + 0 + 0 + 12.5 + 1.5 + 12.5 + 0 + 0 + 0 + + + soil + 1 + 5 + 0.75 + 3 + 48 + 104 + 34 + decal + + 0 + 0 + 0 + 12.5 + 2.5 + 12.5 + 0 + 0 + 0 + + + soil + 0 + 0 + 1 + 1 + 50 + 70 + 10 + decal + + 0 + 0 + 0 + 12.5 + 1.5 + 12.5 + 0 + 0 + 0 + + + soil + 0 + 0 + 1 + 1 + 40 + 60 + 30 + decal + + 0 + 0 + 0 + 12.5 + 1.5 + 12.5 + 0 + 0 + 0 + + + wool + 0 + 0 + 1 + 1 + 35 + 45 + 8 + decal + + 0 + 0 + 0 + 12.5 + 1 + 12.5 + 0 + 0 + 0 + + + wool + 0 + 0 + 1 + 1 + 50 + 70 + 10 + decal + + 0 + 0 + 0 + 12.5 + 1.5 + 12.5 + 0 + 0 + 0 + + + wool + 0 + 0 + 1 + 1 + 40 + 60 + 30 + decal + + 0 + 0 + 0 + 12.5 + 1.5 + 12.5 + 0 + 0 + 0 + + + soil + 5 + 2 + 0.7 + 4 + 20 + 45 + 10 + decal + + 0 + 0 + 0 + 12.5 + 1.5 + 12.5 + 0 + 0 + 0 + + + soil + 0 + 0 + 1 + 1 + 50 + 70 + 10 + decal + + 0 + 0 + 0 + 12.5 + 1.5 + 12.5 + 0 + 0 + 0 + + + soil + 0 + 0 + 1 + 1 + 40 + 60 + 30 + decal + + 0 + 0 + 0 + 12.5 + 1.5 + 12.5 + 0 + 0 + 0 + + + soil + 5 + -9 + 1 + 4 + 40 + 58 + 30 + decal + + 0 + 0 + 0 + 12.5 + 2 + 12.5 + 0 + 0 + 0 + + + soil + 0 + 0 + 1 + 1 + 50 + 70 + 10 + decal + + 0 + 0 + 0 + 12.5 + 1.5 + 12.5 + 0 + 0 + 0 + + + soil + 0 + 0 + 1 + 1 + 40 + 60 + 30 + decal + + 0 + 0 + 0 + 12.5 + 1.5 + 12.5 + 0 + 0 + 0 + + + soil + 5.5 + 1 + 0.73 + 3.8 + 40 + 40 + 30 + decal + + 0 + 0 + 0 + 12.5 + 1.5 + 12.5 + 0 + 0 + 0 + + + soil + 0 + 0 + 1 + 1 + 50 + 70 + 10 + decal + + 0 + 0 + 0 + 12.5 + 1.5 + 12.5 + 0 + 0 + 0 + + + soil + 0 + 0 + 1 + 1 + 40 + 60 + 30 + decal + + 0 + 0 + 0 + 12.5 + 1.5 + 12.5 + 0 + 0 + 0 + + + soil + 3 + 6.1 + 0.82 + 5 + 30 + 40 + 15 + decal + crack_c + 0 + 0 + 0 + 12.5 + 3 + 12.5 + 0 + 0 + 0 + + + soil + 0 + 0 + 1 + 1 + 50 + 70 + 10 + decal + + 0 + 0 + 0 + 12.5 + 1.5 + 12.5 + 0 + 0 + 0 + + + soil + 0 + 0 + 1 + 1 + 40 + 60 + 30 + decal + + 0 + 0 + 0 + 12.5 + 1.5 + 12.5 + 0 + 0 + 0 + + + soil + -4.8 + -1 + 0.8 + 2 + 30 + 30 + 85 + decal + + 0 + 0 + 0 + 13 + 3 + 13 + 0 + 0 + 0 + + + soil + 0 + 0 + 1 + 1 + 50 + 70 + 10 + decal + + 0 + 0 + 0 + 12.5 + 1.5 + 12.5 + 0 + 0 + 0 + + + soil + 0 + 0 + 1 + 1 + 40 + 60 + 30 + decal + + 0 + 0 + 0 + 12.5 + 1.5 + 12.5 + 0 + 0 + 0 + + + soil + 1.7 + -0.3 + 0.81 + 4.4 + 18 + 40 + 19 + decal + crack_c + 0 + 0 + 0 + 12.5 + 3.3 + 12.5 + 0 + 0 + 0 + + + soil + 0 + 0 + 1 + 1 + 50 + 70 + 10 + decal + crack_c + 0 + 0 + 0 + 12.5 + 1.5 + 12.5 + 0 + 0 + 0 + + + soil + 0 + 0 + 1 + 1 + 40 + 60 + 30 + decal + crack_c + 0 + 0 + 0 + 12.5 + 1.5 + 12.5 + 0 + 0 + 0 + + + soil + 1 + -27.88 + 0.8 + 6 + 20 + 35 + 10 + decal + + 0 + 30 + 0 + 12.5 + 5 + 12.5 + 20 + 20 + 0 + + + soil + 0 + 0 + 1 + 1 + 50 + 70 + 10 + decal + + 0 + 0 + 0 + 12.5 + 1.5 + 12.5 + 0 + 0 + 0 + + + soil + 0 + 0 + 1 + 1 + 40 + 60 + 30 + decal + + 0 + 0 + 0 + 12.5 + 1.5 + 12.5 + 0 + 0 + 0 + + + soil + 0 + 0 + 0.9 + 2 + 40 + 60 + 20 + decal + + 0 + 0 + 0 + 13 + 4 + 13 + 0 + 0 + 0 + + + soil + 0 + 0 + 1 + 1 + 50 + 70 + 10 + decal + + 0 + 0 + 0 + 12.5 + 1.5 + 12.5 + 0 + 0 + 0 + + + soil + 0 + 0 + 1 + 1 + 40 + 60 + 30 + decal + + 0 + 0 + 0 + 12.5 + 1.5 + 12.5 + 0 + 0 + 0 + + + soil + -0.5 + 0.5 + 0.87 + 4 + 50 + 65 + 40 + decal + crack_c + 0 + 0 + 0 + 12.5 + 10 + 12.5 + 0 + 0 + 0 + + + soil + 0 + 0 + 1 + 1 + 50 + 70 + 10 + decal + crack_c + 0 + 0 + 0 + 12.5 + 1.5 + 12.5 + 0 + 0 + 0 + + + soil + 0 + 0 + 1 + 1 + 40 + 60 + 30 + decal + crack_c + 0 + 0 + 0 + 12.5 + 1.5 + 12.5 + 0 + 0 + 0 + + + soil + 3.6 + 0 + 0.8 + 5.4 + 30 + 60 + 40 + decal + + 0 + 0 + 0 + 12.5 + 1.5 + 12.5 + 0 + 0 + 0 + + + soil + 0 + 0 + 1 + 1 + 50 + 70 + 10 + decal + + 0 + 0 + 0 + 12.5 + 1.5 + 12.5 + 0 + 0 + 0 + + + soil + 0 + 0 + 1 + 1 + 40 + 60 + 30 + decal + + 0 + 0 + 0 + 12.5 + 1.5 + 12.5 + 0 + 0 + 0 + + + soil + 0 + -7 + 0.9 + 4.5 + 20 + 50 + 20 + decal + + 0 + 0 + 0 + 12.5 + 4 + 12.5 + 0 + 0 + 0 + + + soil + 0 + 0 + 1 + 1 + 50 + 70 + 10 + decal + + 0 + 0 + 0 + 12.5 + 1.5 + 12.5 + 0 + 0 + 0 + + + soil + 0 + 0 + 1 + 1 + 40 + 60 + 30 + decal + + 0 + 0 + 0 + 12.5 + 1.3 + 12.5 + 0 + 0 + 0 + + + soil + 0 + -9 + 0.8 + 5 + 20 + 48 + 15 + decal + + 0 + 0 + 0 + 12.5 + 4 + 12.5 + 0 + 0 + 0 + + + soil + 0 + 0 + 1 + 1 + 50 + 70 + 10 + decal + + 0 + 0 + 0 + 12.5 + 1.5 + 12.5 + 0 + 0 + 0 + + + soil + 0 + 0 + 1 + 1 + 40 + 60 + 30 + decal + + 0 + 0 + 0 + 12.5 + 1.5 + 12.5 + 0 + 0 + 0 + + + soil + 0 + 1.6 + 0.95 + 6 + 40 + 48 + 20 + decal + + 0 + 0 + 0 + 12.5 + 1 + 12.5 + 0 + 0 + 0 + + + soil + 0 + 0 + 1 + 1 + 50 + 70 + 10 + decal + + 0 + 0 + 0 + 12.5 + 1.5 + 12.5 + 0 + 0 + 0 + + + soil + 0 + 0 + 1 + 1 + 40 + 60 + 30 + decal + + 0 + 0 + 0 + 12.5 + 1 + 12.5 + 0 + 0 + 0 + + + soil + 0 + 0 + 1 + 1 + 40 + 70 + 10 + decal + + 0 + 0 + 0 + 12.5 + 1.5 + 12.5 + 0 + 0 + 0 + + + soil + 0 + 0 + 1 + 1 + 50 + 70 + 10 + decal + + 0 + 0 + 0 + 12.5 + 1.5 + 12.5 + 0 + 0 + 0 + + + soil + 0 + 0 + 1 + 1 + 40 + 60 + 30 + decal + + 0 + 0 + 0 + 12.5 + 1.5 + 12.5 + 0 + 0 + 0 + + + soil + 0 + 0 + 0.84 + 3 + 30 + 70 + 10 + decal + + 0 + 0 + 0 + 12.5 + 2 + 12.5 + 0 + 0 + 0 + + + soil + 0 + 0 + 1 + 1 + 50 + 70 + 10 + decal + + 0 + 0 + 0 + 12.5 + 1.5 + 12.5 + 0 + 0 + 0 + + + soil + 0 + 0 + 1 + 1 + 40 + 60 + 30 + decal + + 0 + 0 + 0 + 12.5 + 1.5 + 12.5 + 0 + 0 + 0 + + + soil + 6.9 + -0.4 + 0.9 + 6 + 20 + 70 + 10 + decal + + 0 + 0 + 0 + 12.5 + 2 + 12.5 + 0 + 0 + 0 + + + soil + 0 + 0 + 1 + 1 + 50 + 70 + 10 + decal + + 0 + 0 + 0 + 12.5 + 1.5 + 12.5 + 0 + 0 + 0 + + + soil + 0 + 0 + 1 + 1 + 40 + 60 + 30 + decal + + 0 + 0 + 0 + 12.5 + 1.5 + 12.5 + 0 + 0 + 0 + + + soil + 0.5 + -0.1 + 1 + 1 + 38 + 80 + 18 + decal + + 0 + 0 + 0 + 12.5 + 1.5 + 12.5 + 0 + 0 + 0 + + + soil + 0 + 0 + 1 + 1 + 50 + 70 + 10 + decal + + 0 + 0 + 0 + 12.5 + 1.5 + 12.5 + 0 + 0 + 0 + + + soil + 0 + 0 + 1 + 1 + 40 + 60 + 30 + decal + + 0 + 0 + 0 + 12.5 + 1.5 + 12.5 + 0 + 0 + 0 + + + wool + -5 + 1.2 + 0.8 + 3 + 40 + 58 + 20 + decal + + 0 + 0 + 0 + 12.5 + 1 + 12.5 + 0 + 0 + 0 + + + wool + 0 + 0 + 1 + 1 + 50 + 70 + 10 + decal + + 0 + 0 + 0 + 12.5 + 1.5 + 12.5 + 0 + 0 + 0 + + + wool + 0 + 0 + 1 + 1 + 40 + 60 + 30 + decal + + 0 + 0 + 0 + 12.5 + 1.5 + 12.5 + 0 + 0 + 0 + + + soil + -4.5 + 0.2 + 0.8 + 3 + 30 + 48 + 20 + decal + + 0 + 0 + 0 + 12.5 + 1.5 + 12.5 + 0 + 0 + 0 + + + soil + 0 + 0 + 1 + 1 + 50 + 70 + 10 + decal + + 0 + 0 + 0 + 12.5 + 1.5 + 12.5 + 0 + 0 + 0 + + + soil + 0 + 0 + 1 + 1 + 40 + 60 + 30 + decal + + 0 + 0 + 0 + 12.5 + 1.5 + 12.5 + 0 + 0 + 0 + + + soil + 0 + -8 + 1 + 0 + 20 + 55 + 10 + decal + + 0 + 0 + 0 + 12.5 + 1 + 12.5 + 0 + 0 + 0 + + + soil + 0 + 0 + 1 + 1 + 50 + 70 + 10 + decal + + 0 + 0 + 0 + 12.5 + 1.5 + 12.5 + 0 + 0 + 0 + + + soil + 0 + 0 + 1 + 1 + 40 + 60 + 30 + decal + + 0 + 0 + 0 + 12.5 + 1.5 + 12.5 + 0 + 0 + 0 + + + soil + 0 + 0 + 0.9 + 2 + 30 + 70 + 18 + decal + + 0 + 0 + 0 + 12.5 + 3.5 + 12.5 + 0 + 0 + 0 + + + soil + 0 + 0 + 1 + 1 + 50 + 70 + 10 + decal + + 0 + 0 + 0 + 12.5 + 1.5 + 12.5 + 0 + 0 + 0 + + + soil + 0 + 0 + 1 + 1 + 40 + 60 + 30 + decal + + 0 + 0 + 0 + 12.5 + 1.5 + 12.5 + 0 + 0 + 0 + + + soil + 5 + -5 + 0.8 + 6 + 30 + 55 + 25 + decal + + 0 + 0 + 0 + 12.5 + 2 + 12.5 + 0 + 0 + 0 + + + soil + 0 + 0 + 1 + 1 + 50 + 70 + 10 + decal + + 0 + 0 + 0 + 12.5 + 1.5 + 12.5 + 0 + 0 + 0 + + + soil + 0 + 0 + 1 + 1 + 40 + 60 + 30 + decal + + 0 + 0 + 0 + 12.5 + 1.5 + 12.5 + 0 + 0 + 0 + + + soil + 5 + -9 + 0.76 + 4.3 + 24 + 28 + 10 + decal + crack_c + 0 + 0 + 0 + 12.5 + 1.5 + 12.5 + 0 + 0 + 0 + + + soil + 0 + 0 + 1 + 1 + 50 + 70 + 10 + decal + crack_c + 0 + 0 + 0 + 12.5 + 1.5 + 12.5 + 0 + 0 + 0 + + + soil + 0 + 0 + 1 + 1 + 40 + 60 + 30 + decal + crack_c + 0 + 0 + 0 + 12.5 + 1.5 + 12.5 + 0 + 0 + 0 + + + soil + 0 + -1 + 0.8 + 4 + 20 + 90 + 45 + decal + + 0 + 0 + 0 + 12.5 + 3 + 12.5 + 0 + 0 + 0 + + + soil + 0 + 0 + 1 + 1 + 50 + 70 + 10 + decal + + 0 + 0 + 0 + 12.5 + 1.5 + 12.5 + 0 + 0 + 0 + + + soil + 0 + 0 + 1 + 1 + 40 + 60 + 30 + decal + + 0 + 0 + 0 + 12.5 + 1.5 + 12.5 + 0 + 0 + 0 + + + ice + 1 + 0 + 0.88 + 5 + 38 + 65 + 15 + decal + + 0 + 0 + 0 + 13 + 8 + 13 + 0 + 0 + 0 + + + ice + 0 + 0 + 1 + 1 + 50 + 70 + 10 + decal + + 0 + 0 + 0 + 12.5 + 1.5 + 12.5 + 0 + 0 + 0 + + + ice + 0 + 0 + 1 + 1 + 40 + 60 + 30 + decal + + 0 + 0 + 0 + 12.5 + 1.5 + 12.5 + 0 + 0 + 0 + + + soil + 5 + -0.01 + 0.81 + 1 + 40 + 50 + 19 + decal + crack_c + 0 + 0 + 0 + 12.5 + 1.5 + 12.5 + 0 + 0 + 0 + + + soil + 0 + 0 + 1 + 1 + 50 + 70 + 10 + decal + crack_c + 0 + 0 + 0 + 12.5 + 1.5 + 12.5 + 0 + 0 + 0 + + + soil + 0 + 0 + 1 + 1 + 40 + 60 + 30 + decal + crack_c + 0 + 0 + 0 + 12.5 + 1.5 + 12.5 + 0 + 0 + 0 + + + soil + 0 + 0 + 1 + 1 + 20 + 70 + 0 + decal + + 0 + 0 + 0 + 12.5 + 1.5 + 12.5 + 0 + 0 + 0 + + + soil + 0 + 0 + 1 + 1 + 50 + 70 + 10 + decal + + 0 + 0 + 0 + 12.5 + 1.5 + 12.5 + 0 + 0 + 0 + + + soil + 0 + 0 + 1 + 1 + 40 + 60 + 30 + decal + + 0 + 0 + 0 + 12.5 + 1.5 + 12.5 + 0 + 0 + 0 + + + soil + 4.8 + -2 + 0.91 + 6.3 + 45 + 70 + 40 + decal + crack_c + 0 + 0 + 0 + 12.5 + 3 + 12.5 + 0 + 0 + 0 + + + soil + 0 + 0 + 1 + 1 + 50 + 70 + 10 + decal + crack_c + 0 + 0 + 0 + 12.5 + 2 + 12.5 + 0 + 0 + 0 + + + soil + 0 + 0 + 1 + 1 + 40 + 60 + 30 + decal + crack_c + 0 + 0 + 0 + 12.5 + 3 + 12.5 + 0 + 0 + 0 + + + soil + -1.8 + -9 + 0.8 + 5 + 40 + 68 + 10 + decal + + 0 + 0 + 0 + 12.5 + 5 + 12.5 + 0 + 0 + 0 + + + soil + 0 + 0 + 1 + 1 + 50 + 70 + 10 + decal + + 0 + 0 + 0 + 12.5 + 1.5 + 12.5 + 0 + 0 + 0 + + + soil + 0 + 0 + 1 + 1 + 40 + 60 + 30 + decal + + 0 + 0 + 0 + 12.5 + 1.5 + 12.5 + 0 + 0 + 0 + + + sand + 1.2 + -29 + 0.76 + 6 + 20 + 40 + 10 + decal + + 0 + 0 + 0 + 12 + 1.5 + 12 + 0 + 0 + 0 + + + sand + 0 + 0 + 1 + 1 + 50 + 70 + 10 + decal + + 0 + 0 + 0 + 12.5 + 1.5 + 12.5 + 0 + 0 + 0 + + + sand + 0 + 0 + 1 + 1 + 40 + 60 + 30 + decal + + 0 + 0 + 0 + 12.5 + 1.5 + 12.5 + 0 + 0 + 0 + + + soil + 4 + -10 + 0.91 + 3 + 40 + 60 + 20 + decal + crack_c + 0 + 0 + 0 + 12.5 + 3 + 12.5 + 0 + 0 + 0 + + + soil + 0 + 0 + 1 + 1 + 50 + 70 + 10 + decal + + 0 + 0 + 0 + 12.5 + 1.5 + 12.5 + 0 + 0 + 0 + + + soil + 0 + 0 + 1 + 1 + 40 + 60 + 30 + decal + + 0 + 0 + 0 + 12.5 + 1.3 + 12.5 + 0 + 0 + 0 + + + soil + 5.5 + 0 + 0.6 + 7 + 38 + 60 + 9 + decal + + 0 + 0 + 0 + 12.5 + 1.5 + 12.5 + 0 + 0 + 0 + + + soil + 0 + 0 + 1 + 1 + 50 + 70 + 10 + decal + + 0 + 0 + 0 + 12.5 + 1.5 + 12.5 + 0 + 0 + 0 + + + soil + 0 + 0 + 1 + 1 + 40 + 60 + 30 + decal + + 0 + 0 + 0 + 12.5 + 1.5 + 12.5 + 0 + 0 + 0 + + + soil + -0.5 + -9 + 0.8 + 4 + 38 + 58 + 10 + decal + + 0 + 0 + 0 + 12.5 + 3 + 12.5 + 0 + 0 + 0 + + + soil + 0 + 0 + 1 + 1 + 50 + 70 + 10 + decal + + 0 + 0 + 0 + 12.5 + 1.5 + 12.5 + 0 + 0 + 0 + + + soil + 0 + 0 + 1 + 1 + 40 + 60 + 30 + decal + + 0 + 0 + 0 + 12.5 + 1.5 + 12.5 + 0 + 0 + 0 + + + soil + 6 + 0.4 + 0.7 + 1.2 + 38 + 90 + 15 + decal + + 0 + 0 + 0 + 12.5 + 1 + 12.5 + 0 + 0 + 0 + + + soil + 0 + 0 + 1 + 1 + 50 + 70 + 10 + decal + + 0 + 0 + 0 + 12.5 + 1.5 + 12.5 + 0 + 0 + 0 + + + soil + 0 + 0 + 1 + 1 + 40 + 60 + 30 + decal + + 0 + 0 + 0 + 12.5 + 1.5 + 12.5 + 0 + 0 + 0 + + + soil + 0 + -4 + 0.19 + 2 + 20 + 18 + 0 + effect + pickel_mining_clack_flatzonex3 + 0 + 0 + 0 + 1 + 1 + 1 + 0 + -0.8 + 12.3 + + + soil + 0 + 0 + 1 + 1 + 50 + 70 + 10 + effect + pickel_mining_clack_flatzonex3 + 0 + 0 + 0 + 1 + 1 + 1 + 0 + -1.2 + 13.3 + + + soil + 0 + 0 + 1 + 1 + 40 + 60 + 30 + effect + pickel_mining_clack_flatzonex3 + 0 + 0 + 0 + 1 + 1 + 1 + 0 + -1.2 + 13.3 + + + soil + 0 + -1.6 + 0.7 + 3.7 + 0 + 20 + 0 + decal + + 0 + 0 + 0 + 12.5 + 1 + 12.5 + 0 + 0 + 0 + + + soil + 0 + 0 + 1 + 1 + 50 + 70 + 10 + decal + crack_c + 0 + 0 + 0 + 12.5 + 1.5 + 12.5 + 0 + 0 + 0 + + + soil + 0 + 0 + 1 + 1 + 40 + 60 + 30 + decal + crack_c + 0 + 0 + 0 + 12.5 + 1.5 + 12.5 + 0 + 0 + 0 + + + soil + 0 + -9 + 0.8 + 5 + 40 + 35 + 20 + effect + pickel_mining_clack + 0 + 0 + 0 + 1.2 + 1 + 1 + 0 + 0 + 0 + + + soil + 0 + 0 + 1 + 1 + 50 + 70 + 10 + effect + pickel_mining_clack_flatzonex3 + 0 + 0 + 0 + 1.2 + 0.5 + 1 + 0 + -0.3 + 1 + + + soil + 0 + 0 + 1 + 1 + 40 + 60 + 30 + effect + pickel_mining_clack_flatzonex3 + 0 + 0 + 0 + 1.2 + 0.5 + 1 + 0 + -0.3 + 1 + + + soil + 2.8 + -1.5 + 0.88 + 6.7 + 20 + 40 + -2 + decal + pickel_mining_clack_flatzonex3 + 0 + 0 + 0 + 12.5 + 3 + 12.5 + 0 + 0 + 0 + + + soil + 0 + 0 + 1 + 1 + 50 + 70 + 10 + decal + + 0 + 0 + 0 + 12.5 + 1.5 + 12.5 + 0 + 0 + 0 + + + soil + 0 + 0 + 1 + 1 + 40 + 60 + 30 + decal + + 0 + 0 + 0 + 12.5 + 1.5 + 12.5 + 0 + 0 + 0 + + + soil + -1 + 0.5 + 0.9 + 3.1 + 20 + 20 + 10 + decal + + 0 + 0 + 0 + 12.5 + 2 + 12.5 + 0 + 0 + 0 + + + soil + 0 + 0 + 1 + 1 + 50 + 70 + 10 + decal + + 0 + 0 + 0 + 12.5 + 1.5 + 12.5 + 0 + 0 + 0 + + + soil + 0 + 0 + 1 + 1 + 40 + 60 + 30 + decal + + 0 + 0 + 0 + 12.5 + 1.5 + 12.5 + 0 + 0 + 0 + + + soil + 0 + 0 + 0.8 + 1 + 15 + 20 + 0 + effect + pickel_mining_clack + 0 + 0 + 0 + 1 + 1 + 1 + 0 + -1 + 11 + + + soil + 0 + 0 + 1 + 1 + 50 + 70 + 10 + effect + pickel_mining_clack + 0 + 0 + 0 + 1 + 1 + 1 + 0 + -1 + 15 + + + soil + 0 + 0 + 1 + 1 + 40 + 60 + 30 + effect + pickel_mining_clack + 0 + 0 + 0 + 1 + 1 + 1 + 0 + -1 + 15 + + + soil + 0 + 0 + 1 + 6.8 + 18 + 45 + 10 + decal + + 0 + 0 + 0 + 12.5 + 2 + 12.5 + 0 + 0 + 0 + + + soil + 0 + 0 + 1 + 1 + 50 + 70 + 10 + decal + + 0 + 0 + 0 + 12.5 + 1.5 + 12.5 + 0 + 0 + 0 + + + soil + 0 + 0 + 1 + 1 + 40 + 60 + 30 + decal + + 0 + 0 + 0 + 12.5 + 1.5 + 12.5 + 0 + 0 + 0 + + + soil + -5 + 0 + 0.6 + 6 + 20 + 35 + 15 + decal + + 0 + 0 + 0 + 12.5 + 2 + 12.5 + 0 + 0 + 0 + + + soil + 0 + 0 + 1 + 1 + 50 + 70 + 10 + decal + + 0 + 0 + 0 + 12.5 + 1.5 + 12.5 + 0 + 0 + 0 + + + soil + 0 + 0 + 1 + 1 + 40 + 60 + 30 + decal + + 0 + 0 + 0 + 12.5 + 1.5 + 12.5 + 0 + 0 + 0 + + + soil + -5.1 + -1.3 + 0.87 + 4.4 + 38 + 60 + 10 + decal + + 0 + 0 + 0 + 12.5 + 1 + 12.5 + 0 + 0 + 0 + + + soil + 0 + 0 + 1 + 1 + 50 + 70 + 10 + decal + + 0 + 0 + 0 + 12.5 + 2 + 12.5 + 0 + 0 + 0 + + + soil + 0 + 0 + 1 + 1 + 40 + 60 + 30 + decal + + 0 + 0 + 0 + 12.5 + 2 + 12.5 + 0 + 0 + 0 + + + soil + 0 + 0 + 0.92 + 7 + 30 + 60 + 15 + decal + + 0 + 0 + 0 + 12.5 + 5 + 12.5 + 0 + 0 + 0 + + + soil + 0 + 0 + 1 + 1 + 50 + 70 + 10 + decal + + 0 + 0 + 0 + 12.5 + 1.5 + 12.5 + 0 + 0 + 0 + + + soil + 0 + 0 + 1 + 1 + 40 + 60 + 30 + decal + + 0 + 0 + 0 + 12.5 + 1.5 + 12.5 + 0 + 0 + 0 + + + soil + 0 + 0 + 1 + 1 + 40 + 65 + 10 + decal + + 0 + 0 + 0 + 12.5 + 2 + 12.5 + 0 + 0 + 0 + + + soil + 0 + 0 + 1 + 1 + 50 + 70 + 10 + decal + + 0 + 0 + 0 + 12.5 + 1.5 + 12.5 + 0 + 0 + 0 + + + soil + 0 + 0 + 1 + 1 + 40 + 60 + 30 + decal + + 0 + 0 + 0 + 12.5 + 1.5 + 12.5 + 0 + 0 + 0 + + + sand + 5 + -9.5 + 0.77 + 3 + 30 + 58 + 20 + decal + + 0 + 0 + 0 + 12.5 + 1.5 + 12.5 + 0 + 0 + 0 + + + sand + 0 + 0 + 1 + 1 + 50 + 70 + 10 + decal + + 0 + 0 + 0 + 12.5 + 1.5 + 12.5 + 0 + 0 + 0 + + + sand + 0 + 0 + 1 + 1 + 40 + 60 + 30 + decal + + 0 + 0 + 0 + 12.5 + 1.5 + 12.5 + 0 + 0 + 0 + + + soil + 2.5 + 0.7 + 0.72 + 3 + 20 + 58 + 10 + decal + + 0 + 0 + 0 + 12.5 + 4 + 12.5 + 0 + 0 + 0 + + + soil + 0 + 0 + 1 + 1 + 50 + 70 + 10 + decal + + 0 + 0 + 0 + 12.5 + 1.5 + 12.5 + 0 + 0 + 0 + + + soil + 0 + 0 + 1 + 1 + 40 + 60 + 30 + decal + + 0 + 0 + 0 + 12.5 + 1.5 + 12.5 + 0 + 0 + 0 + + + sand + 3 + 1.2 + 0.8 + 7 + 50 + 68 + 10 + decal + + 0 + 0 + 0 + 12.5 + 3 + 12.5 + 0 + 0 + 0 + + + sand + 0 + 0 + 1 + 1 + 50 + 70 + 10 + decal + + 0 + 0 + 0 + 12.5 + 1.5 + 12.5 + 0 + 0 + 0 + + + sand + 0 + 0 + 1 + 1 + 40 + 60 + 30 + decal + + 0 + 0 + 0 + 12.5 + 1.5 + 12.5 + 0 + 0 + 0 + + + soil + 0 + -4 + 1 + 1 + 20 + 45 + 10 + decal + + 0 + 0 + 0 + 12.5 + 1.5 + 12.5 + 0 + 0 + 0 + + + soil + 0 + 0 + 1 + 1 + 50 + 70 + 10 + decal + + 0 + 0 + 0 + 12.5 + 1.5 + 12.5 + 0 + 0 + 0 + + + soil + 0 + 0 + 1 + 1 + 40 + 60 + 30 + decal + + 0 + 0 + 0 + 12.5 + 1.5 + 12.5 + 0 + 0 + 0 + + + soil + 0 + -4 + 1 + 1 + 20 + 45 + 10 + decal + + 0 + 0 + 0 + 12.5 + 1.5 + 12.5 + 0 + 0 + 0 + + + soil + 0 + 0 + 1 + 1 + 50 + 70 + 10 + decal + + 0 + 0 + 0 + 12.5 + 1.5 + 12.5 + 0 + 0 + 0 + + + soil + 0 + 0 + 1 + 1 + 40 + 60 + 30 + decal + + 0 + 0 + 0 + 12.5 + 1.5 + 12.5 + 0 + 0 + 0 + + + soil + 2 + -6.1 + 0.9 + 5 + 30 + 65 + 13 + decal + + 0 + 0 + 0 + 12.5 + 3 + 12.5 + 0 + 0 + 0 + + + soil + 0 + 0 + 1 + 1 + 50 + 70 + 10 + decal + + 0 + 0 + 0 + 12.5 + 1.5 + 12.5 + 0 + 0 + 0 + + + soil + 0 + 0 + 1 + 1 + 40 + 60 + 30 + decal + + 0 + 0 + 0 + 12.5 + 1.5 + 12.5 + 0 + 0 + 0 + + + wool + 0 + 0.6 + 1 + 0.9 + 18 + 80 + 10 + decal + + 0 + 0 + 0 + 12.5 + 2 + 12.5 + 0 + 0 + 0 + + + wool + 0 + 0 + 1 + 1 + 50 + 70 + 10 + decal + + 0 + 0 + 0 + 12.5 + 1.5 + 12.5 + 0 + 0 + 0 + + + wool + 0 + 0 + 1 + 1 + 40 + 60 + 30 + decal + + 0 + 0 + 0 + 12.5 + 1.5 + 12.5 + 0 + 0 + 0 + + + soil + 2 + 0 + 0.9 + 6 + 30 + 50 + 10 + decal + + 0 + 0 + 0 + 12.5 + 1.5 + 12.5 + 0 + 0 + 0 + + + soil + 0 + 0 + 1 + 1 + 50 + 70 + 10 + decal + + 0 + 0 + 0 + 12.5 + 1.5 + 12.5 + 0 + 0 + 0 + + + soil + 0 + 0 + 1 + 1 + 40 + 60 + 30 + decal + + 0 + 0 + 0 + 12.5 + 1.5 + 12.5 + 0 + 0 + 0 + + + soil + 0 + 0 + 1 + 1 + 25 + 30 + 10 + decal + + 0 + 0 + 0 + 12.5 + 1.5 + 12.5 + 0 + 0 + 0 + + + soil + 0 + 0 + 1 + 1 + 50 + 70 + 10 + decal + + 0 + 0 + 0 + 12.5 + 1.5 + 12.5 + 0 + 0 + 0 + + + soil + 0 + 0 + 1 + 1 + 40 + 60 + 30 + decal + + 0 + 0 + 0 + 12.5 + 1.5 + 12.5 + 0 + 0 + 0 + + + soil + 0 + 0 + 0.69 + 4 + 25 + 58 + 10 + decal + crack_c + 0 + 0 + 0 + 12.5 + 1 + 12.5 + 0 + 0 + 0 + + + soil + 0 + 0 + 1 + 1 + 50 + 70 + 10 + decal + crack_c + 0 + 0 + 0 + 12.5 + 1.5 + 12.5 + 0 + 0 + 0 + + + soil + 0 + 0 + 1 + 1 + 40 + 60 + 30 + decal + crack_c + 0 + 0 + 0 + 12.5 + 1 + 12.5 + 0 + 0 + 0 + + + soil + -4.5 + -0.1 + 0.9 + 4 + 40 + 90 + 9 + decal + + 0 + 0 + 0 + 12.5 + 1.5 + 12.5 + 0 + 0 + 0 + + + soil + 0 + 0 + 1 + 1 + 50 + 70 + 10 + decal + + 0 + 0 + 0 + 12.5 + 1.5 + 12.5 + 0 + 0 + 0 + + + soil + 0 + 0 + 1 + 1 + 40 + 60 + 30 + decal + + 0 + 0 + 0 + 12.5 + 1.5 + 12.5 + 0 + 0 + 0 + + + wool + -2.5 + 4.6 + 0.83 + 4 + 30 + 40 + 15 + decal + + 0 + 0 + 0 + 12.5 + 3 + 12.5 + 0 + 0 + 0 + + + wool + 0 + 0 + 1 + 1 + 50 + 70 + 10 + decal + + 0 + 0 + 0 + 12.5 + 3 + 12.5 + 0 + 0 + 0 + + + wool + 0 + 0 + 1 + 1 + 40 + 60 + 30 + decal + + 0 + 0 + 0 + 12.5 + 3 + 12.5 + 0 + 0 + 0 + + + sand + 5.1 + -5.1 + 0.9 + 3.1 + 60 + 50 + 10 + effect + pickel_mining_clack_flatzonex3 + 0 + 0 + 0 + 1 + 1 + 1 + 0 + -0.6 + 12 + + + sand + 0 + 0 + 1 + 1 + 50 + 70 + 10 + effect + pickel_mining_clack_flatzonex3 + 0 + 0 + 0 + 1 + 1 + 1 + 0 + -1.2 + 8 + + + sand + 0 + 0 + 1 + 1 + 40 + 60 + 30 + effect + pickel_mining_clack_flatzonex3 + 0 + 0 + 0 + 1 + 1 + 1 + 0 + -1.2 + 8 + + + soil + 0 + 0 + 0.7 + 5 + 10 + 30 + 10 + effect + pickel_mining_clack + 0 + 0 + 0 + 1.2 + 1.2 + 1.2 + 0 + -1 + 21 + + + soil + 0 + 0 + 1 + 1 + 50 + 70 + 10 + effect + pickel_mining_clack + 0 + 0 + 0 + 1.2 + 1.2 + 1.2 + 0 + -1 + 21 + + + soil + 0 + 0 + 1 + 1 + 40 + 60 + 30 + effect + pickel_mining_clack + 0 + 0 + 0 + 1.2 + 1.2 + 1.2 + 0 + -1 + 21 + + + soil + 0 + -7 + 0.7 + 3 + 20 + 55 + 10 + effect + pickel_mining_clack + 0 + 0 + 0 + 1 + 1 + 1 + 0 + 0 + 0 + + + soil + 0 + 0 + 1 + 1 + 50 + 70 + 10 + effect + pickel_mining_clack + 0 + 0 + 0 + 1 + 1 + 1 + 0 + -1 + 0 + + + soil + 0 + 0 + 1 + 1 + 40 + 60 + 30 + effect + pickel_mining_clack + 0 + 0 + 0 + 1 + 1 + 1 + 0 + -1 + 0 + + + soil + 0 + 0 + 0.8 + 3.1 + 30 + 70 + 10 + decal + + 0 + 0 + 0 + 12.5 + 1 + 12.5 + 0 + 0 + 0 + + + soil + 0 + 0 + 1 + 1 + 50 + 70 + 10 + decal + + 0 + 0 + 0 + 12.5 + 1.5 + 12.5 + 0 + 0 + 0 + + + soil + 0 + 0 + 1 + 1 + 40 + 60 + 30 + decal + + 0 + 0 + 0 + 12.5 + 1.5 + 12.5 + 0 + 0 + 0 + + + soil + 0.1 + 1 + 0.8 + 4 + 10 + 60 + 10 + decal + + 0 + 0 + 0 + 12.5 + 1.5 + 12.5 + 0 + 0 + 0 + + + soil + 0 + 0 + 1 + 1 + 50 + 70 + 10 + decal + + 0 + 0 + 0 + 12.5 + 1.5 + 12.5 + 0 + 0 + 0 + + + soil + 0 + 0 + 1 + 1 + 40 + 60 + 30 + decal + + 0 + 0 + 0 + 12.5 + 1.5 + 12.5 + 0 + 0 + 0 + + + soil + 5 + -0.1 + 0.8 + 4 + 40 + 50 + 18 + decal + + 0 + 0 + 0 + 12.5 + 1.5 + 12.5 + 0 + 0 + 0 + + + soil + 0 + 0 + 1 + 1 + 50 + 70 + 10 + decal + + 0 + 0 + 0 + 12.5 + 2.5 + 12.5 + 0 + 0 + 0 + + + soil + 0 + 0 + 1 + 1 + 40 + 60 + 30 + decal + + 0 + 0 + 0 + 12.5 + 2.5 + 12.5 + 0 + 0 + 0 + + + soil + -0.1 + 0.4 + 0.8 + 2.4 + 29 + 58 + 20 + decal + + 0 + 0 + 0 + 12.5 + 4 + 12.5 + 0 + 0 + 0 + + + soil + 0 + 0 + 1 + 1 + 50 + 70 + 10 + decal + + 0 + 0 + 0 + 12.5 + 1.5 + 12.5 + 0 + 0 + 0 + + + soil + 0 + 0 + 1 + 1 + 40 + 60 + 30 + decal + + 0 + 0 + 0 + 12.5 + 1.5 + 12.5 + 0 + 0 + 0 + + + soil + -3 + 2.48 + 0.87 + 2.2 + 20 + 20 + 90 + decal + + 0 + 0 + 0 + 12.5 + 2 + 12.5 + 0 + 0 + 0 + + + soil + 0 + 0 + 1 + 1 + 50 + 70 + 10 + decal + + 0 + 0 + 0 + 12.5 + 1.5 + 12.5 + 0 + 0 + 0 + + + soil + 0 + 0 + 1 + 1 + 40 + 60 + 30 + decal + + 0 + 0 + 0 + 12.5 + 1.5 + 12.5 + 0 + 0 + 0 + + + soil + 0 + 0 + 1 + 1 + 35 + 70 + 10 + decal + + 0 + 0 + 0 + 12.5 + 3 + 12.5 + 0 + 0 + 0 + + + soil + 0 + 0 + 1 + 1 + 50 + 70 + 10 + decal + + 0 + 0 + 0 + 12.5 + 1.5 + 12.5 + 0 + 0 + 0 + + + soil + 0 + 0 + 1 + 1 + 40 + 60 + 30 + decal + + 0 + 0 + 0 + 12.5 + 1.5 + 12.5 + 0 + 0 + 0 + + + sand + 0 + 4.6 + 0.8 + 1 + 20 + 40 + 0 + decal + + 0 + 0 + 0 + 12.5 + 1.5 + 12.5 + 0 + 0 + 0 + + + sand + 0 + 0 + 1 + 1 + 50 + 70 + 10 + decal + + 0 + 0 + 0 + 12.5 + 1.5 + 12.5 + 0 + 0 + 0 + + + sand + 0 + 0 + 1 + 1 + 40 + 60 + 30 + decal + + 0 + 0 + 0 + 12.5 + 1.5 + 12.5 + 0 + 0 + 0 + + + soil + 0.85 + -6.5 + 0.75 + 2.6 + 48 + 45 + 50 + decal + + 0 + 0 + 0 + 12.5 + 1 + 12.5 + 0 + 0 + 0 + + + soil + 0 + 0 + 1 + 1 + 50 + 70 + 10 + decal + + 0 + 0 + 0 + 12.5 + 1.5 + 12.5 + 0 + 0 + 0 + + + soil + 0 + 0 + 1 + 1 + 40 + 60 + 30 + decal + + 0 + 0 + 0 + 12.5 + 1.5 + 12.5 + 0 + 0 + 0 + + + soil + 0 + 0 + 0.8 + 1 + 30 + 50 + 10 + decal + + 0 + 0 + 0 + 12.5 + 1.5 + 12.5 + 0 + 0 + 0 + + + soil + 0 + 0 + 1 + 1 + 50 + 70 + 10 + decal + + 0 + 0 + 0 + 12.5 + 1.5 + 12.5 + 0 + 0 + 0 + + + soil + 0 + 0 + 1 + 1 + 40 + 60 + 30 + decal + + 0 + 0 + 0 + 12.5 + 1.5 + 12.5 + 0 + 0 + 0 + + + soil + -1 + 2.1 + 0.76 + 2.5 + 30 + 57 + 40 + decal + + 0 + 0 + 0 + 12.5 + 2.5 + 12.5 + 0 + 0 + 0 + + + soil + 0 + 0 + 1 + 1 + 50 + 70 + 10 + decal + + 0 + 0 + 0 + 12.5 + 1.4 + 12.5 + 0 + 0 + 0 + + + soil + 0 + 0 + 1 + 1 + 40 + 60 + 30 + decal + + 0 + 0 + 0 + 12.5 + 1.4 + 12.5 + 0 + 0 + 0 + + + soil + 0.4 + 0 + 0.9 + 5 + 28 + 35 + 40 + decal + + 0 + 0 + 0 + 12.5 + 1.5 + 12.5 + 0 + 0 + 0 + + + soil + 0 + 0 + 1 + 1 + 50 + 70 + 10 + decal + + 0 + 0 + 0 + 12.5 + 1.5 + 12.5 + 0 + 0 + 0 + + + soil + 0 + 0 + 1 + 1 + 40 + 60 + 30 + decal + + 0 + 0 + 0 + 12.5 + 1.5 + 12.5 + 0 + 0 + 0 + + + soil + 0 + 0 + 0.8 + 1 + 15 + 40 + 0 + decal + + 0 + 0 + 0 + 12.5 + 1 + 12.5 + 0 + 0 + 0 + + + soil + 0 + 0 + 1 + 1 + 50 + 70 + 10 + decal + + 0 + 0 + 0 + 12.5 + 1 + 12.5 + 0 + 0 + 0 + + + soil + 0 + 0 + 1 + 1 + 40 + 60 + 30 + decal + + 0 + 0 + 0 + 12.5 + 1 + 12.5 + 0 + 0 + 0 + + + soil + 0 + -9 + 1 + 0 + 30 + 30 + 9 + decal + + 0 + 0 + 0 + 12.5 + 1 + 12.5 + 0 + 0 + 0 + + + soil + 0 + 0 + 1 + 1 + 50 + 70 + 10 + decal + + 0 + 0 + 0 + 12.5 + 1 + 12.5 + 0 + 0 + 0 + + + soil + 0 + 0 + 1 + 1 + 40 + 60 + 30 + decal + + 0 + 0 + 0 + 12.5 + 1 + 12.5 + 0 + 0 + 0 + + + soil + 0 + -7.5 + 0.87 + 7 + 55 + 55 + 45 + decal + + 0 + 0 + 0 + 12.5 + 2 + 12.5 + 0 + 0 + 0 + + + soil + 0 + 0 + 1 + 1 + 50 + 70 + 10 + decal + + 0 + 0 + 0 + 12.5 + 1.5 + 12.5 + 0 + 0 + 0 + + + soil + 0 + 0 + 1 + 1 + 40 + 60 + 30 + decal + + 0 + 0 + 0 + 12.5 + 1.5 + 12.5 + 0 + 0 + 0 + + + soil + 0 + 1 + 0.87 + 4.9 + 40 + 78 + 30 + decal + + 0 + 0 + 0 + 12.5 + 2.5 + 12.5 + 0 + 0 + 0 + + + soil + 0 + 0 + 1 + 1 + 50 + 70 + 10 + decal + + 0 + 0 + 0 + 12.5 + 1.5 + 12.5 + 0 + 0 + 0 + + + soil + 0 + 0 + 1 + 1 + 40 + 60 + 30 + decal + + 0 + 0 + 0 + 12.5 + 1.5 + 12.5 + 0 + 0 + 0 + + + soil + 2 + 0 + 0.9 + 5.3 + 25 + 40 + 15 + decal + + 0 + 0 + 0 + 12.5 + 1.5 + 12.5 + 0 + 0 + 0 + + + soil + 0 + 0 + 1 + 1 + 50 + 70 + 10 + decal + + 0 + 0 + 0 + 12.5 + 1.5 + 12.5 + 0 + 0 + 0 + + + soil + 0 + 0 + 1 + 1 + 40 + 60 + 30 + decal + + 0 + 0 + 0 + 12.5 + 1.5 + 12.5 + 0 + 0 + 0 + + + soil + 0 + -0.1 + 0.8 + 3.5 + 10 + 15 + 10 + effect + pickel_mining_clack_flatzonex2 + 0 + 0 + 0 + 1 + 1 + 1 + 0 + -1 + 0.2 + + + soil + 0 + 0 + 1 + 1 + 50 + 70 + 10 + effect + pickel_mining_clack + 0 + 0 + 0 + 1 + 1 + 1 + 0 + -1 + 0 + + + soil + 0 + 0 + 1 + 1 + 40 + 60 + 30 + effect + pickel_mining_clack + 0 + 0 + 0 + 1 + 1 + 1 + 0 + -1 + 0 + + + soil + 0 + -1.5 + 1 + 2 + 0 + 29 + 0 + effect + pickel_mining_clack_flatzonex + 0 + 0 + 0 + 1 + 1 + 1 + 0 + -1 + 0 + + + soil + 0 + 0 + 1 + 1 + 50 + 70 + 10 + effect + pickel_mining_clack_flatzonex + 0 + 0 + 0 + 1 + 1 + 1 + 0 + -1 + 0 + + + soil + 0 + 0 + 1 + 1 + 40 + 60 + 30 + effect + pickel_mining_clack_flatzonex + 0 + 0 + 0 + 1 + 1 + 1 + 0 + -1 + 0 + + + soil + 5 + 0 + 0.8 + 4.4 + 20 + 62 + 8 + effect + pickel_mining_clack_flatzonex3 + 0 + 0 + 0 + 1 + 1 + 1 + 0 + 0 + 7 + + + soil + 0 + 0 + 1 + 1 + 50 + 70 + 10 + decal + + 0 + 0 + 0 + 12.5 + 0.7 + 12.5 + 0 + 0 + 0 + + + soil + 0 + 0 + 1 + 1 + 40 + 60 + 30 + decal + + 0 + 0 + 0 + 12.5 + 0.7 + 12.5 + 0 + 0 + 0 + + + soil + -0.3 + 2.5 + 0.85 + 3.6 + 20 + 45 + 7 + decal + + 0 + 0 + 0 + 12.5 + 1.5 + 12.5 + 0 + 0 + 0 + + + soil + 0 + 0 + 1 + 1 + 50 + 70 + 10 + decal + + 0 + 0 + 0 + 12.5 + 1.5 + 12.5 + 0 + 0 + 0 + + + soil + 0 + 0 + 1 + 1 + 40 + 60 + 30 + decal + + 0 + 0 + 0 + 12.5 + 1.5 + 12.5 + 0 + 0 + 0 + + + soil + 0 + 0 + 0.8 + 3 + 39 + 58 + 19 + effect + pickel_mining_clack_flatzonex3 + 0 + 0 + 0 + 1 + 1 + 1 + 0 + -1 + 0 + + + soil + 0 + 0 + 1 + 1 + 50 + 70 + 10 + effect + pickel_mining_clack_flatzonex3 + 0 + 0 + 0 + 1 + 1 + 1 + 0 + -1 + 0 + + + soil + 0 + 0 + 1 + 1 + 40 + 60 + 30 + effect + pickel_mining_clack_flatzonex3 + 0 + 0 + 0 + 1 + 1 + 1 + 0 + -1 + 0 + + + soil + 0 + 0 + 0.93 + 1 + 40 + 58 + 40 + decal + + 0 + 0 + 0 + 12.5 + 2 + 12.5 + 0 + 0 + 0 + + + soil + 0 + 0 + 1 + 1 + 50 + 70 + 10 + decal + + 0 + 0 + 0 + 12.5 + 2 + 12.5 + 0 + 0 + 0 + + + soil + 0 + 0 + 1 + 1 + 40 + 60 + 30 + decal + + 0 + 0 + 0 + 12.5 + 2 + 12.5 + 0 + 0 + 0 + + + soil + 0 + 0 + 0.9 + 2 + 40 + 70 + 40 + decal + crack_c + 0 + 0 + 0 + 12.5 + 2 + 12.5 + 0 + 0 + 0 + + + soil + 0 + 0 + 1 + 1 + 50 + 70 + 10 + decal + crack_c + 0 + 0 + 0 + 12.5 + 2 + 12.5 + 0 + 0 + 0 + + + soil + 0 + 0 + 1 + 1 + 40 + 60 + 30 + decal + crack_c + 0 + 0 + 0 + 12.5 + 2 + 12.5 + 0 + 0 + 0 + + + soil + 6 + -1.5 + 0.81 + 5.5 + 60 + 60 + 8 + decal + + 0 + 0 + 0 + 12.5 + 1.5 + 12.5 + 0 + 0 + 0 + + + soil + 0 + 0 + 1 + 1 + 50 + 70 + 10 + decal + + 0 + 0 + 0 + 12.5 + 1.5 + 12.5 + 0 + 0 + 0 + + + soil + 0 + 0 + 1 + 1 + 40 + 60 + 30 + decal + + 0 + 0 + 0 + 12.5 + 1.5 + 12.5 + 0 + 0 + 0 + + + soil + 4.6 + -2 + 0.9 + 2 + 35 + 50 + 20 + decal + crack_c + 0 + 0 + 0 + 12.5 + 3 + 12.5 + 0 + 0 + 0 + + + soil + 0 + 0 + 1 + 1 + 50 + 70 + 10 + decal + crack_c + 0 + 0 + 0 + 12.5 + 2 + 12.5 + 0 + 0 + 0 + + + soil + 0 + 0 + 1 + 1 + 40 + 60 + 30 + decal + crack_c + 0 + 0 + 0 + 12.5 + 2 + 12.5 + 0 + 0 + 0 + + + soil + 0 + 0 + 0.94 + 1 + 40 + 68 + 28 + decal + + 0 + 0 + 0 + 12.5 + 1.5 + 12.5 + 0 + 0 + 0 + + + soil + 0 + 0 + 1 + 1 + 50 + 70 + 10 + decal + + 0 + 0 + 0 + 12.5 + 1.5 + 12.5 + 0 + 0 + 0 + + + soil + 0 + 0 + 1 + 1 + 40 + 60 + 30 + decal + + 0 + 0 + 0 + 12.5 + 1.5 + 12.5 + 0 + 0 + 0 + + + soil + 0 + -0.1 + 0.8 + 5 + 30 + 60.1 + 19.9 + decal + + 0 + 0 + 0 + 12.5 + 2 + 12.5 + 0 + 0 + 0 + + + soil + 0 + 0 + 1 + 1 + 50 + 70 + 10 + decal + + 0 + 0 + 0 + 12.5 + 1.5 + 12.5 + 0 + 0 + 0 + + + soil + 0 + 0 + 1 + 1 + 40 + 60 + 30 + decal + + 0 + 0 + 0 + 12.5 + 1.5 + 12.5 + 0 + 0 + 0 + + + + 0 + 0 + 1 + 1 + 0 + 210 + -8 + effect + pickel_mining_clack + 0 + 0 + 0 + 1 + 1 + 1 + 0 + -1 + 21 + + + + 0 + 0 + 1 + 1 + 0 + 100 + 0 + decal + + 0 + 0 + 0 + 12.5 + 1 + 12.5 + 0 + 0 + 0 + + + + 0 + 0 + 1 + 1 + 0 + 0 + 0 + decal + + 0 + 0 + 0 + 12.5 + 1 + 12.5 + 0 + 0 + 0 + + + + 0 + 0 + 1 + 1 + 40 + 60 + 30 + effect + pickel_mining_clack_flatzonex2 + 0 + 0 + 0 + 1 + 1 + 1 + 0 + -1 + 20.5 + + + + 0 + 0 + 1 + 1 + 0 + 0 + 0 + decal + + 0 + 0 + 0 + 12.5 + 1 + 12.5 + 0 + 0 + 0 + + + + 0 + 0 + 1 + 1 + 0 + 0 + 0 + decal + + 0 + 0 + 0 + 12.5 + 1 + 12.5 + 0 + 0 + 0 + + + + 2 + -3 + 0.78 + 7.5 + 0 + 0 + 0 + decal + + 0 + 0 + 0 + 12.5 + 1 + 12.5 + 0 + 0 + 0 + + + + 0 + 0 + 0.6 + 6 + 0 + 0 + 0 + decal + + 0 + 0 + 0 + 12.5 + 1 + 12.5 + 0 + 0 + 0 + + + + 0 + 0 + 1 + 1 + 0 + 0 + 0 + decal + + 0 + 0 + 0 + 12.5 + 1 + 12.5 + 0 + 0 + 0 + + + + 0 + 0 + 1 + 1 + 20 + 60 + 0 + decal + crack_c + 0 + 0 + 0 + 12.5 + 1 + 12.5 + 0 + 0 + 0 + + + + 0 + 0 + 1 + 1 + 20 + 60 + 0 + decal + crack_c + 0 + 0 + 0 + 12.5 + 2 + 12.5 + 0 + 0 + 0 + + + + 0 + 0 + 1 + 1 + 20 + 39 + 0 + decal + crack_c + 0 + 0 + 0 + 12.5 + 5 + 12.5 + 0 + 0 + 0 + + + + 0 + 0 + 1 + 1 + 20 + 60 + 0 + decal + crack_c + 0 + 0 + 0 + 12.5 + 1.5 + 12.5 + 0 + 0 + 0 + + + + 0 + 0 + 1 + 1 + 20 + 60 + 0 + decal + + 0 + 0 + 0 + 12.5 + 1.5 + 12.5 + 0 + 0 + 0 + + + + 0 + 0 + 1 + 4.7 + 40 + 60 + 20 + decal + crack_c + 0 + 0 + 0 + 12.5 + 2.5 + 12.5 + 0 + 0 + 0 + + + + 0 + 0 + 1 + 1 + 50 + 90 + 10 + decal + + 0 + 0 + 0 + 12.5 + 1.5 + 12.5 + 0 + 0 + 0 + + + + 0 + 0 + 1 + 1 + 40 + 50 + 18 + decal + + 0 + 0 + 0 + 12.5 + 1.5 + 12.5 + 0 + 0 + 0 + + + + 0 + 0 + 1 + 1 + 0 + 0 + 0 + decal + + 0 + 0 + 0 + 12.5 + 3 + 12.5 + 0 + 0 + 0 + + + + 0 + 0 + 1 + 1 + 0 + 0 + 0 + decal + + 0 + 0 + 0 + 12.5 + 1.5 + 12.5 + 0 + 0 + 0 + + + + 0 + 0 + 1 + 1 + 0 + 0 + 0 + decal + + 0 + 0 + 0 + 12.5 + 1.5 + 12.5 + 0 + 0 + 0 + + + soil + -1.1 + -0.4 + 0.8 + 8.9 + 38 + 70 + 38 + decal + + 0 + 0 + 0 + 12.5 + 1.5 + 12.5 + 0 + 0 + 0 + + + soil + 0 + 0 + 1 + 1 + 50 + 70 + 10 + decal + + 0 + 0 + 0 + 12.5 + 1.5 + 12.5 + 0 + 0 + 0 + + + soil + 0 + 0 + 1 + 1 + 40 + 60 + 30 + decal + + 0 + 0 + 0 + 12.5 + 1.5 + 12.5 + 0 + 0 + 0 + + + + 0 + 0 + 1 + 0 + 0 + 0 + 0 + decal + + 0 + 0 + 0 + 12.5 + 1 + 12.5 + 0 + 0 + 0 + + + soil + 0 + 0 + 0.9 + 2 + 35 + 60 + 50 + decal + + 0 + 0 + 0 + 12.5 + 2 + 12.5 + 0 + 0 + 0 + + + soil + 0 + 0 + 1 + 1 + 50 + 70 + 10 + decal + + 0 + 0 + 0 + 12.5 + 2 + 12.5 + 0 + 0 + 0 + + + soil + 0 + 0 + 1 + 1 + 40 + 60 + 30 + decal + + 0 + 0 + 0 + 12.5 + 2 + 12.5 + 0 + 0 + 0 + + + soil + 3.5 + 0.6 + 0.95 + 4.3 + 58 + 68 + 20 + decal + + 0 + 0 + 0 + 12.5 + 1.3 + 12.5 + 0 + 0 + 0 + + + soil + 0 + 0 + 1 + 1 + 50 + 70 + 10 + decal + + 0 + 0 + 0 + 12.5 + 1.5 + 12.5 + 0 + 0 + 0 + + + soil + 0 + 0 + 1 + 1 + 40 + 60 + 30 + decal + + 0 + 0 + 0 + 12.5 + 1.5 + 12.5 + 0 + 0 + 0 + + + soil + 0 + 0 + 1 + 2 + 20 + 85 + 10 + decal + + 0 + 0 + 0 + 12.5 + 1.5 + 12.5 + 0 + 0 + 0 + + + soil + 0 + 0 + 1 + 1 + 50 + 70 + 10 + decal + + 0 + 0 + 0 + 12.5 + 1.5 + 12.5 + 0 + 0 + 0 + + + soil + 0 + 0 + 1 + 1 + 40 + 60 + 30 + decal + + 0 + 0 + 0 + 12.5 + 1.5 + 12.5 + 0 + 0 + 0 + + + soil + 0 + 0 + 1 + 2 + 20 + 45 + 10 + decal + + 0 + 0 + 0 + 12.5 + 2.5 + 12.5 + 0 + 0 + 0 + + + soil + 0 + 0 + 1 + 1 + 50 + 70 + 10 + decal + + 0 + 0 + 0 + 12.5 + 1.5 + 12.5 + 0 + 0 + 0 + + + soil + 0 + 0 + 1 + 1 + 40 + 60 + 30 + decal + + 0 + 0 + 0 + 12.5 + 1.5 + 12.5 + 0 + 0 + 0 + + + soil + 0 + 0 + 0.9 + 1 + 40 + 80 + 38 + decal + + 0 + 0 + 0 + 12.5 + 1.5 + 12.5 + 0 + 0 + 0 + + + soil + 0 + 0 + 1 + 1 + 50 + 70 + 10 + decal + + 0 + 0 + 0 + 12.5 + 2 + 12.5 + 0 + 0 + 0 + + + soil + 0 + 0 + 1 + 1 + 40 + 60 + 30 + decal + + 0 + 0 + 0 + 12.5 + 2 + 12.5 + 0 + 0 + 0 + + + soil + 0 + 0 + 1 + 1 + 40 + 70 + 30 + decal + + 0 + 0 + 0 + 12.5 + 2 + 12.5 + 0 + 0 + 0 + + + soil + 0 + 0 + 1 + 1 + 40 + 70 + 10 + decal + + 0 + 0 + 0 + 10 + 1 + 10 + 0 + 0 + 0 + + + soil + 0 + 0 + 1 + 1 + 50 + 70 + 10 + decal + + 0 + 0 + 0 + 10 + 1 + 10 + 0 + 0 + 0 + + + soil + 0 + 0 + 1 + 1 + 40 + 60 + 30 + decal + + 0 + 0 + 0 + 10 + 1 + 10 + 0 + 0 + 0 + + + soil + 0 + 0 + 1 + 1 + 40 + 70 + 30 + decal + crack_c + 0 + 0 + 0 + 12.5 + 1.5 + 12.5 + 0 + 0 + 0 + + + soil + 0 + 0 + 1 + 1 + 50 + 70 + 10 + decal + crack_c + 0 + 0 + 0 + 12.5 + 1.5 + 12.5 + 0 + 0 + 0 + + + soil + 0 + 0 + 1 + 1 + 40 + 60 + 30 + decal + crack_c + 0 + 0 + 0 + 12.5 + 1.5 + 12.5 + 0 + 0 + 0 + + + + 0 + 0 + 1 + 0 + 0 + 0 + 0 + decal + + 0 + 0 + 0 + 12.5 + 1 + 12.5 + 0 + 0 + 0 + + + wool + 2 + -4.4 + 0.92 + 4 + 30 + 49 + 10 + decal + + 0 + 0 + 0 + 12.5 + 3.3 + 12.5 + 0 + 0 + 0 + + + wool + 0 + 0 + 1 + 1 + 50 + 70 + 10 + decal + + 0 + 0 + 0 + 12.5 + 3.3 + 12.5 + 0 + 0 + 0 + + + wool + 0 + 0 + 1 + 1 + 40 + 60 + 30 + decal + + 0 + 0 + 0 + 12.5 + 3.3 + 12.5 + 0 + 0 + 0 + + + soil + 0 + 0.1 + 1 + 0 + 20 + 25 + -10 + effect + pickel_mining_clack_flatzonex + 90 + 180 + 0 + 1 + 4 + 1 + 0 + 0.25 + 0 + + + soil + 0 + 0 + 1 + 1 + 50 + 70 + 10 + effect + pickel_mining_clack_flatzonex + 90 + 180 + 0 + 1 + 4 + 1 + 0 + 0.25 + 0 + + + soil + 0 + 0 + 1 + 1 + 40 + 60 + 30 + effect + pickel_mining_clack_flatzonex + 90 + 180 + 0 + 1 + 4 + 1 + 0 + 0.25 + 0 + + + soil + 0 + 0 + 1 + 1 + 50 + 70 + 10 + decal + + 0 + 0 + 0 + 12.5 + 1.5 + 12.5 + 0 + 0 + 0 + + + soil + 0 + 0 + 1 + 1 + 50 + 70 + 10 + decal + + 0 + 0 + 0 + 12.5 + 1.5 + 12.5 + 0 + 0 + 0 + + + soil + 0 + 0 + 1 + 1 + 40 + 60 + 30 + decal + + 0 + 0 + 0 + 12.5 + 1.5 + 12.5 + 0 + 0 + 0 + + + soil + 0 + -1.6 + 0.7 + 3.7 + 40 + 20 + 10 + decal + crack_c + 0 + 0 + 0 + 15 + 2 + 15 + 0 + 0 + 0 + + + soil + 0 + -1.6 + 0.7 + 3.7 + 40 + 20 + 10 + effect + pickel_mining_clack_flatzonex3 + 0 + 0 + 0 + 1 + 1.3 + 1 + 0 + -1 + 13 + + + soil + 0 + -1.5 + 1 + 2 + 40 + 20 + 10 + effect + pickel_mining_clack_flatzonex3 + 0 + 0 + 0 + 1 + 1 + 1 + 0 + -1 + 0 + + + soil + 0 + -1.5 + 1 + 2 + 40 + 20 + 10 + effect + pickel_mining_clack_flatzonex + 0 + 0 + 0 + 1 + 1 + 1 + 0 + -1 + 0 + + + soil + -5.1 + -1.3 + 0.87 + 4.4 + 40 + 20 + 10 + decal + + 0 + 0 + 0 + 12.5 + 3 + 12.5 + 0 + 0 + 0 + + + soil + -5.1 + -1.3 + 0.87 + 4.4 + 40 + 20 + 10 + effect + pickel_mining_clack_flatzonex3 + 0 + 0 + 0 + 1 + 1 + 1 + 0 + -1 + 1 + + + wool + -2.5 + 4.6 + 0.83 + 4 + 40 + 20 + 10 + decal + + 0 + 0 + 0 + 12.5 + 3 + 12.5 + 0 + 0 + 0 + + + wool + -2.5 + 4.6 + 0.83 + 4 + 40 + 20 + 10 + effect + pickel_mining_clack_flatzonex2 + 0 + 0 + 0 + 1 + 1 + 1 + 0 + 0 + 3 + + + soil + 0 + 2 + 0.69 + 4 + 40 + 20 + 10 + decal + crack_c + 0 + 0 + 0 + 12.5 + 1 + 12.5 + 0 + 0 + 0 + + + soil + 0 + -1.6 + 0.7 + 3.7 + 40 + 20 + 10 + effect + pickel_mining_clack_flatzonex2 + 0 + 0 + 0 + 1 + 1 + 1 + 0 + 0 + 1 + + + soil + 0 + 0 + 1 + 1 + 40 + 20 + 10 + decal + crack_c + 0 + 0 + 0 + 12.5 + 1 + 12.5 + 0 + 0 + 0 + + + soil + 0 + -1.6 + 0.7 + 3.7 + 40 + 20 + 10 + effect + pickel_mining_clack_flatzonex3 + 0 + 0 + 0 + 1 + 1 + 1 + 0 + 0 + 15 + + + wool + 0 + -0.5 + 0.76 + 4 + 40 + 20 + 10 + decal + + 0 + 0 + 0 + 12.5 + 4 + 12.5 + 0 + 0 + 0 + + + wool + 0 + -1.6 + 0.7 + 3.7 + 40 + 20 + 10 + effect + pickel_mining_clack_flatzonex2 + 0 + 0 + 0 + 1 + 1 + 1 + 0 + 0 + 3 + + + wool + 0 + 0 + 1 + 1 + 40 + 20 + 10 + decal + + 0 + 0 + 0 + 12.5 + 1 + 12.5 + 0 + 0 + 0 + + + wool + 0 + -1.6 + 0.7 + 3.7 + 40 + 20 + 10 + effect + pickel_mining_clack_flatzonex2 + 0 + 0 + 0 + 1 + 1 + 1 + 0 + 0 + 1.5 + + + wool + -5 + 1.2 + 0.8 + 3 + 40 + 20 + 10 + decal + + 0 + 0 + 0 + 12.5 + 1 + 12.5 + 0 + 0 + 0 + + + wool + 0 + -1.6 + 0.7 + 3.7 + 40 + 20 + 10 + effect + pickel_mining_clack_flatzonex2 + 0 + 0 + 0 + 1 + 1 + 1 + 0 + 0 + 0 + + + soil + 0.85 + -6.5 + 0.75 + 2.6 + 40 + 20 + 10 + decal + + 0 + 0 + 0 + 12.5 + 5 + 12.5 + 0 + 0 + 0 + + + soil + 0 + -1.6 + 0.7 + 3.7 + 40 + 20 + 10 + effect + pickel_mining_clack_flatzonex2 + 90 + 180 + 0 + 1 + 5 + 1 + 0 + -0.1 + 0 + + + soil + 0 + -1.6 + 0.7 + 3.7 + 40 + 20 + 10 + effect + pickel_mining_clack_flatzonex2 + 90 + 180 + 0 + 1 + 5 + 1 + 0 + 0.1 + 0 + + + soil + 0 + 1.6 + 0.95 + 6 + 40 + 20 + 10 + decal + + 0 + 0 + 0 + 12.5 + 2.5 + 12.5 + 0 + 0 + 0 + + + soil + 0 + -1.6 + 0.7 + 3.7 + 40 + 20 + 10 + effect + pickel_mining_clack_flatzonex2 + 0 + 0 + 0 + 1 + 0.8 + 1 + 0 + 0 + 1 + + + soil + 0 + 0 + 1 + 1 + 40 + 20 + 10 + decal + + 0 + 0 + 0 + 12.5 + 1 + 12.5 + 0 + 0 + 0 + + + soil + 0 + -1.6 + 0.7 + 3.7 + 40 + 20 + 10 + effect + pickel_mining_clack_flatzonex2 + 0 + 0 + 0 + 1 + 0.8 + 1 + 0 + 0 + 1 + + + wool + -2.5 + 4.6 + 0.83 + 4 + 40 + 20 + 10 + decal + crack_c + 0 + 0 + 0 + 12.5 + 3 + 12.5 + 0 + 0 + 0 + + + wool + -2.5 + 4.6 + 0.83 + 4 + 40 + 20 + 10 + decal + crack_c + 0 + 0 + 0 + 12.5 + 3 + 12.5 + 0 + 0 + 0 + + + wool + -2.5 + 4.6 + 0.83 + 4 + 40 + 20 + 10 + effect + pickel_mining_clack + 90 + 180 + 0 + 1 + 5 + 1 + 0 + 0.25 + 0 + + + wool + -2.5 + 4.6 + 0.83 + 4 + 40 + 20 + 10 + decal + + 0 + 0 + 0 + 12.5 + 8 + 12.5 + 0 + 0 + 0 + + + soil + 2.5 + 0.7 + 0.72 + 3 + 40 + 20 + 10 + decal + crack_c + 0 + 0 + 0 + 12.5 + 4 + 12.5 + 0 + 0 + 0 + + + soil + 2.5 + 0.7 + 0.72 + 3 + 40 + 20 + 10 + effect + pickel_mining_clack_flatzonex3 + -90 + 0 + 0 + 1 + 6 + 1 + 0 + 0 + 2 + + + soil + 0 + -8 + 1 + 0 + 40 + 20 + 10 + effect + pickel_mining_clack + 90 + 180 + 0 + 1 + 5 + 1 + 0 + 0.25 + 0 + + + soil + 0 + -8 + 1 + 0 + 40 + 20 + 10 + decal + crack_c + 0 + 0 + 0 + 12.5 + 1 + 12.5 + 0 + 0 + 0 + + + soil + 0 + -8 + 1 + 0 + 40 + 20 + 10 + decal + + 0 + 0 + 0 + 12.5 + 1 + 12.5 + 0 + 0 + 0 + + + soil + 0 + -8 + 1 + 0 + 40 + 20 + 10 + decal + crack_c + 0 + 0 + 0 + 12.5 + 1 + 12.5 + 0 + 0 + 0 + + + soil + 0 + -8 + 1 + 0 + 40 + 20 + 10 + decal + crack_c + 0 + 0 + 0 + 12.5 + 1 + 12.5 + 0 + 0 + 0 + + + soil + 0 + -8 + 1 + 0 + 40 + 20 + 10 + decal + + 0 + 0 + 0 + 12.5 + 1 + 12.5 + 0 + 0 + 0 + + + soil + 0 + -8 + 1 + 0 + 40 + 20 + 10 + decal + + 0 + 0 + 0 + 12.5 + 1 + 12.5 + 0 + 0 + 0 + + + soil + 0 + -8 + 1 + 0 + 40 + 20 + 10 + decal + crack_c + 0 + 0 + 0 + 12.5 + 1 + 12.5 + 0 + 0 + 0 + + + soil + 0 + -8 + 1 + 0 + 40 + 20 + 10 + decal + + 0 + 0 + 0 + 12.5 + 1 + 12.5 + 0 + 0 + 0 + + + soil + 0 + -8 + 1 + 0 + 40 + 20 + 10 + decal + crack_c + 0 + 0 + 0 + 12.5 + 1 + 12.5 + 0 + 0 + 0 + + + soil + 0 + 0 + 0.9 + 2 + 40 + 20 + 10 + decal + + 0 + 0 + 0 + 12.5 + 5 + 12.5 + 0 + 0 + 0 + + + soil + 0 + 0 + 0.9 + 2 + 40 + 20 + 10 + effect + pickel_mining_clack + 0 + 0 + 0 + 1 + 1 + 1 + 0 + 0 + 1 + + + soil + 1 + -27.88 + 0.8 + 6 + 40 + 20 + 10 + decal + + 0 + 30 + 0 + 12.5 + 1 + 12.5 + 20 + 20 + 0 + + + soil + 1 + -27.88 + 0.8 + 6 + 40 + 20 + 10 + decal + + 0 + 30 + 0 + 12.5 + 4 + 12.5 + 20 + 20 + 0 + + + soil + 0 + 0 + 0.8 + 3.1 + 40 + 20 + 10 + decal + + 0 + 0 + 0 + 12.5 + 1 + 12.5 + 0 + 0 + 0 + + + soil + 0 + 0 + 0.8 + 3.1 + 40 + 20 + 10 + effect + pickel_mining_clack_flatzonex2 + -80 + 0 + 0 + 1 + 5 + 1 + 0 + 2 + 0 + + + soil + 0 + -9 + 0.8 + 5 + 40 + 20 + 10 + decal + + 0 + 0 + 0 + 12.5 + 7 + 12.5 + 0 + 0 + 0 + + + soil + 0 + -9 + 0.8 + 5 + 40 + 20 + 10 + decal + + 0 + 0 + 0 + 12.5 + 2 + 12.5 + 0 + 0 + 0 + + + soil + 0 + 0 + 0.8 + 1 + 40 + 20 + 10 + effect + pickel_mining_clack + 90 + 180 + 0 + 1 + 5 + 1 + 0 + 0.25 + 0 + + + soil + 0 + 0 + 0.8 + 1 + 40 + 20 + 10 + effect + pickel_mining_clack + 90 + 180 + 0 + 1 + 5 + 1 + 0 + 0.25 + 0 + + + soil + 0 + 1 + 0.87 + 4.9 + 40 + 20 + 10 + decal + + 0 + 0 + 0 + 12.5 + 7 + 12.5 + 0 + 0 + 0 + + + soil + 0 + 1 + 0.87 + 4.9 + 40 + 20 + 10 + decal + + 0 + 0 + 0 + 12.5 + 2.5 + 12.5 + 0 + 0 + 0 + + + soil + 0 + -1.6 + 0.7 + 3.7 + 40 + 20 + 10 + decal + + 0 + 0 + 0 + 12.5 + 5 + 12.5 + 0 + 0 + 0 + + + soil + 0 + -1.6 + 0.7 + 3.7 + 40 + 20 + 10 + effect + pickel_mining_clack_flatzonex3 + 0 + 0 + 0 + 1 + 1.3 + 1 + 0 + -1 + 13 + + + soil + 0 + 0 + 1 + 1 + 50 + 70 + 10 + decal + + 0 + 0 + 0 + 12.5 + 1.5 + 12.5 + 0 + 0 + 0 + + + soil + 0 + 0 + 1 + 1 + 50 + 70 + 10 + decal + + 0 + 0 + 0 + 12.5 + 1.5 + 12.5 + 0 + 0 + 0 + + + soil + 0 + 0 + 1 + 1 + 50 + 70 + 10 + effect + pickel_mining_clack_flatzonex3 + -90 + 0 + 0 + 1.1 + 8 + 1 + 0 + 0 + 0 + + \ No newline at end of file diff --git a/icon.ico b/icon.ico new file mode 100644 index 0000000000000000000000000000000000000000..01b42648d64c7af566779f8b119580f85007de9a GIT binary patch literal 15086 zcmd^`33Qaz6@cH6Xi!2%7AcBCKuItWjUpbZl*9!s)(sA>Rltg%)>hG@NP8-&wx_kb zYd813;%D!>1j57m^N2XBJ?-46=IGW$cF^O%b@ zN&jc(pW{CWX24Cb2o8e*Im}yTojQZF)=!QM+aH?_bHu!5w5iV1OV$tTcb89WbYIn!ev4~A+3$`Pru4h3=792t ztHpfly2Z60@B83r*6$uMp1N`d$63<=vl#4?vLu@bMX5&iiY79Mx=~z|mCyk0Pl>Sc z6z(&uxH+&bj9tg*lXah&oJy?@nGCsg2;S(D409$kIq_Q+4rIO_4u=#)bvS5cRXA7} z`-6&Vqi$6=5*m(4|7eZ>T|;TEd@yN$sA!kkP`+~e&~Kl9VY{KF;d^42B!f}-96SlDbC|cxx^_j|Fa)Me+UQs4<@&!k|IY41;URb* znqhek^OjksPTor3Q%<_*e?yw@3Ae+0@D{iy?h8-nFmIW4>ZofQ+qOt2{kyMw-dqB2 zzzXn;+Xu93U;i2Gd-IlAr;fU|v8^_eGol#(=qjV&>+lk|P@aI9kOrj;ro*f7C*Wq& zBI>C72sl5qp{-Gw@g0o+?#cOBkM2|8c)kLw;ParAz|L?DJO}o*vE}>cV~w?Loqux^`*YFrnQw+^@ERNsBj7vm3|t9&fi@k3w)|7f)*Hgsa1&^AcBU>2 z?7+YG5Oq(78nBODERRDI><5muWA4~Xd;Y0P#D3_k|F6=3=gE z%?H=Db6U(>W?fs-6aKxY9tDqrbMi&-?kwglvre73Pm)cfJO2NJg=^ssSPAay7sC$V zzAol1vrZlF_?}69LFtPBFVSu)yb1R4a<~n=o4WrLie=WRqwd>a+~Z*ZXrnXx-(S&p z{k#7!fkVJC=t$I2_d$3c{spd)&iYs1z4sIt0G$=v%mdFbZFTH_a&rDnM%QO|J}rYw zp#e66Vny8sxCFGJEp6_(*7L7AIoCb2MuBtYF|ZGv1GmCdD4g3AwTN}07Ewe7_*~YfoNTitik2-CL&ovF4+iyX9uG7d%>?iBg zQTGG=)D8cbOT=;A9WDdsW}H{%EwirOdD5=`V&6Z;@NP0LY`l1Q7%;wX*lkEj__3I` z%sSqM*Y^I>_WK78s#60bNx9aHKtr|4Vn}P57z`mJb z-LF&hdA5(dFq2u`kULA#&FN+7rjlh$-eu*yJM`^aH!xIA?8DU=>dy@2FtLET^qE}E zA)LvV5q(0sxlgEH)hCQt-Y1kT9axcSJUQK%T9#f~whWy<4WLi*$(M(9q_d#qdkSvM zZG2Dh1LBaP8@2B8)I1zYCSzjcHw}hB4_+N>Cbydo}W&#`yvwDQ;FoQj4MvvIa z#&i_6hQGGe047SNRsU0N{0l&xdf2VYREGxk>q&PG3x|t&o};15_Oh`|qWza)%JR`= zABaEK|EEx21KpJh40zxEZ4UF6by@?p;~$8lx$sBuzHBV^@n67qs(62&O+LnH zUa?Lcb!}t4HngQpZMP{s5dX#)o(4^jzcydw^VzU9czud9IPvKpNe)OqtV@UCvanbw# zH#Vh32$k?SM0<|!bFdP$y&XjHS;xS+V4eHqGZ5$a+Tuqok^cNW93F!FHEs-*i#97h z{`uKev@Pvk0ptHSoCN#AGI$MQ{8&!D$5~41T6_TZgA*V=dol5&p2!gXx?lYhqVJlE zSozGMqR!t_y&h%9&3#%Mw*l`d$!`R2lG?`;;YfHC>}UI1zk@+B=B~tVTi3?*x%T#5 zcjLbq8_toP!T$Gqw8!8*a4gP&D#(}a#BX0+2R+sQ#_w944sl)j47b1}D1}1#D8;{o z;JyhjfqmjW;r#xiRW)*X;TffBydS{}TUa8Kb!Wo9~SD#{L=i|Bm|K({Bzu2{C^2mRVPfd>HY&mrjLy zA^(0IpTRQg)LGlUOLcPA_w@PIUjKV`d4}Bph4#Mr8nn~_aE2574SU7c)asI44;PnP$-sJr%wL; z_-}k}gy9gSx8iTWfp_~Dv#ICuQ!o#PKu4mEy0)=xwDCCk<6#i=bo_T=)4TGoA^Oy> zcl58pDCn%%#~F$`L=C51)4|N31^PJHKb zetsLChkVC$`9d&JE+oGfwym7?10&8WzG6 zIm}zuYEAOFXz3{aTz${{e#-BqEBL+imd(QqF`xW~+MVBItN0DJ9@(e!5`UGcT=KlD|{JWt{h7&xdv#j9FJf?Fq z%SU8h;77vD(z0yYm`YN1#)X#Cw%)Y4v@&hlw8exH(=cJ8zy8h+OY8lGZ+5D&z9~sV zeY0sOtzVv`TjbJ-xpY-FO%E_f6K3}RadA|6(OoeQJG?ir2=Co<-x0uF$jVZmG G$bSLke^O2W literal 0 HcmV?d00001 diff --git a/sample.yaml b/sample.yaml new file mode 100644 index 0000000..c231cf9 --- /dev/null +++ b/sample.yaml @@ -0,0 +1,77 @@ +--- +collisions: + - entry: + name: COL_00_Ring + subname: 00_Ring + verts: + - x: RingL + y: StageBottom + - x: RingL + y: StageBaseY + - x: RingR + y: StageBaseY + - x: RingR + y: StageBottom + - x: RingL + y: StageBottom + - entry: + name: COL_00_Platform01_through + subname: 00_Platform01_through + verts: + - x: -17.5 + y: StageTop + - x: 17.5 + y: StageTop +spawns: + - entry: + name: START_00_P01 + subname: 00_P01 + start_pos: + x: 0.0 + y: StageTop + z: 0.0 + use_start: false + unk: 0 + unk2: + x: 0.0 + y: 0.0 + z: 0.0 + unk3: 4294967295 + bone_name: "" + pos: + x: 0.0 + y: StageTop + - entry: + name: START_00_P02 + subname: 00_P02 + start_pos: + x: 0.0 + y: StageBaseY + z: 0.0 + use_start: false + unk: 0 + unk2: + x: 0.0 + y: 0.0 + z: 0.0 + unk3: 4294967295 + bone_name: "" + pos: + x: 0.0 + y: StageBaseY +camera: + - entry: + name: CAMERA_00 + subname: "00" + left: CameraLeft + right: CameraRight + top: CameraTop + bottom: CameraBottom +blastzones: + - entry: + name: DEATH_00 + subname: "00" + left: BlastLeft + right: BlastRight + top: BlastTop + bottom: BlastBottom