;
; Dancing BlitzMan v0.0 by Simon Armstrong
;

NEWTYPE .seg
  *kid.seg         ;Zeigt auf den ersten Eintrag
  *bro.seg         ;Verbindet alle Einträge
  x.w:y:a
  angle.w:length   ;Polarkoordinaten fürs Zeichnen
End NEWTYPE

Dim qsin.q(256),qcos.q(256)
Dim List segs.seg(500)
Dim *f.seg(20)

DEFTYPE .seg *myman

Statement readfigure{*temp.seg}
  SHARED segs()
  Read numkids.w       ;nächsten Eintrag lesen
  Read *temp\angle
  Read *temp\length
  *prev.seg=0
  For i=1 To numkids   ;Nut wenn Kinder existieren
    AddItem segs()     ;Neues Element holen
    segs()\bro=*prev   ;Mit Vorgänger verbinden
    *prev=segs()       ;Vorgänger zum aktuellen machen
    readfigure{segs()} ;Und neue Daten lesen
  Next
  *temp\kid=*prev      ;Verbinden aller Einträge
End Statement

Statement drawfigure{x.w,y,a,*temp.seg}
  SHARED qsin(),qcos(),ratio,size
  USEPATH *temp
  ;Winkel und berechnete Länge des Glieds einfügen
  aa=(a+\angle)&255:slen=\length*size
  ;Polar- in kartesische Koordinaten konvertieren
  xx=x+qcos(aa)*slen:yy=y+qsin(aa)*slen
  \x=xx,yy,aa                 ;Für findpart{} sichern
  If \length<0                ;Kreis
    WEllipse xx,yy,-slen,-slen*ratio,1
  Else
    Wline x,y,xx,yy,1         ;Linie
  EndIf
  ;Anfügen eines Kreises, der mit der Maus ange-
  ;klickt werden kann
  WEllipse xx,yy,size*2,size*2*ratio,2
  ;rekursive Aufrufe der weiteren Glieder
  If \kid Then drawfigure{xx,yy,aa,\kid}
  If \bro Then drawfigure{x,y,a,\bro}
End Statement

Function.l findpart{x,y,*temp.seg}
  DEFTYPE .l result
  USEPATH *temp
  If RectsHit(x,y,1,1,\x-2,\y-2,5,5)  ;Hot-Spot?
    Function Return *temp             ;Exit
  Else
    If \kid Then result=findpart{x,y,\kid}
    If result Then Function Return result
    If \bro Then result=findpart{x,y,\bro}
  EndIf
End Statement

;
; Hauptprogramm
;

MaxLen pa$=160 ;Pfad für den Datei-Requester
MaxLen fi$=64  ;Pfad für den Dateinamen

ratio=.5  ;Bildpunktverhältnis Hires Non-Interlace

For i=0 To 255
  qsin(i)=Sin(i*Pi/128)*ratio:qcos(i)=Cos(i*Pi/128)
Next

Screen 0,10,"IF I WERE A BLITZMAN"

MenuTitle 0,0,"PROJECT"
MenuItem 0,0,0,0,"LOAD MED      ","L"
MenuItem 0,0,0,1,"START MED     ","S"
MenuItem 0,0,0,2,"QUIT          ","Q"

g=0
For y=0 To 3:For x=0 To 4
  PropGadget 0,300+x*64,6+y*32,1,g,60,30:g+1
Next:Next

;Großes Fenster nach hinten
Window 0,0,10,640,246,$1000,"",1,2,0:SetMenu 0
;Editier-Fenster
Window 1,16,14,256,128,$1000,"",1,2:SetMenu 0

SetInt 5:PlayMed:End SetInt

Repeat
  ev.l=WaitEvent
  Select ev
    Case 8
      If EventWindow=1 Then Gosub editman
    Case $40
      If GadgetHit<20 Then Gosub selectframe
    Case $100
      If MenuHit=0 AND ItemHit=0 Then Gosub loadmed
      If MenuHit=0 AND ItemHit=1 Then StartMedModule 0
      If MenuHit=0 AND ItemHit=2 Then End
  End Select
Forever

.selectframe    ;weist *myman den aktuellen oder neuen
                ;Rahmen zu
  gman=GadgetHit
  gadgetx=300+(gman MOD 5)*64:gadgety=6+Int(gman/5)*32
  If *f(gman)=0
    AddItem segs():*f(gman)=segs():Restore mandata:
    readfigure{*f(gman)}
  EndIf
  *myman=*f(gman)
  Gosub refreshgman
  Return

.refreshgman    ;Neu zeichnen eines Rahmens
  Use Window 0
  WBox gadgetx+4,gadgety+2,gadgetx+55,gadgety+27,0
  size=.25:drawfigure {gadgetx+30,gadgety+16,0,*myman}
  Use Window 1:InnerCls:size=1:
    drawfigure {128,64,0,*myman}
  Return

.editman:    ;Überprüfen auf korrekten Mausklick
             ;und modifizieren des Winkels
  Use Window 1
  *part.seg=findpart{WMouseX,WMouseY,*myman}
  If *part<>0
    USEPATH *part
    wx=WMouseX:wa=\angle:Use Window 1
    While Joyb(0)<>0
      \angle=wa+wx-WMouseX:InnerCls:
        drawfigure {128,64,0,*myman}:VWait 10
    Wend
    Gosub refreshgman
  EndIf
  While Joyb(0)<>0 Wend
  Return

.loadmed:
  a$=FileRequest$("SELECT MED MODULE TO LOAD",pa$,fi$)
  If a$<>"" Then LoadMedModule 0,a$
  Return

.mandata:                ;Anzahl der Verzweigungen,
                         ;Winkel und Länge (13 Glieder)
  Data.w 3,0,0           ;Ursprung
    Data.w 1,32,40       ;rechter Oberschenkel
      Data.w 1,48,40     ;rechter Unterschenkel
        Data.w 0,-80,16  ;rechter Fuß
    Data.w 1,96,40       ;linker Oberschenkel
      Data.w 1,-48,40    ;linker Unterschenkel
        Data.w 0,80,16   ;linker Fuß
    Data.w 3,192,20      ;Rückgrat
      Data.w 1,76,40     ;rechter Oberarm
        Data.w 0,32,30   ;rechter Unterarm
      Data.w 1,192,40    ;linker Oberarm
        Data.w 0,32,30   ;linker Unterarm
      Data.w 0,128,-20   ;Kopf
