# Problem 8C
#
# RUN:
# racing, gasping, hurting
#
import math

papercolor = 0

g.paper(papercolor)
g.norefresh()
g.antialias(1)

def random(rseed):
        bb = 198621
        mm = (98621+g.getTime(4))
        bl = (long(rseed)*bb+1)
        temp = bl%mm
        return int(temp%100),int(temp)

def make_runners(number):
    rseed = g.getTime(4)
    runners = []
    maxspeed = 10
    
    for n in range(number):
        rnd1, rseed = random(rseed)
        rnd2, rseed = random(rseed)
        runners.append((rnd1,rnd2%maxspeed+1))

    return runners

def make_trigarray(amplitude,resolution):
    sinarray = []
    
    for n in range(resolution+1):
        sinarray.append(int(float(amplitude)/(1+2+4+6)*(math.sin(math.pi/resolution*n)+math.sin(2*math.pi/resolution*n)+math.sin(4*math.pi/resolution*n)+math.sin(6*math.pi/resolution*n))))

    return sinarray

def move_runners(runners):
    runners_new = []
    
    for runner in runners:
        runners_new.append(((runner[0]+runner[1])%101,runner[1]))

    return runners_new

def render(runners,trigarray,state,burst):
    x = g.getMouse(1)
    y = g.getMouse(2)

    # burst
    if state == burst:
        for n in range(21):
            g.paper(n*5)
            g.refresh()
        for n in range(21):
            g.paper(100-n*5)
            g.refresh()

    # trigarray
    amp = abs(trigarray[int(0.01*state*(len(trigarray)-1))])
    g.field(x-amp,y-amp,x+amp,y+amp,abs(papercolor-amp))

    # runners
    k = len(runners)/2-len(runners)
    for runner in runners:
        g.setPixel(runner[0],y+k,abs(papercolor-100))
        k = k+1
    g.refresh()
    g.paper(papercolor)

    
runners = make_runners(20)
trigarray = make_trigarray(120,40)
state = 0
rseed = g.getTime(4)
while 1:
    burst, rseed = random(rseed)
    for state in range(101):
        render(runners,trigarray,state,burst)
        runners = move_runners(runners)
        state = (state+1)%101