Warcraft III resources & community, 2003–2006 · archived

Random Map

not rated
Submitted by Editor-FanCalculations0 downloads
Usefull to create nice looking random maps. You can use this script to generate for example a forest.

You need:
DataSize - Integer; Value= 2^X-1 ; (choose a Value for X, e.g. 5 -> DataSize = 33)
Wert - array of Integer ; Size: DataSize*DataSize
Interpolation - array of Integer ; Size: DataSize-1
Interpolation_Max - Integer ; Value=1000;

Using the Script:
1.) Fill the Array Wert with random Values

2.) Fill the Array Interpolation in a A-Loop like this:
for each (Integer A) from 0 to (Datasize -1) , do (Actions)
Set Interpolation[(Integer A)] = (Integer(((1000.00 / 2.00) x ((Cos((((Real((Integer A))) x 180.00) / (Real(Size))))) + 1.00))))

3.) You may change some random Values of the Wert Array

4.) Call Berechne(X,Y) to caluclate a Value for that Position. That Value will show you what to place there(0 - 1000).

Important:

- Tiggers which take to long to execute will be stopped by Warcraft after a while. My solution is a tigger which is be added to the tigger queue for every column(Don't forget to change the index of the current column).

- You may add or delete Levels of Detail to the function Berechne. But take note that "Level" must be lower than DataSize and it must be a power of two.











Source

function GetValue takes integer X, integer Y returns integer
  return udg_Wert[(X + (Y*(udg_DataSize-1)))]
endfunction

function Interpoliere takes integer Wert1, integer Wert2, integer Nr, integer Von returns integer
  local integer Ergebnis1
  local integer Ergebnis2
  set Ergebnis1 = ( ( Wert1 * udg_Interpolation[( Nr * ( udg_Size / Von ) )] ) / udg_Interpolation_Max )
  set Ergebnis2 = ( ( Wert2 * (udg_Interpolation_Max - udg_Interpolation[( Nr * ( udg_Size / Von ) )] ) ) / udg_Interpolation_Max )
  return (Ergebnis1 + Ergebnis2)
endfunction

function Berechne takes integer X, integer Y returns integer
  local integer Ergebnis
  local integer WertX0
  local integer WertX1
  local integer I_X0
  local integer I_X1
  local integer I_Y0
  local integer I_Y1
  local integer Level
  local integer Field_Size
  local integer Field_DataSize
  local integer Max
  //-----------------------

  set Level = 2
  set Max = 500

  set Field_Size = (udg_Size / Level)
  
  set Field_DataSize = ((udg_DataSize-1) / Level)

  set I_X0 = Field_DataSize*(X / Field_Size) // ok
  set I_X1 = I_X0 + Field_DataSize           // ok
  set I_Y0 = Field_DataSize*(Y / Field_Size) // ok
  set I_Y1 = I_Y0 + Field_DataSize           // ok

  
  set WertX0 = Interpoliere(GetValue(I_X0,I_Y0),GetValue(I_X1,I_Y0),ModuloInteger(X , Field_Size),Field_Size)
  set WertX1 = Interpoliere(GetValue(I_X0,I_Y1),GetValue(I_X1,I_Y1),ModuloInteger(X , Field_Size),Field_Size)

  set Ergebnis = (Interpoliere(WertX0,WertX1,ModuloInteger(Y , Field_Size),Field_Size) / 2) 

  //--------------------------------------

  set Level = 4
  set Max = Max + 1000

  set Field_Size = (udg_Size / Level)
  
  set Field_DataSize = ((udg_DataSize-1) / Level)

  set I_X0 = Field_DataSize*(X / Field_Size) // ok
  set I_X1 = I_X0 + Field_DataSize           // ok
  set I_Y0 = Field_DataSize*(Y / Field_Size) // ok
  set I_Y1 = I_Y0 + Field_DataSize           // ok


  
  set WertX0 = Interpoliere(GetValue(I_X0,I_Y0),GetValue(I_X1,I_Y0),ModuloInteger(X , Field_Size),Field_Size)
  set WertX1 = Interpoliere(GetValue(I_X0,I_Y1),GetValue(I_X1,I_Y1),ModuloInteger(X , Field_Size),Field_Size)

  set Ergebnis = Ergebnis + Interpoliere(WertX0,WertX1,ModuloInteger(Y , Field_Size),Field_Size) 

  //--------------------------------------

  set Level = 16
  set Max = Max + 1000

  set Field_Size = (udg_Size / Level)
  
  set Field_DataSize = ((udg_DataSize-1) / Level)

  set I_X0 = Field_DataSize*(X / Field_Size) // ok
  set I_X1 = I_X0 + Field_DataSize           // ok
  set I_Y0 = Field_DataSize*(Y / Field_Size) // ok
  set I_Y1 = I_Y0 + Field_DataSize           // ok

  
  set WertX0 = Interpoliere(GetValue(I_X0,I_Y0),GetValue(I_X1,I_Y0),ModuloInteger(X , Field_Size),Field_Size)
  set WertX1 = Interpoliere(GetValue(I_X0,I_Y1),GetValue(I_X1,I_Y1),ModuloInteger(X , Field_Size),Field_Size)

  set Ergebnis = Ergebnis + Interpoliere(WertX0,WertX1,ModuloInteger(Y , Field_Size),Field_Size) 


  //--------------------------------------

  set Level = 32
  set Max = Max + 2000

  set Field_Size = (udg_Size / Level)
  
  set Field_DataSize = ((udg_DataSize-1) / Level)

  set I_X0 = Field_DataSize*(X / Field_Size) // ok
  set I_X1 = I_X0 + Field_DataSize           // ok
  set I_Y0 = Field_DataSize*(Y / Field_Size) // ok
  set I_Y1 = I_Y0 + Field_DataSize           // ok

  
  set WertX0 = Interpoliere(GetValue(I_X0,I_Y0),GetValue(I_X1,I_Y0),ModuloInteger(X , Field_Size),Field_Size)
  set WertX1 = Interpoliere(GetValue(I_X0,I_Y1),GetValue(I_X1,I_Y1),ModuloInteger(X , Field_Size),Field_Size)

  set Ergebnis = Ergebnis + (2*Interpoliere(WertX0,WertX1,ModuloInteger(Y , Field_Size),Field_Size)) 

  return (Ergebnis*1000)/Max
endfunction

Comments

6
Oh sorry didn't get any message that there are comments on my code

The Map wich use this code to create a forest is "Unsichtbar 2".

You found it here:
http://www.wc3sear.ch/index.php?p=Maps&ID=5233

Start the map twice and explore the forest. You will find out that it is different every time you play the map.
no i mean i cant get it to work.
Well, it's more understandable than some others explaination, where it stood "Threesome!" and nothing more, and I ask myself, wtf do he mean by "Threesome!" :?: [/img]
give us a test map, because your explanation is not understandable.
stop rating,darky has forgotten to remove rating here.however i reported this,hope to be removed tomorrow since 2day will be buisy with his birthday
OK... I still don't get what this does, or how to use it... But I don't understand much so that's probably why.