Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: code/branches/lod/data/levels/includes/CuboidSpaceStation.lua @ 6608

Last change on this file since 6608 was 5781, checked in by rgrieder, 15 years ago

Reverted trunk again. We might want to find a way to delete these revisions again (x3n's changes are still available as diff in the commit mails).

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