'''''''''''''''''''''''''''''''''
' W O I M A  1.0 (J-J Oikkonen) '
' Freeware                      '
' PELIDATA. pelin perus toimet  '
'''''''''''''''''''''''''''''''''
'$INCLUDE: 'woima.bi'
DEFINT A-Z
DECLARE FUNCTION UkkoTila (kyky$, snum)
DECLARE FUNCTION TileTyyppi (tile AS STRING)
DECLARE FUNCTION MikaTile$ (tilenum)
DECLARE FUNCTION MikaLiitto$ (liitto)
DECLARE FUNCTION MikaSotilas$ (liitto, hahmo)
DECLARE FUNCTION SotilaanTyyppi (hahmo$)
DECLARE FUNCTION LataaTile (tile$, hae$, snum)
DECLARE SUB Hyvaksy (x, xx, y, yy)
DECLARE SUB LueNappi (key$, mode$)
DECLARE SUB LoppuIkkuna ()
DECLARE SUB NaytaLoppuPisteet (kenen%)
DECLARE SUB AloitaWoima ()
DECLARE SUB PiirraTile (tilenum, sijaintiX, sijaintiY)
DECLARE SUB VaihdaPaiva ()
DECLARE SUB LuoTakauma (mika)
DECLARE SUB LuoRandomiKartta (kartta)
DECLARE SUB LuoPikapeli ()
DECLARE SUB OletusAlotus ()
DECLARE SUB UusiKampanja ()
DECLARE SUB Valoaste (paljonko)
DECLARE SUB AvaaTiedosto (tiednimi$, save)
DECLARE SUB Taistelu ()
DECLARE SUB PiirraTaulu (bx, by, bxM, byM, tyyli, vari)
DECLARE SUB Delay (Seconds!)
DECLARE SUB HiiriRange (X1, Y1, X2, Y2)
DECLARE SUB HiiriStatus (VH, OH, XHiiri, YHiiri, hx, hy)
DECLARE SUB HiiriHide ()
DECLARE SUB HiiriDriver (ax, bx, CX, dx)
DECLARE SUB HiiriShow ()
DECLARE FUNCTION HiiriInit ()
DECLARE SUB VuoronVaihto ()
DECLARE SUB RauhaTila ()
DECLARE SUB PiirraNappi (boxX, boxY, boxMx, boxMy, tila AS STRING)
DECLARE FUNCTION Fixed$ (num)
DECLARE SUB MiniMap (mapnum, xx, yy)
DECLARE SUB Font (Fonti$, col, tx, TY, koko, script$)
DECLARE SUB LoadPal (Pal$)
DECLARE SUB LoadTiles ()
DECLARE SUB Loadfont ()
DECLARE SUB LoadInits ()
'' Maaritetaan kaikille yhteiset taulukot
DIM SHARED FBuff(0) AS STRING * 8960
DIM SHARED map(1 TO 6, 19, 11) AS INTEGER
DIM SHARED hahmo(1 TO 6) AS tiedot
DIM SHARED vastus(1 TO 2) AS vastustajat
DIM SHARED Ukko(40) AS sotilaat
DIM SHARED CrNum(1 TO 2) AS INTEGER  '' Olioiden lukumr kummallakin puolen
DIM SHARED oliolinkit(1 TO 2, 1 TO 20) AS INTEGER  '' Linkit olioihin kummallakin puolen (helpottaa koodausta)
'' Liikuttu-taulukko on indeksi miinuksille, kattaa kaikki ukot.
'' -> Ukko().toimintoja
DIM SHARED Kaytetty(40) AS INTEGER
'' Varataan tarvittava tila graffoille
DIM SHARED tempget(12000)   ' bufferi
DIM SHARED reuna1(50), reuna2(50)
DIM SHARED reuna3(50), reuna4(50), reuna5(50)
DIM SHARED kulma(50)
DIM SHARED tempbox(2200)
DIM SHARED face(210)
DIM SHARED face2(210)
DIM SHARED face3(210)
DIM SHARED face4(210)
DIM SHARED ruoho(129), ruoho2(129)
DIM SHARED tiili(209), tiili2(129)
DIM SHARED miekkam(129), miekka(129)
DIM SHARED leipa(129), leipam(129)
DIM SHARED raham(129), raha(129)
DIM SHARED ritari(129), ritarim(129)
DIM SHARED jousi(129), jousim(129)
DIM SHARED soturi(129), soturim(129)
DIM SHARED mies(129), miesm(129)
DIM SHARED maahinen(129), maahinenm(129)
DIM SHARED torni(129), tornim(129)
DIM SHARED pelto(129), tila(129), tilaM(129)
DIM SHARED kilpi(129), kilpim(129)
DIM SHARED lato(129), latoM(129)
DIM SHARED raivo(129), raivoM(129)
DIM SHARED aita(129), aitaM(129)
DIM SHARED tonttu(129), tonttuM(129)
DIM SHARED Puu1(129), PuuM1(129)
DIM SHARED Puu2(129), PuuM2(129)
DIM SHARED juntti(129), junttiM(129)
DIM SHARED pelaaja1(50), pelaaja2(50)
DIM SHARED karja(129), karja2(129)
DIM SHARED ketju(119), ketju2(119)
DIM SHARED wood(129), wood2(129)
DIM SHARED veri(30), veriM(30)
DIM SHARED sankari(30), sankariM(30)
DIM SHARED keihas(129), keihas2(129)
DIM SHARED seivas(129), seivas2(129)
DIM SHARED susi(129), susi2(129)
DIM SHARED kata(260)
DIM SHARED korostus(129)
DIM SHARED kysym(129), kysym2(129)
DIM SHARED pikapeli
ON ERROR GOTO Virheenkasittely
RANDOMIZE TIMER
'''''aseta polku:
'polku$ = "c:\pelit\woima\" ''"c:\qbasic\i"
hiirta = TRUE          ''type: TRUE / FALSE (ei hiirt)
''''''''''''''''
SCREEN 13

hiiri$ = SPACE$(57)
FOR i = 1 TO 57
  READ key$
  h$ = CHR$(VAL("&H" + key$))
  MID$(hiiri$, i, 1) = h$
NEXT i
DATA 55,89,E5,8B,5E,0C,8B,07,50,8B,5E,0A,8B,07,50,8B
DATA 5E,08,8B,0F,8B,5E,06,8B,17,5B,58,1E,07,CD,33,53
DATA 8B,5E,0C,89,07,58,8B,5E,0A,89,07,8B,5E,08,89,0F
DATA 8B,5E,06,89,17,5D,CA,08,00
IF hiirta AND HiiriInit = 0 THEN
        PRINT "Hiirt ei lytynyt!"
        PRINT "Tarkista hiiren kiinnitykset.": SLEEP: hiirta = FALSE: CLOSE #1: END
END IF

 Loadfont
 LoadTiles
 LoadPal "rpgdk.pal"
 Valoaste (1)

 AloitaWoima
 
 IF pikapeli THEN LuoPikapeli

 DO
  CLS
  IF NOT finished THEN RauhaTila
  IF NOT finished THEN Taistelu
 LOOP UNTIL finished

 IF voitto > 0 THEN LoppuIkkuna

 CLS
 SYSTEM

Virheenkasittely:
WIDTH 80, 25
COLOR 7
PRINT "Virhe: "; ERR
SELECT CASE ERR
CASE 53                                                         'File not found
  PRINT "Yht tai useampaa pelin tiedostoa ei lytynyt."
CASE 71                                                         'Disk not ready
  PRINT "Levyke asemassa ei ole levykett."
  PRINT "Aseta levyke ja kynnist uudelleen!"
CASE 9                                                          'Subscript out of range
  PRINT "Virheen rivi:"; ERL
  PRINT "Subscript out of range!"
  PRINT "Muuttuja on ylittanyt sille asetetut rajat!"
CASE 5                                                          'Illegal function call
  PRINT "Virheen rivi:"; ERL
  PRINT "Illegal function call!"
  PRINT "Virheellinen kskytys!"
CASE ELSE
  PRINT "Virheen rivi:"; ERL
  PRINT "Odottamaton virhe. Ohjelman suoritus lopetettu."
  PRINT "Asiasta voit ilmoittaa shkpostiosoitteeseen"
  PRINT "herponen@luukku.com"
END SELECT
SYSTEM
RETURN

REM $DYNAMIC
SUB AloitaWoima
 '' Subi sislt posin pelk grafiikan luontia alkuvalikkoon sek
 '' pienen nppinkomentotulkin menuun
 CLS
 PiirraTaulu 8, 2, 306, 185, 1, 49
 FOR x = 1 TO 18 STEP 1
  FOR y = 1 TO 14 STEP 1
    RANDOMIZE TIMER
    PUT (x * 16, y * 12 - 2), wood, PSET
  NEXT
 NEXT

 FOR x = 2 TO 3 STEP 1
  FOR y = 6 TO 11 STEP 1
    RANDOMIZE TIMER
    PUT (x * 16, y * 12), ketju2, AND
    PUT (x * 16, y * 12), ketju, OR
    PUT (x * 16 + 210, y * 12), ketju2, AND
    PUT (x * 16 + 210, y * 12), ketju, OR
  NEXT
 NEXT

 FOR x = 1 TO 18 STEP 1
   PUT (x * 16, 14 * 12), wood2, PSET
 NEXT

 FOR x = 0 TO 2
  LINE (28, 69 + x)-(66, 69 + x), 22 + x
  LINE (29 + 209, 69 + x)-(74 + 202, 69 + x), 22 + x
 NEXT
 
 PUT (38, 25), miesm, AND
 PUT (38, 25), mies, OR
 PUT (260, 25), miesm, AND
 PUT (260, 25), mies, OR
 PUT (40, y * 12), ketju2, AND
 PUT (40, y * 12), ketju, OR
 PUT (3 * 16 + 202, y * 12), ketju2, AND
 PUT (3 * 16 + 202, y * 12), ketju, OR

 Font " WOIMA", 49, 36, 24, 6, "" '49
 Font " WOIMA", 49, 41, 20, 6, "shade"

menu:
 IF pikapeli THEN EXIT SUB
 PiirraTaulu 85, 60, 217, 152, 0, 49
 PiirraNappi 108, 73, 200, 83, ""
  Font " Uusi peli", 46, 121, 74, 1, "shade"
 PiirraNappi 108, 93, 200, 103, ""
  Font "Lataa vanha", 46, 121, 94, 1, "shade"
 PiirraNappi 108, 113, 200, 123, ""
  Font " Pikapeli", 46, 126, 114, 1, "shade"
 PiirraNappi 108, 133, 200, 143, ""
  Font "Sulje peli", 46, 125, 134, 1, "shade"

 Delay .3
 DO
  HiiriShow
  key$ = INKEY$
  HiiriStatus VH, OH, MX, MY, hx, hy
  IF key$ = "v" THEN Valoaste (1)
  IF key$ = "q" OR key$ = CHR$(27) THEN CLS : finished = TRUE: EXIT SUB
  IF VH <> 0 THEN
   HiiriHide
   IF MX >= 216 AND MX <= 400 AND MY >= 73 AND MY <= 83 THEN
        UusiKampanja
        IF vuorossa > 0 THEN
         EXIT SUB
        ELSE
         AloitaWoima
         EXIT SUB
        END IF
   ELSEIF MX >= 216 AND MX <= 400 AND MY >= 133 AND MY <= 143 THEN
        HiiriHide
        CLS : finished = TRUE: EXIT SUB              ': END
   ELSEIF MX >= 216 AND MX <= 400 AND MY >= 93 AND MY <= 103 THEN
        CALL AvaaTiedosto("peli1.dat", 0)
        key$ = "qu"
   ELSEIF MX >= 216 AND MX <= 400 AND MY >= 113 AND MY <= 123 THEN
        PiirraTaulu 85, 60, 217, 152, 0, 49
        Font " PIKAPELI!", 47, 121, 71, 1, "shade"
        Font "Pelaaja VS...", 43, 121, 78, 1, ""
        PiirraNappi 108, 93, 200, 103, ""
        Font " Tietokone", 46, 121, 94, 1, "shade"
        PiirraNappi 108, 113, 200, 123, ""
        Font " Pelaaja", 46, 126, 114, 1, "shade"
        PiirraNappi 108, 133, 200, 143, ""
        Font " Peruuta", 46, 125, 134, 1, "shade"
        HiiriShow
        Delay .2
        DO
        key$ = INKEY$
        HiiriStatus VH, OH, MX, MY, hx, hy
        IF VH <> 0 THEN
           IF MX >= 216 AND MX <= 400 AND MY >= 93 AND MY <= 103 THEN
              OletusAlotus
              hahmo(INT(RND * 2) + 1).pelaaja = "Tietokone"
              pikapeli = TRUE
              key$ = "q"
           ELSEIF MX >= 216 AND MX <= 400 AND MY >= 113 AND MY <= 123 THEN
              OletusAlotus
              hahmo(2).pelaaja = "Pelaaja 2"
              pikapeli = TRUE
              key$ = "q"
           ELSEIF MX >= 216 AND MX <= 400 AND MY >= 135 AND MY <= 143 THEN
              key$ = "q"
           END IF
        END IF
        LOOP UNTIL key$ = "q" OR key$ = CHR$(27): HiiriHide: Delay .3: GOTO menu
   END IF
  Delay .1
  END IF
 CIRCLE (10, 10), h, 0
 LOOP UNTIL key$ = "qu"
 CLS
 HiiriHide
END SUB

SUB AvaaTiedosto (tiednimi$, save)
''Ladataan liittouma(t)
''tiednimi$ = avattavan tiedoston nimi
''     save = hahmo- taulukko johonka tiedot asetetaan. (0 = kaikki)!
DIM taul
 OPEN tiednimi$ FOR BINARY AS #1
  SELECT CASE save
   CASE 0
        '' Ladataan kaikki hahmot
        FOR taul = 1 TO 6
         GOSUB lue
        NEXT
        '' Jos pelaaja on lahettanyt miehia ennen savea
        '' tallennetaan varmuudeksi vastustaja tiedot
        FOR taul = 1 TO 2
         GET #1, , vastus(taul).vastus
         GET #1, , vastus(taul).jouset
         GET #1, , vastus(taul).heitto
         GET #1, , vastus(taul).miekat
        NEXT
       
        GET #1, , day
        GET #1, , vuorossa
        GET #1, , klassinen
  END SELECT
 CLOSE #1
EXIT SUB

lue:
 GET #1, , hahmo(taul).pelaaja
 GET #1, , hahmo(taul).liittouma
 GET #1, , hahmo(taul).taito
 GET #1, , hahmo(taul).meleeukot
 GET #1, , hahmo(taul).ampujat
 GET #1, , hahmo(taul).heitto
 GET #1, , hahmo(taul).johtaja
 GET #1, , hahmo(taul).moraali
 GET #1, , hahmo(taul).maine
 GET #1, , hahmo(taul).voitot
 GET #1, , hahmo(taul).haviot
 GET #1, , hahmo(taul).rahaa
 GET #1, , hahmo(taul).tiloja
 GET #1, , hahmo(taul).tornit
 GET #1, , hahmo(taul).ladot
 GET #1, , hahmo(taul).aidat
 GET #1, , hahmo(taul).karjat
 GET #1, , hahmo(taul).ruokaa
 GET #1, , hahmo(taul).pisteet
 FOR y = 1 TO 11
  FOR x = 1 TO 19
   GET #1, , map(taul, x, y)
  NEXT
 NEXT
RETURN
END SUB

SUB Delay (Seconds!)
'----- Pieni viivastys!
    CurrentTime! = TIMER
    WHILE CurrentTime! + Seconds! > TIMER
    WEND
END SUB

FUNCTION Fixed$ (num)
DEFINT A-Z
Fixed$ = LTRIM$(RTRIM$(STR$(num)))

END FUNCTION

SUB Font (Fonti$, col, tx, TY, koko, script$)
DEF SEG = VARSEG(FBuff(0))
FOR c = 1 TO LEN(Fonti$)
  cl = 0
   Ptr = 35 * (ASC(MID$(Fonti$, c, 1)))
   FOR y = 0 TO 6
    IF script$ = "shade" THEN cl = cl + 1
      FOR x = 0 TO 4
         Clr = PEEK(VARPTR(FBuff(0)) + Ptr)
         Ptr = Ptr + 1
         IF koko > 1 AND Clr THEN LINE (x * koko - koko + tx, y * koko - koko + TY)-(x * koko + tx, y * koko + TY), col - cl, BF
         IF koko <= 1 AND Clr THEN PSET (x + tx, y + TY + 1), col - cl
      NEXT x
   NEXT y
   tx = tx + (koko * 6)
   IF script$ = "scroll" THEN PLAY "p50"
NEXT c
END SUB

SUB HiiriDriver (ax, bx, CX, dx)
  DEF SEG = VARSEG(hiiri$)
  hiiri = SADD(hiiri$)
  CALL Absolute(ax, bx, CX, dx, hiiri)
END SUB

SUB HiiriHide
IF hiirta THEN
 ax = 2
 HiiriDriver ax, 0, 0, 0
END IF
END SUB

FUNCTION HiiriInit
  ax = 0
  HiiriDriver ax, 0, 0, 0
  HiiriInit = ax
END FUNCTION

SUB HiiriRange (X1, Y1, X2, Y2)
IF hiirta THEN
 HiiriDriver 7, 0, X1, X2
 HiiriDriver 8, 0, Y1, Y2
END IF
END SUB

SUB HiiriShow
IF hiirta THEN
  ax = 1
  HiiriDriver ax, 0, 0, 0
END IF
END SUB

SUB HiiriStatus (VH, OH, XHiiri, YHiiri, hx, hy)
'' tutkitaan hiiren sijainti ja nappien tilat
IF hiirta THEN
  ax = 3
  HiiriDriver ax, bx, CX, dx
  VH = ((bx AND 1) <> 0)
  OH = ((bx AND 2) <> 0)
  XHiiri = CX
  YHiiri = dx

   hx = INT((XHiiri + 18) / 32)
   hy = INT((YHiiri + -1) / 16) + 1
END IF
END SUB

FUNCTION LataaTile (tile$, hae$, snum)
'' Functio joka palauttaa annetun tilen haetun (kyvyn) luvun
''
 IF RTRIM$(tile$) = "Tila" THEN
     IF hae$ = "omist" THEN LataaTile = hahmo(vuorossa).tiloja  'Omistuksessa
     IF hae$ = "kartta" THEN LataaTile = 3                      'Maxm. kartalla
     IF hae$ = "yht" THEN LataaTile = 100                       'Maxm. yht.
     IF hae$ = "pb" THEN LataaTile = 4                          'Pb - (Puolustus bonus)
     IF hae$ = "koko" THEN LataaTile = 2                        'rakennuksen koko (ruutua)
     IF hae$ = "hinta" THEN LataaTile = 80 + (hahmo(vuorossa).tiloja * 20)'hinta
 ELSEIF RTRIM$(tile$) = "Torni" THEN
     IF hae$ = "omist" THEN LataaTile = hahmo(vuorossa).tornit  'Omistuksessa
     IF hae$ = "kartta" THEN LataaTile = 3                      'Maxm. kartalla
     IF hae$ = "yht" THEN LataaTile = 6                         'Maxm. yht.
     IF hae$ = "pb" THEN LataaTile = 4                          'Pb - (Puolustus bonus)
     IF hae$ = "koko" THEN LataaTile = 1                        'rakennuksen koko (ruutua)
     IF hae$ = "hinta" THEN LataaTile = 40                      'hinta
 ELSEIF RTRIM$(tile$) = "Varasto" THEN
     IF hae$ = "omist" THEN LataaTile = hahmo(vuorossa).ladot   'Omistuksessa
     IF hae$ = "kartta" THEN LataaTile = 3                      'Maxm. kartalla
     IF hae$ = "yht" THEN LataaTile = 100                       'Maxm. yht.
     IF hae$ = "pb" THEN LataaTile = 4                          'Pb - (Puolustus bonus)
     IF hae$ = "koko" THEN LataaTile = 1                        'rakennuksen koko (ruutua)
     IF hae$ = "hinta" THEN LataaTile = 60                      'hinta
 ELSEIF RTRIM$(tile$) = "Aita" THEN
     IF hae$ = "omist" THEN LataaTile = hahmo(vuorossa).aidat   'Omistuksessa
     IF hae$ = "kartta" THEN LataaTile = 10                      'Maxm. kartalla
     IF hae$ = "yht" THEN LataaTile = 10                         'Maxm. yht.
     IF hae$ = "pb" THEN LataaTile = 1                          'Pb - (Puolustus bonus)
     IF hae$ = "koko" THEN LataaTile = 1                        'rakennuksen koko (ruutua)
     IF hae$ = "hinta" THEN LataaTile = 9                      'hinta
 ELSEIF RTRIM$(tile$) = "Panimo" THEN
     IF hae$ = "omist" THEN LataaTile = hahmo(vuorossa).karjat  'Omistuksessa
     IF hae$ = "kartta" THEN LataaTile = 3                      'Maxm. kartalla
     IF hae$ = "yht" THEN LataaTile = 3                         'Maxm. yht.
     IF hae$ = "pb" THEN LataaTile = 3                          'Pb - (Puolustus bonus)
     IF hae$ = "koko" THEN LataaTile = 1                        'rakennuksen koko (ruutua)
     IF hae$ = "hinta" THEN LataaTile = 100 + (hahmo(vuorossa).karjat * 100) 'hinta
 ELSE
   '' Haetaan taistelija etsimll tmn tyyppi
   '' Juntti
   IF RTRIM$(tile$) = "Juntti" THEN
     IF hae$ = "teho" THEN LataaTile = 4 + UkkoTila(hae$, snum)     'Teho (lahi)
     IF hae$ = "tehoK" THEN LataaTile = 4 + UkkoTila(hae$, snum)    'Teho (kauko)
     IF hae$ = "pb" THEN LataaTile = 4 + UkkoTila(hae$, snum)       'Pb - (Puolustus bonus)
     IF hae$ = "hinta" THEN LataaTile = 12                          'hinta
     IF hae$ = "moraali" THEN LataaTile = 10                        'moraali 
     IF hae$ = "kanto" THEN LataaTile = 2 + UkkoTila(hae$, snum)    'hyokkayksen kanto
   '' Melee
   ELSEIF SotilaanTyyppi(tile$) = 1 THEN
     IF hae$ = "teho" THEN LataaTile = 7 + UkkoTila(hae$, snum)     'Teho (lhi)
     IF hae$ = "tehoK" THEN LataaTile = 0 + UkkoTila(hae$, snum)    'Teho (kauko)
     IF hae$ = "pb" THEN LataaTile = 6 + UkkoTila(hae$, snum)       'Pb - (Puolustus bonus)
     IF hae$ = "hinta" THEN LataaTile = 20                          'hinta
     IF hae$ = "moraali" THEN LataaTile = 7                         'moraali
     IF hae$ = "kanto" THEN LataaTile = 1 + UkkoTila(hae$, snum)    'hykkayksen kanto
   '' Ampuja
   ELSEIF SotilaanTyyppi(tile$) = 0 THEN
     IF hae$ = "teho" THEN LataaTile = 2 + UkkoTila(hae$, snum)     'Teho (lahi)
     IF hae$ = "tehoK" THEN LataaTile = 5 + UkkoTila(hae$, snum)    'Teho (kauko)
     IF hae$ = "pb" THEN LataaTile = 3 + UkkoTila(hae$, snum)       'Pb - (Puolustus bonus)
     IF hae$ = "hinta" THEN LataaTile = 25                          'hinta
     IF hae$ = "moraali" THEN LataaTile = 9                         'moraali
     IF hae$ = "kanto" THEN LataaTile = 4 + UkkoTila(hae$, snum)    'hyokkayksen kanto
   '' Kttpidemmt (...keihs)
   ELSEIF SotilaanTyyppi(tile$) = 2 THEN
     IF hae$ = "teho" THEN LataaTile = 4 + UkkoTila(hae$, snum)     'Teho (lahi)
     IF hae$ = "tehoK" THEN LataaTile = 5 + UkkoTila(hae$, snum)    'Teho (kauko)
     IF hae$ = "pb" THEN LataaTile = 4 + UkkoTila(hae$, snum)       'Pb - (Puolustus bonus)
     IF hae$ = "hinta" THEN LataaTile = 27                          'hinta
     IF hae$ = "moraali" THEN LataaTile = 8                         'moraali
     IF hae$ = "kanto" THEN LataaTile = 2 + UkkoTila(hae$, snum)    'hyokkayksen kanto
   END IF
  END IF
END FUNCTION

SUB Loadfont
 LOCATE 1: PRINT "Ladataan fonttia...."
 OPEN "data\fondit." FOR BINARY AS 1
 GET #1, , FBuff(0)
 CLOSE #1

END SUB

SUB LoadPal (Pal$)
LOCATE 1: PRINT "Ladataan palettia..."
'OPEN polku$ + "data\" + Pal$ FOR INPUT AS #1
OPEN "data\" + Pal$ FOR INPUT AS #1
FOR i = 255 TO 0 STEP -1
   INPUT #1, R, G, B
   OUT &H3C8, i
   OUT &H3C9, R
   OUT &H3C9, G
   OUT &H3C9, B
NEXT i
CLOSE #1

END SUB

SUB LoadTiles
LOCATE 1: PRINT "Ladataan kuvia..."
'CHDIR polku$
  DEF SEG = VARSEG(tiili(0)): BLOAD "data\tiili2.img", VARPTR(tiili(0))
  DEF SEG = VARSEG(reuna1(0)): BLOAD "data\reuna1.img", VARPTR(reuna1(0))
  DEF SEG = VARSEG(reuna2(0)): BLOAD "data\reuna2.img", VARPTR(reuna2(0))
  DEF SEG = VARSEG(reuna4(0)): BLOAD "data\reuna4.img", VARPTR(reuna4(0))
  DEF SEG = VARSEG(kulma(0)): BLOAD "data\kulma.img", VARPTR(kulma(0))
  DEF SEG = VARSEG(miekkam(0)): BLOAD "data\miek2.img", VARPTR(miekkam(0))
  DEF SEG = VARSEG(miekka(0)): BLOAD "data\miek.img", VARPTR(miekka(0))
  DEF SEG = VARSEG(face(0)): BLOAD "data\facet2.til", VARPTR(face(0))
  DEF SEG = VARSEG(face2(0)): BLOAD "data\facet3.til", VARPTR(face2(0))
  DEF SEG = VARSEG(leipam(0)): BLOAD "data\lei2.img", VARPTR(leipam(0))
  DEF SEG = VARSEG(leipa(0)): BLOAD "data\lei.img", VARPTR(leipa(0))
  DEF SEG = VARSEG(raham(0)): BLOAD "data\rah2.img", VARPTR(raham(0))
  DEF SEG = VARSEG(raha(0)): BLOAD "data\rah.img", VARPTR(raha(0))
  DEF SEG = VARSEG(ritari(0)): BLOAD "data\rit.img", VARPTR(ritari(0))
  DEF SEG = VARSEG(ritarim(0)): BLOAD "data\rit2.img", VARPTR(ritarim(0))
  DEF SEG = VARSEG(jousi(0)): BLOAD "data\jou.img", VARPTR(jousi(0))
  DEF SEG = VARSEG(jousim(0)): BLOAD "data\jou2.img", VARPTR(jousim(0))
  DEF SEG = VARSEG(tiili2(0)): BLOAD "data\blo2.img", VARPTR(tiili2(0))
  DEF SEG = VARSEG(pelto(0)): BLOAD "data\til2.img", VARPTR(pelto(0))
  DEF SEG = VARSEG(tila(0)): BLOAD "data\til.img", VARPTR(tila(0))
  DEF SEG = VARSEG(tilaM(0)): BLOAD "data\til3.img", VARPTR(tilaM(0))
  DEF SEG = VARSEG(soturim(0)): BLOAD "data\sot2.img", VARPTR(soturim(0))
  DEF SEG = VARSEG(soturi(0)): BLOAD "data\sot.img", VARPTR(soturi(0))
  DEF SEG = VARSEG(miesm(0)): BLOAD "data\mie2.img", VARPTR(miesm(0))
  DEF SEG = VARSEG(mies(0)): BLOAD "data\mie.img", VARPTR(mies(0))
  DEF SEG = VARSEG(torni(0)): BLOAD "data\tor.img", VARPTR(torni(0))
  DEF SEG = VARSEG(tornim(0)): BLOAD "data\tor2.img", VARPTR(tornim(0))
  DEF SEG = VARSEG(reuna5(0)): BLOAD "data\side1.img", VARPTR(reuna5(0))
  DEF SEG = VARSEG(ruoho(0)): BLOAD "data\ruo.img", VARPTR(ruoho(0))
  DEF SEG = VARSEG(ruoho2(0)): BLOAD "data\ruo2.img", VARPTR(ruoho2(0))
  DEF SEG = VARSEG(maahinen(0)): BLOAD "data\mah.img", VARPTR(maahinen(0))
  DEF SEG = VARSEG(maahinenm(0)): BLOAD "data\mah2.img", VARPTR(maahinenm(0))
  DEF SEG = VARSEG(kilpi(0)): BLOAD "data\def.img", VARPTR(kilpi(0))
  DEF SEG = VARSEG(kilpim(0)): BLOAD "data\def2.img", VARPTR(kilpim(0))
  DEF SEG = VARSEG(lato(0)): BLOAD "data\lato.img", VARPTR(lato(0))
  DEF SEG = VARSEG(latoM(0)): BLOAD "data\lato2.img", VARPTR(latoM(0))
  DEF SEG = VARSEG(face3(0)): BLOAD "data\facet7.til", VARPTR(face3(0))
  DEF SEG = VARSEG(raivo(0)): BLOAD "data\rai.img", VARPTR(raivo(0))
  DEF SEG = VARSEG(raivoM(0)): BLOAD "data\rai2.img", VARPTR(raivoM(0))
  DEF SEG = VARSEG(aita(0)): BLOAD "data\ait.img", VARPTR(aita(0))
  DEF SEG = VARSEG(aitaM(0)): BLOAD "data\ait2.img", VARPTR(aitaM(0))
  DEF SEG = VARSEG(tonttu(0)): BLOAD "data\ton.img", VARPTR(tonttu(0))
  DEF SEG = VARSEG(tonttuM(0)): BLOAD "data\ton2.img", VARPTR(tonttu(0))
  DEF SEG = VARSEG(kata(0)): BLOAD "data\kata.img", VARPTR(kata(0))
  DEF SEG = VARSEG(face4(0)): BLOAD "data\anon.til", VARPTR(face4(0))
  DEF SEG = VARSEG(Puu1(0)): BLOAD "data\Puu3.img", VARPTR(Puu1(0))
  DEF SEG = VARSEG(PuuM1(0)): BLOAD "data\Puu4.img", VARPTR(PuuM1(0))
  DEF SEG = VARSEG(Puu2(0)): BLOAD "data\Puu5.img", VARPTR(Puu2(0))
  DEF SEG = VARSEG(PuuM2(0)): BLOAD "data\Puu6.img", VARPTR(PuuM2(0))
  DEF SEG = VARSEG(juntti(0)): BLOAD "data\jun.img", VARPTR(juntti(0))
  DEF SEG = VARSEG(junttiM(0)): BLOAD "data\jun2.img", VARPTR(junttiM(0))
  DEF SEG = VARSEG(pelaaja1(0)): BLOAD "data\com.img", VARPTR(pelaaja1(0))
  DEF SEG = VARSEG(pelaaja2(0)): BLOAD "data\pl.img", VARPTR(pelaaja2(0))
  DEF SEG = VARSEG(ketju(0)): BLOAD "data\ketju.img", VARPTR(ketju(0))
  DEF SEG = VARSEG(ketju2(0)): BLOAD "data\ketju2.img", VARPTR(ketju2(0))
  DEF SEG = VARSEG(wood(0)): BLOAD "data\wood.img", VARPTR(wood(0))
  DEF SEG = VARSEG(wood2(0)): BLOAD "data\wood2.img", VARPTR(wood2(0))
  DEF SEG = VARSEG(karja(0)): BLOAD "data\kar.img", VARPTR(karja(0))
  DEF SEG = VARSEG(karja2(0)): BLOAD "data\kar2.img", VARPTR(karja2(0))
  DEF SEG = VARSEG(veri(0)): BLOAD "data\ver.img", VARPTR(veri(0))
  DEF SEG = VARSEG(veriM(0)): BLOAD "data\ver2.img", VARPTR(veriM(0))
  DEF SEG = VARSEG(sankari(0)): BLOAD "data\san.img", VARPTR(sankari(0))
  DEF SEG = VARSEG(sankariM(0)): BLOAD "data\san2.img", VARPTR(sankariM(0))
  DEF SEG = VARSEG(keihas(0)): BLOAD "data\kei.img", VARPTR(keihas(0))
  DEF SEG = VARSEG(keihas2(0)): BLOAD "data\kei2.img", VARPTR(keihas2(0))
  DEF SEG = VARSEG(seivas(0)): BLOAD "data\sei.img", VARPTR(seivas(0))
  DEF SEG = VARSEG(seivas2(0)): BLOAD "data\sei2.img", VARPTR(seivas2(0))
  DEF SEG = VARSEG(susi(0)): BLOAD "data\sus.img", VARPTR(susi(0))
  DEF SEG = VARSEG(susi2(0)): BLOAD "data\sus2.img", VARPTR(susi2(0))
  DEF SEG = VARSEG(kysym(0)): BLOAD "data\kys.img", VARPTR(kysym(0))
  DEF SEG = VARSEG(kysym2(0)): BLOAD "data\kys2.img", VARPTR(kysym2(0))
'CHDIR ".."
END SUB

SUB LopetaPeli
'' Lopetus varmistus
 GET (90, 55)-(208, 130), tempget
 PiirraTaulu 90, 60, 200, 123, 0, 0
 PiirraNappi 102, 90, 193, 100, ""
 PiirraNappi 102, 105, 193, 115, ""
 tc = 44
 Font "Lopeta Woima?", 44, 103, 69, 1, ""
 Font "   Kyll", 42, 110, 92, 1, ""
 Font "  Peruuta", 42, 110, 107, 1, ""

 HiiriShow
 DO
 HiiriStatus VH, OH, MX, MY, hx, hy
 s$ = INKEY$
  IF MX > 204 AND MX < 386 AND MY > 90 AND MY < 100 AND VH <> 0 OR s$ = "q" OR s$ = CHR$(27) THEN finished = TRUE: s$ = CHR$(13)
  IF MX > 204 AND MX < 386 AND MY > 105 AND MY < 115 AND VH <> 0 THEN s$ = CHR$(13)
 LOOP UNTIL s$ = CHR$(13)
 HiiriHide
 PUT (90, 55), tempget, PSET
 Delay .2
END SUB

REM $STATIC
SUB LoppuIkkuna
 DIM mika, kk, taistelut, kuolleet, elossa
 ''Tehdn voitto ilmoitus
 HiiriHide
 PiirraTaulu 90, 60, 200, 140, 0, 0
 tc = 44
 Font "Kampanja on ohi!", tc, 98, 67, 1, ""
 Font RTRIM$(hahmo(voitto).johtaja) + " voitti!", tc, 98, 75, 1, ""
 IF hahmo(voitto).pelaaja = "Tietokone" THEN Font "HVISITPS", tc, 98, 83, 1, "" ELSE Font "ONNEKSI OLKOON", tc, 98, 83, 1, ""
 Hyvaksy 110, 180, 103, 113
 CLS

 ''Loppu status
 HiiriHide
 PiirraTaulu 8, 2, 306, 185, 1, 49
 FOR x = 1 TO 18 STEP 1
  FOR y = 1 TO 14 STEP 1
    RANDOMIZE TIMER
    PUT (x * 16, y * 12), wood, PSET
  NEXT
 NEXT
 FOR x = 1 TO 18
   PUT (x * 16, 14 * 12), wood2, PSET
 NEXT

 taistelut = 0
 FOR x = 1 TO 6
   IF x < 4 THEN taistelut = taistelut + (hahmo(x).voitot + hahmo(x).haviot)
   kuolleet = kuolleet + hahmo(x).pisteet
   elossa = elossa + hahmo(x).meleeukot + hahmo(x).ampujat + hahmo(x).heitto
   arvosana = hahmo(x).pisteet + arvosana
 NEXT
 IF hahmo(1).pelaaja = "" THEN
   IF hahmo(2).pelaaja = "" THEN mika = 3 ELSE mika = 2
 ELSE
   mika = 1
 END IF
 
 Font "  S T A T U S", 49, 65, 20, 2, ""
 Font "  S T A T U S", 49, 63, 18, 2, "shade"

 LINE (31, 39)-(53, 61), 23, BF   ''Naamataulun reunukset
 LINE (32, 40)-(53, 61), 22, BF
 LINE (33, 41)-(53, 61), 21, BF
 LINE (162, 34)-(259, 91), 48, B  ''Minimapin reunukset
 LINE (163, 35)-(259, 91), 45, B

 PiirraNappi 263, 35, 273, 89, ""
 Font "S", 42, 266, 46, 1, ""
 Font "e", 42, 266, 52, 1, ""
 Font "u", 42, 266, 58, 1, ""
 Font "r", 42, 266, 64, 1, ""

 GET (30, 26)-(161, 92), tempget
 NaytaLoppuPisteet (mika)

 Font "Kampanja tiedot:", 46, 35 + 10, 105, 1, "shade"
 Font "Kunniakas voittaja on " + RTRIM$(hahmo(voitto).johtaja) + "!", 42, 35 + 10, 115, 1, ""
 Font "Aikaa kului:", 42, 35 + 10, 123, 1, ""
 IF day >= 30 THEN
    kk = day / 30
    day = day - (kk * 30)
 END IF
 Font "   " + Fixed(kk) + " kk ja " + Fixed(day) + " piv", 43, 33 + 10, 130, 1, ""
 Font "Taisteluja yhteens........" + Fixed(taistelut), 42, 33 + 10, 138, 1, ""
 Font "Taisteluissa menehtyneit.." + Fixed(kuolleet), 43, 33 + 10, 146, 1, ""
 Font "Eloon jneeit yht........" + Fixed(elossa), 43, 33 + 10, 154, 1, ""
 Font "Arvosana kampanjasta: ", 42, 33 + 10, 163, 1, ""
 IF arvosana <= 40 THEN Font "Sanaharkkoa!", 47, 33 + 140, 163, 1, "shade"
 IF arvosana > 40 AND arvosana <= 80 THEN Font "Kansan riita!", 47, 33 + 140, 163, 1, "shade"
 IF arvosana > 80 AND arvosana <= 100 THEN Font "Kylhullujen sota!", 47, 33 + 140, 163, 1, "shade"
 IF arvosana > 100 AND arvosana <= 160 THEN Font "Verilylyt!", 47, 33 + 140, 163, 1, "shade"
 IF arvosana > 160 THEN Font "Ryssn rynnkk", 47, 33 + 140, 163, 1, "shade"

 PiirraNappi 260, 125, 295, 168, ""
 Font "OK!", 42, 269, 143, 1, ""

 DO
  HiiriShow
  key$ = INKEY$
    HiiriStatus VH, OH, MX, MY, hx, hy   ''tutkitaan hiiren sijaintia ja nappien tilaa
    IF VH <> 0 THEN
      IF MX > 526 AND MY > 35 AND MX < 546 AND MY < 89 THEN
        mika = mika + 1
        IF RTRIM$(hahmo(mika).pelaaja) = "" THEN mika = mika + 1
        IF mika > 3 THEN
                IF RTRIM$(hahmo(1).pelaaja) = "" THEN
                   IF RTRIM$(hahmo(2).pelaaja) = "" THEN mika = 3 ELSE mika = 2
                ELSE
                   mika = 1
                END IF
        END IF
        PUT (30, 26), tempget, PSET
        NaytaLoppuPisteet (mika)
        Delay .2
      END IF
    END IF
 LOOP UNTIL key$ <> "" OR VH <> 0 AND MX > 520 AND MY > 125 AND MX < 590 AND MY < 168
 finished = TRUE
END SUB

SUB LuoPikapeli
DIM tyyppi(1 TO 3) AS INTEGER
'' luo 'pikapelin' joka ohjautuu suoraan taisteluun

 tyyppi(1) = INT(RND * 7) + 1
 tyyppi(2) = INT(RND * 6) + 1
 tyyppi(3) = INT(RND * 3) + 1

 RANDOMIZE TIMER
 ''vastustajien joukot
 'hahmo(INT(RND * 2) + 1).pelaaja = "Tietokone"
 IF RTRIM$(hahmo(1).pelaaja) = "Tietokone" THEN hahmo(2).pelaaja = "Pelaaja 1" ELSE hahmo(1).pelaaja = "Pelaaja 1"

 vastus(1).vastus = INT(RND * 2) + 1
 vastus(1).miekat = tyyppi(1)
 vastus(1).jouset = tyyppi(2)
 vastus(1).heitto = tyyppi(3)

 IF vastus(1).vastus = 1 THEN vastus(2).vastus = 2 ELSE vastus(2).vastus = 1
 vastus(2).miekat = tyyppi(1)
 vastus(2).jouset = tyyppi(2)
 vastus(2).heitto = tyyppi(3)

 LuoRandomiKartta vastus(2).vastus
 mapnum = vastus(2).vastus
 vuorossa = 1
 CALL Taistelu
 voitto = 0
 finished = TRUE
END SUB

SUB LuoRandomiKartta (kartta)
'' Luodaan satunnainen pohja kartalle.
DIM puu, tyyppi

RANDOMIZE TIMER
 tyyppi = INT(RND * 2) + 1

 '' asetetaan puustoa
 FOR i = 1 TO INT(RND * 12) + 12
  puu = INT(RND * 3) + 1
   IF puu = 3 THEN puu = tyyppi  ''listn vhn metstyyppi puun osuutta
   map(kartta, INT(RND * 18) + 1, INT(RND * 10) + 1) = puu + 7
 NEXT

 '' asetetaan aitoja
 FOR i = 1 TO INT(RND * 6) + 3
  map(kartta, INT(RND * 18) + 1, INT(RND * 6) + 3) = TileTyyppi("Aita")
 NEXT
END SUB

SUB LuoTakauma (mika)
 '' Luodaan satunnainen karttapohja
 LuoRandomiKartta mika
 '' oletus ohjaaja ja johtaja
 hahmo(mika).pelaaja = "Tietokone"
 hahmo(mika).johtaja = "Juntit"
 '' mihink liittoumaan kuulutaan (oletus 4= neutraali)
 hahmo(mika).liittouma = 4
 '' arvotaan kyln tuotto
 hahmo(mika).ruokaa = INT(RND * 5) + 1
 '' arvotaan kyln omaisuus
 IF hahmo(mika).ruokaa = 5 THEN hahmo(mika).rahaa = INT(RND * 3) + 1 ELSE hahmo(mika).rahaa = INT(RND * 5) + 1
 '' arvotaan kyln tyyli(maine)
 hahmo(mika).maine = INT(RND * 5)
 '' arvotaan junttejen mr
 hahmo(mika).ampujat = INT(RND * 14) + 4
 IF hahmo(mika).maine = 1 THEN hahmo(mika).ampujat = hahmo(mika).ampujat + INT(RND * 3) + 2
END SUB

REM $DYNAMIC
SUB LuoTiedosto (tiednimi$, save)
'' tiednimi$ = mill nimell tiedot tallennetaan
'' save - tallennettavan hahmo-taulukon numeron (0 = kaikki)
DIM taul
 OPEN tiednimi$ FOR BINARY AS #1
  SELECT CASE save
   CASE 0
        '' Tallennetaan kaikki hahmot
        FOR taul = 1 TO 6
         GOSUB kirjota
        NEXT
        '' Tallennetaan mys taistelu asettelut, jos hykkys
        '' asetelmat on asetettuna.
        FOR taul = 1 TO 2
         PUT #1, , vastus(taul).vastus
         PUT #1, , vastus(taul).jouset
         PUT #1, , vastus(taul).heitto
         PUT #1, , vastus(taul).miekat
        NEXT
       
        '' Yleiset muuttujat
        PUT #1, , day
        PUT #1, , vuorossa
        PUT #1, , klassinen
  END SELECT
 CLOSE #1
EXIT SUB

kirjota:
  PUT #1, , hahmo(taul).pelaaja
  PUT #1, , hahmo(taul).liittouma
  PUT #1, , hahmo(taul).taito
  PUT #1, , hahmo(taul).meleeukot
  PUT #1, , hahmo(taul).ampujat
  PUT #1, , hahmo(taul).heitto
  PUT #1, , hahmo(taul).johtaja
  PUT #1, , hahmo(taul).moraali
  PUT #1, , hahmo(taul).maine
  PUT #1, , hahmo(taul).voitot
  PUT #1, , hahmo(taul).haviot
  PUT #1, , hahmo(taul).rahaa
  PUT #1, , hahmo(taul).tiloja
  PUT #1, , hahmo(taul).tornit
  PUT #1, , hahmo(taul).ladot
  PUT #1, , hahmo(taul).aidat
  PUT #1, , hahmo(taul).karjat
  PUT #1, , hahmo(taul).ruokaa
  PUT #1, , hahmo(taul).pisteet
  FOR y = 1 TO 11
   FOR x = 1 TO 19
    PUT #1, , map(taul, x, y)
   NEXT
  NEXT
RETURN
END SUB

REM $STATIC
FUNCTION MikaTile$ (tilenum)
'' Functio, joka tunnistaa muutujan tiletyypin

 SELECT CASE tilenum
 CASE 2
   MikaTile$ = "Tila"
 CASE 4
   MikaTile$ = "Torni"
 CASE 5
   MikaTile$ = "Varasto"
 CASE 6
   MikaTile$ = "Panimo"
 CASE 7
   MikaTile$ = "Aita"
 END SELECT

END FUNCTION

SUB NaytaLoppuPisteet (kenen)

 'Naamat taululle
 IF kenen = 1 THEN
        PUT (33, 41), face, PSET
 ELSEIF kenen = 2 THEN
        PUT (33, 41), face2, PSET
 ELSEIF kenen = 3 THEN
        PUT (33, 41), face3, PSET
 END IF

 MiniMap kenen, 163, 35

 Font hahmo(kenen).pelaaja, 41, 32, 30, 1, ""
 Font hahmo(kenen).johtaja, 42, 56, 41, 1, ""
 Font MikaLiitto$(hahmo(kenen).liittouma), 42, 56, 51, 1, ""

 Font "Miehistn tiedot:", 46, 33, 63, 1, "shade"
 Font "Eloon jneet..." + Fixed(hahmo(kenen).heitto + hahmo(kenen).ampujat + hahmo(kenen).meleeukot), 43, 33, 70, 1, ""
 Font "Kaatuneita......" + Fixed(hahmo(kenen).pisteet), 43, 33, 77, 1, ""
 Font "Voitot/Taistot.." + Fixed(hahmo(kenen).voitot) + "/" + Fixed(hahmo(kenen).voitot + hahmo(kenen).haviot), 43, 33, 84, 1, ""

END SUB

REM $DYNAMIC
SUB OletusAlotus
 '' Asetetaan hahmotaulukoille oletus arvot
 i = 1
 hahmo(i).pelaaja = "Pelaaja 1"
 hahmo(i).liittouma = i
 hahmo(i).johtaja = "Fleming"
 hahmo(i).moraali = 10
 hahmo(i).maine = 2
 hahmo(i).rahaa = 230
 MID$(hahmo(i).taito, 1, 1) = "S"
 i = 2
 hahmo(i).pelaaja = "Tietokone"
 hahmo(i).liittouma = i
 hahmo(i).johtaja = "Pentinpoika"
 hahmo(i).moraali = 10
 hahmo(i).maine = 2
 hahmo(i).rahaa = 230
 MID$(hahmo(i).taito, 1, 1) = "S"
 i = 3
 hahmo(i).pelaaja = ""
 hahmo(i).liittouma = i
 hahmo(i).johtaja = "Lieto"
 hahmo(i).moraali = 10
 hahmo(i).maine = 2
 hahmo(i).rahaa = 230
 MID$(hahmo(i).taito, 1, 1) = "S"
END SUB

SUB PiirraNappi (boxX, boxY, boxMx, boxMy, tila AS STRING)
''''--- Piirtaa ns. nappi laatikon. ("fade"= pohjassa!)
 DIM tc, tu

 SELECT CASE tila
 CASE "fade"    'pohjassa (varjostettu)
  tc = 22         '22
  tu = 24         '25
 CASE ELSE      'normaali asennossa
  tc = 25          '25
  tu = 21          '21
 END SELECT

 LINE (boxX - 1, boxY - 1)-(boxMx + 1, boxMy), tc, B
 LINE (boxX, boxY)-(boxMx + 1, boxMy + 1), tu, B
 LINE (boxX, boxY)-(boxMx, boxMy), 23, BF
END SUB

SUB PiirraTaulu (box, boy, boxm, boym, tyyli, vari)
'' Aliohjelma, joka piirtaa taulun
 FOR y = boy TO boym STEP 6
  IF tyyli = 0 THEN
   PUT (box, y), reuna1, PSET
   PUT (boxm, y), reuna4, PSET
  ELSE
   PUT (box, y), reuna5, PSET
   PUT (boxm, y), reuna5, PSET
  END IF
 NEXT
 FOR x = box TO boxm STEP 6
  IF tyyli = 0 THEN
   PUT (x, boy), reuna2, PSET
   PUT (x, boym), reuna2, PSET
  ELSE
   PUT (x, boy), reuna5, PSET
   PUT (x, boym), reuna5, PSET
  END IF
 NEXT

 IF tyyli = 0 THEN LINE (box + 6, boy + 6)-(boxm - 1, boym - 1), 22, B
 IF tyyli = 0 THEN LINE (box + 7, boy + 7)-(boxm - 1, boym - 1), 21, B
 LINE (box + 7, boy + 7)-(boxm - 2, boym - 2), vari, BF

END SUB

SUB PiirraTile (tilenum, sijaintiX, sijaintiY)
''-- Subi joka sisaltaa kaikkien pohja tilejen piirron
 DIM ruohot
 SELECT CASE tilenum
  CASE 0
        FOR rux = 1 TO 19
        FOR ruy = 1 TO 11
          ruohot = ruohot + 1
          IF ruohot = 2 THEN ruohot = 0
         IF rux = sijaintiX AND ruy = sijaintiY THEN
            IF ruohot = 0 THEN PUT (sijaintiX * 16 - 9, sijaintiY * 16 - 15), ruoho, PSET
            IF ruohot = 1 THEN PUT (sijaintiX * 16 - 9, sijaintiY * 16 - 15), ruoho2, PSET
         END IF
        NEXT: NEXT
  CASE 2
        PUT (sijaintiX, sijaintiY), tilaM, AND
        PUT (sijaintiX, sijaintiY), tila, OR
  CASE 3
        PUT (sijaintiX, sijaintiY), pelto, PSET
  CASE 4
        PUT (sijaintiX, sijaintiY), tornim, AND
        PUT (sijaintiX, sijaintiY), torni, OR
  CASE 5
        PUT (sijaintiX, sijaintiY), latoM, AND
        PUT (sijaintiX, sijaintiY), lato, OR
  CASE 6
        PUT (sijaintiX, sijaintiY), karja2, AND
        PUT (sijaintiX, sijaintiY), karja, OR
  CASE 7
        PUT (sijaintiX, sijaintiY), aitaM, AND
        PUT (sijaintiX, sijaintiY), aita, OR
  CASE 8
        PUT (sijaintiX, sijaintiY), PuuM2, AND
        PUT (sijaintiX, sijaintiY), Puu2, OR
  CASE 9
        PUT (sijaintiX, sijaintiY), PuuM1, AND
        PUT (sijaintiX, sijaintiY), Puu1, OR
 END SELECT
END SUB

SUB Piirraukko (kenen, kuka, sijaintiX, sijaintiY, snum)
'' Piirtaa spritet eli ukot
'' kenen = kenen hahmo (Liitto 1/ Liitto 2 jne..)
'' kuka = hahmon tyyppi (0= ampuja, 1= meleemies)
'' snum = sprite num. (hahmon tilan tarkistukseen)

 '' Taistelija raivohullu...
 IF UkkoTila("R", snum) = TRUE THEN
        PUT (sijaintiX, sijaintiY), raivoM, AND
        PUT (sijaintiX, sijaintiY), raivo, OR
 END IF

 SELECT CASE MikaSotilas$(kenen, kuka)
 CASE MikaSotilas$(1, 1)
        PUT (sijaintiX, sijaintiY), ritarim, AND
        PUT (sijaintiX, sijaintiY), ritari, OR
 CASE MikaSotilas$(1, 0)
        PUT (sijaintiX, sijaintiY), jousim, AND
        PUT (sijaintiX, sijaintiY), jousi, OR
 CASE MikaSotilas$(1, 2)
        PUT (sijaintiX, sijaintiY), keihas2, AND
        PUT (sijaintiX, sijaintiY), keihas, OR
 CASE MikaSotilas$(2, 1)
        PUT (sijaintiX, sijaintiY), soturim, AND
        PUT (sijaintiX, sijaintiY), soturi, OR
 CASE MikaSotilas$(2, 0)
        PUT (sijaintiX, sijaintiY), miesm, AND
        PUT (sijaintiX, sijaintiY), mies, OR
 CASE MikaSotilas$(2, 2)
        PUT (sijaintiX, sijaintiY), seivas2, AND
        PUT (sijaintiX, sijaintiY), seivas, OR
 CASE MikaSotilas$(3, 1)
        PUT (sijaintiX, sijaintiY), maahinenm, AND
        PUT (sijaintiX, sijaintiY), maahinen, OR
 CASE MikaSotilas$(3, 0)
        PUT (sijaintiX, sijaintiY), tonttuM, AND
        PUT (sijaintiX, sijaintiY), tonttu, OR
 CASE MikaSotilas$(3, 2)
        PUT (sijaintiX, sijaintiY), susi2, AND
        PUT (sijaintiX, sijaintiY), susi, OR
 CASE MikaSotilas$(4, 0 OR 1)
        PUT (sijaintiX, sijaintiY), junttiM, AND
        PUT (sijaintiX, sijaintiY), juntti, OR
 END SELECT

 '' Taistelija haavoittunut...
 IF UkkoTila("H", snum) = TRUE THEN
        PUT (sijaintiX + 1, sijaintiY), veriM, AND
        PUT (sijaintiX + 1, sijaintiY), veri, OR
 END IF
 '' Taistelija menestynyt...
 IF UkkoTila("S", snum) = TRUE THEN
        PUT (sijaintiX + 11, sijaintiY), sankariM, AND
        PUT (sijaintiX + 11, sijaintiY), sankari, OR
 END IF
END SUB

REM $STATIC
FUNCTION TileTyyppi (tile AS STRING)
'' Funtio joka muuttaa tiletyypin tmn muutujaksi

 SELECT CASE tile
 CASE "Tila"
   TileTyyppi = 2
 CASE "Torni"
   TileTyyppi = 4
 CASE "Varasto"
   TileTyyppi = 5
 CASE "Panimo"
   TileTyyppi = 6
 CASE "Aita"
   TileTyyppi = 7
 END SELECT

END FUNCTION

FUNCTION UkkoTila (etsi$, snum)
'' Funtio tarkistaa taistelijan tilan, ja asettaa tarvittaessa
'' haettuun kykyyn tilan suomat hyty/haitta pisteet.
 DIM bonus
 UkkoTila = FALSE     'oletukset (ei vaivoja)
 bonus = FALSE

 FOR c = 1 TO LEN(Ukko(snum).tila)
   IF MID$(Ukko(snum).tila, c, 1) = "R" THEN   ''Raivohullu
      IF etsi$ = "R" THEN bonus = TRUE
      IF etsi$ = "teho" THEN bonus = bonus + 2
      IF etsi$ = "tehoK" THEN bonus = bonus - 2
      IF etsi$ = "pb" THEN bonus = bonus - 3
   END IF
   IF MID$(Ukko(snum).tila, c, 1) = "H" THEN   ''Haavoittunut
      IF etsi$ = "H" THEN bonus = TRUE
      IF etsi$ = "teho" THEN bonus = bonus - 2
      IF etsi$ = "tehoK" THEN bonus = bonus - 2
      IF etsi$ = "pb" THEN bonus = bonus - 2
   END IF
   IF MID$(Ukko(snum).tila, c, 1) = "S" THEN   ''Sankari
      IF etsi$ = "S" THEN bonus = TRUE
      IF etsi$ = "teho" OR etsi$ = "tehoK" THEN bonus = bonus + 1
      IF etsi$ = "pb" THEN bonus = bonus + 1
   END IF
 NEXT c

 UkkoTila = bonus
END FUNCTION

REM $DYNAMIC
SUB UusiKampanja
 '' Ikkuna jossa luodaan asetukset uuteen kampanjaan
 PiirraTaulu 1, 40, 310, 152, 1, 47

 FOR y = 69 TO 102 STEP 16
  PSET (12, y), 24
  PiirraNappi 12, y, 302, y + 13, ""
 NEXT
 FOR y = 71 TO 112 STEP 16
  PiirraNappi 117, y, 201, y + 9, ""
  PiirraNappi 206, y, 298, y + 9, ""
 NEXT

 Font "ALOITA UUSI KAMPANJA", 46, 92, 50, 1, "shade"
 tc = 42
 Font "Alueruhtinas", 45, 215, 59, 1, ""
 LINE (290, 58)-(300, 66), 43, B: LINE (291, 59)-(300, 66), 45, B: LINE (291, 59)-(299, 65), 47, BF
 Font ">", 45, 293, 58, 1, ""

 Font "  " + MikaLiitto$(1), tc, 17, 72, 1, ""
 Font "  " + MikaLiitto$(2), tc, 12, 88, 1, ""
 Font "  " + MikaLiitto$(3), tc, 12, 104, 1, ""
 Font "Aseta liittoumalle ohjaaja, pelaaja ja johtaja!", 44, 15, 120, 1, ""

 tc = 42
 PiirraNappi 70, 135, 150, 145, ""
  Font "Peruuta", tc, 90, 136, 1, ""
 PiirraNappi 170, 135, 250, 145, ""
  Font "Aloita!", tc, 190, 136, 1, ""
 LINE (100, 70)-(111, 80), 27, B
  PAINT (102, 72), 0, 27
 LINE (100, 86)-(111, 96), 27, B
  PAINT (102, 88), 0, 27
 LINE (100, 102)-(111, 112), 27, B
  PAINT (102, 104), 0, 27

 '' Haetaan liittoumien aloitus oletukset.
 CALL OletusAlotus

 FOR liit = 1 TO 3
  LOCATE 8 + liit * 2, 16: PRINT hahmo(liit).pelaaja
  IF hahmo(liit).pelaaja = "Tietokone" THEN PUT (102, 16 * liit + 55), pelaaja1, PSET ELSE PUT (102, 16 * liit + 55), pelaaja2, PSET
  IF RTRIM$(hahmo(liit).pelaaja) = "" THEN LOCATE 8 + liit * 2, 16: PRINT " -       ": LINE (102, 16 * liit + 55)-(110, 16 * liit + 63), 0, BF
  LOCATE 10, 27: PRINT hahmo(1).johtaja
  LOCATE 12, 27: PRINT hahmo(2).johtaja
  LOCATE 14, 27: PRINT hahmo(3).johtaja
 NEXT
 Delay .2

 DO
  key$ = INKEY$
  HiiriStatus VH, OH, MX, MY, hx, hy
  HiiriShow
  IF key$ = "q" OR key$ = CHR$(27) THEN
        HiiriHide
        key$ = "quit"
  ELSEIF VH <> 0 THEN
     HiiriHide
     '' Vaihda pelaaja
     IF MX >= 200 AND MX <= 220 AND MY >= 70 AND MY <= 80 THEN
       IF hahmo(1).pelaaja = "Tietokone" THEN hahmo(1).pelaaja = "Pelaaja 1": PUT (102, 71), pelaaja2, PSET ELSE hahmo(1).pelaaja = "Tietokone": PUT (102, 71), pelaaja1, PSET
       LOCATE 10, 16: PRINT hahmo(1).pelaaja
       LINE (15, 120)-(300, 130), 47, BF: Font "Aseta liittoumalle ohjaaja, pelaaja ja johtaja!", 44, 15, 120, 1, ""
     ELSEIF MX >= 200 AND MX <= 220 AND MY >= 86 AND MY <= 96 THEN
       IF hahmo(2).pelaaja = "Tietokone" THEN hahmo(2).pelaaja = "Pelaaja 2": PUT (102, 87), pelaaja2, PSET ELSE hahmo(2).pelaaja = "Tietokone": PUT (102, 87), pelaaja1, PSET
       LOCATE 12, 16: PRINT hahmo(2).pelaaja
       LINE (15, 120)-(300, 130), 47, BF: Font "Aseta liittoumalle ohjaaja, pelaaja ja johtaja!", 44, 15, 120, 1, ""
     ELSEIF MX >= 200 AND MX <= 220 AND MY >= 102 AND MY <= 112 THEN 'nappi 3
       IF hahmo(3).pelaaja = "Tietokone" THEN hahmo(3).pelaaja = "Pelaaja 3": PUT (102, 103), pelaaja2, PSET ELSE hahmo(3).pelaaja = "Tietokone": PUT (102, 103), pelaaja1, PSET
       LOCATE 14, 16: PRINT hahmo(3).pelaaja
       LINE (15, 120)-(300, 130), 47, BF: Font "Aseta liittoumalle ohjaaja, pelaaja ja johtaja!", 44, 15, 120, 1, ""
     '' Vaihda ohjaaja
     ELSEIF MX >= 234 AND MX <= 402 AND MY >= 70 AND MY <= 80 THEN
       IF NOT hahmo(1).pelaaja = "Tietokone" THEN
        LINE (10, 120)-(300, 130), 47, BF
        LOCATE 10, 16: PRINT "         "
        LOCATE 16, 5: INPUT "Pelaaja"; hahmo(1).pelaaja
        LOCATE 10, 16: PRINT hahmo(1).pelaaja
        IF RTRIM$(hahmo(1).pelaaja) = "" THEN LOCATE 10, 16: PRINT " -": LINE (101, 71)-(110, 79), 0, BF
        LINE (15, 120)-(300, 130), 47, BF: Font "Aseta liittoumalle ohjaaja, pelaaja ja johtaja!", 44, 15, 120, 1, ""
       END IF
     ELSEIF MX >= 234 AND MX <= 402 AND MY >= 86 AND MY <= 96 THEN
       IF NOT hahmo(2).pelaaja = "Tietokone" THEN
        LINE (10, 120)-(300, 130), 47, BF
        LOCATE 12, 16: PRINT "         "
        LOCATE 16, 5: INPUT "Pelaaja"; hahmo(2).pelaaja
        LOCATE 12, 16: PRINT hahmo(2).pelaaja
        IF RTRIM$(hahmo(2).pelaaja) = "" THEN LOCATE 12, 16: PRINT " -": LINE (101, 87)-(110, 95), 0, BF
        LINE (15, 120)-(300, 130), 47, BF: Font "Aseta liittoumalle ohjaaja, pelaaja ja johtaja!", 44, 15, 120, 1, ""
       END IF
     ELSEIF MX >= 234 AND MX <= 402 AND MY >= 102 AND MY <= 112 THEN
       IF NOT hahmo(3).pelaaja = "Tietokone" THEN
        LINE (10, 120)-(300, 130), 47, BF
        LOCATE 14, 16: PRINT "         "
        LOCATE 16, 5: INPUT "Pelaaja"; hahmo(3).pelaaja
        LOCATE 14, 16: PRINT hahmo(3).pelaaja
        LINE (15, 120)-(300, 130), 47, BF: Font "Aseta liittoumalle ohjaaja, pelaaja ja johtaja!", 44, 15, 120, 1, ""
        IF RTRIM$(hahmo(3).pelaaja) = "" THEN LOCATE 14, 16: PRINT " -": LINE (101, 103)-(110, 111), 0, BF
       END IF
     '' Aseta johtaja
     ELSEIF MX >= 412 AND MX <= 596 AND MY >= 70 AND MY <= 80 THEN
       LINE (10, 120)-(300, 130), 47, BF
       LOCATE 10, 27: PRINT "           "
       LOCATE 16, 5: INPUT "Johtaja"; hahmo(1).johtaja
       LOCATE 10, 27: PRINT hahmo(1).johtaja
       LINE (15, 120)-(300, 130), 47, BF: Font "Aseta liittoumalle ohjaaja, pelaaja ja johtaja!", 44, 15, 120, 1, ""
     ELSEIF MX >= 412 AND MX <= 596 AND MY >= 86 AND MY <= 96 THEN
       LINE (10, 120)-(300, 130), 47, BF
       LOCATE 12, 27: PRINT "           "
       LOCATE 16, 5: INPUT "Johtaja"; hahmo(2).johtaja
       LOCATE 12, 27: PRINT hahmo(2).johtaja
       LINE (15, 120)-(300, 130), 47, BF: Font "Aseta liittoumalle ohjaaja, pelaaja ja johtaja!", 44, 15, 120, 1, ""
     ELSEIF MX >= 412 AND MX <= 596 AND MY >= 102 AND MY <= 112 THEN
       LINE (10, 120)-(300, 130), 47, BF
       LOCATE 14, 27: PRINT "           "
       LOCATE 16, 5: INPUT "Johtaja"; hahmo(3).johtaja
       LOCATE 14, 27: PRINT hahmo(3).johtaja
       LINE (15, 120)-(300, 130), 47, BF: Font "Aseta liittoumalle ohjaaja, pelaaja ja johtaja!", 44, 15, 120, 1, ""
     ELSEIF MX >= 580 AND MX <= 600 AND MY >= 58 AND MY <= 66 THEN
       IF klassinen = FALSE THEN
          klassinen = TRUE
          LINE (215, 59)-(288, 65), 47, BF: Font "   Klassinen", 45, 215, 59, 1, ""
          LINE (15, 120)-(295, 127), 47, BF: Font "Klassinen - Pelaajat taistelevat vastakkain", 44, 15, 120, 1, ""
       ELSE
          klassinen = FALSE
          LINE (215, 59)-(288, 65), 47, BF: Font "Alueruhtinas", 45, 215, 59, 1, ""
          LINE (15, 120)-(295, 127), 47, BF: Font "Alueruhtinas - Taistelu pitjien herruudesta", 44, 15, 120, 1, ""
       END IF
     '' Muuta sl...
     ELSEIF MX >= 138 AND MX <= 302 AND MY >= 135 AND MY <= 145 THEN
       EXIT SUB
     ELSEIF MX >= 338 AND MX <= 502 AND MY >= 135 AND MY <= 145 THEN
       '' Tarkistetaan asetetut asetukset. Onko hyvksyttvt? Pistevertaus!
       points = 0
       FOR liit = 1 TO 3
        IF RTRIM$(hahmo(liit).pelaaja) > "" THEN hahmo(liit).liittouma = liit ELSE hahmo(liit).liittouma = 0
        IF hahmo(liit).pelaaja = "Tietokone" THEN
          points = points + 1
        ELSEIF RTRIM$(hahmo(liit).pelaaja) > "" THEN
          points = points + 3
        END IF
          '' HUIJAUSKOODI 1/1!
          IF hahmo(liit).pelaaja = "Moneyman " THEN hahmo(liit).rahaa = 1000
       NEXT
       IF points > 3 THEN
         '' Tarkistetaan alkuasetuksia varten onko liitto1 pelissa jos ei
         '' niin siiretaan aloitus vuoro liitto 2:lle, muutoin turni liitto 1:lle
         IF RTRIM$(hahmo(1).pelaaja) = "" THEN
          IF RTRIM$(hahmo(2).pelaaja) = "" THEN vuorossa = 3 ELSE vuorossa = 2
         ELSE
          vuorossa = 1
         END IF
      
         '' Luodaan takapaujaloiden Epht
         FOR mika = 4 TO 6
          LuoTakauma mika
         NEXT
        
         key$ = "quit"
         CLS
       ELSE
         points = 0
       END IF
     END IF
  Delay (.2)
 END IF
 LOOP UNTIL key$ = "quit"
 HiiriHide
END SUB

SUB Valoaste (paljonko)
'' Laskee paletin kirkkautta asteittain
 FOR i = 1 TO paljonko STEP 1
   FOR j = 1 TO 317
     OUT (&H3C7), j
     'alkuperiset vrit muuttujiin
     R = INP(&H3C9): G = INP(&H3C9): B = INP(&H3C9)
     'uusien vrien laskeminen
     R = ABS(R - 1): G = ABS(G - 1): B = ABS(B - 1)
     OUT (&H3C8), j
     'uudet vrit kyttn
     OUT (&H3C9), R: OUT (&H3C9), G: OUT (&H3C9), B
   NEXT j
 NEXT i
END SUB

SUB VuoronVaihto
 ''- Aliohjelma joka vaihtaa vuoron pelaajalta toiselle

 ''JOS taistelu on paalla vaihtuu vuorot vastustajien kesken!
 IF taisto = TRUE THEN
   SELECT CASE vuorossa
     CASE vastus(1).vastus
      vuorossa = vastus(2).vastus
     CASE vastus(2).vastus
      vuorossa = vastus(1).vastus
   END SELECT

 ''Muutoin voimme olettaa etta rauhatila on paalla, joten
 ''vuorot vaihtuvat liittoumien kesken!
 ELSE
   SELECT CASE vuorossa
    CASE 1
      IF RTRIM$(hahmo(2).pelaaja) = "" OR hahmo(2).liittouma = 0 THEN
        IF RTRIM$(hahmo(3).pelaaja) = "" OR hahmo(3).liittouma = 0 THEN vuorossa = 1: VaihdaPaiva ELSE vuorossa = 3
      ELSE
       vuorossa = 2
      END IF
    CASE 2
      IF RTRIM$(hahmo(3).pelaaja) = "" OR hahmo(3).liittouma = 0 THEN
       '' Ei kolmatta pelaajaa, aloitetaan uusi paiva(kierros)
       VaihdaPaiva
        IF RTRIM$(hahmo(1).pelaaja) = "" OR hahmo(1).liittouma = 0 THEN vuorossa = 2 ELSE vuorossa = 1
      ELSE
       vuorossa = 3
      END IF
    CASE 3
      IF RTRIM$(hahmo(1).pelaaja) = "" OR hahmo(1).liittouma = 0 THEN
       IF RTRIM$(hahmo(2).pelaaja) = "" OR hahmo(2).liittouma = 0 THEN vuorossa = 3 ELSE vuorossa = 2: VaihdaPaiva
      ELSE
       vuorossa = 1
       VaihdaPaiva
      END IF
   END SELECT
 END IF

 EXIT SUB
END SUB

