'ProgramMode:RUN
' Triangle Field CPC#26 v0.95
'  for C.Basic
' (c) 2020 sentaro21
'
'#G1M
'#CBINT
'#_Mat _1
RefrshCtrl 1
Wait 0
ClrMat 
{10,100}->Dim Mat S:' Hi-Score data
For 1->m To 10
 For 1->n To 50
  9999->S[m,n]
 Next
Next

Gosub L:' Load Hi-Score

0->A~Z
0->a~z
128/2->G:' X center
28->H:' Y canter

0->M:'game Mode 0:Lap 1:Score

9->N
N->Dim D:' Y distance
N->Dim R:' X distance
N->Dim W:' Gate width
N->Dim C:' type

3->Dim X
3->Dim Y
9->Dim A
9->Dim B

1->m:' gate mode
1->n:' machine mode

'--Start

ScreenG

0->S:' score

100->R
'
1->O:' demo
1->J

Gosub F:' field select
Gosub P:' gate select
Gosub M:' machine select
Gosub I:' gate init
B6->D:' damage
(-)1500->A6:' view angle 
(-)10000+A6->A7

Ticks->t
0-><r>
'
'---main game loop
Lbl 1
_ClrVram
_Rectangle -13,H,141,H+(Theta<>0),0,0,1,,(-)Theta,G,H

F/100->Theta
For 1->I To N
 D[I]>1=>Goto 2
 E+50->D[I]
 d-25->d
 d<1000=>1000->d
 Isz z
 z>=120=>1->z
 p=>(RanInt#((-)L,L)/2->R[I] Goto 2
 z<14=>(List 2[z]*(A3/70))->R[I] Goto 2
 z<17=>0->R[I] Goto 2
 z<27=>(List 1[z-16]*(d/95))->R[I] Goto 2
 z<30=>0->R[I] Goto 2
 z<48=>(List 3[z-29]*(A3/30))->R[I] Goto 2
 z<61=>0->R[I] Goto 2
 z=61=>RanInt#((-)d,d)->h
 z<74=>((-)List 2[z-60]*(A3/70))->R[I] Goto 2
 z<77=>0->R[I] Goto 2
 z<87=>((-)List 1[z-76]*(d/95))->R[I] Goto 2
 z<90=>b->R[I] Goto 2
 z<108=>((-)List 3[z-89]*(A3/30))->R[I] Goto 2
 0->R[I]
 
 Lbl 2
 D[I]->A
 R[I]->B
 R/20->r
 R<10=>Goto 3
 A>(r+1)=>Goto 3
 T>(-)2000=>Goto 3
 O=>Goto 5
 x-B->a
 d+U->c
 Switch M
  Case 0
   Abs a<d=>S-1->SGoto 5
   Abs a>c=>Goto 5
   Break
  Case 1
   Abs a<d=>S+(((R/10)*(9000-d))/(2000+(500*(p>0->S Goto 5
   Abs a>c=>S-((Abs a-c)/(50-(25*(p>0->S Goto 5
 SwitchEnd
 Abs (a-c->b
 b<U=>Goto 4
 Abs (a+c->b
 b>=U=>Goto 5
 Lbl 4
 w+((R*b)/U->w
 w<=0=>0->w
 w>500=>500->w
 R-w->R:R<(-)100=>(-)100->R
 M=>D-w->D
 D<=0=>(-)1->D
 
 Lbl 3
 A*2->b
 B-x->a
 G+((a-d)/b->u
 u-(U/b->X1
 u->X2:u->X3
 H+((y+(16000+A6))/b->v
 v-(V/b->Y3
 v->Y1:v->Y2
 A<f=>_Polygon &Mat X,&Mat Y,3,1,,(-)Theta,G,H
 
 G+((a+d)/b->u
 u+(U/b->X1
 u->X2:u->X3
 A<f=>_Polygon &Mat X,&Mat Y,3,1,,(-)Theta,G,H
 
 Lbl 5
 A-r->D[I]
Next

g=0=>R>B3=>R-(B4*2->R
R+B4->R
R>B8=>B8->R

F>0=>F-B7->F
F<0=>F+B7->F
Abs F>=B7=>x+F->x

y+T->y
y<A7=>A7->y
T>(-)2000=>T-200->T

M=0=>Text 1,1,Sprintf("Best-Lap %d",%S[m,j]),O:
M=0=>Text 1,88,Sprintf("Lap %d",%C),O:
O=0=>M=0=>Text 4,62,Sprintf("%2d",%S),O:
M=>Text 1,1,Sprintf("Hi-Score %d",%S[m,j]),O:
M=>Text 1,84,Sprintf("Score %d",%S),O:

If O=0
 D/30->a
 M=>a=>O=0=>_Rectangle 64-a,8,64+a,8,0,0,1
 (R-B3)/6->a
 a>1=>_Rectangle 64-a,11,64+a,11,0,0,3
 w/12->a
 a>0=>_Rectangle 64-a,13,64+a,14,0,0,1
 
 If M
  S>S[m,j]=>S->S[m,j]
  If D<0
   _DispVram
   TicksWait 128
   
   0->D
   50->R
   0->Theta
   0->F
   30->O:'game over
  IfEnd
 Else 
  If (S=0) Or (R<=B7
   _DispVram
   M=>TicksWait 64
   TicksWait 64
   0->D
   50->R
   0->Theta
   0->F
   30->O:'game over
   S=0=>C<S[m,j]=>C->S[m,j]
  IfEnd
 IfEnd
 
 KeyRow(8)->A
 KeyRow(7)->B
 y>A6=>A&(-)3->A
 If A&4
  F-B2->F
  R>B3=>R-(B4*2->R
 ElseIf B&2
  F+B2->F
  R>B3=>R-(B4*2->R
 IfEnd
 F<(-)B1=>(-)B1->F
 F>B1=>B1->F
 If B&64
  If D>10
   1500->T
   D-10->D
  IfEnd
 IfEnd
 A&32=>1->g
 If A&64
  R-B5->R
  R<0=>(-)1->D
  0->g
 IfEnd
 
ElseIf O=2
 Text 11,55,"Ready"
 M=0=>Text 40,34,"Target Lap "+ToStr(B9),O
 TicksWait 128
 Text 11,55,"Go Char!Char!Char!  "
 TicksWait 64
 0->O
Else 
 1400->f
 x>0=>x-100->x
 x<0=>x+100->x
 Text 8,26,"Triangle Field v0.95",O:
 If O>5
  If M=0 And S=0 And C<=B9
   Text 14,26,"****CongratulationChar!****",O:
  Else 
   Text 14,30,"--- Game Over ---":
  IfEnd
  O=30=>_DispVramTicksWait 128
 IfEnd
 '  _Text _23,1,"[SHIFT]:Brake",O:
 '  _Text _29,1,"[OPTN]:Accel",O:
 Text 37,14,"Level select[_#E692_][_#E693_] "+ToStr(m),O:
 Text 43,14,"Gate  select[_#E690_][_#E691_] "+ToStr(n),O:
 p=0=>Text 43,97,"Fixed",O:
 p=>Text 43,97,"Random"+ToStr(p),O:
 Text 52,14," Hit [F1] key to Start",O:
 Text 58,14," Hit [F3] key to Save Hi-Score",O:
 Getkey->A
 O>15=>0->A
 If A<>k
  Switch A
   Case 79:'F1
    Gosub F
    Gosub M
    Gosub P
    Gosub I
    2->O
    Break
   Case 28:'UP
    If m<=2
     m+1->m
    Else 
     M=>S[m,j]>=10000=>m+(m<5)->m
     M=0=>S[m,j]<=B9=>m+(m<5)->m
    IfEnd
    Gosub M
    Gosub F
    Break
   Case 37:'DW
    m-(m>1)->m
    Gosub M
    Gosub F
    R>B3=>B3->R
    Break
   Case 27:'RIGHT
    n+(n<5)->n
    Gosub P
    Break
   Case 38:'LEFT
    n-(n>1)->n
    Gosub P
    Break
   Case 39:'F5
    A6>(-)2500=>A6-500->A6
    Break
   Case 29:'F6
    A6<5000=>A6+500->A6
    Break
   Case 48:'MENU
    1-M->M
    0->S
    Break
   Case 59:'F3
    Gosub S:' Save Hi-Score
    Break
   Case 47:'EXIT
    If PopUpWin(10,"EXIT?")
     Gosub S:' Save Hi-Score
     Screen.T
     Stop
    IfEnd
    Break
   Case 71:0->p:Break
   Case 72:1->p:Break
   Case 62:2->p:Break
   Case 52:3->p:Break
   Case 73:4->p:Break
   Case 63:5->p:Break
   Case 53:6->p:Break
   Case 74:7->p:Break
   Case 64:8->p:Break
   Case 54:9->p:Break
  SwitchEnd
  A->k
  n+(5*p)+(50*M)->j
 IfEnd
 O-(O>5)->O
 (-)10000+A6->A7
IfEnd

w-(2*(w>0->w
w<0=>0->w
O=0=>Isz C

If Ticks-t<=128
 Isz <r>
Else 
 <r>->s
 Ticks->t
 0-><r>
IfEnd
Text 58,0,Sprintf("%d",s):

_DispVram
KeyRow(8)
KeyRow(7)
TicksWait (-)4
Goto 1
'---main game loop end



'
' initialize
Lbl I
20->Dim List 1
20->Dim List 2
20->Dim List 3

12000->Z:(-)Z->y
20->P:40->Q
2400->E

Intg (V/2->K
Intg (W/2->L

For 1->I To N
 I*(E/N)->D[I]
 0->R[I]
 A3->W[I]
Next

Deg
0->A
For 1->I To Dim List 1
 #cos A%*100->B%
 B->List 1[I]
 A+180->A
Next
0->A
For 1->I To Dim List 2
 #sin A%*100->B%
 B->List 2[I]
 A+90->A
Next
10->A
For 1->I To Dim List 3
 #sin A%*100->B%
 B->List 3[I]
 A+40->A
Next

1->J

0->Theta
0-><r>
B6->D
A3->d
0->x
0->S
B7->R
(-)2000->T
1800->f
0->w
0->q
1->h
0->z
0->C
M=0=>60->S
n+(5*p)+(50*M)->j
1->g

Switch p
 Case 1:Ran#17:Break
 Case 2:Ran#2:Break
 Case 3:Ran#19:Break
 Case 4:Ran#24:Break
 Case 5:Ran#25:Break
 Case 6:Ran#34:Break
 Case 7:Ran#13:Break
 Case 8:Ran#8:Break
 Default :Ran#12:Break
SwitchEnd
Return 


' initialize field
Lbl F
Return 


' initialize gate
Lbl P

Switch n
 Case 1
  4000->A1:' gate width
  8000->A2:' gate height
  8000->A3:' gate holizontal interval
  Break
  
 Case 2
  6000->A1:' gate width
  8000->A2:' gate height
  8000->A3:' gate holizontal interval
  Break
  
 Case 3
  9000->A1:' gate width
  8000->A2:' gate height
  8000->A3:' gate holizontal interval
  Break
  
 Case 4
  13500->A1:' gate width
  8000->A2:' gate height
  8000->A3:' gate holizontal interval
  Break
  
 Case 5
  13500->A1:' gate width
  8000->A2:' gate height
  5000->A3:' gate holizontal interval
  Break
  
SwitchEnd

32000->A4:' rand
10000->A5:' rand2

A1->U:' gate width
A2->V:' gate height
A3->d:' gate H interval
A4->W
A4/2->L
Return 


'
' machine initialize
Lbl M
Switch m
 Case 1
  1200->B1:' handling1
  160->B2:' handling2
  40->B7:' handling3
  200->B3:' Maxspeed
  5->B4:' accell
  10->B5:' brake
  750->B6:' shield
  1300->B9:' 
  p=>1280->B9
  Break
  
 Case 2
  1500->B1:' handling1
  200->B2:' handling2
  50->B7:' handling3
  266->B3:' Maxspeed
  7->B4:' accell
  15->B5:' brake
  1000->B6:' shield
  1000->B9:' 
  p=>985->B9
  Break
  
 Case 3
  2000->B1:' handling1
  256->B2:' handling2
  64->B7:' handling3
  332->B3:' Maxspeed
  8->B4:' accell
  15->B5:' brake
  1000->B6:' shield
  800->B9:' 
  p=>770->B9
  Break
  
 Case 4
  2000->B1:' handling1
  320->B2:' handling2
  80->B7:' handling3
  400->B3:' Maxspeed
  10->B4:' accell
  18->B5:' brake
  1000->B6:' shield
  675->B9:' 
  p=>640->B9
  Break
  
 Case 5
  2000->B1:' handling1
  400->B2:' handling2
  100->B7:' handling3
  500->B3:' Maxspeed
  12->B4:' accell
  20->B5:' brake
  1000->B6:' shield
  560->B9:' 
  p=>520->B9
  Break
  
SwitchEnd
B3*135/100->B8
Return 

' 
' Load Hi-Score
Lbl L
"TRIFLDFX"->Str 1
If IsExist(Str 1)
 Load(Str 1)->Mat S
IfEnd
Return 

' Save Hi-Score
Lbl S
Save Str 1,Mat S
Return 
