- Timestamp:
- Jun 3, 2012, 6:05:24 PM (12 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
code/branches/presentation2012merge/data/levels/includes/CuboidSpaceStation.lua
r7163 r9272 1 1 ---------------------------------------------------------------------------------------------------- 2 2 -- This lua script creates a totally random generated space station for the orxonox computer game!-- 3 -- (c) Wallah 2008, published under GPL licence! 3 -- (c) Wallah 2008, published under GPL licence! -- 4 4 ---------------------------------------------------------------------------------------------------- 5 5 6 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, 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 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 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. 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 12 -------------------------------------------------------------------------------------------------------------------------------------------------------------------- 13 13 14 14 -- This function creates a randomly generated space station. 15 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 -- 16 -- your space station will be generated randomly, but once you have the space station it will always be the same. 17 17 -- The argument xLength defines how large the space station will be into the x-direction. 18 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. … … 37 37 -- Create a randomseed, so that the math.random() function is actually random. 38 38 if ranSeed == 0 then 39 39 math.randomseed(os.time()) 40 40 else 41 41 math.randomseed(ranSeed) 42 42 end 43 43 -- End create randomseed. … … 52 52 sSSize=30 53 53 if xLength>=yLength and xLength>=zLength then 54 54 sSSize=xLength+20 55 55 elseif yLength>=xLength and yLength>=zLength then 56 56 sSSize=yLength+20 57 57 elseif zLength>=xLength and zLength>=yLength then 58 58 sSSize=zLength+20 59 59 end 60 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. … … 78 78 pDim=6 79 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 -- 80 -- integer*(gridDim-connectionSize), then integer tells you how many griddimensions your part is. 81 81 gridDim=2.25 82 82 -- End define global parameters. … … 89 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 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 -- 91 -- and so on for the other dimensions y and z. 92 92 -- grid[x][y][z][0] contains 0 if there is no part at the position (x,y,z), otherwise 1. 93 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 -- 94 -- "-" if there is one in the negative x-direction, "+-" if there are in both x-directions. 95 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 -- 96 -- "-" if there is one in the negative y-direction, "+-" if there are in both y-directions. 97 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 -- 98 -- "-" if there is one in the negative z-direction, "+-" if there are in both z-directions. 99 99 grid = {} 100 100 for x=-math.floor(sSSize/2),math.floor(sSSize/2) do 101 102 103 104 105 106 107 108 109 110 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 111 111 end 112 112 -- End create 4-dim grid. … … 119 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 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 -- 122 -- 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 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 -- 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, "+-", "+", "-"). 125 125 bodyParts={} 126 126 for i=1,sSParts do 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 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 154 154 end 155 155 ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- … … 193 193 194 194 -- Insert the CuboidConnectionBody, it is three griddimensions long and one wide and high and can have only connections at griddimension 1 195 -- 195 -- (except the side in direction of griddimension 2) and griddimension 3 (except the side in direction of griddimension 2). 196 196 bodyParts[3][0][0][0][4]="CuboidConnBody.mesh" 197 197 bodyParts[3][0][0][0][5]="pitch=-90" … … 373 373 --This function actualizes the grid, which I have to call always after I have added a new part to the space station. 374 374 function actualizeGrid(Index,x,y,z) 375 376 377 378 379 380 381 382 383 384 385 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 386 386 end 387 387 -- End actualizeGrid. … … 390 390 -- If the part fits there it returns 1, otherwise 0. 391 391 function checkPart(Index,x,y,z) 392 393 394 395 396 397 --which means that the part doesn't fit there.398 399 400 401 402 403 404 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 405 405 end 406 406 -- End checkPart function. … … 408 408 -- This function prints the model with tempPartIndex in the bodyParts array at position lx,ly,lz. 409 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 -- 410 -- bodyParts[tempPartIndex][0][0][0][8]. 411 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 -- 412 -- for bodyParts[tempPartIndex][0][0][0][7] side must be 3. 413 413 function printModel(lx,ly,lz,tempPartIndex,movEntity,side) 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 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 442 442 end 443 443 -- End function printModel(). … … 446 446 -- The arguments lx,ly,lz are the coordinates of the grid, where you want to set the part. 447 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 -- 449 -- 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 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 -- 452 -- 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 453 -- The argument index is the index of the part for the bodyParts array. 454 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 -- 455 -- this argument must be true. The extra MovableEntity is used to rotate the part around his own axis, or something like that. 456 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 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. 458 458 function setPart(lx,ly,lz,xAxis,yAxis,zAxis,Dir,index,printMovEnt,printSide) 459 459 460 461 462 463 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 466 467 468 469 470 471 --at the next position is a part which can have a connection into the direction from where I look.472 473 474 475 476 477 478 479 480 481 482 483 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 484 484 end 485 485 -- End function setPart(). … … 490 490 -- The argument parts is the number of different parts which you want to attach to a side. 491 491 function spiralSet(xAxis,yAxis,zAxis,Dir,index,parts,printMovEnt,printSide) 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 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 533 533 end 534 534 -- End function spiralSet(). … … 554 554 xMax=math.random(math.floor(xLength/2),math.floor(xLength/2)+xVar) 555 555 while x<xMax do 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 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 587 587 end 588 588 -- End attach all bodyparts. … … 593 593 ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 594 594 -- Attach backParts, if there are some. 595 595 spiralSet(0,0,1,1,backPartsIndex,backParts,false,1) 596 596 -- End attach backParts. 597 597 ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- … … 599 599 ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 600 600 -- Attach frontParts, if there are. 601 601 spiralSet(0,0,1,-1,frontPartsIndex,frontParts,false,1) 602 602 -- End attach frontParts. 603 603 ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- … … 605 605 ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 606 606 -- Attach parts on the left side of the space station. 607 607 spiralSet(1,0,0,-1,leftSidePartsIndex,leftSideParts,true,1) 608 608 -- End attach left side parts. 609 609 ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- … … 611 611 ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 612 612 -- Attach parts on the right side of the space station. 613 613 spiralSet(1,0,0,1,rightSidePartsIndex,rightSideParts,true,2) 614 614 -- End attach right side parts. 615 615 ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- … … 617 617 ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 618 618 -- Attach parts on top of the space station. 619 619 spiralSet(0,1,0,1,topPartsIndex,topParts,true,1) 620 620 -- End attach top parts. 621 621 ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- … … 627 627 -- This iterates through the whole grid array. 628 628 if connPartsIndex[0] ~= false then 629 630 631 632 633 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) and635 --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 637 638 639 640 641 642 643 644 645 646 647 648 649 650 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 651 651 end 652 652 -- End attach all connectionparts. … … 671 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. 672 672 function createSpaceStation() 673 673 createSpaceStationPar(0,4,1,2,1,6,1,100) 674 674 end 675 675 -- End createSpaceStaion() function.
Note: See TracChangeset
for help on using the changeset viewer.