DECLARE SUB NPC0 ()
DECLARE SUB GateKeeper ()
DECLARE SUB Shop ()
DECLARE SUB Inn ()
DECLARE SUB NPC7 ()
DECLARE SUB NPC6 ()
DECLARE SUB NPC5 ()
DECLARE SUB NPC4 ()
DECLARE SUB NPC3 ()
DECLARE SUB NPC2 ()
DECLARE SUB NPC1 ()
DECLARE SUB Quit ()
DECLARE SUB Save ()
DECLARE SUB UseHeal ()
DECLARE SUB UseRestore ()
DECLARE SUB Game ()
DECLARE SUB EndScreen ()
DECLARE SUB MakeMap ()
DECLARE SUB NewGame ()
DECLARE SUB eAttack ()
DECLARE SUB tDelay (Sec!)
DECLARE SUB Die ()
DECLARE SUB DrawFight ()
DECLARE SUB Fight ()
DECLARE SUB Center (Text$, Row!, Col!)
DECLARE SUB CopyPlane (source!, dest!)
DECLARE SUB Flush ()
DECLARE SUB Translate (tp!, tx!, ty!, tz!)
DECLARE SUB zSort ()
DECLARE SUB RotateY (rp!, rd!)
DECLARE SUB Proj ()
DECLARE SUB DrawScreen ()
TYPE Point3D
        X AS DOUBLE
        Y AS DOUBLE
        z AS DOUBLE
        px AS DOUBLE
        py AS DOUBLE
        c AS INTEGER
END TYPE
CONST WORLD = 256, MODEL = 257
DIM SHARED ModelData(127, 3) AS INTEGER
DIM SHARED Plane(255, 4) AS Point3D, zBuff(255) AS INTEGER

DIM SHARED Frames, FrRate, FrTime

DIM SHARED X, Y, Dir!, Story
DIM SHARED Hp, mHp, Mp, mMp, St, Heal, Rest, MagicLevel, Gold
DIM SHARED SpellName$(3), SpellStr(3), SpellCost(3)
DIM SHARED NPC

ON ERROR GOTO ErrorHandler

SCREEN 7, , 1, 0: WINDOW (-159, -99)-(159, 99): RANDOMIZE TIMER

MakeMap

NewGame

Game

ErrorHandler:
    'Until I can clip the polygons proporly I'll just have to ignore
    'EVERYTHING thats going wrong.
    '
    'Well, I almost can now, but I'm still lazy, so lets still turn a blind
    'eye...
RESUME NEXT

SUB Center (Text$, Row, Col)
    COLOR Col: LOCATE Row, 20 - (LEN(Text$) \ 2): PRINT Text$
END SUB

SUB CopyPlane (source, dest)
    FOR i = 0 TO 4
        Plane(dest, i).X = Plane(source, i).X
        Plane(dest, i).Y = Plane(source, i).Y
        Plane(dest, i).z = Plane(source, i).z
        Plane(dest, i).c = Plane(source, i).c
        Plane(dest, i).px = Plane(source, i).px
        Plane(dest, i).py = Plane(source, i).py
    NEXT i
END SUB

SUB Cube (x1, y1, z1, x2, y2, z2, A)
END SUB

SUB Die
    DIM Box(32)

    FOR i = 0 TO 199 STEP 3
        FOR j = 0 TO 32
            LINE (-159 + (j * 10), 99)-(-169 + (j * 10), 99 - i - Box(j)), 4, BF
            Box(j) = Box(j) - 1 + INT(RND * 3)
            IF Box(j) < -2.5 THEN Box(j) = -2
            IF Box(j) > 2.5 THEN Box(j) = 2
        NEXT j
        PCOPY 1, 0: tDelay .001
    NEXT i

    FOR i = 0 TO 199 STEP 3
        FOR j = 0 TO 32
            LINE (-159 + (j * 10), 99)-(-169 + (j * 10), 99 - i - Box(j)), 0, BF
            Box(j) = Box(j) - 1 + INT(RND * 3)
            IF Box(j) < -2.5 THEN Box(j) = -2
            IF Box(j) > 2.5 THEN Box(j) = 2
        NEXT j
        PCOPY 1, 0: tDelay .001
    NEXT i

    CLS : Center "Press Any Key to Continue...", 1, 7: PCOPY 1, 0

    Flush
    WHILE INKEY$ = "": WEND

    EndScreen
END SUB

SUB DrawFight
    DrawScreen

    LINE (-10, 30)-(10, 10), 12, BF
    LINE (-15, 5)-(15, -45), 0, BF
    LINE (-15, -46)-(0, -95), 7, BF
    LINE (15, -46)-(1, -90), 8, BF

    FOR i = 0 TO 4
        LINE (-30 + i, -40)-(-50 + i, 10), 15
        LINE (-15 + i, 5)-(-30 + i, -40), 0
        LINE (15 + i, 5)-(-30 + i, -40), 0
    NEXT i

    LOCATE 3, 1
    PRINT " 1 Attack"
    PRINT " 2 Run"
    PRINT " 3 Heal (x"; Heal; ")"
    PRINT " 4 Restore (x"; Rest; ")"
    FOR i = 1 TO MagicLevel
        PRINT 4 + i; SpellName$(i); " ("; SpellCost(i)
    NEXT i
END SUB

SUB DrawScreen
    LINE (-159, -99)-(159, 0), 2, BF
    LINE (-159, 0)-(159, 99), 9, BF
    FOR j = 255 TO 0 STEP -1
        i = zBuff(j)
        IF Plane(i, 4).z > 0 AND (Plane(i, 0).z + Plane(i, 4).z) > 0 THEN
            IF (Plane(i, 1).z + Plane(i, 4).z) > 0 AND (Plane(i, 2).z + Plane(i, 4).z) > 0 THEN
                IF (Plane(i, 3).z + Plane(i, 4).z) > 0 THEN
                    LINE (Plane(i, 0).px, Plane(i, 0).py)-(Plane(i, 1).px, Plane(i, 1).py), Plane(i, 0).c
                    LINE (Plane(i, 1).px, Plane(i, 1).py)-(Plane(i, 3).px, Plane(i, 3).py), Plane(i, 0).c
                    LINE (Plane(i, 2).px, Plane(i, 2).py)-(Plane(i, 3).px, Plane(i, 3).py), Plane(i, 0).c
                    LINE (Plane(i, 0).px, Plane(i, 0).py)-(Plane(i, 2).px, Plane(i, 2).py), Plane(i, 0).c
                END IF
            END IF
        END IF
        'PAINT (Plane(i, 4).px, Plane(i, 4).py), Plane(i, 0).c
    NEXT j

    Center "Hp:" + STR$(Hp) + "/" + STR$(mHp) + "   Mp:" + STR$(Mp) + "/" + STR$(mMp), 1, 15

    IF NPC >= 0 THEN Center "Press [SPACE] to Talk", 2, 15
   
    Center STR$(X) + STR$(Y), 3, 15
   
    Center STR$(FrRate), 4, 15

    Frames = Frames + 1

    PCOPY 1, 0
END SUB

SUB eAttack
    DrawFight
    LINE (-100, 20)-(0, 0), 14
    LINE (0, 20)-(-100, 0), 15
END SUB

SUB EndScreen
    SYSTEM
END SUB

SUB Fight

    IF Story = 0 THEN
        eHp = 60
        eSt = 8
    END IF

    Center "Halt!", 10, 15
    PCOPY 1, 0: WHILE INKEY$ <> CHR$(13): WEND

    DO: Escape = 0
        DrawFight
        PCOPY 1, 0
        DO: A$ = RIGHT$(INKEY$, 1)
            IF A$ = "1" THEN
                B = St - (St \ 2) + INT(RND * St)
                eHp = eHp - B
                Center "-" + STR$(B), 10, 15
                PCOPY 1, 0: tDelay .2: DrawFight
                EXIT DO
            END IF
            IF A$ = "2" THEN Escape = INT(RND * 50): EXIT DO
            IF A$ = "3" AND Heal > 0 THEN
                UseHeal
                Center "+80", 2, 14: EXIT DO
            END IF
            IF A$ = "4" AND Rest > 0 THEN
                UseRestore
                Center "+20", 2, 5: EXIT DO
            END IF
            IF VAL(A$) > 4 AND VAL(A$) < 10 THEN
            END IF
        LOOP

        IF Escape > 40 THEN EXIT DO

        IF eHp < 1 THEN EXIT DO

        B = eSt - (eSt \ 2) + INT(RND * eSt)
        Hp = Hp - eSt: eAttack
        Center "-" + STR$(B), 10, 15
        PCOPY 1, 0: tDelay .2: DrawFight: PCOPY 1, 0

        IF Hp < 1 THEN Die
    LOOP
    DrawScreen

    IF Escape > 40 THEN EXIT SUB

    B = INT(RND * 25)

    Center "Victory!", 9, 15

    IF B <= 3 THEN
        Center "The Bandit Dropped a Strength Potion!", 11, 15
        St = St + 2
    END IF

    IF B > 3 AND B <= 6 THEN
        Center "The Bandit Dropped a Defence Potion!", 11, 15
        mHp = mHp + 6
    END IF
   
    IF B > 6 AND B <= 9 THEN
        Center "The Bandit Dropped a Magic Potion!", 11, 15
        mMp = mMp + 2
    END IF

    IF B > 9 AND B <= 12 THEN
        Center "The Bandit Dropped a Heal Potion!", 11, 15
        Heal = Heal + 1
    END IF

    IF B > 12 AND B <= 15 THEN
        Center "The Bandit Dropped a Restore Potion!", 11, 15
        Rest = Rest + 1
    END IF

    IF B = 16 THEN
        Center "The Bandit was Booby-Trapped!", 12, 15
        Center "You are Poisoned!", 12, 15
        Hp = Hp - (eSt * 2): IF Hp < 1 THEN Die
    END IF

    IF B = 17 THEN
        Center "The Bandit dropped a Magic Scroll,", 11, 15
        Center "You've Learned a New Spell!", 12, 15
        MagicLevel = MagicLevel + 1
        IF MagicLevel > 3 THEN MagicLevel = 3
    END IF

    eGold = INT(RND * (St * 3))

    Center "You found &" + STR$(eGold) + " on the Corpse", 14, 15
    Gold = Gold + eGold

    PCOPY 1, 0: WHILE INKEY$ <> CHR$(13): WEND
END SUB

SUB Flush
    DO UNTIL INKEY$ = ""
    LOOP
END SUB

SUB Game
    zSort
    Proj
    DrawScreen
    DO: A$ = RIGHT$(INKEY$, 1)
        IF A$ = CHR$(27) THEN Quit
       
        IF A$ = ";" THEN UseHeal
        IF A$ = "<" THEN UseRestore
       
        IF A$ = "P" THEN
            Okay = 0
            'Main Boundary Collision Detecting
            IF Y - SIN(Dir!) >= -88 THEN
                IF Y - SIN(Dir!) < 90 THEN
                    IF X - COS(Dir!) < 179 THEN
                        IF X - COS(Dir!) >= -24 THEN Okay = 1
                    END IF
                END IF
            END IF
            'Inn Collison Detecting
            IF Y - SIN(Dir!) < -50 THEN
                IF X - COS(Dir!) < 0 THEN Okay = 0
            END IF
            'Shop Collison Detecting
            IF Y - SIN(Dir!) > 50 THEN
                IF X - COS(Dir!) < 1 THEN Okay = 0
            END IF
            'Castle Collision Detecting
            IF Y - SIN(Dir!) > 30 AND Y - SIN(Dir!) < 65 THEN
                IF X - COS(Dir!) >= 126 THEN Okay = 0
            END IF
            IF Okay = 1 THEN
                Translate WORLD, 0, 0, 5: zSort
                X = X - COS(Dir!): Y = Y - SIN(Dir!)
            END IF
        END IF
        IF A$ = "H" THEN
            Okay = 0
            'Main Boundary Collision Detecting
            IF Y + SIN(Dir!) >= -88 THEN
                IF Y + SIN(Dir!) < 90 THEN
                    IF X + COS(Dir!) < 179 THEN
                        IF X + COS(Dir!) >= -24 THEN Okay = 1
                    END IF
                END IF
            END IF
            'Inn collision Detecting
            IF Y + SIN(Dir!) < -50 THEN
                IF X + COS(Dir!) < 0 THEN Okay = 0
            END IF
            'Shop Collison Detecting
            IF Y + SIN(Dir!) > 50 THEN
                IF X + COS(Dir!) < 1 THEN Okay = 0
            END IF
            'Castle Collision Detecting
            IF Y + SIN(Dir!) > 30 AND Y + SIN(Dir!) < 65 THEN
                IF X + COS(Dir!) >= 126 THEN Okay = 0
            END IF
            IF Y + SIN(Dir!) < -30 AND Y + SIN(Dir!) > -64 THEN
                IF X + COS(Dir!) >= 126 THEN Okay = 0
            END IF
            IF Y + SIN(Dir!) < 30 AND Y + SIN(Dir!) > -30 THEN
                IF X + COS(Dir!) >= 133 THEN Okay = 0
            END IF
            IF Okay = 1 THEN
                Translate WORLD, 0, 0, -5: zSort
                X = X + COS(Dir!): Y = Y + SIN(Dir!)
            END IF
        END IF
        IF A$ = "K" THEN RotateY WORLD, .1: zSort: Dir! = Dir! + .1
        IF A$ = "M" THEN RotateY WORLD, -.1: zSort: Dir! = Dir! - .1
     
        NPC = -1
        IF X >= 7 AND X <= 12 AND Y >= -2 AND Y <= 2 THEN NPC = 0
        IF X >= 19 AND X <= 21 AND Y >= -62 AND Y <= -57 THEN NPC = 1
        IF X >= 13 AND X <= 14 AND Y >= 24 AND Y <= 33 THEN NPC = 2
        IF X >= 24 AND X <= 30 AND Y >= 13 AND Y <= 17 THEN NPC = 3
        IF X >= 45 AND X <= 55 AND Y >= -44 AND Y <= -35 THEN NPC = 4
        IF X >= 107 AND X <= 113 AND Y >= 46 AND Y <= 53 THEN NPC = 5
        IF X >= 136 AND X <= 144 AND Y >= 68 AND Y < 71 THEN NPC = 6
        IF X >= 156 AND X <= 163 AND Y >= -81 AND Y <= -79 THEN NPC = 7

        IF X >= 117 AND X <= 124 AND Y >= -2 AND Y <= 2 THEN NPC = 8

        IF X <= -8 AND X >= -14 AND Y >= 48 AND Y < 50 THEN NPC = 9
        IF X <= -8 AND X >= -14 AND Y >= -50 AND Y < -48 THEN NPC = 10

        IF Moved! < TIMER THEN
            Translate 5, 0, -5, 0
            IF Plane(5, 4).Y < -15 THEN Plane(5, 4).Y = 20
            RotateY 4, .5: RotateY 5, .5
            Proj
            DrawScreen
            Moved! = TIMER + .1
        END IF

        IF FrTime < TIMER THEN FrRate = Frames: Frames = 0: FrTime = TIMER + 1
       
        IF A$ = " " THEN
            IF NPC = 0 THEN NPC0
            IF NPC = 1 THEN NPC1
            IF NPC = 2 THEN NPC2
            IF NPC = 3 THEN NPC3
            IF NPC = 4 THEN NPC4
            IF NPC = 5 THEN NPC5
            IF NPC = 6 THEN NPC6
            IF NPC = 7 THEN NPC7
            IF NPC = 8 THEN GateKeeper
            IF NPC = 9 THEN Shop
            IF NPC = 10 THEN Inn
        END IF

        IF A$ <> "" THEN Flush
       
        'IF Okay = 1 THEN DrawScreen: Fight: DrawScreen
    LOOP
END SUB

SUB GateKeeper
END SUB

SUB Inn
    CLS
    Center "Welcome, I'm afraid we only have one", 3, 15
    Center "room free, the rest are full of", 5, 15
    Center "Marcus's Thugs...  None of whom", 7, 15
    Center "are Paying of course...", 9, 15

    Center "So its &80 for the room if you want", 11, 15
    Center "it, the Bed and the Food are good,", 13, 15
    Center "The company leave alot to be desired.", 15, 15

    Center "Do you want to Stay the Night[y/n]?", 19, 15

    PCOPY 1, 0

    WHILE INKEY$ = "": WEND

    CLS : PCOPY 1, 0: X = 0: Y = 0: Dir! = 0: MakeMap: Save
END SUB

SUB Load
    OPEN "Save.txt" FOR INPUT AS #1
        INPUT #1, Hp, mHp
        INPUT #1, Mp, mMp
        INPUT #1, St, MagicLevel
        INPUT #1, Heal, Rest
        INPUT #1, Gold, Story
    CLOSE #1
END SUB

SUB MakeMap
    'Man
    Plane(0, 0).c = 15
    Plane(0, 0).X = -4: Plane(0, 0).Y = -5: Plane(0, 0).z = 0
    Plane(0, 1).X = 4: Plane(0, 1).Y = -5: Plane(0, 1).z = 0
    Plane(0, 2).X = -4: Plane(0, 2).Y = 5: Plane(0, 2).z = 0
    Plane(0, 3).X = 4: Plane(0, 3).Y = 5: Plane(0, 3).z = 0
    Plane(0, 4).X = 0: Plane(0, 4).Y = 0: Plane(0, 4).z = 180
    zBuff(0) = 0
    Plane(1, 0).c = 1
    Plane(1, 0).X = -2: Plane(1, 0).Y = -5: Plane(1, 0).z = 0
    Plane(1, 1).X = 2: Plane(1, 1).Y = -5: Plane(1, 1).z = 0
    Plane(1, 2).X = -2: Plane(1, 2).Y = 5: Plane(1, 2).z = 0
    Plane(1, 3).X = 2: Plane(1, 3).Y = 5: Plane(1, 3).z = 0
    Plane(1, 4).X = 0: Plane(1, 4).Y = -10: Plane(1, 4).z = 180
    zBuff(1) = 1
    Plane(2, 0).c = 12
    Plane(2, 0).X = -2: Plane(2, 0).Y = -2: Plane(2, 0).z = 0
    Plane(2, 1).X = 2: Plane(2, 1).Y = -2: Plane(2, 1).z = 0
    Plane(2, 2).X = -2: Plane(2, 2).Y = 2: Plane(2, 2).z = 0
    Plane(2, 3).X = 2: Plane(2, 3).Y = 2: Plane(2, 3).z = 0
    Plane(2, 4).X = 0: Plane(2, 4).Y = 7: Plane(2, 4).z = 180
    zBuff(2) = 2
    ModelData(0, 0) = 0: ModelData(0, 1) = 1: ModelData(0, 2) = 2: ModelData(0, 3) = -1

    'Pool
    Plane(3, 0).c = 1
    Plane(3, 0).X = 0: Plane(3, 0).Y = 0: Plane(3, 0).z = 40
    Plane(3, 1).X = 40: Plane(3, 1).Y = 0: Plane(3, 1).z = 0
    Plane(3, 2).X = -40: Plane(3, 2).Y = 0: Plane(3, 2).z = 0
    Plane(3, 3).X = 0: Plane(3, 3).Y = 0: Plane(3, 3).z = -40
    Plane(3, 4).X = 0: Plane(3, 4).Y = -15: Plane(3, 4).z = 512
    zBuff(3) = 5

    'Fountain
    Plane(4, 0).c = 7
    Plane(4, 0).X = -2: Plane(4, 0).Y = -20: Plane(4, 0).z = 0
    Plane(4, 1).X = 2: Plane(4, 1).Y = -20: Plane(4, 1).z = 0
    Plane(4, 2).X = -2: Plane(4, 2).Y = 20: Plane(4, 2).z = 0
    Plane(4, 3).X = 2: Plane(4, 3).Y = 20: Plane(4, 3).z = 0
    Plane(4, 4).X = 0: Plane(4, 4).Y = 5: Plane(4, 4).z = 512
    zBuff(4) = 4

    'WaterFall
    Plane(5, 0).c = 1
    Plane(5, 0).X = -3: Plane(5, 0).Y = -3: Plane(5, 0).z = 0
    Plane(5, 1).X = 3: Plane(5, 1).Y = -3: Plane(5, 1).z = 0
    Plane(5, 2).X = -3: Plane(5, 2).Y = 3: Plane(5, 2).z = 0
    Plane(5, 3).X = 3: Plane(5, 3).Y = 3: Plane(5, 3).z = 0
    Plane(5, 4).X = 0: Plane(5, 4).Y = 0: Plane(5, 4).z = 512
    zBuff(5) = 3

    'Wall
    Plane(7, 0).c = 8
    Plane(7, 0).X = -20: Plane(7, 0).Y = 20: Plane(7, 0).z = 0
    Plane(7, 1).X = 20: Plane(7, 1).Y = 20: Plane(7, 1).z = 0
    Plane(7, 2).X = -20: Plane(7, 2).Y = -20: Plane(7, 2).z = 0
    Plane(7, 3).X = 20: Plane(7, 3).Y = -20: Plane(7, 3).z = 0
    Plane(7, 4).X = -480: Plane(7, 4).Y = 5: Plane(7, 4).z = 1024
    zBuff(7) = 7
    FOR i = 0 TO 24
        CopyPlane 7 + i, 8 + i: zBuff(8 + i) = 8 + i: Translate 8 + i, 40, 0, 0
    NEXT i
    CopyPlane 7, 34: Translate 34, 0, 0, -1024
    FOR i = 0 TO 24
        CopyPlane 34 + i, 35 + i: zBuff(35 + i) = 35 + i: Translate 35 + i, 40, 0, 0
    NEXT i
    Plane(60, 0).c = 8
    Plane(60, 0).X = 0: Plane(60, 0).Y = 20: Plane(60, 0).z = -20
    Plane(60, 1).X = 0: Plane(60, 1).Y = 20: Plane(60, 1).z = 20
    Plane(60, 2).X = 0: Plane(60, 2).Y = -20: Plane(60, 2).z = -20
    Plane(60, 3).X = 0: Plane(60, 3).Y = -20: Plane(60, 3).z = 20
    Plane(60, 4).X = -450: Plane(60, 4).Y = 5: Plane(60, 4).z = 1024
    zBuff(60) = 60
    FOR i = 0 TO 24
        CopyPlane 60 + i, 61 + i: zBuff(61 + i) = 61 + i: Translate 61 + i, 0, 0, -40
    NEXT i
    CopyPlane 60, 86: zBuff(86) = 86: Translate 86, 900, 0, 0
    FOR i = 0 TO 24
        CopyPlane 86 + i, 87 + i: zBuff(87 + i) = 87 + i: Translate 87 + i, 0, 0, -40
    NEXT i

    'Shop
    Plane(112, 0).c = 7
    Plane(112, 0).X = -20: Plane(112, 0).Y = 30: Plane(112, 0).z = 0
    Plane(112, 1).X = 20: Plane(112, 1).Y = 30: Plane(112, 1).z = 0
    Plane(112, 2).X = -20: Plane(112, 2).Y = -30: Plane(112, 2).z = 0
    Plane(112, 3).X = 20: Plane(112, 3).Y = -30: Plane(112, 3).z = 0
    Plane(112, 4).X = -420: Plane(112, 4).Y = 15: Plane(112, 4).z = 10
    zBuff(112) = 112
    CopyPlane 112, 113
    FOR i = 0 TO 5
        CopyPlane 113 + i, 114 + i: zBuff(114 + i) = 114 + i: Translate 114 + i, 40, 0, 0
    NEXT i
    CopyPlane 112, 117: zBuff(117) = 117: Translate 117, 0, 0, 120
    FOR i = 0 TO 2
        CopyPlane 117 + i, 118 + i: zBuff(118 + i) = 118 + i: Translate 118 + i, 40, 0, 0
    NEXT i
    Plane(121, 0).c = 7
    Plane(121, 0).X = 0: Plane(121, 0).Y = 30: Plane(121, 0).z = -20
    Plane(121, 1).X = 0: Plane(121, 1).Y = 30: Plane(121, 1).z = 20
    Plane(121, 2).X = 0: Plane(121, 2).Y = -30: Plane(121, 2).z = -20
    Plane(121, 3).X = 0: Plane(121, 3).Y = -30: Plane(121, 3).z = 20
    Plane(121, 4).X = -440: Plane(121, 4).Y = 15: Plane(121, 4).z = 30
    zBuff(121) = 121
    FOR i = 0 TO 1
        CopyPlane 121 + i, 122 + i: zBuff(122 + i) = 122 + i: Translate 122 + i, 0, 0, 40
    NEXT i
    CopyPlane 121, 125: zBuff(125) = 125: Translate 125, 160, 0, 0
    CopyPlane 125, 126: zBuff(126) = 126: Translate 126, 0, 0, 80

    'INN
    Plane(127, 0).c = 7
    Plane(127, 0).X = -20: Plane(127, 0).Y = 30: Plane(127, 0).z = 0
    Plane(127, 1).X = 20: Plane(127, 1).Y = 30: Plane(127, 1).z = 0
    Plane(127, 2).X = -20: Plane(127, 2).Y = -30: Plane(127, 2).z = 0
    Plane(127, 3).X = 20: Plane(127, 3).Y = -30: Plane(127, 3).z = 0
    Plane(127, 4).X = 300: Plane(127, 4).Y = 15: Plane(127, 4).z = 10
    zBuff(127) = 127
    CopyPlane 127, 128
    FOR i = 0 TO 2
        CopyPlane 127 + i, 128 + i: zBuff(128 + i) = 128 + i: Translate 128 + i, 40, 0, 0
    NEXT i
    CopyPlane 127, 134: zBuff(134) = 134: Translate 134, 0, 0, 120
    FOR i = 0 TO 2
        CopyPlane 134 + i, 135 + i: zBuff(135 + i) = 135 + i: Translate 135 + i, 40, 0, 0
    NEXT i
    Plane(138, 0).c = 7
    Plane(138, 0).X = 0: Plane(138, 0).Y = 30: Plane(138, 0).z = -20
    Plane(138, 1).X = 0: Plane(138, 1).Y = 30: Plane(138, 1).z = 20
    Plane(138, 2).X = 0: Plane(138, 2).Y = -30: Plane(138, 2).z = -20
    Plane(138, 3).X = 0: Plane(138, 3).Y = -30: Plane(138, 3).z = 20
    Plane(138, 4).X = 440: Plane(138, 4).Y = 15: Plane(138, 4).z = 30
    zBuff(138) = 138
    FOR i = 0 TO 1
        CopyPlane 138 + i, 139 + i: zBuff(139 + i) = 139 + i: Translate 139 + i, 0, 0, 40
    NEXT i
    CopyPlane 140, 141: zBuff(141) = 141: Translate 141, -160, 0, 0
    CopyPlane 141, 142: zBuff(142) = 142: Translate 142, 0, 0, -80

    'Castle
    Plane(143, 0).c = 15
    Plane(143, 0).X = -20: Plane(143, 0).Y = 70: Plane(143, 0).z = 0
    Plane(143, 1).X = 20: Plane(143, 1).Y = 70: Plane(143, 1).z = 0
    Plane(143, 2).X = -20: Plane(143, 2).Y = -70: Plane(143, 2).z = 0
    Plane(143, 3).X = 20: Plane(143, 3).Y = -70: Plane(143, 3).z = 0
    Plane(143, 4).X = -300: Plane(143, 4).Y = 55: Plane(143, 4).z = 1000
    zBuff(143) = 143
    FOR i = 0 TO 14
        CopyPlane 143 + i, 144 + i: zBuff(144 + i) = 144 + i: Translate 144 + i, 40, 0, 0
    NEXT i
    CopyPlane 143, 160: zBuff(160) = 160: Translate 160, 0, 0, -240
    FOR i = 0 TO 2
        CopyPlane 160 + i, 161 + i: zBuff(161 + i) = 161 + i: Translate 161 + i, 40, 0, 0
    NEXT i
    CopyPlane 158, 164: zBuff(164) = 164: Translate 164, 0, 0, -240
    FOR i = 0 TO 2
        CopyPlane 164 + i, 165 + i: zBuff(165 + i) = 165 + i: Translate 165 + i, -40, 0, 0
    NEXT i
    CopyPlane 147, 168: zBuff(168) = 168: Translate 168, 0, 0, -200: Plane(168, 0).c = 7
    FOR i = 0 TO 7
        CopyPlane 168 + i, 169 + i: zBuff(169 + i) = 169 + i: Translate 169 + i, 40, 0, 0
    NEXT i
    FOR i = 0 TO 15 STEP 2
        Plane(161 + i, 0).Y = Plane(161 + i, 0).Y - 20
        Plane(161 + i, 1).Y = Plane(161 + i, 1).Y - 20
    NEXT i
    Plane(176, 0).c = 15
    Plane(176, 0).X = 0: Plane(176, 0).Y = 70: Plane(176, 0).z = -20
    Plane(176, 1).X = 0: Plane(176, 1).Y = 70: Plane(176, 1).z = 20
    Plane(176, 2).X = 0: Plane(176, 2).Y = -70: Plane(176, 2).z = -20
    Plane(176, 3).X = 0: Plane(176, 3).Y = -70: Plane(176, 3).z = 20
    Plane(176, 4).X = -320: Plane(176, 4).Y = 55: Plane(176, 4).z = 980
    FOR i = 0 TO 4
        CopyPlane 176 + i, 177 + i: zBuff(177 + i) = 177 + i: Translate 177 + i, 0, 0, -40
    NEXT i
    CopyPlane 176, 182: zBuff(182) = 182: Translate 182, 640, 0, 0
    FOR i = 0 TO 4
        CopyPlane 182 + i, 183 + i: zBuff(183 + i) = 183 + i: Translate 183 + i, 0, 0, -40
    NEXT i
    CopyPlane 181, 189: zBuff(189) = 189: Translate 189, 160, 0, 0
    CopyPlane 181, 190: zBuff(190) = 190: Translate 190, 480, 0, 0

    'Warlord
    FOR i = 0 TO 2
        CopyPlane i, 191 + i: zBuff(191 + i) = 191 + i
        Translate 191 + i, -5, 0, 750: ModelData(1, i) = 191 + i
    NEXT i: Plane(191, 0).c = 0: Plane(192, 0).c = 0

    'INNKEEPER
    FOR i = 0 TO 2
        CopyPlane i, 194 + i: zBuff(194 + i) = 194 + i
        Translate 194 + i, -300, 0, -110
        RotateY 194 + i, 1.5
        ModelData(1, i) = 194 + i
    NEXT i: Plane(194, 0).c = 1: Plane(195, 0).c = 4

    'SHOPKEEPER
    FOR i = 0 TO 2
        CopyPlane i, 197 + i: zBuff(197 + i) = 197 + i
        Translate 197 + i, 300, 0, -110
        RotateY 197 + i, 1.5
        ModelData(1, i) = 197 + i
    NEXT i: Plane(197, 0).c = 1: Plane(198, 0).c = 4

    'HOSTAGE
    Plane(199, 0).c = 12
    Plane(199, 0).X = 0: Plane(199, 0).Y = 3: Plane(199, 0).z = 0
    Plane(199, 1).X = 3: Plane(199, 1).Y = 0: Plane(199, 1).z = 0
    Plane(199, 2).X = -3: Plane(199, 2).Y = 0: Plane(199, 2).z = 0
    Plane(199, 3).X = 0: Plane(199, 3).Y = -4: Plane(199, 3).z = 0
    Plane(199, 4).X = 0: Plane(199, 4).Y = 10: Plane(199, 4).z = 980
    zBuff(199) = 199
    Plane(200, 0).c = 1
    Plane(200, 0).X = -3: Plane(200, 0).Y = 3: Plane(200, 0).z = 0
    Plane(200, 1).X = 3: Plane(200, 1).Y = 3: Plane(200, 1).z = 0
    Plane(200, 2).X = -3: Plane(200, 2).Y = -3: Plane(200, 2).z = 0
    Plane(200, 3).X = 3: Plane(200, 3).Y = -3: Plane(200, 3).z = 0
    Plane(200, 4).X = 0: Plane(200, 4).Y = 10: Plane(200, 4).z = 981
    zBuff(200) = 200
    Plane(201, 0).c = 12
    Plane(201, 0).X = -13: Plane(201, 0).Y = 0: Plane(201, 0).z = 0
    Plane(201, 1).X = 13: Plane(201, 1).Y = 0: Plane(201, 1).z = 0
    Plane(201, 2).X = -13: Plane(201, 2).Y = -1: Plane(201, 2).z = 0
    Plane(201, 3).X = 13: Plane(201, 3).Y = -1: Plane(201, 3).z = 0
    Plane(201, 4).X = 0: Plane(201, 4).Y = 5: Plane(201, 4).z = 981
    zBuff(201) = 203
    Plane(202, 0).c = 0
    Plane(202, 0).X = -3: Plane(202, 0).Y = 0: Plane(202, 0).z = 0
    Plane(202, 1).X = 3: Plane(202, 1).Y = 0: Plane(202, 1).z = 0
    Plane(202, 2).X = -4: Plane(202, 2).Y = -1: Plane(202, 2).z = -2
    Plane(202, 3).X = 4: Plane(202, 3).Y = -1: Plane(202, 3).z = -2
    Plane(202, 4).X = 0: Plane(202, 4).Y = 4: Plane(202, 4).z = 980
    zBuff(202) = 201
    Plane(203, 0).c = 0
    Plane(203, 0).X = -4: Plane(203, 0).Y = 0: Plane(203, 0).z = -2
    Plane(203, 1).X = 4: Plane(203, 1).Y = 0: Plane(203, 1).z = -2
    Plane(203, 2).X = -3: Plane(203, 2).Y = -1: Plane(203, 2).z = 0
    Plane(203, 3).X = 3: Plane(203, 3).Y = -1: Plane(203, 3).z = 0
    Plane(203, 4).X = 0: Plane(203, 4).Y = 3: Plane(203, 4).z = 980
    zBuff(203) = 202
    Plane(204, 0).c = 0 '12
    Plane(204, 0).X = -2: Plane(204, 0).Y = 3: Plane(204, 0).z = 0
    Plane(204, 1).X = 2: Plane(204, 1).Y = 3: Plane(204, 1).z = 0
    Plane(204, 2).X = -2: Plane(204, 2).Y = -5: Plane(204, 2).z = 0
    Plane(204, 3).X = 2: Plane(204, 3).Y = -5: Plane(204, 3).z = 0
    Plane(204, 4).X = 0: Plane(204, 4).Y = 0: Plane(204, 4).z = 980
    zBuff(204) = 204
    Plane(205, 0).c = 0
    Plane(205, 0).X = -3: Plane(205, 0).Y = 3: Plane(205, 0).z = 0
    Plane(205, 1).X = 3: Plane(205, 1).Y = 3: Plane(205, 1).z = 0
    Plane(205, 2).X = -5: Plane(205, 2).Y = -2: Plane(205, 2).z = 0
    Plane(205, 3).X = 5: Plane(205, 3).Y = -2: Plane(205, 3).z = 0
    Plane(205, 4).X = 0: Plane(205, 4).Y = -6: Plane(205, 4).z = 979
    zBuff(205) = 205
    Plane(206, 0).c = 15 '12
    Plane(206, 0).X = -2: Plane(206, 0).Y = 4: Plane(206, 0).z = 0
    Plane(206, 1).X = 2: Plane(206, 1).Y = 4: Plane(206, 1).z = 0
    Plane(206, 2).X = -2: Plane(206, 2).Y = -4: Plane(206, 2).z = 0
    Plane(206, 3).X = 2: Plane(206, 3).Y = -4: Plane(206, 3).z = 0
    Plane(206, 4).X = 0: Plane(206, 4).Y = -12: Plane(206, 4).z = 980
    zBuff(206) = 206

    'Guard at Gate
    FOR i = 0 TO 2
        CopyPlane i, 207 + i: zBuff(207 + i) = 207 + i: Translate 207 + i, 0, 0, 550
    NEXT i: Plane(207, 0).c = 0: Plane(208, 0).c = 8

    'NPC 1
    B = INT(RND * 6.2)
    FOR i = 0 TO 2
        CopyPlane i, 210 + i: zBuff(210 + i) = 210 + i: Translate 210 + i, 200, 0, 200: RotateY 210 + i, B
    NEXT i

    'NPC 2
    B = INT(RND * 6.2)
    FOR i = 0 TO 2
        CopyPlane i, 213 + i: zBuff(213 + i) = 213 + i: Translate 213 + i, 300, 0, 50: RotateY 213 + i, B
    NEXT i

    'NPC 3
    B = INT(RND * 6.2)
    FOR i = 0 TO 2
        CopyPlane i, 216 + i: zBuff(216 + i) = 216 + i: Translate 216 + i, -80, 0, 80: RotateY 216 + i, B
    NEXT i

    'NPC 4
    B = INT(RND * 6.2)
    FOR i = 0 TO 2
        CopyPlane i, 219 + i: zBuff(219 + i) = 219 + i: Translate 219 + i, -250, 0, 500: RotateY 219 + i, B
    NEXT i

    'NPC 5
    B = INT(RND * 6.2)
    FOR i = 0 TO 2
        CopyPlane i, 222 + i: zBuff(222 + i) = 222 + i: Translate 222 + i, -150, 0, 20: RotateY 222 + i, B
    NEXT i

    'NPC 6
    B = INT(RND * 6.2)
    FOR i = 0 TO 2
        CopyPlane i, 225 + i: zBuff(225 + i) = 225 + i: Translate 225 + i, -350, 0, 650: RotateY 225 + i, B
    NEXT i
   
    'NPC 7
    B = INT(RND * 6.2)
    FOR i = 0 TO 2
        CopyPlane i, 228 + i: zBuff(228 + i) = 228 + i: Translate 228 + i, 400, 0, 750: RotateY 228 + i, B
    NEXT i

    Translate WORLD, 0, -5, -128
END SUB

SUB NewGame
    Hp = 100
    mHp = 100
    Mp = 4
    mMp = 4
    St = 10
    Heal = 5
    Rest = 5

    X = 0
    Y = 0
END SUB

SUB NPC0
END SUB

SUB NPC1
        
END SUB

SUB NPC2
    END
END SUB

SUB NPC3
    END
END SUB

SUB NPC4
    END
END SUB

SUB NPC5
    END
END SUB

SUB NPC6
    END
END SUB

SUB NPC7
    END
END SUB

SUB Proj

FOR i = 0 TO 255: FOR j = 0 TO 3
        IF Plane(i, 4).z > 0 AND (Plane(i, j).z + Plane(i, 4).z) > 0 THEN
            Plane(i, j).px = (Plane(i, j).X + Plane(i, 4).X) / ((Plane(i, j).z + Plane(i, 4).z) / 256)
            Plane(i, j).py = (Plane(i, j).Y + Plane(i, 4).Y) / ((Plane(i, j).z + Plane(i, 4).z) / 256)
        END IF
    NEXT j
    IF Plane(i, 4).z > 0 THEN
        Plane(i, 4).px = Plane(i, 4).X / (Plane(i, 4).z / 256)
        Plane(i, 4).py = Plane(i, 4).Y / (Plane(i, 4).z / 256)
    END IF
NEXT i

END SUB

SUB Quit
    Center "Are you Sure you want to Quit[y/n]?", 10, 15
    PCOPY 1, 0
    DO: A$ = RIGHT$(UCASE$(INKEY$), 1)
        IF A$ = "Y" THEN EndScreen
        IF A$ = "N" THEN EXIT DO
    LOOP
    DrawScreen
END SUB

SUB RotateY (rp, rd)
    IF rp >= MODEL THEN
        FOR i = 0 TO 3
            IF ModelData(rp - MODEL, i) = -1 THEN EXIT FOR
            FOR j = 0 TO 3
                NewZ = Plane(ModelData(rp - MODEL, i), j).z * COS(rd) - Plane(ModelData(rp - MODEL, i), j).X * SIN(rd)
                NewX = Plane(ModelData(rp - MODEL, i), j).X * COS(rd) + Plane(ModelData(rp - MODEL, i), j).z * SIN(rd)
                Plane(ModelData(rp - MODEL, i), j).X = NewX
                Plane(ModelData(rp - MODEL, i), j).z = NewZ
            NEXT j
        NEXT i
        EXIT SUB
    END IF
    IF rp = WORLD THEN
        FOR i = 0 TO 255
            NewZ = Plane(i, 4).z * COS(rd) - Plane(i, 4).X * SIN(rd)
            NewX = Plane(i, 4).X * COS(rd) + Plane(i, 4).z * SIN(rd)
            Plane(i, 4).X = NewX
            Plane(i, 4).z = NewZ

            FOR j = 0 TO 3
                NewZ = Plane(i, j).z * COS(rd) - Plane(i, j).X * SIN(rd)
                NewX = Plane(i, j).X * COS(rd) + Plane(i, j).z * SIN(rd)
                Plane(i, j).X = NewX
                Plane(i, j).z = NewZ
            NEXT j
        NEXT i
        EXIT SUB
    END IF
    FOR i = 0 TO 3
        NewZ = Plane(rp, i).z * COS(rd) - Plane(rp, i).X * SIN(rd)
        NewX = Plane(rp, i).X * COS(rd) + Plane(rp, i).z * SIN(rd)
        Plane(rp, i).X = NewX
        Plane(rp, i).z = NewZ
    NEXT i
END SUB

SUB Save
    Center "Are you Sure you want to Save[y/n]?", 10, 15
    PCOPY 1, 0
    DO: A$ = RIGHT$(UCASE$(INKEY$), 1)
        IF A$ = "Y" THEN EXIT DO
        IF A$ = "N" THEN EXIT SUB
    LOOP
    OPEN "Save.txt" FOR OUTPUT AS #1
        PRINT #1, Hp, mHp
        PRINT #1, Mp, mMp
        PRINT #1, St, MagicLevel
        PRINT #1, Heal, Rest
        PRINT #1, Gold, Story
    CLOSE #1
END SUB

SUB Shop
    CLS

    Center "Welcome to my Shop", 1, 15
    Center "We don't do much buisiness nowadays,", 3, 15
    Center "But we get buy...  Get it?  Get buy?", 5, 15
    Center "Well...   We have to keep our Spirits", 7, 15
    Center "up somehow...  What can I do for you?", 9, 15
    Center "We Don't have much, but I can guarentee", 11, 15
    Center "The Prices WONT be beaten.", 13, 15

    Center "1...Heal (60)     (80) Restore...2", 17, 15
    Center "3...St Potion (250) Df Poition...4", 19, 15
    Center "5...Magic Potion (600)", 21, 15
   
    PCOPY 1, 0: Flush
    WHILE INKEY$ = "": WEND
END SUB

SUB tDelay (Sec!)
    T! = TIMER: WHILE T! + Sec! > TIMER: WEND
END SUB

SUB Translate (tp, tx, ty, tz)
    IF tp >= MODEL THEN
        FOR i = 0 TO 3
            IF ModelData(rp - MODEL, i) = -1 THEN EXIT FOR
            Plane(ModelData(tp - MODEL, i), 4).X = Plane(ModelData(tp - MODEL, i), 4).X + tx
            Plane(ModelData(tp - MODEL, i), 4).Y = Plane(ModelData(tp - MODEL, i), 4).Y + ty
            Plane(ModelData(tp - MODEL, i), 4).z = Plane(ModelData(tp - MODEL, i), 4).z + tz
        NEXT i
        EXIT SUB
    END IF
    IF tp = WORLD THEN
        FOR i = 0 TO 255
            Plane(i, 4).X = Plane(i, 4).X + tx
            Plane(i, 4).Y = Plane(i, 4).Y + ty
            Plane(i, 4).z = Plane(i, 4).z + tz
        NEXT i
        EXIT SUB
    END IF

    Plane(tp, 4).X = Plane(tp, 4).X + tx
    Plane(tp, 4).Y = Plane(tp, 4).Y + ty
    Plane(tp, 4).z = Plane(tp, 4).z + tz
END SUB

SUB UseHeal
    IF Heal > 0 THEN
        Hp = Hp + 80: Heal = Heal - 1
        IF Hp > mHp THEN Hp = mHp
    END IF
END SUB

SUB UseRestore
    IF Rest > 0 THEN
        Mp = Mp + 20: Rest = Rest - 1
        IF Mp > mMp THEN Mp = mMp
    END IF
END SUB

SUB zSort
    DO
        Swapped = 0
        FOR i = 254 TO 0 STEP -1
            IF Plane(zBuff(i), 4).z > Plane(zBuff(i + 1), 4).z THEN
                SWAP zBuff(i), zBuff(i + 1)
                Swapped = 1
            END IF
        NEXT i
        IF Swapped = 0 THEN EXIT DO
    LOOP
END SUB

