Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: data/media/levels/CuboidSpaceStation.lua @ 5346

Last change on this file since 5346 was 5341, checked in by dafrick, 16 years ago

Improved spacestations randomness.

File size: 36.3 KB
Line 
1----------------------------------------------------------------------------------------------------
2-- This lua script creates a totally random generated space station for the orxonox computer game!--
3-- (c) Wallah 2008, published under GPL licence!                                                                                                  --
4----------------------------------------------------------------------------------------------------
5
6--------------------------------------------------------------------------------------------------------------------------------------------------------------------
7-- IMPORTANT: If you need more parameters, do the following: copy the actual function (just the headline and the end statement) to the end of the file,                   --
8-- like I did with createSpaceStation() and let that function call the new function where you can modify the parameters. For all parameters which the old function--
9-- doesn't have you just give the standard default values, which I have defined. This is to make sure, that anyone else who uses the old function can still use it--
10-- the same way he/she always did. If you want a function with less parameters, just create a new one at the end of the file and call this function with some     --
11-- default values. REMEMBER: Function overloading is not possible, be sure to call your function differently from others already existing ones.                                   --
12--------------------------------------------------------------------------------------------------------------------------------------------------------------------
13
14-- This function creates a randomly generated space station.
15-- The first argument ranSeed, must be 0, or a positive Integer, if it is 0 your space station is always chosen randomly, if you give an integer,
16--      your space station will be generated randomly, but once you have the space station it will always be the same.
17-- The argument xLength defines how large the space station will be into the x-direction.
18-- The argument xVar defines how much the space station will vary at the ends in x-direction, this is so that the station is no cube.
19-- The argument yLength is the same as xLength, but for the y-direction.
20-- The argument yVar is the same as xLength, but for the y-direction.
21-- The argument zLength is the same as xLength, but for the z-direction.
22-- The argument zVar is the same as xLength, but for the z-direction.
23-- The argument sSScale scales the station proportionally in all directions.
24function createSpaceStationPar(ranSeed, xLength, xVar, yLength, yVar, zLength, zVar, sSScale)
25
26
27
28----------------------------------------------------------------------------------------------------------------------------------------------------------------------------
29-- This prints xml code, which creates a MovableEntity, which I need to attach all the parts of the space station.
30print("<MovableEntity scale=1 position=\"0,0,0\" >")
31-- End create Movable Entity.
32----------------------------------------------------------------------------------------------------------------------------------------------------------------------------
33
34
35
36----------------------------------------------------------------------------------------------------------------------------------------------------------------------------
37-- Create a randomseed, so that the math.random() function is actually random.
38if ranSeed == 0 then
39        math.randomseed(os.time())
40        math.random()
41else
42        math.randomseed(ranSeed)
43        math.random()
44end
45-- End create randomseed.
46----------------------------------------------------------------------------------------------------------------------------------------------------------------------------
47
48
49
50----------------------------------------------------------------------------------------------------------------------------------------------------------------------------
51-- Here you can define some global variables, with which you can modify the space station.
52
53-- Define the maximal size of the grid, this value is based on how large you define the area of bodyparts plus 20 gridpoints for attachparts.
54sSSize=30
55if xLength>=yLength and xLength>=zLength then
56        sSSize=xLength+20
57elseif yLength>=xLength and yLength>=zLength then
58        sSSize=yLength+20
59elseif zLength>=xLength and zLength>=yLength then
60        sSSize=zLength+20
61end
62-- Define how many parts the space station has, this value has to be exact, so be sure to increment it if you're adding a new part.
63sSParts=9
64-- Define how many body parts the space station has, this value has to be exact. Body part means a part, which has connections at least in two directions.
65sSBodyParts=3
66-- Define how many frontParts you have.
67frontParts=1
68-- Define how many backParts you have.
69backParts=1
70-- Define how many side parts for the left side you have.
71leftSideParts=1
72-- Define how many side parts for the right side you have.
73rightSideParts=1
74-- Define how many top parts you have.
75topParts=2
76-- Define how many connection parts you have.
77connParts=1
78-- 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.
79-- It should be at least 1 bigger than the biggest part needs, because I guarantee that it works with odd numbers, to do so I use the math.floor function.
80pDim=6
81-- 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:
82--      integer*(gridDim-connectionSize), then integer tells you how many griddimensions your part is.
83gridDim=2.25
84-- End define global parameters.
85----------------------------------------------------------------------------------------------------------------------------------------------------------------------------
86
87
88
89----------------------------------------------------------------------------------------------------------------------------------------------------------------------------
90-- This creates a 4-dimensional grid, which tells us if there is a part or not, and in which direction it has connections.
91-- The parameters x,y,z are the axis of the space station, which iterate to sSSize, the maximal size of the space station.
92-- The griddimension, this word I will use later, means that the distance of a point to the next point is gridDim in the game, so the absolute x-axis is x*gridDim*sSScale,
93--      and so on for the other dimensions y and z.
94-- grid[x][y][z][0] contains 0 if there is no part at the position (x,y,z), otherwise 1.
95-- 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,
96--      "-" if there is one in the negative x-direction, "+-" if there are in both x-directions.
97-- 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,
98--      "-" if there is one in the negative y-direction, "+-" if there are in both y-directions.
99-- 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,
100--      "-" if there is one in the negative z-direction, "+-" if there are in both z-directions.
101grid = {}
102for x=-math.floor(sSSize/2),math.floor(sSSize/2) do
103        grid[x] = {}
104        for y=-math.floor(sSSize/2),math.floor(sSSize/2) do
105                grid[x][y]= {}
106                for z=-math.floor(sSSize/2),math.floor(sSSize/2) do
107                        grid[x][y][z]={}
108                        for i=0,3 do
109                                grid[x][y][z][i]=0
110                        end
111                end
112        end
113end
114-- End create 4-dim grid.
115----------------------------------------------------------------------------------------------------------------------------------------------------------------------------
116
117
118
119----------------------------------------------------------------------------------------------------------------------------------------------------------------------------
120-- This creates an array which stores all the parts, it's size is depending on the global values pDim and sSParts.
121-- The first parameter i, tells us how many parts fit into the array, so it iterates from 1 to sSParts, each part has his own value i.
122-- 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.
123--      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
124--      z-axis, then you have to use the coordinate point (0,0,1).
125-- 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.
126--      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, "+-", "+", "-").
127bodyParts={}
128for i=1,sSParts do
129        bodyParts[i]={}
130        for x=-math.floor(pDim/2),math.floor(pDim/2) do
131                bodyParts[i][x]={}
132                for y=-math.floor(pDim/2),math.floor(pDim/2) do
133                        bodyParts[i][x][y]={}
134                        for z=-math.floor(pDim/2),math.floor(pDim/2) do
135                                bodyParts[i][x][y][z]={}
136                                for k=0,3 do
137                                        bodyParts[i][x][y][z][k]=0
138                                end
139                        end
140                end
141        end
142        -- This contains the name of the mesh file.
143        bodyParts[i][0][0][0][4]=""
144        -- This contains the first possible rotation of your part, pitch=... yaw=... roll=... .
145        bodyParts[i][0][0][0][5]=""
146        -- This contains the second possible rotation of your part, pitch=... yaw=... roll=... .
147        bodyParts[i][0][0][0][6]=""
148        -- This contains the third possible rotation of your part, pitch=... yaw=... roll=... .
149        bodyParts[i][0][0][0][7]=""
150        -- Contains the movement rotation, rotationaxis=... rotationrate=... .
151        bodyParts[i][0][0][0][8]=""
152        -- Contains the attachment, if your part has an attachment, e.g. <ParticleEmitter .../>.
153        bodyParts[i][0][0][0][9]=""
154        -- Contains how many of this part you want to attach to your space station.
155        bodyParts[i][0][0][0][10]=1
156end
157----------------------------------------------------------------------------------------------------------------------------------------------------------------------------
158
159
160
161----------------------------------------------------------------------------------------------------------------------------------------------------------------------------
162-- 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.
163
164-- The part must be inserted so, that the center of reference is at position (0,0,0).
165-- At position bodyParts[i][0][0][0][4] you have to put the mesh name of your part.
166-- 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.
167-- At bodyParts[i][0][0][0][6] you have another possibility to rotate your part in a different way, e.g. for left and right side parts.
168-- At bodyParts[i][0][0][0][7] you have a third possibility to rotate your part, e.g. connection parts must be rotated into 3 different ways.
169-- At bodyParts[i][0][0][0][8] you can rotate your part around his own axis, with rotationaxis="x,y,z" rotationrate=number.
170-- At bodyParts[i][0][0][0][9] you can attach something to your model, e.g. <ParticleEmitter .../>.
171
172-- Insert the CuboidBody, which is only one griddimension and can have connections in every direction.
173bodyParts[1][0][0][0][4]="CuboidBody.mesh"
174
175bodyParts[1][0][0][0][0]=1
176bodyParts[1][0][0][0][1]="+-"
177bodyParts[1][0][0][0][2]="+-"
178bodyParts[1][0][0][0][3]="+-"
179-- End insert CuboidBody.
180
181-- Insert the DoubleCuboidBody, which is two griddimensions long, and one wide and high and can have connections in every direction except in the middle.
182bodyParts[2][0][0][0][4]="DoubleCuboidBody.mesh"
183bodyParts[2][0][0][0][5]="pitch=-90"
184
185bodyParts[2][0][0][0][0]=1
186bodyParts[2][0][0][0][1]="+-"
187bodyParts[2][0][0][0][2]="+-"
188bodyParts[2][0][0][0][3]="-"
189
190bodyParts[2][0][0][1][0]=1
191bodyParts[2][0][0][1][1]="+-"
192bodyParts[2][0][0][1][2]="+-"
193bodyParts[2][0][0][1][3]="+"
194-- End insert DoubleCuboidBody.
195
196-- Insert the CuboidConnectionBody, it is three griddimensions long and one wide and high and can have only connections at griddimension 1
197--      (except the side in direction of griddimension 2) and griddimension 3 (except the side in direction of griddimension 2).
198bodyParts[3][0][0][0][4]="CuboidConnectionBody.mesh"
199bodyParts[3][0][0][0][5]="pitch=-90"
200
201bodyParts[3][0][0][0][0]=1
202bodyParts[3][0][0][0][1]="+-"
203bodyParts[3][0][0][0][2]="+-"
204bodyParts[3][0][0][0][3]="-"
205
206bodyParts[3][0][0][1][0]=1
207
208bodyParts[3][0][0][2][0]=1
209bodyParts[3][0][0][2][1]="+-"
210bodyParts[3][0][0][2][2]="+-"
211bodyParts[3][0][0][2][3]="+"
212-- End insert CuboidConnectionBody.
213----------------------------------------------------------------------------------------------------------------------------------------------------------------------------
214
215----------------------------------------------------------------------------------------------------------------------------------------------------------------------------
216-- Insert the back parts.
217-- If you're space station has no back parts, be sure to set backPartsIndex[0]=false.
218backPartsIndex={}
219backPartsIndex[0]=""
220
221-- Insert the thruster, which is one griddimension long, wide and high, it can only have a connection into the negative z-direction.
222backPartsIndex[1]=4
223bodyParts[backPartsIndex[1]][0][0][0][4]="Thruster.mesh"
224bodyParts[backPartsIndex[1]][0][0][0][5]="pitch=-90"
225bodyParts[backPartsIndex[1]][0][0][0][9]="<ParticleEmitter position=\"0,0,0\" source=\"Orxonox/fire3\" />"
226bodyParts[backPartsIndex[1]][0][0][0][10]=5
227
228bodyParts[backPartsIndex[1]][0][0][0][0]=1
229bodyParts[backPartsIndex[1]][0][0][0][3]="-"
230-- End insert the thruster.
231
232-- End insert the back parts.
233----------------------------------------------------------------------------------------------------------------------------------------------------------------------------
234
235----------------------------------------------------------------------------------------------------------------------------------------------------------------------------
236-- Insert the front parts. If your space station has no front parts, be sure to set frontPartsIndex[0]=false.
237frontPartsIndex={}
238frontPartsIndex[0]=""
239
240-- The SemiCircleCockpit is 3 x-griddimensions long, 3 y-griddimensions and 2 z-griddimensions, it can only have a connection in the positive z-direction.
241frontPartsIndex[1]=5
242bodyParts[frontPartsIndex[1]][0][0][0][4]="SemiCircleCockpit.mesh"
243bodyParts[frontPartsIndex[1]][0][0][0][5]="pitch=-90 yaw=180"
244bodyParts[frontPartsIndex[1]][0][0][0][9]="<BlinkingBillboard position=\"0,-0.1,2.2\" material=\"Examples/Flare\" colour=\"1.0, 1.0, 1.0\" amplitude=0.01 frequency=0.5 quadratic=1 /> <BlinkingBillboard position=\"0.5,-0.1,2.2\" material=\"Examples/Flare\" colour=\"1.0, 1.0, 1.0\" amplitude=0.01 frequency=0.5 phase=120 quadratic=1 /> <BlinkingBillboard position=\"-0.5,-0.1,2.2\" material=\"Examples/Flare\" colour=\"1.0, 1.0, 1.0\" amplitude=0.01 frequency=0.5 phase=240 quadratic=1 />"
245
246bodyParts[frontPartsIndex[1]][0][0][0][0]=1
247bodyParts[frontPartsIndex[1]][0][0][0][3]="+"
248
249bodyParts[frontPartsIndex[1]][-1][0][0][0]=1
250bodyParts[frontPartsIndex[1]][1][0][0][0]=1
251bodyParts[frontPartsIndex[1]][0][-1][0][0]=1
252bodyParts[frontPartsIndex[1]][0][1][0][0]=1
253bodyParts[frontPartsIndex[1]][-1][-1][0][0]=1
254bodyParts[frontPartsIndex[1]][1][-1][0][0]=1
255bodyParts[frontPartsIndex[1]][-1][1][0][0]=1
256bodyParts[frontPartsIndex[1]][1][1][0][0]=1
257bodyParts[frontPartsIndex[1]][0][0][-1][0]=1
258bodyParts[frontPartsIndex[1]][-1][0][-1][0]=1
259bodyParts[frontPartsIndex[1]][1][0][-1][0]=1
260bodyParts[frontPartsIndex[1]][0][-1][-1][0]=1
261bodyParts[frontPartsIndex[1]][0][1][-1][0]=1
262bodyParts[frontPartsIndex[1]][-1][-1][-1][0]=1
263bodyParts[frontPartsIndex[1]][1][-1][-1][0]=1
264bodyParts[frontPartsIndex[1]][-1][1][-1][0]=1
265bodyParts[frontPartsIndex[1]][1][1][-1][0]=1
266-- End insert SemiCircleCockpit.
267
268-- End insert the front parts.
269----------------------------------------------------------------------------------------------------------------------------------------------------------------------------
270
271----------------------------------------------------------------------------------------------------------------------------------------------------------------------------
272-- Insert the side parts.
273-- If your space station has no left side parts, be sure to set leftsidePartsIndex[0]=false.
274-- If your space station has no right side parts, be sure to set rightsidePartsIndex[0]=false.
275leftSidePartsIndex={}
276leftSidePartsIndex[0]=""
277rightSidePartsIndex={}
278rightSidePartsIndex[0]=""
279
280-- Insert the solar panel, which i wanna use as left and right side part.
281leftSidePartsIndex[1]=6
282rightSidePartsIndex[1]=leftSidePartsIndex[1]
283bodyParts[leftSidePartsIndex[1]][0][0][0][4]="SolarPanel.mesh"
284bodyParts[leftSidePartsIndex[1]][0][0][0][5]="roll=90 pitch="..math.random(0,180)
285bodyParts[rightSidePartsIndex[1]][0][0][0][6]="roll=-90 pitch="..math.random(0,180)
286bodyParts[rightSidePartsIndex[1]][0][0][0][8]="rotationaxis=\"1,0,0\" rotationrate=2"
287bodyParts[leftSidePartsIndex[1]][0][0][0][0]=1
288bodyParts[leftSidePartsIndex[1]][0][0][1][0]=1
289bodyParts[leftSidePartsIndex[1]][0][0][-1][0]=1
290bodyParts[leftSidePartsIndex[1]][0][1][0][0]=1
291bodyParts[leftSidePartsIndex[1]][0][1][1][0]=1
292bodyParts[leftSidePartsIndex[1]][0][1][-1][0]=1
293bodyParts[leftSidePartsIndex[1]][0][-1][0][0]=1
294bodyParts[leftSidePartsIndex[1]][0][-1][1][0]=1
295bodyParts[leftSidePartsIndex[1]][0][-1][-1][0]=1
296-- End insert solar panel.
297
298-- End insert side parts.
299----------------------------------------------------------------------------------------------------------------------------------------------------------------------------
300
301----------------------------------------------------------------------------------------------------------------------------------------------------------------------------
302-- Insert the top parts.
303-- If you have no top parts, be sure to set topPartsIndex[0]=false
304topPartsIndex={}
305topPartsIndex[0]=""
306
307-- Insert the CuboidLandingZone.
308topPartsIndex[1]=7
309bodyParts[topPartsIndex[1]][0][0][0][4]="CuboidLandingZone.mesh"
310bodyParts[topPartsIndex[1]][0][0][0][5]="pitch=-90"
311
312bodyParts[topPartsIndex[1]][0][0][0][0]=1
313bodyParts[topPartsIndex[1]][0][0][0][2]="+-"
314bodyParts[topPartsIndex[1]][1][0][0][0]=1
315bodyParts[topPartsIndex[1]][-1][0][0][0]=1
316bodyParts[topPartsIndex[1]][0][0][1][0]=1
317bodyParts[topPartsIndex[1]][1][0][1][0]=1
318bodyParts[topPartsIndex[1]][-1][0][1][0]=1
319bodyParts[topPartsIndex[1]][0][0][2][0]=1
320bodyParts[topPartsIndex[1]][1][0][2][0]=1
321bodyParts[topPartsIndex[1]][-1][0][2][0]=1
322bodyParts[topPartsIndex[1]][0][0][3][0]=1
323bodyParts[topPartsIndex[1]][1][0][3][0]=1
324bodyParts[topPartsIndex[1]][-1][0][3][0]=1
325-- End insert the CuboidLandingZone.
326
327-- Insert the SatelliteDish.
328topPartsIndex[2]=8
329bodyParts[topPartsIndex[2]][0][0][0][4]="SatelliteDish.mesh"
330bodyParts[topPartsIndex[2]][0][0][0][5]="pitch=-90"
331bodyParts[topPartsIndex[2]][0][0][0][8]="rotationaxis=\"0,1,0\" rotationrate=5"
332
333bodyParts[topPartsIndex[2]][0][0][0][0]=1
334bodyParts[topPartsIndex[2]][0][0][1][0]=1
335bodyParts[topPartsIndex[2]][0][0][-1][0]=1
336bodyParts[topPartsIndex[2]][1][0][0][0]=1
337bodyParts[topPartsIndex[2]][1][0][1][0]=1
338bodyParts[topPartsIndex[2]][1][0][-1][0]=1
339bodyParts[topPartsIndex[2]][-1][0][0][0]=1
340bodyParts[topPartsIndex[2]][-1][0][1][0]=1
341bodyParts[topPartsIndex[2]][-1][0][-1][0]=1
342-- End insert the SatelliteDish.
343
344-- End insert the top parts.
345----------------------------------------------------------------------------------------------------------------------------------------------------------------------------
346
347----------------------------------------------------------------------------------------------------------------------------------------------------------------------------
348-- Insert the connection parts, which are used to connect all the bodyparts.
349-- If you're spacestation has no connection parts, be sure to set connPartsIndex[0]=false.
350connPartsIndex={}
351connPartsIndex[0]=""
352
353-- Insert the CuboidConnection.
354connPartsIndex[1]=9
355bodyParts[connPartsIndex[1]][0][0][0][4]="CuboidConnection.mesh"
356bodyParts[connPartsIndex[1]][0][0][0][5]="roll=90"
357bodyParts[connPartsIndex[1]][0][0][0][6]=""
358bodyParts[connPartsIndex[1]][0][0][0][7]="pitch=90"
359-- End insert the CuboidConnection.
360
361-- End insert the connection parts.
362
363-- End create array bodyParts.
364----------------------------------------------------------------------------------------------------------------------------------------------------------------------------
365
366
367
368----------------------------------------------------------------------------------------------------------------------------------------------------------------------------
369-- Here I define some functions which I will use later.
370
371--This function actualizes the grid, which I have to call always after I have added a new part to the space station.
372function actualizeGrid(Index,x,y,z)
373        for i=math.floor(-pDim/2)+1,math.floor(pDim/2) do
374                for j=math.floor(-pDim/2)+1,math.floor(pDim/2) do
375                        for k=math.floor(-pDim/2)+1,math.floor(pDim/2) do
376                                if bodyParts[Index][i][j][k][0] == 1 then
377                                        for l=0,3 do
378                                                grid[x+i][y+j][z+k][l] = bodyParts[Index][i][j][k][l]
379                                        end
380                                end
381                        end
382                end
383        end
384end
385-- End actualizeGrid.
386
387-- This function checks wheter a given parts fits at that position or not.
388-- If the part fits there it returns 1, otherwise 0.
389function checkPart(Index,x,y,z)
390        check=1
391        for i=math.floor(-pDim/2)+1,math.floor(pDim/2) do
392                for j=math.floor(-pDim/2)+1,math.floor(pDim/2) do
393                        for k=math.floor(-pDim/2)+1,math.floor(pDim/2) do
394                                -- 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,
395                                --      which means that the part doesn't fit there.
396                                if bodyParts[Index][i][j][k][0] == 1 and grid[x+i][y+j][z+k][0] == 1 then
397                                        check=0
398                                end
399                        end
400                end
401        end
402        return check
403end
404-- End checkPart function.
405
406-- This function prints the model with tempPartIndex in the bodyParts array at position lx,ly,lz.
407-- If you need to rotate the model around his own axis, then you have to set movEntity true and define the details of the rotation in
408--      bodyParts[tempPartIndex][0][0][0][8].
409-- If your model needs to be rotated like bodyParts[tempPartIndex][0][0][0][5], then side must be 1, for bodyParts[tempPartIndex][0][0][0][6] side must be 2,
410--      for bodyParts[tempPartIndex][0][0][0][7] side must be 3.
411function printModel(lx,ly,lz,tempPartIndex,movEntity,side)
412        if movEntity == true then
413                print("<MovableEntity scale=1 position=\"") print(lx*gridDim*sSScale) print(",") print(ly*gridDim*sSScale) print(",") print(lz*gridDim*sSScale) print("\" ")
414                print(bodyParts[tempPartIndex][0][0][0][8]) print(">")
415                print("<attached>")
416                lx=0 ly=0 lz=0
417        end
418
419        print("<Model position=\"") print(lx*gridDim*sSScale) print(",") print(ly*gridDim*sSScale) print(",") print(lz*gridDim*sSScale)
420        print("\" scale=") print(sSScale) print(" mesh= \"") print(bodyParts[tempPartIndex][0][0][0][4]) print("\"")
421
422                if side == 1 then
423                        print(bodyParts[tempPartIndex][0][0][0][5]) print(">")
424                elseif side == 2 then
425                        print(bodyParts[tempPartIndex][0][0][0][6]) print(">")
426                elseif side == 3 then
427                        print(bodyParts[tempPartIndex][0][0][0][7]) print(">")
428                end
429
430                print("<attached>")
431                        print(bodyParts[tempPartIndex][0][0][0][9])
432                print("</attached>")
433
434        print("</Model>")
435
436        if movEntity == true then
437                print("</attached>")
438                print("</MovableEntity>")
439        end
440end
441-- End function printModel().
442
443-- This function sets a part to a side of the space station.
444-- The arguments lx,ly,lz are the coordinates of the grid, where you want to set the part.
445-- The arguments xAxis,yAxis,zAxis can be 0 or 1, but only one argument out of the three can be 1. This means two of them must always be zero. You have to set xAxis to one,
446--      if your part is attached to a side, which faces into the x-direction (negative or positive, this is later specified with Dir), that means the x-Axis is a normal vector
447--      of the side to which you want to attach the part. The same for yAxis and zAxis.
448-- The argument Dir must be 1 if your side, where you want to attach the part, faces into the positive direction, -1 if the side faces into the negative direction. The side
449--      faces into the positive direction means, that the side of the side where the part will be attached is directed into the direction of the positive direction of the
450--      corresponding axis.
451-- The argument index is the index of the part for the bodyParts array.
452-- The argument printMovEnt must be false if your part doesn't need to be attached to an extra MovableEntity. If your part must be attached to an extra MovableEntity
453--      this argument must be true. The extra MovableEntity is used to rotate the part around his own axis, or something like that.
454-- The argument printSide is like the argument side of the printModel() function. It defines how your part will be rotated. Read the commentary there.
455-- The function returns 0 if the part couldn't be set, because it did not fit there or there was no side to attach the part. It returns 1 if the part is successfully set.
456function setPart(lx,ly,lz,xAxis,yAxis,zAxis,Dir,index,printMovEnt,printSide)
457
458        partSet=0
459        -- For the bodyParts array I use 1 as x-, 2 as y- and 3 as z-Axis for the definition in which directions a part can have connections.
460        coord=1*xAxis+2*yAxis+3*zAxis
461        -- If I try to attach the part from the positive direction to the side of the space station, the part of the station (where I want to attach the new part) must have
462        --      a connection into the positive direction. Otherwise I look from the negative side and so the part of the station must have a connection into the negative direction.
463        if Dir==1 then
464                conn="+"
465        elseif Dir==-1 then
466                conn="-"
467        end
468        -- I look from the direction defined through Dir, and here I check, whether I have reached a side of the space station, which means at position lx,ly,lz is nothing and
469        --      at the next position is a part which can have a connection into the direction from where I look.
470        if grid[lx][ly][lz][0] == 0 and grid[lx+(-1*xAxis*Dir)][ly+(-1*yAxis*Dir)][lz+(-1*zAxis*Dir)][0] == 1 and (grid[lx+(-1*xAxis*Dir)][ly+(-1*yAxis*Dir)][lz+(-1*zAxis*Dir)][coord]=="+-" or grid[lx+(-1*xAxis*Dir)][ly+(-1*yAxis*Dir)][lz+(-1*zAxis*Dir)][coord]==conn) then
471                -- This checks whether the part fits at that position or not.
472                check=checkPart(index,lx,ly,lz)
473                if check == 1 then
474                        -- This prints the part.
475                        printModel(lx,ly,lz,index,printMovEnt,printSide)
476                        partSet=1
477                        -- This actualizes the grid array with the values of the array bodyParts at the position index.
478                        actualizeGrid(index,lx,ly,lz)
479                end
480        end
481        return partSet
482end
483-- End function setPart().
484
485-- This function sets a part to a side of the space station. It is called spiralSet, because it starts in the middle of the side and goes out in a form of a spiral.
486-- The argument xAxis,yAxis,zAxis,Dir,printMovEnt,printSide are the same as the arguments from the setPart() function, please read the commentary there.
487-- The argument index here must be an array, where you define the index for your part for the bodyParts array. The first used index is 1 and goes up to parts.
488-- The argument parts is the number of different parts which you want to attach to a side.
489function spiralSet(xAxis,yAxis,zAxis,Dir,index,parts,printMovEnt,printSide)
490        if index[0] ~= false then
491                -- The array vector contains the actual position where you try to set the part. vector[0],vector[1] and vector[3] contains the x,y,z-coordinate.
492                vector={}
493                -- This must be done, because there are different sides from where I try to attach a part.
494                coord1=1*yAxis+2*zAxis
495                coord2=(coord1+1)%3
496                coord3=(coord2+1)%3
497
498                for pc=1,parts do
499                        tempIndex = index[pc]
500                        for eachPart=1,bodyParts[tempIndex][0][0][0][10] do
501                                partSet=0
502                                vector[coord1]=math.floor(Dir*sSSize/2)-2*Dir
503                                while vector[coord1]~=math.floor(-1*Dir*sSSize/2)+2*Dir and partSet==0 do
504                                        round=0
505                                        while round<=math.floor(sSSize/2)-2 and partSet==0 do
506                                                vector[coord2]=round
507                                                vector[coord3]=-round
508                                                while vector[coord3]<=round and partSet==0 do
509                                                        partSet=setPart(vector[0],vector[1],vector[2],xAxis,yAxis,zAxis,Dir,tempIndex,printMovEnt,printSide)
510                                                        vector[coord3]=vector[coord3]+1
511                                                end
512                                                while vector[coord2]>=-round and partSet==0 do
513                                                        partSet=setPart(vector[0],vector[1],vector[2],xAxis,yAxis,zAxis,Dir,tempIndex,printMovEnt,printSide)
514                                                        vector[coord2]=vector[coord2]-1
515                                                end
516                                                while vector[coord3]>-round and partSet==0 do
517                                                        partSet=setPart(vector[0],vector[1],vector[2],xAxis,yAxis,zAxis,Dir,tempIndex,printMovEnt,printSide)
518                                                        vector[coord3]=vector[coord3]-1
519                                                end
520                                                while vector[coord2]<=round and partSet==0 do
521                                                        partSet=setPart(vector[0],vector[1],vector[2],xAxis,yAxis,zAxis,Dir,tempIndex,printMovEnt,printSide)
522                                                        vector[coord2]=vector[coord2]+1
523                                                end
524                                                round=round+1
525                                        end
526                                        vector[coord1]=vector[coord1]-Dir
527                                end
528                        end
529                end
530        end
531end
532-- End function spiralSet().
533
534-- End define functions.
535----------------------------------------------------------------------------------------------------------------------------------------------------------------------------
536
537
538
539----------------------------------------------------------------------------------------------------------------------------------------------------------------------------
540-- This is xml code, which means now we attach some parts to the MovableEntity.
541print("<attached>")
542-- End attach to the MovableEntity.
543----------------------------------------------------------------------------------------------------------------------------------------------------------------------------
544
545
546
547----------------------------------------------------------------------------------------------------------------------------------------------------------------------------
548-- Attach all bodyparts.
549-- Define at which position in the x-direction you're space station will start.
550x=math.random(-math.floor(xLength/2),-math.floor(xLength/2)+xVar)
551-- Define at which position in the x-direction you're space station will end.
552xMax=math.random(math.floor(xLength/2),math.floor(xLength/2)+xVar)
553while x<xMax do
554        -- The same for the y- and z-direction.
555        y=math.random(-math.floor(yLength/2),-math.floor(yLength/2)+yVar)
556        yMax=math.random(math.floor(yLength/2),math.floor(yLength/2)+yVar)
557        while y<yMax do
558                yMax=math.random(math.floor(yLength/2),math.floor(yLength/2)+yVar)
559                z=math.random(-math.floor(zLength/2),-math.floor(zLength/2)+zVar)
560                zMax=math.random(math.floor(zLength/2),math.floor(zLength/2)+zVar)
561                while z<zMax do
562                        -- This loop choses a bodypart, which fits at position (x,y,z).
563                        -- If after the fifth time the part does still not fit we terminate the loop and set no part at postition (x,y,z).
564                        partSet=0
565                        counter=0
566                        while counter<5 and partSet==0 do
567                                -- This choses randomly a bodyPartIndex, which is the index used for the parts in the array bodyParts.
568                                tempBodyPartIndex=math.random(1,sSBodyParts)
569                                check=checkPart(tempBodyPartIndex,x,y,z)
570                                -- If check == 1, this means that the part fits there, so we put it there and break the while true loop, to go on.
571                                if check == 1 then
572                                        -- This prints the chosen part at position (x*gridDim*sSScale,y*gridDim*sSScale,z*gridDim*sSScale).
573                                        printModel(x,y,z,tempBodyPartIndex,false,1)
574                                        -- This actualizes the grid array with the values of the array bodyParts at the position tempBodyPartIndex, which is our randomly chosen part.
575                                        actualizeGrid(tempBodyPartIndex,x,y,z)
576                                        partSet=1
577                                end
578                                counter=counter+1
579                        end
580                        z=z+1
581                end
582                y=y+1
583        end
584        x=x+1
585end
586-- End attach all bodyparts.
587----------------------------------------------------------------------------------------------------------------------------------------------------------------------------
588
589
590
591----------------------------------------------------------------------------------------------------------------------------------------------------------------------------
592-- Attach backParts, if there are some.
593        spiralSet(0,0,1,1,backPartsIndex,backParts,false,1)
594-- End attach backParts.
595----------------------------------------------------------------------------------------------------------------------------------------------------------------------------
596
597----------------------------------------------------------------------------------------------------------------------------------------------------------------------------
598-- Attach frontParts, if there are.
599        spiralSet(0,0,1,-1,frontPartsIndex,frontParts,false,1)
600-- End attach frontParts.
601----------------------------------------------------------------------------------------------------------------------------------------------------------------------------
602
603----------------------------------------------------------------------------------------------------------------------------------------------------------------------------
604-- Attach parts on the left side of the space station.
605        spiralSet(1,0,0,-1,leftSidePartsIndex,leftSideParts,true,1)
606-- End attach left side parts.
607----------------------------------------------------------------------------------------------------------------------------------------------------------------------------
608
609----------------------------------------------------------------------------------------------------------------------------------------------------------------------------
610-- Attach parts on the right side of the space station.
611        spiralSet(1,0,0,1,rightSidePartsIndex,rightSideParts,true,2)
612-- End attach right side parts.
613----------------------------------------------------------------------------------------------------------------------------------------------------------------------------
614
615----------------------------------------------------------------------------------------------------------------------------------------------------------------------------
616-- Attach parts on top of the space station.
617        spiralSet(0,1,0,1,topPartsIndex,topParts,true,1)
618-- End attach top parts.
619----------------------------------------------------------------------------------------------------------------------------------------------------------------------------
620
621
622
623----------------------------------------------------------------------------------------------------------------------------------------------------------------------------
624-- Attach all connectionparts.
625-- This iterates through the whole grid array.
626if connPartsIndex[0] ~= false then
627        for x=math.floor(-sSSize/2)+2,math.floor(sSSize/2)-2 do
628                for y=math.floor(-sSSize/2)+2,math.floor(sSSize/2)-2 do
629                        for z=math.floor(-sSSize/2)+2,math.floor(sSSize/2)-2 do
630                                tempConnPartIndex=connPartsIndex[math.random(1,connParts)]
631                                -- 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
632                                --      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
633                                --      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.
634                                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
635                                        -- This prints the connection part, the +1/2 is because the connection is set exactly in the middle of two gridpoints.
636                                        printModel(x+1/2,y,z,tempConnPartIndex,false,1)
637                                end
638                                -- The same as in the x-direction, but for the y-direction.
639                                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
640                                        printModel(x,y+1/2,z,tempConnPartIndex,false,2)
641                                end
642                                -- The same as in the x-direction, but for the z-direction.
643                                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
644                                        printModel(x,y,z+1/2,tempConnPartIndex,false,3)
645                                end
646                        end
647                end
648        end
649end
650-- End attach all connectionparts.
651----------------------------------------------------------------------------------------------------------------------------------------------------------------------------
652
653
654
655----------------------------------------------------------------------------------------------------------------------------------------------------------------------------
656-- This is xml code, which ends the attachment and the MovableEntity.
657print("</attached>")
658print("</MovableEntity>")
659-- End ends attachment and MovableEntity.
660----------------------------------------------------------------------------------------------------------------------------------------------------------------------------
661
662
663
664end
665-- End createSpaceStationPar() function.
666
667
668
669-- This function is for the lazy guys, which do not care how the space station looks like, so I use some good standard values.
670function createSpaceStation()
671        createSpaceStationPar(0,4,1,2,1,6,1,100)
672end
673-- End createSpaceStaion() function.
674
675
676
Note: See TracBrowser for help on using the repository browser.