Leaderboard
Popular Content
Showing content with the highest reputation on 08/24/2015 in all areas
-
Information Central [Modular MOC]
aidenpons and 3 others reacted to Ayliffe for a topic
Information Central [Modular MOC] As part of the great Mayhead City redevelopment, the town's old, dated information centre was completely renovated to provide a better experience for tourists wishing to find out more about the local area. The new building both manages to maintain the iconic interior of the old information centre and project the centre's design into the future with a state-of-the-art viewing platform. Look familiar? Thanks for looking!4 points -
Return To Planet U Megathread
MaelstromIslander and 3 others reacted to Redacted for a topic
Builing up the LMS explorer4 points -
Noesis script for ghg files
ProfessorBrickkeeper and one other reacted to Sluicer for a topic
I once started to work on a skript for noesis that can open ghg files from the game LEGO Star Wars The Complete Saga. I mentioned it in a comment in a blog and decided to create a new topic for it. By this, I hope that it will be easier to find for people, that did not read the blog. There are a lot of comments because it is in development / research state. So here is the unfinished script: from inc_noesis import * import noesis import rapi def registerNoesisTypes(): '''Register the plugin. Just change the Game name and extension.''' handle = noesis.register("LEGO TTGames Mesh (*pc.ghg)", ".ghg") noesis.setHandlerTypeCheck(handle, noepyCheckType) noesis.setHandlerLoadModel(handle, noepyLoadModel) return 1 def noepyCheckType(data): '''Verify that the format is supported by this plugin. Default yes''' bs = NoeBitStream(data) tmp = bs.readInt() if tmp == 0x3032554e: # NU20 #Batman return 1 bs.seek(tmp, NOESEEK_REL) tmp = bs.readInt() if tmp == 0x3032554e: # NU20 #Star Wars return 1 return 0 def noepyLoadModel(data, mdlList): bs = NoeBitStream(data) ctx = rapi.rpgCreateContext() stack = [] textures = [] materials = [] NU20 = bs.readInt() if NU20 == 0x3032554e: # NU20 #Batman print("NU20 first") else: print("NU20 @ 0x%x" % NU20) numberImg = bs.readShort() print("numberImg %d" % numberImg) bs.seek(NU20+4, NOESEEK_ABS) bs.seek(0x4, NOESEEK_REL) bs.seek(0xc, NOESEEK_REL) #HEAD fourCC = bs.readInt() chunkSize = bs.readInt() absOffsetPNTR = bs.tell() + bs.readInt() offsetGSNH = bs.readInt() absOffsetGSNH = bs.tell() + offsetGSNH #NTBL fourCC = bs.readInt() chunkSize = bs.readInt() bs.seek(chunkSize-8, NOESEEK_REL) fourCC = bs.readInt() if (fourCC == 1178948180): # TREF chunkSize = bs.readInt() bs.seek(chunkSize-8, NOESEEK_REL) fourCC = bs.readInt() if (fourCC == 810832724): # TST0 chunkSize = bs.readInt() bs.seek(chunkSize-8, NOESEEK_REL) fourCC = bs.readInt() #MS00 - Materials print("MS00 @ 0x%x" % (bs.tell()-4)) #fourCC = bs.readInt() chunkSize = bs.readInt() numberMaterials = bs.readInt() bs.seek(4, NOESEEK_REL) # 0 for i in range (0, numberMaterials): material = NoeMaterial("mat%03i"%i, "") #create a material bs.seek(0x38, NOESEEK_REL) # matId = bs.readInt() bs.seek(0x18, NOESEEK_REL) # material.setDiffuseColor(NoeVec4([bs.readFloat(), bs.readFloat(), bs.readFloat(), bs.readFloat()])) bs.seek(0x10, NOESEEK_REL) # texId = bs.readShort() if (texId != -1): material.setTexture("tex%03i"%texId) bs.seek(0x52, NOESEEK_REL) # colorRbga = bs.readBytes(4) # material.setDiffuseColor(NoeVec4([colorRbga[0]/255, colorRbga[1]/255, colorRbga[2]/255, colorRbga[3]/255])) bs.seek(0x1F8, NOESEEK_REL) # materials.append(material) bs.seek(absOffsetGSNH - 12, NOESEEK_ABS) #GSNH print("GSNH @ 0x%x" % bs.tell()) fourCC = bs.readInt() chunkSize = bs.readInt() bs.readInt() numberImages = bs.readInt() print("NumberImages %d" % numberImages) absOffsetImagesMeta = bs.tell() + bs.readInt() bs.seek(0x28, NOESEEK_REL) absOffsetMeshMeta = bs.readInt() - 4 + bs.tell() bs.seek(0x130, NOESEEK_REL) numberBones = bs.readInt() absOffsetBones = bs.readInt() - 4 + bs.tell() print("NumberBones %d" % numberBones) absOffsetBones2 = bs.readInt() - 4 + bs.tell() absOffsetBones3 = bs.readInt() - 4 + bs.tell() bs.seek(24, NOESEEK_REL) numberLayer = bs.readInt() absOffsetLayer = bs.readInt() - 4 + bs.tell() print("NumberLayer %d" % numberLayer) # goto image meta bs.seek(absOffsetImagesMeta, NOESEEK_ABS) size = 0 if NU20 == 0x3032554e: #Batman imageMetas = [] for i in range (0, numberImages): tmp = bs.readInt() stack.append(bs.tell()) bs.seek(tmp-4, NOESEEK_REL) width = bs.readInt() height = bs.readInt() bs.seek(0x10, NOESEEK_REL) bs.seek(0x2c, NOESEEK_REL) size = bs.readInt() print("Image{0}: width = {1:4d}; height = {2:4d}; size = {3:8d}".format(i, width, height, size)) imageMetas.append(ImageMeta(width, height, size)) bs.seek(stack.pop(), NOESEEK_ABS) bs.seek(absOffsetPNTR-8, NOESEEK_ABS) # goto PNTR #print("1 0x%x" % bs.tell()) fourCC = bs.readInt() #print("2 0x%x" % bs.tell()) chunkSize = bs.readInt() print("3 0x%x" % bs.tell()) bs.seek(chunkSize-4, NOESEEK_REL) # goto EndOfPNTR print("4 0x%x" % bs.tell()) for i in range (0, numberImages): data = bs.readBytes(imageMetas[i].size) texture = rapi.loadTexByHandler(data, ".dds") #NoeTexture(str(i), width, height, data, texFmt) texture.name = "tex%03i"%i textures.append(texture) #bs.seek(size, NOESEEK_REL) print("5 0x%x" % bs.tell()) else: numberRealImages = 0 for i in range (0, numberImages): tmp = bs.readInt() stack.append(bs.tell()) bs.seek(tmp-4, NOESEEK_REL) width = bs.readInt() height = bs.readInt() print("Image{0}: width = {1:4d}; height = {2:4d}".format(i, width, height)) if width != 0 and height != 0: numberRealImages += 1 bs.seek(stack.pop(), NOESEEK_ABS) bs.seek(6, NOESEEK_ABS) #goto beginOfFile + 6 for i in range (0, numberRealImages): pos = bs.tell() width = bs.readInt() height = bs.readInt() bs.readInt() bs.readInt() bs.readInt() size = bs.readInt() print("Image{0} @ {1:8x}: width = {2:4d}; height = {3:4d}".format(i, pos, width, height)) data = bs.readBytes(size) texture = rapi.loadTexByHandler(data, ".dds") #NoeTexture(str(i), width, height, data, texFmt) texture.name = "tex%03i"%i textures.append(texture) # bs.seek(size, NOESEEK_REL) #End DDS vertexLists = [] numberVertexLists = bs.readShort() for i in range (0, numberVertexLists): size = bs.readInt() vertexLists.append(bs.readBytes(size)) indexLists = [] numberIndices = bs.readShort() for i in range (0, numberIndices): size = bs.readInt() indexLists.append(bs.readBytes(size)) bs.seek(absOffsetMeshMeta, NOESEEK_ABS) bs.seek(0x14, NOESEEK_REL) numberParts = bs.readInt() print("NumberParts %d" % numberParts) bs.seek(0x08, NOESEEK_REL) partPos = bs.tell() bytesForPositions = [] stride = [] bytesForIndexBuffer = [] numIdx = [] for i in range (0, numberParts): offsetPart = bs.readInt() bs.seek(offsetPart - 4, NOESEEK_REL) bs.readInt() // 6 numberIndices = bs.readInt()+2 sizeVertex = bs.readShort() bs.seek(0x0a, NOESEEK_REL) offsetVertex = bs.readInt() numberVertex = bs.readInt() offsetIndices = bs.readInt() indexList = bs.readInt() vertexList = bs.readInt() bytesForPositions.append(vertexLists[vertexList][offsetVertex*sizeVertex:offsetVertex*sizeVertex+numberVertex*sizeVertex]) stride.append(sizeVertex) bytesForIndexBuffer.append(indexLists[indexList][offsetIndices*2:offsetIndices*2+numberIndices*2]) numIdx.append(numberIndices) partPos += 4 bs.seek(partPos, NOESEEK_ABS) bs.seek(absOffsetLayer, NOESEEK_ABS) layers = [] for i in range (0, numberLayer): layer = Layer(i) absOffsetText = bs.readInt() - 4 + bs.tell() tmp = bs.readInt() if (tmp != 0): layer.p1 = bs.tell() + tmp - 4 tmp = bs.readInt() if (tmp != 0): layer.p2 = bs.tell() + tmp - 4 tmp = bs.readInt() if (tmp != 0): layer.p3 = bs.tell() + tmp - 4 tmp = bs.readInt() if (tmp != 0): layer.p4 = bs.tell() + tmp - 4 layers.append(layer) for layer in (layers): if (layer.p1 != 0): bs.seek(layer.p1, NOESEEK_ABS) for j in range (0, numberBones): #parts = 0 tmp = bs.readInt() if (tmp != 0): stack.append(bs.tell()) bs.seek(tmp-4, NOESEEK_REL) bs.seek(8, NOESEEK_REL) bs.seek(bs.readInt() - 4, NOESEEK_REL) # --> matrix bs.seek(0xB0, NOESEEK_REL) bs.seek(bs.readInt() - 4, NOESEEK_REL) # --> number of parts parts = bs.readInt() bs.seek(bs.readInt() - 4, NOESEEK_REL) # --> materials partMaterials = [] for p in range (0, parts): partMaterials.append(bs.readInt()) partMaterials = list(reversed(partMaterials)) bs.seek(stack.pop(), NOESEEK_ABS) bonePartPair = BonePartPair(0, j, parts, partMaterials) layer.bonePartPairs.append(bonePartPair) if (layer.p2 != 0): bs.seek(layer.p2, NOESEEK_ABS) bs.seek(8, NOESEEK_REL) bs.seek(bs.readInt() - 4, NOESEEK_REL) # --> matrix bs.seek(0xB0, NOESEEK_REL) bs.seek(bs.readInt() - 4, NOESEEK_REL) # --> number of parts parts = bs.readInt() bs.seek(bs.readInt() - 4, NOESEEK_REL) # --> materials partMaterials = [] for p in range (0, parts): partMaterials.append(bs.readInt()) partMaterials = list(reversed(partMaterials)) #bs.seek(stack.pop(), NOESEEK_ABS) bonePartPair = BonePartPair(1, -1, parts, partMaterials) layer.bonePartPairs.append(bonePartPair) if (layer.p3 != 0): bs.seek(layer.p3, NOESEEK_ABS) for j in range (0, numberBones): #parts = 0 tmp = bs.readInt() if (tmp != 0): stack.append(bs.tell()) bs.seek(tmp-4, NOESEEK_REL) bs.seek(8, NOESEEK_REL) bs.seek(bs.readInt() - 4, NOESEEK_REL) # --> matrix bs.seek(0xB0, NOESEEK_REL) bs.seek(bs.readInt() - 4, NOESEEK_REL) # --> number of parts parts = bs.readInt() bs.seek(bs.readInt() - 4, NOESEEK_REL) # --> materials partMaterials = [] for p in range (0, parts): partMaterials.append(bs.readInt()) partMaterials = list(reversed(partMaterials)) bs.seek(stack.pop(), NOESEEK_ABS) bonePartPair = BonePartPair(2, j, parts, partMaterials) layer.bonePartPairs.append(bonePartPair) if (layer.p4 != 0): bs.seek(layer.p4, NOESEEK_ABS) bs.seek(8, NOESEEK_REL) bs.seek(bs.readInt() - 4, NOESEEK_REL) # --> matrix bs.seek(0xB0, NOESEEK_REL) bs.seek(bs.readInt() - 4, NOESEEK_REL) # --> number of parts parts = bs.readInt() bs.seek(bs.readInt() - 4, NOESEEK_REL) # --> materials partMaterials = [] for p in range (0, parts): partMaterials.append(bs.readInt()) partMaterials = list(reversed(partMaterials)) #bs.seek(stack.pop(), NOESEEK_ABS) bonePartPair = BonePartPair(3, -1, parts, partMaterials) layer.bonePartPairs.append(bonePartPair) bs.seek(absOffsetBones, NOESEEK_ABS) bones = [] bones0 = [] bones1 = [] bones2 = [] boneNames = [] bonePIndices = [] globalCounter = 0 for i in range (0, numberBones): boneMat = NoeMat44.fromBytes(bs.readBytes(0x40)).toMat43() bs.seek(0xc, NOESEEK_REL) boneIndex = i offsetText = bs.readInt() stack.append(bs.tell()) bs.seek(offsetText - 4, NOESEEK_REL) boneName = bs.readString() boneNames.append(boneName) bs.seek(stack.pop(), NOESEEK_ABS) bonePIndex = bs.readByte() bonePIndices.append(bonePIndex) bs.readByte() bs.readByte() bs.readByte() bs.readInt() bs.readInt() bs.readInt() print(boneName + ": " + repr(i) + "-->" + repr(bonePIndex)) bones0.append(boneMat) for i in range (0, numberBones): boneMat = NoeMat44.fromBytes(bs.readBytes(0x40)).toMat43() #print(boneMat) if (bonePIndices[i] != -1): boneMat = boneMat.__mul__(bones1[bonePIndices[i]]) bone = NoeBone(i, boneNames[i], boneMat, None, bonePIndices[i]) bones.append(bone) bones1.append(boneMat) for i in range (0, numberBones): boneMat = NoeMat44.fromBytes(bs.readBytes(0x40)).toMat43() #print(boneMat) bones2.append(boneMat) globalCounter = 0 for layer in (layers): print("Layer: %d" % layer.layer) if layer.bonePartPairs: for bonePartPair in (layer.bonePartPairs): print(" Pointer: " + repr(bonePartPair.pointer) + " Bone: " + repr(bonePartPair.bone) + " Parts: " + repr(bonePartPair.parts)) if (bonePartPair.bone != -1): rapi.rpgSetTransform(bones1[bonePartPair.bone]) else: rapi.rpgSetTransform(None) print(bonePartPair.partMaterials) for j in range (0, bonePartPair.parts): rapi.rpgBindPositionBuffer(bytesForPositions[globalCounter], noesis.RPGEODATA_FLOAT, stride[globalCounter], 0) if (stride[globalCounter] == 44): rapi.rpgBindUV1BufferOfs(bytesForPositions[globalCounter], noesis.RPGEODATA_FLOAT, stride[globalCounter], 28) #rapi.rpgBindBoneIndexBufferOfs(bytesForPositions[globalCounter], noesis.RPGEODATA_UBYTE, stride[globalCounter], 40, 4) #rapi.rpgBindBoneWeightBufferOfs(bytesForPositions[globalCounter], noesis.RPGEODATA_UBYTE, stride[globalCounter], 36, 4) if (stride[globalCounter] == 40): rapi.rpgBindUV1BufferOfs(bytesForPositions[globalCounter], noesis.RPGEODATA_FLOAT, stride[globalCounter], 24) #rapi.rpgBindBoneIndexBufferOfs(bytesForPositions[globalCounter], noesis.RPGEODATA_UBYTE, stride[globalCounter], 36, 4) #rapi.rpgBindBoneWeightBufferOfs(bytesForPositions[globalCounter], noesis.RPGEODATA_UBYTE, stride[globalCounter], 32, 4) if (stride[globalCounter] == 36): if NU20 == 0x3032554e: #Batman rapi.rpgBindUV1BufferOfs(bytesForPositions[globalCounter], noesis.RPGEODATA_FLOAT, stride[globalCounter], 20) else: rapi.rpgBindUV1BufferOfs(bytesForPositions[globalCounter], noesis.RPGEODATA_FLOAT, stride[globalCounter], 28) if (stride[globalCounter] == 32): rapi.rpgBindUV1BufferOfs(bytesForPositions[globalCounter], noesis.RPGEODATA_FLOAT, stride[globalCounter], 24) if (stride[globalCounter] == 28): if NU20 == 0x3032554e: #Batman rapi.rpgBindUV1BufferOfs(bytesForPositions[globalCounter], noesis.RPGEODATA_FLOAT, stride[globalCounter], 20) rapi.rpgSetMaterial("mat%03i"%bonePartPair.partMaterials[j]) rapi.rpgCommitTriangles(bytesForIndexBuffer[globalCounter], noesis.RPGEODATA_SHORT, numIdx[globalCounter], noesis.RPGEO_TRIANGLE_STRIP, 1) globalCounter = globalCounter + 1 rapi.rpgClearBufferBinds() mdl = rapi.rpgConstructModel() mdl.setModelMaterials(NoeModelMaterials(textures, materials)) mdl.setBones(bones) mdlList.append(mdl) #important, don't forget to put your loaded model in the mdlList return 1 class Layer(object): def __init__(self, layer): self.layer = layer self.bonePartPairs = [] self.p1 = 0 self.p2 = 0 self.p3 = 0 self.p4 = 0 class BonePartPair(object): def __init__(self, pointer, bone, parts, partMaterials): self.pointer = pointer self.bone = bone self.parts = parts self.partMaterials = partMaterials class ImageMeta(object): def __init__(self, width, height, size): self.width = width self.height = height self.size = size You can create results like this with the script: I have updated the script, so that materials will also be respected now. You can get models like in the following posts.2 points -
2 points
-
The first beta version is done! I was delayed a bit by family visiting, but that's all finished now, so I can get back to work. This is a big update. The UI is reorganized to be less of a pain. Hidden caverns, slimy slugs, paths, rubble, and erosion are fully implemented and editable. Lots of internal changes too, mainly to the way it stores the loaded map internally; this is what one Tile looks like now, if you're curious: The heightmap editor is still the same, and still kinda crap. Oh well, the main use is still to import images from GIMP or something similar. Ok then, manual limits removed . Maps can be up to 255x255 now (the limit for 1 byte, though I can go higher if I change them to 2-byte integers instead... if you really want me to ). For fun: how many FPS do you get on a 255x255 map? A few things I'm not sure about yet, so opinions are welcome: do the visuals for hidden caverns (red warning stripes) and erosion paths (yellow->red square) look decent enough? And I'm also not sure I like the new Terrain Type list in the sidebar (small squares in 1 column); should I go back to the old one, with 2 columns of big squares and the terrain names on the squares? I'll do bugfixes and stuff this week, but before I add the rest of the editors (like Objects/Buildings) I need to take a "break". I have my C++/Godot main project to work on and a lot of studying to do for RL, not really things I can put below GeoTool in the priority list. Changelog for Beta 1: Downloads: GeoTool Beta 1 Source code - GPL v2.02 points
-
RRU Quotes 2: Reckoning
lol username and one other reacted to Alcom Isst for a topic
[9:17:58 PM] Hugh Wotmeigh: Things are getting interesting [9:18:00 PM] Hugh Wotmeigh: For my internship [9:18:05 PM] Alcom Isst: [9:18:11 PM] Hugh Wotmeigh: Next term they're going to set me up with some Digital Media students [9:18:16 PM] Alcom Isst: [9:18:20 PM] Hugh Wotmeigh: They're going to produce assets, story, gameplay ideas etc [9:18:23 PM] Alcom Isst: [9:18:27 PM] Hugh Wotmeigh: And I'm going to build an AR game. [9:18:28 PM] Alcom Isst: [9:18:43 PM] Hugh Wotmeigh: I have to do 12 hours a week in order to fufil the requirements [9:18:46 PM] Alcom Isst: [9:19:37 PM] Hugh Wotmeigh: Maybe it's Outlook breaking under the stress of displaying text messages, but did you seriously just post 5 ": O"s? [9:20:10 PM] Hugh Wotmeigh: Good news. [9:20:18 PM] Hugh Wotmeigh: My teacher likes the game so far. [9:20:22 PM] Alcom Isst: [9:20:30 PM] Hugh Wotmeigh: Now we have to playtest two forks relating to win/lose conditions. [9:20:38 PM] Jamesster: [9:20:43 PM] Hugh Wotmeigh: And then from there it's all about shoveling content and adding polish in. [9:20:54 PM] Hugh Wotmeigh: You two f****ers... [9:20:58 PM] Jamesster: [9:21:34 PM] Hugh Wotmeigh: I really dunno if I should be angry, laughing, surprised, annoyed or just hungry for blood. [9:22:46 PM] Fish: [9:23:07 PM] Jamesster: [9:23:09 PM] Alcom Isst: [9:24:06 PM] Hugh Wotmeigh: The Howler Monkies have checked in.2 points -
RRU Quotes 2: Reckoning
aidenpons and one other reacted to Brigs for a topic
[3:48:05 AM] /)¢(\ Krysto: better to put a positive spin on the matter [3:49:25 AM] bartvbl: what does particle physics have to do with this?2 points -
RRU Quotes 2: Reckoning
aidenpons and one other reacted to Alcom Isst for a topic
[8:43:18 PM] Fish: So here's how this is gonna work. Alcom with provide the mech. Krysto will provide the fursuit, which Will will wear. Jamesster will stand around doing nothing but somehow attact throes of LU fanboys that swarm to his scent, which McJobless with beat into submission with the mech that Alcom provided [8:43:34 PM] Fish: that is your group project [8:43:38 PM] Fish: get crackin [8:43:39 PM] Alcom Isst: I thought it was a pony suit. [8:43:56 PM] Will Kirkby: I'm okay with wearing "women's" clothes. I draw the line at fursuits, sorry. [8:43:58 PM] Jamesster: I switch to chrome for two seconds [8:44:36 PM] Fish: Well someone's gotta wear it, and you seemed the only one capable [8:44:45 PM] Jamesster: um [8:44:47 PM] Will Kirkby: but I'm not a furry. [8:44:55 PM] Fish: Fine [8:44:57 PM] Will Kirkby: and I'm 90% that some of the other users here are. [8:45:02 PM] Fish: we put the fursuit on the mech [8:45:10 PM] Will Kirkby: now THAT is a good idea [8:45:14 PM] Jamesster: fnaf [8:45:16 PM] Hugh Wotmeigh: It'll make for a nice tinder. [8:45:22 PM] Hugh Wotmeigh: It's cold today. [8:45:30 PM] Jamesster: you guys literally just said you wanted to make fnaf2 points -
Modding Tt LEGO Games: Beginner's Preparation/Setup
Aryanne_v2 reacted to McJobless for a topic
Hey guys! If you've come to this tutorial, I assume you're probably new to the world of LEGO Video Game modding! If you've already gone ahead and extracted your files, this tutorial isn't going to be much use to you. However, if you're new to the modding process, this is a great place to start! This tutorial will work on any Traveller's Tales game starting with the original LEGO Star Wars. This also includes their non-LEGO games such as Transformers. NOTE: I am not responsible for any game updates which break your files. If you want to be completely safe, make sure you turn off "Automatic Updates" in Steam, or simply don't install game updates for retail games, and always keep backups of your game saves and data files. If you have any problems with tutorial, please let me know in the replies below. Modding TT Games - The Basic Setup Step 0: Finding Your Game Files In order to mod the game, we need to be able to access its files. If you've never dived into a program's folder before, here's the quick method to doing so. Head to your game's directory. If you bought the game through Steam, you can; Right-Click the game in the list of games. Press "Properties". Press the "Local Files" tab. Press the "Browse Local Files..." button. What if you bought the game at retail and it's an older title that doesn't unlock on Steam? That's all groovy too. Click on the Start menu, and go to the "All Programs" button. Find the shortcut for your LEGO game that you'd like to mod. If you can't see it, use the search bar. Right-Click on the program's shortcut, and press the "Properties" button. Under the Shortcut Tab (which should be automatically open), press the "Open File Location" button. Either way, these should both take you to the game's folder. Step 1: Backing Up Files This step isn't strictly necessary, but it's good practice that will save you having to reinstall the game if you accidentally break something. To backup, simply select the files you want to keep a safe copy of, right-click, select "copy" and paste them into a new folder somewhere else on your hard-drive. If you've got lots of space, you may want to backup the entire game folder, leaving a clean one you can use to compare your modded copy with. However, most of us aren't overflowing with space, so if you want to only backup specific files, you need to look for any file that has the name "GAME.DAT" or "GAME<number>.DAT", where <number> is replaced with a number between 0 and 9. These .dat files are specially packed archives that hold the game's data that we want to modify. The number of .dat files will vary between game, but they will always start with "GAME". Note: Just pointed out by Kirk?by; if for any reason you need to get your .dat files back and you are running a Steam copy of the game, you can simply press the "Verify Integrity Of Game Cache" button you can see in the same window as the "Browse Local Files..." button above. This will re-download any missing files (including the .dat files), but may overwrite any files you've changed. Step 2: Creating a Working Directory If you're a confident modder, you could go ahead and extract all the files directly to the game's directory, but we're going to use a Working Directory; an intermediary folder that holds our files so we can comb through them and make sure there isn't any problems before we put them in our game folder. On your Desktop, create a new folder called "LEGOFUN" or something similar. The name doesn't matter, just so long as it's recognisable. We will delete this folder when we're done. Inside your LEGOFUN folder, create two new folders. Call the first one "QuickBMS", and the second one "GAME". Step 3: Downloading The Tools In order to open up those .dat files, we need some special tools. Firstly, head into this link and download the file in the first link at the top that says "QuickBMS generic files extractor and reimporter". QuickBMS is a little tool that allows people to create scripts that tell it how to extract different kinds of files. When the file downloads, it should be a RAR file. Open this up with WinRAR or any similar archive program, and drag the contents of this archive into your Desktop/LEGOFUN/QuickBMS folder. We're not done yet! Open up this link, and in your Web Browser go to the "File" meny and press "Save As...". Make sure you select "All Files" in the "Save as type" dropdown box! Save the file as "ttgames.bms" in your Desktop/LEGOFUN/QuickBMS folder. Note: If for whatever reason the file doesn't exist, simply go to that first link (the same page that has the QuickBMS program) and scroll down until you find the "Ttgames . Traveller's Tales games DAT files extractor" script. Click on the blue link and save this as "ttgames.bms" as I suggest above. Step 4: Using QuickBMS To Extract The Game Files It's finally time. Are you ready?! In your Desktop/LEGOFUN/QuickBMS folder, run the program called "quickbms_4gb_files.exe". The name hints at the fact that this version of QuickBMS should be used for larger files, such as what you'll find in any TT Game. The first prompt will ask for a script or plugin, which we have already downloaded. Double click ttgames.bms in your Desktop/LEGOFUN/QuickBMS folder. The second prompt will ask you for the files you wish to extract from. Go to your LEGO game directory that we found in Step 0, and select all of the .dat files. You can select multiple files by dragging over all the files, or holding either Ctrl or Shift as you click on them individually! The third and final prompt will ask you to select a folder to save the files to. Open up your Desktop/LEGOFUN/GAME folder and press the "Save" button. Let the program extract the files. Get a drink and sit back! If you encounter any errors, don't be afraid to post here and ask. Step 5: Cleaning Up We're almost ready now. Before we can put our extracted files ready for modding into the game directory, we need to delete/backup a few files first. In your Desktop/LEGOFUN/GAME directory... You want to look for any file that says ".pak" or ".fpk", and put these files into the same directory as your backed up .DAT files. QuickBMS (should) automatically extract the contents of these packages as well, making them redundant. If for some reason the game crashes or things don't appear to load normally, restore them to where you found them. In your LEGO game directory... You need to delete all of the .dat files that you've backed up/extracted. You should make a backup and then delete all of your save files, as your mods may change the data that they store and could make them incompatible if you ever want to return your game to a normal state. Note: Be aware that you will need Administrator privileges to overwrite/create/delete files in your Program Files/Program Files(x86) folder in versions of Windows beyond Windows XP. There are a number of ways to disable this security feature for your LEGO Game's data folder permanently, but they are beyond the scope of this tutorial. Google searching for "Windows Folder Ownership" should give you plenty of results. Step 6: Moving The Files We're finally there. Carefully follow the next set of steps, and then you can start modding your TT game; Go to your Desktop/LEGOFUN/GAME folder and press "Ctrl" and "A" to select all. If this doesn't work, simply drag and highlight everything in the folder. Either press "Ctrl" and "C" or right-click and press "Copy". Go to your LEGO game directory. Make sure you are in the same folder as the .exe file that you use to run the game! Press "Ctrl" and "V" or right-click and press "Paste". All of the extracted files and folders should now be inside your LEGO game directory. Celebrate because you made it! Step 7: Your First Mod In order to show-off that we made it this far, let's make a quick change to the game. In your LEGO Game directory, go into the stuff/text folder and open up "english_credits.txt" in Notepad, Notepad++ or any plain text editor. Change the following text: heading "DEVELOPED BY" credit "Tt Fusion" to heading "MODDED BY" credit "<enter your name here>" Save the file and run the game. Enter the Options menu, and press Credits. Congratulations, you've just entered the world of modding! Note: If you find that you cannot save the files and that you get an error about "Read-Only" access or similar, this is because of the problem mention above regarding Administrator access. You will either need to run your text editing program as an Administrator (right-click and select "Run as administrator") or save the file to another location and then manually copy it over to the game directory.1 point -
LEGO Worlds News And Discussion
Quisoves Potoo reacted to lol username for a topic
Update 2 is live! http://steamcommunity.com/app/332310/discussions/0/521643320368489091/1 point -
RRU Quotes 2: Reckoning
Quisoves Potoo reacted to ProfessorBrickkeeper for a topic
[11:19:49 PM] jamesster: http://i.imgur.com/7WjmYpN.png1 point -
Petition to undo the forum "upgrade"
Rock Monster reacted to Cyrem for a topic
Le717 and Cire have pretty much answered in my behalf. There are many reasons why the upgrade was done, most are technical. It's not possible to revert. I haven't removed the upgrade notice because it's quite obvious the forum isn't done and there's still plenty of work I've got to do on it. And yes I have not had much time in my life these past months, it's been a bit of a roller coaster.1 point -
Petition to undo the forum "upgrade"
Rock Monster reacted to Cirevam for a topic
Grapheme/Cyrem did it, not me. He owns and manages the forum. I just help. Pretty much everything le said is correct. One of the big problems is that there is a lack of IP.Board v4 plugins available, and some that exist are stupidly expensive for what little they do. Grapheme has been writing some on his own but he doesn't have a lot of time. There is a lot of life stuff he's dealing with right now, some bad things and some REALLY good things, but it's not my place to say. PM him if you have questions or complaints. I can't do anything about how the forum looks. I don't have the knowledge and I don't own it.1 point -
Petition to undo the forum "upgrade"
Rock Monster reacted to Jimbob for a topic
Would you mind explaining this stance? Name one thing that is actually better after the update. I'm serious, cause I can't think of anything. No problem. For starters, visually I think the forum is much improved. The colour scheme is similar to its predecessor while the tones and shapes are more... Snazzy, or modern, for lack of a better word. The WYSIWYG editor may prove frustrating for some but I've found it useful for writing tutorials and posts, even if it does bug out the first time I post anything. Plus I think the iconography on the forum, in particular in the editor's toolbar, looks nicer. As le717 said the site is also a lot more compatible with browsers, looking the same on a mobile site as on a PC. The chatbox allows for simultaneous public and private chat, and we also get to edit images' details after uploading them which I don't think we could do before. That's just some of the benefits off the top of my head. The only real downside I can think of is simply that the new editor can be a little difficult to use. Granted, the editor is a rather fundamental part of the forum software, but many have managed to overcome its shortcomings. No no, don't say that. There's no reason to remove this topic, I think it has generated some decent discussion into the matter even if the response hasn't been quite what you'd expected.1 point -
Petition to undo the forum "upgrade"
Rock Monster reacted to le717 for a topic
Needs a third option: No. In all truthfulness, the update was not a simple flip of a switch. IP.Board is a licensed software that Cyrem (not Cirevam) buys. He has put money into this new IP.Board version. Cyrem can't just "restore" the old software because it's tied to a license key, and that key is now only valid for this version. Installing this required server configuration and updates, meaning more money and time spent performing the changes. Also, we are technically using a beta version of the software. IPS v4 is now out (released in June), but we upgraded in April, so things in the final version are presumably better, but Cyrem has yet to update to the release (and I doubt that is a simple "extract zip contents and upload"). Further, did I mention that Cyrem works at IPS, has school work to do, lives a life, and manages RRU, not to mention probably other stuff? He's been flooded with work/school for a while and has not had the time to get RRU back up to speed. We didn't even have an RRU anniversary party this year. That kinda says how busy he has been. Also, a good amount of the forum features (IDK how much) he wrote himself, and he would have to rewrite them for IPS v4. I'm sure Cyrem had reasons to upgrade RRU to a beta software. I doubt it was something he did lightly, considering this is an active forum. However, he had good faith that we could endure through the bugs and issues until he could update to the final build. We've done it so far. Yes, I'm annoyed by them too at times (the post editor is unusable on mobile), but hopefully soon Cyrem will find enough time to bless us with an updated version of IPS. Until then, we just have to patiently deal with the issues. The damage is done. Broken topics won't fully be restored by reverting the software, even if it could be easily reverted. If you see a broken topic and the author is active, good grief, why not ask them to fix it? They might not even know it is broken. We can get through this. So far, we've done just fine.1 point -
Problem in W10
Rock Monster reacted to Jimbob for a topic
While I could get a later version of Rock Raiders that runs without needing a disc, it'd be great if I can get my current studded-case version to work. I've installed WinXP (using the official 30-day trial version) on VirtualBox and successfully installed LRR. Upon running it the loading screen appears (whoopee, progress!) after which I get the following error: "Please insert the correct CD-ROM, select OK and restart the application" The game wasn't installed through my disc drive, rather I created a digital copy of the disc and mounted it on Daemontools which was installed on the WinXP machine. I've tried change the disc drive letter from F to D and I still get the same error... Is there some way to get the game to recognise the disc drive? If I can get this particular method working then I'll happily write up a detailed tutorial on it. EDIT: IT WORKS! Time to write a tutorial.1 point -
RRU Quotes 2: Reckoning
aidenpons reacted to emily for a topic
[8:37:56 PM] Will Kirkby: Mata Nui is the great spirit and simultaneously a giant robot. [8:38:04 PM] Will Kirkby: Literally a god mixed with a machine [8:38:13 PM] Will Kirkby: Deus × Machina.1 point -
A ghost in the machine
fun reacted to Phoenyx for a blog entry
___ _/ "\ ( \ ~/__ \ \__) / \ / _\ `"""""``1 point
