jewel-of-kaldun/main.control.s

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