Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: data/contentcreation/pps/MirkoKaiser/CuboidSS/Version0/SpaceStation0.0.lua @ 9399

Last change on this file since 9399 was 5300, checked in by mkaiser, 16 years ago

New build.

File size: 13.2 KB
Line 
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.
6print("<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.
138print("<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.
271print("</attached>")
272print("</MovableEntity>")
273
Note: See TracBrowser for help on using the repository browser.