같같같같같같같같같같같같같같같같같같같같같같같같같같같같같같같같같같같같
-- NEW CONTINENT GENERATION ALGORITHM   John Cartan 3/9/94
--
-- The old algorithm produced land (1) and sea (2).  This new version
-- produces mountains (1), land (2), and sea (3) and is divided into
-- three distinct phases.  In the first phase, which lasts for about
-- the first 500 spark assignments, the land grows like water around
-- the original 20 spark mountains.  During this phase, if a selected
-- spark is mountainous, there's only a 45% chance (5/11 as opposed
-- to 5/6 in the old algorithm) that neighboring positions will be
-- mountainous; if the selected spark is land, ALL its neighbors will
-- be land.
--
-- At the beginning of phase two, 40 sea sparks are tossed into the map.
-- During this phase, if a selected spark is land OR mountain, there's
-- an 83% (5/6) chance that neighboring positions will be LAND; if the
-- selected spark is sea, ALL its neighbors will be sea.  Note that
-- mountains are only formed phase one, and sea is only formed in phase
-- two.
--
-- Phase THREE is a cutoff in which no more land is formed and all
-- unassigned positions are set to sea.  This is designed to
-- counteract the tendency for several continents to grow together
-- into a single world-spanning supercontient.  Phase three should kick
-- in after about half of the sparks are assigned and would thus cut
-- generation time in half.
--
-- The modification to the original algorithm is shown in UPPER CASE
-- and occurs mostly in the "spread" handler (see below).  As you can
-- see, the change is quite simple.  This stack allows you to compare
-- both algorithms over time.  We may need to adjust the probabilities
-- and phase transition points.  Also, it may not be worthwhile to toss
-- out extra sea sparks at the opening of phase two.
같같같같같같같같같같같같같같같같같같같같같같같같같같같같같같같같같같같같

on mouseUp
  global map,sparks,PHASE
  if number of cards>1 then
    answer "Please Clear Stack First!" with "Oops"
    exit mouseUp
  end if
  put 26 into word 4 of field "Card Count"
  
  initMap
  set brush to 4
  choose brush tool
  
  PUT 1 INTO PHASE
  scatter 20,1 -- 20 MOUNTAINS
  
  newframe
  repeat until sparks is empty
    put random(number of lines of sparks) into p
    put line p of sparks into q
    delete line p of sparks
    put item 1 of q into x
    put item 2 of q into y
    spread x,y
  end repeat
  choose browse tool
end mouseUp

on initMap
  global map,sparks,count
  put empty into sparks
  put 0 into count
  put "0" into map
  repeat 7 times
    put map after map
  end repeat
  put char 1 to 97 of map & return into map
  repeat 6 times
    put map after map
  end repeat
  put line 1 to 57 of map into map
end initMap

on scatter num,which
  global map,sparks
  SET PATTERN TO ITEM WHICH OF "12,20,14"
  put 1 into j
  repeat until j>=num
    put random(53)+4 into y
    put random(93)+4 into x
    put char x of line y of map into m
    if m<>0 then next repeat
    click at x*5,y*5
    put which into char x of line y of map
    put x&","&y&return after sparks
    add 1 to j
  end repeat
end scatter

on spread x,y
  global map,sparks,count,PHASE
  put char x of line y of map into m
  repeat with j=-1 to 1
    repeat with k=-1 to 1
      if j=0 and k=0 then next repeat
      put x-j into x1
      put y-k into y1
      if x1<5 or x1>97 or y1<5 or y1>57 then next repeat
      put char x1 of line y1 of map into n
      if n<>0 then next repeat
      put m into r
      
      IF PHASE=1 THEN
        IF R=1 THEN PUT (RANDOM(11) DIV 6)+1 INTO R
        PUT R INTO CHAR X1 OF LINE Y1 OF MAP
        SET PATTERN TO ITEM R OF "12,20"
      ELSE
        IF R<3 THEN PUT (RANDOM(6) DIV 6)+2 INTO R
        PUT R INTO CHAR X1 OF LINE Y1 OF MAP
        SET PATTERN TO ITEM R OF "12,20,14"
      END IF
      
      click at x1*5,y1*5
      put x1&","&y1&return after sparks
      add 1 to count
      
      IF COUNT=500 THEN
        PUT 2 INTO PHASE
        SCATTER 40,3
      END IF
      
      IF COUNT=2500 THEN
        PUT 3 INTO PHASE
        SET PATTERN TO 14
        REPEAT WITH Y=5 TO 57
          REPEAT WITH X=5 TO 97
            PUT CHAR X OF LINE Y OF MAP INTO M
            IF M=0 THEN
              PUT 3 INTO CHAR X OF LINE Y OF MAP
              CLICK AT X*5,Y*5
              ADD 1 TO COUNT
            END IF
          END REPEAT
        END REPEAT
        PUT EMPTY INTO SPARKS
      END IF
      
      if count mod 100 = 0 then newframe
    end repeat
  end repeat
end spread

on newframe
  if word 2 of field "Card Count" is "50" then exit newframe
  domenu "Copy Card"
  domenu "Paste Card"
  add 1 to word 2 of field "Card Count"
end newframe