") -- Create a randomseed, so that the math.random() function is actually random. math.randomseed(os.time()) -- End create randomseed. -- Here you can define some global variables, with which you can modify the space station. -- Define the maximal size of the space station, this is actually just for the grid, be sure that this value is enough big. -- To actually define the size of the space station you have to change the values in the section Attach all bodyparts, be sure that that values are some griddimensions (at least the sSSize-(pDim)) smaller than sSSize. sSSize=30 -- Define how many parts the space station have, this value has to be exact, so be sure to increment if you're adding a new part. sSParts=6 -- Define how many body parts the space station have, this value has to be exact. Body part means a part, which has connections at least in two directions. sSBodyParts=3 -- Define how many side parts for the left side you have. leftSideParts=1 -- Define which index your left side parts have. leftSidePartsIndex={} -- Define the maximal dimension of a single part, be sure this value is big enough, better it's too big, it's only a matter of efficiency. pDim=6 -- Define the length in x-direction of the space station which will be occupied by bodyparts. xBPLength=3 -- Define the variation of the edges of your bodyparts in the x-direction. xBPVar=1 -- Define the length in y-direction of the space station which will be occupied by bodyparts. yBPLength=3 -- Define the variation of the edges of your bodyparts in the y-direction. yBPVar=1 -- Define the length in the z-direction of the space station which will be occupied by bodyparts. zBPLength=6 -- Define the variation of the edges of your bodyparts in the z-direction. zBPVar=1 -- Define the scale of the space station. sSScale=100 -- Define the griddimension, be sure this value matches the size of a single space station part plus the size of a connection part, which means your parts must be: integer*(gridDim-connectionSize), then integer tells you how many griddimensions your part is. gridDim=2.25 -- End define global parameters. -- This creates a 4-dimensional grid, which tells us if there is a part or not, and in which direction it has connections. -- The parameters x,y,z are the axis of the space station, which iterate to sSSize, the maximal size of the space station. -- The griddimension, this word I will use later, means that the distance of a point to the next point is 2,25 in the game, so the absolute x-axis is x*2,25*sSScale, and so on for the other dimensions y and z. -- grid[x][y][z][0] contains 0 if there is no part at the position (x,y,z), otherwise 1. -- grid[x][y][z][1] contains 0 if there is no connection from (x,y,z) in x-direction, "+" if there is one in the positive x-direction, "-" if there is one in the negative x-direction, "+-" if there are in both x-directions. -- grid[x][y][z][2] contains 0 if there is no connection from (x,y,z) in y-direction, "+" if there is one in the positive y-direction, "-" if there is one in the negative y-direction, "+-" if there are in both y-directions. -- grid[x][y][z][3] contains 0 if there is no connection from (x,y,z) in z-direction, "+" if there is one in the positive z-direction, "-" if there is one in the negative z-direction, "+-" if there are in both z-directions. grid = {} for x=0,sSSize do grid[x] = {} for y=0,sSSize do grid[x][y]= {} for z=0,sSSize do grid[x][y][z]={} for i=0,3 do grid[x][y][z][i]=0 end end end end -- End create 4-dim grid. -- This creates an array which stores all the bodyparts, it's size is depending on the global values pDim and sSParts. -- The first parameter i, tells us how many parts fit into the array, so it iterates from 0 to sSParts-1, each part has his own value i. -- The second, third and fourth parameters are the relative coordinates of the part, you have to start at (0,0,0) and be sure you fill the array into the right direction. A short example: your part is 2 griddimensions long and you place it in the game, that the relative coordinate point is at (0,0,0) and the part lies in the positive z-axis, then you have to use the coordinate point (0,0,1). -- The fifth parameter is an array with size 4, at index=0, you have to set 1 if your part covers the gridpoint at (x,y,z), otherwise 0. At index=1,2,3 you define the possible connection directions (1 for x, 2 for y and 3 for z), be sure to use the notation from above (0, "+-", "+", "-"). bodyParts={} for i=0,sSParts-1 do bodyParts[i]={} for x=0,pDim do bodyParts[i][x]={} for y=0,pDim do bodyParts[i][x][y]={} for z=0,pDim do bodyParts[i][x][y][z]={} for k=0,3 do bodyParts[i][x][y][z][k]=0 end bodyParts[i][x][y][z][4]="" bodyParts[i][x][y][z][5]="" end end end end -- Here you can add a part to the space station, there are some examples here and how to describe your part is written above in the commentary. -- The part must be inserted so, that the center of reference is at position (pDim/2,pDim/2,pDim/2), this is to use negativ positions. -- At position bodyParts[i][0][0][0][4] you have to put the mesh name of your part. -- At bodyParts[i][0][0][0][5] you can rotate your part, with pitch=angle, yaw=angle or roll=angle (x,y or z). Positive angle means in screw direction. -- At bodyParts[i][0][0][0][6] you have to rotate your part so that it fits on the left side of your station, left means in the direction of the negative x-direction. This is to be done if your part is a side part. Also if the part is a sidepart at bodyParts[i][0][0][0][5] you have to rotate the part so that it fits on the right side. -- Insert the CuboidBody, which is only one griddimension and can have connections in every direction. bodyParts[0][0][0][0][4]="CuboidBody.mesh" bodyParts[0][0][0][0][5]="" bodyParts[0][pDim/2][pDim/2][pDim/2][0]=1 bodyParts[0][pDim/2][pDim/2][pDim/2][1]="+-" bodyParts[0][pDim/2][pDim/2][pDim/2][2]="+-" bodyParts[0][pDim/2][pDim/2][pDim/2][3]="+-" -- End insert CuboidBody. -- Insert the DoubleCuboidBody, which is two griddimensions long, and one wide and high and can have connections in every direction except in the middle. bodyParts[1][0][0][0][4]="DoubleCuboidBody.mesh" bodyParts[1][0][0][0][5]="pitch=-90" bodyParts[1][pDim/2][pDim/2][pDim/2][0]=1 bodyParts[1][pDim/2][pDim/2][pDim/2][1]="+-" bodyParts[1][pDim/2][pDim/2][pDim/2][2]="+-" bodyParts[1][pDim/2][pDim/2][pDim/2][3]="-" bodyParts[1][pDim/2][pDim/2][pDim/2+1][0]=1 bodyParts[1][pDim/2][pDim/2][pDim/2+1][1]="+-" bodyParts[1][pDim/2][pDim/2][pDim/2+1][2]="+-" bodyParts[1][pDim/2][pDim/2][pDim/2+1][3]="+" -- End insert DoubleCuboidBody. -- Insert the CuboidConnectionLong, which is a Bodypart indeed, it is three griddimensions long and one wide and high and can have only connections at griddimension 1 (except the side in direction of griddimension 2) and griddimension 3 (except the side in direction of griddimension 2). bodyParts[2][0][0][0][4]="CuboidConnectionBody.mesh" bodyParts[2][0][0][0][5]="pitch=-90" bodyParts[2][pDim/2][pDim/2][pDim/2][0]=1 bodyParts[2][pDim/2][pDim/2][pDim/2][1]="+-" bodyParts[2][pDim/2][pDim/2][pDim/2][2]="+-" bodyParts[2][pDim/2][pDim/2][pDim/2][3]="-" bodyParts[2][pDim/2][pDim/2][pDim/2+1][0]=1 bodyParts[2][pDim/2][pDim/2][pDim/2+1][1]=0 bodyParts[2][pDim/2][pDim/2][pDim/2+1][2]=0 bodyParts[2][pDim/2][pDim/2][pDim/2+1][3]=0 bodyParts[2][pDim/2][pDim/2][pDim/2+2][0]=1 bodyParts[2][pDim/2][pDim/2][pDim/2+2][1]="+-" bodyParts[2][pDim/2][pDim/2][pDim/2+2][2]="+-" bodyParts[2][pDim/2][pDim/2][pDim/2+2][3]="+" -- End insert CuboidConnectionLong. -- Insert the Thruster, which is one griddimension long, wide and high, it can only have a connection into the negative z-direction. -- If you're space station has no thrusters, be sure to set thrusterIndex=false, but maybe you can use this also for other parts, see section Attach thrusters to learn how thrusers are attached at your space station. thrusterIndex=3 bodyParts[thrusterIndex][0][0][0][4]="Thruster.mesh" bodyParts[thrusterIndex][0][0][0][5]="pitch=-90" bodyParts[thrusterIndex][pDim/2][pDim/2][pDim/2][0]=1 bodyParts[thrusterIndex][pDim/2][pDim/2][pDim/2][1]=0 bodyParts[thrusterIndex][pDim/2][pDim/2][pDim/2][2]=0 bodyParts[thrusterIndex][pDim/2][pDim/2][pDim/2][3]="-" --End insert the Thruster. -- Insert the Cockpit. If your space station has no cockpit, be sure to set cockpitIndex=false. -- The Cockpit is 3 x-griddimensions long, 3 y-griddimensions and 2 z-griddimensions, it can only have a connection in the positive z-direction. cockpitIndex=4 bodyParts[cockpitIndex][0][0][0][4]="SemiCircleCockpit.mesh" bodyParts[cockpitIndex][0][0][0][5]="pitch=-90 yaw=180" bodyParts[cockpitIndex][pDim/2][pDim/2][pDim/2][0]=1 bodyParts[cockpitIndex][pDim/2][pDim/2][pDim/2][3]="+" bodyParts[cockpitIndex][pDim/2-1][pDim/2][pDim/2][0]=1 bodyParts[cockpitIndex][pDim/2+1][pDim/2][pDim/2][0]=1 bodyParts[cockpitIndex][pDim/2][pDim/2-1][pDim/2][0]=1 bodyParts[cockpitIndex][pDim/2][pDim/2+1][pDim/2][0]=1 bodyParts[cockpitIndex][pDim/2-1][pDim/2-1][pDim/2][0]=1 bodyParts[cockpitIndex][pDim/2+1][pDim/2-1][pDim/2][0]=1 bodyParts[cockpitIndex][pDim/2-1][pDim/2+1][pDim/2][0]=1 bodyParts[cockpitIndex][pDim/2+1][pDim/2+1][pDim/2][0]=1 bodyParts[cockpitIndex][pDim/2][pDim/2][pDim/2-1][0]=1 bodyParts[cockpitIndex][pDim/2-1][pDim/2][pDim/2-1][0]=1 bodyParts[cockpitIndex][pDim/2+1][pDim/2][pDim/2-1][0]=1 bodyParts[cockpitIndex][pDim/2][pDim/2-1][pDim/2-1][0]=1 bodyParts[cockpitIndex][pDim/2][pDim/2+1][pDim/2-1][0]=1 bodyParts[cockpitIndex][pDim/2-1][pDim/2-1][pDim/2-1][0]=1 bodyParts[cockpitIndex][pDim/2+1][pDim/2-1][pDim/2-1][0]=1 bodyParts[cockpitIndex][pDim/2-1][pDim/2+1][pDim/2-1][0]=1 bodyParts[cockpitIndex][pDim/2+1][pDim/2+1][pDim/2-1][0]=1 -- End insert Cockpit. -- Insert the side parts. If your space station has no sideparts, be sure to set sidePartsIndex[0]=false. leftSidePartsIndex[0]=5 bodyParts[leftSidePartsIndex[0]][0][0][0][4]="SolarPanel.mesh" panelRot=math.random(0,180) bodyParts[leftSidePartsIndex[0]][0][0][0][5]="roll=90 pitch=90" bodyParts[leftSidePartsIndex[0]][pDim/2][pDim/2][pDim/2][0]=1 bodyParts[leftSidePartsIndex[0]][pDim/2][pDim/2][pDim/2+1][0]=1 bodyParts[leftSidePartsIndex[0]][pDim/2][pDim/2][pDim/2-1][0]=1 -- End insert side parts. -- Insert the connectionpart, which is used to connect all the bodyparts. -- If you're spacestation has no connectionpart, be sure to set connPartName=false. connPartName="CuboidConnection.mesh" -- End insert the connectionparts. -- End create array bodyParts. -- This is xml code, which means now we attach some parts to the MovableEntity. print("") -- Attach all bodyparts. -- This needs some explanation: My grid can't have negative indexes, but if the space station should rotate around it's own middle, i have to put the space station around the point (0,0,0), which means about half of the station has negative coordinates, to solve this problem, i do the following. I start in the middle of my grid (sSSize/2), subtract (BPLength/2) and let it run up to sSSize/2+BPLength/2, so in the grid my bodyparts will be placed around the middle of my grid, with some randomly chosen variation for each coordinate, so my station isn't a cubus. To transform that into the game i simply subtract 1/2*sSSize, so the space station is around the point (0,0,0). -- Define at which position in the x-direction you're space station will start. x=math.random(math.floor(sSSize/2)-xBPLength/2,math.floor(sSSize/2)-xBPLength/2+xBPVar) -- Define at which position in the x-direction you're space station will end. xMax=math.random(math.floor(sSSize/2)+xBPLength/2,math.floor(sSSize/2)+xBPLength/2+xBPVar) while x") -- This actualizes the grid array with the values of the array bodyParts at the position tempBodyPartIndex, which is our randomly chosen part. for i=0,pDim do for j=0,pDim do for k=0,pDim do if bodyParts[tempBodyPartIndex][i][j][k][0] == 1 then for l=0,3 do grid[x+i-pDim/2][y+j-pDim/2][z+k-pDim/2][l] = bodyParts[tempBodyPartIndex][i][j][k][l] end end end end end end counter=counter+1 end z=z+1 end y=y+1 end x=x+1 end -- End attach all bodyparts. -- Attach thrusters, if there are some. if thrusterIndex ~= false then -- To attach thrusters we start at (0,0,1) and iterate through x and y as start points and then through z, where we go as long as there are parts, at the first position where isn't a part we set our thruster. for x=0,sSSize do for y=0,sSSize do for z=1,sSSize do if grid[x][y][z-1][0] == 1 and grid[x][y][z][0] == 0 then print("") print("") print("") print("") print("") -- This actualizes the array grid. for i=0,pDim do for j=0,pDim do for k=0,pDim do if bodyParts[tempBodyPartIndex][i][j][k][0] == 1 then for l=0,3 do grid[x+i-pDim/2][y+j-pDim/2][z+k-pDim/2][l] = bodyParts[thrusterIndex][i][j][k][l] end end end end end -- This breaks out of the for z=0,sSSize loop, because we have set one thruster and for the z-axis that is all we want. break end end end end end -- End attach Thrusters. -- Attach cockpit, if there is one. function setCockpit() if grid[x][y][z][0] == 0 and grid[x][y][z+1][0] == 1 then check=1 for i=0,pDim do for j=0,pDim do for k=0,pDim do if bodyParts[cockpitIndex][i][j][k][0] == 1 and grid[x+i-pDim/2][y+j-pDim/2][z+k-pDim/2][0] == 1 then check=0 end end end end if check == 1 then print("") cockpitSet=1 for i=0,pDim do for j=0,pDim do for k=0,pDim do if bodyParts[cockpitIndex][i][j][k][0] == 1 then for l=0,3 do grid[x+i-pDim/2][y+j-pDim/2][z+k-pDim/2][l] = bodyParts[cockpitIndex][i][j][k][l] end end end end end end end end if cockpitIndex ~= false then cockpitSet=0 z=0 while z<=sSSize-1 and cockpitSet==0 do round=0 while round<=math.floor(sSSize/2)-1 and cockpitSet==0 do y=math.floor(sSSize/2)+round x=math.floor(sSSize/2)-round while x<=math.floor(sSSize/2)+round and cockpitSet==0 do setCockpit() x=x+1 end while y>=math.floor(sSSize/2)-round and cockpitSet==0 do setCockpit() y=y-1 end while x>=math.floor(sSSize/2)-round and cockpitSet==0 do setCockpit() x=x-1 end while y<=math.floor(sSSize/2)+round and cockpitSet==0 do setCockpit() y=y+1 end round=round+1 end z=z+1 end end -- End attach cockpit. -- Attach parts on the left side of the space station. function setLeftSidePart() if grid[x][y][z][0] == 0 and grid[x+1][y][z][0] == 1 and (grid[x+1][y][z][1] == "+-" or grid[x+1][y][z][1] == "-") then check=1 for i=0,pDim do for j=0,pDim do for k=0,pDim do if bodyParts[tempSidePartsIndex][i][j][k][0] == 1 and grid[x+i-pDim/2][y+j-pDim/2][z+k-pDim/2][0] == 1 then check=0 end end end end if check == 1 then print("") partSet=1 for i=0,pDim do for j=0,pDim do for k=0,pDim do if bodyParts[tempSidePartsIndex][i][j][k][0] == 1 then for l=0,3 do grid[x+i-pDim/2][y+j-pDim/2][z+k-pDim/2][l] = bodyParts[tempSidePartsIndex][i][j][k][l] end end end end end end end end if leftSidePartsIndex[0] ~= false then for sPC=1,leftSideParts do tempSidePartsIndex = leftSidePartsIndex[math.random(0,leftSideParts-1)] partSet=0 x=0 while x<=sSSize-1 and partSet==0 do round=0 while round<=math.floor(sSSize/2)-1 and partSet==0 do y=math.floor(sSSize/2)+round z=math.floor(sSSize/2)-round while z<=math.floor(sSSize/2)+round and partSet==0 do setLeftSidePart() z=z+1 end while y>=math.floor(sSSize/2)-round and partSet==0 do setLeftSidePart() y=y-1 end while z>=math.floor(sSSize/2)-round and partSet==0 do setLeftSidePart() z=z-1 end while y<=math.floor(sSSize/2)+round and partSet==0 do setLeftSidePart() y=y+1 end round=round+1 end x=x+1 end end end -- End attach side parts. -- Attach all connectionparts. -- This iterates through the whole grid array. if connPartName ~= false then for x=0,sSSize-1 do for y=0,sSSize-1 do for z=0,sSSize-1 do -- This checks whether there has to be a connection part between (x,y,z) and (x+1,y,z) or not. First it checks if there is a part at (x,y,z) and then it checks if that part can have a connection into the positive x-direction, if it can, it checks if there is a part at (x+1,y,z) and if that part can have a connection into the negative x-direction, if both can, it prints the xml code to set a connection part. if grid[x][y][z][0]==1 and ( grid[x][y][z][1]=="+" or grid[x][y][z][1]=="+-" ) and grid[x+1][y][z][0]==1 and ( grid[x+1][y][z][1]=="-" or grid[x+1][y][z][1]=="+-" ) then -- This is xml code which prints the connection part, the +gridDim*sSScale/2 is because the connection is set exactly in the middle of two gridpoints. print("") end -- The same as in the x-direction, but for the y-direction. if grid[x][y][z][0]==1 and ( grid[x][y][z][2]=="+" or grid[x][y][z][2]=="+-" ) and grid[x][y+1][z][0]==1 and ( grid[x][y+1][z][2]=="-" or grid[x][y+1][z][2]=="+-" ) then print("") end -- The same as in the x-direction, but for the z-direction. if grid[x][y][z][0]==1 and ( grid[x][y][z][3]=="+" or grid[x][y][z][3]=="+-" ) and grid[x][y][z+1][0]==1 and ( grid[x][y][z+1][3]=="-" or grid[x][y][z+1][3]=="+-" ) then print("") end end end end end -- End attach all connectionparts. -- This is xml code, which ends the attachment and the MovableEntity. print("") print("") ?>