import time
import visual
from visual import*
from threading import*
from random import randint
from winsound import PlaySound
selcol=visual.color.red
c1=(0.99609375,0.83984375,0.7421875)
c2=visual.color.red
c3=visual.color.blue
c4=(0.5,0.25,0)

class Haus(frame):
    def __init__(self,pos):
        frame.__init__(self,pos=pos)
        self.home=box(pos=pos,size=(250,250,250),color=(0.44,0.44,0.44))
        box(frame=self,pos=(0,-45,125.5),size=(35,80,1),color=(0.2,0.2,0.23))
        box(frame=self,pos=(100,-45,125.5),size=(35,80,1),color=(0.2,0.2,0.23))
        box(frame=self,pos=(-100,-45,125.5),size=(35,80,1),color=(0.2,0.2,0.23))
        box(frame=self,pos=(0,55,125.5),size=(35,80,0),color=(0.2,0.2,0.23))
        box(frame=self,pos=(100,55,125.5),size=(35,80,1),color=(0.2,0.2,0.23))
        box(frame=self,pos=(-100,55,125.5),size=(35,80,1),color=(0.2,0.2,0.23))
class Held(visual.frame):
    def __init__(self,name,pos=(0,0,0),**ruestung):
        self.name=name
        frame.__init__(self)
        self.f2=frame()
        self.f3=frame()
        self.f4=frame()
        self.f5=frame()
        self.f6=frame()
        self.f7=frame()
        self.f2.frame=self
        self.f3.frame=self
        self.f4.frame=self
        self.f5.frame=self
        self.f6.frame=self
        self.f7.frame=self

        self.vorwaerts=cylinder(frame=self,pos=self.pos,axis=vector(0,0,1),color=(0,0,0))
        self.vorwaerts.visible=0
        
        #self.heldlabel=label(frame=self,pos=(0,25,0),text=self.name,height=10,border=6)
        self.kopfheld=ellipsoid(frame=self.f2,pos=(0,15,0),size=(6,10,7),color=c1)
        self.halsheld=cylinder(frame=self.f2,pos=(0,9.9,0),axis=(0,2,0),radius=1,color=c1)

        self.okoerpheld=box(frame=self.f3,pos=(0,0,0),size=(10,20,5),color=c2)

        self.lischult=sphere(frame=self.f4,pos=(-6,8,0),radius=2,color=c2)
        self.liarm=cylinder(frame=self.f4,pos=(-6,-12,0),axis=(0,20,0),radius=2,color=c2)
        self.lihand=sphere(frame=self.f4,pos=(-6,-13.5,0),radius=2,color=c1)

        self.reschult=sphere(frame=self.f5,pos=(6,8,0),radius=2,color=c2)
        self.rearm=cylinder(frame=self.f5,pos=(6,-12,0),axis=(0,20,0),radius=2,color=c2)
        self.rehand=sphere(frame=self.f5,pos=(6,-13.5,0),radius=2,color=c1)

        self.rebein=cylinder(frame=self.f6,pos=(-3,-8,0),axis=(0,-20,0),radius=2,color=c3)
        self.refus=box(frame=self.f6,pos=(-3,-28.5,1),size=(2,1,5),color=c4)
        
        self.libein=cylinder(frame=self.f7,pos=(3,-8,0),axis=(0,-20,0),radius=2,color=c3)
        self.lifus=box(frame=self.f7,pos=(3,-28.5,1),size=(2,1,5),color=c4)
        self.pos=pos
    def _schrittl(self):
        if self.vorwaerts.axis[2]>=0:
            vz=-1
        else:
            vz=1
        for h in range(20):
            self.f6.rotate(axis=vz*self.axis,origin=self.rebein.pos,angle=0.01*pi)
            self.pos=self.pos+self.vorwaerts.axis*0.25
            time.sleep(1./40)
        for h in range(20):
            self.f6.rotate(axis=vz*self.axis,origin=self.rebein.pos,angle=-0.01*pi)
    def _schrittr(self):
        if self.vorwaerts.axis[2]>=0:
            vz=-1
        else:
            vz=1
        for h in range(20):
            self.f7.rotate(axis=vz*self.axis,origin=self.libein.pos,angle=0.01*pi)            
            self.pos=self.pos+self.vorwaerts.axis*0.25
            time.sleep(1./40)
        for h in range(20):
            self.f7.rotate(axis=vz*self.axis,origin=self.libein.pos,angle=-0.01*pi)            
    def schritt(self):
        self._schrittl()
        self._schrittr()
    def linksdrehen(self):
        self.rotate(axis=(0,1,0),origin=self.pos,angle=0.125*pi)
        self.vorwaerts.rotate(axis=(0,1,0),origin=self.pos,angle=0.125*pi)
    def rechtsdrehen(self):
        self.rotate(axis=(0,1,0),origin=self.pos,angle=-0.125*pi)
        self.vorwaerts.rotate(axis=(0,1,0),origin=self.pos,angle=-0.125*pi)
    def spazieren(self):
        while 1:
            self.schritt()
            self.linksdrehen()
    def zufall(self,m,r):
        while time.clock()<=3*60:
            zahl=randint(0,30)
            if zahl<8:
                self.schritt()
                print 'schritt',
            elif zahl<19:
                self.linksdrehen()
                print 'links',
            elif zahl<30:
                self.rechtsdrehen()
                print 'rechts',
            elif zahl==30:
                time.sleep(5)
                print 'schlafen',
            if abstand(self.pos,m)>=r:
                print 'dong'
                PlaySound(' ',1)
                for i in  range(6):
                    self.linksdrehen()
                self.schritt()
                self.schritt()
class coordsyst(frame,Thread):
    def __init__(self,lenght=10,followmouse=True):
        frame.__init__(self)
        Thread.__init__(self)
        self.xa=arrow(frame=self,axis=vector(10,0,0))
        self.xl=label(frame=self,pos=self.xa.axis+self.xa.pos,text="x")
        self.ya=arrow(frame=self,axis=vector(0,10,0))
        self.yl=label(frame=self,pos=self.ya.axis+self.ya.pos,text="y")
        self.za=arrow(frame=self,axis=vector(0,0,10))
        self.zl=label(frame=self,pos=self.za.axis+self.za.pos,text="z")
        scene.mouse.visible=0
        self.start()
    def run(self):
        while 1:
            self.pos=scene.mouse.pos
class PosMgr(Thread):
    def __init__(self,obj):
        Thread.__init__(self)
        self.obj=obj
    def run(self):
        while 1:
            self.obj.pos=scene.mouse.pos+vector(0,10,0)
class LEIBL(label,Thread):
    def __init__(self):
        self.op=open('./mensch3.py')               
        label.__init__(self,pos=scene.mouse.pos,height=26,border=6,text=self.op.readline())
        Thread.__init__(self)
        self.posmgr=PosMgr(self)
        self.posmgr.start()
        self.start()
    def run(self):
        while 1:
            time.sleep(1)
            text=self.op.readline()
            if not text:
                self.op=open('./mensch3.py')
                text=self.op.readline()
            self.text=text
def fadein(n=1000):
    for i in range(n):
        scene.ambient*=1.01
        scene.lights=[l*1.01 for l in scene.lights]
        time.sleep(0.003)
def fadeout(n=1000):
    for i in range(n):
        scene.ambient/=1.01
        scene.lights=[l/1.01 for l in scene.lights]
        time.sleep(0.003)
        
def abstand(pos1,pos2):
    xyz=pos1-pos2
    x,y,z=abs(xyz[0]),abs(xyz[1]),abs(xyz[2])
    return sqrt(x+sqrt(y+z))
def RUNIT():
    scene.lights=[vector(8.32926264805403e-006, 1.66585252961081e-005, 3.33170505922161e-005),
                  vector(-1.24938939720811e-005, -3.12347349302026e-006, -6.2469469860405e-006)]
    scene.ambient=9.5423692841613601e-006
    scene.fullscreen=1
    scene.mouse.visible=0
    l=LEIBL()
    neubau=Haus((0,125-29,0))
    h=Held("Cyborg")
    fadein(1000)
    h.zufall((0,0,0),10.02)

    l.visible=0
    #h.heldlabel.visible=0
    fadeout(1000)
scene.range=300
RUNIT()

