1068 lines
35 KiB
ArmAsm
Executable File
1068 lines
35 KiB
ArmAsm
Executable File
* External references
|
|
; endgame.s
|
|
GAMEWON EXT
|
|
; jewel.of.kaldun.s
|
|
DATA EXT
|
|
|
|
********************************
|
|
* Main Control Loop *
|
|
********************************
|
|
CTRLLOOP STA KEYSTROB
|
|
MOVB #2;SNUM
|
|
LDA #%00000000
|
|
STA DRAWFLAG
|
|
LDX CX
|
|
LDY CY
|
|
JSR MAPINDEX
|
|
CMP #3
|
|
BEQ :SETFLAG
|
|
CMP #5
|
|
BNE :KEYLOOP
|
|
:SETFLAG LDA #%10000000
|
|
STA DRAWFLAG
|
|
:KEYLOOP JSR M:GETKEY
|
|
PHA
|
|
JSR MONCHECK ; check for new monsters
|
|
JSR CBOT3
|
|
PLA
|
|
CMP #ESCAPE
|
|
BNE :CHKKEY
|
|
JSR GAMEDONE
|
|
JMP :KEYLOOP
|
|
:CHKKEY JSR CHARCAPS
|
|
:CONT CMP #"I"
|
|
BEQ :_UP
|
|
CMP #"M"
|
|
BEQ :_DOWN
|
|
CMP #"J"
|
|
BEQ :_LEFT
|
|
CMP #"K"
|
|
BEQ :_RIGHT
|
|
CMP #"F"
|
|
BEQ :_FIGHT
|
|
CMP #"$"
|
|
BEQ :_SAVE
|
|
CMP #"O"
|
|
BEQ :_OPENCH
|
|
CMP #"U"
|
|
BEQ :_UNLOCK
|
|
CMP #"R"
|
|
BEQ :_REST
|
|
CMP #"S"
|
|
BEQ :_SEARCH
|
|
CMP #"H"
|
|
BEQ :_HEALTH
|
|
CMP #"W"
|
|
BEQ :_WEALTH
|
|
CMP #"A"
|
|
BEQ :_ASCEND
|
|
CMP #"D"
|
|
BEQ :_DESCEN
|
|
CMP #"L"
|
|
BEQ :_LOOK
|
|
CMP #"T"
|
|
BEQ :_TAKE
|
|
CMP #"?"
|
|
BEQ :_HELP
|
|
JSR CBOT3
|
|
JMP :KEYLOOP
|
|
:_UP JMP M:UP ; command table
|
|
:_DOWN JMP M:DOWN
|
|
:_LEFT JMP M:LEFT
|
|
:_RIGHT JMP M:RIGHT
|
|
:_FIGHT JMP M:FIGHT
|
|
:_SAVE JMP SAVER
|
|
:_OPENCH JMP M:OPENCH
|
|
:_UNLOCK JMP M:UNLOCK
|
|
:_SEARCH JMP M:SEARCH
|
|
:_HEALTH JMP M:HEALTH
|
|
:_WEALTH JMP M:WEALTH
|
|
:_REST JMP M:REST
|
|
:_ASCEND JMP M:ASCEND
|
|
:_DESCEN JMP M:DESCEN
|
|
:_LOOK JMP M:LOOK
|
|
:_TAKE JMP M:TAKE
|
|
:_HELP JMP M:HELP
|
|
|
|
********************************
|
|
* Gets a key, keeping counters *
|
|
* randomizing. *
|
|
********************************
|
|
M:GETKEY STA KEYSTROB
|
|
:REPEAT INC RANDOM1
|
|
BNE :MORE
|
|
INC RANDOM2
|
|
BNE :MORE
|
|
INC RANDOM3
|
|
:MORE LDA KEYBOARD
|
|
BPL :REPEAT
|
|
RTS
|
|
RANDOM1 HEX 00
|
|
RANDOM2 HEX 00
|
|
RANDOM3 HEX 00
|
|
|
|
********************************
|
|
* Capitalizes character stored *
|
|
* in Accumulator. *
|
|
********************************
|
|
CHARCAPS CMP #"a" ; compare to "a"
|
|
BLT :CONT ; if Acc < "a" then exit
|
|
CMP #"z"+1 ; compare to "z"+1
|
|
BGE :CONT ; if Acc => "z"+1, exit
|
|
SEC
|
|
SBC #"a"-"A" ; capitalize char
|
|
:CONT RTS
|
|
|
|
********************************
|
|
* Get direction to do an act. *
|
|
********************************
|
|
DIR:X HEX 00 ; direction to go X
|
|
DIR:Y HEX 00 ; direction to go Y
|
|
M:GETDIR JSR M:GETKEY ; get a keypress
|
|
JSR CHARCAPS ; capitalize key
|
|
LDX #0
|
|
LDY #-1
|
|
CMP #"I"
|
|
BEQ :FOUND
|
|
LDY #1
|
|
CMP #"M"
|
|
BEQ :FOUND
|
|
LDY #0
|
|
LDX #-1
|
|
CMP #"J"
|
|
BEQ :FOUND
|
|
LDX #1
|
|
CMP #"K"
|
|
BNE M:GETDIR
|
|
:FOUND STX DIR:X ; exits with X, Y
|
|
STY DIR:Y ; and Acc relating to call.
|
|
RTS
|
|
|
|
********************************
|
|
* Print a help screen. *
|
|
********************************
|
|
M:HELP STA $C051 ; switch to text
|
|
JSR CLRSCRN ; clear the text screen
|
|
PRINT HELPMSG
|
|
JSR GETRET ; wait for a RETURN.
|
|
JSR CLRSCRN
|
|
STA $C050 ; switch to graphics
|
|
JSR STATLINE ; re-print status line
|
|
LDA #0
|
|
RTS
|
|
HELPMSG HEX 4083
|
|
ASC "<< Help >>"8D
|
|
ASC "Key Description"8D
|
|
ASC "--------- ----------------------------"8D
|
|
ASC "? Display this help screen."8D
|
|
ASC "$ Saves current game to disk."8D
|
|
ASC "A,D Tell Meltok to Ascend or"8D
|
|
ASC " Descend a ladder."8D
|
|
ASC "L,T,U Look, Take, or Unlock. Use"8D
|
|
ASC " direction keys to point."8D
|
|
ASC "O Open a chest that Meltok is"8D
|
|
ASC " standing over."8D
|
|
ASC "H,W,R Health, Wealth, or Rest."8D
|
|
ASC " Displays Meltoks' condition."8D
|
|
ASC " Rest heals Meltok by one HP."8D
|
|
ASC "F Fight monster, use dir keys."8D8D83
|
|
ASC "<< DIRECTION KEYS >>"8D83
|
|
ASC "(north)"8D83
|
|
ASC "I"8D83
|
|
ASC "(west) J K (east)"8D83
|
|
ASC "M"8D83
|
|
ASC "(south)"00
|
|
|
|
********************************
|
|
* Fight a monster. *
|
|
********************************
|
|
M:FIGHT PRINT FIGHTMSG
|
|
JSR M:GETDIR ; get direction offsets
|
|
ADDB CX;DIR:X;DIR:X
|
|
ADDB CY;DIR:Y;DIR:Y
|
|
LDX DIR:X
|
|
LDY DIR:Y
|
|
JSR MAPINDEX
|
|
CMP #12
|
|
BNE :NEXT01
|
|
JMP :AGHOST
|
|
:NEXT01 CMP #13
|
|
BNE :NEXT02
|
|
JMP :ABLOB
|
|
:NEXT02 CMP #14
|
|
BNE :NEXT03
|
|
JMP :AZOMBIE
|
|
:NEXT03 CMP #100
|
|
BNE :NEXT04
|
|
JMP :BLANK
|
|
:NEXT04 CMP #1
|
|
BNE :NEXT05
|
|
JMP :WALL
|
|
:NEXT05 CMP #3
|
|
BNE :NEXT06
|
|
JMP :DOOR
|
|
:NEXT06 CMP #4
|
|
BNE :NEXT07
|
|
JMP :DOOR
|
|
:NEXT07 CMP #5
|
|
BNE :NEXT08
|
|
JMP :DOOR
|
|
:NEXT08 CMP #6
|
|
BNE :NEXT09
|
|
JMP :CHEST
|
|
:NEXT09 CMP #7
|
|
BNE :NEXT10
|
|
JMP :CHEST
|
|
:NEXT10 CMP #8
|
|
BNE :NEXT11
|
|
JMP :LADDER
|
|
:NEXT11 CMP #9
|
|
BNE :NEXT12
|
|
JMP :THRONE
|
|
:NEXT12 CMP #10
|
|
BNE :NEXT13
|
|
JMP :JEWEL
|
|
:NEXT13 CMP #11
|
|
BNE :NEXT14
|
|
JMP :HOLDER
|
|
:NEXT14 CMP #98
|
|
BNE :NEXT15
|
|
JMP :WALL
|
|
:NEXT15 CMP #99
|
|
BNE :NEXT16
|
|
JMP :CHEST
|
|
:NEXT16 PRINT FIGHTHUH
|
|
LDA #0
|
|
RTS
|
|
:AGHOST LDA CLEVEL ; auto hit at lvl > 6
|
|
CMP #7
|
|
BGE :HITIT
|
|
LDA RANDOM1
|
|
AND #%00000011 ; 1 in 4 chance of hitting
|
|
BEQ :HITIT ; a ghost
|
|
:MISSED PRINT FIGHTMIS
|
|
LDA #0
|
|
RTS
|
|
:ABLOB LDA CLEVEL ; automatic hit at lvl > 2
|
|
CMP #3
|
|
BGE :HITIT
|
|
LDA RANDOM1
|
|
AND #%00000001 ; 50% chance of a blob
|
|
BEQ :HITIT
|
|
BNE :MISSED
|
|
:AZOMBIE LDA CLEVEL ; auto hit at lvl > 4
|
|
CMP #5
|
|
BGE :HITIT
|
|
LDA RANDOM1
|
|
AND #%00000001 ; 50% chance of a zombie
|
|
BNE :MISSED
|
|
:HITIT PRINT FIGHTHIT
|
|
JSR MONSBUZZ
|
|
JSR MONSHIT
|
|
LDA #0
|
|
RTS
|
|
:BLANK PRINT FIGHTBLA
|
|
LDA #0
|
|
RTS
|
|
:WALL PRINT FIGHTWAL
|
|
LDA #0
|
|
RTS
|
|
:DOOR PRINT FIGHTDOO
|
|
LDA #0
|
|
RTS
|
|
:CHEST PRINT FIGHTCHE
|
|
LDA #255 ; smashed chest
|
|
:DISAPPR PHA
|
|
LDX DIR:X
|
|
LDY DIR:Y
|
|
JSR MAPINDEX
|
|
PLA
|
|
STA (PTR),Y
|
|
JSR UPSCREEN
|
|
LDA #0
|
|
RTS
|
|
:LADDER PRINT FIGHTLAD
|
|
LDA #254 ; smashed ladder
|
|
JMP :DISAPPR
|
|
:THRONE PRINT FIGHTTHR
|
|
JSR GOTDAMAG
|
|
LDA #0
|
|
RTS
|
|
:JEWEL PRINT FIGHTJE1
|
|
LDY #5
|
|
:WAIT1 LDA #0
|
|
JSR WAIT
|
|
DEY
|
|
BNE :WAIT1
|
|
JSR GOTDAMAG
|
|
LDA #0 ; and erase all HP's!
|
|
STA HP
|
|
JSR STATUSHP
|
|
PRINT FIGHTJE2
|
|
LDY #5
|
|
:WAIT2 LDA #0
|
|
JSR WAIT
|
|
DEY
|
|
BNE :WAIT2
|
|
LDA #0
|
|
RTS
|
|
:HOLDER PRINT FIGHTHOL
|
|
LDA #0
|
|
RTS
|
|
MONSBUZZ MOVB #15;SNUM
|
|
LDA #%00000000
|
|
STA CLRFLAG
|
|
LDA #%10000000
|
|
STA XORFLAG
|
|
MOVB #4;HITCOUNT
|
|
:BUZZER LDY MAP_MNUM
|
|
LDA M_X0,Y
|
|
TAX
|
|
LDA M_X1,Y
|
|
PHA
|
|
LDA M_Y0,Y
|
|
TAY
|
|
PLA
|
|
JSR DRAWSHAP
|
|
MOVB #20;VOLUME
|
|
MOVB #150;DURATION
|
|
MOVB #$80;FREQUENC
|
|
JSR DONOISE
|
|
DEC HITCOUNT
|
|
BNE :BUZZER
|
|
LDA #0
|
|
STA XORFLAG
|
|
RTS
|
|
TEMP:X HEX 00
|
|
TEMP:Y HEX 00
|
|
FIGHTMSG HEX 825683
|
|
ASC "Fight which monster?"
|
|
HEX 00
|
|
FIGHTHUH HEX 825683
|
|
ASC "huh?"
|
|
HEX 00
|
|
FIGHTBLA HEX 825683
|
|
ASC "Swish..."
|
|
HEX 00
|
|
FIGHTWAL HEX 825683
|
|
ASC "You give the wall a sound beating."
|
|
HEX 00
|
|
FIGHTDOO HEX 825683
|
|
ASC "Thwop! A few nicks appear in the door."
|
|
HEX 00
|
|
FIGHTCHE HEX 825683
|
|
ASC "Thwump! The chest breaks into"8D83
|
|
ASC "splinters!"
|
|
HEX 00
|
|
FIGHTLAD HEX 825683
|
|
ASC "Whoops! Now you've destroyed the"8D83
|
|
ASC "ladder... better control your anger!"
|
|
HEX 00
|
|
FIGHTTHR HEX 825683
|
|
ASC "You hurt your hands as the blade"8D83
|
|
ASC "bounces off of the throne."
|
|
HEX 00
|
|
FIGHTJE1 HEX 825683
|
|
ASC "Oops. Now you've done it!"
|
|
HEX 00
|
|
FIGHTJE2 HEX 825683
|
|
ASC "The Jewel explodes!"
|
|
HEX 00
|
|
FIGHTHOL HEX 825683
|
|
ASC "Why?"
|
|
HEX 00
|
|
FIGHTMIS HEX 825683
|
|
ASC "You missed it!"
|
|
HEX 00
|
|
FIGHTHIT HEX 825683
|
|
ASC "You hit the monster!"
|
|
HEX 00
|
|
|
|
********************************
|
|
* Take some object. *
|
|
********************************
|
|
M:TAKE PRINT TAKEMSG
|
|
JSR M:GETDIR ; get direction offsets
|
|
ADDB CX;DIR:X;DIR:X
|
|
ADDB CY;DIR:Y;DIR:Y
|
|
LDX DIR:X
|
|
LDY DIR:Y
|
|
JSR MAPINDEX
|
|
CMP #10 ; check for JOK
|
|
BNE :NOWAY
|
|
LDA #11 ; place empty holder
|
|
STA (PTR),Y
|
|
LDA #$80 ; mark "special key" variable
|
|
STA SPKEY ; with $80 for have Jewel
|
|
PRINT GOTJEWEL
|
|
MOVW #LEVEL1;MAPADDR ; placing @ level 1
|
|
LDX #1 ; place main gate with a wall...
|
|
LDY #30 ; @(24,30) - (26,30)
|
|
JSR MAPINDEX ; trick to get address..
|
|
LDY #23 ; (x=24,25,26) set for x-1...
|
|
LDA #22 ; a wall --
|
|
STA (PTR),Y ; across
|
|
INY ; all
|
|
STA (PTR),Y ; of the
|
|
INY ; main
|
|
STA (PTR),Y ; gate!! No way out!
|
|
MOVW #LEVEL2;MAPADDR ; return to level 2
|
|
JSR UPSCREEN ; update screen at new location
|
|
MOVB #29;CY ; place Meltok in another
|
|
MOVB #4;CX ; position.
|
|
MOVB #-1;OX ; tell display routine
|
|
MOVB #-1;OY ; that the screen must
|
|
MOVB #-1;X0 ; be erased and redrawn
|
|
MOVB #-1;Y0
|
|
LDY #15
|
|
:PAUSE LDA #255
|
|
JSR WAIT ; pause a bit
|
|
DEY
|
|
BNE :PAUSE
|
|
PRINT TELEPORT
|
|
JSR UPSCREEN ; surprise!!
|
|
LDA #0
|
|
RTS
|
|
:NOWAY PRINT NOTEQUIP
|
|
RTS
|
|
TAKEMSG HEX 825683
|
|
ASC "What do you wish to take?"00
|
|
NOTEQUIP HEX 825683
|
|
ASC "I regret to inform you that you are"8D83
|
|
ASC "not equipped to take that!!"00
|
|
GOTJEWEL HEX 825683
|
|
ASC "As you pick up the Jewel, you realize"8D83
|
|
ASC "that there is probably some trap!"00
|
|
TELEPORT HEX 825683
|
|
ASC "Alas, you were right. You have been"8D83
|
|
ASC "teleported elsewhere in the castle!"00
|
|
|
|
********************************
|
|
* Look in some direction. *
|
|
********************************
|
|
M:LOOK PRINT LOOKMSG
|
|
JSR M:GETDIR ; get direction offsets
|
|
ADDB CX;DIR:X;DIR:X ; modify current x
|
|
ADDB CY;DIR:Y;DIR:Y ; and y
|
|
LDX DIR:X
|
|
LDY DIR:Y
|
|
JSR MAPINDEX ; get index at that location.
|
|
CMP #98 ; check for secret door
|
|
BNE :CONT255 ; if it is one, make it a
|
|
LDA #1 ; wall.
|
|
:CONT255 CMP #255 ; check if it is a smashed
|
|
BNE :CONT254 ; chest (#255)
|
|
PRINT SEE255
|
|
LDA #0
|
|
RTS
|
|
:CONT254 CMP #254 ; check if it is a smashed
|
|
BNE :CONT ; ladder (#254)
|
|
PRINT SEE254
|
|
LDA #0
|
|
RTS
|
|
:CONT CMP #99 ; check for special chest
|
|
BNE :CONT2 ; if it is one, do some
|
|
PRINT SEE99 ; special handling.
|
|
LDA #0
|
|
RTS
|
|
:CONT2 CMP #22 ; barred door
|
|
BNE :CONT3
|
|
PRINT SEE22 ; special handling
|
|
LDA #0
|
|
RTS
|
|
:CONT3 CMP #97 ; check if special door
|
|
BNE :MORE
|
|
LDA #4 ; make special door "locked"
|
|
:MORE CMP #15 ; no shapes => #15
|
|
BLT :DOLOOK ; this handles room desc.
|
|
LDA #0 ; fake it - blank space!
|
|
:DOLOOK PHA
|
|
JSR CBOT3 ; clear botton 3 lines
|
|
LDA #22 ; set vtab @ 22.
|
|
STA TLINE
|
|
JSR TEXTADDR
|
|
PLA
|
|
ASL ; multiply shape # by 2
|
|
TAY
|
|
LDA SEETABLE,Y ; get address of message
|
|
STA DATA ; and prepare for center
|
|
INY ; routine
|
|
LDA SEETABLE,Y
|
|
STA DATA+1
|
|
JSR CSTRING ; center string...
|
|
LDA #0
|
|
RTS
|
|
SEETABLE DA SEE00,SEE01,SEE02,SEE03,SEE04,SEE05
|
|
DA SEE06,SEE07,SEE08,SEE09,SEE10,SEE11
|
|
DA SEE12,SEE13,SEE14
|
|
SEE00 ASC "The empty air confounds you."00
|
|
SEE01 ASC "The wall appears very solid."00
|
|
SEE02 ASC "Huh? That's yourself!"00
|
|
SEE03 ASC "This door is standing wide open."00
|
|
SEE04 ASC "The door appears to be locked..."00
|
|
SEE05 ASC "Remember? You found the secret door!"00
|
|
SEE06 ASC "The chest might contain something!"00
|
|
SEE07 ASC "You glance at an empty chest."00
|
|
SEE08 ASC "That is a ladder."00
|
|
SEE09 ASC "You see an ornate throne."00
|
|
SEE10 ASC "That is the Jewel of Kaldun!!"00
|
|
SEE11 ASC "It appears to be an empty holder..."00
|
|
SEE12 ASC "You barely see the outline of a ghost."00
|
|
SEE13 ASC "You see a blob creeping up on you!"00
|
|
SEE14 ASC "Watch out! That is a zombie!"00
|
|
SEE22 HEX 825683
|
|
ASC "The door is barred. No way out!?"00
|
|
SEE99 HEX 825683
|
|
ASC "This chest has arcane symbols written"8D83
|
|
ASC "all over. It may be dangerous!"00
|
|
SEE254 HEX 825683
|
|
ASC "Whoa, that ladder is ruined!"00
|
|
SEE255 HEX 825683
|
|
ASC "Wow, you really smashed this chest."00
|
|
LOOKMSG HEX 825683
|
|
ASC "Look in which direction?"00
|
|
|
|
********************************
|
|
* Ascend a ladder. *
|
|
********************************
|
|
M:ASCEND LDX CX
|
|
LDY CY
|
|
JSR MAPINDEX ; get attr @ (x,y)
|
|
CMP #8 ; is it a ladder?
|
|
BNE :NOGO ; nope -- can't do.
|
|
LDA #>LEVEL1 ; check if on first
|
|
CMP MAPADDR+1 ; level...
|
|
BNE :CANT ; cant ascend!
|
|
PRINT DOASCEND
|
|
MOVW #LEVEL2;MAPADDR ; point to 2nd level
|
|
MOVB #-1;OX ; notify update routine
|
|
MOVB #-1;OY ; that the screen must
|
|
MOVB #-1;X0 ; be cleared first.
|
|
MOVB #-1;Y0
|
|
LDA #1 ; ensure game is continued,
|
|
RTS ; and map is updated
|
|
:CANT PRINT NOASCEND
|
|
RTS
|
|
:NOGO PRINT NOLADDER
|
|
RTS
|
|
DOASCEND HEX 825683
|
|
ASC "Climbing up the ladder..."00
|
|
NOLADDER HEX 825683
|
|
ASC "Meltok looks around and fails to"8D83
|
|
ASC "find a ladder that is near him!"00
|
|
NOASCEND HEX 825683
|
|
ASC "You are already on the second level!"00
|
|
|
|
********************************
|
|
* Allow Meltok to descend a *
|
|
* ladder. *
|
|
********************************
|
|
M:DESCEN LDX CX
|
|
LDY CY
|
|
JSR MAPINDEX ; get attr @ (x,y)
|
|
CMP #8 ; is it a ladder?
|
|
BNE :NOGO ; nope -- need a ladder
|
|
LDA #>LEVEL2 ; check to see if we are
|
|
CMP MAPADDR+1 ; on the second level.
|
|
BNE :CANT ; nope -- can't descend.
|
|
PRINT DODESCEN ; print message
|
|
MOVW #LEVEL1;MAPADDR ; update pointer
|
|
MOVB #-1;OX ; notify display routine
|
|
MOVB #-1;OY ; that we need to clear
|
|
MOVB #-1;X0 ; the screen, since we are
|
|
MOVB #-1;Y0 ; on a new map!
|
|
LDA #1 ; ensure that game is continued,
|
|
RTS ; and map is updated.
|
|
:CANT PRINT NODESCEN ; can't descend this ladder.
|
|
RTS
|
|
:NOGO PRINT NOLADDER ; ain't no ladder 'round, bud!
|
|
RTS
|
|
DODESCEN HEX 825683
|
|
ASC "Climbing down the ladder..."00
|
|
NODESCEN HEX 825683
|
|
ASC "You are already on the first level!"00
|
|
|
|
********************************
|
|
* Allows Meltok to rest: one *
|
|
* hit point is healed. *
|
|
********************************
|
|
M:REST PRINT RESTING ; print message
|
|
INC HP ; add 1 to hp
|
|
LDA MAXHP
|
|
CMP HP ; compare maxhp w/ hp
|
|
BGE :OK ; if maxhp => hp, ok
|
|
STA HP ; not ok. hp= maxhp.
|
|
:OK JSR STATUSHP ; update hit points
|
|
LDA #0
|
|
RTS
|
|
RESTING HEX 825683
|
|
ASC "Meltok is resting."00
|
|
|
|
********************************
|
|
* Health routine: displays *
|
|
* Meltok's health status. *
|
|
* Incl. HP/Max HP *
|
|
* XP/Max XP *
|
|
* Character Level *
|
|
********************************
|
|
M:HEALTH PRINT CHHEALTH
|
|
RTS
|
|
CHHEALTH HEX 825501
|
|
ASC "Meltok has: "80
|
|
DA HP
|
|
ASC "/"80
|
|
DA MAXHP
|
|
ASC " Hit Points"8D0E81
|
|
DA XP
|
|
ASC "/"81
|
|
DA XPREQD
|
|
ASC " Exp. Points"8D0E
|
|
ASC "(Level "80
|
|
DA CLEVEL
|
|
ASC ".)"00
|
|
|
|
********************************
|
|
* Wealth routine: displays *
|
|
* Meltok's wealth. *
|
|
* Incl. GP and Keys *
|
|
********************************
|
|
M:WEALTH PRINT CHWEALTH
|
|
LDA SPKEY
|
|
CMP #1
|
|
BNE :CJEWEL
|
|
PRINT CHSPKEY
|
|
:EXIT LDA #0
|
|
RTS
|
|
:CJEWEL CMP #$80
|
|
BNE :EXIT
|
|
PRINT CHJEWEL
|
|
JMP :EXIT
|
|
CHWEALTH HEX 825501
|
|
ASC "Meltok has: "81
|
|
DA GP
|
|
ASC " Gold Pieces"8D0D
|
|
ASC " and "80
|
|
DA KEY
|
|
ASC " keys"00
|
|
CHSPKEY HEX 570E
|
|
ASC "and a very ornate key!"00
|
|
CHJEWEL HEX 570E
|
|
ASC "and the Jewel of Kaldun!"00
|
|
|
|
********************************
|
|
* Search for a secret door. *
|
|
********************************
|
|
M:SEARCH PRINT SEARCHDI ; get direction of search
|
|
JSR M:GETDIR
|
|
ADDB CX;DIR:X;DIR:X ; add directions to char
|
|
ADDB CY;DIR:Y;DIR:Y ; locations
|
|
LDX DIR:X
|
|
LDY DIR:Y
|
|
JSR MAPINDEX ; get value @ (x,y)
|
|
CMP #98 ; check for secret door
|
|
BNE :NOGOOD ; no door there
|
|
LDA #5 ; place found secret door
|
|
STA (PTR),Y ; @ (x,y)
|
|
JSR UPSCREEN
|
|
PRINT SECFOUND
|
|
RTS
|
|
:NOGOOD PRINT SECLOST
|
|
RTS
|
|
SECFOUND HEX 825683
|
|
ASC "You have found a secret door!"00
|
|
SECLOST HEX 825683
|
|
ASC "You don't find anything of interest."00
|
|
SEARCHDI HEX 825683
|
|
ASC "Search in which direction?"00
|
|
|
|
********************************
|
|
* Unlock a door. Checks to *
|
|
* see that user has a key, and *
|
|
* that a locked door is *
|
|
* present in direction choosen.*
|
|
********************************
|
|
M:UNLOCK LDA KEY
|
|
CLC
|
|
ADC SPKEY
|
|
CMP #1 ; do we have 1 or more keys?
|
|
BLT :NOKEYS ; nope, error!
|
|
PRINT UNLOCKDI ; get direction
|
|
JSR M:GETDIR
|
|
ADDB CX;DIR:X;DIR:X ; add directions to char
|
|
ADDB CY;DIR:Y;DIR:Y ; locations.
|
|
LDX DIR:X
|
|
LDY DIR:Y
|
|
JSR MAPINDEX ; get the index
|
|
CMP #97 ; # for special door
|
|
BEQ :SPECIAL ; yes, special door
|
|
CMP #3 ; # for opened door
|
|
BEQ :OPENED ; door already opened.
|
|
CMP #4 ; # for locked door
|
|
BNE :NODOOR ; locked door not there.
|
|
LDA KEY ; check if we have normal keys
|
|
BNE :NORMAL ; we have a normal door
|
|
BEQ :NOCANDO ; no normal keys!
|
|
:SPECIAL LDA SPKEY
|
|
BEQ :NOCANDO ; w/o special key, no go
|
|
LDA #0
|
|
STA SPKEY ; kill special key, make it
|
|
INC KEY ; a "normal" key...
|
|
:NORMAL LDA #3
|
|
STA (PTR),Y ; place opened door...
|
|
DEC KEY ; get rid of used key
|
|
JSR UPSCREEN ; update screen
|
|
JSR STATUSKY ; update key graph
|
|
PRINT UNLOCKGD
|
|
RTS ; all done
|
|
:NOKEYS PRINT UNLOCKNO
|
|
RTS
|
|
:NODOOR PRINT UNLOCKBD
|
|
RTS
|
|
:OPENED PRINT OPENDOOR
|
|
RTS
|
|
:NOCANDO PRINT OPENPROB
|
|
RTS
|
|
UNLOCKDI HEX 825683
|
|
ASC "Unlock door in which direction?"00
|
|
UNLOCKGD HEX 825683
|
|
ASC "The door is unlocked!"00
|
|
UNLOCKNO HEX 825683
|
|
ASC "You have no keys to unlock a door!"00
|
|
UNLOCKBD HEX 825683
|
|
ASC "There is no door there!"00
|
|
OPENDOOR HEX 825683
|
|
ASC "The door is already unlocked!"00
|
|
OPENPROB HEX 825683
|
|
ASC "None of your keys fit this door!"00
|
|
|
|
********************************
|
|
* Opens a chest. Checks for *
|
|
* presence of a chest @ cx,cy *
|
|
* and then uses random numbers *
|
|
* 1-3 to open, amount of gold, *
|
|
* and if a key is found. *
|
|
********************************
|
|
SPECHEST LDA CLEVEL
|
|
CMP #2 ; must be level 2 or higher!!
|
|
BLT :NOLUCK
|
|
LDA RANDOM1
|
|
AND #%00001111 ; 0-16, 0 opens = 6.25% chance
|
|
BNE :NOLUCK
|
|
LDA #7
|
|
STA (PTR),Y
|
|
LDA #1 ; add special key to
|
|
STA SPKEY ; inventory
|
|
LDA RANDOM2
|
|
AND #%00001111 ; 0-15 damage!
|
|
STA OPENTMP3
|
|
ADDW #250;XP;XP ; +250 experience!
|
|
SUBB HP;OPENTMP3;HP
|
|
JSR UPSCREEN
|
|
JSR STATUSXP
|
|
JSR STATUSHP
|
|
JSR STATUSKY
|
|
PRINT G_ORNATE ; got ornate!
|
|
LDA OPENTMP3 ; check if dart hit.
|
|
BEQ :EXIT ; nope: lucky!
|
|
PRINT CDARTHIT
|
|
:EXIT JSR GETRET
|
|
JSR CBOT3
|
|
RTS
|
|
:NOLUCK PRINT OPENNO
|
|
RTS
|
|
M:SPEC JMP SPECHEST ; too far to branch!
|
|
M:OPENCH LDX CX
|
|
LDY CY
|
|
JSR MAPINDEX
|
|
CMP #7 ; ID # for opened chest
|
|
BEQ :ISOPEN
|
|
CMP #99
|
|
BEQ M:SPEC
|
|
CMP #6 ; ID # for a chest
|
|
BNE :NOCHEST
|
|
LDA RANDOM1
|
|
AND #%00000111 ; 0-7, 0 opens = 12.5% chance
|
|
BNE :BADLUCK
|
|
LDA #7 ; ID # for opened chest.
|
|
STA (PTR),Y ; store it.
|
|
LDA RANDOM2
|
|
AND #%00011111 ; 0-31 GP found
|
|
STA OPENTMP1
|
|
ADDW OPENTMP1;GP;GP
|
|
ADDW OPENTMP1;XP;XP
|
|
LDA RANDOM3
|
|
AND #%00000001 ; 0-1 KEYs found
|
|
STA OPENTMP2
|
|
ADDB OPENTMP2;KEY;KEY
|
|
JSR UPSCREEN ; Show our opened chest.
|
|
JSR STATUSKY ; update keys
|
|
JSR STATUSGP ; update gp
|
|
JSR STATUSXP ; update exp
|
|
LDA OPENTMP2 ; check if key found
|
|
BNE :PLUSKEY ; yes -- say so, w/ gold
|
|
BEQ :GOTGOLD ; no -- just tell of gold
|
|
:ISOPEN PRINT CHOPENED
|
|
RTS
|
|
:NOCHEST PRINT OPENBAD
|
|
RTS
|
|
:BADLUCK PRINT OPENNO
|
|
RTS
|
|
:GOTGOLD PRINT OPEN0KEY ; just got gp
|
|
:CHKDART LDA RANDOM1 ; check for dart hit.
|
|
EOR RANDOM2 ; randomize from 3 random
|
|
EOR RANDOM3 ; counters
|
|
AND #%00000011 ; damage, if any from dart.
|
|
BEQ :WHEW ; missed.
|
|
STA OPENTMP3
|
|
SUBB HP;OPENTMP3;HP ; subtract damage
|
|
JSR STATUSHP ; update hit points
|
|
PRINT CDARTHIT
|
|
:WHEW RTS
|
|
:PLUSKEY PRINT OPEN1KEY ; gp + key
|
|
JMP :CHKDART ; go and check for dart hit
|
|
CHOPENED HEX 825583
|
|
ASC "The chest is already open!"00
|
|
OPENBAD HEX 825583
|
|
ASC "I see no chest here!"00
|
|
OPEN1KEY HEX 825503
|
|
ASC "You find "80
|
|
DA OPENTMP1
|
|
ASC " Gold Pieces and a Key!"00
|
|
OPEN0KEY HEX 825508
|
|
ASC "You find "80
|
|
DA OPENTMP1
|
|
ASC " Gold Pieces!"00
|
|
OPENNO HEX 825583
|
|
ASC "You had no luck!"
|
|
HEX 5783
|
|
ASC "(Try try again.)"00
|
|
G_ORNATE HEX 825583
|
|
ASC "You've found a very ornate key!"00
|
|
CDARTHIT HEX 5602
|
|
ASC "and are hit by a dart for "80
|
|
DA OPENTMP3
|
|
ASC " damage!"00
|
|
OPENTMP1 HEX 0000 ; made a word for addition
|
|
OPENTMP2 HEX 00 ; tmp1=gp/xp, tmp2=keys
|
|
OPENTMP3 HEX 00 ; this is damage from dart.
|
|
|
|
********************************
|
|
* Ask player if they want to *
|
|
* exit the game. *
|
|
********************************
|
|
GAMEDONE STY :YSAVE
|
|
STX :XSAVE
|
|
STA :ASAVE
|
|
PRINT EXITQUES
|
|
JSR GETYN
|
|
BCS :NO
|
|
PLA ; pull return address off
|
|
PLA ; of stack
|
|
LDA #-1 ; -1 = kill game
|
|
RTS ; return to main routine.
|
|
:NO LDA :ASAVE
|
|
LDY :YSAVE
|
|
LDX :XSAVE
|
|
RTS
|
|
:YSAVE HEX 00
|
|
:XSAVE HEX 00
|
|
:ASAVE HEX 00
|
|
EXITQUES HEX 825683
|
|
ASC "Do you wish to exit this game?"8D83
|
|
ASC "(Y/N)"00
|
|
|
|
********************************
|
|
* Allow Meltok to move upwards *
|
|
* Check for any obstacles... *
|
|
********************************
|
|
M:UP DEC CY
|
|
LDX CX
|
|
LDY CY
|
|
BNE :CONT
|
|
JSR GAMEWON ; game winning routine
|
|
INC CY
|
|
LDA #-1
|
|
RTS
|
|
:CONT JSR MAPVALID
|
|
BCS :ABORT
|
|
LDX #0
|
|
LDY #-2
|
|
JMP MOVEMENT
|
|
:ABORT INC CY
|
|
M:OWIE CMP #12
|
|
BEQ M:GHOST
|
|
CMP #13
|
|
BEQ M:BLOB
|
|
CMP #14
|
|
BEQ M:ZOMBIE
|
|
PRINT WALLOUCH
|
|
GOTHIT01 DEC HP
|
|
JSR STATUSHP
|
|
LDA #0
|
|
RTS
|
|
M:GHOST PRINT GHOSOUCH
|
|
GOTDAMAG MOVB #15;SNUM
|
|
LDA #%00000000
|
|
STA CLRFLAG
|
|
LDA #%10000000
|
|
STA XORFLAG
|
|
MOVB #4;HITCOUNT
|
|
:BUZZER LDY CH:Y
|
|
LDX CH:X
|
|
LDA #0
|
|
JSR DRAWSHAP
|
|
MOVB #20;VOLUME
|
|
MOVB #150;DURATION
|
|
MOVB #$80;FREQUENC
|
|
JSR DONOISE
|
|
DEC HITCOUNT
|
|
BNE :BUZZER
|
|
LDA #0
|
|
STA XORFLAG
|
|
JMP GOTHIT01
|
|
HITCOUNT HEX 00
|
|
M:BLOB PRINT BLOBOUCH
|
|
JMP GOTDAMAG
|
|
M:ZOMBIE PRINT ZOMBOUCH
|
|
JMP GOTDAMAG
|
|
WALLOUCH HEX 825683
|
|
ASC "Ouch!!"00
|
|
GHOSOUCH HEX 825683
|
|
ASC "Yiiee! The ghost gotcha!"00
|
|
BLOBOUCH HEX 825683
|
|
ASC "Squish, the blob squirts you!"00
|
|
ZOMBOUCH HEX 825683
|
|
ASC "Ooomph, the zombie hits you!"00
|
|
|
|
********************************
|
|
* Allow Meltok to move south. *
|
|
********************************
|
|
M:DOWN INC CY
|
|
LDX CX
|
|
LDY CY
|
|
CPY #HMAP+1
|
|
BLT :CONT
|
|
JSR GAMEDONE
|
|
DEC CY
|
|
LDA #0
|
|
RTS
|
|
:CONT JSR MAPVALID
|
|
BCS :ABORT
|
|
LDX #0
|
|
LDY #2
|
|
BNE MOVEMENT
|
|
:ABORT DEC CY
|
|
JMP M:OWIE
|
|
|
|
********************************
|
|
* Allow Meltok to move west.. *
|
|
********************************
|
|
M:LEFT DEC CX
|
|
LDX CX
|
|
LDY CY
|
|
JSR MAPVALID
|
|
BCS :ABORT
|
|
LDX #-2
|
|
LDY #0
|
|
BEQ MOVEMENT
|
|
:ABORT INC CX
|
|
JMP M:OWIE
|
|
|
|
********************************
|
|
* Allow Meltok to move East. *
|
|
********************************
|
|
M:RIGHT INC CX
|
|
LDX CX
|
|
LDY CY
|
|
JSR MAPVALID
|
|
BCS :ABORT
|
|
LDX #2
|
|
LDY #0
|
|
BEQ MOVEMENT
|
|
:ABORT DEC CX
|
|
JMP M:OWIE
|
|
|
|
********************************
|
|
* Movement variables *
|
|
********************************
|
|
M:DIRX HEX 00
|
|
M:DIRY HEX 00
|
|
M:COUNT HEX 00
|
|
|
|
********************************
|
|
* Movement routines: Draw *
|
|
* Meltok moving, and update *
|
|
* the map. *
|
|
********************************
|
|
MOVEMENT STX M:DIRX
|
|
STY M:DIRY
|
|
JSR ROOMDESC ; display room description
|
|
MOVB #4;M:COUNT
|
|
MOVB #2;SNUM
|
|
LDA #%00000000
|
|
STA CLRFLAG
|
|
LDA #%10000000
|
|
STA XORFLAG
|
|
:REPEAT LDY CH:Y
|
|
LDX CH:X
|
|
LDA #0 ; CH:X should not exceed 255
|
|
JSR DRAWSHAP
|
|
ADDB M:DIRY;CH:Y;CH:Y
|
|
ADDB M:DIRX;CH:X;CH:X
|
|
LDY CH:Y
|
|
LDX CH:X
|
|
LDA #0
|
|
JSR DRAWSHAP
|
|
LDA #25
|
|
JSR WAIT
|
|
DEC M:COUNT
|
|
BNE :REPEAT
|
|
LDA #%00000000
|
|
STA XORFLAG
|
|
LDA #%10000000
|
|
STA CLRFLAG
|
|
LDA CX
|
|
CMP X0
|
|
BEQ :REDRAW
|
|
CMP X1
|
|
BEQ :REDRAW
|
|
LDA CY
|
|
CMP Y0
|
|
BEQ :REDRAW
|
|
CMP Y1
|
|
BEQ :REDRAW
|
|
LDA DRAWFLAG
|
|
BMI :REDRAW
|
|
LDA #0
|
|
RTS
|
|
:REDRAW LDA #1
|
|
RTS
|
|
DRAWFLAG HEX 00
|
|
|
|
********************************
|
|
* Check to see if location at *
|
|
* (x,y) is a valid walking *
|
|
* location for Meltok. If so, *
|
|
* carry bit is clear. If not, *
|
|
* carry bit is on. *
|
|
********************************
|
|
MAPVALID CPY #HMAP
|
|
BGE :BAD
|
|
CPX #WMAP
|
|
BGE :BAD
|
|
JSR MAPINDEX
|
|
BEQ :GOOD
|
|
CMP #99
|
|
BGE :GOOD
|
|
CMP #3
|
|
BEQ :GOOD
|
|
CMP #5
|
|
BLT :BAD
|
|
CMP #12
|
|
BGE :BAD
|
|
:GOOD CLC
|
|
RTS
|
|
:BAD SEC
|
|
RTS
|
|
|