5b.s
.setcpu "6502"
player_xpos := $0010
player_ypos := $0011
tile_xpos := $0012
tile_ypos := $0013
map_x := $0014
map_y := $0015
current_location:= $001A
game_mode := $001B
dungeon_level := $001C
player_transport:= $001E
party_size := $001F
dng_direction := $0020
light_duration := $0021
moon_phase_trammel:= $0022
moon_phase_felucca:= $0023
horse_mode := $0024
ship_hull := $002B
move_counter := $002C
key_buf := $0030
key_buf_len := $0038
charptr := $003D
attacking_monster_type:= $0040
attacking_monster_xpos:= $0041
attacking_monster_ypos:= $0042
attacking_monster_terrain:= $0043
magic_aura := $0046
aura_duration := $0047
tile_under_player:= $0048
tile_north := $0049
tile_south := $004A
tile_east := $004B
tile_west := $004C
music_volume := $004D
console_xpos := $004E
console_ypos := $004F
diskid := $0050
numdrives := $0051
currdisk_drive1 := $0052
currdisk_drive2 := $0053
currplayer := $0054
hexnum := $0056
bcdnum := $0057
zptmp1 := $005A
reqdisk := $005E
currdrive := $005F
lt_y := $0060
lt_x := $0061
lt_rwflag := $0062
lt_addr_hi := $0063
monster_type := $0066
game_mode_temp := $0068
moongate_tile := $006D
moongate_xpos := $006E
moongate_ypos := $006F
movement_mode := $0074
direction := $0075
ptr2 := $007C
ptr1 := $007E
j_waitkey := $0800
j_player_teleport:= $0803
j_move_east := $0806
j_move_west := $0809
j_move_south := $080C
j_move_north := $080F
j_drawinterface := $0812
j_drawview := $0815
j_update_britannia:= $0818
j_primm_xy := $081E
j_primm := $0821
j_console_out := $0824
j_clearbitmap := $0827
j_mulax := $082A
j_get_stats_ptr := $082D
j_printname := $0830
j_printbcd := $0833
j_drawcursor := $0836
j_drawcursor_xy := $0839
j_drawvert := $083C
j_drawhoriz := $083F
j_request_disk := $0842
j_update_status := $0845
j_blocked_tile := $0848
j_idle := $084B
j_rand := $084E
j_loadsector := $0851
j_playsfx := $0854
j_idle_combat := $0857
j_getnumber := $085A
j_getplayernum := $085D
j_update_wind := $0860
j_animate_view := $0863
j_printdigit := $0866
j_clearstatwindow:= $0869
j_animate_creatures:= $086C
j_centername := $086F
j_print_direction:= $0872
j_clearview := $0875
j_invertview := $0878
j_centerstring := $087B
j_printstring := $087E
j_gettile_bounds:= $0881
j_gettile := $0884
L0887 := $0887
L088A := $088A
j_gettile_combat:= $088D
L0890 := $0890
j_gettile_town := $0893
j_gettile_dungeon:= $0896
L8800 := $8800
L8803 := $8803
L8859 := $8859
L8C00 := $8C00
dungeon_update := $8C03
L8C06 := $8C06
L9000 := $9000
gettile_bounds := $9F00
gettile := $9F26
mul11 := $9F49
gettile_combat := $9F85
gettile_town := $9FAF
gettile_dungeon := $9FCE
j_fileio := $A100
j_readblock := $A103
j_loadtitle := $A106
j_togglesnd := $A109
j_kernalin := $A10C
j_setirqv := $A10F
j_clearkbd := $A112
j_irqhandler := $A115
party_stats := $AA00
game_stats := $AB00
food_hi := $AB10
food_lo := $AB11
food_frac := $AB12
gold := $AB13
mixtures := $AB40
map_status := $AC00
object_xpos := $AC20
object_ypos := $AC40
object_tile := $AC60
monster_xpos := $AD00
monster_ypos := $AD10
monster_hp := $AD40
cbt_monster_type:= $AD50
monster_tile := $AD60
cbt_player_xpos := $AD80
cbt_player_ypos := $AD90
player_tile := $ADA0
missile := $ADFD
missile_xpos := $ADFE
missile_ypos := $ADFF
currmap := $AE00
tempmap := $AE80
music_ctl := $AF20
music_nop := $AF23
bmplineaddr_lo := $E000
bmplineaddr_hi := $E0C0
chrlineaddr_lo := $E180
chrlineaddr_hi := $E198
tile_color := $E1B0
music_init := $EC00
.word $4000
j_startgate:
jmp startgame
j_camp_ambushed:
jmp camp_ambushed
jmp dungeon_combat_start
startgame:
lda #$00
jsr music_ctl
jsr j_drawinterface
lda #$0D
sta console_ypos
lda #$18
sta console_xpos
lda #$00
sta game_mode
lda #$25
sta magic_aura
lda #$02
jsr j_request_disk
lda party_size
beq @loadgame
jmp @gamestarted
@loadgame:
lda #$CC
ldx #$1A
jsr j_fileio
lda party_size
bne @gotgame
jsr j_primm
.byte $8D,$CE,$CF,$A0,$C1,$C3,$D4,$C9
.byte $D6,$C5,$A0,$C7,$C1,$CD,$C5,$A1
.byte $8D,$00
@nogame:
jmp @nogame
@gotgame:
lda #$CC
ldx #$7F
jsr j_fileio
ldx #$80
jsr j_fileio
@gamestarted:
lda #$00
sta $1D
sta movement_mode
sta current_location
sta horse_mode
lda #$01
sta game_mode
sta direction
jsr j_update_status
jsr j_player_teleport
lda #$FF
sta music_volume
lda #$CF
jsr music_ctl
game_main:
jsr j_idle
jsr check_triggers
jsr check_party_alive
bpl @prompt
jmp cmd_sleep
@prompt:
jsr j_primm
.byte $8D,$1E,$00
jsr j_waitkey
cmp #$00
bne @gotkey
jmp cmd_pass
@gotkey:
cmp #$A0
bne @north
jmp cmd_pass
@north:
cmp #$C0
bne @south
jmp cmd_north
@south:
cmp #$AF
bne @east
jmp cmd_south
@east:
cmp #$BA
bne @west
jmp cmd_west
@west:
cmp #$BB
bne @home
jmp cmd_east
@home:
cmp #$93
bne @atoz
jsr printcr
lda #$00
sta $6A
@printvirtue:
ldx $6A
lda game_stats,x
jsr j_printbcd
inc $6A
lda $6A
cmp #$08
bcc @printvirtue
jsr printcr
jmp game_main
@atoz:
cmp #$C1
bcc cmd_unknown
cmp #$DB
bcs cmd_unknown
sec
sbc #$C1
asl a
tay
lda cmd_jump_table,y
sta ptr1
lda cmd_jump_table+1,y
sta ptr1+1
jmp (ptr1)
cmd_sleep:
jsr j_primm
.byte $8D,$1E,$DA,$FA,$FA,$FA,$FA,$8D
.byte $00
jmp cmd_done
cmd_pass:
jsr j_primm
.byte $D0,$E1,$F3,$F3,$8D,$00
jmp cmd_done
cmd_unknown:
jsr j_primm
.byte $D7,$C8,$C1,$D4,$BF,$8D,$00
cmd_error:
lda #$02
jsr j_playsfx
jmp cmd_done
print_not_a_player:
jsr j_primm
.byte $CE,$CF,$D4,$A0,$C1,$A0,$D0,$CC
.byte $C1,$D9,$C5,$D2,$A1,$8D,$00
jmp cmd_done
print_only_on_foot:
jsr j_primm
.byte $CF,$CE,$CC,$D9,$A0,$CF,$CE,$A0
.byte $C6,$CF,$CF,$D4,$A1,$8D,$00
jmp cmd_error
print_nothing_there:
jsr j_primm
.byte $CE,$CF,$D4,$C8,$C9,$CE,$C7,$A0
.byte $D4,$C8,$C5,$D2,$C5,$A1,$8D,$00
jmp cmd_done
print_slow_progress:
jsr j_primm
.byte $D3,$CC,$CF,$D7,$A0,$D0,$D2,$CF
.byte $C7,$D2,$C5,$D3,$D3,$A1,$8D,$00
rts
print_not_here:
jsr j_primm
.byte $CE,$CF,$D4,$A0,$C8,$C5,$D2,$C5
.byte $A1,$8D,$00
jmp cmd_done
print_cant:
jsr j_primm
.byte $C3,$C1,$CE,$A7,$D4,$A1,$8D,$00
jmp cmd_done
print_aborted:
jsr j_primm
.byte $C1,$C2,$CF,$D2,$D4,$C5,$C4,$A1
.byte $8D,$00
jmp cmd_done
print_done:
jsr j_update_status
jsr j_primm
.byte $C4,$CF,$CE,$C5,$AE,$8D,$00
jmp cmd_done
print_you_have_none:
jsr j_primm
.byte $D9,$CF,$D5,$A0,$C8,$C1,$D6,$C5
.byte $A0,$CE,$CF,$CE,$C5,$A1,$8D,$00
jmp cmd_done
print_disabled:
jsr j_primm
.byte $C4,$C9,$D3,$C1,$C2,$CC,$C5,$C4
.byte $A1,$8D,$00
jmp cmd_done
move_blocked:
jsr j_primm
.byte $C2,$CC,$CF,$C3,$CB,$C5,$C4,$A1
.byte $8D,$00
lda #$01
jsr j_playsfx
lda #$00
sta key_buf_len
jmp cmd_done
print_drift_only:
jsr j_primm
.byte $C4,$D2,$C9,$C6,$D4,$A0,$CF,$CE
.byte $CC,$D9,$A1,$8D,$00
jmp cmd_done
cmd_jump_table:
.addr cmd_attack
.addr cmd_board
.addr cmd_cast
.addr cmd_descend
.addr cmd_enter
.addr cmd_fire
.addr cmd_get_chest
.addr cmd_hole_up_and_camp
.addr cmd_ignite
.addr cmd_jimmy_lock
.addr cmd_klimb
.addr cmd_locate
.addr cmd_mix_reagents
.addr cmd_new_order
.addr cmd_open
.addr cmd_peer_at_gem
.addr cmd_quit_and_save
.addr cmd_ready_weapon
.addr cmd_search
.addr cmd_talk
.addr cmd_use
.addr cmd_volume
.addr cmd_wear_armor
.addr cmd_xit
.addr cmd_yell
.addr cmd_ztats
cmd_north:
lda game_mode
cmp #$03
bne @balloon
jmp cmd_forward
@balloon:
lda player_transport
cmp #$18
bne @shipnorth
jmp print_drift_only
@shipnorth:
cmp #$11
bne @shipother
jmp @checkshipmove
@shipother:
cmp #$10
beq @turnship
cmp #$12
beq @turnship
cmp #$13
beq @turnship
lda #$00
jsr j_playsfx
jsr print_north
lda horse_mode
beq @nohorse
jsr @checkblock
jsr j_idle
@nohorse:
jsr @checkblock
jmp cmd_done
@turnship:
lda #$11
sta player_transport
jsr print_turn
jsr print_north
jmp cmd_done
@checkshipmove:
jsr print_sail
jsr print_north
lda tile_north
jsr check_sailable
bpl @shipnotblocked
jmp move_blocked
@shipnotblocked:
lda #$01
jsr check_wind_direction
beq @moveship
jsr print_slow_progress
jmp cmd_done
@moveship:
jsr j_move_north
jmp cmd_done
@checkblock:
lda tile_under_player
cmp #$0E
beq @blocked
lda tile_north
cmp #$0E
beq @notblocked
jsr j_blocked_tile
bpl @notblocked
@blocked:
pla
pla
jmp move_blocked
@notblocked:
lda tile_north
jsr check_slow_progress
beq @notslow
jsr print_slow_progress
jmp @done
@notslow:
lda #$00
jsr j_playsfx
lda game_mode
cmp #$01
bne @checkexit
jsr j_move_north
lda tile_north
jmp check_moongate
@checkexit:
dec player_ypos
lda player_ypos
bpl @done
pla
pla
jmp exit_location
@done:
rts
cmd_forward:
jsr j_primm
.byte $C1,$E4,$F6,$E1,$EE,$E3,$E5,$8D
.byte $00
lda tile_north
jsr dng_check_forward_block
bpl @notblocked
jmp move_blocked
@notblocked:
ldx dng_direction
dng_move:
clc
lda player_xpos
adc dng_move_deltax,x
and #$07
sta player_xpos
clc
lda player_ypos
adc dng_move_deltay,x
and #$07
sta player_ypos
jmp cmd_done
dng_move_deltax:
.byte $00,$01,$00,$FF
dng_move_deltay:
.byte $FF,$00,$01,$00
cmd_south:
lda game_mode
cmp #$03
bne @balloon
jsr j_primm
.byte $D2,$E5,$F4,$F2,$E5,$E1,$F4,$8D
.byte $00
lda tile_west
jsr dng_check_retreat_block
bpl @retreat
jmp move_blocked
@retreat:
lda dng_direction
eor #$02
tax
jmp dng_move
@balloon:
lda player_transport
cmp #$18
bne @shipsouth
jmp print_drift_only
@shipsouth:
cmp #$13
bne @shipother
jmp @checkshipmove
@shipother:
cmp #$12
beq @turnship
cmp #$10
beq @turnship
cmp #$11
beq @turnship
lda #$00
jsr j_playsfx
jsr print_south
lda horse_mode
beq @nohorse
jsr @checkblock
jsr j_idle
@nohorse:
jsr @checkblock
lda player_xpos
cmp #$E5
bcc @notisleofabyss
cmp #$EA
bcs @notisleofabyss
lda player_ypos
cmp #$D4
bcc @notisleofabyss
cmp #$D9
bcs @notisleofabyss
jmp generate_daemons
@notisleofabyss:
jmp cmd_done
@turnship:
lda #$13
sta player_transport
jsr print_turn
jsr print_south
jmp cmd_done
@checkshipmove:
jsr print_sail
jsr print_south
lda tile_south
jsr check_sailable
bpl @shipnotblocked
jmp move_blocked
@shipnotblocked:
lda #$03
jsr check_wind_direction
beq @moveship
jsr print_slow_progress
jmp cmd_done
@moveship:
jsr j_move_south
jmp cmd_done
@checkblock:
lda tile_south
jsr j_blocked_tile
bpl @notblocked
pla
pla
jmp move_blocked
@notblocked:
lda tile_south
jsr check_slow_progress
beq @notslow
jsr print_slow_progress
jmp @done
@notslow:
lda #$00
jsr j_playsfx
lda game_mode
cmp #$01
bne @checkexit
jsr j_move_south
lda tile_south
jmp check_moongate
@checkexit:
inc player_ypos
lda player_ypos
cmp #$20
bcc @done
pla
pla
jmp exit_location
@done:
rts
cmd_west:
lda game_mode
cmp #$03
bne @balloon
jsr print_turn
jsr j_primm
.byte $EC,$E5,$E6,$F4,$8D,$00
sec
lda dng_direction
sbc #$01
and #$03
sta dng_direction
jsr L8C00
jsr j_print_direction
jmp game_main
@balloon:
lda player_transport
cmp #$18
bne @shipwest
jmp print_drift_only
@shipwest:
cmp #$10
bne @shipother
jmp @checkshipmove
@shipother:
cmp #$11
beq @turnship
cmp #$13
beq @turnship
cmp #$12
beq @turnship
cmp #$15
bne @notturnhorse
lda #$14
sta player_transport
@notturnhorse:
lda #$00
jsr j_playsfx
jsr print_west
lda horse_mode
beq @nohorse
jsr @checkblock
jsr j_idle
@nohorse:
jsr @checkblock
jmp cmd_done
@turnship:
lda #$10
sta player_transport
jsr print_turn
jsr print_west
jmp cmd_done
@checkshipmove:
jsr print_sail
jsr print_west
lda tile_west
jsr check_sailable
bpl @shipnotblocked
jmp move_blocked
@shipnotblocked:
lda #$00
jsr check_wind_direction
beq @moveship
jsr print_slow_progress
jmp cmd_done
@moveship:
jsr j_move_west
jmp cmd_done
@checkblock:
lda tile_west
jsr j_blocked_tile
bpl @notblocked
pla
pla
jmp move_blocked
@notblocked:
lda tile_west
jsr check_slow_progress
beq @notslow
jsr print_slow_progress
jmp @done
@notslow:
lda #$00
jsr j_playsfx
lda game_mode
cmp #$01
bne @checkexit
jsr j_move_west
lda tile_west
jmp check_moongate
@checkexit:
dec player_xpos
lda player_xpos
bpl @done
pla
pla
jmp exit_location
@done:
rts
cmd_east:
lda game_mode
cmp #$03
bne @balloon
jsr print_turn
jsr j_primm
.byte $F2,$E9,$E7,$E8,$F4,$8D,$00
clc
lda dng_direction
adc #$01
and #$03
sta dng_direction
jsr L8C00
jsr j_print_direction
jmp game_main
@balloon:
lda player_transport
cmp #$18
bne @shipeast
jmp print_drift_only
@shipeast:
cmp #$12
bne @shipother
jmp @checkshipmove
@shipother:
cmp #$11
beq @turnship
cmp #$13
beq @turnship
cmp #$10
beq @turnship
cmp #$14
bne @notturnhorse
lda #$15
sta player_transport
@notturnhorse:
lda #$00
jsr j_playsfx
jsr print_east
lda horse_mode
beq @nohorse
jsr @checkblock
jsr j_idle
@nohorse:
jsr @checkblock
jmp cmd_done
@turnship:
jsr print_turn
jsr print_east
lda #$12
sta player_transport
jmp cmd_done
@checkshipmove:
jsr print_sail
jsr print_east
lda tile_east
jsr check_sailable
bpl @shipnotblocked
jmp move_blocked
@shipnotblocked:
lda #$02
jsr check_wind_direction
beq @moveship
jsr print_slow_progress
jmp cmd_done
@moveship:
jsr j_move_east
lda player_xpos
cmp #$DD
bne @notmouthofabyss
lda player_ypos
cmp #$E0
bne @notmouthofabyss
jmp generate_pirates
@notmouthofabyss:
jmp cmd_done
@checkblock:
lda tile_east
jsr j_blocked_tile
bpl @notblocked
pla
pla
jmp move_blocked
@notblocked:
lda tile_east
jsr check_slow_progress
beq @notslow
jsr print_slow_progress
jmp @done
@notslow:
lda #$00
jsr j_playsfx
lda game_mode
cmp #$01
bne @checkexit
jsr j_move_east
lda tile_east
jmp check_moongate
@checkexit:
inc player_xpos
lda player_xpos
cmp #$20
bcc @done
pla
pla
jmp exit_location
@done:
rts
print_turn:
jsr j_primm
.byte $D4,$F5,$F2,$EE,$A0,$00
rts
print_sail:
jsr j_primm
.byte $D3,$E1,$E9,$EC,$A0,$00
rts
generate_pirates:
ldy #$07
@next:
lda pirate_xpos,y
sta object_xpos,y
lda pirate_ypos,y
sta object_ypos,y
lda #$80
sta object_tile,y
lda pirate_tile,y
sta map_status,y
dey
bpl @next
jmp cmd_done
pirate_xpos:
.byte $E0,$E0,$E2,$E3,$E4,$E5,$E5,$E4
pirate_ypos:
.byte $DC,$E4,$DC,$E4,$E3,$E1,$DF,$DE
pirate_tile:
.byte $82,$82,$82,$82,$83,$83,$81,$81
generate_daemons:
lda magic_aura
cmp #$5F
beq @done
ldy #$07
@next:
lda #$F0
sta object_tile,y
sta map_status,y
lda #$E7
sta object_xpos,y
lda player_ypos
clc
adc #$01
sta object_ypos,y
dey
bpl @next
@done:
jmp cmd_done
exit_location:
lda #$00
jsr music_ctl
jsr j_primm
.byte $CC,$C5,$C1,$D6,$C9,$CE,$C7,$AE
.byte $AE,$AE,$8D,$00
jsr j_clearkbd
lda #$00
sta game_mode
lda #$02
jsr j_request_disk
lda #$CC
ldx #$7E
jsr j_fileio
lda $18
sta player_xpos
lda $19
sta player_ypos
jsr j_player_teleport
lda #$01
sta game_mode
lda #$00
sta current_location
lda player_xpos
cmp #$EF
bne @nothythloth
lda player_ypos
cmp #$F0
bne @nothythloth
lda #$18
sta $AC7F
sta $AC1F
lda #$E9
sta $AC3F
lda #$F2
sta $AC5F
@nothythloth:
jsr j_update_britannia
lda #$CF
jsr music_ctl
lda #$00
sta key_buf_len
jmp cmd_done
check_slow_progress:
cmp #$03
beq slow_one_in_four
cmp #$05
beq slow_one_in_eight
cmp #$06
beq slow_one_in_four
cmp #$07
beq slow_one_in_two
cmp #$46
beq slow_one_in_two
notslow:
lda #$00
rts
slow:
lda #$FF
rts
slow_one_in_eight:
jsr j_rand
and #$07
beq slow
bne notslow
slow_one_in_four:
jsr j_rand
and #$03
beq slow
bne notslow
slow_one_in_two:
jsr j_rand
and #$01
beq notslow
bne slow
check_sailable:
cmp #$02
bcc @sailable
cmp #$8C
bcc @blocked
cmp #$90
bcs @blocked
@sailable:
lda #$00
rts
@blocked:
lda #$FF
rts
cmd_attack:
jsr j_primm
.byte $C1,$F4,$F4,$E1,$E3,$EB,$AD,$00
lda game_mode
cmp #$03
bne @notdungeon
jmp cmd_unknown
@notdungeon:
jsr getdirection
bne @gotdir
jmp cmd_pass
@gotdir:
jsr find_creature
bpl @gotcreature
@nothinghere:
jmp print_nothing_there
@gotcreature:
stx $58
lda object_tile,x
cmp #$8C
beq @nothinghere
cmp #$8E
beq @nothinghere
lda game_mode
cmp #$02
bne @nottowne
ldx #$1F
@townecheck:
lda object_tile,x
cmp #$50
beq @invincible
cmp #$5E
bne @townenext
@invincible:
lda #$FF
sta $ACC0,x
lda #$00
sta $ACE0,x
@townenext:
dex
bpl @townecheck
@nottowne:
lda game_mode
cmp #$02
beq @losekarma
ldx $58
lda object_tile,x
jsr check_evil
bmi prepare_combat
@losekarma:
ldy #$01
lda #$05
jsr virtue_dec
ldy #$03
lda #$03
jsr virtue_dec
ldy #$05
lda #$03
jsr virtue_dec
prepare_combat:
ldx $58
lda object_tile,x
sta attacking_monster_type
lda object_xpos,x
sta attacking_monster_xpos
sta $7A
lda object_ypos,x
sta attacking_monster_ypos
sta $7B
lda game_mode
cmp #$01
bne @notbritannia
jsr j_gettile_bounds
sta attacking_monster_terrain
jmp @deletecreature
@notbritannia:
jsr j_gettile_town
sta attacking_monster_terrain
@deletecreature:
lda #$00
ldx $58
sta object_tile,x
sta map_status,x
sta $ACC0,x
jmp generate_combat
cmd_board:
lda player_transport
cmp #$1F
beq @onfoot
jsr j_primm
.byte $C2,$EF,$E1,$F2,$E4,$A0,$BC,$AD
.byte $00
jmp print_cant
@onfoot:
lda tile_under_player
cmp #$14
beq board_horse
cmp #$15
beq board_horse
jsr j_primm
.byte $C2,$EF,$E1,$F2,$E4,$A0,$00
lda tile_under_player
cmp #$10
beq @ship
cmp #$11
beq @ship
cmp #$12
beq @ship
cmp #$13
beq @ship
cmp #$18
bne @unknown
jmp board_balloon
@unknown:
jmp cmd_unknown
@ship:
lda #$10
jsr board_find_object
jsr j_primm
.byte $E6,$F2,$E9,$E7,$E1,$F4,$E5,$A1
.byte $8D,$00
lda player_xpos
cmp player_ship_xpos
bne @newship
lda player_ypos
cmp player_ship_ypos
bne @newship
jmp cmd_done
@newship:
lda #$50
sta ship_hull
jmp cmd_done
player_ship_xpos:
.byte $00
player_ship_ypos:
.byte $00
board_horse:
lda #$14
jsr board_find_object
jsr j_primm
.byte $CD,$EF,$F5,$EE,$F4,$A0,$E8,$EF
.byte $F2,$F3,$E5,$A1,$8D,$00
jmp cmd_done
board_balloon:
lda #$18
jsr board_find_object
jsr j_primm
.byte $E2,$E1,$EC,$EC,$EF,$EF,$EE,$8D
.byte $00
lda #$00
sta movement_mode
jmp cmd_done
board_find_object:
sta $58
ldx #$1F
@checkobject:
lda object_tile,x
and #$FC
cmp $58
bne @next
lda object_xpos,x
cmp player_xpos
bne @next
lda object_ypos,x
cmp player_ypos
beq @foundobject
@next:
dex
cpx #$08
bcs @checkobject
bcc @noobject
@foundobject:
lda #$00
sta object_tile,x
sta map_status,x
@noobject:
lda tile_under_player
sta player_transport
rts
cmd_cast:
jsr j_primm
.byte $C3,$E1,$F3,$F4,$A0,$F3,$F0,$E5
.byte $EC,$EC,$BA,$8D,$F0,$EC,$E1,$F9
.byte $E5,$F2,$AD,$00
jsr j_getplayernum
bne @checknum
@none:
jmp print_not_a_player
@checknum:
cmp party_size
beq @gotplayer
bcs @none
@gotplayer:
sta currplayer
jsr check_awake
bpl @playerok
jmp print_disabled
@playerok:
jsr list_mixtures
jsr j_primm
.byte $D3,$D0,$C5,$CC,$CC,$AD,$00
jsr getandprintkey
pha
jsr j_clearstatwindow
jsr j_update_status
lda game_mode
bpl @notcombat
jsr invert_player_line
@notcombat:
pla
sec
sbc #$C1
cmp #$1A
bcc @validspell
jmp cmd_unknown
@validspell:
sta @currspell
clc
adc #$65
jsr j_printstring
jsr j_primm
.byte $A1,$8D,$00
ldy @currspell
lda mixtures,y
bne @havemixed
jmp print_you_have_none
@havemixed:
sed
sec
sbc #$01
sta mixtures,y
cld
jsr j_get_stats_ptr
ldy #$16
lda (ptr1),y
ldx @currspell
sed
sec
sbc @mpcost,x
cld
bcs @decmp
jsr j_primm
.byte $CD,$AE,$D0,$AE,$A0,$D4,$CF,$CF
.byte $A0,$CC,$CF,$D7,$A1,$8D,$00
jmp spell_failed
@decmp:
sta (ptr1),y
lda @currspell
asl a
tay
lda @spelljumptable,y
sta ptr1
lda @spelljumptable+1,y
sta ptr1+1
jmp (ptr1)
@currspell:
.byte $00
@spelljumptable:
.addr spell_awaken
.addr spell_blink
.addr spell_cure
.addr spell_dispel
.addr spell_energyfield
.addr spell_fireball
.addr spell_gate
.addr spell_heal
.addr spell_iceball
.addr spell_jinx
.addr spell_kill
.addr spell_light
.addr spell_magicmissle
.addr spell_negate
.addr spell_open
.addr spell_protect
.addr spell_quick
.addr spell_resurrect
.addr spell_sleep
.addr spell_tremor
.addr spell_undead
.addr spell_view
.addr spell_winds
.addr spell_xit
.addr spell_yup
.addr spell_zdown
@mpcost:
.byte $05,$15,$05,$20,$10,$15,$40,$10
.byte $20,$30,$25,$05,$05,$20,$05,$15
.byte $20,$45,$15,$30,$15,$15,$10,$15
.byte $10,$05
spell_awaken:
jsr j_primm
.byte $D7,$C8,$CF,$AD,$00
jsr j_getplayernum
bne @gotnum
@fail:
jmp spell_failed
@gotnum:
jsr spell_play_effect
jsr j_get_stats_ptr
ldy #$12
lda (ptr1),y
cmp #$D3
bne @fail
lda #$C7
sta (ptr1),y
lda game_mode
bpl @notcombat
jsr something_based_on_status_and_class
ldx currplayer
sta $AD9F,x
@notcombat:
jmp print_done
spell_blink:
lda player_transport
cmp #$14
bcs @notinship
@fail:
jmp spell_failed
@notinship:
jsr spell_ensure_outdoors
jsr print_direction
jsr getdirection
jsr spell_play_effect
lda player_xpos
and player_ypos
cmp #$C0
bcc @notnearabyss
jmp spell_failed
@notnearabyss:
jsr @incdist
cmp #$FF
bne @notnearabyss
@next:
jsr @decdist
cmp #$FF
beq @fail
jsr j_blocked_tile
bmi @next
lda $7A
sta player_xpos
lda $7B
sta player_ypos
jsr music_nop
jsr j_player_teleport
jmp print_done
@incdist:
clc
lda $7A
adc $78
sta $7A
clc
lda $7B
adc $79
sta $7B
jsr j_gettile_bounds
rts
@decdist:
sec
lda $7A
sbc $78
sta $7A
sec
lda $7B
sbc $79
sta $7B
jsr j_gettile_bounds
rts
spell_cure:
jsr j_primm
.byte $D7,$C8,$B0,$AD,$00
jsr j_getplayernum
bne @gotnum
@fail:
jmp spell_failed
@gotnum:
jsr spell_play_effect
jsr j_get_stats_ptr
ldy #$12
lda (ptr1),y
cmp #$D0
bne @fail
lda #$C7
sta (ptr1),y
jmp print_done
spell_dispel:
lda game_mode
cmp #$03
beq @dungeon
jsr print_direction
lda game_mode
bmi @combat
cmp #$01
bne @towne
beq @britannia
@fail:
jmp spell_failed
@britannia:
jsr getdirection
beq @fail
jsr spell_play_effect
jsr j_gettile_bounds
@checktile:
cmp #$44
bcc @fail
cmp #$48
bcs @fail
lda tile_under_player
sta (ptr2),y
jmp print_done
@towne:
jsr getdirection
beq @fail
jsr spell_play_effect
jsr j_gettile_town
jmp @checktile
@combat:
jsr combat_getdirection
beq @fail
jsr spell_play_effect
jsr j_gettile_combat
sta tile_under_player
clc
lda $16
adc $78
sta $16
clc
lda $17
adc $79
sta $17
jsr j_gettile_combat
cmp #$44
bcc @fail
cmp #$48
bcs @fail
lda tile_under_player
sta tempmap,y
jmp print_done
@dungeon:
jsr spell_play_effect
clc
ldx dng_direction
lda player_xpos
adc dng_move_deltax,x
sta $16
clc
lda player_ypos
adc dng_move_deltay,x
sta $17
jsr j_gettile_dungeon
and #$F0
cmp #$A0
bne @fail
lda #$00
sta (ptr1),y
jmp print_done
spell_energyfield:
jsr j_primm
.byte $D4,$D9,$D0,$C5,$AD,$00
jsr getandprintkey
ldx #$44
cmp #$D0
beq @gottype
inx
cmp #$CC
beq @gottype
inx
cmp #$C6
beq @gottype
inx
cmp #$D3
beq @gottype
@fail:
jmp spell_failed
@gottype:
stx $6A
lda game_mode
bmi @combat
cmp #$03
bne @fail
jsr spell_play_effect
ldx dng_direction
clc
lda player_xpos
adc dng_move_deltax,x
sta $16
clc
lda player_ypos
adc dng_move_deltay,x
sta $17
jsr j_gettile_dungeon
bne @fail
lda $6A
and #$03
ora #$A0
sta (ptr1),y
jmp print_done
@combat:
jsr print_direction
jsr combat_getdirection
beq @fail
clc
lda $16
adc $78
sta $16
cmp #$0B
bcs @fail
clc
lda $17
adc $79
sta $17
cmp #$0B
bcs @fail
jsr spell_play_effect
jsr j_gettile_combat
jsr j_blocked_tile
bmi @fail
lda $6A
sta tempmap,y
jmp print_done
spell_fireball:
jsr spell_ensure_combat
jsr print_direction
jsr combat_getdirection
bne @gotdir
@fail:
lda #$00
sta missile
jmp spell_failed
@gotdir:
jsr spell_play_effect
lda #$4F
sta missile
spell_shoot_missile:
lda $16
sta missile_xpos
lda $17
sta missile_ypos
@again:
jsr combat_fire_missile
bmi @fail
jsr j_idle_combat
jsr combat_find_monster
bmi @again
lda #$06
jsr j_playsfx
lda missile
cmp #$4D
beq @magic_missile
cmp #$4E
beq @iceball
cmp #$4F
beq @fireball
lda #$E8
jmp @gotdmg
@fireball:
lda #$80
jsr randmax
ora #$18
jmp @gotdmg
@iceball:
lda #$E0
jsr randmax
ora #$20
jmp @gotdmg
@magic_missile:
lda #$40
jsr randmax
ora #$10
@gotdmg:
ldx #$00
stx missile
sta $5C
jsr hurt_monster
jmp print_done
spell_gate:
lda player_transport
cmp #$14
bcc @fail
lda game_mode
cmp #$01
beq @print_to_phase
jmp spell_ensure_outdoors
@print_to_phase:
jsr j_primm
.byte $D4,$CF,$A0,$D0,$C8,$C1,$D3,$C5
.byte $AD,$00
jsr getandprintkey
sec
sbc #$B1
cmp #$08
bcc @gotphase
@fail:
jmp spell_failed
@gotphase:
sta $6A
jsr spell_play_effect
ldx $6A
lda moongate_xpos,x
sta player_xpos
lda moongate_ypos,x
sta player_ypos
jsr music_nop
jsr j_player_teleport
jmp print_done
moongate_xpos:
.byte $E0,$60,$26,$32,$A6,$68,$17,$BB
moongate_ypos:
.byte $85,$66,$E0,$25,$13,$C2,$7E,$A7
spell_heal:
jsr j_primm
.byte $D7,$C8,$CF,$AD,$00
jsr j_getplayernum
bne @gotplayer
@fail:
jmp spell_failed
@gotplayer:
jsr spell_play_effect
jsr check_alive
bmi @fail
lda #$19
jsr randmax
clc
adc #$4B
jsr hextobcd
jsr stat_add_hp
jmp print_done
spell_iceball:
jsr spell_ensure_combat
jsr print_direction
jsr combat_getdirection
bne @gotdir
jmp spell_failed
@gotdir:
jsr spell_play_effect
lda #$4E
sta missile
jmp spell_shoot_missile
spell_jinx:
jsr spell_play_effect
lda #$CA
spell_set_aura:
sta magic_aura
lda #$0A
sta aura_duration
jmp print_done
spell_kill:
jsr spell_ensure_combat
jsr print_direction
jsr combat_getdirection
bne @gotdir
jmp spell_failed
@gotdir:
jsr spell_play_effect
lda #$8C
sta missile
jmp spell_shoot_missile
spell_light:
jsr spell_play_effect
lda #$64
sta light_duration
lda game_mode
cmp #$03
bne @notdungeon
jsr L8C06
@notdungeon:
jmp print_done
spell_magicmissle:
jsr spell_ensure_combat
jsr print_direction
jsr combat_getdirection
bne @gotdir
jmp spell_failed
@gotdir:
jsr spell_play_effect
lda #$4D
sta missile
jmp spell_shoot_missile
spell_negate:
jsr spell_play_effect
lda #$CE
jmp spell_set_aura
spell_open:
jsr spell_play_effect
lda game_mode
bmi @combat
lda #$00
sta currplayer
jmp get_chest
@combat:
jmp combat_open_chest
spell_protect:
jsr spell_play_effect
lda #$D0
jmp spell_set_aura
spell_quick:
jsr spell_play_effect
lda #$D1
jmp spell_set_aura
spell_resurrect:
lda game_mode
bpl L4C9C
L4C99:
jmp spell_failed
L4C9C:
jsr j_primm
.byte $D7,$C8,$CF,$AD,$00
jsr j_getplayernum
bne L4CAC
jmp spell_failed
L4CAC:
jsr spell_play_effect
jsr j_get_stats_ptr
ldy #$12
lda (ptr1),y
cmp #$C4