home *** CD-ROM | disk | FTP | other *** search
/ Chip 2011 November / CHIP_2011_11.iso / Programy / Inne / Gry / Enigma / Enigma-1.01-w7.exe / data / levels / lib / libpuzzle.xml < prev    next >
Extensible Markup Language  |  2009-12-13  |  19KB  |  775 lines

  1. <?xml version="1.0" encoding="UTF-8" standalone="no" ?>
  2. <el:level xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://enigma-game.org/schema/level/1 level.xsd" xmlns:el="http://enigma-game.org/schema/level/1">
  3.   <el:protected>
  4.     <el:info el:type="library">
  5.       <el:identity el:title="" el:id="lib/libpuzzle"/>
  6.       <el:version el:score="1" el:release="1" el:revision="0" el:status="released"/>
  7.       <el:author  el:name="Raoul Bourquin" el:email="" el:homepage=""/>
  8.       <el:copyright>Copyright ┬⌐ 2005, 2006 Raoul Bourquin</el:copyright>
  9.       <el:license el:type="GPL v2.0 or above" el:open="true"/>
  10.       <el:compatibility el:enigma="0.92">
  11.       </el:compatibility>
  12.       <el:modes el:easy="false" el:single="false" el:network="false"/>
  13.       <el:comments>
  14.         <el:code>Lua 5.1 and XML converted by Leveladministrators</el:code>
  15.       </el:comments>
  16.       <el:score el:easy="-" el:difficult="-"/>
  17.     </el:info>
  18.     <el:luamain><![CDATA[
  19. -- libpuzzle, a library for enigma
  20. -- Version 0.97
  21.  
  22. -- This is a lua-library to make it really easy to set up random puzzles.
  23.  
  24. -- Use this lib this as showed:
  25. -- Save the .lua in /PFAD/TO/ENIGMA/data/levels/lib/libpuzzle.lua
  26. -- On the beginning of your level, just include:
  27. -- Require("levels/lib/libpuzzle.lua")
  28. -- Now you can use every function here, but usually you would just call "puzzle(YOUR OPTIONS)"
  29. -- But you can influence the puzzle() by setting the values in the WORLD section manually to different values.
  30.  
  31. -----------------------------------
  32. -- User's Reference with Example --
  33. -----------------------------------
  34. --Example to generate an shuffled Ring with 8 Stones (the red ones) at the Position 4/5:
  35. --puzzle({{1,1,1},{1,0,1},{1,1,1}},2,4,"red","yes")
  36.  
  37. -- in [], this are the values from the example above.
  38.  
  39. --original_atrix: this is the abstract definition of the puzzle:
  40. --###
  41. --# # this ring has the matrix: {{1,1,1},{1,0,1},{1,1,1}}
  42. --###
  43. --The format is: {row1, row2, row3, ...}
  44. --where row1 is:{stone1, stone2, ston3, ...}
  45. --Pseudo Pieces:
  46. --If you want to set a pseudo piece, you set a "2" in the matrix. This piece will not appear in the level. But it will
  47. --influence the others in this way, that where a pseusdo piece is, the "normal" pieces around it will have connections.
  48. --This is the way to generate open clusters.
  49. --[{{1,1,1},{1,0,1},{1,1,1}}]
  50.  
  51. --xtopleftcorner/ytopleftcorner or xcorner/ycorner: the absolute coordinates of the top left corner of your puzzle-matrix.
  52. --It's not required that this is really a stone. 
  53. --[2 and 4]
  54.  
  55. --puzzle_kind: this string describes if we use the blue or the red puzzle stones
  56. --the values are: "blue" for blue and "red" for red ! 
  57. --["red"]
  58.  
  59. --shuffle: this string says, if the puzzle must be shuffled or not.
  60. --the values are "yes" and "no".
  61. --["yes"]
  62.  
  63. --now, the syntax for a puzzle is:
  64. --puzzle(original_matrix, xtopleftcorner, ytopleftcorner, puzzle_kind, shuffle)
  65.  
  66. --if you want to configure the lib for a level, may be change the shuffle algorithm, use the variables in the WORLD section... 
  67.  
  68. -- it's easy, isn't it ?
  69.  
  70. -------------------------------------
  71. -- Programmer's Variable Reference --
  72. -------------------------------------
  73. --List of the main globals:
  74. --DON'T change this values directly!
  75. --matrix:  original_matrix
  76. --matrix:  matrix
  77. --matrix:  teile_matrix
  78. --array:   teile={}
  79. --array:   shuffled_pieces={}
  80. --matrix:  stone_coordinates={{},{}}
  81. --array:   xpermutations={}
  82. --array:   ypermutations={}
  83.  
  84. --original_matrix: This matrix contains the original values, given in puzzle()
  85. --in acts as a backup, it is never changed or used.
  86. --just after calling puzzle() the values will be written in matrix.
  87.  
  88. --shuffled_pieces: this array keeps the mixed descriptions. 
  89. --[no values, it's random!]
  90.  
  91. --stone_coordinates: this 2D Array keeps the coordinates of the stones.
  92. --Format: {{X-Values},{Y-Values}}
  93. --{{x-first-stone, xsecond-stone, ...},{y-first-stone, y-second-stone, ...}}
  94. --[{{2,3,4,2,4,2,3,4},{4,4,4,5,5,6,6,6}}]
  95.  
  96. --teile: this array keeps all strings that describes the different stones used. 
  97. --[{"es","ew","sw","ns","ns","ne","ew","nw"}]
  98.  
  99. --teile_matrix: this matrix stores the teile at their places.
  100. --neede to shuffle with permutation.
  101.  
  102. --anz:stones: the number of stones needed.
  103.  
  104. --TODO:
  105. -->clear the variables, locals, globals...use same names for same local vars, eg. temp,tmp...(half done)
  106. -->release libpuzzle 1.0
  107.  
  108.  
  109. ----------------------------
  110. --BEGINN OF LIBPUZZLE CODE--
  111. ---------------------------------------------------------------
  112. --WORLD SECTION:
  113. --This are global variables. They determine the exact behavior of the puzzle function.
  114. --This values, you can use to configure the lib in your level.
  115. --Just set the variable to the desired value, before you call puzzle().
  116. --Then, your values will be kept until you change them again!
  117.  
  118. --must we shuffle the pieces or not ?
  119. --1 means true, 0 means false.
  120. --overwrite this in your level to get already solved puzzles.
  121. must_shuffle=1
  122.  
  123. --which method to shuffle:
  124. --"random" or "permutation"
  125. --not yet used
  126. shuffle_method="permutation"
  127.  
  128. --with how many permutations we shuffle:
  129. --for bigger puzzles, take bigger values!
  130. --this value is just the base, the real value (num_perm_todo) is calculated this way:
  131. --num_perm_todo=num_perm+random(1,num_perm)
  132. num_perm=10
  133.  
  134. --this value varies the real num_perm_todo
  135. --without that, you would get everytime the same result, when you shuffle a one-line puzzle...
  136. --do not calculate this value here, calc it in the wrapper function puzzle()
  137. --num_perm_to_add=random(1,num_perm)
  138.  
  139. --is it allowed to generate "open" clusters ?
  140. --yes=1 no=0
  141. --not yet used, probably this will never be used...
  142. open_cluster=1 
  143.  
  144. --Default value for the kind of puzzles:
  145. --only used, if nothing given as parameter of puzzle()
  146. art="2"
  147.  
  148. ---------------------------------------------------------------
  149. --HELPERFUNCTIONS:
  150. ---------------------------------------------------------------
  151. --Determine the length of an array:
  152. function arraydim(array)
  153.  local i=1
  154.  local array_length=0
  155.  
  156.  while array[i]~=nil do
  157.   i=i+1
  158.  end
  159.  
  160.  array_length=i-1
  161.  return array_length
  162. end
  163.  
  164. --copy a matrix a to a matrix b:
  165. function copy_matrix(matrix1,matrix2)
  166.  
  167.  local matrix2={}
  168.  local matrdim1=arraydim(matrix1)
  169.  local matcdim1=arraydim(matrix1[1])
  170.  local i=1
  171.  local j=1
  172.  
  173.  for i=1,matrdim1 do
  174.   matrix2[i]={}
  175.   for j=1,matcdim1 do
  176.    matrix2[i][j]=matrix1[i][j]
  177.   end
  178.  end
  179.  
  180.  return matrix2
  181. end
  182.  
  183. --rewrite a matrix:
  184. --DANGER, this changes the matrix in irrevocably!
  185. --there will be a loss of information!
  186. function rewrite_matrix(matrix)
  187.  
  188.  local rdim1=arraydim(matrix)
  189.  local cdim1=arraydim(matrix[1])
  190.  local i=1
  191.  local j=1
  192.  
  193.  for i=1,rdim1 do
  194.   for j=1,cdim1 do
  195.    if matrix[i][j]==2 then
  196.     matrix[i][j]=0
  197.    end
  198.   end
  199.  end
  200.  return matrix
  201. end
  202.  
  203. ---------------------------------------------------------------
  204. --WRAPPER:
  205. --The "normal" User of libpuzzle would call this function only.
  206. function puzzle(original_matrix, xtopleftcorner, ytopleftcorner, puzzle_kind, shuffle)
  207.  
  208.  --make a copy of the original Matrix to work on.
  209.  --this way there are no problem when changing the matrix and recalling puzzle() without regenerating the original matrix.
  210.  matrix=copy_matrix(original_matrix,matrix)
  211.  
  212.  --argument parser:
  213.  if puzzle_kind ~= nil then
  214.   if puzzle_kind=="blue" then
  215.    art=""
  216.   elseif puzzle_kind=="red" then
  217.    art="2"
  218.   end
  219.  end
  220.  
  221.  if shuffle ~= nil then
  222.   if shuffle=="yes" then
  223.    must_shuffle=1
  224.   elseif shuffle=="no" then
  225.    must_shuffle=0
  226.   end
  227.  end
  228.  
  229.  --call the matrix2places to get the real locations of the puzzlestones:
  230.  matrix2places(matrix, xtopleftcorner, ytopleftcorner)
  231.  
  232.  --call the which_piece to determine the pieces we will need:
  233.  which_piece(matrix)
  234.  
  235.  --shuffle the pieces?
  236.  if must_shuffle==1 then
  237.    --which method to shuffle?
  238.    if shuffle_method=="random" then
  239.      puzzle_shuffle(teile)
  240.    elseif shuffle_method=="permutation" then
  241.      --determine the number of permutations to use:
  242.      num_perm_to_add=random(1,num_perm)
  243.      num_perm_todo=num_perm+num_perm_to_add
  244.      --cal the shuffle main method:
  245.      shuffle_pieces_with_permutations(matrix,teile,num_perm_todo)
  246.    end
  247.  elseif must_shuffle==0 then
  248.   --to get a shuffled_pieces array (Only necessary because of the arrayname). But the pieces are NOT shuffled.
  249.   shuffled_pieces=teile
  250.  end
  251.  
  252.  --draw the puzzle
  253.  draw_pieces(stone_coordinates, shuffled_pieces, art)
  254.  
  255.  return 0
  256. end
  257.  
  258. ---------------------------------------------------------------
  259. --INPUT_PARSER:
  260.  
  261. --Determine the real coordinates of the stones
  262. function matrix2places(matrix,xcorner,ycorner)
  263.  
  264.  --new global:
  265.  stone_coordinates={{},{}}
  266.  
  267.  local i,j
  268.  local counter=1
  269.  
  270.  local rdim=arraydim(matrix)
  271.  local cdim=arraydim(matrix[1])
  272.  
  273.   for i=1,rdim do
  274.    for j=1,cdim do
  275.     if matrix[i][j]==1 then
  276.      stone_coordinates[1][counter]=xcorner+j-1
  277.      stone_coordinates[2][counter]=ycorner+i-1
  278.      counter=counter+1
  279.     end
  280.    end
  281.   end
  282.  
  283.  --number of stones:
  284.  anz_stones=arraydim(stone_coordinates[1])
  285.  
  286.  return stone_coordinates,anz_stones
  287. end
  288.  
  289. ---------------------------------------------------------------
  290. --Determine the kind of the stones
  291. function which_piece(matrix)
  292.  
  293.  --new global:
  294.  teile={}
  295.  
  296.  local rdim=arraydim(matrix)
  297.  local cdim=arraydim(matrix[1])
  298.  local i,j
  299.  local oben=""
  300.  local links=""
  301.  local unten=""
  302.  local rechts=""
  303.  local counter=1
  304.  
  305.  for i=1,rdim do
  306.   for j=1,cdim do
  307.    if matrix[i][j]==1 then
  308.  
  309.       if i==1 then
  310.        oben=""
  311.        if rdim>1 then
  312.         unten=tests(matrix,j,i)
  313.        end 
  314.       elseif i==rdim then
  315.        unten=""
  316.        if rdim>1 then
  317.         oben=testn(matrix,j,i) 
  318.        end
  319.       else
  320.        oben=testn(matrix,j,i) 
  321.        unten=tests(matrix,j,i) 
  322.       end 
  323.  
  324.       if j==1 then
  325.        links=""
  326.        if cdim>1 then
  327.         rechts=teste(matrix,j,i) 
  328.        end
  329.       elseif j==cdim then
  330.        rechts=""
  331.        if cdim>1 then
  332.         links=testw(matrix,j,i) 
  333.        end
  334.       else
  335.        rechts=teste(matrix,j,i) 
  336.        links=testw(matrix,j,i) 
  337.       end  
  338.  
  339.       -- To get a valid Stone if no neighbours were present, we define it as the (untunneled) cross ("nesw")
  340.       if oben=="" and rechts=="" and unten=="" and links=="" then
  341.        oben="n"
  342.        rechts="e"
  343.        unten="s"
  344.        links="w"
  345.       end
  346.  
  347.       teile[counter]=oben..rechts..unten..links
  348.       counter=counter+1
  349.    end
  350.   end
  351.  end
  352.  
  353.  --call the rewrite_matrix, because from now on, we wont have the disturbing "pseudo_pieces":
  354.  --we ONLY use them to get a "special" teile Array, which will produce an "open" puzzle cluster.
  355.  rewrite_matrix(matrix)
  356.  
  357.  return teile
  358. end
  359.  
  360. ---------------------------------------------------------------
  361. --Helperfunction for testing the required connection of a puzzlestone:
  362. function testn(matrix,posx,posy)
  363.  if matrix[posy-1][posx]==1 or matrix[posy-1][posx]==2 then
  364.   return "n"
  365.  else
  366.   return ""
  367.  end
  368. end
  369.  
  370. function teste(matrix,posx,posy)
  371.  if matrix[posy][posx+1]==1 or matrix[posy][posx+1]==2 then
  372.   return "e"
  373.  else
  374.   return ""
  375.  end
  376. end
  377.  
  378. function tests(matrix,posx,posy)
  379.  if matrix[posy+1][posx]==1 or matrix[posy+1][posx]==2 then
  380.   return "s"
  381.  else 
  382.   return ""
  383.  end
  384. end
  385.  
  386. function testw(matrix,posx,posy)
  387.  if matrix[posy][posx-1]==1 or matrix[posy][posx-1]==2 then
  388.   return "w"
  389.  else
  390.   return ""
  391.  end
  392. end
  393.  
  394. ---------------------------------------------------------------
  395. --RANDOM SHUFFLE
  396. --shuffle the array teile, this is the classical method.
  397. --it's not guaranted to get a solvable puzzle every time!
  398. function puzzle_shuffle(teile)
  399.  
  400.  shuffled_pieces={}
  401.  
  402.  local restteile={}
  403.  local anz=anz_stones
  404.  local zyklen=anz
  405.  local i,j,k
  406.  local counter=1
  407.  local aktteil
  408.  
  409.  for i=1,zyklen do
  410.  
  411.   --shuffle pieces:
  412.   t=random(1,anz)
  413.   
  414.   aktteil=teile[t]
  415.   shuffled_pieces[counter]=aktteil
  416.   counter=counter+1
  417.  
  418.   --prepare the teile array for next cycle
  419.   local restteile={}
  420.   local schogse=0
  421.  
  422.   --copy the teile array, mark the piece we just have used with "0"
  423.   for k=1,anz do
  424.    if teile[k]==aktteil and schogse==0 then
  425.     restteile[k]="0"
  426.     schogse=1
  427.    else
  428.     restteile[k]=teile[k]
  429.    end
  430.   end
  431.  
  432.   --clear teile array:
  433.   teile={}
  434.   local t=1
  435.  
  436.   for j=1,anz do
  437.    if restteile[j]~="0" then
  438.     teile[t]=restteile[j]
  439.     t=t+1
  440.    end 
  441.   end
  442.   
  443.   --we have used one piece:
  444.   anz=anz-1
  445.  end
  446.  
  447. end
  448. ---------------------------------------------------------------
  449. --PERMUTATION-SHUFFLE:
  450. --here you will get a solvable Puzzle EVERY time!
  451. function analyzerow(matrix,row)
  452.  
  453.  --new global:
  454.  xpermutations={}
  455.  
  456.  --Z├ñhlcountereter zum durchlaufen der Reihe:
  457.  local counter = 1
  458.  
  459.  --Counter to count the number of Permutations:
  460.  local perm_counter = 0
  461.  local local_counter
  462.  local local_length
  463.  local array=matrix[row]
  464.  local length=arraydim(array)
  465.  
  466.  while counter<=length do
  467.  
  468.   --If MatrixPlatz is zero, do nothing
  469.   if array[counter]==0 then
  470.  
  471.    counter=counter+1
  472.  
  473.   --Get the length of the Ones-Sequenz
  474.   else
  475.    
  476.    local_counter = 0
  477.    local_length = 0
  478.  
  479.    --Schaue wie lang eine Reihe ist:
  480.    while array[counter+local_counter]==1 do
  481.     local_counter=local_counter+1
  482.     local_length = local_length +1
  483.    end
  484.    
  485.    --big IF, is it a Permutation or not?
  486.    if local_length >= 2 then
  487.  
  488.     --Yes, increase the number of Permutations by 1:
  489.     perm_counter = perm_counter + 1
  490.  
  491.     --add an array to the permutation-array:
  492.     xpermutations[perm_counter]={}
  493.  
  494.     --start
  495.     xpermutations[perm_counter][1]={}
  496.     --end
  497.     xpermutations[perm_counter][2]={}
  498.  
  499.     --set the beginning:
  500.     --ROW value 
  501.     xpermutations[perm_counter][1][1]=row
  502.     --COL value
  503.     xpermutations[perm_counter][1][2]=counter
  504.  
  505.     --set end:
  506.     --ROW value
  507.     xpermutations[perm_counter][2][1]=row
  508.     --COL value
  509.     xpermutations[perm_counter][2][2]=counter+local_length-1
  510.  
  511.    end
  512.    
  513.    --jump just after the sequence of "1":
  514.    counter=counter+local_length
  515.  
  516.   end
  517.  end
  518.  
  519. end
  520.  
  521. --------------------------------------------------------------------
  522. function analyzecol(matrix,col)
  523.  
  524.  --new global:
  525.  ypermutations={}
  526.  
  527.  --Z├ñhlcountereter zum durchlaufen der Reihe:
  528.  local counter = 1
  529.  
  530.  --countereter der die anz Permutationen z├ñhlt:
  531.  local perm_counter = 0
  532.  local local_counter
  533.  local local_length
  534.  local length=arraydim(matrix)
  535.  local array={}
  536.  
  537.  --make a valid array
  538.  for i=1,length do
  539.   array[i]=matrix[i][col]
  540.  end
  541.  
  542.  while counter<=length do
  543.   
  544.   --Wenn der MatrixPlatz null ist, tue nichts
  545.   if array[counter]==0 then
  546.  
  547.    counter=counter+1
  548.  
  549.   --Finde heraus, wie lang die Einsen-Sequenz ist
  550.   else
  551.    
  552.    local_counter = 0
  553.    local_length = 0
  554.  
  555.    --Schaue wie lang eine Reihe ist:
  556.    while array[counter+local_counter]==1 do
  557.     local_counter=local_counter+1
  558.     local_length = local_length +1
  559.    end
  560.    
  561.    --grosse IF entscheidung:
  562.    if local_length >= 2 then
  563.  
  564.     --erh├╢he die anzahl der gefundenen Permutationen um 1:
  565.     perm_counter = perm_counter + 1
  566.  
  567.     --verl├ñngere den Permutationsarray um einen nuenen array:
  568.     ypermutations[perm_counter]={}
  569.  
  570.     --anfang
  571.     ypermutations[perm_counter][1]={}
  572.     --ende
  573.     ypermutations[perm_counter][2]={}
  574.  
  575.     --setze anfang:
  576.     --Reihenwert des Anfangs
  577.     ypermutations[perm_counter][1][1]=counter
  578.     --Spaltenwert des Anfangs
  579.     ypermutations[perm_counter][1][2]=col
  580.  
  581.     --setze ende:
  582.     --Reihenwert des endes
  583.     ypermutations[perm_counter][2][1]=counter+local_length-1
  584.     --Spaltenwert des endes
  585.     ypermutations[perm_counter][2][2]=col
  586.  
  587.    end
  588.    
  589.    --springe gerade nach die einersequenz:
  590.    counter=counter+local_length
  591.  
  592.   end
  593.  end
  594.  
  595. end
  596.  
  597. --------------------------------------------------------------------------
  598. function find_all_permutations(matrix)
  599.  
  600.  permutations={}
  601.  number_of_permutations=1
  602.  
  603.  local rdim=arraydim(matrix)
  604.  local cdim=arraydim(matrix[1])
  605.  local i,j,k
  606.  
  607.  --search all permutations:
  608.   --the x ones:
  609.   for i=1,rdim do
  610.  
  611.    analyzerow(matrix,i)
  612.  
  613.    local temp=arraydim(xpermutations)
  614.  
  615.    --write the permutations to the global store:
  616.    for k=1,temp do
  617.     permutations[number_of_permutations]=xpermutations[k]
  618.     number_of_permutations=number_of_permutations+1
  619.    end
  620.   end
  621.  
  622.   --the y ones:
  623.   for i=1,cdim do
  624.  
  625.    analyzecol(matrix,i)
  626.    local temp=arraydim(ypermutations)
  627.  
  628.    --write the permutations to the global store:
  629.    for k=1,temp do
  630.     permutations[number_of_permutations]=ypermutations[k]
  631.     number_of_permutations=number_of_permutations+1
  632.    end
  633.   end
  634.  
  635.   --Because counter has initial value 1, we have count one permutation to much:
  636.   number_of_permutations=number_of_permutations-1
  637.  
  638.   return permutations
  639. end
  640.  
  641. --------------------------------------------------------------------------
  642. function use_permutation(teile_matrix,permutations,n)
  643.  
  644.  local p=permutations[n]
  645.  local rbeg=p[1][1]
  646.  local cbeg=p[1][2]
  647.  local rend=p[2][1]
  648.  local cend=p[2][2]
  649.  
  650.  local temp = teile_matrix[rend][cend]
  651.  
  652.  if rbeg==rend then
  653.   --horizontal
  654.   local t=1
  655.  
  656.   while cend-t>=cbeg do
  657.    teile_matrix[rbeg][cend-t+1]=teile_matrix[rbeg][cend-t]
  658.    t=t+1
  659.   end
  660.   teile_matrix[rbeg][cbeg]=temp
  661.  
  662.  elseif cbeg==cend then
  663.   --vertical
  664.   local t=1
  665.  
  666.   while rend-t>=rbeg do
  667.    teile_matrix[rend-t+1][cbeg]=teile_matrix[rend-t][cbeg]
  668.    t=t+1
  669.   end
  670.   teile_matrix[rbeg][cbeg]=temp
  671.  
  672.  end
  673.  
  674.  return teile_matrix
  675. end
  676. --------------------------------------------------------------------------
  677. function teile2teile_matrix(matrix,teile)
  678.  
  679.  --teile_matrix=matrix, but this seems not to work. So we call a function:
  680.  teile_matrix=copy_matrix(matrix,teile_matrix)
  681.  
  682.  local rdim=arraydim(matrix)
  683.  local cdim=arraydim(matrix[1])
  684.  local i,j,t=1,1,1
  685.  
  686.  for i=1,rdim do
  687.   for j=1,cdim do
  688.    if matrix[i][j]==0 then
  689.     teile_matrix[i][j]="--"
  690.    else
  691.     teile_matrix[i][j]=teile[t]
  692.     t=t+1
  693.    end
  694.   end
  695.  end
  696.  
  697.  return teile_matrix
  698. end
  699.  
  700. --------------------------------------------------------------------------
  701. function teile_matrix2teile(teile_matrix)
  702.  
  703.  --new global:
  704.  shuffled_pieces={}
  705.  
  706.  local rdim=arraydim(teile_matrix)
  707.  local cdim=arraydim(teile_matrix[1])
  708.  local i,j,t=1,1,1
  709.  
  710.  for i=1,rdim do
  711.   for j=1,cdim do
  712.    if teile_matrix[i][j]=="--" then
  713.     --do nothing
  714.    else
  715.     --write the found piece to the shuffled_pieces array:
  716.     shuffled_pieces[t]=teile_matrix[i][j]
  717.     t=t+1
  718.    end
  719.   end
  720.  end
  721.  
  722.  return shuffled_pieces
  723. end
  724.  
  725. --------------------------------------------------------------------------
  726. --Main Function of the Permutation-Shuffle branch:
  727. function shuffle_pieces_with_permutations(matrix,teile,num_perm_todo)
  728.  
  729.  --Search all Permutations:
  730.  find_all_permutations(matrix)
  731.  
  732.  --Convert the teile to teile_matrix:
  733.  teile2teile_matrix(matrix,teile)
  734.  
  735.  local i,t
  736.  local num_perms=arraydim(permutations)
  737.  
  738.  --to catch the error, if num_perms<1:
  739.  if num_perms>0 then
  740.   for i=0,num_perm_todo do
  741.    --if there were no permutations, this produces an error:
  742.    t=random(1,num_perms)
  743.    use_permutation(teile_matrix,permutations,t)
  744.   end
  745.  end
  746.  
  747.  --Convert the teile_matrix back to teile:
  748.  teile_matrix2teile(teile_matrix,teile)
  749.  
  750.  return shuffled_pieces
  751. end
  752.  
  753. ---------------------------------------------------------------
  754. --OUTPUT:
  755.  
  756. --Draw the Puzzlestones:
  757. function draw_pieces(stone_coordinates,shuffled_pieces,art)
  758.  
  759.  local i
  760.  local anz=anz_stones
  761.  
  762.   for i=1,anz do
  763.   set_stone("st-puzzle"..art.."-"..shuffled_pieces[i], stone_coordinates[1][i], stone_coordinates[2][i])
  764.  end
  765. end
  766.  
  767. ---------------------------------------------------------------
  768. --END OF LIBPUZZLE CODE --
  769. --------------------------
  770.     ]]></el:luamain>
  771.     <el:i18n>
  772.     </el:i18n>
  773.   </el:protected>
  774. </el:level>
  775.