Program source code:
Program "Colony3"
# intro
ClrText
Locate 1, 1, "~~~~~~~~~~~~~~~~~~~~~"
Locate 1, 3, "~~~~~~~~~~~~~~~~~~~~~"
Locate 8, 2, "COLONY 3"
Locate 1, 6, "(C) Stefan Makowski , "
Locate 4, 7, " BCGSR"
Do
LpWhile Not GetKey
Norm
BG-None
0->\r
0->U~W
(-)1->Z
ViewWindow 1, 127, 0, 63, 1, 0
Lbl 0
ClrText
Locate 2, 2, "[1] New Game"
Locate 2, 4, "[2] Restore Savegame"
Locate 2, 6, "[3] keys"
Do
GetKey->A
LpWhile A <> 72 And A <> 62 And A <> 52
# show keys
If A = 52
Then ClrText
"[A~F] And [1~6]"
" Select Cell"
"[EXE] Confirm Input"
"[EXIT] EXIT"
"[->] Save Game"
"[F6] 'Emergency Save' (Save And Exit)"
Do
LpWhile Not GetKey
IfEnd
A = 52 => Goto 0
# restore savegame
If A = 62
Then Mat M->Mat L
1->W
Mat N[1, 1]->U
(-)Mat N[1, 2]->Z
Mat N[2, 1]->V
Dim Mat L
List Ans[1]->G
IfEnd
# start new game
If W = 0
Then ClrText
Locate 1, 1, "Confirm every input"
Locate 1, 2, "with [EXE]? [1\/0]"
Do
GetKey->B
LpWhile B <> 72 And B <> 71
B = 72 => 1->U
Do
ClrText
" "
Locate 1, 1, "Size (2(-)6)"
?->G
LpWhile G > 6 Or G < 2 Or G <> Int G
IfEnd
# display game field
.5(64 - 10G) + 1->E
For 1->C To G
10(5.8 + C - 1->A
E + 5(C - 1)->B
C = 1 => Orange Text B - 2, A + 16, "A"
C = 2 => Orange Text B - 2, A + 16, "B"
C = 3 => Orange Text B - 2, A + 16, "C"
C = 4 => Orange Text B - 2, A + 16, "D"
C = 5 => Orange Text B - 2, A + 16, "E"
C = 6 => Orange Text B - 2, A + 16, "F"
Next
For 1->C To G
For 1->D To G
10(5.8 + C - D->A
E + 5(C - 1) + 5(D - 1)->B
C = 1 => Orange Text B - 2, A - 4, D
F-Line A, B + 5, A + 5, B
F-Line A + 5, B, A + 10, B
F-Line A + 10, B, A + 15, B + 5
C = G => F-Line A + 15, B + 5, A + 10, B + 10
C = G And D <> G => F-Line A + 10, B + 10, A + 5, B + 10
D = G => F-Line A + 10, B + 10, A + 5, B + 10
D = G => F-Line A + 5, B + 10, A, B + 5
Next
Next
Green Text 1, 1, "CELL: "
Green Text 56, 1, "WAIT..."
Green Text 56, 1, "PLAYER: "
# create matrix
If W = 0
Then .Identity G->Mat L
For 1->H To G
For 1->I To G
0->F
H > 1 => F + 1*10^9 + 1*10^6->F
H > 1 And I > 1 => F + 1*10^9 + 1*10^5->F
I > 1 => F + 1*10^9 + 1*10^4->F
H < G => F + 1*10^9 + 1*10^3->F
H < G And I < G => F + 1*10^9 + 1*10^2->F
I < G => F + 1*10^9 + 1*10^1->F
F->Mat L[I, H]
Next
Next
IfEnd
# put "seeds" if restore savegame
If W = 1
Then 9->S
For 1->O To G
For 1->N To G
Goto S
Lbl P
Next
Next
0->W
IfEnd
# start of mainloop
Lbl 1
0->\th
V + 1->V
(-)Z->Z ; change player (player=1=>Z=1; player=2=>Z=-1)
Text 56, 32, Not (Z + 1) + 1 ; display player number
Lbl 2
0->H~I
Text 1, 21, " "
# ask for key/cell
Lbl 3
PxlOn 1, 2
U = 0 => H <> 0 And I <> 0 => Goto 8
Do
GetKey->M
LpWhile M = 0
Frac .1M = .6 => Goto 4 ; (A~F)
M = 31 => Goto 8 ; (confirm input with [exe])
M = 72 Or M = 62 Or M = 52 Or M = 73 Or M = 63 Or M = 53 => Goto 5
; (1~6)
M = 47 => Goto 6 ; (exit?)
M = 25 Or M = 29 => Goto 7 ; ("save" or "emergency save")
Goto 3
Lbl 4
6 - (.1M - 2.6)->H
If H > G
Then 0->H
Goto 3
IfEnd
H = 1 => Text 1, 22, "A"
H = 2 => Text 1, 22, "B"
H = 3 => Text 1, 22, "C"
H = 4 => Text 1, 22, "D"
H = 5 => Text 1, 22, "E"
H = 6 => Text 1, 22, "F"
Goto 3
Lbl 5
M = 72 => 1->I
M = 62 => 2->I
M = 52 => 3->I
M = 73 => 4->I
M = 63 => 5->I
M = 53 => 6->I
If I > G
Then 0->I
Goto 3
IfEnd
Text 1, 28, I
Goto 3
# exit?
Lbl 6
Text 50, 100, "EXIT?"
Text 57, 100, "[F6] OK"
PxlOn 1, 2
Do
GetKey->C
LpWhile C = 0
C = 29 => Goto Z
Text 50, 100, " "
Text 57, 100, " "
Goto 3
# save game
Lbl 7
Mat L->Mat M
.Identity 2->Mat N
U->Mat N[1, 1]
Z->Mat N[1, 2]
V->Mat N[2, 1]
M = 29 => Goto Z
ClrText
"Game saved!"
Goto 3
Lbl 8
H = 0 Or I = 0 => Goto 3 ; current cell is now Mat L[I,H]
# check if cell is already colonized by other player
0->\r
Int (10Frac (Mat L[I, H] / 1*10^9)) = 0 => Goto 9
; if cell is empty procede after Lbl 9
If (Mat L[I, H] < 0 And Z > 0) Or (Z < 0 And Mat L[I, H] > 0)
Then Text 1, 20, "ALREADY"
Text 8, 1, "COLONIZED\!"
PxlOn 1, 2
For 1->M To 200
Next
Text 8, 1, " "
Text 1, 20, " "
1->\r
IfEnd
Lbl 9
\r = 1 => Goto 2
Text 56, 32, "(-)"
# put one more seed into cell
Z(Abs (10Int (.1Mat L[I, H])) + Not (Z + 1) + 1->Mat L[I, H]
Abs (Int (10Frac (Mat L[I, H] / 1*10^9->L
10(5.8 + H - I)->A
E + 5(H - 1) + 5(I - 1)->B
L = 0 => 5->J
L = 0 Or L = 1 => 2->K
L = 1 => 8->J
L = 2 => 11->J
L = 2 => 4->K
L = 3 => 9->J
L = 3 Or L = 4 => 7->K
L = 4 => 6->J
L = 5 => 3->J
L = 5 => 5->K
PxlOn B + K, A + J
Z = 1 => PxlOn B + K + 1, A + J
Z = (-)1 => PxlOn B + K, A + J + 1
Z(Abs (Mat L[I, H]) + 1*10^8->Mat L[I, H] ; put one more seed in matrix
PxlOn 1, 2 ; (I hate to have to use that!!!)
# check for explosion
Lbl A
# ----------------------- ALL ONE LINE: -------------- (don't enter the \)
Abs (Int (10Frac (Mat L[I, H] / 1*10^10))) > \
(Abs (Int (10Frac (Mat L[I, H] / 1*10^9)))) => Goto T
# ------------------------------------------------------------------------
; procede after Lbl T if no explosion
Text 1, 100, "BANG\!"
PxlOn 1, 2
For 1->M To 100
Next
Text 1, 100, " "
PxlOn 1, 2
H->N
I->O
0->T
Goto R
Lbl B
# ----------------------- ALL ONE LINE: -------------- (don't enter the \)
(L + 1) > (Abs (Int (10Frac (Mat L[I, H] / 1*10^10)))) => \
(Abs (Int (10Frac (Mat L[I, H] / 1*10^10)))) - 1->L
# ------------------------------------------------------------------------
Abs (Mat L[I, H]) - (L + 1) * 10 ^ 8->Mat L[I, H]
H->N
I->O
0->S
Goto S
Lbl C
# ----------------------- ALL ONE LINE: -------------- (don't enter the \)
Abs (Int (10Frac (Mat L[I, H] / 1*10^9))) = 0 => \
10Int (.1Mat L[I, H]->Mat L[I, H]
# ------------------------------------------------------------------------
If Abs (Int (10Frac (Mat L[I, H] / 1*10^7))) = 1
Then H - 1->N
I->O
1->T
Goto R
Lbl D
# put one more seed in every bordering cell
Z(Abs (Mat L[O, N]) + 1*10^8)->Mat L[O, N]
1->S
Goto S
Lbl E
IfEnd
If Abs (Int (10Frac (Mat L[I, H] / 1*10^6))) = 1
Then H - 1->N
I - 1->O
2->T
Goto R
Lbl F
Z(Abs (Mat L[O, N]) + 1*10^8)->Mat L[O, N]
2->S
Goto S
Lbl G
IfEnd
If Abs (Int (10Frac (Mat L[I, H] / 1*10^5))) = 1
Then H->N
I - 1->O
3->T
Goto R
Lbl H
Z(Abs (Mat L[O, N]) + 1*10^8)->Mat L[O, N]
3->S
Goto S
Lbl I
IfEnd
If Abs (Int (10Frac (Mat L[I, H] / 1*10^4))) = 1
Then H + 1->N
I->O
4->T
Goto R
Lbl J
Z(Abs (Mat L[O, N]) + 1*10^8)->Mat L[O, N]
4->S
Goto S
Lbl K
IfEnd
If Abs (Int (10Frac (Mat L[I, H] / 1*10^3))) = 1
Then H + 1->N
I + 1->O
5->T
Goto R
Lbl L
Z(Abs (Mat L[O, N]) + 1*10^8)->Mat L[O, N]
5->S
Goto S
Lbl M
IfEnd
If Abs (Int (10Frac (Mat L[I, H] / 1*10^2))) = 1
Then H->N
I + 1->O
6->T
Goto R
Lbl N
Z(Abs (Mat L[O, N]) + 1*10^8)->Mat L[O, N]
6->S
Goto S
Lbl O
IfEnd
Goto T
Lbl R
# remove seeds from cell after explosion
# ----------------------- ALL ONE LINE: -------------- (don't enter the \)
T <> 0 => (Z = (-)1 And Mat L[O, N] < 0) Or \
(Z = 1 And Mat L[O, N] > 0) => Goto Q
# ------------------------------------------------------------------------
Abs (Int (10Frac (Mat L[O, N] / 1*10^9->C
10(5.8 + N - O)->A
E + 5(N - 1) + 5(O - 1)->B
For 0->L To (C - 1)
L = 0 => 5->J
L = 0 Or L = 1 => 2->K
L = 1 => 8->J
L = 2 => 11->J
L = 2 => 4->K
L = 3 => 9->J
L = 3 Or L = 4 => 7->K
L = 4 => 6->J
L = 5 => 3->J
L = 5 => 5->K
PxlOff B + K, A + J
PxlOff B + K + 1, A + J
PxlOff B + K, A + J + 1
Next
PxlOn 1, 2
Lbl Q
T = 0 => Goto B
T = 1 => Goto D
T = 2 => Goto F
T = 3 => Goto H
T = 4 => Goto J
T = 5 => Goto L
T = 6 => Goto N
# put new seeds in cell after explosion
Lbl S
Abs (Int (10Frac (Mat L[O, N] / 1*10^9->M
10(5.8 + N - O->A
E + 5(N - 1) + 5(O - 1)->B
W = 0 => Z(Abs (10Int (.1Mat L[O, N])) + Not (Z + 1) + 1->Mat L[O, N]
For 0->L To (M - 1)
L = 0 => 5->J
L = 0 Or L = 1 => 2->K
L = 1 => 8->J
L = 2 => 11->J
L = 2 => 4->K
L = 3 => 9->J
L = 3 Or L = 4 => 7->K
L = 4 => 6->J
L = 5 => 3->J
L = 5 => 5->K
PxlOn B + K, A + J
Mat L[O, N] > 0 => PxlOn B + K + 1, A + J
Mat L[O, N] < 0 => PxlOn B + K, A + J + 1
Next
PxlOn 1, 2
# ----------------------- ALL ONE LINE: -------------- (don't enter the \)
If (Abs (Int (10Frac (Mat L[O, N] / 1*10^10)))) <=
(Abs (Int (10Frac (Mat L[O, N] / 1*10^9))))
# ------------------------------------------------------------------------
Then 1 + \th->\th
Abs (Mat L[O, N]) + 1*10^7->Mat L[O, N]
IfEnd
S = 0 => Goto C
S = 1 => Goto E
S = 2 => Goto G
S = 3 => Goto I
S = 4 => Goto K
S = 5 => Goto M
S = 6 => Goto O
S = 9 => Goto P
Lbl T
# check if somebody has won
V <= 2 => Goto X
0->C~D
For 1->A To G
For 1->B To G
Abs (Int (10Frac (Mat L[B, A] / 10->F
F = 1 => C + 1->C
F = 2 => D + 1->D
C >= 1 And D >= 1 => Break
Next
C >= 1 And D >= 1 => Break
Next
C >= 1 And D >= 1 => Goto X
Goto Y
# check for chain reactions
Lbl X
\th = 0 => Goto 1
0->Q
For 1->D To G
For 1->C To G
If Abs (Int (10Frac (Mat L[D, C] / 1*10^8))) >= 1
Then \th - 1->\th
1->Q ; "chain reaction indicator"
(Abs (Mat L[D, C]) - 1*10^7)->Mat L[D, C]
C->H
D->I
Break
IfEnd
Next
Q = 1 => Break
Next
Q = 1 => Goto A ; goto "check for explosion"
Q = 0 => Goto 1 ; goto start of main routine
# display winner
Lbl Y
Text 56, 32, Not (Z + 1) + 1
Text 56, 38, "WINS"
Text 56, 100, "[EXE].."_
# end of game, delete matrix, reset ViewWindow
Lbl Z
ViewWindow (-)6.3, 6.3, 1, (-)3.1, 3.1, 1
[[0]]->Mat L
ClrText
Cls
" "
M = 29 => 8sin 156 ; if emergency exit then display "alibi"
|