Leaderboard
Popular Content
Showing content with the highest reputation on 08/15/2014 in all areas
-
An Infomaniac Has Been Found
Quisoves Potoo and one other reacted to The Ace Railgun for a blog entry
Well I dug around my old box of minifigs and found my Infomaniac fig. I have no clue what set he's from but I have him along with Pepper, the original Brickster, and one or more of the Birckolinis somewhere. I put him on the plate just to help stabilize him for the photo So, anybody know where he's from?2 points -
Bionicle: The Game Game Archive Extracting (Research and Tools)
McJobless reacted to JrMasterModelBuilder for a topic
Bionicle: The Game Game Archive Extracting (Research and Tools) These are more like research tools than actual modding tools, but here we go: BIONICLE: The Game uses a archive format with the header "VOLT", to store all the assets. Within those archives are some additional archives I've been tinkering with. The ones I've had some luck with have the header "BIGB" followed by some command-line build arguments. Thanks to Google, I found a program that was made to decompress and extract the contents of files almost identical to this here: http://wiki.gbatemp.net/wiki/The_Conduit That program is made for a slightly different version of the archive format, so I re-wrote the program in Python below. So, without further ado, my partial file format specs and Python scripts. Main archives: Most of the sub-achives. #BIGB format. 0-3 - ASCII = File Header (BIGB) 4-7 - UINT32 = Offset of data - 16 (probably offset after header) 8-11 - UINT32 = Offset of data after name and before creation arguments - 12 (the amount to skip forward) 12-15 - UINT32 = Version Number? Always 0x01000000 16-79 - ASCII = Null terminated name of some kind. 80-127 - ASCII = Null terminated text of some kind. (normal) 128-131 - UINT32 = Segment 1 Uncompressed Offset? 0 means file contains no data. 132-135 - UINT32 = Segment 1 Uncompressed Offset? 0 means file contains no data. 136-139 - UINT32 = Segment 2 Compressed Offset? 0 means file contains no data. 140-143 - UINT32 = Segment 2 Compressed Offset? 0 means file contains no data. 144-399 - ASCII = Null terminated build command-line arguments. (NOTE: The data contained with is RLE compressed, my Python scripts below decompress these block during extraction.) VOLTExtractor.py , "size", "indexoffset":uint32(fileOffset+8), "unknown":uint32(fileOffset)}) fileOffset += 12 #Remember where the index is. indexOffset = fileOffset for i,v in enumerate(fileList): #Set the file offset to the index start plus the offset in the index. fileOffset = indexOffset + v["indexoffset"] #Set the file offset. fileList[i]["offset"] = uint32(fileOffset) fileOffset += 8#Skip mystery null block as well. #Set the file size. fileList[i]["size"] = uint32(fileOffset) fileOffset += 8#Skip mystery null block as well. #Read in the name until the null byte. if bytesAre == "str": while fileData[fileOffset] != b"\x00": fileList[i]["filename"] += fileData[fileOffset] fileOffset += 1 else: while fileData[fileOffset] != 0x00: fileList[i]["filename"] += chr(fileData[fileOffset]) fileOffset += 1 #And skip the null byte for the new entry. fileOffset += 1 #Create output path from input path. outFolder = path.split(os.sep) endFolder = outFolder[-1].split(".") extension = endFolder[-1] endFolder[0:-1] endFolder = ".".join(endFolder[0:-1]) + "_" + extension outFolder[-1] = endFolder outFolder = os.sep.join(outFolder) #Create the first non-existant folder to extract to. if os.path.exists(outFolder): i = 1 while(os.path.exists(outFolder + "_" + str(i))): i += 1 outFolder = outFolder + "_" + str(i) #Make the output folder. os.makedirs(outFolder) #Create a log file to log extracted files. with open((outFolder + os.sep + "__extract.log"), "w") as log: #Write the header to the log file. log.write(path.split(os.sep).pop() + "\ttotalfiles: " + str(totalFiles) + "\tindexsize: " + str(indexSize) + "\r\nfilename\toffset\tsize\tindexoffset\tunknown\r\n") #Loop through the list of files, saving them. for a in fileList: #Write the file. with open((outFolder + os.sep + a["filename"]), "wb") as f: #Write data to the log. log.write(a["filename"] + "\t" + str(a["offset"]) + "\t" + str(a["size"]) + "\t" + str(a["indexoffset"]) + "\t" + str(a["unknown"]) + "\r\n") f.write(fileData[a["offset"]:a["offset"]+a["size"]]) f.close() #Close the log. log.close() print("\tCOMPLETE: " + str(len(fileList)) + " files extracted.") return True #Detect if executable or not. fileName = sys.argv[0].split(os.sep).pop() if fileName[-3:] == ".py" or fileName[-4:] == ".pyw": runCommand = "python " + fileName else: runCommand = fileName if len(sys.argv) > 1: for i in range(1, len(sys.argv)): extract(sys.argv[i]) else: print("VOLT Extractor 1.0\n\nThis program will extract VOLT archives to an adjacent folder.\n\nCOPYRIGHT:\n\t(C) 2012 JrMasterModelBuilder\n\nLICENSE:\n\tGNU GPLv3\n\tYou accept full responsibility for how you use this program.\n\nUSEAGE:\n\t" + runCommand + " <LIST_OF_FILE_PATHS>") """ VOLT Extractor - VOLT archive extractor. Copyright (C) 2012 JrMasterModelBuilder You accept full responsibility for how you use this program. This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see <http://www.gnu.org/licenses/>. """ import os import sys def extract(path): def uint32(offset): if bytesAre == "str": return ord(fileData[offset]) + (ord(fileData[offset+1]) * 256) + (ord(fileData[offset+2]) * 65536) + (ord(fileData[offset+3]) * 16777216) else: return fileData[offset] + (fileData[offset+1] * 256) + (fileData[offset+2] * 65536) + (fileData[offset+3] * 16777216) #Check if this version of Python treats bytes as int or str bytesAre = type(b'a'[0]).__name__ print("PROCESSING: " + path) #Open the file if valid. try: with open(path, "rb") as f: fileData = f.read() except IOError: print("\tERROR: Failed to read file.") return False if len(fileData) < 4 or fileData[0:4] != b"VOLT": print("\tERROR: Not a VOLT file.") return False print("\tEXTRACTING: Please wait.") fileList = [] fileOffset = 0 #Skip over the header. fileOffset += 8 #Read in info on the file. totalFiles = uint32(fileOffset) fileOffset += 4 indexSize = uint32(fileOffset) fileOffset += 4 #Read the initial index to find index entry offsets in the next index. for i in range(totalFiles): #Add file to the list. fileList.append({"filename":"", "offset" BIGBExtractor.py """ BIGB Extractor - BIGB archive extractor. Copyright (C) 2012 JrMasterModelBuilder You accept full responsibility for how you use this program. This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see <http://www.gnu.org/licenses/>. """ import os import sys def extract(path): def uint32(offset): if bytesAre == "str": return ord(fileData[offset]) + (ord(fileData[offset+1]) * 256) + (ord(fileData[offset+2]) * 65536) + (ord(fileData[offset+3]) * 16777216) else: return fileData[offset] + (fileData[offset+1] * 256) + (fileData[offset+2] * 65536) + (fileData[offset+3] * 16777216) def decompress(offsetStart, length, decompLength): outputData = [] offset = offsetStart endBlock = offset + length outputOffset = 0 while True: commandByte = fileData[offset] if bytesAre == "str": commandByte = ord(commandByte) # print(offset, commandByte) offset += 1 if commandByte & 0x80: #Back reference. # print("Back reference.") byte2 = fileData[offset] if bytesAre == "str": byte2 = ord(byte2) offset += 1 #Make up for taking 2 bytes. dupeBytes = (byte2 & 0xF) + 2 #Bytes to go back. srcRel = commandByte srcRel = (srcRel << 4 | byte2 >> 4) srcRel = (srcRel ^ 0xFFF) + 2 srcOffset = outputOffset - srcRel if srcOffset < 0: print("\tERROR: Back reference before start of file.") return outputData #Append the back reference to the output. outputData.extend(outputData[srcOffset:srcOffset+dupeBytes]) #Skip forward. outputOffset += dupeBytes elif commandByte & 0x40: #RLE. # print("RLE.") #How many bytes, no point if less than 2. byteCount = (commandByte & 0x3F) + 2 repeatedByte = fileData[offset] offset += 1 #Append the byte to the output however many times. for _ in range(byteCount): outputData.append(repeatedByte) #Skip forward. outputOffset += byteCount else: #Literal. # print("Literal.") #How many bytes, at least 1. byteCount = (commandByte & 0x3F) + 1 #Append the bytes to the output. outputData.extend(fileData[offset:offset+byteCount]) #Skip forward. offset += byteCount outputOffset += byteCount if offset >= endBlock or len(outputData) >= decompLength: if offset > endBlock: print("\tERROR: Decompressing ran over.") if len(outputData) > decompLength: print("\tERROR: Too many bytes decompressed.") return outputData #Check if this version of Python treats bytes as int or str bytesAre = type(b'a'[0]).__name__ print("PROCESSING: " + path) #Open the file if valid. try: with open(path, "rb") as f: fileData = f.read() except IOError: print("\tERROR: Failed to read file.") return False if len(fileData) < 4 or fileData[0:4] != b"BIGB": print("\tERROR: Not a BIGB file.") return False print("EXTRACTING: Please wait.") fileOffset = 0 #Skip over the header. fileOffset += 4 #Get the offset of the data including the 16 byte header. dataOffset = uint32(fileOffset) + 16 fileOffset += 4 #Get the dictionary offset jump including the 12 bytes of header already read (ignore 0x01000000 verison number?). fileOffset = uint32(fileOffset) + 12 #Get data about the 2 compressed blocks. fileBlocks = [ { "decomp":uint32(fileOffset), "comp":uint32(fileOffset+8) } , { "decomp":uint32(fileOffset+4), "comp":uint32(fileOffset+12) } ] fileOffset += 16 # print(fileBlocks) buildArguments = "" #Read in the until the null byte. if bytesAre == "str": while fileData[fileOffset] != b"\x00": buildArguments += fileData[fileOffset] fileOffset += 1 else: while fileData[fileOffset] != 0x00: buildArguments += chr(fileData[fileOffset]) fileOffset += 1 #Skip to the data. fileOffset = dataOffset #Create output path from input path. outFolder = path.split(os.sep) endFolder = outFolder[-1].split(".") extension = endFolder[-1] endFolder[0:-1] endFolder = ".".join(endFolder[0:-1]) + "_" + extension outFolder[-1] = endFolder outFolder = os.sep.join(outFolder) #Create the first non-existant folder to extract to. if os.path.exists(outFolder): i = 1 while(os.path.exists(outFolder + "_" + str(i))): i += 1 outFolder = outFolder + "_" + str(i) #Make the output folder. os.makedirs(outFolder) #Create a log file to log extracted files. with open((outFolder + os.sep + "__extract.log"), "w") as log: #Write the header to the log file. p = "BUILD ARGUMENTS:\r\n\t" + buildArguments + "\r\n\r\n" print(p) log.write(p) #Loop through the list of files, saving them. for i,a in enumerate(fileBlocks): #Get the data from each file in local variables for speed. comp = a["comp"] decomp = a["decomp"] p = "BLOCK " + str(i) + ":\r\n\tOFFSET: " + str(fileOffset) + "\r\n\tCOMPRESSED: " + str(comp) + "\r\n\tDECOMPRESSED: " + str(decomp) + "\r\n" if comp == 0: p += "\tNOTE: Block does not exist.\r\n\r\n" print(p) log.write(p) continue #Write the file. with open(outFolder + os.sep + "BLOCK_" + str(i) + ".bin", "wb") as f: #Ckeck if compressed. if comp < decomp: data = decompress(fileOffset, comp, decomp) elif comp == decomp: data = fileData[fileOffset:fileOffset+comp] else: p += "\tERROR: Decompressed size less than compressed size.\r\n\r\n" leng = len(data) p += "\tOUTPUTSIZE: " + str(leng) if leng == decomp: p += " (EQUAL)" if leng < decomp: p += " (LESS)" if leng > decomp: p += " (MORE)" p += "\r\n\r\n" #If bytes are stings, compensate. if bytesAre == "str": #If a list, convert to byte array for writing. if type(data).__name__ == "list": data = bytearray(data) f.write(data) else: f.write(bytes(data)) f.close() #Log data on each file. print(p) log.write(p) #Increment the offset for the next block. fileOffset += comp print("COMPLETE: Files extracted.\r\n\r\n") return True #Detect if executable or not. fileName = sys.argv[0].split(os.sep).pop() if fileName[-3:] == ".py" or fileName[-4:] == ".pyw": runCommand = "python " + fileName else: runCommand = fileName if len(sys.argv) > 1: for i in range(1, len(sys.argv)): extract(sys.argv[i]) else: print("BIGB Extractor 1.0\n\nThis program will extract BIGB archives to an adjacent folder.\n\nCOPYRIGHT:\n\t(C) 2012 JrMasterModelBuilder\n\nLICENSE:\n\tGNU GPLv3\n\tYou accept full responsibility for how you use this program.\n\nUSEAGE:\n\t" + runCommand + " <LIST_OF_FILE_PATHS>") These scripts should work on Python versions 2.7 - 3.3 but will be fastest on 3.0 or higher. Some of the decompressed blocks have what appear to be a list of multiple WAV headers, followed by the audio data. No idea how that all works yet.1 point -
An Infomaniac Has Been Found
Quisoves Potoo reacted to Brikman McBlubber for a blog entry
He's either from the Xtreme Tower from the Island Xtreme Stunts line or from this Community Workers minifigure pack that included several IXS pieces, including an Infomaniac with black legs.1 point -
1 point
-
Bionicle: The Game Game Archive Extracting (Research and Tools)
McJobless reacted to maver1k_XVII for a topic
I recently found my old CD with the game discussed here and after stumbling upon this topic I decided to try extracting the archives. I never really used python scripts like that before (although I actually code model importing scripts in python ) but I figured out how to make them work and extracted all the .vol and .avl files. As for BIGB files that were extracted from .vol archives, I encountered a few issues. Of all the BIGB's only those with .PCM extension seem to extract properly. Is this supposed to happen or that may happen because I'm doing something wrong? Anyways, I poked around those .bin files and I was able to make a script to view them in Noesis. Here are examples of what's inside: ' alt='' class='ipsImage' > ' alt='' class='ipsImage' > ' alt='' class='ipsImage' > I was hoping that PCM stands for "PC Model" or "PC Mesh", but turns out it was "PC Map". And yeah, as you can see from the pictures even though many objects look correct there are a lot of odd triangles. I have absolutely no idea if I'll manage to make the script any better because I never really worked with maps before. I'm thinking about posting it here in it's current state, but is there any point to it considering the fact that it is not very useful at the moment? Oh, and by the way I think I found textures in .bin files and a way to identify them, but I don't know how to open them. That's what I figured out by now: 0x6C5C5400 12 bytes of unknown values offset to image (from start of the .bin) ---Format of the image header 0x00010100 - magic 3 bytes of unknown values byte - bits per pixel? int32 - null? int16 - width or height int16 - width or height int16 - always 0x0800?1 point -
Hello, I'm maver1k_XVII...
aidenpons reacted to maver1k_XVII for a topic
Yeah, LoTR definetely has more glitches than any other TT game I've played. I had to restart from a checkpoint a few times because I was unable to continue normally. The first time it hapenned when I was fighting the lake monster. I was standing near the tentacle (or on top of it, don't remember) and when the monster pulled it back I somehow flew along with it far away into the nothingness. Even when the character respawned he would immediately fly away again. But the worst thing was that it was Legolas and I needed him to shoot at the monster. The second time was when I was playing the level with the ents along with my brother and we both got stuck on the hill in front of the dam. We spent more than 10 minutes trying to get out but to no avail. Also I had a pretty strange glitch that didn't actually break the game. It was on the Black Gate level as far as I remember. When me and my brother were fighting one of the cave trolls I was doing something random and then tried to pick up one of the hobbits. It resulted into me accelerating towards the mountain and then flying upwards. I was flying for about a minute and then when I released the hobbit I just fell down. I managed to repeat this a couple of times but it stopped working after some point, probably we finally killed the troll. Too bad I didn't capture any of those glitches on a video or screenshots.1 point -
What are you listening to right now?
The Ace Railgun reacted to Fush for a topic
On a Foo Fighters binge again. https://www.youtube.com/watch?v=SBjQ9tuuTJQ https://www.youtube.com/watch?v=h_L4Rixya64 EDIT: https://www.youtube.com/watch?v=eBG7P-K-r1Y1 point -
BIONICLE RETURNING 2015
Brigs reacted to The Ace Railgun for a topic
There's not enough hype on this thread to break the hype speed barrier, let's get hype people, we can do better than this.1 point -
Five....
Quisoves Potoo reacted to aidenpons for a gallery image
From the album: Miscellaneous RANDOMNESS
1 point -
Four...Crystals you say?
Quisoves Potoo reacted to aidenpons for a gallery image
From the album: Miscellaneous RANDOMNESS
1 point -
Two... RUN AWAAAY
Quisoves Potoo reacted to aidenpons for a gallery image
From the album: Miscellaneous RANDOMNESS
1 point -
One... ONE SECOND LEFT
Quisoves Potoo reacted to aidenpons for a gallery image
From the album: Miscellaneous RANDOMNESS
1 point -
RRU Quotes 2: Reckoning
The Ace Railgun reacted to lol username for a topic
[6:37:11 PM] Will Kirkby: f**** it [6:37:13 PM] Will Kirkby: 1:37am [6:37:23 PM] Will Kirkby: lego racers 1 model corruptor coming up [6:37:26 PM] jamesster: [6:39:57 PM] Cirevam: I thought that was your GDB viewer as it already is :> [6:40:20 PM] Will Kirkby: (☞゚ヮ゚)☞ [6:40:39 PM] Cirevam: ᕕ( ᛠ)ᕗ [8:17:59 PM] Ramius Antillies: Wil, will you remember us when you become a big time dev? [8:18:24 PM] Will Kirkby: no. [8:18:29 PM] Will Kirkby: Wil won't, but Will will. [8:19:05 PM] Ramius Antillies: Instructions unclear: penned a will. [8:21:28 PM] jamesster: chat unclear, expected will's will to demand that d*** be caught in in ceiling fan1 point -
Mafia: The Game
The Ace Railgun reacted to Seaborgium for a topic
It doesn't matter. Four final votes have been given for NatcO. With two final votes left, there could be at most three votes for you or me. NatcO still has the majority of the votes. Iugula!1 point -
BIONICLE RETURNING 2015
legorr2020 reacted to STUDZ for a topic
Literal representation of BZPower right now (stay till the end. Trust me. You'd do it for a Marvel movie): https://www.youtube.com/watch?v=Ik49aju9fSk IN OTHER NEWS: Checking the search bar for "BIONICLE" now will lead to Hero Factory once more. Was this a mistake on LEGO's part, or a prank?1 point -
Mirror or Unmirror Any Track
Jack Bluebeard reacted to le717 for a topic
This tutorial assumes you already know how to >access and use modded versions of the LEGO Racers game files and have downloaded WillKirkby's >LR1 Binary File Editor. As the title suggests, it is possible to mirror or unmirror any of the game's existing tracks, even the Test track. Here's how to do that. Note: All line numbers refer are based on a clean, unmodded file. Load the Binary File Editor and open MENUDATALEGORACE.RCB Press Ctrl + F and search for the keyword "k_2C" (be sure to remove the quotes!). You should end up at line 223. This is the first instance of a mirrored track (Imperial Grand Prix), as shown in the following structure. "igp2" { k_2B // Name Index (/MENUDATA/<lang>/CIRCUIT.SRF) 5 k_29 // Folder (/GAMEDATA/<this>/) "racec0r1" k_2A // Circuit ID "c3" k_28 // Position in circuit 3 k_2C // Mirrored k_2D // Theme string "pirate1" k_2E // Mascot character "GB" } As can been seen from the comments the tool adds, the keyword k_2C controls whether or not a track should be mirrored. Since mirroring occurs dynamically (as previously discovered), we can add or remove this keyword to any track (even the Test track). This permits mods such as switching up the order mirrored tracks occur, instead of a racing all six normally then all six again in mirrored mode (just as in a clean, unmodded installation). For this tutorial, we are going to set the Test track to be mirrored and remove the mirroring on the second instance of Imperial Grand Prix (IGP). Because we are already looking at the mirrored IGP structure, we will start here. Select line 223 in its entirety (including the comment) and either cut or delete it. The structure should look as follows. "igp2" { k_2B // Name Index (/MENUDATA/<lang>/CIRCUIT.SRF) 5 k_29 // Folder (/GAMEDATA/<this>/) "racec0r1" k_2A // Circuit ID "c3" k_28 // Position in circuit 3 k_2D // Theme string "pirate1" k_2E // Mascot character "GB" } Skip down to line 446. Here, you will find the Test track structure. k_27 // Track "test" { k_2B // Name Index (/MENUDATA/<lang>/CIRCUIT.SRF) 16 k_29 // Folder (/GAMEDATA/<this>/) "test" } With your cursor at the end of line 446 ("test"), press the Enter or Return >key and type k_2C. Do not surround this in quotation marks! Type it exactly as shown. The structure should now look as so (comment added for clarity). k_27 // Track "test" { k_2B // Name Index (/MENUDATA/<lang>/CIRCUIT.SRF) 16 k_29 // Folder (/GAMEDATA/<this>/) "test" k_2C // Mirrored } Save the file and load LEGO Racers. If your edits went well, the Test track should now be mirrored and the normally mirrored version of Imperial Grand Prix should no longer be mirrored! Demonstration video coming soon!1 point -
BoB Rock Raiders Vehicles
Lind Whisperer reacted to Fush for a topic
Hey guys, been a while since you've seen this topic hasn't it? Well Sadie recently supplied me with higher quality pictures of the box of the LRRHQ, so I'm redoing these models to fix mistakes, and laugh at how wrong I was the first time. First up, the crane vehicle. Just... I was nowhere close on this one. EDIT: AAAAAAAAAH IT'S STILL A BIT OFF HOLD ON LEMME FIX THIS EDIT2: Eh, fixing the small mistake I noticed created bigger issues. I'll have to redo the whole structure, but for now this is close enough. EDIT3: I did the buildings as well. Still working on the big one but I've got the other two done. Putting my custom baseplate to good use ^_^1 point -
Umm...I think the teacher goofed here
Ayliffe reacted to The Ace Railgun for a blog entry
So I open my grade and in it I see, that it's waaaaay over 9000...I think the teacher goofed...1 point -
Multiple Minifigure Mod
phenix8fr reacted to McJobless for a topic
NOTE: While gathering data to do an OL for a custom map I am creating, I found this: MiniFigureTypes { Pilot Mini-FiguresPilot ; Driver Mini-Figuresdriver ; Engineer Mini-Figuresengineer ; Geologist Mini-Figuresgeologist ; Sailor Mini-Figuressailor } Please note that the Axle character is called "Rock Raider Driver" when you hover your mouse cursor over him, as there was no sound file for Axle ever created, and thus has been replaced with a placeholder. This mod allows you to have multiple types of Rock Raiders in your game! To use them you will need to spawn them in the map manually, as they cannot be teleported down through the menu. To spawn them in the game, you need to download Cyrem's Map Creator tool, and enter "Object Placement" mode, spawn a "Custom" object, and then enter either "Driver", "Engineer", "Geologist" or "Sailor", without quotes, and then save the Object List. If you can directly modify the OL files, that is another way of placing these characters in game. As of now, this modification is mainly installed through Cyrem's "Patchman!" application. Please download it from HERE. After installing with Patchman!, you can then download the Rock Raider team skins from HERE for a more authentic touch. 'Patchman Script Installer' Download the file located in the link below, and use it with Patchman! to install this modification. Download NOTE: PLEASE USE THE PATCHMAN! APPLICATION IN THE SAME DIRECTORY AS YOUR LEGORR.EXE FILE, OR YOU WILL GET ERRORS. For reference, the old tutorial is below in the spoilers. If you need to modify the Dependencies, or would like to install a completely new Raider Type, please open the spoiler and read below. Thank you, and enjoy!1 point
