1 | -- This lua script creates a totally random generated space station for the orxonox computer game! |
---|
2 | |
---|
3 | |
---|
4 | |
---|
5 | -- This prints xml code, which creates a MovableEntity, which I need to attach all the parts of the space station, if you want to move, rotate or displace the whole space station, this is the line you have to change. |
---|
6 | print("<MovableEntity scale=1 position=\"0,0,-1000\" velocity=\"0,0,0\" rotationaxis=\"0,0,1\" rotationrate=0>") |
---|
7 | |
---|
8 | |
---|
9 | |
---|
10 | -- Create a randomseed, so that the math.random() function is actually random. |
---|
11 | math.randomseed(os.time()) |
---|
12 | -- End create randomseed. |
---|
13 | |
---|
14 | |
---|
15 | |
---|
16 | -- Here you can define some global variables, with which you can modify the space station. |
---|
17 | -- Define the maximal size of the space station, this is actually just for the grid, be sure that this value is enough big. |
---|
18 | -- 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. |
---|
19 | sSSize=20 |
---|
20 | -- 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. |
---|
21 | sSParts=4 |
---|
22 | -- 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. |
---|
23 | sSBodyParts=3 |
---|
24 | -- 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. |
---|
25 | pDim=2 |
---|
26 | -- Define the scale of the space station. |
---|
27 | sSScale=100 |
---|
28 | -- 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. |
---|
29 | gridDim=2.25 |
---|
30 | -- End define global parameters. |
---|
31 | |
---|
32 | |
---|
33 | |
---|
34 | -- This creates a 4-dimensional grid, which tells us if there is a part or not, and in which direction it has connections. |
---|
35 | -- The parameters x,y,z are the axis of the space station, which iterate to sSSize, the maximal size of the space station. |
---|
36 | -- 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. |
---|
37 | -- grid[x][y][z][0] contains 0 if there is no part at the position (x,y,z), otherwise 1. |
---|
38 | -- 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. |
---|
39 | -- 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. |
---|
40 | -- 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. |
---|
41 | grid = {} |
---|
42 | for x=0,sSSize do |
---|
43 | grid[x] = {} |
---|
44 | for y=0,sSSize do |
---|
45 | grid[x][y]= {} |
---|
46 | for z=0,sSSize do |
---|
47 | grid[x][y][z]={} |
---|
48 | for i=0,3 do |
---|
49 | grid[x][y][z][i]=0 |
---|
50 | end |
---|
51 | end |
---|
52 | end |
---|
53 | end |
---|
54 | -- End create 4-dim grid. |
---|
55 | |
---|
56 | |
---|
57 | |
---|
58 | -- This creates an array which stores all the bodyparts, it's size is depending on the global values pDim and sSParts. |
---|
59 | -- 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. |
---|
60 | -- 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). |
---|
61 | -- 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, "+-", "+", "-"). |
---|
62 | bodyParts={} |
---|
63 | for i=0,sSParts-1 do |
---|
64 | bodyParts[i]={} |
---|
65 | for x=0,pDim do |
---|
66 | bodyParts[i][x]={} |
---|
67 | for y=0,pDim do |
---|
68 | bodyParts[i][x][y]={} |
---|
69 | for z=0,pDim do |
---|
70 | bodyParts[i][x][y][z]={} |
---|
71 | for k=0,3 do |
---|
72 | bodyParts[i][x][y][z][k]=0 |
---|
73 | end |
---|
74 | end |
---|
75 | end |
---|
76 | end |
---|
77 | end |
---|
78 | |
---|
79 | -- 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. |
---|
80 | -- At position bodyParts[i][x][y][z][4] you have to put the mesh name of your part. |
---|
81 | -- At bodyParts[i][x][y][z][5] you can rotate your part, with pitch=angle, yaw=angle or roll=angle (x,y or z). Positive angle means in screw direction. |
---|
82 | |
---|
83 | -- Insert the CuboidBody, which is only one griddimension and can have connections in every direction. |
---|
84 | bodyParts[0][0][0][0][4]="CuboidBody.mesh" |
---|
85 | bodyParts[0][0][0][0][5]="" |
---|
86 | bodyParts[0][0][0][0][0]=1 |
---|
87 | bodyParts[0][0][0][0][1]="+-" |
---|
88 | bodyParts[0][0][0][0][2]="+-" |
---|
89 | bodyParts[0][0][0][0][3]="+-" |
---|
90 | -- End insert CuboidBody. |
---|
91 | |
---|
92 | -- Insert the DoubleCuboidBody, which is two griddimensions long, and one wide and high and can have connections in every direction except in the middle. |
---|
93 | bodyParts[1][0][0][0][4]="DoubleCuboidBody.mesh" |
---|
94 | bodyParts[1][0][0][0][5]="pitch=-90" |
---|
95 | bodyParts[1][0][0][0][0]=1 |
---|
96 | bodyParts[1][0][0][0][1]="+-" |
---|
97 | bodyParts[1][0][0][0][2]="+-" |
---|
98 | bodyParts[1][0][0][0][3]="-" |
---|
99 | bodyParts[1][0][0][1][0]=1 |
---|
100 | bodyParts[1][0][0][1][1]="+-" |
---|
101 | bodyParts[1][0][0][1][2]="+-" |
---|
102 | bodyParts[1][0][0][1][3]="+" |
---|
103 | -- End insert DoubleCuboidBody. |
---|
104 | |
---|
105 | -- 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). |
---|
106 | bodyParts[2][0][0][0][4]="CuboidConnectionBody.mesh" |
---|
107 | bodyParts[2][0][0][0][5]="pitch=-90" |
---|
108 | bodyParts[2][0][0][0][0]=1 |
---|
109 | bodyParts[2][0][0][0][1]="+-" |
---|
110 | bodyParts[2][0][0][0][2]="+-" |
---|
111 | bodyParts[2][0][0][0][3]="-" |
---|
112 | bodyParts[2][0][0][1][0]=1 |
---|
113 | bodyParts[2][0][0][1][1]=0 |
---|
114 | bodyParts[2][0][0][1][2]=0 |
---|
115 | bodyParts[2][0][0][1][3]=0 |
---|
116 | bodyParts[2][0][0][2][0]=1 |
---|
117 | bodyParts[2][0][0][2][1]="+-" |
---|
118 | bodyParts[2][0][0][2][2]="+-" |
---|
119 | bodyParts[2][0][0][2][3]="+" |
---|
120 | -- End insert CuboidConnectionLong. |
---|
121 | |
---|
122 | -- Insert the Thruster, which is one griddimension long, wide and high, it can only have a connection into the negative z-direction. |
---|
123 | -- 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. |
---|
124 | thrusterIndex=3 |
---|
125 | bodyParts[thrusterIndex][0][0][0][4]="Thruster.mesh" |
---|
126 | bodyParts[thrusterIndex][0][0][0][5]="pitch=-90" |
---|
127 | bodyParts[thrusterIndex][0][0][0][0]=1 |
---|
128 | bodyParts[thrusterIndex][0][0][0][1]=0 |
---|
129 | bodyParts[thrusterIndex][0][0][0][2]=0 |
---|
130 | bodyParts[thrusterIndex][0][0][0][3]="-" |
---|
131 | --End insert the Thruster. |
---|
132 | |
---|
133 | -- End create array bodyParts. |
---|
134 | |
---|
135 | |
---|
136 | |
---|
137 | -- This is xml code, which means now we attach some parts to the MovableEntity. |
---|
138 | print("<attached>") |
---|
139 | |
---|
140 | |
---|
141 | |
---|
142 | -- Attach all bodyparts. |
---|
143 | -- Define at which position in the x-direction you're space station will start. |
---|
144 | x=math.random(0,1) |
---|
145 | -- Define at which position in the x-direction you're space station will end. |
---|
146 | xMax=math.random(3,4) |
---|
147 | while x<xMax do |
---|
148 | -- The same for the y- and z-direction. |
---|
149 | y=math.random(0,1) |
---|
150 | yMax=math.random(3,4) |
---|
151 | while y<yMax do |
---|
152 | yMax=math.random(3,4) |
---|
153 | z=math.random(0,1) |
---|
154 | zMax=math.random(6,8) |
---|
155 | while z<zMax do |
---|
156 | -- This loop choses a bodypart, which fits at position (x,y,z), check=1 is to start the loop, if after the fifth time the part does still not fit we terminate the loop and set no part at postition (x,y,z). |
---|
157 | check=1 |
---|
158 | counter=0 |
---|
159 | while counter <5 and check==1 do |
---|
160 | -- This choses randomly a bodyPartIndex, which is the index used for the parts in the array bodyParts. |
---|
161 | tempBodyPartIndex=math.random(0,sSBodyParts-1) |
---|
162 | -- Check whether the randomly chosen part fits at that position or not. |
---|
163 | for i=0,pDim do |
---|
164 | for j=0,pDim do |
---|
165 | for k=0,pDim do |
---|
166 | -- If the part occupies the position (i,j,k), the grid must be empty there ((x+i, y+j, z+k)==0), if not check is zero, which means that the part doesn't fit there, so we do the while loop again. |
---|
167 | if bodyParts[tempBodyPartIndex][i][j][k][0] == 1 and grid[x+i][y+j][z+k][0] == 1 then |
---|
168 | check=0 |
---|
169 | end |
---|
170 | end |
---|
171 | end |
---|
172 | end |
---|
173 | -- If check == 1, this means that the part fits there, so we put it there and break the while true loop, to go on. |
---|
174 | if check == 1 then |
---|
175 | -- This is xml code which means at position (x*gridDim*sSScale) will be the randomly chosen part. |
---|
176 | print("<Model position=\"") print(x*gridDim*sSScale) print(",") print(y*gridDim*sSScale) print(",") print(z*gridDim*sSScale) print("\" scale=") print(sSScale) print(" mesh= \"") print(bodyParts[tempBodyPartIndex][0][0][0][4]) print("\"") print(bodyParts[tempBodyPartIndex][0][0][0][5]) print(" />") |
---|
177 | -- This actualizes the grid array with the values of the array bodyParts at the position tempBodyPartIndex, which is our randomly chosen part. |
---|
178 | for i=0,pDim do |
---|
179 | for j=0,pDim do |
---|
180 | for k=0,pDim do |
---|
181 | if bodyParts[tempBodyPartIndex][i][j][k][0] == 1 then |
---|
182 | for l=0,3 do |
---|
183 | grid[x+i][y+j][z+k][l] = bodyParts[tempBodyPartIndex][i][j][k][l] |
---|
184 | end |
---|
185 | end |
---|
186 | end |
---|
187 | end |
---|
188 | end |
---|
189 | end |
---|
190 | counter=counter+1 |
---|
191 | end |
---|
192 | z=z+1 |
---|
193 | end |
---|
194 | y=y+1 |
---|
195 | end |
---|
196 | x=x+1 |
---|
197 | end |
---|
198 | -- End attach all bodyparts. |
---|
199 | |
---|
200 | |
---|
201 | |
---|
202 | -- Attach thrusters, if there are some. |
---|
203 | if thrusterIndex ~= false then |
---|
204 | -- 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. |
---|
205 | for x=0,sSSize do |
---|
206 | for y=0,sSSize do |
---|
207 | for z=1,sSSize do |
---|
208 | if grid[x][y][z-1][0] == 1 and grid[x][y][z][0] == 0 then |
---|
209 | print("<Model position=\"") print(x*gridDim*sSScale) print(",") print(y*gridDim*sSScale) print(",") print(z*gridDim*sSScale) print("\" scale=") print(sSScale) print(" mesh= \"") print(bodyParts[thrusterIndex][0][0][0][4]) print("\"") print(bodyParts[thrusterIndex][0][0][0][5]) print(" >") |
---|
210 | |
---|
211 | print("<attached>") |
---|
212 | print("<ParticleEmitter position=\"0,0,0\" scale=100 source=\"Orxonox/fire3\" />") |
---|
213 | print("</attached>") |
---|
214 | print("</Model>") |
---|
215 | |
---|
216 | -- This actualizes the array grid. |
---|
217 | for i=0,pDim do |
---|
218 | for j=0,pDim do |
---|
219 | for k=0,pDim do |
---|
220 | if bodyParts[tempBodyPartIndex][i][j][k][0] == 1 then |
---|
221 | for l=0,3 do |
---|
222 | grid[x+i][y+j][z+k][l] = bodyParts[thrusterIndex][i][j][k][l] |
---|
223 | end |
---|
224 | end |
---|
225 | end |
---|
226 | end |
---|
227 | end |
---|
228 | -- 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. |
---|
229 | break |
---|
230 | end |
---|
231 | end |
---|
232 | end |
---|
233 | end |
---|
234 | end |
---|
235 | -- End attach Thrusters. |
---|
236 | |
---|
237 | |
---|
238 | |
---|
239 | -- Attach cockpit, if there is one. |
---|
240 | |
---|
241 | -- End attach cockpit. |
---|
242 | |
---|
243 | |
---|
244 | |
---|
245 | -- Attach all connectionparts. |
---|
246 | -- This iterates through the whole grid array. |
---|
247 | for x=0,sSSize-1 do |
---|
248 | for y=0,sSSize-1 do |
---|
249 | for z=0,sSSize-1 do |
---|
250 | -- 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. |
---|
251 | 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 |
---|
252 | -- 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. |
---|
253 | print("<Model position=\"") print(x*gridDim*sSScale+gridDim*sSScale/2) print(",") print(y*gridDim*sSScale) print(",") print(z*gridDim*sSScale) print("\" scale=") print(sSScale) print(" mesh=\"CuboidConnection.mesh\" roll=90 />") |
---|
254 | end |
---|
255 | -- The same as in the x-direction, but for the y-direction. |
---|
256 | 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 |
---|
257 | print("<Model position=\"") print(x*gridDim*sSScale) print(",") print(y*gridDim*sSScale+gridDim*sSScale/2) print(",") print(z*gridDim*sSScale) print("\" scale=") print(sSScale) print(" mesh=\"CuboidConnection.mesh\" />") |
---|
258 | end |
---|
259 | -- The same as in the x-direction, but for the z-direction. |
---|
260 | 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 |
---|
261 | print("<Model position=\"") print(x*gridDim*sSScale) print(",") print(y*gridDim*sSScale) print(",") print(z*gridDim*sSScale+gridDim*sSScale/2) print("\" scale=") print(sSScale) print(" mesh=\"CuboidConnection.mesh\" pitch=90 />") |
---|
262 | end |
---|
263 | end |
---|
264 | end |
---|
265 | end |
---|
266 | -- End attach all connectionparts. |
---|
267 | |
---|
268 | |
---|
269 | |
---|
270 | -- This is xml code, which ends the attachment and the MovableEntity. |
---|
271 | print("</attached>") |
---|
272 | print("</MovableEntity>") |
---|
273 | |
---|