;********* ;* GLOOM * ;********* ; ;planar, 020+ version. ; ;6 bitplanes for ECS, 8 for AGA ; ;error codes ; ;red - allocmem failed ;yel - freemem failed ;orange - unknown script command ;purp - unknown event command ;cyn - can't open file in loadfile ;blu - ran out of remap colours! aga_ equ 0 os_ equ -1 testw equ 128 testh equ 128 cd32 equ 0 ;cd32 version? combatok equ -1 ;include combat game? ok equ 750+125 ;overkill level! cy equ 166 pl_eyey equ 110 pl_firey equ 60 pl_gutsy equ 64 debugser equ 0 debugmem equ 0 ; ireload equ 5 ;initial reload val. maxobjects equ 256 ;max objects in game maxdoors equ 16 ;max doors opening at once maxblood equ 128 ;max droplets of bluuurd maxgore equ 128 ;body parts on ground! maxrotpolys equ 32 ;max rotating thingys. ; focshft equ 7 grdshft equ 8 darkshft equ 7 ;smaller=smaller range=faster! maxz equ 16<>1 jmp entrypoint rsreset ; ;rotpoly details... ; rp_next rs.l 1 rp_prev rs.l 1 ; rp_speed rs.w 1 rp_rot rs.w 1 rp_flags rs.w 1 ;what to do? ; rp_cx rs.w 1 ;only for rot rp_cz rs.w 1 rp_first rs.l 1 ;pointer to first! rp_num rs.w 1 ; rp_vx rs.w 0 rp_lx rs.w 1 rp_vz rs.w 0 rp_lz rs.w 1 rp_ox rs.w 0 rp_na rs.w 1 rp_oz rs.w 0 rp_nb rs.w 1 ; rp_more rs.b 8*31 ;=32 max verts! ; rp_size rs.b 0 rsreset ; ;sfx channel info ; fx_status rs.w 1 fx_priority rs.w 1 fx_sfx rs.l 1 fx_vol rs.w 1 fx_offset rs.w 1 fx_dma rs.w 1 fx_int rs.w 1 ; fx_size rs.b 0 rsreset ; ;blood! ; bl_next rs.l 1 bl_prev rs.l 1 bl_x rs.l 1 bl_y rs.l 1 bl_z rs.l 1 bl_xvec rs.l 1 bl_dest rs.l 0 bl_yvec rs.l 1 bl_zvec rs.l 1 bl_color rs.l 1 ;colour and! ; bl_size rs.b 0 rsreset ; ;a texture ; te_pal rs.l 1 ; te_size rs.b 0 rsreset ; ;an opening/closing door! ; do_next rs.l 1 do_prev rs.l 1 do_poly rs.l 1 ;door polygon do_lx rs.w 1 do_lz rs.w 1 do_rx rs.w 1 do_rz rs.w 1 do_frac rs.w 1 do_fracadd rs.w 1 ; do_size rs.b 0 rsreset ; ;wall list... ; wl_next rs.l 1 wl_lsx rs.w 1 ;leftmost screen X wl_rsx rs.w 1 ;rightmost screen X wl_nz rs.w 1 ;near Z! wl_fz rs.w 1 ;far Z! wl_lx rs.w 1 wl_lz rs.w 1 wl_rx rs.w 1 wl_rz rs.w 1 wl_a rs.w 1 wl_b rs.w 1 wl_c rs.l 1 wl_sc rs.w 1 wl_open rs.w 1 ;0=door shut, $4000=open! wl_t rs.b 8 ;textures ; wl_size rs.b 0 rsreset ; ;a zone... ; zo_done rs.w 1 zo_lx rs.w 1 zo_lz rs.w 1 zo_rx rs.w 1 zo_rz rs.w 1 ; zo_a rs.w 1 zo_b rs.w 1 zo_na rs.w 1 zo_nb rs.w 1 zo_ln rs.w 1 ; zo_t rs.b 8 ;8 textures ; zo_sc rs.w 1 ;scale (how many txts on wall) zo_open rs.w 0 ;for wall polys... zo_ev rs.w 1 ;for events... ; zo_size rs.b 0 ;32! rsreset ; ;a shape to draw! ; sh_next rs.l 1 sh_prev rs.l 1 sh_x rs.w 1 sh_y rs.w 1 sh_z rs.w 1 sh_shape rs.l 1 sh_scale rs.w 0 sh_strip rs.l 1 sh_render rs.l 1 ;drawobjnorm or drawobjinvs ; sh_size rs.b 0 rsreset ; ;gore...body parts lying around! ; go_next rs.l 1 go_prev rs.l 1 go_x rs.w 1 go_z rs.w 1 go_shape rs.l 1 ; go_size rs.b 0 rsreset ; ;an object in the game (player/alien etc...) ; ob_next rs.l 1 ob_prev rs.l 1 ob_x rs.l 1 ob_y rs.l 1 ob_z rs.l 1 ob_rot rs.l 1 ; ;start of info load by prog. ob_info rs.b 0 ; ob_rotspeed rs.l 1 ob_movspeed rs.l 1 ob_shape rs.l 1 ob_logic rs.l 1 ob_render rs.l 1 ob_hit rs.l 1 ;routine to do when damaged ob_die rs.l 1 ;routine to do when killed ob_eyey rs.w 1 ;eye height ob_firey rs.w 1 ;where bullets come from ob_gutsy rs.w 1 ob_mega rs.w 0 ob_othery rs.w 1 ob_colltype rs.w 1 ob_collwith rs.w 1 ob_cntrl rs.w 1 ob_damage rs.w 1 ob_hitpoints rs.w 1 ob_think rs.w 1 ob_frame rs.l 1 ;anim frame ob_framespeed rs.l 1 ;anim frame ob_base rs.w 1 ob_range rs.w 1 ob_weapon rs.w 1 ;weapon meter (0...4) ob_reload rs.b 1 ;weapon reload timer ob_reloadcnt rs.b 1 ;counter ob_hurtpause rs.w 1 ob_firerate rs.w 0 ob_punchrate rs.w 1 ob_bouncecnt rs.w 1 ;how many times my bullets bounce! ob_firecnt rs.w 0 ob_something rs.w 1 ob_scale rs.w 1 ;scale factor for drawing ob_lastbut rs.w 1 ob_blood rs.w 1 ;color AND for blood ob_ypad rs.w 1 ; ob_oldlogic rs.l 1 ob_oldlogic2 rs.l 1 ob_oldhit rs.l 1 ob_olddie rs.l 1 ob_oldrot rs.w 1 ob_newrot rs.w 1 ob_yvec rs.l 1 ob_xvec rs.l 1 ob_zvec rs.l 1 ob_radsq rs.l 1 ;radius squared ob_rad rs.w 1 ob_delay rs.w 1 ob_delay2 rs.w 0 ob_bounce rs.w 1 ob_hurtwait rs.w 1 ; ob_washit rs.l 1 ;flag for un-hit coll detect! ob_window rs.l 1 ;pointer back to window! ob_nxvec rs.w 0 ;normalized X vec ob_lives rs.w 1 ob_nzvec rs.w 0 ;normalized z vec ob_infra rs.w 1 ob_thermo rs.w 1 ob_invisible rs.w 1 ob_hyper rs.w 1 ob_update rs.w 1 ;update stats! ob_mess rs.l 1 ;message ob_messlen rs.w 1 ob_messtimer rs.w 1 ;timer for messages ob_palette rs.l 1 ;palette for window ob_paltimer rs.w 1 ;timer before back to normal ob_pixsize rs.w 1 ob_pixsizeadd rs.w 1 ob_telex rs.w 1 ob_telez rs.w 1 ob_telerot rs.w 1 ob_chunks rs.l 1 ; ob_size rs.b 0 rsreset ; ;solid wall draw data ; vd_z rs.w 1 ;current Z vd_pal rs.w 1 ;palette# (0...15) vd_y rs.w 1 vd_h rs.w 1 vd_data rs.l 1 vd_ystep rs.l 1 ; vd_size rs.b 0 rsreset ; ;palette file... ; pa_numcols rs.w 1 ;how many colours pa_cols rs.w 256 ;the colours! rsreset ; ;anim file... ; an_rotshft rs.w 1 an_frames rs.w 1 an_maxw rs.w 1 an_maxh rs.w 1 an_pal rs.l 1 ; an_size rs.b 0 rsreset ; ;window ; wi_slice rs.l 1 ;slice window appears in! wi_nslice rs.l 1 ;next slice to disp. wi_x rs 1 wi_y rs 1 wi_w rs 1 ;how many chixels across wi_h rs 1 ;how many down wi_pw rs 1 ;width of 1 chixel wi_ph rs 1 ;hite of 1 chixel ; wi_bw rs 1 ;bitmap width wi_bh rs 1 ;bitmap height ; wi_bmapmem rs.l 1 wi_copmem rs.l 1 wi_bmap rs.l 1 wi_cop rs.l 1 wi_cop1 rs.l 1 wi_cop2 rs.l 1 wi_chunkymodw rs.w 1 ; wi_strip rs.l 1 wi_iff rs.l 1 ;show iff instead! wi_pal rs.l 1 ;palette for IFF! ; wi_size rs.b 0 key macro btst #\1&7,\1>>3(a0) endm keya1 macro btst #\1&7,\1>>3(a1) endm qkey macro move.l rawtable(pc),a0 key \1 endm freemem macro ; ifne debugmem lea .fmem\@,a0 jsr freemem_ bra .fmemskip\@ .fmem\@ dc.b '\1',0 even .fmemskip\@ ; elseif jsr freemem_ endc ; endm allocmem macro ; ifne debugmem ; lea .amem\@,a0 jsr allocmem_ bra .amemskip\@ .amem\@ dc.b '\1',10,0 even .amemskip\@ ; elseif ; jsr allocmem_ ; endc ; endm allocmem2 macro ; ifne debugmem ; lea .amem\@,a0 jsr allocmem2_ bra .amemskip\@ .amem\@ dc.b '\1',10,0 even .amemskip\@ ; elseif ; jsr allocmem2_ ; endc ; endm alloclist macro ;alloclist listname,maxitems,itemsize ; move.l \2,d0 move.l \3,d1 lea \1(pc),a2 jsr k_alloclist bra.s alskip\@ ; \1 dc.l 0 ;0 \1_last dc.l 0 ;4 dc.l 0 ;8 \1_free dc.l 0 ;12 alskip\@ ; endm k_alloclist ;a2=address of 'first' pointer ;d0=max items, d1=item size ; move.l a2,8(a2) ;clear out used list lea 4(a2),a0 clr.l (a0) move.l a0,(a2) movem.l d0-d1,-(a7) mulu d1,d0 move.l #$10001,d1 allocmem alloclist move.l d0,a0 lea 12(a2),a2 movem.l (a7)+,d0-d1 subq #1,d0 .loop move.l a0,(a2) move.l a0,a2 add d1,a0 dbf d0,.loop rts addnext macro ; ;addnext 'listname' ;add after a5 ;return eq if none available else a0 ; move.l \1_free,d0 beq.s .anskip\@ move.l d0,a0 move.l (a0),\1_free move.l (a5),a1 move.l a1,(a0) move.l a0,4(a1) move.l a0,(a5) move.l a5,4(a0) .anskip\@ ; endm addfirst macro ; ;addfirst 'listname' ;return eq if none available else a0 ; move.l \1_free,d0 beq.s .afskip\@ move.l d0,a0 move.l (a0),\1_free move.l \1,a1 ;current first move.l a1,(a0) move.l a0,4(a1) move.l a0,\1 move.l #\1,4(a0) .afskip\@ ; endm addlast macro ; ;addlast 'listname' ;return eq in none available else a0 ; move.l \1_free,d0 beq.s .alskip\@ move.l d0,a0 move.l (a0),\1_free ; move.l \1_last+4,a1 ;current last move.l a0,(a1) move.l a1,4(a0) move.l a0,\1_last+4 move.l #\1_last,(a0) .alskip\@ ; endm killitem macro ; ;killitem listname ;a0=item to kill, return a0=previous item. ; move.l (a0),a1 ;next of me! move.l 4(a0),4(a1) move.l 4(a0),a1 ;prev of me move.l (a0),(a1) move.l \1_free,(a0) move.l a0,\1_free move.l a1,a0 endm clearlist macro ; ;clearlist listname ; .clloop\@ move.l \1,a0 tst.l (a0) beq .cldone\@ killitem \1 bra .clloop\@ .cldone\@ ; endm zerolist macro listname,size of item ; ;fill all list items with 0! ; clearlist \1 .zlloop\@ addlast \1 beq .zlskip\@ lea 8(a0),a1 moveq #0,d0 move #(\2-8)/2-1,d1 .zlloop2\@ move d0,(a1)+ dbf d1,.zlloop2\@ bra .zlloop\@ .zlskip\@ clearlist \1 ; endm bwait macro ; .bwait\@ btst #6,$dff002 beq.s .bwait2\@ bra.s .bwait\@ .bwait2\@ ; endm printlong macro move.l \1,-(a7) jsr printlong_ endm check macro list check set *-\1 nolist endm push macro movem.l d2-d7/a2-a6,-(a7) endm pull macro movem.l (a7)+,d2-d7/a2-a6 endm col macro move #0,$dff106 move \1,$dff180 endm warn macro move d0,-(a7) move #-1,d0 .wloop\@ col \1 dbf d0,.wloop\@ move (a7)+,d0 endm tempfile ds.b 64 wbmess dc.l 0 ;workbench message! entrypoint ; clr.l map_test move.l 4.w,a6 move.l 276(a6),a5 ;task tst.l $ac(a5) ;cli? bne.s cli ; lea $5c(a5),a0 jsr -384(a6) ;waitport lea $5c(a5),a0 jsr -372(a6) ;get message move.l d0,wbmess bra wb cli ; cmp.b #'@',(a0)+ bne.s wb lea tempfile,a1 move.l a1,map_test .loop move.b (a0)+,(a1) beq.s wb cmp.b #10,(a1)+ bne.s .loop clr.b -(a1) wb ; lea dosname,a1 move.l 4.w,a6 jsr -408(a6) move.l d0,dosbase ; move.l d0,a6 jsr -60(a6) move.l d0,outhand ; move.l wbmess(pc),d0 beq.s .nocd move.l d0,a0 move.l $24(a0),a0 move.l (a0),d1 move.l dosbase,a6 jsr -126(a6) .nocd ; move.l 4.w,a6 moveq #1,d1 jsr -216(a6) cmp.l #$1a6548-$c000,d0 ;enough memory to run gloom? bcs nomem ; jsr initmain ; bsr bigfont ; .intro move.l medat(pc),a1 move.l titlemed(pc),a0 jsr 8(a1) ;start title music! ; .intro2 jsr dointro ;returns gametype ; cmp #3,gametype bcs.s .play move.l medat(pc),a1 jsr 12(a1) bra.s exittoos .play ; bsr initnewgame tst gametype bmi .intro2 ; ;bsr smallfont tst twowins beq.s .n2 bsr swaphflags .n2 jsr execscript_med .wmf tst fadevol bne.s .wmf tst twowins beq.s .n22 bsr swaphflags .n22 bsr bigfont bra .intro ; exittoos jsr freeobjlist2 jsr permit jsr finitdisplay jsr finitvbint jsr finitsfx jsr finitser jsr freememlist ifeq cd32 jsr undir endc ; nomem move.l wbmess(pc),d0 beq.s .bye ; move.l 4.w,a6 move.l d0,a1 jsr -378(a6) clr.l wbmess ; .bye rts ; ************* FAST SUBS ******************** fastsubs swaphflags movem.l floorflag(pc),d0-d1 move.l d1,floorflag move.l d0,floorflag2 rts smallfont move #6,fontw move #8,fonth move.l smallfont_,font rts bigfont move #8,fontw move #10,fonth move.l bigfont_,font rts encodejoy ;a0=cntrl block to encode... ;return d0 encoded ; ;bit: ;0 = joyx -1 ;1 = joyx 1 ;2 = joyy -1 ;3 = joyy 1 ;4 = joyb true ;5 = joys true ; moveq #0,d0 ; tst (a0) beq.s .skipx bpl.s .x1 bset #0,d0 bra.s .skipx .x1 bset #1,d0 .skipx tst 2(a0) beq.s .skipy bpl.s .y1 bset #2,d0 bra.s .skipy .y1 bset #3,d0 .skipy tst 4(a0) beq.s .skipb bset #4,d0 .skipb tst 6(a0) beq.s .skipf bset #5,d0 .skipf ; rts decodejoy ; ;d0.b = encoded byte... ;a0 = block to fill ; ;0 = joyx -1 ;1 = joyx 1 ;2 = joyy -1 ;3 = joyy 1 ;4 = joyb true ;5 = joys true ; clr (a0) move d0,d1 and #3,d1 beq.s .skipx cmp #1,d1 bne.s .x1 move #-1,(a0) bra.s .skipx .x1 move #1,(a0) .skipx clr 2(a0) move d0,d1 and #12,d1 beq.s .skipy cmp #4,d1 bne.s .y1 move #-1,2(a0) bra.s .skipy .y1 move #1,2(a0) .skipy btst #4,d0 sne d1 ext d1 move d1,4(a0) btst #5,d0 sne d1 ext d1 move d1,6(a0) rts sfxs ; sfx0 ds.b fx_size sfx1 ds.b fx_size sfx2 ds.b fx_size sfx3 ds.b fx_size sfxintserver0 dc.l 0,0 dc.b 2,0 dc.l 0 dc.l sfx0 dc.l sfxint sfxintserver1 dc.l 0,0 dc.b 2,0 dc.l 0 dc.l sfx1 dc.l sfxint sfxintserver2 dc.l 0,0 dc.b 2,0 dc.l 0 dc.l sfx2 dc.l sfxint sfxintserver3 dc.l 0,0 dc.b 2,0 dc.l 0 dc.l sfx3 dc.l sfxint initsfx push move.l 4.w,a6 ; moveq #7,d0 lea sfxintserver0,a1 jsr -162(a6) ;setintvector ; moveq #8,d0 lea sfxintserver1,a1 jsr -162(a6) ; moveq #9,d0 lea sfxintserver2,a1 jsr -162(a6) ; moveq #10,d0 lea sfxintserver3,a1 jsr -162(a6) ; lea sfxs(pc),a1 move #$80,d0 moveq #1,d1 moveq #0,d2 moveq #3,d3 .loop bsr .init lea fx_size(a1),a1 dbf d3,.loop ; pull rts ; .init clr fx_status(a1) move d0,fx_int(a1) move d1,fx_dma(a1) move d2,fx_offset(a1) add d0,d0 add d1,d1 add #16,d2 rts finitsfx push move.l 4.w,a6 ; moveq #7,d0 sub.l a1,a1 jsr -162(a6) ; move.l 4.w,a6 moveq #8,d0 sub.l a1,a1 jsr -162(a6) ; move.l 4.w,a6 moveq #9,d0 sub.l a1,a1 jsr -162(a6) ; move.l 4.w,a6 moveq #10,d0 sub.l a1,a1 jsr -162(a6) ; pull rts waitquiet bsr vwait lea sfxs(pc),a0 moveq #3,d0 .loop tst fx_status(a0) bne.s waitquiet lea fx_size(a0),a0 dbf d0,.loop rts playsfx ;sfx file in a0, vol in d0, priority in d1 ; ;move #$4000,$dff09a ;snd/vb ints off ; lea sfxs(pc),a1 moveq #3,d2 .loop tst fx_status(a1) beq.s makesfx lea fx_size(a1),a1 dbf d2,.loop ; ;OK, none free...check priorities ; lea sfxs(pc),a1 moveq #3,d2 .loop2 cmp fx_priority(a1),d1 bgt.s queuesfx lea fx_size(a1),a1 dbf d2,.loop2 ; ;no-can-do! ; ;move #$c000,$dff09a rts ; queuesfx ;OK, turn off other and play US! ; move #1,fx_status(a1) move d0,fx_vol(a1) move d1,fx_priority(a1) move.l a0,fx_sfx(a1) ;play me next! ; bsr sfxoff ; ;move #$c000,$dff09a rts sfxoff lea $dff0a0,a2 add fx_offset(a1),a2 move.l chipzero(pc),(a2) move #1,4(a2) ;len move #0,8(a2) ;vol move fx_int(a1),$dff09a move fx_dma(a1),$dff096 rts makesfx ;OK, play this SFX NOW! ; move d1,fx_priority(a1) move d0,fx_vol(a1) bsr playsfxnow ;move #$c000,$dff09a rts playsfxnow move #-2,fx_status(a1) ; lea $dff0a0,a2 add fx_offset(a1),a2 move (a0)+,6(a2) ;period move (a0)+,4(a2) ;len move fx_vol(a1),8(a2) ;vol move.l a0,(a2) ;data ; move fx_dma(a1),d0 ;dma bits or #$8000,d0 move fx_int(a1),d1 ;int bits move d1,d2 or #$8000,d1 ; move d0,$dff096 ;dma on! move d1,$dff09a ;int en move d2,$dff09c ;intreq clr ; rts sfxint ;interupt for sfx! ; tst fx_status(a1) bge.s .skip addq #1,fx_status(a1) blt.s .skip ; move.l a2,-(a7) bsr sfxoff move.l (a7)+,a2 ; .skip move fx_int(a1),$dff09c moveq #0,d0 rts dogamemenu ; move #$20,$dff09a ; st paused move framecnt,-(a7) move linked,-(a7) clr linked ; move #$8020,$dff09a ; lea gamemenu,a4 jsr initmenu ; .loop jsr selmenu beq .done ; subq #1,d0 bne .notpsize bra .loop ; .notpsize subq #1,d0 bne .notwsize bsr newwsize bra .loop ; .notwsize subq #1,d0 bne .notlwin bsr largewin bra .loop ; .notlwin subq #1,d0 bne .notfloor ; addq #1,floorflag cmp #2,floorflag bne.s .fskip move #-1,floorflag .fskip bsr refresh bra .loop ; .notfloor subq #1,d0 bne .notroof ; addq #1,roofflag cmp #2,roofflag bne.s .rskip move #-1,roofflag .rskip bsr refresh bra .loop .notroof ; move #1,finished ; .done jsr dispoff jsr finitmenu cmp #1,finished bne.s .notfin bsr clspic bsr clspic bra.s .findone .notfin bsr predrawall .findone jsr dispon ; move #$20,$dff09a ; move (a7)+,linked beq.s .nolink move finished(pc),d0 beq.s .nolink bset #7,d0 bsr serput .nolink move (a7)+,framecnt clr paused ; move #$8020,$dff09a ; rts largewin move #320,width move #224,hite bra.s sizedone newwsize cmp #224,hite bcs.s .inc cmp #320,width bcs.s .inc2 move #64,width move #64,hite bra.s sizedone ; .inc add #32,hite .inc2 add #32,width ; sizedone move width(pc),d0 move d0,chunkymodw lsr #1,d0 move d0,maxx neg d0 move d0,minx move hite(pc),d0 lsr #1,d0 move d0,maxy neg d0 move d0,miny bra refresh calcoffset move #320,d0 sub width(pc),d0 lsr #4,d0 ext.l d0 ; move #224,d1 sub hite(pc),d1 lsr #1,d1 mulu linemodw(pc),d1 add.l d1,d0 move.l d0,offset ; rts refresh jsr dispoff jsr finitmenu jsr predrawall lea gamemenu,a4 jsr initmenu2 jsr dispon rts drawchunky ;draw a chunky shape on a 320 wide chunkymap ; ;d0=x,d1=y,d2=shape#,a0=shapetable ; move.l panel(pc),a0 add #224,d1 ; movem.l d2-d5/a2-a4,-(a7) ; move.l chunky(pc),a1 mulu #320,d1 add.l d1,a1 ;left lea coloffs,a2 lea 0(a2,d0*4),a2 ;coloff ; add.l 12(a0,d2*4),a0 ;start of shape! addq #4,a0 ;skip handles movem (a0)+,d2-d3 ;width, height subq #1,d2 subq #1,d3 move.l #320,d5 ;chunky mod moveq #0,d0 move.l palettes(pc),a4 .hloop move d3,d4 ;start of column move.l a1,a3 add.l (a2)+,a3 .vloop move.b (a0)+,d0 beq.s .skip move.b 0(a4,d0),(a3) .skip add.l d5,a3 dbf d4,.vloop dbf d2,.hloop ; movem.l (a7)+,d2-d5/a2-a4 rts predrawall ;draw up everything.... ; ;status bar too... ; bsr clspic bsr clspic bsr calcoffset moveq #0,d0 moveq #0,d1 moveq #47,d2 bsr drawchunky move.l player1(pc),a0 st ob_update(a0) tst gametype beq.s .skip move.l player2(pc),a0 st ob_update(a0) .skip bsr drawall_ bra drawall_ drawall ; .wait tst doneflag bne.s .waitskip bsr vwait bra.s .wait .waitskip clr doneflag ; drawall_ move.l player1(pc),player_ move.l memory(pc),memat ; bsr calcscene bsr drawscene bsr blitscene ; move twowins(pc),d0 beq.s .show ; move.l player2(pc),player_ move.l memory(pc),memat bsr calcscene bsr drawscene bsr blitscene .show ; .wait2 tst showflag bne.s .waitskip2 bsr vwait bra.s .wait2 .waitskip2 bsr doc2p jsr db clr showflag rts doc2p ; move.l chunky(pc),a0 ;src move.l drawbitmap(pc),a1 ;dest add.l offset(pc),a1 move width(pc),d0 move hite(pc),d1 move.l bpmod(pc),d2 ;bpmod move.l linemod(pc),d3 ;linemod move.l c2p(pc),a2 jsr (a2) move panelcnt(pc),d0 beq.s .rts ; subq #1,panelcnt move.l drawbitmap(pc),a1 move #224,d1 mulu linemodw(pc),d1 add.l d1,a1 ; move.l chunky(pc),a0 add.l #320*224,a0 ; move #320,d0 moveq #13,d1 move.l bpmod(pc),d2 move.l linemod(pc),d3 move.l c2p(pc),a2 jsr (a2) ; .rts rts resetplayer st ob_update(a5) clr ob_mega(a5) clr ob_thermo(a5) clr ob_infra(a5) clr ob_invisible(a5) clr ob_pixsize(a5) clr ob_pixsizeadd(a5) clr ob_bouncecnt(a5) move #-1,ob_messtimer(a5) move.l #palettes,ob_palette(a5) rts message ;print up a message...player in a5 ; move.l (a7),a0 ;return address=message! move.l a0,ob_mess(a5) ; moveq #-1,d0 .loop addq #1,d0 tst.b (a0)+ bne.s .loop ; move d0,ob_messlen(a5) move #-127,ob_messtimer(a5) ; move.l a0,d0 addq.l #1,d0 and #$fffe,d0 move.l d0,(a7) rts pdelay dc 0 ;non zero=wait between prints printmess ;a5=object ; move.l ob_window(a5),a6 move.l ob_mess(a5),a4 move ob_messlen(a5),d0 move wi_bh(a6),d6 lsr #2,d6 ;Y ; printmess2 ;a4=message, d0=length of message, d6=Y ; move fontw(pc),d2 lsr #1,d2 mulu d2,d0 move #160,d7 sub d0,d7 ;X ; jsr ownblitter ; .loop2 move.b (a4)+,d2 beq .done cmp.b #' ',d2 beq.s .spc cmp.b #'0',d2 bcs.s .nnum cmp.b #'9',d2 bhi.s .nnum sub.b #'0',d2 ext d2 bra.s .here .nnum cmp.b #"'",d2 bne.s .notap moveq #57,d2 bra.s .here .notap cmp.b #'!',d2 bne.s .notex moveq #36,d2 bra.s .here .notex cmp.b #'.',d2 bne.s .notfs moveq #37,d2 bra.s .here .notfs cmp.b #':',d2 bne.s .notcol moveq #38,d2 bra.s .here .notcol cmp.b #127,d2 bne.s .notcurs moveq #39,d2 bra.s .here .notcurs and #31,d2 add #9,d2 .here move.l font(pc),a0 move.l showbitmap(pc),a1 move d7,d0 move d6,d1 bsr blit ; move pdelay(pc),d2 subq #1,d2 bmi.s .spc ; .pdloop bsr vwait bsr checkany beq.s .none move #-1,pdelay moveq #0,d2 .none dbf d2,.pdloop ; .spc add fontw(pc),d7 bra .loop2 .done ; jmp disownblitter printhexnum ;d0=x,d1=y,d2=hex long,a5=window ; move.l ob_window(a5),a0 move.l wi_bmap(a0),a1 ; movem.l d0-d2/a0-a1,-(a7) subq #2,d0 subq #1,d1 moveq #55,d2 move.l font(pc),a0 bsr blit movem.l (a7)+,d0-d2/a0-a1 ; move #8,-(a7) .loop rol.l #4,d2 movem.l d0-d2/a0-a1,-(a7) and #15,d2 move.l font(pc),a0 bsr blit movem.l (a7)+,d0-d2/a0-a1 addq #6,d0 subq #1,(a7) bne.s .loop addq #2,a7 addq #8,d1 rts showstats ; ;a5=player ; ;clear middle moveq #0,d0 moveq #2,d1 moveq #46,d2 bsr drawchunky ; ;hitpoints move ob_hitpoints(a5),d7 ble.s .nohp move #267,d6 moveq #45,d2 subq #1,d7 .hploop move d6,d0 moveq #3,d1 bsr drawchunky addq #2,d6 dbf d7,.hploop .nohp ; ;lives move ob_lives(a5),d7 ble.s .nolv moveq #6,d6 sub d7,d6 lsl #3,d6 add #218,d6 moveq #44,d2 subq #1,d7 .lvloop move d6,d0 moveq #2,d1 bsr drawchunky addq #8,d6 dbf d7,.lvloop .nolv ; ;weapon moveq #5,d7 sub.b ob_reload(a5),d7 blt.s .nowp move ob_weapon(a5),d2 ;0...4 add #39,d2 moveq #55,d6 moveq #10,d3 .wploop move d6,d0 moveq #2,d1 bsr drawchunky add d3,d6 dbf d7,.wploop .nowp ; ;mega move ob_mega(a5),d7 lsr #5,d7 and #$fffe,d7 ble.s .nomg cmp #50,d7 ble.s .mgok moveq #50,d7 .mgok moveq #53,d6 sub d7,d6 moveq #45,d2 lsr #1,d7 subq #1,d7 .mgloop move d6,d0 moveq #3,d1 bsr drawchunky addq #2,d6 dbf d7,.mgloop .nomg ; rts blit ;a0=shapetable to blit, a1=bitmap, d0=X, d1=Y, d2=char ; add.l 4(a0,d2*4),a0 ; mulu linemodw(pc),d1 add.l d1,a1 move d0,d2 asr #3,d2 add d2,a1 ;dest! move.l a0,a2 add.l (a0),a2 lea 10(a0),a3 addq #4,a0 and #15,d0 ror #4,d0 ; btst #6,$dff002 .bwait btst #6,$dff002 bne.s .bwait ; move.l a3,$dff04c ;image move d0,$dff042 or blitmode(pc),d0 move d0,$dff040 move d0,bltcon0 move.l #$ffff0000,$dff044 moveq #-2,d0 move d0,$dff064 move d0,$dff062 move linemodw(pc),d0 subq #2,d0 sub (a0)+,d0 move d0,$dff060 move d0,$dff066 move (a0)+,d0 move (a0),d1 subq #1,d1 move.l bpmod(pc),d2 ; .bloop btst #6,$dff002 btst #6,$dff002 bne.s .bloop ; move.l a2,$dff050 ;cookie move.l a1,$dff048 ;dest move.l a1,$dff054 move d0,$dff058 add.l d2,a1 ; dbf d1,.bloop ; move bitplanes(pc),d1 sub (a0),d1 ble.s .rts subq #1,d1 ;clear excess planes and #$fb0f,bltcon0 ; btst #6,$dff002 .bwait2 btst #6,$dff002 bne.s .bwait2 move bltcon0(pc),$dff040 ; .bloop2 btst #6,$dff002 btst #6,$dff002 bne.s .bloop2 ; move.l a2,$dff050 ;cookie move.l a1,$dff048 ;dest move.l a1,$dff054 move d0,$dff058 add.l d2,a1 ; dbf d1,.bloop2 ; .rts rts bltcon0 dc 0 blitmode dc $fca pixsize dc 0 ;pixel size...at least 2! pixelate rts flatcam dc.l 0 flatyadd dc 0 flatyadd2 dc 0 flat ; ;do flat above/below panel! ; ;d0=Y pos of flat ;d1=Screen Y add ;d7=first screen Y (miny or maxy-1) ; ;a0=panel to draw on! ; ext.l d0 lsl.l #focshft,d0 move.l d0,flatcam ; move d1,flatyadd muls chunkymodw(pc),d1 move d1,flatyadd2 ; move d7,d0 add midy(pc),d0 mulu chunkymodw(pc),d0 add.l chunky(pc),d0 move.l d0,a2 lea coloffs,a1 .vloop ; ;find Z on this scanline... ; tst d7 beq .rts move.l flatcam(pc),d6 divs d7,d6 ;d6.w = Z cmp #maxz,d6 bcc .rts ; move.l darktable(pc),a5 move 0(a5,d6*2),d5 move.l palette(pc),a5 move.l 0(a5,d5*4),a5 ; ;Find leftmost X... ; move minx(pc),d5 muls d6,d5 asr.l #focshft,d5 ; move maxx(pc),d4 muls d6,d4 asr.l #focshft,d4 ; ;rotate X1,Z around camera... ; move d5,d0 move d6,d1 ; move d0,d2 move d1,d3 ; muls icm1(pc),d0 add.l d0,d0 muls icm2(pc),d3 add.l d3,d3 add.l d3,d0 ; muls icm3(pc),d2 add.l d2,d2 muls icm4(pc),d1 add.l d1,d1 add.l d2,d1 ; ;d0,d1.q = rotated x1,z ; ;rotate X2,Z around camera... ; move d4,d2 move d6,d3 ; muls icm1(pc),d4 add.l d4,d4 muls icm2(pc),d3 add.l d3,d3 add.l d3,d4 ; muls icm3(pc),d2 add.l d2,d2 muls icm4(pc),d6 add.l d6,d6 add.l d2,d6 ; ;d4,d6.q = rotated x2,z ; move width(pc),d5 ext.l d5 sub.l d0,d4 ;Xadd divs.l d5,d4 sub.l d1,d6 ;Zadd divs.l d5,d6 ; ;d0,d1.q=x,z ;d4,d6.q=xadd,zadd ; swap d0 add camx(pc),d0 swap d1 add camz(pc),d1 swap d4 swap d6 ; move.l d7,-(a7) moveq #127,d7 moveq #0,d2 moveq #0,d3 move.l a1,a3 ; move width(pc),d5 subq #1,d5 ; .hloop ;get next column ; move.l (a3)+,a4 ;coloff tst.b 0(a2,a4.l) bne.s .skip ; and d7,d0 and d7,d1 move d0,d2 lsl #7,d2 add d2,d1 add.l d4,d0 move.b 0(a0,d1),d3 addx d2,d0 add.l d6,d1 move.b 0(a5,d3),0(a2,a4.l) addx d2,d1 dbf d5,.hloop bra.s .hhh ; .skip add.l d4,d0 addx d2,d0 add.l d6,d1 addx d2,d1 dbf d5,.hloop ; .hhh move.l (a7)+,d7 add flatyadd(pc),d7 add flatyadd2(pc),a2 bra .vloop ; .rts rts doanims move.l map_anim(pc),a0 lea textures,a1 ; .loop move (a0)+,d0 ;how many frames beq.s .done movem (a0)+,d1-d2 ;first, delay subq #1,(a0)+ bgt.s .loop move d2,-2(a0) lea 0(a1,d1*4),a2 ; ;do the anim! ; subq #2,d0 move.l (a2),d2 .loop2 move.l 4(a2),(a2)+ dbf d0,.loop2 move.l d2,(a2) bra.s .loop ; .done rts dorots ; move.l camrots2(pc),a6 lea rotpolys(pc),a5 ;header! ; rotloop move.l (a5),a5 tst.l (a5) beq .done move rp_speed(a5),d0 beq.s rotloop ; add d0,rp_rot(a5) move rp_rot(a5),d0 ; move.l rp_first(a5),a2 ;first move rp_num(a5),d5 subq #1,d5 move d5,d4 lsl #5,d4 lea 0(a2,d4),a1 ;previous lea rp_lx(a5),a3 ; btst #0,rp_flags+1(a5) bne.s morph ; .rot movem rp_cx(a5),d6-d7 ;centre x,z and #1023,d0 lea 0(a6,d0*8),a4 ;rotation matrix. ; .loop bsr rotter add d6,d0 add d7,d1 movem d0-d1,zo_lx(a2) movem d0-d1,zo_rx(a1) bsr rotter movem d0-d1,zo_na(a2) exg d0,d1 neg d0 movem d0-d1,zo_a(a2) move.l a2,a1 lea 32(a2),a2 dbf d5,.loop ; bra rotloop ; .done rts ; morph tst d0 bgt.s .dp moveq #0,d0 .neg neg rp_speed(a5) bra.s .skip2 .dp cmp #$4000,d0 blt.s .skip move #$4000,d0 btst #1,rp_flags+1(a5) bne.s .neg clr rp_speed(a5) .skip2 move d0,rp_rot(a5) .skip ; move d0,d4 movem.l a2/d5,-(a7) ;for calculating norms! ; .loop movem (a3)+,d0-d3 muls d4,d0 lsl.l #2,d0 swap d0 add d2,d0 muls d4,d1 lsl.l #2,d1 swap d1 add d3,d1 movem d0-d1,zo_lx(a2) movem d0-d1,zo_rx(a1) move.l a2,a1 lea 32(a2),a2 dbf d5,.loop ; movem.l (a7)+,a2/d5 ; .loop2 move zo_rx(a2),d0 sub zo_lx(a2),d0 move zo_rz(a2),d1 sub zo_lz(a2),d1 bsr calcnormvec movem d0-d1,zo_na(a2) exg d0,d1 neg d0 movem d0-d1,zo_a(a2) lea 32(a2),a2 dbf d5,.loop2 ; bra rotloop calcnormvec ;d0,d1 = vector...normalize! ; ;OK, find vector length! ; move d0,d2 muls d2,d2 move d1,d3 muls d3,d3 add.l d3,d2 ; ;OK, sqr of d2.l! ; move.l #$10000,d3 ; .fitit cmp.l #16384,d2 ;fits? bcs.s .ok asr.l #1,d2 mulu.l #92681,d4:d3 ;mult by sqr(2) move d4,d3 swap d3 bra.s .fitit ; .ok ;OK to look up, but multiply the result.w by d3.q ; move.l sqr(pc),a0 and #$fffe,d2 movem 0(a0,d2),d2 ;sqr.l! mulu.l d3,d2 swap d2 ;length.w ; ;length should be >= both abs(xvec) AND abs(zvec) ; move d0,d3 bpl.s .xp neg d3 .xp move d1,d4 bpl.s .zp neg d4 .zp ; cmp d4,d3 bcc.s .bg exg d3,d4 .bg ; cmp d3,d2 bcc.s .lo move d3,d2 .lo ; ext.l d2 ; swap d0 clr d0 divs.l d2,d0 muls.l #32766,d0 swap d0 ; swap d1 clr d1 divs.l d2,d1 muls.l #32766,d1 swap d1 rts rotter movem (a3)+,d0-d1 ;this x,z move d0,d2 move d1,d3 ; muls (a4),d0 muls 2(a4),d3 add.l d3,d0 add.l d0,d0 swap d0 ;new x! ; muls 4(a4),d2 muls 6(a4),d1 add.l d2,d1 add.l d1,d1 swap d1 ; rts dodoors lea doors(pc),a5 ; .loop move.l (a5),a5 tst.l (a5) beq .done ; move.l do_poly(a5),a0 move do_fracadd(a5),d0 add d0,do_frac(a5) move do_frac(a5),d0 move d0,d1 add d1,d1 move d1,zo_open(a0) ;copy frac ; move do_rx(a5),d1 sub do_lx(a5),d1 ;width move d1,d2 muls d0,d2 lsl.l #2,d2 swap d2 move do_lx(a5),d3 sub d2,d3 move d3,zo_lx(a0) add d1,d3 move d3,zo_rx(a0) ; move do_rz(a5),d1 sub do_lz(a5),d1 move d1,d2 muls d0,d2 lsl.l #2,d2 swap d2 move do_lz(a5),d3 sub d2,d3 move d3,zo_lz(a0) add d1,d3 move d3,zo_rz(a0) ; tst d0 beq.s .kill cmp #$4000,d0 bne.s .loop ; .kill move.l a5,a0 killitem doors move.l a0,a5 bra .loop ; .done rts doorsfxflag dc 0 execevent ;d0=event number to execute...1,2... ; sf doorsfxflag move.l map_map(pc),a6 move.l map_events(pc),a0 add.l 0(a0,d0*4),a6 ; exec_loop move (a6)+,d0 beq.s .rts subq #1,d0 beq exec_addobj ;1 - add an object (alien etc) subq #1,d0 beq exec_opendoor ;2 - open a door subq #1,d0 beq exec_teleport ;3 - teleport subq #1,d0 beq exec_loadobjs ;4 - load objects subq #1,d0 beq exec_changetxt ;5 - change texture subq #1,d0 beq exec_rotpolys ;6 - start polygons rotating! ; warn #$f0f ; .rts tst doorsfxflag beq.s .nodoor clr doorsfxflag move.l doorsfx(pc),a0 moveq #64,d0 moveq #2,d1 bsr playsfx .nodoor rts changedtxt dc 0 deftxt dc.l 0 defgfxtxt dc.l 0 exec_changetxt ; move (a6)+,d0 ;zone# move.l map_poly(pc),a1 lsl #5,d0 lea 0(a1,d0),a1 ;polygon to change ; move (a6)+,d0 ;new texture move d0,changedtxt move.b d0,zo_t(a1) bra exec_loop exec_opendoor st doorsfxflag addlast doors ;a0=new door ; move (a6)+,d0 ;door # move.l map_poly(pc),a1 lsl #5,d0 lea 0(a1,d0),a1 ;polygon to open! ; ;calc lx add, lz add, rx add, rz add ; move.l a1,do_poly(a0) move.l zo_lx(a1),do_lx(a0) move.l zo_rx(a1),do_rx(a0) clr do_frac(a0) move #$100,do_fracadd(a0) bra exec_loop exec_teleport move.l eventobj(pc),a0 ; move (a6)+,ob_telex(a0) addq #2,a6 move (a6)+,ob_telez(a0) move (a6)+,ob_telerot(a0) ; move finished(pc),d0 or finished2(pc),d0 bne exec_loop ; tst -6(a6) ;teleport? or lock! beq.s .tele ; ;LOCK! cmp.l #playerlogic,ob_logic(a0) bne exec_loop ; move changedtxt(pc),d0 lea textures(pc),a1 move.l 0(a1,d0*4),a1 lea 65<<6+1(a1),a2 lea 10*65+19(a1),a1 movem.l a1-a2,deftxt ; move.l #locklogic,ob_logic(a0) bra exec_loop .tele ; move #2,ob_pixsizeadd(a0) bsr dotelesfx bra exec_loop dotelesfx move.l telesfx(pc),a0 moveq #64,d0 moveq #10,d1 bra playsfx exec_loadobjs ; .loop move (a6)+,d0 bmi .done bsr loadanobj bra.s .loop .done ; bra exec_loop loadanobj ;d0=object#...sys must be permitted ; lea objinfo,a2 mulu #objinfof-objinfo,d0 move.l _ob_shape-objinfo(a2,d0),a2 lea 8(a2),a3 ;filename ; tst.l (a2) bne.s .skip move.l a3,a0 moveq #1,d1 jsr loadfile move.l d0,(a2) beq.s .skip move.l d0,a0 jsr remapanim .skip ; tst.l 4(a2) bne.s .rts move.l a3,a0 .loop tst.b (a3)+ bne.s .loop move.b #'2',-(a3) moveq #1,d1 jsr loadfile clr.b (a3) move.l d0,4(a2) beq.s .rts move.l d0,a0 jsr remapanim ; .rts rts exec_rotpolys ; ;could also be morphpolys depending on bit 0 of flags! ; addlast rotpolys bne.s .ok addq #8,a6 bra exec_loop ; .ok st doorsfxflag movem (a6)+,d0-d3 ;polynum,count,speed,flags ; clr rp_rot(a0) move d1,rp_num(a0) move d2,rp_speed(a0) move d3,rp_flags(a0) move d1,d5 subq #1,d5 move.l map_poly(pc),a2 ;polygons! lsl #5,d0 add d0,a2 move.l a2,rp_first(a0) ; btst #0,d3 beq .rot ; ;OK, prepare for morph ; lsl #5,d1 lea 0(a2,d1),a3 lea rp_vx(a0),a1 ; .loop movem zo_lx(a3),d0-d1 movem zo_lx(a2),d2-d3 sub d2,d0 sub d3,d1 movem d0-d3,(a1) addq #8,a1 ; lea 32(a2),a2 lea 32(a3),a3 dbf d5,.loop ; bra exec_loop ; .rot ;First, calc centre X,Z into d6,d7 ; moveq #0,d6 moveq #0,d7 move.l a2,a1 ; .loop0 movem zo_lx(a1),d0/d2 add.l d0,d6 add.l d2,d7 lea 32(a1),a1 dbf d5,.loop0 ; divu d1,d6 divu d1,d7 movem d6-d7,rp_cx(a0) ; lea rp_lx(a0),a1 subq #1,d1 ; .loop2 movem zo_lx(a2),d0/d2 sub d6,d0 move d0,(a1)+ sub d7,d2 move d2,(a1)+ move.l zo_na(a2),(a1)+ ; lea 32(a2),a2 dbf d1,.loop2 ; bra exec_loop exec_addobj clr.l dummy move (a6)+,d0 ;monster type lea objinfo,a2 mulu #objinfof-objinfo,d0 add.l d0,a2 move.l (a2)+,a3 tst.l (a3) beq.s .ok .no addq #8,a6 bra exec_loop .ok cmp #2,-2(a6) ;player? bcc.s .notp addfirst objects bra.s .bum .notp addlast objects .bum beq.s .no move.l a0,a5 ; move.l a5,(a3) ; move (a6)+,ob_x(a5) move (a6)+,ob_y(a5) move (a6)+,ob_z(a5) move (a6)+,ob_rot(a5) ; lea ob_info(a5),a3 move #(objinfof-objinfo-4)>>1-1,d0 .loop move (a2)+,(a3)+ dbf d0,.loop ; tst ob_blood(a5) ;hi bit of blood=1=invisible! smi d0 ext d0 move d0,ob_invisible(a5) ; bsr calcvecs movem.l d4-d5,ob_xvec(a5) ; move.l ob_shape(a5),a0 move.l 4(a0),ob_chunks(a5) move.l (a0),a0 move.l a0,ob_shape(a5) ; move an_maxw(a0),d0 move d0,ob_rad(a5) mulu d0,d0 move.l d0,ob_radsq(a5) ; clr.l ob_washit(a5) ; bsr rnddelay ; bra exec_loop rnddelay move ob_range(a5),d0 bsr rndn add ob_base(a5),d0 move d0,ob_delay(a5) ; rts seedrnd ;seed number in d0.w ; moveq #54,d1 lea rndtable(pc),a0 ; .loop move d0,(a0)+ mulu #$1efd,d0 add #$dff,d0 dbf d1,.loop ; move.l a0,k_index move.l #rndtable+48,j_index rts rndw ;return rnd number 0...65535 if d0.w ; movem.l a0/a1,-(a7) lea rndtable(pc),a1 move.l j_index(pc),a0 move -(a0),d0 cmp.l a0,a1 bne.s .skip lea rndtable+110(pc),a0 .skip move.l a0,j_index move.l k_index(pc),a0 add -(a0),d0 move d0,(a0) cmp.l a0,a1 bne.s .skip2 lea rndtable+110(pc),a0 .skip2 move.l a0,k_index movem.l (a7)+,a0/a1 rts rndtable ds.w 55 k_index dc.l 0 j_index dc.l 0 rndl bsr rndw move d0,d1 bsr rndw swap d0 move d1,d0 rts rndn move d0,d1 bsr rndw mulu d1,d0 swap d0 rts seedrnd2 ;seed number in d0.w ; moveq #54,d1 lea rndtable2(pc),a0 ; .loop move d0,(a0)+ mulu #$1efd,d0 add #$dff,d0 dbf d1,.loop ; move.l a0,k_index2 move.l #rndtable2+48,j_index2 rts rndw2 ;return rnd number 0...65535 if d0.w ; movem.l a0/a1,-(a7) lea rndtable2(pc),a1 move.l j_index2(pc),a0 move -(a0),d0 cmp.l a0,a1 bne.s .skip lea rndtable2+110(pc),a0 .skip move.l a0,j_index2 move.l k_index2(pc),a0 add -(a0),d0 move d0,(a0) cmp.l a0,a1 bne.s .skip2 lea rndtable2+110(pc),a0 .skip2 move.l a0,k_index2 movem.l (a7)+,a0/a1 rts rndtable2 ds.w 55 k_index2 dc.l 0 j_index2 dc.l 0 rndl2 bsr rndw2 move d0,d1 bsr rndw2 swap d0 move d1,d0 rts rndn2 move d0,d1 bsr rndw2 mulu d1,d0 swap d0 rts calcangle2 ;angle of camera to object in a5 ; move camx(pc),d0 sub ob_x(a5),d0 move camz(pc),d1 sub ob_z(a5),d1 bra.s calcangle_ calcangle ;angle of object a5 to object a0... ; move ob_x(a0),d0 sub ob_x(a5),d0 move ob_z(a0),d1 sub ob_z(a5),d1 ; calcangle_ ;d0.w=x d1.w=y (dest-src)! ; moveq #0,d2 tst d1 bpl.s .hpos moveq #16,d2 neg d1 .hpos tst d0 bpl.s .wpos eor #8,d2 neg d0 .wpos cmp d1,d0 bmi.s .notsteep bne.s .neq move #$2000,d1 bra.s .flow .neq eor #4,d2 exg d1,d0 .notsteep tst d1 bne.s .noflow moveq #0,d1 bra.s .flow .noflow ext.l d0 swap d0 divu d1,d0 lsr #6,d0 and #1022,d0 move .arc(pc,d0),d1 .flow move.l .oct(pc,d2),d0 eor d0,d1 swap d0 add d1,d0 lsr #8,d0 rts ; .oct dc 0,0,$4000,-1,0,-1,$c000,0 dc $8000,-1,$4000,0,$8000,0,$c000,-1 .arc incbin arc.bin calcscene ;a5=player object ; move #$20,$dff09a ; move.l player_(pc),a0 ; move.l ob_palette(a0),palette move ob_thermo(a0),thermo move ob_infra(a0),infra move ob_pixsize(a0),pixsize ; clr.l shapelist bsr calccamera bsr makewalls ; lea objects(pc),a5 ; .loop move.l (a5),a5 tst.l (a5) beq.s .done cmp.l player_(pc),a5 beq.s .loop move.l ob_render(a5),a0 tst ob_invisible(a5) beq.s .notinvs bpl.s .hb move.l #drawobjtrans,shaperender bra.s .rit .hb move.l #drawobjinvs,shaperender .rit jsr (a0) move.l #drawobjnorm,shaperender bra.s .loop .notinvs jsr (a0) bra.s .loop .done ; lea gore(pc),a5 ; .loop2 move.l (a5),a5 tst.l (a5) beq.s .done2 ; movem go_x(a5),d0/d2 moveq #0,d1 move.l go_shape(a5),a0 move #$200,d7 bsr drawshape_q ; bra.s .loop2 ; .done2 move #$8020,$dff09a ; rts blitscene ; move.l player_(pc),a5 ; bclr #7,ob_update(a5) beq.s .skip ; bsr showstats move #2,panelcnt .skip ; rts .noupdate move ob_messtimer(a5),d0 bpl.s .mskip addq #1,d0 beq.s .mdone neg ob_messtimer(a5) move.l ob_window(a5),a0 ;bsr putstrip bsr printmess bra.s .mskip ; .mdone clr ob_messtimer(a5) move.l ob_window(a5),a0 ;bsr putstrip .mskip ; rts drawscene ;a5=player ; bsr castwalls bsr renderwalls ; move roofflag(pc),d0 ble.s .noroof move #-255,d0 sub camy(pc),d0 moveq #1,d1 move miny(pc),d7 move.l roof(pc),a0 bsr flat .noroof ; move floorflag(pc),d0 ble.s .nofloor move camy(pc),d0 neg d0 moveq #-1,d1 move maxy(pc),d7 subq #1,d7 move.l floor(pc),a0 bsr flat .nofloor ; bsr drawshapes ; rts ; bsr drawblood ; move.l player_(pc),a0 move ob_pixsize(a0),d0 bne pixelate rts chatstuff move chatok(pc),d0 beq.s .rts ; move chatoutget(pc),d0 cmp chatoutput(pc),d0 beq.s .noout and #31,d0 lea chatout(pc),a0 move.b 0(a0,d0),d0 ;chat out character! addq #1,chatoutget moveq #1,d1 move d0,-(a7) bsr chatprintout move (a7)+,d0 sub.b #32,d0 ;encode for chat bset #6,d0 bsr serput ; .noout move chatcnt(pc),d0 beq.s .rts ; move chatinget(pc),d0 and #31,d0 lea chatin(pc),a0 move.b 0(a0,d0),d0 addq #1,chatinget subq #1,chatcnt moveq #2,d1 bsr chatprintin ; .rts rts sfxvbint lea sfxs(pc),a1 moveq #3,d3 ; .loop tst fx_status(a1) ble.s .skip ; ;this one queued! gotta play it... ; subq #1,fx_status(a1) bgt.s .skip move.l fx_sfx(a1),a0 bsr playsfxnow ; .skip lea fx_size(a1),a1 dbf d3,.loop ; ;fade out song if nec. ; move fadevol(pc),d0 beq.s .nofade move.l medat(pc),a1 sub #$80,fadevol bgt.s .setvol clr fadevol jmp 12(a1) ;stop song bra.s .nofade ; .setvol move fadevol(pc),d0 lsr #8,d0 jmp 16(a1) ;set volume ; .nofade rts dc.l readmodem joytable dc.l readnull,readnull,readnull,readnull,readnull joytable2 dc.l readjoy1,readjoy0,readkeys,readcd321,readcd320 readjoy ;a0=player move ob_cntrl(a0),d0 bmi.s readmodem ; lea joyx0(pc),a0 lea 0(a0,d0*8),a0 move.l joytable(pc,d0*4),a1 jsr (a1) move linked(pc),d0 bne.s .send rts .send ; ;a0=cntrl block ; bsr encodejoy movem.l d0/a0,-(a7) bsr serput ;movem.l (a7),d0/a0 ;bsr serput movem.l (a7)+,d0/a0 ; .noput lea pbuff(pc),a1 ; move pput(pc),d1 and #127,d1 move.b d0,0(a1,d1) addq #1,pput ; move pget(pc),d1 and #127,d1 move.b 0(a1,d1),d0 addq #1,pget ; bra decodejoy readmodem ; bsr rbfchk bne.s .serhere ; ;OK, do a vwait to allow other machine to catch up! ; move #$20,$dff09c .vw ; ifne debugser col #$f0f endc ; btst #5,$dff01f beq.s .vw ; move #$20,$dff09c bsr chatstuff bra.s readmodem ; .serhere bsr serget lea joyxs(pc),a0 bclr #7,d0 beq.s .djoy and #$ff,d0 move d0,finished moveq #0,d0 ;bra.s .sgot ; .djoy ;movem.l d0/a0,-(a7) ;bsr serwait ;move d0,d1 ;movem.l (a7)+,d0/a0 ;cmp.b d0,d1 ;beq.s .sgot ; ;warn #$fff ;warn #$00f ; .sgot bsr decodejoy move.l (a0)+,joyx move.l (a0),joyb rts escape dc 0 readjoys ;fill in appropriate 'joyxn' block...check escape ; move finished(pc),d0 or finished2(pc),d0 bne.s .rts ; qkey $45 sne escape ; move.l player1(pc),a0 bsr readjoy move gametype(pc),d0 beq.s .rts move.l player2(pc),a0 bra readjoy ; .rts rts lrnd dc 0 vbhandler movem.l d2-d7/a2-a6,-(a7) ; subq #1,(a1)+ ;inc/dec frame counters addq #1,(a1) ; ;this done every frame! bsr chatstuff bsr sfxvbint ; btst #0,framecnt+1 beq exit_vb2 tst paused bne exit_vb2 ; ;OK, movement/animation stuff! ; bsr readjoys bsr doanims bsr dorots bsr dodoors bsr moveblood ; ifne debugser ; ;OK, kludge in a random number! move framecnt(pc),d0 and #126,d0 bne.s .nornd ; bsr rndw move lrnd(pc),d1 move d0,lrnd cmp d0,d1 bne.s .hi warn #$fff warn #$00f .hi lea .rndasc(pc),a0 moveq #3,d1 .loop rol #4,d0 move d0,d2 and #15,d2 add #48,d2 cmp #58,d2 bcs.s .rok addq #7,d2 .rok move.b d2,(a0)+ dbf d1,.loop ; move.l player1(pc),a5 bsr message .rndasc dc.b 'aaaa',0 even ; endc .nornd ; move.l a7,obj_stack lea objects(pc),a5 ; obj_loop move.l (a5),a5 tst.l (a5) beq exit_vb ; move.l ob_logic(a5),a0 jsr (a0) ; ;check collision! ; move ob_collwith(a5),d0 beq.s obj_loop ; move ob_rad(a5),d1 move ob_x(a5),d6 move ob_z(a5),d7 ; lea objects(pc),a0 ; .loop2 move.l (a0),a0 cmp.l a5,a0 bne.s .this ; clr.l ob_washit(a5) ;not hit! can get hit next time... bra obj_loop .this ; move ob_colltype(a0),d2 and d0,d2 beq.s .loop2 ; move ob_rad(a0),d2 add d1,d2 ;r sum ; move ob_x(a0),d3 sub d6,d3 bpl.s .xpl neg d3 .xpl cmp d2,d3 bcc.s .loop2 ; move ob_z(a0),d4 sub d7,d4 bpl.s .ypl neg d4 .ypl cmp d2,d4 bcc.s .loop2 ; mulu d2,d2 mulu d3,d3 mulu d4,d4 add.l d4,d3 cmp.l d2,d3 bcc.s .loop2 ; cmp.l ob_washit(a5),a0 beq obj_loop move.l a0,ob_washit(a5) ; move finished2(pc),d0 bne obj_loop ; move.l #killobject3,killjsr movem.l a0/a5,obj_a0 exg.l a0,a5 ; move ob_damage(a0),d0 move.l ob_hit(a5),a1 sub d0,ob_hitpoints(a5) bgt.s hit_skip move.l ob_die(a5),a1 ; hit_skip jsr (a1) ; hit_ret move.l #killobject2,killjsr movem.l obj_a0(pc),a0/a5 ; move ob_damage(a0),d0 move.l ob_hit(a5),a1 sub d0,ob_hitpoints(a5) bgt.s hit_skip2 move.l ob_die(a5),a1 ; hit_skip2 jsr (a1) bra obj_loop ; exit_vb st doneflag ; exit_vb2 st showflag ; movem.l (a7)+,d2-d7/a2-a6 moveq #0,d0 ; rts rts obj_a0 dc.l 0 obj_a5 dc.l 0 obj_stack dc.l 0 killjsr dc.l killobject2 killobject ; move.l killjsr(pc),a0 jmp (a0) killobject2 move.l a5,a0 killitem objects move.l a0,a5 move.l obj_stack(pc),a7 bra obj_loop killobject3 move.l a5,a0 killitem objects move.l obj_stack(pc),a7 bra hit_ret bloodspeed bsr rndw ext.l d0 lsl.l #2,d0 rts bloodspeed2 bsr rndw ext.l d0 lsl.l #5,d0 rts bloodspeed3 bsr rndw ext.l d0 lsl.l #4,d0 rts makesparksq move.l ob_chunks(a5),a2 ; makesparks ;a2=sparks ; movem.l ob_x(a5),d2-d4 move 2(a2),d5 subq #1,d5 ; .loop addlast objects beq .rts movem.l d2-d4,ob_x(a0) bsr bloodspeed2 move.l d0,ob_xvec(a0) bsr bloodspeed2 move.l d0,ob_yvec(a0) bsr bloodspeed2 move.l d0,ob_zvec(a0) move.l a2,ob_shape(a0) move d5,ob_frame(a0) move.l #sparkslogic,ob_logic(a0) move.l #drawshape_1,ob_render(a0) clr ob_invisible(a0) clr ob_colltype(a0) clr ob_collwith(a0) bsr rndw and #15,d0 add #15,d0 move d0,ob_delay(a0) dbf d5,.loop .rts rts sparkslogic subq #1,ob_delay(a5) ble killobject movem.l ob_x(a5),d0-d2 add.l ob_xvec(a5),d0 add.l ob_yvec(a5),d1 add.l ob_zvec(a5),d2 movem.l d0-d2,ob_x(a5) rts bloodymess ;throw random blood splots everywhere! ; bsr bloodspeed2 add.l ob_x(a5),d0 move.l d0,d2 bsr bloodspeed2 add.l ob_gutsy(a5),d0 move.l d0,d3 bsr bloodspeed2 add.l ob_z(a5),d0 move.l d0,d4 ; .loop addlast blood beq.s .done ; movem.l d2-d4,bl_x(a0) bsr bloodspeed move.l d0,bl_xvec(a0) bsr bloodspeed move.l d0,bl_yvec(a0) bsr bloodspeed move.l d0,bl_zvec(a0) move ob_blood(a5),bl_color(a0) ; dbf d7,.loop ; .done rts bloodymess2 ;throw random blood splots everywhere! ; bsr bloodspeed2 add.l ob_x(a5),d0 move.l d0,d2 bsr bloodspeed2 add.l ob_gutsy(a5),d0 move.l d0,d3 bsr bloodspeed2 add.l ob_z(a5),d0 move.l d0,d4 ; .loop addlast blood beq.s .done ; movem.l d2-d4,bl_x(a0) bsr bloodspeed3 move.l d0,bl_xvec(a0) bsr bloodspeed3 move.l d0,bl_yvec(a0) bsr bloodspeed3 move.l d0,bl_zvec(a0) move ob_blood(a5),bl_color(a0) ; dbf d7,.loop ; .done rts chunklogic move mode(pc),d0 beq chunklogic2 ; add.l #$8000,ob_yvec(a5) move.l ob_yvec(a5),d0 add.l ob_y(a5),d0 blt .skip ; ;OK...hit ground! ; bsr splat addlast gore bne.s .gok ; move.l gore(pc),a0 killitem gore addlast gore beq killobject ; .gok move ob_x(a5),go_x(a0) move ob_z(a5),go_z(a0) move.l ob_shape(a5),a1 move ob_frame(a5),d0 add.l 12(a1,d0*4),a1 move.l a1,go_shape(a0) ; bra killobject ; .skip move.l d0,ob_y(a5) bsr checkvecs beq.s .rts clr.l ob_xvec(a5) clr.l ob_zvec(a5) .rts rts chunklogic2 add.l #$8000,ob_yvec(a5) move.l ob_yvec(a5),d0 add.l d0,ob_y(a5) blt.s .ok ;bsr splat bra killobject .ok movem.l ob_xvec(a5),d0-d1 add.l d0,ob_x(a5) add.l d1,ob_z(a5) rts splat move.l splatsfx(pc),a0 moveq #32,d0 moveq #-1,d1 bra playsfx blowterra move.l robodiesfx(pc),a0 moveq #64,d0 moveq #20,d1 bsr playsfx bra blowquick blowdragon ;same, but messier... ; ;loud! ; move.l diesfx(pc),a0 moveq #64,d0 moveq #50,d1 bsr playsfx move.l diesfx(pc),a0 moveq #64,d0 moveq #50,d1 bsr playsfx move.l robodiesfx(pc),a0 moveq #64,d0 moveq #50,d1 bsr playsfx move.l robodiesfx(pc),a0 moveq #64,d0 moveq #50,d1 bsr playsfx ; moveq #63,d7 bsr bloodymess2 ; move.l ob_chunks(a5),a4 bsr blowchunx bsr blowchunx bsr blowchunx bsr blowchunx ; move.l #dragondead,ob_logic(a5) move.l #rts,ob_render(a5) clr ob_colltype(a5) clr ob_collwith(a5) move #127,ob_delay(a5) rts dragondead subq #1,ob_delay(a5) bgt.s .rts ; move #3,finished ; .rts rts blowdeath cmp.l sucker(pc),a5 bne.s blowobject clr.l sucker clr.l sucking ; blowobject move.l diesfx(pc),a0 moveq #64,d0 moveq #2,d1 bsr playsfx blowquick ; moveq #31,d7 bsr bloodymess2 ; move.l ob_chunks(a5),d0 bne.s .chok ; moveq #15,d7 bsr bloodymess2 bra killobject ; .chok move.l d0,a4 bsr blowchunx bra killobject blowchunx move 2(a4),d7 subq #1,d7 ; .loop addlast objects beq killobject movem.l ob_x(a5),d0-d2 move.l #-64<<16,d1 movem.l d0-d2,ob_x(a0) ; bsr bloodspeed3 move.l d0,ob_xvec(a0) bsr bloodspeed3 sub.l #$40000,d0 move.l d0,ob_yvec(a0) bsr bloodspeed3 move.l d0,ob_zvec(a0) ; clr ob_invisible(a0) clr ob_colltype(a0) clr ob_collwith(a0) move.l #chunklogic,ob_logic(a0) move.l a4,ob_shape(a0) move.l #drawshape_1sc,ob_render(a0) move d7,ob_frame(a0) move ob_scale(a5),ob_scale(a0) ; move an_maxw(a4),d0 move d0,ob_rad(a0) mulu d0,d0 move.l d0,ob_radsq(a0) ; dbf d7,.loop rts hurtdeath ;OK! death head hit! ; ;point at player, and start to suck his soul! ; move.l sucking(pc),d0 bne.s .rts ; bsr pickplayer cmp.l #playerlogic,ob_logic(a0) bne.s .rts ; move.l a0,sucking move.l a5,sucker ; move ob_rot(a5),ob_oldrot(a5) move.l ob_logic(a5),ob_oldlogic(a5) move.l #deathsuck,ob_logic(a5) move.l #rts,ob_hit(a5) move #64,ob_delay(a5) bra.s deathsuck ; .rts rts deathsuck ;death head sucking out a players soul! ; bsr deathbounce bsr deathanim subq #1,ob_delay(a5) bgt.s .more move ob_oldrot(a5),ob_rot(a5) move.l ob_oldlogic(a5),ob_logic(a5) move.l #hurtdeath,ob_hit(a5) clr.l sucker clr.l sucking bra rnddelay ; .more move.l sucking(pc),a0 move.l a0,a2 bsr calcangle ;point at player! move d0,ob_rot(a5) ; add #128,d0 and #255,d0 move.l camrots(pc),a3 lea 0(a3,d0*8),a3 ; move.l a3,suckangle ; ;calc x/z vecs ; moveq #3,d7 bsr addsoul ; .rts rts sucker dc.l 0 sucking dc.l 0 suckangle dc.l 0 addsoul ;d7 times! ; addlast blood beq .rts ; move 2(a3),d2 ext.l d2 lsl.l #5,d2 neg.l d2 move 6(a3),d3 ext.l d3 lsl.l #5,d3 ; move.l d2,bl_xvec(a0) move.l a5,bl_yvec(a0) move.l d3,bl_zvec(a0) ; swap d2 swap d3 add d2,d2 add d3,d3 add ob_x(a2),d2 add ob_z(a2),d3 ; bsr rndw and #63,d0 sub #32,d0 add d2,d0 move d0,bl_x(a0) ; bsr rndw and #63,d0 sub #32,d0 add #110,d0 move d0,bl_y(a0) ;>0= funny blood! ; bsr rndw and #63,d0 sub #32,d0 add d3,d0 move d0,bl_z(a0) ; bsr rndw and #1,d0 move soulcols(pc,d0*2),bl_color(a0) ; dbf d7,addsoul ; .rts rts soulcols dc $0ff,$0f0 hurtghoul moveq #31,d7 bsr bloodymess rts hurtterra move.l a0,-(a7) move.l shootsfx2(pc),a0 moveq #64,d0 moveq #2,d1 bsr playsfx move.l (a7)+,a0 bra.s hurtobject hurtngrunt move.l a0,-(a7) bsr rndw and #3,d0 cmp lastgrunt(pc),d0 bne.s .new addq #1,d0 and #3,d0 .new move d0,lastgrunt lea grunttable(pc),a0 move.l 0(a0,d0*4),a0 move.l (a0),a0 moveq #64,d0 moveq #1,d1 bsr playsfx move.l (a7)+,a0 ; hurtobject move ob_colltype(a0),d0 and #24,d0 bne.s .rts ; moveq #23,d7 bsr bloodymess move ob_hurtpause(a5),ob_hurtwait(a5) beq .rts ; move #4,ob_frame(a5) move.l ob_logic(a5),ob_oldlogic2(a5) move.l ob_hit(a5),ob_oldhit(a5) move.l #pauselogic2,ob_logic(a5) move.l #rts,ob_hit(a5) ; .rts rts lizhurt move.l a0,-(a7) move.l lizhitsfx(pc),a0 moveq #64,d0 moveq #1,d1 bsr playsfx move.l (a7)+,a0 bra hurtobject trollhurt move.l a0,-(a7) move.l trollhitsfx(pc),a0 moveq #64,d0 moveq #1,d1 bsr playsfx move.l (a7)+,a0 bra hurtobject pauselogic2 subq #1,ob_hurtwait(a5) bgt.s .rts clr ob_frame(a5) move.l ob_oldlogic2(a5),ob_logic(a5) move.l ob_oldhit(a5),ob_hit(a5) .rts rts pauselogic subq #1,ob_delay(a5) bgt.s .skip ; bsr rnddelay move.l ob_oldlogic(a5),ob_logic(a5) ; ;if in front of player, continue on old course... ; bsr pickcalc ; move ob_rot(a0),d1 and #255,d1 sub d0,d1 bpl.s .pl neg d1 .pl cmp #64,d1 bcs.s .skip cmp #192,d1 bcc.s .skip ; .useold move ob_oldrot(a5),ob_rot(a5) bsr calcvecs ; .skip rts shoot ; ;fire off a bullet... ; ;d2 : colltype ;d3 : collwith ;d4 : hitpoints ;d5 : damage ;d6 : speed ;a2=bullet shape ;a3=sparks shape ; addfirst objects beq .rts ; move ob_bouncecnt(a5),ob_bouncecnt(a0) move ob_x(a5),ob_x(a0) move ob_y(a5),d0 add ob_firey(a5),d0 move d0,ob_y(a0) move ob_z(a5),ob_z(a0) move.l #firelogic,ob_logic(a0) move.l #drawshape_1,ob_render(a0) move.l #rts,ob_hit(a0) move.l #killobject,ob_die(a0) move d2,ob_colltype(a0) move d3,ob_collwith(a0) move d4,ob_hitpoints(a0) move d5,ob_damage(a0) move d6,ob_movspeed(a0) move.l a2,ob_shape(a0) clr ob_invisible(a0) clr ob_frame(a0) move.l a3,ob_chunks(a0) ; move ob_rot(a5),d0 and #255,d0 move.l camrots(pc),a1 lea 0(a1,d0*8),a1 ; move 2(a1),d0 move d0,ob_nxvec(a0) neg d0 muls d6,d0 add.l d0,d0 move 6(a1),d1 move d1,ob_nzvec(a0) muls d6,d1 add.l d1,d1 ; movem.l d0-d1,ob_xvec(a0) ;add.l d0,ob_x(a0) ;add.l d1,ob_z(a0) ; move #32,ob_rad(a0) move.l #32*32,ob_radsq(a0) ; .rts rts pickcalc ;pick a player and calculate angle to player! ; bsr pickplayer bsr calcangle tst ob_invisible(a0) beq.s .rts move d0,-(a7) bsr rndw and #63,d0 sub #32,d0 add (a7)+,d0 and #255,d0 .rts rts fire1 bsr pickcalc ; ;random noise for inaccuracy! ; move d0,-(a7) bsr rndw and #31,d0 sub #16,d0 add (a7)+,d0 and #255,d0 ; move d0,ob_rot(a5) bsr calcvecs move #7,ob_delay(a5) move.l ob_logic(a5),ob_oldlogic(a5) move.l #pauselogic,ob_logic(a5) clr.l ob_frame(a5) ; moveq #4,d2 ;colltype moveq #0,d3 ;collwith moveq #1,d4 ;hitpoints moveq #1,d5 ;damage moveq #20,d6 ;speed moveq #0,d7 ;acceleration! lea bullet1,a2 lea sparks1,a3 ; bsr shoot ; rts pickplayer ;pick nearest player ; move.l player1(pc),a0 move gametype(pc),d0 beq.s .rts move.l player2(pc),a1 move linked(pc),d0 bpl.s .nosw exg a0,a1 .nosw ; tst ob_hitpoints(a0) beq .sw tst ob_hitpoints(a1) beq.s .rts ; move ob_x(a5),d0 sub ob_x(a0),d0 muls d0,d0 move ob_z(a5),d1 sub ob_z(a0),d1 muls d1,d1 add.l d1,d0 ;dist to player a0 ; move ob_x(a5),d1 sub ob_x(a1),d1 muls d1,d1 move ob_z(a5),d2 sub ob_z(a1),d2 muls d2,d2 add.l d2,d1 ;dist to player a1 ; cmp.l d1,d0 bcs.s .rts ; .sw move.l a1,a0 ; .rts rts checkcoll ;check for collision between a5, and a0 ; move ob_rad(a5),d1 move ob_rad(a0),d2 add d1,d2 ;r sum ; move ob_x(a0),d3 sub ob_x(a5),d3 bpl.s .xpl neg d3 .xpl cmp d2,d3 bcc.s .no ; move ob_z(a0),d4 sub ob_z(a5),d4 bpl.s .ypl neg d4 .ypl cmp d2,d4 bcc.s .no ; mulu d2,d2 mulu d3,d3 mulu d4,d4 add.l d4,d3 cmp.l d2,d3 bcc.s .no ; moveq #-1,d0 rts ; .no moveq #0,d0 rts baldycharge ; ;baldy charging at player! ; bsr checkvecs beq baldy_skip ; baldy_tonorm move.l ob_movspeed(a5),d0 lsr.l #2,d0 move.l d0,ob_movspeed(a5) ; move.l ob_framespeed(a5),d0 lsr.l #2,d0 move.l d0,ob_framespeed(a5) ; move.l ob_oldlogic(a5),ob_logic(a5) bsr rnddelay ; bra monsterfix ; baldy_skip ;close to player? start throwing punches around! ; bsr pickcalc ; sub ob_rot(a5),d0 cmp #32,d0 bgt baldy_tonorm cmp #-32,d0 blt baldy_tonorm ; move.l a0,ob_washit(a5) bsr checkcoll beq monsternew ;no collisions! ; ;go into punch mode! ; move.l #baldypunch,ob_logic(a5) move ob_punchrate(a5),ob_delay(a5) clr.l ob_frame(a5) rts baldypunch ; bsr pickplayer bsr checkcoll bne.s .doit ; clr.l ob_frame(a5) bra baldy_tonorm ; .doit subq #1,ob_delay(a5) ble.s .punch rts .punch move ob_punchrate(a5),ob_delay(a5) moveq #0,d0 ;stand frame cmp ob_frame(a5),d0 bne .skip ; clr.l ob_washit(a5) ;punch! bsr calcangle move d0,ob_rot(a5) moveq #5,d0 .skip move d0,ob_frame(a5) rts calcbangle bsr calcangle tst ob_invisible(a0) beq.s .notinv ; ;invisible, add some randomeness! ; move d0,-(a7) bsr rndw and #127,d0 sub #64,d0 add (a7)+,d0 and #255,d0 ; .notinv move d0,ob_rot(a5) rts trolllogic move ob_rad(a5),d0 mulu #$a000,d0 swap d0 move d0,ob_rad(a5) mulu d0,d0 move.l d0,ob_radsq(a5) move.l #trolllogic2,ob_logic(a5) ; trolllogic2 subq #1,ob_delay(a5) bgt monstermove ;charge? ; bsr pickcalc ;pic player in a0! move ob_x(a5),d0 sub ob_x(a0),d0 muls d0,d0 move ob_z(a5),d1 sub ob_z(a0),d1 muls d1,d1 add.l d1,d0 cmp.l #320*320,d0 bcc bl2 ; move.l trollsfx(pc),a0 moveq #64,d0 moveq #5,d1 bsr playsfx ; bra bl2 lizardlogic ; subq #1,ob_delay(a5) bgt monstermove ;charge? ; bsr pickcalc ;pic player in a0! move ob_x(a5),d0 sub ob_x(a0),d0 muls d0,d0 move ob_z(a5),d1 sub ob_z(a0),d1 muls d1,d1 add.l d1,d0 cmp.l #256*256,d0 bcc.s bl2 ; move.l lizsfx(pc),a0 moveq #32,d0 moveq #5,d1 bsr playsfx ; bra bl2 baldylogic ; ;OK, what can baldy do... ; ;how about, walk around similar to the marine, but randomly ;charge at you? ; ;then, if he's close enough, he throws a punch! ; subq #1,ob_delay(a5) bgt monstermove ;charge? ; bl2 bsr pickcalc move d0,ob_rot(a5) ; move.l ob_movspeed(a5),d0 lsl.l #2,d0 move.l d0,ob_movspeed(a5) move.l ob_framespeed(a5),d0 lsl.l #2,d0 move.l d0,ob_framespeed(a5) ; bsr calcvecs move.l ob_logic(a5),ob_oldlogic(a5) move.l #baldycharge,ob_logic(a5) ; rts terralogic ; move ob_rot(a5),ob_oldrot(a5) subq #1,ob_delay(a5) ble .fire ; move ob_delay(a5),d0 and #31,d0 bne monstermove ; move.l robotsfx(pc),a0 moveq #64,d0 moveq #10,d1 bsr playsfx bra monstermove ; .fire ;OK, terra goes apeshit! stand there firing off at player! ;use punchrate as firedelay! ; clr ob_frame(a5) move #1,ob_delay(a5) move ob_firecnt(a5),ob_delay2(a5) move.l #terralogic2,ob_logic(a5) rts terralogic2 ; subq #1,ob_delay(a5) bgt.s .rts ; move ob_firerate(a5),ob_delay(a5) ; ;OK, to to face player and fire away! ; bsr pickcalc move d0,ob_rot(a5) bsr calcvecs ; moveq #4,d2 ;colltype moveq #0,d3 ;collwith moveq #1,d4 ;hitpoints moveq #3,d5 ;damage moveq #16,d6 ;speed moveq #0,d7 ;acceleration! lea bullet4,a2 lea sparks4,a3 ; bsr shoot ; move.l shootsfx3(pc),a0 moveq #32,d0 moveq #5,d1 bsr playsfx ; subq #1,ob_delay2(a5) bgt.s .rts ; bsr rnddelay move.l #terralogic,ob_logic(a5) ; .rts rts ghoullogic ; addq #8,ob_bounce(a5) move ob_bounce(a5),d0 move.l camrots(pc),a0 and #255,d0 move 0(a0,d0*8),d0 ext.l d0 lsl.l #5,d0 ;+/- 32 swap d0 add #-32,d0 move d0,ob_y(a5) ; bsr pickcalc move d0,ob_rot(a5) ; subq #1,ob_delay(a5) bgt.s .skip ; move #1,ob_frame(a5) move.l #$2000,ob_framespeed(a5) moveq #4,d2 ;colltype moveq #0,d3 ;collwith moveq #1,d4 ;hitpoints moveq #3,d5 ;damage moveq #20,d6 ;speed moveq #0,d7 ;acceleration! lea bullet2,a2 lea sparks2,a3 ; bsr shoot bsr rnddelay ; .skip ;OK, ghoul moves around ignoring walls! ; ;he's pointed at player...how about randomly selected to make ;this his new movement vector? ; bsr rndw move ob_movspeed(a5),d1 lsl #8,d1 cmp d1,d0 bcc.s .no ; bsr calcvecs ; move.l ghoulsfx(pc),a0 moveq #32,d0 moveq #-5,d1 bsr playsfx ; .no movem.l ob_xvec(a5),d0-d1 add.l d0,ob_x(a5) add.l d1,ob_z(a5) ; move.l ob_framespeed(a5),d0 beq.s .rts add.l d0,ob_frame(a5) cmp #3,ob_frame(a5) bcs.s .rts ; clr ob_frame(a5) clr.l ob_framespeed(a5) ; .rts rts demonpause move ob_delay(a5),d0 move d0,d1 and #4,d0 sne d0 ext d0 and #5,d0 ;0 or 5 move d0,ob_frame(a5) ; and #7,d1 ;do a fire? cmp #7,d1 bne.s .nofire ; move ob_delay(a5),d0 lsr #3,d0 mulu #18,d0 lea wtable(pc),a0 moveq #4,d2 ;colltype moveq #0,d3 ;collwith movem 0(a0,d0),d4-d6 ;hits,dam,speed mulu #$c000,d5 swap d5 ;3/4 damage! moveq #0,d7 ;acc movem.l 6(a0,d0),a2-a3 ;bullets/sparks move.l 14(a0,d0),-(a7) ;sfx! ; bsr shoot ; move.l (a7)+,a0 move.l (a0),a0 moveq #32,d0 moveq #0,d1 bsr playsfx ; .nofire subq #1,ob_delay(a5) bgt.s .rts ; bsr rnddelay move.l ob_oldlogic(a5),ob_logic(a5) ; .rts rts demonlogic ; move ob_rot(a5),ob_oldrot(a5) subq #1,ob_delay(a5) bgt monstermove ; bsr pickcalc ; move d0,ob_rot(a5) bsr calcvecs move #5<<3-1,ob_delay(a5) move.l ob_logic(a5),ob_oldlogic(a5) move.l #demonpause,ob_logic(a5) ; rts phantomlogic ; move ob_rot(a5),ob_oldrot(a5) subq #1,ob_delay(a5) bgt monstermove ; bsr pickcalc ; move d0,ob_rot(a5) bsr calcvecs move #7,ob_delay(a5) move.l ob_logic(a5),ob_oldlogic(a5) move.l #pauselogic,ob_logic(a5) move #5,ob_frame(a5) ; moveq #4,d2 ;colltype moveq #0,d3 ;collwith moveq #1,d4 ;hitpoints moveq #3,d5 ;damage moveq #20,d6 ;speed moveq #0,d7 ;acceleration! lea bullet3,a2 lea sparks3,a3 ; bra shoot deathbounce addq #4,ob_bounce(a5) move ob_bounce(a5),d0 move.l camrots(pc),a0 and #255,d0 move 0(a0,d0*8),d0 ext.l d0 lsl.l #5,d0 ;+/- 64 swap d0 add #-48,d0 move d0,ob_y(a5) rts deathheadlogic ; ;cruises around rotating at speed ob_delay ; bsr deathbounce ; bsr checkvecs bne.s .hit ; ;charge player? ; bsr pickcalc ;find angle to player move ob_rot(a5),d1 and #255,d1 sub d0,d1 ;am I near? bpl.s .ansk neg d1 .ansk cmp #16,d1 bcc.s .notnear ; ;OK! chargaroony! ; move d0,ob_rot(a5) move.l #deathcharge,ob_logic(a5) bra calcvecs .hit add #128,ob_rot(a5) bsr rnddelay .notnear move ob_delay(a5),d0 add d0,ob_rot(a5) bsr calcvecs rts deathanim move.l ob_framespeed(a5),d0 add.l d0,ob_frame(a5) cmp.l #$8000,ob_frame(a5) blt.s .fix cmp.l #$28000,ob_frame(a5) blt.s .fok .fix neg.l d0 add.l d0,ob_frame(a5) move.l d0,ob_framespeed(a5) ; .fok rts deathcharge bsr deathbounce bsr deathanim ; bsr pickcalc move ob_rot(a5),d1 and #255,d1 sub d1,d0 ;am I near? bpl.s .ansk neg d0 .ansk cmp #128,d0 bcc.s .hit bsr checkvecs bne.s .hit2 rts .hit2 add #128,ob_rot(a5) .hit move.l #deathheadlogic,ob_logic(a5) move.l #$8000,ob_frame(a5) bra rnddelay monsterlogic ; move ob_rot(a5),ob_oldrot(a5) ;monster cruising around minding his own business... ; subq #1,ob_delay(a5) ble fire1 ; monstermove bsr checkvecs beq.s monsternew ; ;OK, try 90/-90 degrees... ; monsterfix bsr rndw moveq #64,d1 tst d0 bpl.s .umk moveq #-64,d1 .umk add d1,ob_rot(a5) bsr calcvecs bsr checkvecs beq.s monsternew ; add #128,ob_rot(a5) bsr calcvecs bsr checkvecs beq.s monsternew ; move ob_oldrot(a5),d0 add #128,d0 move d0,ob_rot(a5) ; bsr calcvecs bsr checkvecs monsternew ; move.l ob_framespeed(a5),d0 add.l d0,ob_frame(a5) and #3,ob_frame(a5) rts dragonfire ;dragon fires at you! ; ;d2 : colltype ;d3 : collwith ;d4 : hitpoints ;d5 : damage ;d6 : speed ;a2=bullet shape ;a3=sparks shape ; subq #1,ob_delay(a5) bpl .rts move ob_delay(a5),d0 cmp #-16*8,d0 bgt.s .try move #47,ob_delay(a5) rts .try and #7,d0 bne .rts ; .fire moveq #0,d2 ;colltype moveq #24+3,d3 ;collwith - p1/p2/bullets moveq #1,d4 ;hitpoints moveq #3,d5 ;damage moveq #16,d6 ;speed lea bullet5,a2 lea sparks5,a3 ; addlast objects beq .rts ; move ob_bouncecnt(a5),ob_bouncecnt(a0) move ob_x(a5),ob_x(a0) move ob_y(a5),d0 add ob_firey(a5),d0 move d0,ob_y(a0) move ob_z(a5),ob_z(a0) move.l #homeinlogic,ob_logic(a0) move.l #drawshape_1,ob_render(a0) move.l #makesparksq,ob_hit(a0) move.l #blowdb,ob_die(a0) move d2,ob_colltype(a0) move d3,ob_collwith(a0) move d4,ob_hitpoints(a0) move d5,ob_damage(a0) move d6,ob_movspeed(a0) move.l a2,ob_shape(a0) clr ob_invisible(a0) clr ob_frame(a0) move.l a3,ob_chunks(a0) ; move ob_rot(a5),d0 and #255,d0 move.l camrots(pc),a1 lea 0(a1,d0*8),a1 ; move 2(a1),d0 move d0,ob_nxvec(a0) neg d0 muls d6,d0 add.l d0,d0 move 6(a1),d1 move d1,ob_nzvec(a0) muls d6,d1 add.l d1,d1 ; movem.l d0-d1,ob_xvec(a0) ; move #32,ob_rad(a0) move.l #32*32,ob_radsq(a0) ; .rts rts blowdb bsr makesparksq bra killobject homeinlogic bsr checkvecs bne.s blowdb bsr pickcalc ;find angle to player! move.l camrots(pc),a0 lea 0(a0,d0*8),a0 move 2(a0),d4 ;x acc. neg d4 ext.l d4 lsl.l #2,d4 move 6(a0),d5 ;z acc. ext.l d5 lsl.l #2,d5 ; add.l ob_xvec(a5),d4 move.l d4,d0 bpl.s .pl1 neg.l d0 .pl1 cmp.l #$200000,d0 ;max speed bcc.s .sk1 move.l d4,ob_xvec(a5) ; .sk1 add.l ob_zvec(a5),d5 move.l d5,d0 bpl.s .pl2 neg.l d0 .pl2 cmp.l #$200000,d0 bcc.s .sk2 move.l d5,ob_zvec(a5) .sk2 ; bra putfire dragonanim move.l ob_framespeed(a5),d0 add.l d0,ob_frame(a5) and #3,ob_frame(a5) rts getobrot move ob_rotspeed(a5),d0 bne.s .addr ; ;OK, randomly left/rite! ; bsr rndw and #1,d0 bne.s .addr2 moveq #-1,d0 ; .addr2 lsl #2,d0 move d0,ob_rotspeed(a5) ; .addr rts dragonlogic ;OK! end of game baddy! ; ;how about cruising around in a circle a-la ;deathhead! ; bsr dragonanim bsr dragonfire bsr checkvecs beq.s .nohit ; ;OK, dragon has hit a wall...rot him around till he's clear! ; bsr getobrot lsl #2,d0 add d0,ob_rot(a5) bra calcvecs .nohit ; bsr pickcalc move ob_rot(a5),d1 and #255,d1 sub d0,d1 ;am I near? bpl.s .ansk neg d1 .ansk moveq #6,d0 tst ob_rotspeed(a5) bne.s .sh moveq #24,d0 .sh cmp d0,d1 bcs.s .near ; ;not pointed at player! bsr getobrot add d0,ob_rot(a5) bra calcvecs ; .near tst ob_rotspeed(a5) beq.s .near2 clr ob_rotspeed(a5) ;towards player! ; move.l dragonsfx(pc),a0 moveq #64,d0 moveq #20,d1 bsr playsfx ; .near2 rts weaponlogic ; move.l camrots(pc),a0 ; addq #8,ob_movspeed(a5) move ob_movspeed(a5),d0 and #127,d0 move 2(a0,d0*8),d0 asr #8,d0 move d0,ob_y(a5) ; move.l ob_framespeed(a5),d0 add.l d0,ob_frame(a5) move ob_frame(a5),d0 move.l ob_shape(a5),a0 cmp 2(a0),d0 bcs.s .skip clr ob_frame(a5) .skip ; subq #1,ob_delay(a5) bgt .rts bsr rnddelay ; addlast objects beq.s .rts ; movem.l ob_x(a5),d2-d4 movem.l d2-d4,ob_x(a0) bsr bloodspeed2 move.l d0,ob_xvec(a0) bsr bloodspeed2 move.l d0,ob_yvec(a0) bsr bloodspeed2 move.l d0,ob_zvec(a0) move.l ob_chunks(a5),a2 move.l a2,ob_shape(a0) move 2(a2),d0 bsr rndn move d0,ob_frame(a0) move.l #sparkslogic,ob_logic(a0) move.l #drawshape_1,ob_render(a0) clr ob_invisible(a0) clr ob_colltype(a0) clr ob_collwith(a0) bsr rndw and #15,d0 add #15,d0 move d0,ob_delay(a0) .rts rts calcvecs move ob_rot(a5),d0 ; and #255,d0 move.l camrots(pc),a0 lea 0(a0,d0*8),a0 ; move ob_movspeed(a5),d4 move d4,d5 muls 2(a0),d4 add.l d4,d4 neg.l d4 move.l d4,ob_xvec(a5) muls 6(a0),d5 add.l d5,d5 move.l d5,ob_zvec(a5) rts checkvecs movem.l ob_xvec(a5),d6-d7 add.l ob_x(a5),d6 add.l ob_z(a5),d7 bsr checknewslow ;ok to stand here? beq.s .ok ; move.l ob_x(a5),d6 move.l ob_z(a5),d7 bsr checknewslow bne.s .fix moveq #-1,d1 ;use old pos, and report hit! rts ; .fix bsr adjustposq ;fixup! moveq #-1,d1 ; .ok move.l d6,ob_x(a5) move.l d7,ob_z(a5) tst d1 rts playerdead bsr getcntrl ; subq #1,ob_delay(a5) bgt.s .rts ; cmp #2,gametype bne.s .notcom ; ;combat game! ; move #4,finished2 move #1,ob_pixsizeadd(a5) move.l #rts,ob_logic(a5) bsr getother move #1,ob_pixsizeadd(a0) .rts rts ; .notcom ; tst ob_lives(a5) beq.s .dead move.l #waitrestart,ob_logic(a5) rts ; .dead move.l #rts,ob_logic(a5) tst gametype bne.s .not1p .allover move #2,finished rts ; .not1p ;OK, I'm all out of lives...what about other guy... bsr getother tst ob_lives(a0) beq.s .allover rts waitrestart bsr getcntrl ; bsr checkfireb beq.s .rts ; move ob_weapon(a5),-(a7) ; lea p1x(pc),a0 lea player1_+4,a1 cmp.l player1,a5 beq.s .got lea p2x(pc),a0 lea player2_+4,a1 .got lea ob_info(a5),a2 move #(objinfof-objinfo-4)>>1-1,d0 .loop move (a1)+,(a2)+ dbf d0,.loop ; clr.l ob_colltype(a5) move #75,ob_delay(a5) move.l #playerlogic0,ob_logic(a5) ; move (a0)+,ob_x(a5) move (a0)+,ob_z(a5) move (a0)+,ob_rot(a5) ; move (a7)+,ob_weapon(a5) clr ob_bounce(a5) ; move.l ob_shape(a5),a0 move.l 4(a0),ob_chunks(a5) move.l (a0),a0 move.l a0,ob_shape(a5) ; bsr resetplayer move #-1,ob_update(a5) st ob_lastbut(a5) ; .rts rts playerdeath bsr getcntrl ; addq #4,ob_rot(a5) addq #4,ob_eyey(a5) cmp #-32,ob_eyey(a5) blt .rts ; move #-32,ob_eyey(a5) move.l #playerdead,ob_logic(a5) move #63,ob_delay(a5) ; cmp #2,gametype bne.s .notcom ; ;death in combat game! ; bsr getother ; .win move.l a5,-(a7) ; move.l a0,a5 clr ob_collwith(a5) clr ob_colltype(a5) bsr message dc.b 'winner!',0 even ; move.l (a7)+,a5 subq #1,ob_lives(a5) move #-1,ob_update(a5) ;refresh 'lives' bsr message dc.b 'loser!',0 even ; rts .notcom ; subq #1,ob_lives(a5) move #-1,ob_update(a5) move gametype(pc),d0 beq.s .one ; ;2 player game! ; bsr getother tst ob_lives(a5) beq.s .hmm move ob_lives(a5),ob_lives(a0) move #-1,ob_update(a0) rts .hmm tst ob_lives(a0) beq.s .go2 rts .one tst ob_lives(a5) beq.s .go rts .go2 move.l a5,-(a7) move.l a0,a5 bsr message dc.b 'game over',0 even move.l (a7)+,a5 .go bsr message dc.b 'game over',0 even .rts rts getother ;get other player from a5! ; move.l player1(pc),a0 cmp.l a0,a5 bne.s .rts move.l player2(pc),a0 .rts rts redpal ;move.l #palettesr,ob_palette(a5) move #2,ob_paltimer(a5) rts playerhit tst ob_damage(a0) beq.s .rts st ob_update(a5) bsr redpal .rts rts playerdie bsr redpal clr ob_hitpoints(a5) st ob_update(a5) move.l #playerdeath,ob_logic(a5) clr ob_colltype(a5) clr ob_collwith(a5) rts inchealth ;inc health of a5 ; addq #5,ob_hitpoints(a5) cmp #25,ob_hitpoints(a5) ble.s .skip move #25,ob_hitpoints(a5) .skip st ob_update(a5) bsr message dc.b 'health bonus!',0 even rts healthgot bsr playtsfx move.l a5,-(a7) move.l a0,a5 bsr inchealth move.l (a7)+,a5 bra killobject playtsfx move.l a0,-(a7) move.l tokensfx(pc),a0 moveq #64,d0 moveq #0,d1 bsr playsfx move.l (a7)+,a0 rts weapongot bsr playtsfx move.l a5,-(a7) move ob_weapon(a5),d0 ;weapon #! move.l a0,a5 bsr weapond0 move.l (a7)+,a5 bra killobject weapond0 st ob_update(a5) cmp ob_weapon(a5),d0 bne .new ; subq.b #1,ob_reload(a5) beq.s .skip cmp.b #1,ob_reload(a5) bne.s .notfull bsr message dc.b 'weapon boosted to full!',0 even rts ; .notfull bsr message dc.b 'weapon boost!',0 even rts ; .skip addq.b #1,ob_reload(a5) add #250,ob_mega(a5) cmp #ok,ob_mega(a5) bcs.s .mwb ; bsr message dc.b 'ultra mega overkill!!!',0 even rts ; .mwb bsr message dc.b 'mega weapon boost!',0 even rts ; .new move d0,ob_weapon(a5) move.b #ireload,ob_reload(a5) st ob_update(a5) bsr message dc.b 'new weapon!',0 even rts invisigot bsr playtsfx move.l a5,-(a7) move.l a0,a5 add #1500,ob_invisible(a5) bsr message dc.b 'invisibility!',0 even move.l (a7)+,a5 bra killobject invincgot bsr playtsfx tst ob_hyper(a0) bne.s .rts move.l a5,-(a7) move.l a0,a5 ; move #-$200,ob_hyper(a5) bsr message dc.b 'hyper!',0 even ; move.l (a7)+,a5 bra killobject ; .rts rts bouncylogic addq #1,ob_delay(a5) move ob_delay(a5),d0 lsr #1,d0 and #3,d0 move .bnc(pc,d0*2),ob_frame(a5) rts .bnc dc 3,4,3,5 bouncygot bsr playtsfx cmp #3,ob_bouncecnt(a0) bcc.s .rts addq #1,ob_bouncecnt(a0) move.l a5,-(a7) move.l a0,a5 bsr message dc.b 'bouncy bullets!',0 even move.l (a7)+,a5 bra killobject .rts rts thermogot bsr playtsfx add #1500,ob_thermo(a0) move.l a5,-(a7) move.l a0,a5 bsr message dc.b 'got the thermo glasses!',0 even move.l (a7)+,a5 bra killobject maxsize equ $280 playertimers tst ob_mega(a5) beq.s .nomega subq #1,ob_mega(a5) bne.s .nomout bsr message dc.b 'mega weapon out...',0 even .nomout move ob_mega(a5),d0 and #31,d0 bne.s .nomega st ob_update(a5) ; .nomega tst ob_thermo(a5) beq.s .noth subq #1,ob_thermo(a5) bne.s .noth bsr message dc.b 'thermo glasses out...',0 even ; .noth tst ob_messtimer(a5) ble.s .notm subq #2,ob_messtimer(a5) .notm ; tst ob_invisible(a5) beq.s .noti subq #1,ob_invisible(a5) bne.s .noti bsr message dc.b 'invisibility out...',0 even .noti ; tst ob_paltimer(a5) beq.s .notp subq #1,ob_paltimer(a5) bne.s .notp move.l #palettes,ob_palette(a5) .notp ; move ob_pixsizeadd(a5),d0 beq.s .notpix add d0,ob_pixsize(a5) bne.s .pixnz ; clr ob_pixsizeadd(a5) bra.s .notpix ; .pixnz cmp #24,ob_pixsize(a5) bne.s .notpix ; move finished2(pc),finished bne.s .notpix ; move ob_telex(a5),ob_x(a5) move ob_telez(a5),ob_z(a5) move ob_telerot(a5),ob_rot(a5) neg ob_pixsizeadd(a5) .notpix ; move ob_hyper(a5),d0 beq.s .nothyper bpl.s .hplus ; ;hyper is minus! growing... ; subq #4,d0 move d0,d1 neg d1 cmp #maxsize,d1 bne.s .hdone move #750<<2+maxsize,d0 bra.s .hdone ; .hplus subq #4,d0 cmp #maxsize,d0 bhi.s .hdone2 bne.s .noteq bsr message dc.b 'hyper out...',0 even move #maxsize,d0 .noteq move d0,d1 cmp #$200,d0 bne.s .hdone moveq #0,d0 ; .hdone move d1,ob_scale(a5) ; move d1,d2 mulu #((pl_eyey<<16)/$200),d2 swap d2 neg d2 move d2,ob_eyey(a5) ; move d1,d2 mulu #((pl_firey<<16)/$200),d2 swap d2 neg d2 move d2,ob_firey(a5) ; move d1,d2 mulu #((pl_gutsy<<16)/$200),d2 swap d2 neg d2 move d2,ob_gutsy(a5) ; .hdone2 move d0,ob_hyper(a5) .nothyper ; rts footstep move.l d0,-(a7) move.l footstepsfx(pc),a0 moveq #16,d0 moveq #0,d1 bsr playsfx move.l (a7)+,d0 rts pbuff ds.b 128 ;player controls to use! pput dc 0 ;put new cntrl here pget dc 0 ;read this for actual getcntrl move ob_cntrl(a5),d0 lea joyx0(pc),a0 move.l 0(a0,d0*8),joyx move.l 4(a0,d0*8),joyb rts maxrotsp equ $40000 rotacc equ $20000 rotrevacc equ $40000 rotsetacc equ $20000 rotplayer ;return rot in d0, leave a0 ; move joys(pc),d0 ;strafing? bne.s .norot move joyx(pc),d0 beq.s .norot ; move.l #rotacc,d1 ;rotacc move ob_rotspeed(a5),d2 beq.s .useacc eor d2,d0 bpl.s .useacc move.l #rotrevacc,d1 ;fast rev! .useacc move joyx(pc),d0 bpl.s .plus neg.l d1 .plus add.l d1,ob_rotspeed(a5) cmp.l #maxrotsp,ob_rotspeed(a5) bgt.s .fixaccpl cmp.l #-maxrotsp,ob_rotspeed(a5) bge.s .addrot move.l #-maxrotsp,ob_rotspeed(a5) bra.s .addrot .fixaccpl move.l #maxrotsp,ob_rotspeed(a5) bra.s .addrot ; .norot tst.l ob_rotspeed(a5) beq.s .skip bpl.s .orpl add.l #rotsetacc,ob_rotspeed(a5) ble.s .addrot .clrrot clr.l ob_rotspeed(a5) bra.s .skip .orpl sub.l #rotsetacc,ob_rotspeed(a5) bmi.s .clrrot ; .addrot move.l ob_rotspeed(a5),d0 add.l d0,ob_rot(a5) ; .skip rts unbounce move ob_bounce(a5),d1 beq.s .rts add #30,ob_bounce(a5) move ob_bounce(a5),d1 and #127,d1 cmp #30,d1 bcc.s .rts clr ob_bounce(a5) clr ob_frame(a5) bra footstep .rts rts moveplayer ;work out movement vector into d0/d1...check still/moving! ; move joyy(pc),d0 bne .move move joys(pc),d0 beq.s .still move joyx(pc),d0 bne.s .strafe ; .still bsr unbounce move ob_bounce(a5),d0 bne .fskip rts ; .strafe ;do strafe! X rot in d0 ; move.l camrots(pc),a1 lsl #6,d0 ;* ninety degrees add ob_rot(a5),d0 and #255,d0 lea 0(a1,d0*8),a1 ; move ob_movspeed(a5),d0 move d0,d1 muls 2(a1),d0 add.l d0,d0 muls 6(a1),d1 add.l d1,d1 neg.l d0 add.l d0,d6 add.l d1,d7 bra .check ; .move ;and possibly strafe! ; ;work out move vec into d0/d1 ; neg d0 muls ob_movspeed(a5),d0 ;speed move.l camrots(pc),a1 move ob_rot(a5),d1 and #255,d1 lea 0(a1,d1*8),a1 move d0,d1 muls 2(a1),d0 add.l d0,d0 muls 6(a1),d1 add.l d1,d1 neg.l d0 add.l d0,d6 add.l d1,d7 move joys(pc),d0 beq.s .check move joyx(pc),d0 bne.s .strafe .check ; bsr checknewslow beq.s .newpos bsr adjustpos beq.s .newpos bsr adjustpos beq.s .newpos ; move.l ob_x(a5),d6 move.l ob_z(a5),d7 bra.s .bounce ; .newpos move.l d6,ob_x(a5) move.l d7,ob_z(a5) ; .bounce move ob_bounce(a5),d2 add #20,ob_bounce(a5) move ob_bounce(a5),d1 and #255,d2 cmp #64,d2 bcc.s .fskip and #255,d1 cmp #64,d1 bcs.s .fskip ; bsr footstep .fskip ; move.l ob_framespeed(a5),d1 add.l d1,ob_frame(a5) and #3,ob_frame(a5) rts checkevent bsr checknew2 beq.s .rts ; move ob_pixsizeadd(a5),d0 or finished2(pc),d0 bne .rts ; move zo_ev(a4),d0 ;poly->event bmi.s .rts ; cmp #24,d0 bne.s .notexit ; move #3,finished2 ;pattern done! move #1,ob_pixsizeadd(a5) ;pixel out tst gametype beq.s .onewin bsr getother move #2,ob_pixsizeadd(a0) ;pixel out other player .onewin ; bsr dotelesfx moveq #24,d0 ; .notexit cmp #19,d0 bcc.s .noclr ; ;OK, gotta clear all 'event' zones with same type! ; move.l map_poly(pc),a0 move.l map_ppnt(pc),a1 moveq #32,d1 .loop2 cmp zo_ev(a0),d0 bne.s .skip2 neg zo_ev(a0) .skip2 add.l d1,a0 cmp.l a1,a0 bcs.s .loop2 ; .noclr move.l a5,eventobj movem.l d6-d7,-(a7) bsr execevent movem.l (a7)+,d6-d7 move.l eventobj(pc),a5 ; .rts rts ;these updated after a call to 'getcntrl' ; joyx dc 0 ;left/rite joyy dc 0 ;for/back joyb dc 0 ;fire joys dc 0 ;strafe checksuck cmp.l sucking(pc),a5 bne.s .nosuck ; move.l suckangle(pc),a0 moveq #25,d0 move d0,d1 muls 2(a0),d0 neg.l d0 add.l d0,d6 ; muls 6(a0),d1 add.l d1,d7 bsr checknewslow beq.s .newok bsr adjustpos beq.s .newok bsr adjustpos beq.s .newok ; move.l ob_x(a5),d6 move.l ob_z(a5),d7 bra.s .nosuck ; .newok move.l d6,ob_x(a5) move.l d7,ob_z(a5) ; .nosuck rts playerlogic0 ;restart after death...2 seconds invincibility. ; subq #1,ob_delay(a5) bgt.s playerlogic ; ;OK, fix colltype/collwith ; lea player1_,a1 cmp.l player1,a5 beq.s .got lea player2_,a1 .got lea p1_ob_colltype-player1_(a1),a1 move.l (a1),ob_colltype(a5) move.l #playerlogic,ob_logic(a5) playerlogic ; bsr playertimers ;do timer stuff... bsr getcntrl ;player control ; move.l ob_x(a5),d6 move.l ob_z(a5),d7 ; ;getting sucked? ; ;OK, are we getting pushed/squashed? ; bsr checknewslow beq.s .newok bsr adjustpos beq.s .newok2 bsr adjustpos beq.s .newok2 ; subq #1,ob_hitpoints(a5) ble playerdie st ob_update(a5) bra redpal ; .newok2 move.l d6,ob_x(a5) move.l d7,ob_z(a5) .newok ; bsr checksuck bsr checkevent ;in an event zone? bsr rotplayer ;rotate bsr moveplayer ;forward/back/strafe checkfire ; move cheat(pc),d0 beq.s .nocheat ; qkey $5f ;help????? beq.s .noend move #3,finished rts .noend key 10 beq.s .nohealth bsr inchealth bra.s .nocheat .nohealth move.b (a0),d1 moveq #5,d0 .loop btst d0,d1 bne.s .gotch subq #1,d0 bne.s .loop bra.s .nocheat .gotch ; subq #1,d0 bsr weapond0 ; .nocheat bsr checkfireb beq .nofire tst.b ob_reloadcnt(a5) bne .nofire2 ; move ob_collwith(a5),d2 and #3,d2 eor #3,d2 ;colltype moveq #0,d3 ;collwith! ; move ob_weapon(a5),d0 mulu #18,d0 lea wtable(pc),a0 movem 0(a0,d0),d4-d6 movem.l 6(a0,d0),a2-a3 move.l 14(a0,d0),-(a7) ; tst ob_mega(a5) beq.s .nomega ; cmp #ok,ob_mega(a5) bcc.s .threeway ; movem.l d2-d6/a2-a3,-(a7) addq #4,ob_rot(a5) bsr shoot movem.l (a7)+,d2-d6/a2-a3 subq #8,ob_rot(a5) bsr shoot addq #4,ob_rot(a5) bra.s .shdone .threeway ; movem.l d2-d6/a2-a3,-(a7) addq #8,ob_rot(a5) bsr shoot movem.l (a7),d2-d6/a2-a3 sub #16,ob_rot(a5) bsr shoot movem.l (a7)+,d2-d6/a2-a3 addq #8,ob_rot(a5) ; .nomega bsr shoot ; .shdone move.l (a7)+,a0 move.l (a0),a0 moveq #32,d0 moveq #0,d1 bsr playsfx ; move.b ob_reload(a5),ob_reloadcnt(a5) rts ; .nofire tst.b ob_reloadcnt(a5) beq.s .rts .nofire2 subq.b #1,ob_reloadcnt(a5) .rts rts ; ;hitpoints ;damage ;speed ; wtable dc 1,1,32 dc.l bullet1,sparks1,shootsfx3 dc 5,2,36 dc.l bullet2,sparks2,shootsfx5 dc 10,2,40 dc.l bullet3,sparks3,shootsfx dc 15,3,40 dc.l bullet4,sparks4,shootsfx4 dc 20,5,24 dc.l bullet5,sparks5,shootsfx5 adjustposq ; neg d0 move d0,d1 ; muls zo_a(a4),d0 add.l d0,d0 ; muls zo_b(a4),d1 add.l d1,d1 ; sub.l d0,d6 sub.l d1,d7 ; rts adjustpos bsr adjustposq ; ;addq #1,(a4) ;move.l a4,-(a7) bsr checknewslow ;move.l (a7)+,a3 ;addq #1,(a3) tst d1 rts checkfireb move joyb(pc),d0 beq.s .nofire tst ob_lastbut(a5) bne.s .skip move d0,ob_lastbut(a5) rts .skip moveq #0,d0 rts .nofire clr ob_lastbut(a5) rts eventobj dc.l 0 calcbounce ;calculate bounce vector...poly in a4, obj in a5 ; ;R=2 N (N dot V) - V ; ;where R=reflect vector, N=normal to poly, V=original vector ; subq #1,ob_bouncecnt(a5) bge.s .nok bsr makesparksq bra killobject .nok ; move.l closewall(pc),a4 movem ob_nxvec(a5),d0-d1 ;normalized dir movem zo_na(a4),d2-d3 ;normal to poly neg d2 ; ;calc dot product: ; move d0,d4 muls d2,d4 move d1,d5 muls d3,d5 add.l d5,d4 add.l d4,d4 swap d4 ;dot product? ; muls d4,d2 lsl.l #2,d2 swap d0 clr d0 sub.l d0,d2 swap d2 ; muls d4,d3 lsl.l #2,d3 swap d1 clr d1 sub.l d1,d3 swap d3 ; movem d2-d3,ob_nxvec(a5) ; neg d2 muls ob_movspeed(a5),d2 add.l d2,d2 muls ob_movspeed(a5),d3 add.l d3,d3 ; movem.l d2-d3,ob_xvec(a5) ; bsr checkvecs beq.s putfire bra calcbounce firelogic ; bsr checkvecs bne calcbounce putfire ; addq #1,ob_frame(a5) move ob_frame(a5),d0 move.l ob_shape(a5),a0 cmp 2(a0),d0 bcs.s .skip clr ob_frame(a5) .skip ; rts moveblood lea blood(pc),a5 ; .loop move.l (a5),a5 tst.l (a5) beq .done ; tst bl_y(a5) ble.s .do ; move.l sucking(pc),d0 beq.s .kill ; move.l bl_xvec(a5),d0 add.l d0,bl_x(a5) move.l bl_zvec(a5),d1 add.l d1,bl_z(a5) ; move.l bl_dest(a5),a0 move bl_x(a5),d0 sub ob_x(a0),d0 muls d0,d0 move bl_z(a5),d1 sub ob_z(a0),d1 muls d1,d1 add.l d1,d0 cmp.l #64*64,d0 bcc.s .loop bra.s .kill ; .do add.l #$8000,bl_yvec(a5) ; movem.l bl_xvec(a5),d0-d2 add.l d1,bl_y(a5) blt.s .ok ; .kill move.l a5,a0 killitem blood move.l a0,a5 bra .loop ; .ok add.l d0,bl_x(a5) add.l d2,bl_z(a5) bra .loop ; .done rts scrnblood dc 0 drawblood clr scrnblood move #$20,$dff09a lea blood(pc),a5 ; .loop move.l (a5),a5 tst.l (a5) beq .done ; move bl_color(a5),d6 beq.s .loop ;already splatted on screen if 0! ; move bl_x(a5),d0 sub camx(pc),d0 move bl_y(a5),d1 ble.s .blok neg d1 .blok sub camy(pc),d1 move bl_z(a5),d2 sub camz(pc),d2 ; ;rotate x/z around cam... ; move d0,d3 move d2,d5 muls cm1(pc),d0 muls cm2(pc),d5 add.l d5,d0 add.l d0,d0 swap d0 ;X ; muls cm3(pc),d3 muls cm4(pc),d2 add.l d3,d2 add.l d2,d2 swap d2 ;Z ; tst d2 beq .loop cmp #maxz,d2 bcc .loop ; ext.l d0 lsl.l #focshft,d0 divs d2,d0 cmp minx(pc),d0 blt .loop cmp maxx(pc),d0 bge .loop ; ext.l d1 lsl.l #focshft,d1 divs d2,d1 cmp miny(pc),d1 blt .loop cmp maxy(pc),d1 bge .loop ; cmp #40,d2 bcc.s .pix tst bl_y(a5) bgt.s .pix ; ;blood on screen! ; st scrnblood clr bl_color(a5) bra .loop .pix ; add midx(pc),d0 add midy(pc),d1 ; move.l darktable(pc),a0 move 0(a0,d2*2),d3 ; move.l chunky(pc),a1 ; lea coloffs,a2 add.l 0(a2,d0*4),a1 mulu chunkymod(pc),d1 ; move blcols(pc,d3*2),d3 and d6,d3 move d3,0(a1,d1.l) bra .loop ; .done move #$8020,$dff09a ; move scrnblood(pc),d0 beq.s .rts clr scrnblood ; bsr rndw2 and #3,d0 add #51,d0 move d0,d2 ;splat# ; move.l window(pc),a0 move wi_bh(a0),d0 subq #8,d0 bsr rndn2 move d0,d3 ;Y ; move wi_bw(a0),d0 subq #8,d0 bsr rndn2 add wi_x(a0),d0 ;X ; move d3,d1 move.l wi_bmap(a0),a1 move.l font(pc),a0 bra blit ; .rts rts blcols dc $ccc,$bbb,$aaa,$999,$888,$777,$666,$555 dc $444,$333,$222,$111,$111,$111,$111,$111 shaperender dc.l drawobjnorm ;default! drawshape_1sc ;draw shape with one frame, scaled! ; move.l ob_shape(a5),a0 move ob_frame(a5),d0 add.l 12(a0,d0*4),a0 move ob_scale(a5),d7 bra drawshape drawshape_1 ; move.l ob_shape(a5),a0 move ob_frame(a5),d0 add.l 12(a0,d0*4),a0 move #$200,d7 ;scale bra drawshape drawshape_8 ; ;shape has 8 rotations, and a scale! ; bsr calcangle2 add #16,d0 sub ob_rot(a5),d0 lsr #5,d0 and #7,d0 move ob_frame(a5),d1 lsl #3,d1 or d1,d0 move.l ob_shape(a5),a0 move ob_scale(a5),d7 add.l 12(a0,d0*4),a0 ; drawshape move ob_x(a5),d0 move ob_y(a5),d1 move ob_z(a5),d2 drawshape_q ; ;A0=shape ;D0=X ;D1=Y ;D2=Z ;D7=sclae factor ; ;rotate Z around camera! ; sub camx(pc),d0 sub camy(pc),d1 sub camz(pc),d2 ; move d0,d3 move d2,d5 muls cm3(pc),d3 muls cm4(pc),d2 add.l d3,d2 add.l d2,d2 swap d2 ; tst d2 ble .rts cmp #maxz,d2 bcc .rts ; muls cm1(pc),d0 muls cm2(pc),d5 add.l d5,d0 add.l d0,d0 swap d0 ; move.l memat(pc),a1 add.l #sh_size,memat movem d0-d2,sh_x(a1) move.l a0,sh_shape(a1) move d7,sh_scale(a1) move.l shaperender(pc),sh_render(a1) ; lea shapelist(pc),a2 .loop move.l (a2),d0 beq.s .end move.l a2,a3 move.l d0,a2 cmp sh_z(a2),d2 ;nearer...further in list ble.s .loop move.l a2,(a1) move.l a1,(a3) rts .end move.l d0,(a1) move.l a1,(a2) .rts rts checknew2 ;check trigger zone move.l map_grid(pc),a0 addq #4,a0 bra.s checknew_ gs equ 1< furthest wall list. ; ;optimizations... ;check if both z's are negative after rotation ;check if projected left/rite ends are on screen ; bsr incframe ; clr.l inlist move.l #inlist,inlistf ; move.l map_poly(pc),a4 move.l map_ppnt(pc),a3 move.l map_grid(pc),a2 movem camx(pc),d6-d7 ;x,z lsr #grdshft,d6 lsr #grdshft,d7 lea gridoffs(pc),a6 moveq #(gridoffsf-gridoffs)>>2-1,d5 ; .loop movem (a6)+,d0-d1 add d6,d0 cmp #32,d0 bcc .skip add d7,d1 cmp #32,d1 bcc .skip ; ;d0,d1=x/z of map to check! ; lsl #5,d1 ;Y*32... add d1,d0 ;+X lea 0(a2,d0*8),a0 ;mapgrid move (a0)+,d4 ;how many polys here bmi .skip move (a0),d0 ;poly data offset lea 0(a3,d0*2),a0 ; .loop2 move (a0)+,d0 ;poly# lsl #5,d0 lea 0(a4,d0),a1 ;actual poly ; bsr dothezone ; dbf d4,.loop2 ;finish sq ; .skip dbf d5,.loop ;gridoffs ; ;now do rots/morphs... ; lea rotpolys(pc),a3 ; .loop3 move.l (a3),a3 tst.l (a3) beq.s .rpdone ; move.l rp_first(a3),a4 move rp_num(a3),d4 subq #1,d4 ; .loop4 move.l a4,a1 bsr dothezone2 ; lea 32(a4),a4 dbf d4,.loop4 ; bra.s .loop3 .rpdone ; makeoutlist ;create outlist from inlist ; clr.l outlist move.l #outlist,outlistf ; .loop lea inlist(pc),a0 move.l (a0),d0 beq .done move.l a0,a2 ;save previous! move.l d0,a0 ; ;OK, see if any are in front of a0... ; lea inlist(pc),a1 ; .loop2 move.l (a1),d0 beq .none move.l a1,a3 move.l d0,a1 cmp.l a0,a1 beq.s .loop2 ;don't compare with self! ; ;check screen pos overlap... ; move wl_rsx(a0),d0 cmp wl_lsx(a1),d0 blt .loop2 ; move wl_lsx(a0),d1 cmp wl_rsx(a1),d1 bgt .loop2 ; ;check near/far Z overlap ; move wl_nz(a1),d2 cmp wl_fz(a0),d2 bge .loop2 ;behind! ; move wl_fz(a1),d2 cmp wl_nz(a0),d2 ble .swap ; tst wl_open(a1) bne .swap ; ;look at a0 points against a1 line... ; movem wl_a(a1),d5-d6 move.l wl_c(a1),d7 ; move wl_lx(a1),d0 sub wl_lx(a0),d0 muls d5,d0 move wl_lz(a1),d1 sub wl_lz(a0),d1 muls d6,d1 add.l d1,d0 eor.l d7,d0 ; move wl_lx(a1),d1 sub wl_rx(a0),d1 muls d5,d1 move wl_lz(a1),d2 sub wl_rz(a0),d2 muls d6,d2 add.l d2,d1 eor.l d7,d1 ; ;if both a0 in front, no swap ; move.l d0,d4 or.l d1,d4 bpl .loop2 ;both a0's in front of a1! ; ;if both a0 behind, swap ; and.l d1,d0 bmi .swap ;both a0's behind a1! ; ;look at a1 points against a0 line! ; movem wl_a(a0),d5-d6 move.l wl_c(a0),d7 ; move wl_lx(a0),d2 sub wl_lx(a1),d2 muls d5,d2 move wl_lz(a0),d3 sub wl_lz(a1),d3 muls d6,d3 add.l d3,d2 eor.l d7,d2 ; move wl_lx(a0),d3 sub wl_rx(a1),d3 muls d5,d3 move wl_lz(a0),d4 sub wl_rz(a1),d4 muls d6,d4 add.l d4,d3 eor.l d7,d3 ; move.l d2,d4 and.l d3,d4 bmi .loop2 ;both a1's behind a0! ; or.l d3,d2 bmi .loop2 ; .swap move.l a1,a0 move.l a3,a2 bra .loop2 ; .none ;OK, none in front of this (a0) ; move.l (a0),(a2) ;unlink from inlist clr.l (a0) ; move.l outlistf(pc),a2 move.l a0,(a2) move.l a0,outlistf bra .loop ; .done rts dothezone2 ; move frame(pc),d0 cmp zo_done(a1),d0 beq.s .rts move d0,zo_done(a1) tst zo_open(a1) bmi.s .rts ; movem d4-d7,-(a7) ; movem zo_lx(a1),d0-d3 ;x1,z1,x2,z2 movem camx(pc),d6-d7 ; move #maxz,d4 move d4,d5 neg d5 ; sub d6,d0 cmp d4,d0 bge.s .rts2 cmp d5,d0 ble.s .rts2 ; sub d7,d1 cmp d4,d1 bge.s .rts2 cmp d5,d1 ble.s .rts2 ; sub d6,d2 cmp d4,d2 bge.s .rts2 cmp d5,d2 ble.s .rts2 ; sub d7,d3 cmp d4,d3 bge.s .rts2 cmp d5,d3 bgt dothezone3 ;.rts2 ; .rts2 movem (a7)+,d4-d7 ; .rts rts dothezone ; move frame(pc),d0 cmp zo_done(a1),d0 beq rts ;.skip3 move d0,zo_done(a1) tst zo_open(a1) bmi rts ;.skip3 ; ;OK, setup: ; ;d0=lx,d1=lz,d2=rx,d3=rz ;d4=t,d5=sc,d6=dist ; ;back face/dist check... ; movem d4-d7,-(a7) ; movem zo_lx(a1),d0-d3 ;x1,z1,x2,z2 movem camx(pc),d6-d7 ; sub d6,d0 sub d7,d1 sub d6,d2 sub d7,d3 ; dothezone3 move d0,d4 move d1,d5 muls cm1(pc),d0 muls cm2(pc),d5 add.l d5,d0 add.l d0,d0 swap d0 ; muls cm3(pc),d4 muls cm4(pc),d1 add.l d4,d1 add.l d1,d1 swap d1 ;LZ ; move d2,d4 move d3,d5 muls cm1(pc),d2 muls cm2(pc),d5 add.l d5,d2 add.l d2,d2 swap d2 ;RX ; muls cm3(pc),d4 muls cm4(pc),d3 add.l d4,d3 add.l d3,d3 swap d3 ;RZ ; ;check Z's... tst d1 bgt.s .zok tst d3 ble .skip2 .zok ; cmp #maxz,d1 blt.s .zok2 cmp #maxz,d3 bge .skip2 .zok2 ; ;do backface check...generate a,b,c... ; rol.l #exshft,d0 rol.l #exshft,d1 rol.l #exshft,d2 rol.l #exshft,d3 ; move d1,d4 sub d3,d4 ;a move d2,d5 sub d0,d5 ;b ; move d0,d6 muls d4,d6 move d1,d7 muls d5,d7 add.l d7,d6 bpl.s .front ; ;backface showing!... bra .skip2 .front ; move.l memat(pc),a5 ; movem d0-d5,wl_lx(a5) move.l d6,wl_c(a5) ; ;work out some screen positions! tst d1 bgt.s .z1ok ; ;lz bad, rz must be OK... ; .ov1 move minx(pc),wl_lsx(a5) bra.s .z1sk ; .z1ok ext.l d0 lsl.l #focshft,d0 divs d1,d0 bvs.s .ov1 subq #1,d0 cmp maxx(pc),d0 bge .skip2 move d0,wl_lsx(a5) .z1sk ; tst d3 bgt.s .z2ok ; ;rz bad, lz must be OK... ; .ov2 move maxx(pc),wl_rsx(a5) bra.s .z2sk ; .z2ok ext.l d2 lsl.l #focshft,d2 divs d3,d2 bvs.s .ov2 addq #1,d2 cmp minx(pc),d2 blt .skip2 move d2,wl_rsx(a5) .z2sk ; cmp d1,d3 bge.s .zskp exg d1,d3 .zskp movem d1/d3,wl_nz(a5) ;near/far Z ; move.l zo_t(a1),wl_t(a5) move.l zo_t+4(a1),wl_t+4(a5) move zo_sc(a1),wl_sc(a5) move zo_open(a1),wl_open(a5) ; ;add to end of inlist... ; clr.l (a5) move.l inlistf(pc),a1 move.l a5,(a1) move.l a5,inlistf add.l #wl_size,memat ; .skip2 movem (a7)+,d4-d7 ; .skip3 rts elseif makeoutlist2 ;create outlist from inlist ; .loop0 lea inlist(pc),a0 ; .loop move.l (a0),d0 beq .done move.l a0,a2 ;save previous! move.l d0,a0 ; ;OK, see if any are in front of a0... ; lea inlist(pc),a1 ; .loop2 move.l (a1),d0 beq .none move.l a1,a3 move.l d0,a1 ; cmp.l a0,a1 beq.s .loop2 ;don't compare with self! ; ;see if a1 is in front of a0 ; move wl_nz(a1),d0 cmp wl_fz(a0),d0 bge .loop2 ;behind! ; move wl_fz(a1),d0 cmp wl_nz(a0),d0 ble .swap ; ;now, compare screen x coords..... ; move wl_rsx(a0),d0 cmp wl_lsx(a1),d0 blt .loop2 ; move wl_lsx(a0),d0 cmp wl_rsx(a1),d0 bgt .loop2 ; ;look at a0 points against a1 line ; ;If Sgn((x3-x1)*a2+(y3-y1)*b2)<>Sgn(c2) ; If Sgn((x3-x2)*a2+(y3-y2)*b2)<>Sgn(c2) ; tr=-1:Return ; EndIf ;EndIf ; movem wl_a(a1),d5-d6 move.l wl_c(a1),d7 ; move wl_lx(a1),d0 sub wl_lx(a0),d0 muls d5,d0 move wl_lz(a1),d1 sub wl_lz(a0),d1 muls d6,d1 add.l d1,d0 eor.l d7,d0 ; move wl_lx(a1),d1 sub wl_rx(a0),d1 muls d5,d1 move wl_lz(a1),d2 sub wl_rz(a0),d2 muls d6,d2 add.l d2,d1 eor.l d7,d1 ; ;OK, screen X's overlap... ;if both a0 in front, no swap ; move.l d0,d4 or.l d1,d4 bpl .loop2 ; ;if both a0 behind, swap ; move.l d0,d4 and.l d1,d4 bmi .swap ; ;bra .loop2 ; ;elseif ;look at a1 points against a0 line ; ;If Sgn((x1-x3)*a1+(y1-y3)*b1)=Sgn(c1) ; If Sgn((x1-x4)*a1+(y1-y4)*b1)=Sgn(c1) ; tr=-1:Return ; EndIf ;EndIf ; movem wl_a(a0),d5-d6 move.l wl_c(a0),d7 ; move wl_lx(a0),d2 sub wl_lx(a1),d2 muls d5,d2 move wl_lz(a0),d3 sub wl_lz(a1),d3 muls d6,d3 add.l d3,d2 eor.l d7,d2 ; move wl_lx(a0),d3 sub wl_rx(a1),d3 muls d5,d3 move wl_lz(a0),d4 sub wl_rz(a1),d4 muls d6,d4 add.l d4,d3 eor.l d7,d3 ; ;if both a1's behind, no swap ; move.l d2,d4 and.l d3,d4 bmi .loop2 ;both a1's behind... ; ;if both a1's in front, swap move.l d2,d4 or.l d3,d4 bpl .swap ; bra .loop2 ; ;elseif ; .swap ;a1 is infront of a0! make a1 new frontmost bra .loop move.l a1,a0 move.l a3,a2 bra .loop2 ; .none ;OK, none in front of this (a0) ; move.l (a0),(a2) ;unlink from inlist clr.l (a0) move.l outlistf(pc),a2 move.l a0,(a2) move.l a0,outlistf bra .loop0 ; .done ;move.l inlist(pc),d0 ;bne .loop0 rts elseif castwalls ;process 'walls' list ; move.l castrots(pc),a6 move minx(pc),d7 lea 0(a6,d7*8),a6 move.l vertdraws(pc),a4 ; .loop ;do this vert line! ; lea outlist(pc),a5 ; .loop2 move.l (a5),d0 beq .empty move.l a5,a3 ;previous move.l d0,a5 ; cmp wl_lsx(a5),d7 blt.s .loop2 ;not up to left yet! ; cmp wl_rsx(a5),d7 ble.s .try ; ;past right! unlink! move.l (a5),(a3) bra.s .loop2 .try ; movem wl_lx(a5),d0-d1 muls (a6),d0 muls 2(a6),d1 add.l d1,d0 ;LX! bgt.s .loop2 ; movem wl_rx(a5),d1-d2 muls (a6),d1 muls 2(a6),d2 add.l d2,d1 ;RX! blt.s .loop2 ; sub.l d0,d1 ; swap d1 tst d1 ble.s .dfix neg.l d0 divu d1,d0 bvc.s .noov .dfix moveq #-1,d0 .noov lsr #1,d0 ;fraction -> unsigned ; cmp wl_open(a5),d0 bcs.s .loop2 ; movem wl_lx(a5),d1-d2 muls 4(a6),d1 muls 6(a6),d2 add.l d2,d1 add.l d1,d1 ;lz ; movem wl_rx(a5),d2-d3 muls 4(a6),d2 muls 6(a6),d3 add.l d3,d2 add.l d2,d2 ;rz ; sub.l d1,d2 swap d2 muls d0,d2 add.l d2,d2 add.l d1,d2 ; swap d2 ; cmp #exone,d2 blt .loop2 cmp #maxz<LUT move.l planar_palette,a6 ; .vloop move.b 0(a3,d1),d5 beq.s .skip ; move.b 0(a2,d5),d5 ;ghost colour! move 0(a6,d5*4),d5 ;to RGB and d2,d5 ; moveq #0,d3 move.b (a4),d3 move 0(a6,d3*4),d3 ;to RGB and d2,d3 ; add d3,d5 lsr #1,d5 move.b 0(a5,d5),(a4) moveq #0,d5 ; .skip add.l d6,d1 ;next src Y addx d0,d1 ;xtend add.l d7,a4 dbf d4,.vloop ; movem.l (a7)+,d0-d5/a5-a6 ; .zbad add.l d5,d0 moveq #0,d7 addx.l d7,d0 ;next src X lea vd_size(a6),a6 ; dbf d3,.hloop ; rts drawobjnorm ;normal draw object... ; .hloop move.l a1,a4 add.l (a5)+,a4 ; cmp vd_z(a6),d2 bcs.s .zok ; tst thermo beq.s .zbad ; bsr thermostrip bra.s .zbad ; .zok movem.l d0-d1/d4-d5,-(a7) ; mulu (a0),d0 lea 2(a0,d0),a3 ;src ; move.l chunkymod(pc),d7 moveq #0,d5 moveq #0,d0 ; sub d6,d1 add.l d6,d1 ; .vloop move.b 0(a3,d1),d5 beq.s .skip move.b 0(a2,d5),(a4) .skip addx.l d6,d1 ;next src Y add.l d7,a4 dbf d4,.vloop ; movem.l (a7)+,d0-d1/d4-d5 ; .zbad add.l d5,d0 moveq #0,d7 addx.l d7,d0 ;next src X lea vd_size(a6),a6 ; dbf d3,.hloop ; rts thermostrip movem.l d0-d2/d4-d5,-(a7) ; mulu (a0),d0 lea 2(a0,d0),a3 ;src ; move chunkymodw(pc),d7 ext.l d7 moveq #0,d5 moveq #0,d0 move #$00f,d2 ; sub d6,d1 add.l d6,d1 ; .vloop move.b 0(a3,d1),d5 beq.s .skip ; move 0(a2,d5*2),d5 and d2,d5 move d5,(a4) ; .skip addx.l d6,d1 ;next src Y add.l d7,a4 dbf d4,.vloop ; movem.l (a7)+,d0-d2/d4-d5 ; rts renderwalls ; move.l chunkymod(pc),d0 move.l vertdraws(pc),a0 move.l palette(pc),a2 lea palettes,a2 lea coloffs(pc),a6 ; move width(pc),d7 subq #1,d7 ; .loop move.l (a6)+,a1 add.l chunky(pc),a1 ; drawsolidstrip ; lea vd_size(a0),a0 dbf d7,.loop ; rts solidstrip set 0 drawstrip2 ; ;drawstrip_ ; rts dc $f0ff,$ff0f,$fff0 dc $f00f,$f0f0,$ff00 dc $ffff ; stripands ;red,green,blue,yel,pur,cyn,wht vwait tst os bne.s .osvwait move #1,vbcounter .loop tst vbcounter bgt.s .loop rts .osvwait movem.l d0-d1/a0-a1/a6,-(a7) move.l grbase(pc),a6 jsr -270(a6) movem.l (a7)+,d0-d1/a0-a1/a6 rts ;************** DATA *************************** data active dc.l 0 ;is game input active? temppal dc.l 0 todb dc.l 0 topokepal dc.l 0 gloomcfg dc.l 0 gloom dc.l 0 ;incbin title gloompal dc.l 0 ;incbin title.pal gloombrush dc.l 0 ;incbin gloombrush panel dc.l 0 panelcnt dc.l 0 ;non zero = do c2p for panel. offset dc.l 0 ;planar bitmap offset os dc os_ aga dc aga_ bitplanes dc 0 colours dc 0 linemod dc 0 linemodw dc 320 bpmod dc 0 bpmodw dc 40 bmaphite dc 240,0 bmapmem dc.l 0 chunkymod dc 0 chunkymodw dc testw ;128 pixels width planar_c2p dc.l 0 ;routines! c2p dc.l 0 ;the biggy chunky dc.l 0 ;chunky buffer bitmaps dc.l 0 ;bitmap memory bitmaps2 dc.l 0 ;second bitmap showbitmap dc.l 0 ;bitmap displayed drawbitmap dc.l 0 ;used bitmap ; magic dc.l 0 magicpal dc.l 0 combat dc.l 0 combatpal dc.l 0 ; gloomdata dc 0 ;non-zero = datadisk there! cheat dc 0 ;cheat mode on? fontw dc 0 fonth dc 0 mode dc 0 chatok dc 0 lastgrunt dc.l 0 grunttable dc.l gruntsfx,gruntsfx2,gruntsfx3,gruntsfx4 splatsfx dc.l 0 diesfx dc.l 0 footstepsfx dc.l 0 doorsfx dc.l 0 tokensfx dc.l 0 gruntsfx dc.l 0 gruntsfx2 dc.l 0 gruntsfx3 dc.l 0 gruntsfx4 dc.l 0 ; shootsfx dc.l 0 shootsfx2 dc.l 0 shootsfx3 dc.l 0 shootsfx4 dc.l 0 shootsfx5 dc.l 0 telesfx dc.l 0 ghoulsfx dc.l 0 lizsfx dc.l 0 lizhitsfx dc.l 0 trollsfx dc.l 0 trollhitsfx dc.l 0 robotsfx dc.l 0 robodiesfx dc.l 0 dragonsfx dc.l 0 chipzero dc.l 0 outhand dc.l 0 ;starting positions! ; p1x dc 0 p1z dc 0 p1r dc 0 dc 0 p2x dc 0 p2z dc 0 p2r dc 0 dc 0 p1health dc 0 p1weapon dc 0 p1lives dc 0 p1reload dc 0 p2health dc 0 p2weapon dc 0 p2lives dc 0 p2reload dc 0 map_test dc.l 0 ifne cd32 gloomgame dc.l gloomgame2 elseif gloomgame dc.l 0 endc script dc.l 0 scriptat dc.l 0 minbpos dc 0 maxbpos dc 0 finished dc 0 finished2 dc 0 ; floorflag dc 1 ;-1 = (black), 0 = split, 1=txt roofflag dc 1 ; floorflag2 dc -1 roofflag2 dc -1 ; floor dc.l 0 roof dc.l 0 ; dc 0 paused dc $ff00 gametype dc 0 ;0,1,2 linked dc 0 ;linked, 2 player modem game twowins dc 0,0 ; font dc.l 0 bigfont_ dc.l 0 smallfont_ dc.l 0 ; cnop 0,4 thermo dc 0 ;thermograph infra dc 0 ;infrared ; maptable dc.l 0 sqr dc.l sqrinc darktable dc.l 0 inlist dc.l 0 inlistf dc.l inlist outlist dc.l 0 outlistf dc.l outlist window dc.l 0 dummy dc.l 0 player_ dc.l 0 ;current player! player1 dc.l 0 player2 dc.l 0 doneflag dc 0 showflag dc 0 memory dc.l 0 memat dc.l 0 shapelist dc.l 0 bitmap dc.l 0 planar_palette dc.l 0 planar_remap dc.l 0 palette dc.l palettes palettes ds.l 16 ;16 shade palettes ;each 256 bytes long. map_map dc.l 0 map_grid dc.l 0 map_poly dc.l 0 map_ppnt dc.l 0 map_rgbs dc.l 0 ;pointer to current RGB map_txts dc.l 0 map_anim dc.l 0 map_events dc.l 0 rgb_info dc.l 0 rgb_rgbs dc.l 0 ; map_rgbsat dc.l 0 map_rgbsat2 dc.l 0 map_rgbsfrom dc.l 0 map_rgbsfrom2 dc.l 0 remapped dc.l 0 ; camx dc 0 camz dc 0 camy dc 0 camr dc 0 ;camera matrix... cm1 dc $7ffe cm2 dc 0 cm3 dc 0 cm4 dc $7ffe ;inverse of camera matrix... icm1 dc $7ffe icm2 dc 0 icm3 dc 0 icm4 dc $7ffe castrots dc.l castrotsinc+8*160 camrots dc.l camrotsinc camrots2 dc.l camrots2inc vertdraws dc.l 0 width dc testw hite dc testh minx dc -testw/2 midx ; maxx dc testw/2 miny dc -testh/2 midy ; maxy dc testh/2 wdiv32 dc 0 wrem32 dc 0 coplist dc.l 0 slice1 dc.l 0 slice2 dc.l 0 copstop dc.l 0 memlist dc.l 0 dispnest dc 0 coloffs ds.l 320 ;320 columns max iffwindow ; dc.l slice1 dc.l copstop ; dc 0 ;x dc 42 ;y dc 320 ;w dc 248 ;h dc 1 ;pw dc 1 ;ph ; dc 0,0 dc.l 0 dc.l 0 ; dc.l 0 dc.l 0 dc.l 0 dc.l 0 dc 0 dc.l 0,0,0 defwindow1_1p ; dc.l slice1 dc.l copstop ; elseif dc 160-126 ;45*2 dc cy-120 ;45*2 dc 126 ;max width for 2 high = 90! dc 80 dc 2 dc 3 elseif ; dc 160-90 dc cy-90 dc 90 dc 90 dc 2 dc 2 ;elseif ; dc 0,0 dc.l 0 dc.l 0 ; dc.l 0 dc.l 0 dc.l 0 dc.l 0 dc 0 dc.l 0,0,0 defwindow1_2p ; dc.l slice1 dc.l slice2 ; dc 160-33*2 dc cy-124 dc 66 ;max width for 2 high = 90! dc 60 dc 2 dc 2 ; dc 0,0 dc.l 0 dc.l 0 ; dc.l 0 dc.l 0 dc.l 0 dc.l 0 dc 0 dc.l 0,0,0 defwindow2_2p ; dc.l slice2 dc.l copstop ; dc 160-33*2 dc cy dc 66 dc 60 dc 2 dc 2 ; dc 0,0 dc.l 0 dc.l 0 ; dc.l 0 dc.l 0 dc.l 0 dc.l 0 dc 0 dc.l 0,0,0 window1 ; dc.l slice1 dc.l slice2 ;copstop here for 1 window ; dc 160-33*2 dc 42 dc 66 ;max width for 2 high = 90! dc 60 dc 2 dc 2 ; dc 0,0 dc.l 0 dc.l 0 ; dc.l 0 dc.l 0 dc.l 0 dc.l 0 dc 0 dc.l 0,0,0 window2 ; dc.l slice2 dc.l copstop ; dc 160-33*2 dc 165 dc 66 dc 60 dc 2 dc 2 ; dc 0,0 dc.l 0 dc.l 0 ; dc.l 0 dc.l 0 dc.l 0 dc.l 0 dc 0 dc.l 0,0,0 bigdata textscrns ds.l 8 ;texture screens textures ds.l 160 ;individual txts (20/screen) ;************** SLOW SUBS ********************** slowsubs ;MOVE d1,d4:LSL #8,d1:MOVE.b d4,d1:MOVE d1,d4:SWAP d1:MOVE d4,d1 ;MOVE d2,d4:LSL #8,d2:MOVE.b d4,d2:MOVE d2,d4:SWAP d2:MOVE d4,d2 ;MOVE d3,d4:LSL #8,d3:MOVE.b d4,d3:MOVE d3,d4:SWAP d3:MOVE d4,d3 ;;EXT.l d0:MOVE.l (a0),a0:LEA 44(a0),a0:JMP -$354(a6) ;LEA table(pc),a1:MOVE.b d0,3(a1):MOVEM.l d1-d3,4(a1) ;MOVE.l (a0),a0:LEA 44(a0),a0:JMP -$372(a6) ;table:Dc.l $00010000,0,0,0,0 lastpal dc.l 0 pokelastpal move.l lastpal(pc),a1 ; pokepal ;a1=palette to poke ; move.l a1,lastpal move colours(pc),d0 pokepal2 ; move.l topokepal(pc),a0 jmp (a0) to32 macro move \1,d5 lsl #8,\1 move.b d5,\1 move \1,d5 swap \1 move d5,\1 endm pokepal_os ; ;OS version! ; move.l temppal(pc),a0 move d0,(a0)+ ;how many clr (a0)+ ;first colour subq #1,d0 ; .loop move (a1)+,d1 ;hi nyb move d1,d2 move d1,d3 move d1,d4 tst aga beq.s .skip move (a1)+,d4 ; .skip move d4,d5 and #$f00,d1 lsr #4,d1 and #$f00,d5 lsr #8,d5 or d5,d1 to32 d1 ; move d4,d5 and #$0f0,d2 and #$0f0,d5 lsr #4,d5 or d5,d2 to32 d2 ; and #$00f,d3 lsl #4,d3 and #$00f,d4 or d4,d3 to32 d3 ; movem.l d1-d3,(a0) lea 12(a0),a0 dbf d0,.loop clr.l (a0) ; move.l viewport(pc),a0 move.l temppal(pc),a1 move.l grbase(pc),a6 jmp -$372(a6) pokepal_ecs move.l coplist,a2 lea palette_ecs-copinit_ecs(a2),a2 subq #1,d0 .loop0 move (a1)+,2(a2) addq #4,a2 dbf d0,.loop0 rts pokepal_aga move.l coplist,a2 lea palette_aga-copinit_aga(a2),a2 subq #1,d0 move d0,d2 and #31,d2 .loop move d2,d1 .loop2 move (a1)+,6(a2) move (a1)+,132+6(a2) addq #4,a2 dbf d1,.loop2 lea 264-128(a2),a2 dbf d0,.loop rts decodeiff ; ;a0=trimmed IFF file ;a1=dest bitmap ; move.l bpmod(pc),d7 ; move (a0)+,d0 ;pixel width lsr #3,d0 ;to byte width move (a0)+,d1 ;pixel height cmp #240,d1 bls.s .hok move #240,d1 .hok subq #1,d1 ;to dbf move (a0)+,d2 ;depth subq #1,d2 ;to dbf addq #6,a0 ;skip header ; .loop5 move d2,d5 ;depth move.l a1,-(a7) ;start of newline ; .loop4 move.l a1,a2 move d0,d4 ;how many bytes in line ; .loop moveq #0,d3 move.b (a0)+,d3 bmi.s .repeat sub d3,d4 .loop3 move.b (a0)+,(a2)+ dbf d3,.loop3 bra.s .skip ; .repeat cmp.b #-128,d3 beq.s .loop neg.b d3 sub d3,d4 .loop2 move.b (a0),(a2)+ dbf d3,.loop2 addq #1,a0 .skip subq #1,d4 bgt.s .loop ; add.l d7,a1 dbf d5,.loop4 ; move bitplanes(pc),d3 subq #1,d3 sub d2,d3 ble.s .noxs subq #1,d3 moveq #0,d5 .c move.l a1,a2 moveq #9,d4 ;clear a line .cc move.l d5,(a2)+ dbf d4,.cc add.l d7,a1 dbf d3,.c .noxs ; move.l (a7)+,a1 add.l linemod(pc),a1 dbf d1,.loop5 ; rts copypic movem.l showbitmap,a0-a1 move.l bmapmem(pc),d1 lsr.l #2,d1 subq #1,d1 .loop move.l (a0)+,(a1)+ dbf d1,.loop rts clspic move.l drawbitmap,a1 move.l bmapmem(pc),d1 lsr.l #2,d1 subq #1,d1 moveq #0,d0 .loop move.l d0,(a1)+ dbf d1,.loop bra db showpic ;a0=trimmed IFF file, a1=palette ; movem.l a0-a1,-(a7) bsr clspic ;show a blank bitmap bsr vwait movem.l (a7),a0-a1 move.l drawbitmap(pc),a1 bsr decodeiff movem.l (a7)+,a0-a1 bsr pokepal bsr db bra vwait ifne cd32 applname dc.b 'Gloom',0 even itemname dc.b 'Games',0 even gloomgame2 dc.b 'gamegamegamegamegame' nvname dc.b 'nonvolatile.library',0 cnop 0,4 nv dc.l 0 savegloomgame ; move.l nv,d0 beq.s .done ; move.l d0,a6 lea applname(pc),a0 lea itemname(pc),a1 lea gloomgame2(pc),a2 moveq #2,d0 ;20 bytes moveq #-1,d1 jsr -42(a6) ;storenv tst.l d0 bne.s .done ;error! ; lea applname(pc),a0 lea itemname(pc),a1 moveq #-1,d1 moveq #1,d2 jsr -66(a6) ;setnvprotection ; .done rts loadgloomgame move.l nv,d0 beq.s .done ; move.l d0,a6 lea applname(pc),a0 lea itemname(pc),a1 moveq #-1,d1 jsr -30(a6) ;getcopnv tst.l d0 beq.s .done ; move.l d0,a0 lea gloomgame2(pc),a1 moveq #4,d1 ;5 longs=20 bytes .loop move.l (a0)+,(a1)+ dbf d1,.loop ; move.l d0,a0 jsr -36(a6) ;freenvdata ; .done rts endc flushc ;flush cache! ; movem.l a0-a1/d0-d1/a6,-(a7) move.l 4.w,a6 cmp #636,16(a6) bcs.s .skip jsr -636(a6) .skip movem.l (a7)+,a0-a1/d0-d1/a6 rts findanglesign ;d1=angle I'm at ; d0=angle I wanna be at...return sign ;(bmi, bpl) of add to get there ;return cc (mi,pl) and d0.w (for tst) of sign to get there! ; and #255,d0 and #255,d1 sub d0,d1 bpl.s .plus ; moveq #1,d0 cmp #-128,d1 bgt.s .rts neg d0 .rts neg d0 rts ; .plus moveq #1,d0 ;+ cmp #128,d1 bge.s .rts2 neg d0 .rts2 neg d0 rts checklock cmp #2,d0 bgt.s .max cmp #-2,d0 bge.s .rts moveq #-2,d0 .rts rts .max moveq #2,d0 rts locklogic ;locking on to defender machine ; bsr playertimers ;do timer stuff... bsr getcntrl ;player control ; moveq #0,d2 ;how many locked move ob_x(a5),d0 sub ob_telex(a5),d0 bne.s .lockx addq #1,d2 bra.s .lockx2 .lockx bsr checklock sub d0,ob_x(a5) .lockx2 ; move ob_z(a5),d0 sub ob_telez(a5),d0 bne.s .lockz addq #1,d2 bra.s .lockz2 .lockz bsr checklock sub d0,ob_z(a5) .lockz2 ; move ob_rot(a5),d1 move ob_telerot(a5),d0 bsr findanglesign ; move ob_rot(a5),d1 sub ob_telerot(a5),d1 and #255,d1 bne.s .lockrot addq #1,d2 bra.s .lockrot2 .lockrot cmp #4,d1 bls.s .skip cmp #256-4,d1 bcs.s .four or #$ff00,d1 neg d1 bra.s .skip .four moveq #4,d1 .skip tst d0 bmi.s .skip2 neg d1 .skip2 add d1,ob_rot(a5) ; .lockrot2 bsr unbounce tst ob_bounce(a5) bne.s .rts ; subq #3,d2 bne.s .rts ; clr ob_rotspeed(a5) move.l #playdefender,ob_logic(a5) ; move.b floortag(pc),d0 sub.b #49,d0 ;'1'->0 ext d0 move ltk(pc,d0*2),landerstokill move lnd(pc,d0*2),landerdelay ; move #3,playerlives ; bra initnewdef ; .rts rts ltk dc 20,35,50 lnd dc 25,20,15 playdefender bsr atmachine bsr defender move landerstokill(pc),d0 ble.s .win move playerlives(pc),d0 ble.s .lose rts .win addq #1,ob_lives(a5) move #-1,ob_update(a5) tst gametype beq.s .lose jsr getother tst ob_lives(a0) beq.s .lose addq #1,ob_lives(a0) move #-1,ob_update(a0) .lose move #96,ob_delay(a5) move.l #waittolive,ob_logic(a5) rts waittolive bsr atmachine bsr defender subq #1,ob_delay(a5) bgt.s .rts move.l #playerlogic,ob_logic(a5) .rts rts atmachine ;standing at machine logic ; bsr playertimers ;do timer stuff... bsr getcntrl ;player control ; ;OK, rotate slightly in front of machine! ; move joyx(pc),d0 bne.s .rot move ob_rotspeed(a5),d0 bpl.s .rp addq #2,ob_rotspeed(a5) ble.s .rotdone clr ob_rotspeed(a5) bra.s .rotdone .rp subq #2,ob_rotspeed(a5) bge.s .rotdone clr ob_rotspeed(a5) bra.s .rotdone .rot bgt.s .rplus subq #1,ob_rotspeed(a5) cmp #-8,ob_rotspeed(a5) bge.s .rotdone move #-8,ob_rotspeed(a5) bra.s .rotdone .rplus addq #1,ob_rotspeed(a5) cmp #8,ob_rotspeed(a5) ble.s .rotdone move #8,ob_rotspeed(a5) .rotdone ; move ob_rotspeed(a5),d0 move d0,d4 add ob_telerot(a5),d0 move d0,ob_rot(a5) ; move d4,d5 add d4,d4 add d5,d4 add d4,d4 ; sub #64,d0 and #255,d0 move.l camrots(pc),a0 lea 0(a0,d0*8),a0 move d4,d5 muls 2(a0),d4 neg.l d4 swap d4 muls 6(a0),d5 swap d5 add ob_telex(a5),d4 add ob_telez(a5),d5 move d4,ob_x(a5) move d5,ob_z(a5) rts maxdefobjects equ 128 rsreset ; de_next rs.l 1 de_prev rs.l 1 de_xa rs.l 1 de_ya rs.l 1 de_x rs.l 1 de_y rs.l 1 de_shape rs.w 1 de_delay rs.w 1 de_colltype rs.w 1 de_collwith rs.w 1 de_logic rs.l 1 ; de_size rs.b 0 defshapes ; dc 65,36,6,3 ;0 dc 65,40,6,3 ;1 dc 66,44,3,1 ;2 dc 66,46,3,1 ;3 dc 72,37,5,5 ;4 dc 84,37,1,1 ;5 dc 86,39,1,1 ;6 dc 81,39,1,1 ;7 dc 79,37,1,1 ;8 dc 71,44,2,1 ;9 dc 65,49,15,12 ;10 dc 86,49,11,10 ;11 dc 79,42,2,5 ;12 dc 85,42,2,5 ;13 landerstoadd dc 10 ;how manylanders left! landerstokill dc 10 landerdelay dc 25 ;wait between landers landercnt dc 1 ; defstack dc.l 0 deflbut dc.l 0 ;last button status! playerxa dc.l 0 ;x speed! playerx dc 0,0 playery dc 14,0 playershape dc 0 playerlives dc 0 movedefplayer move joyx(pc),d0 beq.s .nox bpl.s .xrite move #1,playershape sub.l #$8000,playerxa bpl.s .xmore cmp.l #-$30000,playerxa bge.s .xdone move.l #-$30000,playerxa bra.s .xdone .xmore sub.l #$4000,playerxa bra.s .xdone ; .xrite clr playershape add.l #$8000,playerxa ble.s .xmore2 cmp.l #$30000,playerxa ble.s .xdone move.l #$30000,playerxa bra.s .xdone .xmore2 add.l #$4000,playerxa bra.s .xdone ; .nox ;to rest! move.l playerxa(pc),d0 beq.s .xdone bpl.s .xp add.l #$1000,playerxa ble.s .xdone clr.l playerxa .xp sub.l #$1000,playerxa bge.s .xdone clr.l playerxa .xdone ; move.l playerxa(pc),d0 add.l d0,playerx and #255,playerx ; move joyy(pc),d0 add d0,playery cmp #1,playery blt.s .yf cmp #34,playery blt.s .ydone move #34,playery bra.s .ydone .yf move #1,playery .ydone ; move joyb(pc),d0 beq .nofire move deflbut(pc),d0 bne .rts st deflbut ; addfirst defobjects beq.s .rts move.l #$20000,d0 ;bullet speed! move playershape(pc),d1 beq.s .rite neg.l d0 .rite add.l playerxa(pc),d0 move.l d0,de_xa(a0) move playerx(pc),de_x(a0) move playery(pc),de_y(a0) addq #1,de_y(a0) move playershape(pc),d0 addq #2,d0 move d0,de_shape(a0) move #2,de_colltype(a0) move.l #defbull,de_logic(a0) move #12,de_delay(a0) move.l shootsfx3(pc),a0 moveq #32,d0 moveq #0,d1 bra playsfx ; .nofire clr deflbut .rts rts deffrag add.l #$1000,de_ya(a5) move.l de_ya(a5),d0 add.l d0,de_y(a5) cmp #36,de_y(a5) bge killdefobject move.l de_xa(a5),d0 add.l d0,de_x(a5) and #255,de_x(a5) rts impfrag subq #1,de_delay(a5) ble killdefobject move.l de_xa(a5),d0 add.l d0,de_x(a5) and #255,de_x(a5) move.l de_ya(a5),d0 add.l d0,de_y(a5) rts blowuplander move.l diesfx(pc),a0 moveq #64,d0 moveq #1,d1 bsr playsfx subq #1,landerstokill moveq #7,d7 ;8 pixel exp .loop2 addlast defobjects beq killdefobject move de_x(a5),de_x(a0) move de_y(a5),de_y(a0) bsr rndw ext.l d0 lsl.l #1,d0 move.l d0,de_xa(a0) bsr rndw ext.l d0 lsl.l #1,d0 move.l d0,de_ya(a0) move d7,d0 and #1,d0 addq #5,d0 move d0,de_shape(a0) move.l #deffrag,de_logic(a0) move #15,de_delay(a0) clr de_colltype(a0) dbf d7,.loop2 bra killdefobject blowupplayer moveq #3,d7 ; .loop move.l robodiesfx(pc),a0 moveq #64,d0 moveq #2,d1 bsr playsfx dbf d7,.loop ; moveq #31,d7 .loop2 addlast defobjects beq .rts move playerx(pc),de_x(a0) move playery(pc),de_y(a0) bsr rndw ext.l d0 lsl.l #1,d0 move.l d0,de_xa(a0) bsr rndw ext.l d0 lsl.l #1,d0 move.l d0,de_ya(a0) move d7,d0 and #1,d0 addq #7,d0 move d0,de_shape(a0) move.l #deffrag,de_logic(a0) move #15,de_delay(a0) clr de_colltype(a0) dbf d7,.loop2 .rts move #-1,playershape subq #1,playerlives rts landerwait subq #1,de_delay(a5) ble.s .skip rts .skip move.l #landerlogic,de_logic(a5) move #4,de_shape(a5) landerlogic ; move playershape(pc),d0 bmi .done ; move de_x(a5),d0 move d0,d2 move de_y(a5),d1 move d1,d3 ; sub playerx(pc),d0 bpl.s .skipn1 neg d0 .skipn1 cmp #6,d0 bcc.s .chk sub playery(pc),d1 bpl.s .skipn2 neg d1 .skipn2 cmp #4,d1 bcs blowupplayer ; ;check if shot! .chk lea defobjects(pc),a0 .loop move.l (a0),a0 tst.l (a0) beq .done move de_colltype(a0),d0 beq.s .loop ; move d2,d0 sub de_x(a0),d0 bpl.s .skip neg d0 .skip cmp #6,d0 bcc.s .loop ; move d3,d1 sub de_y(a0),d1 bpl.s .skip2 neg d1 .skip2 cmp #4,d1 bcc.s .loop ; ;BOOM! ; bra blowuplander .done ; move de_x(a5),d0 sub playerx(pc),d0 and #255,d0 cmp #128,d0 bcs.s .left ; ;go right-ish! ; add.l #$4000,de_xa(a5) cmp.l #$10000,de_xa(a5) ble.s .xdone move.l #$10000,de_xa(a5) bra.s .xdone ; .left sub.l #$4000,de_xa(a5) cmp.l #-$10000,de_xa(a5) bge.s .xdone move.l #-$10000,de_xa(a5) ; .xdone move.l de_xa(a5),d0 add.l d0,de_x(a5) and #255,de_x(a5) ; move de_y(a5),d0 sub playery(pc),d0 bpl.s .up ; ;down ; add.l #$2000,de_ya(a5) cmp.l #$8000,de_ya(a5) ble.s .ydone move.l #$8000,de_ya(a5) bra.s .ydone ; .up sub.l #$2000,de_ya(a5) cmp.l #-$8000,de_ya(a5) bge.s .ydone move.l #-$8000,de_ya(a5) ; .ydone move.l de_ya(a5),d0 add.l d0,de_y(a5) ; rts defbull subq #1,de_delay(a5) ble.s killdefobject move.l de_xa(a5),d0 add.l d0,de_x(a5) and #255,de_x(a5) rts killdefobject move.l a5,a0 killitem defobjects move.l a0,a5 move.l defstack(pc),a7 bra def_loop initnewdef move landerdelay(pc),landercnt move landerstokill(pc),landerstoadd clearlist defobjects clr.l playerx clr.l playerxa clr playershape move #18,playery rts defender ;defender game! ; move.l a5,-(a7) ; move landerstoadd(pc),d0 beq .nolander subq #1,landercnt bgt .nolander ; ;add a lander! ; addlast defobjects beq .nolander subq #1,landerstoadd move landerdelay(pc),landercnt ; bsr rndw and #255,d0 move d0,d2 move d0,de_x(a0) moveq #32,d0 bsr rndn move d0,d3 move d0,de_y(a0) move #5,de_shape(a0) clr.l de_xa(a0) clr.l de_ya(a0) move.l #landerwait,de_logic(a0) move #32,de_delay(a0) clr de_colltype(a0) ; ;OK, now add lander fragments! ; moveq #7,d7 ; .frloop addlast defobjects beq.s .nolander ; bsr rndw ext.l d0 lsl.l #1,d0 ;xadd move.l d0,d4 move.l d0,de_xa(a0) bsr rndw ext.l d0 lsl.l #1,d0 move.l d0,d5 move.l d0,de_ya(a0) ; neg.l d4 lsl.l #5,d4 swap d4 add d2,d4 and #255,d4 move d4,de_x(a0) neg.l d5 lsl.l #5,d5 swap d5 add d3,d5 move d5,de_y(a0) ; move d7,d0 and #1,d0 addq #5,d0 move d0,de_shape(a0) move.l #impfrag,de_logic(a0) move #32,de_delay(a0) clr de_colltype(a0) dbf d7,.frloop ; .nolander move playershape(pc),d0 bmi.s .dead bsr movedefplayer .dead ; move playerx(pc),d0 sub #22,d0 bsr drawmounts ; ;OK, scanner time! ; moveq #5,d0 moveq #3,d1 moveq #12,d2 bsr drawsprite moveq #39,d0 moveq #3,d1 moveq #13,d2 bsr drawsprite move playery(pc),d1 lsr #3,d1 addq #1,d1 moveq #22,d0 moveq #7,d2 bsr drawsprite ; lea defobjects(pc),a5 .scanloop move.l (a5),a5 tst.l (a5) beq.s .scandone cmp #4,de_shape(a5) bne.s .scanloop move de_x(a5),d0 sub playerx(pc),d0 lsr #3,d0 move de_y(a5),d1 lsr #3,d1 add #16,d0 and #31,d0 addq #6,d0 addq #1,d1 moveq #5,d2 bsr drawsprite bra.s .scanloop .scandone ; move.l a7,defstack lea defobjects(pc),a5 ; def_loop move.l (a5),a5 tst.l (a5) beq.s .done ; move.l de_logic(a5),a0 jsr (a0) ; move de_x(a5),d0 sub playerx(pc),d0 and #255,d0 cmp #128,d0 bcs.s .nob or #$ff00,d0 .nob add #22,d0 move de_y(a5),d1 move de_shape(a5),d2 bsr drawsprite ; bra.s def_loop .done ; move playershape(pc),d0 bmi.s .dead ; move landerstokill(pc),d0 bgt.s .bye2 subq #1,landerstokill subq #1,d0 and #$10,d0 beq.s .bye2 moveq #22,d0 moveq #18,d1 moveq #11,d2 bsr drawsprite .bye2 ; moveq #22,d0 move playery(pc),d1 move playershape(pc),d2 bsr drawsprite bra.s .bye ; .dead subq #1,playershape cmp #-96,playershape bcc.s .no move playerlives(pc),d3 beq.s .gameover ; bsr initnewdef bra.s .bye ; .no move playerlives(pc),d3 bne.s .showlives .gameover and #$10,d2 beq.s .exit moveq #22,d0 moveq #18,d1 moveq #10,d2 bsr drawsprite bra.s .exit ; .bye move playerlives(pc),d3 beq.s .exit .showlives subq #1,d3 moveq #1,d1 ; .lives moveq #2,d0 moveq #9,d2 movem d1/d3,-(a7) bsr drawsprite movem (a7)+,d1/d3 addq #2,d1 dbf d3,.lives ; .exit move.l (a7)+,a5 rts drawsprite ;d0=x, d1=y, d2=shape ; exg d0,d2 move d1,d3 lea defshapes(pc),a0 movem 0(a0,d0*8),d0-d1/d4-d5 ; ;d0=src x, d1=src y, d2=dest x,d3=dest y,d4=w, d5=h ; sub #64,d0 movem.l deftxt(pc),a0-a1 add d0,d1 lsl #6,d0 add d0,d1 add d1,a1 ; ;handles... move d4,d0 lsr #1,d0 sub d0,d2 move d5,d1 lsr #1,d1 sub d1,d3 ; tst d2 bmi.s .xmi move d2,d0 add d4,d0 sub #44,d0 ble.s .xok sub d0,d4 bgt.s .xok .xrts rts .xmi add d2,d4 ;reduce width ble.s .xrts move d2,d0 lsl #6,d2 add d0,d2 sub d2,a1 bra.s .xdone .xok move d2,d0 lsl #6,d2 add d0,d2 add d2,a0 .xdone ; tst d3 bmi.s .ymi move d3,d0 add d5,d0 sub #36,d0 ble.s .yok sub d0,d5 bgt.s .yok .yrts rts .ymi add d3,d5 ;reduce width ble.s .yrts sub d3,a1 bra.s .ydone .yok add d3,a0 .ydone ; moveq #65,d7 sub d5,d7 subq #1,d4 ;w subq #1,d5 ;h .loop move d5,d6 .loop2 move.b (a1)+,d0 beq.s .col0 move.b d0,(a0) .col0 addq #1,a0 dbf d6,.loop2 add.l d7,a0 add.l d7,a1 dbf d4,.loop ; rts drawmounts ;d0=offset ; ;parallax top 25, bottom 11 ; move d0,d2 lsr #1,d0 ; and #63,d0 movem.l deftxt(pc),a0-a1 move d0,d1 lsl #6,d1 add d0,d1 ;* 65 add d1,a1 ; ;OK, draw mountains at d0 ; moveq #65-25,d7 move.l #64*65,d6 moveq #43,d1 ;w ; .loop move.b (a1)+,(a0)+ ;to even address - 1 move (a1)+,(a0)+ ;to long address - 3 move.l (a1)+,(a0)+ ;7 move.l (a1)+,(a0)+ ;11 move.l (a1)+,(a0)+ ;15 move.l (a1)+,(a0)+ ;19 move.l (a1)+,(a0)+ ;23 move (a1)+,(a0)+ ;25! ; add.l d7,a0 add.l d7,a1 addq #1,d0 and #63,d0 bne.s .skip sub.l d6,a1 .skip dbf d1,.loop ; move d2,d0 and #63,d0 ; movem.l deftxt(pc),a0-a1 move d0,d1 lsl #6,d1 add d0,d1 ;* 65 add d1,a1 lea 25(a0),a0 ;bottom 25! lea 25(a1),a1 ; ;OK, draw mountains at d0 ; moveq #65-11,d7 moveq #43,d1 ;w ; .loop2 move (a1)+,(a0)+ ;2 move.l (a1)+,(a0)+ ;6 move.l (a1)+,(a0)+ ;10 move.b (a1)+,(a0)+ ;11 ; add.l d7,a0 add.l d7,a1 addq #1,d0 and #63,d0 bne.s .skip2 sub.l d6,a1 .skip2 dbf d1,.loop2 ; rts chatmap dc.l 0 chatxout dc 0 chatxin dc 0 chatontxt dc.b 'CHAT MODE ENABLED',0 even chatcls move.l chatmap,a0 moveq #0,d0 move #20*2*5-1,d1 .loop move.l d0,(a0)+ dbf d1,.loop clr.l chatxout rts chaton ;enable chat mode! ; tst linked beq .rts tst chatok bne .rts ; bsr chatcls lea chatontxt(pc),a2 .loop move.b (a2)+,d0 beq.s .done moveq #3,d1 bsr chatprintout bra.s .loop .done clr chatoutput clr chatoutget clr chatinput clr chatinget st chatok ; .rts rts chatoff ;disable chat mode ; tst linked beq.s chatoffrts tst chatok beq.s chatoffrts ; dochatoff sf chatok bsr chatcls ; chatoffrts rts chatscrollin ;scroll chatin window across a byte. ; move d2,-(a7) move.l chatmap,a0 lea 40(a0),a0 bra.s chatsc chatscrollout ;scroll chatout window across a byte. ; move d2,-(a7) move.l chatmap,a0 chatsc moveq #4,d0 ;5 lines to scroll .loop3 moveq #1,d1 ;2 bitpanes .loop2 moveq #38,d2 ;39 chars to move... .loop move.b 1(a0),(a0)+ dbf d2,.loop clr.b (a0)+ lea 40(a0),a0 dbf d1,.loop2 dbf d0,.loop3 move (a7)+,d2 rts chatspcout cmp #40,chatxout bcc.s chatscrollout addq #1,chatxout rts calcchar ext d0 cmp #'A',d0 bcs.s .notal and #31,d0 add #9,d0 rts .notal cmp #'.',d0 bne.s .not1 moveq #36,d0 rts .not1 cmp #'!',d0 bne.s .not2 moveq #37,d0 rts .not2 cmp #'?',d0 bne.s .not3 moveq #38,d0 rts .not3 cmp #',',d0 bne.s .not4 moveq #39,d0 rts .not4 sub #48,d0 rts chatprintout ;d0.b=chr$() to print, d1=colour (1,2,3) ; cmp.b #32,d0 beq.s chatspcout bsr calcchar ; movem.l d2/a2,-(a7) ; cmp #40,chatxout bcs.s .nosc ; movem d0-d1,-(a7) bsr chatscrollout movem (a7)+,d0-d1 subq #1,chatxout .nosc ; lea chatfont,a0 ext d0 add d0,a0 move.l chatmap,a1 ;bp1 add chatxout(pc),a1 addq #1,chatxout cmp #1,d1 beq.s .skip lea 80(a1),a2 cmp #2,d1 beq.s .skip2 move.l a2,a1 .skip move.l a1,a2 .skip2 moveq #4,d0 ;5 lines .loop move.b (a0),(a1) move.b (a0),(a2) lea 40(a0),a0 lea 160(a1),a1 lea 160(a2),a2 dbf d0,.loop ; movem.l (a7)+,d2/a2 rts chatspcin cmp #40,chatxin bcc chatscrollin addq #1,chatxin rts chatprintinhex move d0,-(a7) lsr #4,d0 bsr .skip move (a7)+,d0 ; .skip and #15,d0 add #48,d0 cmp #58,d0 bcs.s chatprintin addq #7,d0 ; chatprintin ;d0.b=chr$() to print, d1=colour (1,2,3) ; cmp.b #32,d0 beq.s chatspcin bsr calcchar ; movem.l d2/a2,-(a7) ; cmp #40,chatxin bcs.s .nosc ; movem d0-d1,-(a7) bsr chatscrollin movem (a7)+,d0-d1 subq #1,chatxin .nosc ; lea chatfont,a0 ext d0 add d0,a0 move.l chatmap,a1 ;bp1 add chatxin(pc),a1 lea 40(a1),a1 addq #1,chatxin cmp #1,d1 beq.s .skip lea 80(a1),a2 cmp #2,d1 beq.s .skip2 move.l a2,a1 .skip move.l a1,a2 .skip2 moveq #4,d0 ;5 lines .loop move.b (a0),(a1) move.b (a0),(a2) lea 40(a0),a0 lea 160(a1),a1 lea 160(a2),a2 dbf d0,.loop ; movem.l (a7)+,d2/a2 rts ;-------------- serial stuff -------------------; sblen equ 128 ;serial buffer length initser push ; clr rget clr rput clr rbfcnt clr chatcnt ; move.l 4.w,a6 moveq #11,d0 lea rbfintserver(pc),a1 jsr -162(a6) ; move #$0801,$dff09c move #$0001,$dff09a ;no tbe int. move #$8800,$dff09a ;rbf int only ; pull rts finitser push ; move #$0801,$dff09a move #$0801,$dff09c ; move.l 4.w,a6 moveq #11,d0 sub.l a1,a1 jsr -162(a6) ; pull rts serput ;send byte in d0 ; ;.wait btst #4,$dff018 ; beq.s .wait ; move #1,$dff09c ; and #$ff,d0 or #$100,d0 move d0,$dff030 ; .wait btst #0,$dff01f beq.s .wait move #1,$dff09c ; rts rbfchk ;return ne if something there! ; move rbfcnt(pc),d0 rts serwait bsr rbfchk beq.s serwait ; serget lea rbuff(pc),a0 move rget(pc),d0 and #sblen-1,d0 move.b 0(a0,d0),d0 addq #1,rget subq #1,rbfcnt ; rts chatcnt dc 0 rbfcnt dc 0 rbf ;receive buffer full interupt ; ;a1=rbuff ; movem.l d0-d1/a0-a1,-(a7) ; move $dff018,d0 ;ser byte bmi .fuck move #$800,$dff09c ; move chatok(pc),d1 beq.s .chskip bclr #6,d0 beq.s .chskip add.b #32,d0 ; lea chatin(pc),a1 move chatinput(pc),d1 and #31,d1 move.b d0,0(a1,d1) addq #1,chatinput addq #1,chatcnt bra.s .bye ; .chskip lea rbuff(pc),a1 move rput(pc),d1 and #sblen-1,d1 move.b d0,0(a1,d1) addq #1,rput addq #1,rbfcnt ; .bye movem.l (a7)+,d0-d1/a0-a1 rts ; .fuck warn #$f00 ;ser overflow error! warn #$fff bra.s .fuck rbuff ds.b sblen rput dc 0 rget dc 0 medat dc.l 0 titlemed dc.l 0 loadingmed dc.l 0 fadevol dc 0 ;non-zero=fade to 0! relocate ;a0=pointer to what to relocate ; bsr flushc ; move.l (a0),d0 beq .rts move.l d0,a1 add.l #32,(a0) lea 28(a1),a0 move.l (a0)+,d0 lea 0(a0,d0.l*4),a1 cmp.l #$3ec,(a1)+ bne.s .rts move.l (a1)+,d0 addq #4,a1 move.l a0,d2 ; .loop move.l (a1)+,d1 ;offset add.l d2,0(a0,d1) subq.l #1,d0 bne.s .loop ; .rts bsr flushc ; rts initmed lea medat,a0 tst.l (a0) bne.s .noreloc ; move.l #medplayer,(a0) bsr relocate ; .noreloc move.l medat(pc),a1 move.l chipzero(pc),a0 jsr (a1) ; move.l medat(pc),a1 move.l titlemed(pc),a0 jsr 4(a1) ; move.l loadingmed(pc),d0 beq.s .no move.l d0,a0 move.l medat(pc),a1 jsr 4(a1) .no ; rts agafiles dc.l gloom dc.b 'pics/title',0 even dc.l gloompal dc.b 'pics/title.pal',0 even dc.l gloombrush dc.b 'pics/gloombrush',0 even dc.l planar_palette dc.b 'misc/palette_8',0 even dc.l planar_remap dc.b 'misc/remap_8',0 even dc.l 0 ecsfiles dc.l gloom dc.b 'pics_ehb/title',0 even dc.l gloompal dc.b 'pics_ehb/title.pal',0 even dc.l planar_palette dc.b 'misc/palette_6',0 even dc.l planar_remap dc.b 'misc/remap_6',0 even dc.l 0 progfiles dc.l gloomcfg dc.b 'gloomcfg',0 even dc.l bigfont_+1 dc.b 'misc/bigfont2.bin',0 even dc.l panel dc.b 'misc/smallfont2.bin',0 even dc.l titlemed+1 dc.b 'sfxs/med1',0 even dc.l loadingmed+1 dc.b 'sfxs/med2',0 even dc.l shootsfx+1 dc.b 'sfxs/shoot.bin',0 even dc.l shootsfx2+1 dc.b 'sfxs/shoot2.bin',0 even dc.l shootsfx3+1 dc.b 'sfxs/shoot3.bin',0 even dc.l shootsfx4+1 dc.b 'sfxs/shoot4.bin',0 even dc.l shootsfx5+1 dc.b 'sfxs/shoot5.bin',0 even dc.l gruntsfx+1 dc.b 'sfxs/grunt.bin',0 even dc.l gruntsfx2+1 dc.b 'sfxs/grunt2.bin',0 even dc.l gruntsfx3+1 dc.b 'sfxs/grunt3.bin',0 even dc.l gruntsfx4+1 dc.b 'sfxs/grunt4.bin',0 even dc.l tokensfx+1 dc.b 'sfxs/token.bin',0 even dc.l doorsfx+1 dc.b 'sfxs/door.bin',0 even dc.l footstepsfx+1 dc.b 'sfxs/footstep.bin',0 even dc.l diesfx+1 dc.b 'sfxs/die.bin',0 even dc.l splatsfx+1 dc.b 'sfxs/splat.bin',0 even dc.l telesfx+1 dc.b 'sfxs/teleport.bin',0 even dc.l ghoulsfx+1 dc.b 'sfxs/ghoul.bin',0 even dc.l lizsfx+1 dc.b 'sfxs/lizard.bin',0 even dc.l lizhitsfx+1 dc.b 'sfxs/lizhit.bin',0 even dc.l trollsfx+1 dc.b 'sfxs/trollmad.bin',0 even dc.l trollhitsfx+1 dc.b 'sfxs/trollhit.bin',0 even dc.l robotsfx+1 dc.b 'sfxs/robot.bin',0 even dc.l robodiesfx+1 dc.b 'sfxs/robodie.bin',0 even dc.l dragonsfx+1 dc.b 'sfxs/dragon.bin',0 even dc.l 0 datafiles dc.l script scriptname dc.b 'misc/script',0 even ; ifeq cd32 dc.l gloomgame gamename dc.b 'gloomgame',0 even endc ; dc.l 0 loadfiles ; push move.l a0,a2 ; .loop move.l (a2)+,d0 beq.s .done moveq #1,d1 bclr #0,d0 beq.s .nochip moveq #2,d1 .nochip move.l d0,a3 move.l a2,a0 bsr loadfile move.l d0,(a3) .z tst.b (a2)+ bne.s .z exg a2,d0 addq.l #1,d0 bclr #0,d0 exg a2,d0 bra.s .loop ; .done pull rts diskmenu dc.b 1 dc.b 'please insert gloom data disk',0 even magicfiles dc.l magic dc.b 'pics/blackmagic',0 even dc.l 0 agamagicfiles dc.l magicpal dc.b 'pics/blackmagic.pal',0 even dc.l 0 ecsmagicfiles dc.l magicpal dc.b 'pics_ehb/blackmagic.pal',0 even dc.l 0 initmain ; ;calc stuff from aga/os settings ; moveq #8,d0 ;bitplanes move #256,d1 ;colours move.l #320,d2 ;linemod move.l #40,d3 ;bpmod lea db_aga,a0 lea pokepal_aga,a1 tst aga bne.s .aga1 moveq #6,d0 moveq #32,d1 move.l #240,d2 lea db_ecs,a0 lea pokepal_ecs,a1 .aga1 tst os beq.s .os1 moveq #40,d2 ;linemod move.l #40*240,d3 ;bpmod lea db_os,a0 lea pokepal_os,a1 .os1 ; move d0,bitplanes move d1,colours move.l d2,linemod move.l d3,bpmod move.l a0,todb move.l a1,topokepal ; move.l 4.w,a6 move.l 276(a6),a0 move.l #-1,184(a0) ;requesters OFF for our task. ; bsr initrawmap ;init keyboard reader lea ciaaname,a1 jsr -498(a6) move.l d0,ciaa ; tst os beq.s .osskipz move.l #12*257,d0 moveq #1,d1 allocmem temppal move.l d0,temppal .osskipz ; move.l #8,d0 move.l #$10002,d1 allocmem chipzero move.l d0,chipzero ; move.l #256,d0 moveq #1,d1 allocmem maptable move.l d0,maptable ; move.l #32768,d0 moveq #1,d1 allocmem memory move.l d0,memory ; move.l #320*vd_size,d0 moveq #1,d1 allocmem vertdraws move.l d0,vertdraws ; move.l #maxz*2,d0 moveq #1,d1 allocmem darktable move.l d0,darktable ; move.l #320*240,d0 moveq #1,d1 allocmem chunky move.l d0,chunky ;chunky buffer ; move.l #256*16,d0 moveq #1,d1 allocmem palettes ; ;16 shades... lea palettes(pc),a0 moveq #15,d1 .p_loop move.l d0,(a0)+ add.l #256,d0 dbf d1,.p_loop ; move.l #map_rgbs_,map_rgbs ; st paused clr dispnest clr.l font bsr initsfx bsr initvbint bsr initdisplay ; lea magicfiles,a0 bsr loadfiles lea agamagicfiles,a0 tst aga bne.s .agaa lea ecsmagicfiles,a0 .agaa bsr loadfiles ; move.l magic,a0 move.l magicpal,a1 jsr showpic bsr dispon ; move #50,vbcounter ; lea progfiles,a0 bsr loadfiles lea agafiles,a0 tst aga bne.s .lf lea ecsfiles,a0 .lf bsr loadfiles ; ;load in c2p routine ; move.l gloomcfg(pc),a0 lea text,a1 move.l #'c2p/',(a1)+ addq #2,a0 .cc move.b (a0)+,(a1) cmp.b #10,(a1)+ bne.s .cc clr.b -(a1) ; lea text,a0 moveq #1,d1 bsr loadfile move.l d0,planar_c2p ; move.l planar_c2p(pc),a2 lea 36(a2),a0 tst aga bne.s .aga lea 40(a2),a0 .aga move.l a0,c2p ; lea coloffs,a0 ;columns table move #320,d0 ;320 columns lea paladjust,a1 jsr 32(a2) ;inittables ; bsr initmed bsr initser bsr calcbaud bsr initdarktable ; bset #15,remapped bne .noremap ; move.l map_rgbs(pc),a0 move #-1,(a0)+ move.l a0,map_rgbsat ; move.l panel,a0 jsr remapanim lea bullet1,a0 jsr remapanim lea bullet2,a0 jsr remapanim lea bullet3,a0 jsr remapanim lea bullet4,a0 jsr remapanim lea bullet5,a0 jsr remapanim lea sparks1,a0 jsr remapanim lea sparks2,a0 jsr remapanim lea sparks3,a0 jsr remapanim lea sparks4,a0 jsr remapanim lea sparks5,a0 jsr remapanim ; move.l map_rgbsat(pc),map_rgbsat2 .noremap ; move.l map_rgbsat2(pc),map_rgbsat ; moveq #0,d0 bsr loadanobj ;load player1 moveq #1,d0 bsr loadanobj ;load player2 moveq #2,d0 bsr loadanobj ;load tokens (health) ; move.l map_rgbsat(pc),map_rgbsfrom move.l map_rgbsat(pc),map_rgbsfrom2 ; alloclist objects,#maxobjects,#ob_size alloclist doors,#maxdoors,#do_size alloclist blood,#maxblood,#bl_size alloclist gore,#maxgore,#go_size alloclist rotpolys,#maxrotpolys,#rp_size alloclist defobjects,#maxdefobjects,#de_size ; .w5sex tst vbcounter bgt .w5sex ; bsr dispoff ; move.l magic,a1 freemem magic move.l magicpal,a1 freemem magicpal ; move #$1234,d0 bsr seedrnd2 ; ifne cd32 lea nvname,a1 move.l 4.w,a6 jsr -408(a6) move.l d0,nv bsr loadgloomgame endc ; bra forbid ifeq cd32 checkdatadisk ;return eq if gloomdata: found! ; move.l dosbase(pc),a0 move.l 34(a0),a0 move.l 24(a0),a0 add.l a0,a0 add.l a0,a0 addq #4,a0 ; .loop move.l (a0),d0 beq.s .done lsl.l #2,d0 move.l d0,a0 move.l 40(a0),a1 add.l a1,a1 add.l a1,a1 cmp.b #9,(a1)+ ;9 chars bne.s .loop lea lockname(pc),a2 moveq #8,d0 ;check 9 chars! .loop2 cmp.b (a1)+,(a2)+ bne.s .loop dbf d0,.loop2 rts ; .done moveq #-1,d0 rts askdatadisk ; ;make sure data disk is available... ; ;if 'gloomgame' is in CD, then use CD, else... ;wait for 'gloomdata:' to get inserted! ; bsr permit move.l #gamename,d1 move.l #1005,d2 move.l dosbase(pc),a6 jsr -30(a6) move.l d0,d1 beq.s .nolock jsr -36(a6) ;close it! bra .load ; .nolock bsr forbid bsr checkdatadisk beq .dataok ;already there? ; lea diskmenu,a0 bsr qmenu ; ;OK, gotta swap disks and pick up data files! ; .wfd bsr permit move.l grbase(pc),a6 jsr -270(a6) bsr forbid bsr checkdatadisk bne.s .wfd ; bsr finitqmenu ; .dataok bsr permit bsr undir ;release old lock! move.l #lockname,d1 moveq #-2,d2 move.l dosbase(pc),a6 jsr -84(a6) ;lock? move.l d0,d1 beq.s .wfd jsr -126(a6) ;make current dir! move.l d0,oldlock ; .load lea datafiles,a0 bsr loadfiles bra forbid undir move.l oldlock(pc),d1 beq.s .rts clr gloomdata clr.l oldlock move.l dosbase(pc),a6 jsr -126(a6) ;CD to old current dir move.l d0,d1 jsr -90(a6) ;unlock old (mine!) .rts rts oldlock dc.l 0 lockname dc.b 'gloomdata:',0 even endc lagtext dc.b 'lAG?',0 even syncup ;time to calculate frame lag! ; ;master can establish lag time... ; move linked(pc),d0 bne.s .li .rts rts .li ; ;bsr qsync bsr qsync2 ; moveq #31,d5 ; tst linked bmi .slave ; ;MASTER - average out 32 sends of random data! ; moveq #0,d6 ;sum ; .mloop moveq #0,d7 bsr vwait bsr serput ; .mwait addq #1,d7 bsr vwait bsr rbfchk beq.s .mwait ; bsr serget add d7,d6 dbf d5,.mloop ; add #64,d6 lsr #7,d6 ;/32 = avg. /2=half, /2=25 FPS addq #1,d6 ;safety... ; move d6,d0 move d0,lagtime bsr serput bra initlag ; .slave ;OK, bounce back 32 items... ; moveq #31,d5 .sloop bsr serwait bsr serput dbf d5,.sloop ; ;now, wait to get told lagtime! ; bsr serwait and #255,d0 move d0,lagtime ; initlag ;what to do... ; ;stick 'lagtime' dummy 'noevents' into rec buff! ;stick 'lagtime' dummy 'noevents' into pcntrl buffer ; move #$4000,$dff09a ; lea pbuff(pc),a0 ;controller buffer lea rbuff(pc),a1 ;ser rec. buffer moveq #31,d1 ;32*4=128 bytes! moveq #0,d0 .loop move.l d0,(a0)+ move.l d0,(a1)+ dbf d1,.loop ; move lagtime(pc),d0 ; clr pget clr rget clr chatcnt move d0,pput ;add d0,d0 move d0,rbfcnt move d0,rput ; move #$c000,$dff09a ; rts syncmenu dc.b 1 dc.b 'waiting for other player',0 even lagtime dc 0 qsync ;OK, quick sync up! ; move linked(pc),d0 beq.s .rts ; .more bsr rbfchk ;anything there? beq.s .no bsr serget cmp.b #$8f,d0 bne.s .more move.b #$8f,d0 bra serput ; .no lea syncmenu,a0 bsr qmenu move.b #$8f,d0 bsr serput ; .loop bsr serwait cmp.b #$8f,d0 bne.s .loop ; bra finitqmenu ; .rts rts qsync2 ;OK, quick sync up, but now 'waiting' menu ; move linked(pc),d0 beq.s .rts ; move.b #$8f,d0 bsr serput ; .loop bsr serwait cmp.b #$8f,d0 bne.s .loop ; .rts rts combatnokmenu dc.b 1 dc.b 'sorry...not available in demo',0 even initnewgame ; ifeq combatok ; cmp #2,gametype bne.s .skipnok lea combatnokmenu(pc),a0 bsr qmenu ; bsr selmenu ; bsr finitqmenu move #-1,gametype rts .skipnok ; endc ; move gametype(pc),twowins beq.s .skip tst linked beq.s .skip clr cheat ; nop ; ifeq debugser clr twowins endc .skip ; tst.l map_test bne.s .skhit ; bset #15,gloomdata bne.s .gotdata .skhit ; ifne cd32 bsr permit lea datafiles,a0 bsr loadfiles bsr forbid elseif bsr askdatadisk endc .gotdata ; bsr qsync ; move.l medat(pc),a1 jsr 12(a1) cmp #2,gametype bne normalgame ; ;combat type game! ; move #6,p1_ob_collwith move #5,p2_ob_collwith ; lea combatmenu,a0 bsr qmenu ; .loop bsr selmenu cmp #3,d0 bcs .play bne.s .loop ; ;change number of wins... ; addq.b #1,comnum cmp.b #'9',comnum bls .loop move.b #'2',comnum bra .loop ; .play add #49,d0 move.b d0,comseriesnum ; bsr finitqmenu move.b comnum(pc),d0 sub.b #'0',d0 ext d0 move d0,p1lives move d0,p2lives ; lea combatfiles(pc),a0 bsr permit bsr loadfiles bra forbid normalgame ; ;check for continue offsets in 'gloomgame' file! ; tst linked bge.s .master ; bsr qsync bsr longget add.l script(pc),d0 move.l d0,scriptat bra initpstuff .master ; move.l script(pc),scriptat ;default move.l gloomgame(pc),a0 lea conttxts(pc),a1 lea conts(pc),a2 moveq #0,d7 ; .loop move.l (a0)+,d0 cmp.l #'game',d0 beq.s .done ; ;another! ; addq #1,d7 add.l script(pc),d0 move.l d0,(a2)+ lea context(pc),a3 .loop2 move.b (a3)+,(a1)+ bne.s .loop2 subq #1,a1 move.l d0,a3 .loop3 move.b (a3)+,(a1) cmp.b #10,(a1)+ bne.s .loop3 clr.b -1(a1) bra.s .loop ; .done move linked(pc),-(a7) tst d7 beq .more addq #1,d7 move.b d7,contmenu ; ;OK, need a continue game menu... ; clr linked move.l gloom(pc),a0 move.l gloompal(pc),a1 lea contmenu,a2 bsr pmenu bsr selmenu bsr finitpmenu ; move curropt(pc),d0 beq .more lea conts(pc),a0 move.l -4(a0,d0*4),a0 .leol cmp.b #10,(a0)+ bne.s .leol move.l a0,scriptat ; .more move (a7)+,linked beq.s initpstuff bsr qsync move.l scriptat(pc),d0 sub.l script(pc),d0 bsr longput initpstuff ; move #4,p1_ob_collwith move #4,p2_ob_collwith move #3,p1lives move #3,p2lives move #25,p1health move #25,p2health move #0,p1weapon move #0,p2weapon move.b #ireload,p1reload move.b #ireload,p2reload ; rts combatfiles dc.l combat dc.b 'pics/combat',0 even dc.l combatpal dc.b 'pics/combat.pal',0 even dc.l 0 conts ds.l 8 ;8 slots! combatmenu dc.b 4 dc.b 'play spacehulk series',0 dc.b 'play gothic tomb series',0 dc.b 'play hell series',0 dc.b 'start with ' comnum dc.b '3 lives',0 even context dc.b 'CONTINUE FROM ',0 even contmenu dc.b 1 dc.b 'START NEW GAME',0 conttxts ds.b 160 even execscript_med ; bsr waitquiet ; move.l loadingmed(pc),d0 beq.s execscript move.l d0,a0 move.l medat(pc),a1 jsr 8(a1) ;start loading music! ; execscript cmp #2,gametype beq scriptplay ;no script for combat game! ; move.l scriptat(pc),a0 ; .loop move.b (a0)+,d0 cmp.b #10,d0 beq.s .loop and #31,d0 bne.s .more .loop2 cmp.b #10,(a0)+ bne.s .loop2 bra.s .loop .more cmp #27,d0 bcc.s .loop2 add #96,d0 ; ;command! fetch the rest... ; move.b (a0)+,d1 and #31,d1 add #96,d1 lsl.l #8,d0 or d1,d0 ; move.b (a0)+,d1 and #31,d1 add #96,d1 lsl.l #8,d0 or d1,d0 ; move.b (a0)+,d1 and #31,d1 add #96,d1 lsl.l #8,d0 or d1,d0 ; addq #1,a0 ;skip '_' move.l a0,scriptat cmp.l #'pict',d0 beq scriptpict cmp.l #'draw',d0 beq scriptdraw cmp.l #'text',d0 beq scripttext cmp.l #'wait',d0 beq scriptwait cmp.l #'play',d0 beq scriptplay cmp.l #'done',d0 beq scriptdone cmp.l #'dark',d0 beq scriptdark cmp.l #'show',d0 beq scriptshow cmp.l #'hide',d0 beq scripthide cmp.l #'loop',d0 beq scriptloop cmp.l #'rest',d0 beq scriptrest cmp.l #'tile',d0 beq scripttile ; warn #$f80 ; ;Hmmm....bad command .fucked ; rts ; scriptdone bsr dispoff move.l loadingmed(pc),d0 beq gameover ; move.l medat(pc),a1 clr fadevol jsr 12(a1) ;stop song bra gameover sccont dc.b 'cont_' even scriptrest ;restart point! ;this changes...we add this to 'gloomgame' file now. ; move.l a0,d1 sub.l script(pc),d1 ;offset from start of script! .leol cmp.b #10,(a0)+ bne.s .leol move.l a0,scriptat ; move.l gloomgame(pc),a1 .loop move.l (a1)+,d0 cmp.l #'game',d0 beq.s .add cmp.l d0,d1 bne.s .loop ; ;already here! ; bra execscript ; .add ;OK, gotta add new scriptat position! ; move.l d1,-(a1) ; ;save it out! ; bsr permit ifne cd32 bsr savegloomgame elseif lea gamename,a0 move.l gloomgame,a1 moveq #32,d0 bsr savefile endc bsr forbid ; bra execscript scriptloop move.l script,scriptat bra execscript scripthide bsr dispoff bra execscript scriptshow clr pdelay bsr dispon bra execscript scriptdraw move.l picpal,a1 move.l pic,d0 bne.s .use move.l gloompal,a1 move.l gloom,d0 .use move.l d0,a0 jsr showpic bsr initfontpal bra execscript fetchrest move.l scriptat,a0 moveq #-1,d0 .loop addq #1,d0 move.b (a0)+,(a1) cmp.b #10,(a1)+ bne.s .loop clr.b -(a1) move.l a0,scriptat rts text ; picname ds.b 64 pic_pal dc.b '.pal',0 even pic dc.l 0 picpal dc.l 0 freeiff push move.l pic(pc),d0 beq.s .skip1 clr.l pic move.l d0,a1 freemem pic .skip1 move.l picpal(pc),d0 beq.s .skip2 clr.l picpal move.l d0,a1 freemem picpal .skip2 pull rts freetiles push move.l floor(pc),d0 beq.s .skip1 clr.l floor move.l d0,a1 freemem floor .skip1 move.l roof(pc),d0 beq.s .skip2 clr.l roof move.l d0,a1 freemem roof .skip2 pull rts floorname dc.b 'txts/floor' floortag ds.b 32 even roofname dc.b 'txts/roof' rooftag ds.b 32 even scripttile ;tile command...load in floor/roof tiles! ; lea floortag(pc),a1 bsr fetchrest bsr loadtile bra execscript loadtile ; ;floor tag=tile extension... ; bsr freetiles lea floortag(pc),a0 lea rooftag(pc),a1 .loop move.b (a0)+,(a1)+ bne.s .loop ; bsr permit lea floorname(pc),a0 moveq #1,d1 jsr loadfile move.l d0,floor lea roofname(pc),a0 moveq #1,d1 jsr loadfile move.l d0,roof bsr forbid ; move.l map_rgbsfrom,map_rgbsat ; move.l floor(pc),a2 lea 128*128(a2),a2 move.l a2,a0 bsr addpal move.l floor(pc),a0 move.l a2,a1 bsr remap ; move.l roof(pc),a2 lea 128*128(a2),a2 move.l a2,a0 bsr addpal move.l roof(pc),a0 move.l a2,a1 bsr remap ; move.l map_rgbsat,map_rgbsfrom2 rts agapicpath dc.b 'pics/',0 ecspicpath dc.b 'pics_ehb/',0 even scriptpict ;load an iff bsr freeiff lea agapicpath(pc),a0 lea picname,a1 tst aga bne.s .aga lea ecspicpath(pc),a0 .aga move.b (a0)+,(a1)+ bne.s .aga subq #1,a1 bsr fetchrest move.l a1,-(a7) bsr permit lea picname,a0 moveq #1,d1 jsr loadfile move.l d0,pic beq.s .nopic ; lea pic_pal,a0 move.l (a7),a1 .loop move.b (a0)+,(a1)+ bne.s .loop lea picname,a0 moveq #1,d1 jsr loadfile move.l d0,picpal ; .nopic addq #4,a7 bsr forbid bra execscript scriptdark ; tst os bne execscript ; move.l coplist,a2 tst aga bne.s .aga lea palette_ecs-copinit_ecs(a2),a2 moveq #31,d0 .loop0 lsr 2(a2) and #$777,2(a2) addq #4,a2 dbf d0,.loop0 bra execscript .aga lea palette_aga-copinit_aga(a2),a2 moveq #6,d0 ;7 banks .loop moveq #31,d1 ;32 colours .loop2 move 6(a2),d2 move d2,d4 and #$111,d4 lsr #1,d2 and #$777,d2 move 132+6(a2),d3 lsr #1,d3 and #$777,d3 lsl #3,d4 or d4,d3 move d2,6(a2) move d3,132+6(a2) addq #4,a2 dbf d1,.loop2 lea 264-128(a2),a2 dbf d0,.loop bra execscript scripttext ;print text on iff ;a6=window, a4=message, d0=length of message, d6=Y ; move #2,pdelay bsr initfontpal ; lea text,a1 bsr fetchrest ; lea text,a4 move bmaphite(pc),d6 sub #11,d6 ; move.l a4,a0 moveq #0,d1 .loop move.b (a0)+,d2 beq.s .done addq #1,d1 cmp.b #'\',d2 bne.s .loop sub d1,d0 movem.l d0/d6/a0,-(a7) move d1,d0 clr.b -(a0) sub #11,d6 bsr printmess2 movem.l (a7)+,d0/d6/a4 ; .done bsr printmess2 ; tst pdelay bmi execscript clr pdelay bra execscript scriptwait ; tst pdelay bmi execscript bsr waitany bra execscript checkany movem.l d0-d7/a0-a6,-(a7) bsr vwait bsr readmenusel and #$10,d0 ;set ne if fire! movem.l (a7)+,d0-d7/a0-a6 rts waitany movem.l d0-d7/a0-a6,-(a7) .wait bsr checkany beq.s .wait .wait2 bsr checkany bne.s .wait2 movem.l (a7)+,d0-d7/a0-a6 rts copywin moveq #wi_size/2-1,d0 .loop move (a0)+,(a1)+ dbf d0,.loop rts freeobjlist lea objlist,a2 ; .loop move.l (a2)+,d0 beq.s .done move.l d0,a3 ; move.l (a3),d0 beq.s .skip move.l d0,a1 freemem obj clr.l (a3) .skip ; move.l 4(a3),d0 beq.s .loop move.l d0,a1 freemem objchunks clr.l 4(a3) bra.s .loop ; .done rts freeobjlist2 lea objlist,a2 ; .loop move.l -(a2),d0 beq.s .done move.l d0,a3 ; move.l (a3),d0 beq.s .skip move.l d0,a1 freemem obj2 clr.l (a3) .skip ; move.l 4(a3),d0 beq.s .loop move.l d0,a1 freemem objchunks2 clr.l 4(a3) bra.s .loop ; .done rts mappath dc.b 'maps/' mapname ds.b 64 even linkswap tst linked bpl.s .rts ; movem.l player1(pc),a0-a1 exg a0,a1 movem.l a0-a1,player1 ; move ob_cntrl(a0),d0 move ob_cntrl(a1),d1 move d1,ob_cntrl(a0) move d0,ob_cntrl(a1) .rts rts pickcombat ;pick combat zone... ;put name into a1... ; move.l a1,-(a7) ; tst linked bge.s .doit ; ;OK, slave...get map# from other player! ; bsr serwait move.b d0,d2 bra.s .gotmap ; .doit move $dff006,d0 bsr seedrnd ; move comsleft(pc),d0 bne.s .pick moveq #7,d0 move d0,comsleft .pick bsr rndn lea commaps(pc),a0 subq #1,comsleft move comsleft(pc),d1 move.b 0(a0,d0),d2 ;map to play! move.b 0(a0,d1),0(a0,d0) move.b d2,0(a0,d1) ; tst linked beq.s .gotmap ; move.b d2,d0 bsr serput ; .gotmap move.l (a7)+,a1 add.b #48,d2 move.b d2,comseriesmap ; lea comname(pc),a0 .loop move.b (a0)+,(a1)+ bne.s .loop ; move.l combat,a0 move.l combatpal,a1 jsr showpic move.b comseriesnum(pc),floortag clr.b floortag+1 bra loadtile commaps dc.b 1,2,3,4,5,6,7,8 comsleft dc 7 ;7 maps left! comname dc.b 'com' comseriesnum dc.b '1_' comseriesmap dc.b '1',0 even scriptplay ; ;arrives here with dispon! ; lea mapname,a1 ; cmp #2,gametype bne.s .notcombat ; ;OK, combat game is a happening... ; ;select from on-screen maps. ; bsr pickcombat bra.s .gotname ; .notcombat bsr fetchrest .gotname ; zerolist objects,ob_size zerolist doors,do_size zerolist blood,bl_size zerolist gore,go_size zerolist rotpolys,rp_size ; clr.l player1 clr.l player2 tst gametype bne.s .p2 not.l player2 ;no player 2! .p2 ; bsr permit ; move.l map_test(pc),d0 bne.s .use move.l #mappath,d0 .use move.l d0,a0 moveq #1,d1 bsr loadfile move.l d0,map_map ; bsr initmap bsr loadtxts move #$a3f7,d0 bsr seedrnd moveq #1,d0 bsr execevent bsr forbid ; move.l planar_palette(pc),a1 jsr pokepal bsr calcpalettes bsr dispoff ; ; ;init player vars... ; move.l player1,a5 ; move p1lives(pc),ob_lives(a5) ; cmp #2,gametype beq.s .psk ; move p1health(pc),d0 bne.s .p1hok move #25,p1health move.b #ireload,p1reload .p1hok move p1health(pc),ob_hitpoints(a5) move p1weapon(pc),ob_weapon(a5) move.b p1reload(pc),ob_reload(a5) ; .psk bsr resetplayer ; tst gametype beq .p1 ; move.l player2,a5 move p2lives(pc),ob_lives(a5) ; cmp #2,gametype beq.s .psk2 ; move p2health(pc),d0 bne.s .p2hok move #25,p2health move.b #ireload,p2reload .p2hok move p2health(pc),ob_hitpoints(a5) move p2weapon(pc),ob_weapon(a5) move.b p2reload(pc),ob_reload(a5) ; .psk2 bsr resetplayer .p1 ; bsr linkswap ; ;save player positions at start of level! ; move.l player1(pc),a5 move ob_x(a5),p1x move ob_z(a5),p1z move ob_rot(a5),p1r tst gametype beq.s .shit move.l player2(pc),a5 move ob_x(a5),p2x move ob_z(a5),p2z move ob_rot(a5),p2r .shit ; ;init windows... ; move.l loadingmed(pc),d0 beq.s .nolmed move.l medat(pc),a1 clr fadevol jsr 12(a1) ;stop song .nolmed ; move #$1f3a,d0 bsr seedrnd clr.l sucker clr.l sucking clr finished clr finished2 clr doneflag clr showflag clr escape clr frame ; bsr syncup ; clr framecnt clr paused bsr predrawall bsr dispon bsr chaton ; mainloop bsr drawall move escape(pc),d0 beq.s .noesc jsr dogamemenu clr escape .noesc move finished(pc),d0 beq.s mainloop ; mainexit st paused bsr chatoff bsr dispoff bsr qsync2 bsr linkswap bsr freeobjlist bsr freetxts bsr freemap ; ;finished codes... ; ;1 : quit (esc/exit game) ;2 : death (both players dead) ;3 : pattern completed ;4 : combat game...someone died! ; move finished(pc),d0 and #127,d0 subq #1,d0 beq exitgame subq #1,d0 beq gameover subq #1,d0 beq levelover subq #1,d0 beq combatwon ; .fuck warn #$f08 warn #$80f bra.s .fuck ; exitgame cmp #2,gametype bne.s gameover combatover move.l combat,a1 freemem combat move.l combatpal,a1 freemem combatpal gameover bsr freeiff bra freetiles levelover ; move.l player1,a5 move ob_hitpoints(a5),p1health move ob_lives(a5),p1lives move ob_weapon(a5),p1weapon move.b ob_reload(a5),p1reload ; tst gametype beq.s .p1p1 ; move.l player2,a5 move ob_hitpoints(a5),p2health move ob_lives(a5),p2lives move ob_weapon(a5),p2weapon move.b ob_reload(a5),p2reload ; ;shared lives! ; move p1lives(pc),d0 move p2lives(pc),d1 cmp d1,d0 bcc.s .used0 move d1,d0 .used0 move d0,p1lives move d0,p2lives ; .p1p1 tst.l map_test bne gameover bra execscript_med ; combatwon move.l player1(pc),a5 move ob_lives(a5),p1lives beq .p1lost move.l player2(pc),a5 move ob_lives(a5),p2lives beq .p2lost ; ;combat game continues! ; bra execscript_med ; .p1lost ;player 1 lost the game ; lea p2wins(pc),a2 tst linked beq .combatmess lea ploses_(pc),a2 bgt .combatmess lea pwins_(pc),a2 bra .combatmess ; .p2lost ;player 2 lost combat game ; lea p1wins(pc),a2 tst linked beq .combatmess lea ploses_(pc),a2 blt .combatmess lea pwins_(pc),a2 ; .combatmess move.l combat,a0 move.l combatpal,a1 bsr pmenu bsr selmenu bsr finitpmenu bra combatover p1wins dc.b 1,'player one wins combat game!',0 even p2wins dc.b 1,'player two wins combat game!',0 even pwins_ dc.b 1,'player wins combat game!',0 even ploses_ dc.b 1,'player loses combat game!',0 even freemap move.l map_map,d0 beq.s .done move.l d0,a1 freemem map clr.l map_map .done rts inccntrl addq #1,(a2) cmp #5,(a2) bcs.s .pok clr (a2) .pok move (a2),d0 cmp (a3),d0 beq.s inccntrl ; .there lea popts(pc),a0 move.l 0(a0,d0*4),a0 .sk move.b (a0)+,(a1)+ bne.s .sk rts dointro ; move.l gloom(pc),a0 move.l gloompal(pc),a1 jsr showpic ; move aga(pc),d0 beq.s .noaga ; move.l gloombrush(pc),a0 move.l showbitmap(pc),a1 move #168*40,d0 mulu bitplanes(pc),d0 add.l d0,a1 bsr decodeiff .noaga ; bsr dispon ; bsr chaton ; bsr waitany ; lea startmenu,a4 tst linked beq.s .use lea startmenu2,a4 .use jsr initmenu ; .sel jsr selmenu ; tst linked beq.s .notlinked ; cmp #2,d0 bcs .newgame2 subq #2,d0 beq .unlink subq #1,d0 beq .about subq #1,d0 beq .exitgloom bra .sel .unlink ; bsr qsync2 bsr chatoff clr linked lea p2ctype(pc),a1 lea p2_ob_cntrl,a2 lea p1_ob_cntrl,a3 bsr inccntrl ; bsr finitpmenu bra dointro ; .newgame2 addq #1,d0 move d0,gametype bsr qsync2 bsr chatoff bra finitpmenu ; .notlinked cmp #3,d0 bcs .newgame ; subq #3,d0 bne .notp1 ; lea p1ctype(pc),a1 lea p1_ob_cntrl,a2 lea p2_ob_cntrl,a3 bsr inccntrl bra .sel ; .notp1 subq #1,d0 bne.s .notp2 ; lea p2ctype(pc),a1 lea p2_ob_cntrl,a2 lea p1_ob_cntrl,a3 bsr inccntrl bra .sel ; .notp2 subq #1,d0 bne.s .notlink ; bsr finitpmenu bsr linkup bra dointro ; .notlink subq #1,d0 bne.s .notvile ; addq #1,mode and #1,mode move mode(pc),d0 lea modes,a0 move.l 0(a0,d0*4),a0 lea modetxt,a1 .moloop move.b (a0)+,(a1)+ bne.s .moloop ; bra .sel ; .notvile subq #1,d0 bne .notabout ; .about ;about text... ; bsr finitpmenu move.l gloom(pc),a0 move.l gloompal(pc),a1 lea abouttext,a2 bsr pmenu move numopts(pc),-(a7) move #1,numopts ; bsr selmenu ; ;cheat mode too? ; qkey $5f beq.s .noch ; warn #$f0f move #-1,cheat ; .noch move (a7)+,numopts bsr finitpmenu bra dointro ; .notabout subq #1,d0 bne .sel ; .exitgloom moveq #4,d0 ; .newgame move d0,gametype bsr qsync2 bsr chatoff bra finitpmenu linkup ;link up... ; lea linkupmenu,a0 bsr qmenu ; .loop bsr selmenu cmp #3,d0 bne.s .notb bsr optbaud bra.s .loop ; .notb bsr finitqmenu move curropt(pc),d0 beq nulllink cmp #4,d0 beq.s .rts subq #1,d0 beq dialup subq #1,d0 beq answer .rts rts ; answer lea ata(pc),a0 move #-1,linked bra doconnect dialup ; lea phonenum(pc),a0 move.l a0,a1 move.l a0,phoneat .clr tst.b (a0) beq.s .clrd move.b #32,(a0)+ bra.s .clr .clrd move.b #127,(a1) ; lea linkmenu0,a0 bsr qmenu ; st chatok ; .loop qkey $41,d0 ;undel! bne.s .loop ; .wkey bsr checkesc bne .escout qkey $44 ;return? bne .done key $41,d0 bne .del ;del ; move chatoutget(pc),d0 cmp chatoutput(pc),d0 beq.s .wkey ; and #31,d0 lea chatout(pc),a0 move.b 0(a0,d0),d0 ;chat out character! addq #1,chatoutget ; cmp #48,d0 bcs.s .loop cmp #58,d0 bcc.s .loop ; move.l phoneat(pc),a0 move.b d0,(a0)+ tst.b (a0) beq.s .skinc move.b #127,(a0) move.l a0,phoneat ; .skinc bsr vwait bsr optoff bsr opton bra .loop ; .del move.l phoneat(pc),a0 cmp.l #phonenum,a0 beq .loop cmp.b #127,(a0) bne.s .noc move.b #32,(a0) subq #1,a0 .noc move.b #127,(a0) move.l a0,phoneat bra.s .skinc ; .done qkey $44 bne.s .done ; bsr .escout ; lea pbuff(pc),a0 ;use this for connect string! move.l a0,a2 ; move.l #'ATDT',(a2)+ lea phonenum(pc),a1 .cpn move.b (a1)+,(a2) beq.s .null cmp.b #32,(a2)+ bne.s .cpn subq #1,a2 .null move.b #13,(a2)+ move.b #10,(a2)+ clr.b (a2) ; move #1,linked bra doconnect ; .escout bsr finitqmenu clr chatok clr chatoutget clr chatoutput rts checkesc qkey $45 ifne cd32 movem.l d0-d7/a0-a6,-(a7) lea cd32buff(pc),a0 clr escape bsr readcd321 tst escape sf escape movem.l (a7)+,d0-d7/a0-a6 endc rts cd32buff ds 8 phoneat dc.l phonenum nulllink ; lea connect(pc),a0 doconnect ; bsr sendstring bsr waitconnect beq .calcmaster ; clr linked rts ; ;OK, randomly determine who is master and who is slave! ; ;faster computer SHOULD be master! ; ;let's try, number of rnd divs/frame...send as a long word! ; .calcmaster tst linked bne .linked ; move linkdelay(pc),d0 ext.l d0 move.l d0,d2 bsr longput bsr longget cmp.l d0,d2 beq.s .itsatie bhi .master bra .slave ; .itsatie ;OK, both connected at same time! use faster machine... ; moveq #0,d7 ; move #$20,$dff09a ; .vwloop btst #5,$dff01f beq.s .vwloop move #$20,$dff09c .cmloop ; btst #5,$dff01f bne.s .cmdone bsr rndw ext.l d0 divs #$a5a5,d0 addq.l #1,d7 bra.s .cmloop .cmdone ; move #$20,$dff09c move #$8020,$dff09a ; move.l d7,d0 bsr longput bsr longget cmp.l d0,d7 beq.s .calcmaster blt.s .slave ; ;I'm player 1 .master move #1,linked bra.s .linked ; .slave ;I'm actually player 2! move #-1,linked ; .linked move #-1,p2_ob_cntrl ; lea incharge(pc),a0 tst linked bgt.s .goz lea notincharge(pc),a0 .goz bsr qmenu bsr chaton bsr selmenu bra finitqmenu longput ;send ser long in d0 ; moveq #3,d1 .loop rol.l #8,d0 movem.l d0-d1,-(a7) bsr vwait bsr serput movem.l (a7)+,d0-d1 dbf d1,.loop rts longget ;get ser long in d0 ; move.l d2,-(a7) moveq #3,d1 .loop movem.l d1-d2,-(a7) bsr serwait movem.l (a7)+,d1-d2 lsl.l #8,d2 move.b d0,d2 dbf d1,.loop move.l d2,d0 move.l (a7)+,d2 rts incharge dc.b 1 dc.b 'player selects options',0 even notincharge dc.b 1 dc.b 'other player selects options',0 even sendstring ;a0=string to send ; move.l a0,a2 .loop bsr vwait move.b (a2)+,d0 beq.s .done bsr serput bra.s .loop .done rts linkdelay dc 0 waitconnect ;wait for 'CONNECT' to arrive... ;return eq if OK, else ne if 'esc'ed or not received. ; lea linkmess,a0 bsr qmenu clr linkdelay ; .retry lea wconnect(pc),a2 ; .loop bsr vwait addq #1,linkdelay bsr checkesc bne .notok bsr rbfchk beq.s .loop bsr serget cmp.b (a2)+,d0 bne.s .retry tst.b (a2) bne.s .loop ; .ok ;OK, connect xxxx ends with 13,10... ; .w10 bsr vwait addq #1,linkdelay bsr checkesc bne .notok bsr rbfchk beq.s .w10 bsr serget cmp.b #10,d0 bne.s .w10 ; bsr finitqmenu moveq #0,d0 rts ; .notok bsr finitqmenu moveq #-1,d0 rts optbaud addq #1,baud cmp #6,baud bcs.s .ok clr baud .ok ; calcbaud move baud(pc),d0 lea bauds(pc),a0 move.l 4(a0,d0*8),a0 ;baud text! lea baudtext(pc),a1 .loop move.b (a0)+,(a1)+ bne.s .loop ; move baud(pc),d0 lea bauds(pc),a1 move.l 0(a1,d0*8),d0 ;2400 etc. move.l baudconst(pc),d1 divu d0,d1 subq #1,d1 move d1,$dff032 ; rts connect dc.b 'CONNECT',13,10,0 even wconnect dc.b 'CONNECT',0 even ata dc.b 'ATA',13,10,0 even linkmenu0 dc.b 1 dc.b 'DIAL: ' phonenum dc.b 127,' ',0 even linkmess dc.b 1 dc.b 'ATTEMPTING TO CONNECT...ESC TO ABORT',0 even linkupmenu dc.b 5 dc.b 'NULL LINK',0 dc.b 'DIAL UP',0 dc.b 'ANSWER',0 dc.b 'BAUD RATE: ' baudtext dc.b '2400 ',0 dc.b 'EXIT',0 even baudconst dc.l 3546895 ;pal dc.l 3579545 ;ntsc baud dc 0 bauds dc.l 2400,b1,4800,b2,9600,b3,14400,b4,28800,b5 dc.l 38400,b6 b1 dc.b '2400 ',0 b2 dc.b '4800 ',0 b3 dc.b '9600 ',0 b4 dc.b '14400',0 b5 dc.b '28800',0 b6 dc.b '38400',0 even dc.l popt0 popts dc.l popt1,popt2,popt3,popt4,popt5 ; popt0 dc.b 'NULL MODEM',0 ;-1 popt1 dc.b 'JOYSTICK 1',0 ;0 popt2 dc.b 'JOYSTICK 2',0 ;1 popt3 dc.b ' KEYBOARD ',0 ;2 popt4 dc.b 'CD32 PAD 1',0 ;3 popt5 dc.b 'CD32 PAD 2',0 ;4 joyxs dc 0,0 ;serial joyys dc 0,0 ; joyx0 dc 0,0 joyb0 dc 0,0 joyx1 dc 0,0 joyb1 dc 0,0 joyx2 dc 0,0 joyb2 dc 0,0 joyx3 dc 0,0 joyb3 dc 0,0 joyx4 dc 0,0 joyb4 dc 0,0 even gamemenu dc.b 7 dc.b 'CONTINUE',0 dc.b 'RESOLUTION',0 dc.b 'WINDOW SIZE',0 dc.b 'FULL SCREEN WINDOW',0 dc.b 'FLOOR',0 dc.b 'CEILING',0 dc.b 'QUIT GAME',0 even modes dc.l mode1,mode2 mode1 dc.b 'MEATY',0 mode2 dc.b 'MESSY',0 startmenu dc.b 9 dc.b 'ONE PLAYER GAME',0 ;0 dc.b 'TWO PLAYER GAME',0 ;1 dc.b 'TWO PLAYER COMBAT',0 ;2 dc.b 'PLAYER 1 ' p1ctype ifne cd32 dc.b 'CD32 PAD 1',0 ;3 elseif dc.b 'JOYSTICK 1',0 ;3 endc ; dc.b 'PLAYER 2 ' p2ctype ifne cd32 dc.b 'CD32 PAD 2',0 ;4 elseif dc.b 'JOYSTICK 2',0 ;4 endc ; dc.b 'REMOTE LINK OPTIONS',0 ;5 ; dc.b 'VIOLENCE MODEL: ' modetxt dc.b 'MEATY',0 ;6 dc.b 'ABOUT GLOOM',0 ;7 dc.b 'EXIT GLOOM',0 ;8 even startmenu2 dc.b 5 dc.b 'TWO PLAYER GAME',0 ;0 dc.b 'TWO PLAYER COMBAT GAME',0 ;1 dc.b 'UNLINK FROM REMOTE PLAYER',0 ;2 dc.b 'ABOUT GLOOM',0 ;3 dc.b 'EXIT GLOOM',0 ;4 even menuwindow dc.l 0 menubmap dc.l 0 menuy dc 0 numopts dc 0 ;how many menu options curropt dc 0 ;current option flashdelay dc 0 menustrips ds.l 32 ;16 max! qmenu ;quick menu in a0 ;on black screen ; move.l a0,-(a7) bsr clspic move.l (a7)+,a4 bsr initmenu bra dispon pmenu ;a0=iff, a1=palette, a2=menu ;display off move.l a2,-(a7) bsr showpic move.l (a7)+,a4 bsr initmenu bra dispon finitpmenu ; finitqmenu bsr dispoff bra finitmenu swapshow movem.l showbitmap(pc),d0-d1 exg d0,d1 movem.l d0-d1,showbitmap rts finitfontpal bra pokelastpal initfontpal move.l font(pc),a1 add.l (a1),a1 move (a1),-(a7) clr (a1) moveq #4,d0 bsr pokepal2 move.l font(pc),a1 add.l (a1),a1 move (a7)+,(a1) rts initmenu clr curropt initmenu2 ; ;do a menu...menu in a4 ; bsr copypic ;copy shown to draw bsr swapshow bsr initfontpal ; move.b (a4)+,d0 ;how many ext d0 move d0,numopts move d0,-(a7) ;counter move bmaphite(pc),d6 ;bitmap hite move.l showbitmap(pc),menubmap lsr #1,d6 move fonth(pc),d2 lsr #1,d2 mulu d2,d0 sub d0,d6 ;Y move d6,menuy lea menustrips(pc),a5 ; .loop ;save strip! ; move.l a4,(a5)+ ; move fonth(pc),d0 mulu #40,d0 mulu bitplanes(pc),d0 moveq #2,d1 allocmem menustrip move.l d0,(a5)+ move.l d0,a1 ;strip address ; move d6,d0 mulu linemodw(pc),d0 move.l menubmap(pc),a0 add.l d0,a0 ;src ; move bitplanes(pc),d0 subq #1,d0 .sloop move.l a0,-(a7) move fonth(pc),d1 subq #1,d1 .sloop2 move.l a0,-(a7) moveq #9,d2 .sloop3 move.l (a0)+,(a1)+ dbf d2,.sloop3 ;width move.l (a7)+,a0 add.l linemod(pc),a0 dbf d1,.sloop2 ;hite move.l (a7)+,a0 add.l bpmod(pc),a0 dbf d0,.sloop ;depth ; move.l a4,a0 moveq #-1,d0 .cnt addq #1,d0 tst.b (a0)+ bne.s .cnt ; jsr printmess2 ; add fonth(pc),d6 subq #1,(a7) bgt.s .loop addq #2,a7 ; ifne debugmem bsr showmem lea memasc,a4 moveq #8,d0 jsr printmess2 ; move.l freememerr,d0 beq.s .nomemerr clr.l freememerr move.l d0,a4 move.l d0,a0 moveq #-1,d0 .ccloop addq #1,d0 tst.b (a0)+ bne.s .ccloop add fonth(pc),d6 jsr printmess2 .nomemerr ; endc ; bsr swapshow bsr db bra vwait minmem dc.l $7fffffff ifne debugmem ; showmem push move.l 4.w,a6 move.l #$20001,d1 jsr -216(a6) cmp.l minmem(pc),d0 bge.s .notmin move.l d0,minmem .notmin move.l minmem(pc),d0 ; lea memasc,a0 moveq #7,d1 .loop rol.l #4,d0 move d0,d2 and #15,d2 add #48,d2 cmp #58,d2 bcs.s .skip addq #7,d2 .skip move.b d2,(a0)+ dbf d1,.loop pull rts ; memasc dc.b '12345678',0 even endc optoff ; bsr ownblitter move curropt(pc),d6 lea menustrips(pc),a0 move.l 4(a0,d6*8),a0 ;address of strip mulu fonth(pc),d6 add menuy(pc),d6 mulu linemodw(pc),d6 move.l menubmap(pc),a1 add.l d6,a1 ;dest ; move fonth(pc),d0 lsl #6,d0 or #20,d0 ; move bitplanes(pc),d1 subq #1,d1 ; move linemodw(pc),d2 sub #40,d2 ; btst #6,$dff002 .bwait0 btst #6,$dff002 bne.s .bwait0 ; move.l #$9f00000,$dff040 ;D=A move.l #-1,$dff044 move #0,$dff064 move d2,$dff066 ;d mod move.l a0,$dff050 ; .loop btst #6,$dff002 .bwait btst #6,$dff002 bne.s .bwait ; move.l a1,$dff054 move d0,$dff058 add.l bpmod(pc),a1 dbf d1,.loop ; move #13,flashdelay ; bra disownblitter opton move curropt(pc),d6 lea menustrips(pc),a0 move.l 0(a0,d6*8),a4 ;text! mulu fonth(pc),d6 add menuy(pc),d6 ; ;a6=window, a4=message, d0=length of message, d6=Y ; move.l a4,a0 moveq #-1,d0 .loop addq #1,d0 tst.b (a0)+ bne.s .loop ; move.l menuwindow(pc),a6 jsr printmess2 ; move #13,flashdelay ; rts readmenujoy ;encode to d0! ; ;OK, read joystick in port 2, and keyboard! ;merge into joyx,joyy,joyb ; tst active bne.s .doit lea joyx(pc),a0 clr.l (a0) clr.l 4(a0) moveq #0,d0 rts .doit lea joyx(pc),a0 bsr readjoy1 lea joyx0(pc),a0 bsr readkeys move.l joyx0(pc),d0 or.l d0,joyx move.l joyb0(pc),d0 or.l d0,joyb ; qkey $44 bne.s .fire qkey $45 beq.s .encode .fire move #-1,joyb .encode lea joyx(pc),a0 jsr encodejoy and #$1c,d0 ;fire/up/down only! rts ;bit: ;0 = joyx -1 ;1 = joyx 1 ;2 = joyy -1 ;3 = joyy 1 ;4 = joyb true ;5 = joys true unselmenu move d0,-(a7) .loop bsr readmenujoy cmp (a7),d0 beq.s .loop move (a7)+,d0 rts readmenusel ;read menu selection! tst linked bne.s .link ; ;not linked... ; bsr readmenujoy bne unselmenu rts ; .link bmi.s .slave ; ;master... ; bsr readmenujoy beq.s .rts bsr unselmenu bsr serput bsr serwait and #255,d0 .rts rts ; .slave bsr rbfchk beq.s .rts bsr serget bsr serput and #255,d0 rts selmenu ;select a menu item...return item in d0 ; ;flash selected option on/off ; bsr optoff .loop1 bsr vwait bsr readmenusel bne.s .joygot subq #1,flashdelay bgt.s .loop1 ; bsr opton .loop2 bsr vwait bsr readmenusel bne.s .joygot2 subq #1,flashdelay bgt.s .loop2 bra selmenu ; .joygot move d0,-(a7) bsr opton move (a7)+,d0 .joygot2 ; btst #2,d0 bne.s .up btst #3,d0 bne.s .down ; ;selected! ; move curropt(pc),d0 rts ; .up subq #1,curropt bpl selmenu move numopts(pc),d0 subq #1,d0 move d0,curropt bra selmenu ; .down addq #1,curropt move curropt(pc),d0 cmp numopts(pc),d0 bcs selmenu clr curropt bra selmenu finitmenu ;clean up menu operation ; bsr clspic bsr vwait lea menustrips(pc),a5 move numopts(pc),d2 subq #1,d2 .loop addq #4,a5 move.l (a5)+,a1 freemem menustrip dbf d2,.loop bra finitfontpal initdarktable ; move #maxz-1,d2 move.l sqr(pc),a0 move.l darktable(pc),a1 ; .loop move d2,d3 lsl #3,d3 move 0(a0,d3),d3 lsr #3,d3 eor #15,d3 move d3,(a1)+ ; dbf d2,.loop ; rts initrawmap lea ascmap(pc),a0 lea rawmap(pc),a1 bsr .loop lea ascmap2(pc),a0 lea shiftmap(pc),a1 ; .loop moveq #0,d0 move.b (a0)+,d0 cmp #$ff,d0 beq.s .rts .loop2 move.b (a0)+,d1 beq.s .loop move.b d1,0(a1,d0) addq #1,d0 bra.s .loop2 .rts rts ascmap dc.b $1,'1234567890',0 dc.b $10,'QWERTYUIOP',0 dc.b $20,'ASDFGHJKL',0 dc.b $31,'ZXCVBNM',0 dc.b $40,' ',0 dc.b $38,',.',0 dc.b $ff even ; ascmap2 dc.b $3a,'?',0 dc.b $01,'!',0 dc.b $ff even rawmap ds.b 128 ;unshifted chars shiftmap ds.b 128 ;shifted chars chatout ds.b 32 chatoutput dc 0 chatoutget dc 0 chatin ds.b 32 chatinput dc 0 chatinget dc 0 shiftdown dc 0 ;shift key status rawkeyread ;a1=matrix! hi bit of keycode=1 if key up! ; move.l d2,-(a7) ; moveq #0,d2 move.b $bfec01,d2 not.b d2 ror.b #1,d2 or.b #$40,$bfee01 ; move d2,d0 move d2,d1 and #7,d1 lsr #3,d0 bclr #4,d0 bne.s .clrkey ; .setkey bset d1,0(a1,d0) ;key on! ; move chatok(pc),d0 beq.s .skip ; lea rawmap(pc),a0 move.b $60>>3(a1),d0 and #7,d0 beq.s .unshft lea shiftmap(pc),a0 .unshft move.b 0(a0,d2),d0 ;asc! beq.s .skip ; ;ok, add to chat out buffer! ; lea chatout(pc),a0 move chatoutput(pc),d1 and #31,d1 move.b d0,0(a0,d1) addq #1,chatoutput ; bra.s .skip ; .clrkey bclr d1,0(a1,d0) ; .skip moveq #6,d0 ;wait 6 scanlines? moveq #-1,d1 .loop move d1,d2 .loop2 move.l $dff004,d1 lsr.l #8,d1 and #$1ff,d1 cmp d2,d1 beq.s .loop2 dbf d0,.loop ; and.b #$bf,$bfee01 ; move.l (a7)+,d2 rts rawtable dc.l rawmatrix rawstuff dc.l 0,0 ciaa dc.l 0 ciaaname dc.b 'ciaa.resource',0 even rawmatrix dc.l 0,0,0,0 ;128 key bits savefile ;a0=name, a1=mem, d0=length push ; movem.l d0/a0-a1,-(a7) ; move.l dosbase,a6 move.l a0,d1 move.l #1006,d2 jsr -30(a6) move.l d0,d7 bne.s .ok ; lea wpmess(pc),a0 bsr qmenu ; .help bsr vwait ; movem.l (a7),d0/a0-a1 move.l dosbase,a6 move.l a0,d1 move.l #1006,d2 jsr -30(a6) move.l d0,d7 beq.s .help ; move.l d7,-(a7) bsr finitqmenu move.l (a7)+,d7 ; .ok move.l d7,d1 movem.l (a7)+,d0/a0-a1 move.l a1,d2 move.l d0,d3 jsr -48(a6) ; move.l d7,d1 jsr -36(a6) ; .done pull rts wpmess dc.b 1 dc.b 'please write enable the gloom data disk!',0 even fileheader ds.b 14 loadmem dc.l 0 loadfileabs move.l a1,loadmem bra.s loadfile_ loadfile clr.l loadmem ; loadfile_ ;a0=name, d1=memtype ; ;decrunch file if nec. ; ;return d0=pointer ; push ; move.l d1,d5 ;save memtype move.l dosbase,a6 ; move.l a0,d1 move.l #1005,d2 jsr -30(a6) ;open it! move.l d0,d7 ;handle beq .err ; move.l d7,d1 moveq #0,d2 moveq #1,d3 jsr -66(a6) ;seek to end ; move.l d7,d1 moveq #0,d2 moveq #-1,d3 ;seek to start jsr -66(a6) ; move.l d0,d4 ;length=prev filepos ; move.l d7,d1 move.l #fileheader,d2 moveq #14,d3 jsr -42(a6) ;read! ; move.l d0,-(a7) ;how many bytes read! ; move.l d7,d1 moveq #0,d2 moveq #-1,d3 ;back to start jsr -66(a6) ; cmp.l #14,(a7)+ bcs.s .nocrunch ; moveq #0,d6 move.l fileheader(pc),d0 cmp.l #'CrM2',d0 beq.s .crunch cmp.l #'CrM!',d0 bne.s .nocrunch ; .crunch cmp.l fileheader+6(pc),d4 ;loadlen>destlen? bcc.s .skip move.l fileheader+6(pc),d4 ;length to allocate .skip ; moveq #14,d6 add fileheader+4(pc),d6 bsr loadit move.l d0,a0 ;src add.l d6,d0 ;dest move.l d0,a1 ; jsr flushc jsr decrm+32 jsr flushc ; pull rts .nocrunch ; bsr loadit ; .err pull rts loadit ;d4=length to alloc/read, d5=memtype ;seek to start, load, close and return base in d0. ; move.l loadmem(pc),d0 bne.s .noalloc ; move.l d4,d0 move.l d5,d1 move.l d6,d2 ;offset XS allocmem2 loadfile sub.l d6,d0 .noalloc ; move.l d7,d1 move.l d0,d2 move.l d4,d3 ;read len jsr -42(a6) ;read move.l d7,d1 jsr -36(a6) ;close move.l d2,d0 ; rts calcpalettes ;generate 16 versions of palette ; lea paladjust,a5 move.l map_rgbsat(pc),a4 ;end move.l planar_remap(pc),a1 ;remap table lea palettes(pc),a2 moveq #0,d7 ;darkness ; .loop move.l (a2)+,a3 move.l map_rgbs(pc),a0 ;original RGBs ; .loop2 move (a0)+,d0 ;RGB value 0,1,2... move d0,d1 move d0,d2 ; lsr #8,d0 and #$00f,d0 ;R sub d7,d0 bgt.s .rok moveq #1,d0 .rok ; lsr #4,d1 and #$00f,d1 sub d7,d1 bpl.s .gok moveq #0,d1 .gok ; and #$00f,d2 sub d7,d2 bpl.s .bok moveq #0,d2 .bok ; lsl #8,d0 ;recombine lsl #4,d1 or d1,d0 or d2,d0 ;correct 4bit RGB! ; move.b 0(a1,d0),d0 ;map from RGB->LUT and #$ff,d0 move.b 0(a5,d0),(a3)+ ;scrambled adjust ; cmp.l a4,a0 bcs.s .loop2 ; addq #1,d7 cmp #16,d7 bcs.s .loop ; rts dispoff tst dispnest bne.s .skip bsr vwait tst os bne.s .skip move #$01a0,$dff096 ;bp/cop/spr off! .skip addq #1,dispnest rts dispon subq #1,dispnest bgt.s .skip bsr vwait tst os bne.s .skip move.l coplist(pc),$dff080 move #0,$dff088 move #$8080,$dff096 ;cop on! move #0,$dff088 .skip rts forbid tst os bne.s .rts ; push moveq #49,d0 .fl bsr vwait dbf d0,.fl bsr ownblitter move.l 4.w,a6 jsr -132(a6) move #$8400,$dff096 ;bltnasty! pull ; .rts rts permit tst os bne.s .rts ; push move.l 4.w,a6 jsr -138(a6) bsr disownblitter pull ; .rts rts initvbint push move.l 4.w,a6 moveq #5,d0 lea vbintserver,a1 jsr -168(a6) ;addintserver pull rts vbcounter dc 0 framecnt dc 0 frame dc 0,0 vbintserver dc.l 0,0 dc.b 2,0 dc.l 0 vbintdata dc.l vbcounter vbintcode dc.l vbhandler rbfintserver dc.l 0,0 dc.b 2,0 dc.l 0 rbfintdata dc.l rbuff rbfintcode dc.l rbf finitvbint push move.l 4.w,a6 moveq #5,d0 lea vbintserver,a1 jsr -174(a6) pull rts blitnest dc 0 ownblitter tst blitnest bne.s .skip move.l grbase,a6 jsr -456(a6) .skip addq #1,blitnest rts disownblitter subq #1,blitnest bgt.s .rts move.l grbase,a6 jmp -462(a6) .rts rts grname dc.b 'graphics.library',0 even grbase dc.l 0 oldview dc.l 0 dosname dc.b 'dos.library',0 even dosbase dc.l 0 showwindow ;a0=window ; push ; ;poke bitmaps... move.l wi_slice(a0),a1 move.l (a1),a1 move.l wi_bmap(a0),d0 moveq #6,d1 ;7 bitplanes .loop move d0,6(a1) swap d0 move d0,2(a1) swap d0 add.l #40,d0 addq #8,a1 dbf d1,.loop ; ;create DIW ; move.l wi_slice(a0),a1 move.l (a1),a1 ; move wi_y(a0),d0 move d0,d1 add wi_bh(a0),d1 lsl #8,d0 or #$81,d0 move d0,56+2(a1) lsl #8,d1 or #$c1,d1 move d1,56+6(a1) ; ;create wait! ; move wi_y(a0),d0 subq #3,d0 move.b d0,64(a1) ; ;create link to next! move.l wi_nslice(a0),a1 move.l (a1),d0 move.l wi_cop1(a0),a1 add.l wi_copmem(a0),a1 move.l wi_cop2(a0),a2 add.l wi_copmem(a0),a2 move d0,-6(a1) move d0,-6(a2) swap d0 move d0,-10(a1) move d0,-10(a2) ; pull ; showwindowq ;display coplist ; move.l wi_cop(a0),d0 move.l wi_slice(a0),a0 move.l (a0),a0 ; move d0,72+6(a0) swap d0 move d0,72+2(a0) ; rts finitdisplay push ; tst os beq.s .noos ; move.l dbufinfo(pc),a1 move.l grbase(pc),a6 jsr -$3cc(a6) ;free dbufinfo ; move.l screen(pc),a0 move.l int(pc),a6 jsr -66(a6) ; pull rts ; .noos move.l grbase,a6 move.l oldview,a1 jsr -222(a6) ;load view jsr -270(a6) jsr -270(a6) move.l 38(a6),$dff080 move #$81a0,$dff096 move #0,$dff088 ; pull rts initbitmap ;a0=bitmap struct, d0=bitplane 0 ; move bitplanes(pc),d1 move #40,(a0) ;linemod move #240,2(a0) move d1,4(a0) clr 6(a0) lea 8(a0),a1 subq #1,d1 move.l #40*240,d2 .loop move.l d0,(a1)+ add.l d2,d0 dbf d1,.loop rts intname dc.b 'intuition.library',0 even int dc.l 0 osbitmap1 ds.b 40 osbitmap2 ds.b 40 screen dc.l 0 viewport dc.l 0 dbufinfo dc.l 0 newscreen dc 0,0 ;x,y dc 320,240 ;w,h newscreen_d dc 8 ;depth dc.b 0,0 ;pens newscreen_v dc 0 ;viewmode dc $4f ;type dc.l 0 ;font dc.l 0 ;title dc.l 0 ;gadgets dc.l osbitmap1 ;custombitmap ;make a new task for this window... ;simply wait for activate/deactive and ;modify input readers ; newwindow dc 0,0 ;x,y dc 320,240 ;w,h dc.b 0,0 ;pens dc.l $c0000 ;idcmp flags! $40000=active, dc.l $11940 ;flags! (RMB trap) dc.l 0 ;gadgets dc.l 0 ;checkmark dc.l 0 ;title newwindow_s dc.l 0 ;screen dc.l 0 ;bitmap dc -1,-1,-1,-1 ;mins/maxs dc 15 ;type window dc.l 0 msgport dc.l 0 newtask dcb.b 92,0 inputon tst active bne.s .rts ; move #$4000,$dff09a ; lea joytable(pc),a2 lea joytable2(pc),a3 move.l a3,a4 .loop move.l (a3)+,(a2)+ cmp.l a4,a2 bcs.s .loop ; move.l ciaa,a0 movem.l $64(a0),d0-d1 movem.l d0-d1,rawstuff move.l rawtable(pc),$64(a0) move.l #rawkeyread,$68(a0) move #$c000,$dff09a st active ; .rts rts inputoff tst active beq.s .rts ; move #$4000,$dff09a ; lea joytable(pc),a2 lea readnull(pc),a3 move.l a3,a4 .loop move.l a3,(a2)+ cmp.l a4,a2 bcs.s .loop ; move.l ciaa,a0 movem.l rawstuff,d0-d1 movem.l d0-d1,$64(a0) move #$c000,$dff09a ; clr active ; .rts rts windowtask move.l int(pc),a6 ;intuition base lea newwindow(pc),a0 jsr -204(a6) ;openwindow move.l d0,window move.l d0,a0 move.l 86(a0),msgport ; ;now, simply wait for window events! ; move.l 4.w,a6 .loop move.l msgport(pc),a0 jsr -384(a6) ;waitport! move.l d0,-(a7) move.l d0,a0 move.l 20(a0),d0 cmp.l #$40000,d0 beq.s .activate cmp.l #$80000,d0 bne.s .skip ; bsr inputoff bra.s .skip ; .activate ;activate input handlers ; bsr inputon ; .skip move.l (a7)+,a1 jsr -378(a6) ;reply msg bra.s .loop initdisplay ; lea grname,a1 move.l 4.w,a6 jsr -408(a6) move.l d0,grbase ; ;allocate 2 bitmaps! ; move #40*240,d2 ;1 bitplane (DB) mulu bitplanes(pc),d2 move.l d2,bmapmem move.l d2,d0 add.l d0,d0 ;2 for DB moveq #2,d1 allocmem bitmaps move.l d0,bitmaps add.l d2,d0 move.l d0,bitmaps2 ; tst os beq.s .noos ; ;OK, OS version... ;init bitmaps and open a screen! ; move.l 4.w,a6 lea intname(pc),a1 jsr -408(a6) move.l d0,int ; move.l bitmaps(pc),d0 lea osbitmap1(pc),a0 bsr initbitmap move.l bitmaps2(pc),d0 lea osbitmap2(pc),a0 bsr initbitmap ; move bitplanes(pc),newscreen_d tst aga bne.s .agasc move #$80,newscreen_v ; .agasc move.l int(pc),a6 lea newscreen(pc),a0 jsr -198(a6) move.l d0,a0 move.l a0,screen lea 44(a0),a0 ; move.l a0,viewport move.l grbase(pc),a6 jsr -$3c6(a6) ;alocdbufinfo move.l d0,dbufinfo bra db ; .noos move.l grbase(pc),a6 move.l 34(a6),oldview sub.l a1,a1 jsr -222(a6) ;loadview 0. ; bsr dispoff lea copinit_aga,a0 lea copfinit_aga,a1 tst aga bne .aga lea copinit_ecs,a0 lea copfinit_ecs,a1 .aga movem.l a0-a1,-(a7) move.l a1,d0 sub.l a0,d0 move.l d0,d2 moveq #2,d1 allocmem coplist move.l d0,coplist move.l d0,a2 ;dest movem.l (a7)+,a0-a1 lsr.l #2,d2 subq #1,d2 .loop move.l (a0)+,(a2)+ cmp.l a1,a0 bcs.s .loop ; db ;double buffering ; movem.l bitmaps(pc),d0-d1 cmp.l drawbitmap(pc),d0 beq.s .show exg d0,d1 .show movem.l d0-d1,showbitmap move.l todb(pc),a0 jmp (a0) db_ecs move.l coplist(pc),a0 moveq #40,d2 lea bitplanes_ecs-copinit_ecs(a0),a0 moveq #5,d1 ;6 bitplanes .loop0 move d0,6(a0) swap d0 move d0,2(a0) swap d0 add.l d2,d0 addq #8,a0 dbf d1,.loop0 rts db_aga move.l coplist(pc),a0 moveq #40,d2 lea bitplanes_aga-copinit_aga(a0),a0 moveq #7,d1 ;8 bitplanes .loop move d0,6(a0) swap d0 move d0,2(a0) swap d0 add.l d2,d0 addq #8,a0 dbf d1,.loop rts db_os move.l viewport(pc),a0 lea osbitmap1(pc),a1 cmp.l 8(a1),d0 beq.s .got lea osbitmap2(pc),a1 .got move.l dbufinfo(pc),a2 move.l grbase(pc),a6 jmp -$3ae(a6) ;changevpbitmap ;a0=bitmap, a1=screen, a3=intution, a6=graphics ; ;.agashowbitmap ; MOVE.l a0,d4:MOVE.l (a1),a2:MOVE.l 4(a1),d0:BNE gotdbuff ; MOVEM.l a1-a2,-(a7):LEA 44(a2),a0:JSR -$3c6(a6):MOVEM.l (a7)+,a1-a2 ; ;_AllocDBufInfo(a6): ; MOVE.l d0,4(a1) ;gotdbuff: ; LEA 44(a2),a0:MOVE.l d4,a1:MOVE.l d0,a2:JSR -$3ae(a6) ;ChangeVPBitMap_ ; RTS allocmem2_ ; ;as below, but d2.l = extra mem at start to set aside ; push moveq #16,d3 add.l d2,d3 bra.s amem_ allocmem_ ; ;d0=size, d1=requirements, a0=text field ; ;set up node before allocmem for quick freemem: ; ;00.l : next ;04.l : real size ;08.l : offset to user mem (normally 16, but CM fucks things up) ;12.l : pointer to text field for debugging ; push moveq #16,d3 ;offset ; amem_ move.l a0,d4 add.l d3,d0 ; move.l d0,d2 ;len move.l a0,d4 ;text move.l 4.w,a6 jsr -198(a6) tst.l d0 bne.s .skip ; warn #$f00 ; .skip move.l d0,a0 move.l memlist,(a0) ;next move.l a0,memlist movem.l d2-d4,4(a0) add.l d3,a0 move.l a0,d0 ; pull rts freememlist push ; .more move.l memlist,d0 beq.s .done move.l d0,a2 ; ifne debugmem move.l 12(a2),a0 ;text field move.l a0,d2 moveq #-1,d3 .loop addq.l #1,d3 tst.b (a0)+ bne.s .loop ; move.l outhand,d1 move.l dosbase,a6 jsr -48(a6) endc ; move.l a2,a1 ; move.l (a1),memlist move.l 4(a1),d0 move.l 4.w,a6 jsr -210(a6) bra.s .more ; .done pull rts freemem_ ; ;a1=address to free! ; push ; ifne debugmem move.l a0,-(a7) ;error mess elseif endc ; move.l a1,a2 ;mem to find! lea memlist(pc),a1 ; .more move.l a1,a0 ;prev move.l (a1),d0 beq.s .err move.l d0,a1 ; move.l a1,a3 add.l 8(a3),a3 cmp.l a3,a2 bne.s .more ; move.l (a1),(a0) move.l 4(a1),d0 move.l 4.w,a6 jsr -210(a6) bra.s .done ; .err warn #$ff0 ifne debugmem move.l (a7),freememerr endc .done ; ifne debugmem addq #4,a7 endc ; pull rts freememerr dc.l 0 initmap ;map address in map_map... ;load in textures, do colour mapping etc. ; push ; move.l map_map,a0 ; move.l a0,a1 add.l (a0),a1 move.l a1,map_grid ; move.l a0,a1 add.l 4(a0),a1 move.l a1,map_poly ; move.l a0,a1 add.l 8(a0),a1 move.l a1,map_ppnt ; move.l a0,a1 add.l 12(a0),a1 move.l a1,map_anim ; move.l a0,a1 add.l 16(a0),a1 move.l a1,map_txts ; move.l (a0),d0 sub.l #25*4,d0 add.l a0,d0 move.l d0,map_events ; move.l map_rgbsfrom2,map_rgbsat ; pull rts freetxts lea textscrns,a6 moveq #7,d7 .loop move.l (a6)+,d0 beq.s .skip move.l d0,a1 freemem freetxts clr.l -4(a6) .skip dbf d7,.loop rts loadtxts push ; lea textures,a4 move.l map_txts,a5 ;texture names lea textscrns,a6 moveq #7,d7 ; .ltl lea .temp(pc),a0 ; .ltl2 move.b (a5)+,(a0)+ bne.s .ltl2 moveq #0,d0 cmp.l #.temp+1,a0 beq.s .notext lea .temp2(pc),a0 moveq #1,d1 jsr loadfile ; .notext move.l d0,(a6)+ ;texture! beq.s .skip ; ;do colour mapping stuff! ; move.l d0,-(a7) ; move.l d0,a0 add.l (a0),a0 move.l a0,a2 bsr addpal ; move.l (a7),a0 addq #4,a0 move.l a2,a1 bsr remap ; move.l (a7)+,a0 addq #4,a0 moveq #19,d0 move.l #64*65,d1 ; .mtxt move.l a0,(a4)+ add.l d1,a0 dbf d0,.mtxt .skip ; dbf d7,.ltl ; pull rts .temp2 dc.b 'txts/' .temp ds.b 64 even remapanim ;a0=anim to remap... ; push ; move.l a0,a6 movem (a6),d6-d7 lsl d6,d7 ;how many frames! subq #1,d7 ; move.l a6,a0 add.l an_pal(a0),a0 bsr addpal ; lea an_size(a6),a5 ; .loop move.l a6,a0 add.l (a5)+,a0 ;start of shape addq #4,a0 ;skip handles movem (a0)+,d0-d1 ;w/h mulu d1,d0 lea 0(a0,d0.l),a1 ;end bsr remap ; dbf d7,.loop ; pull rts remap ;a0=start of byte data, a1=end of byte data ; push ; moveq #0,d0 move.l maptable,a2 ; .loop cmp.l a1,a0 bcc.s .done move.b (a0),d0 move.b 0(a2,d0),(a0)+ bra.s .loop .done ; pull rts addpal ;add palette in a0 to end of map_rgb ; push ; move (a0)+,d0 subq #1,d0 move.l map_rgbsat,a2 ;end of rgbs move.l maptable,a3 ; clr.b (a3) ;0=0 move.b #255,255(a3) ;-1=-1 move.b #254,254(a3) ;-1=-1 move.b #253,253(a3) ;-1=-1 move.b #252,252(a3) ;-1=-1 move.b #251,251(a3) ;-1=-1 move.b #250,250(a3) ;-1=-1 move.b #249,249(a3) ;-1=-1 ; moveq #1,d2 ;colour 1! ; .loop move (a0)+,d1 ;colour...does it exist? bmi.s .next ;not used! move.l map_rgbs,a1 ; .loop2 cmp.l a2,a1 bcc.s .no cmp (a1)+,d1 beq.s .yes bra.s .loop2 ; .no ;colour doesn't exist! ;may have to do a 'near match' routine if we run out of colours ; move d1,(a2)+ move.l a2,a1 ; .yes subq #2,a1 sub.l map_rgbs,a1 move.l a1,d1 lsr #1,d1 ;real colour ; cmp #256,d1 bcs.s .ok ; warn #$00f ; .ok move.b d1,0(a3,d2) ; .next addq #1,d2 dbf d0,.loop ; move.l a2,map_rgbsat ; pull rts ;coll types... ; ;1...bullet from player 1 ;2...bullet from player 2 ;4...bullet from monster ;8...player 1 ;16..player 2 ; dc.l 0,player,tokens ; objlist ;list of objects to be freed... ; dc.l marine,baldy,terra,ghoul,demon,phantom dc.l lizard,deathhead,dragon,troll,0 player dc.l 0,0 ;main, chunks dc.b 'objs/player',0,0 even tokens dc.l 0,0 dc.b 'objs/tokens',0,0 even marine dc.l 0,0 dc.b 'objs/marine',0,0 even baldy dc.l 0,0 dc.b 'objs/baldy',0,0 even terra dc.l 0,0 dc.b 'objs/terra',0,0 even ghoul dc.l 0,0 dc.b 'objs/ghoul',0,0 even demon dc.l 0,0 dc.b 'objs/demon',0,0 even phantom dc.l 0,0 dc.b 'objs/phantom',0,0 even lizard dc.l 0,0 dc.b 'objs/lizard',0,0 even deathhead dc.l 0,0 dc.b 'objs/deathhead',0,0 even dragon dc.l 0,0 dc.b 'objs/dragon',0,0 even troll dc.l 0,0 dc.b 'objs/troll',0,0 even objinfo player1_ dc.l player1 .ob_rotspeed dc.l 0 .ob_movspeed dc.l $d0000 _ob_shape dc.l player .ob_logic dc.l playerlogic .ob_render dc.l drawshape_8 .ob_hit dc.l playerhit .ob_die dc.l playerdie ; .ob_eyey dc -pl_eyey ;eye height .ob_firey dc -pl_firey ;where bullets come from .ob_gutsy dc -pl_gutsy .ob_othery dc 0 p1_ob_colltype dc 8 p1_ob_collwith dc 6 ;6=combat, 4=game p1_ob_cntrl ifne cd32 dc 3 ;for player 0,1=joyport, 2=keys elseif dc 0 endc .ob_damage dc 1 .ob_hitpoints dc 25 .ob_think dc 0 .ob_frame dc.l 0 .ob_framespeed dc.l $6000 .ob_base dc 1 .ob_range dc 1 .ob_weapon dc 0 ;weapon type...0...25 .ob_reload dc.b ireload,0 .ob_hurtpause dc 5 .ob_punchrate dc 0 .ob_bouncecnt dc 0 ;4! .ob_something dc 0 .ob_scale dc $200 .ob_apad dc 0 .ob_blood dc $f00 ;color AND for blood .ob_ypad dc 1 objinfof oilen equ objinfof-objinfo player2_ dc.l player2 .ob_rotspeed dc.l 0 .ob_movspeed dc.l $d0000 .ob_shape dc.l player .ob_logic dc.l playerlogic .ob_render dc.l drawshape_8 .ob_hit dc.l playerhit .ob_die dc.l playerdie .ob_eyey dc -pl_eyey ;eye height .ob_firey dc -pl_firey ;where bullets come from .ob_gutsy dc -pl_gutsy .ob_othery dc 0 p2_ob_colltype dc 16 p2_ob_collwith dc 5 ;5=combat, 4=game p2_ob_cntrl ifne cd32 dc 4 ;for player 0,1=joyport, 2=keys, 3=serial elseif dc 1 endc .ob_damage dc 1 .ob_hitpoints dc 25 .ob_think dc 0 .ob_frame dc.l 0 .ob_framespeed dc.l $6000 .ob_base dc 1 .ob_range dc 1 .ob_weapon dc 0 ;weapon type... .ob_reload dc.b ireload,0 .ob_hurtpause dc 5 .ob_punchrate dc 0 .ob_bouncecnt dc 0 ;4! .ob_something dc 0 .ob_scale dc $200 .ob_apad dc 0 .ob_blood dc $f00 ;color AND for blood .ob_ypad dc 1 health_ dc.l dummy .ob_rotspeed dc.l 0 .ob_movspeed dc.l 0 .ob_shape dc.l tokens .ob_logic dc.l rts .ob_render dc.l drawshape_1 .ob_hit dc.l healthgot .ob_die dc.l healthgot .ob_eyey dc 0 ;eye height .ob_firey dc 0 ;where bullets come from .ob_gutsy dc 0 .ob_othery dc 0 .ob_colltype dc 0 .ob_collwith dc 24 .ob_cntrl dc 0 ;for player 0,1=joyport .ob_damage dc 0 .ob_hitpoints dc 0 .ob_think dc 0 .ob_frame dc.l $20000 .ob_framespeed dc.l 0 .ob_base dc 0 .ob_range dc 0 .ob_weapon dc 0 .ob_reload dc 0 .ob_hurtpause dc 5 .ob_punchrate dc 0 .ob_bouncecnt dc 0 .ob_something dc 0 .ob_scale dc $200 .ob_apad dc 0 .ob_blood dc $f00 ;color AND for blood .ob_ypad dc 1 weapon_ dc.l dummy .ob_rotspeed dc.l 0 .ob_movspeed dc.l 0 .ob_shape dc.l weapon2 .ob_logic dc.l weaponlogic .ob_render dc.l drawshape_1 .ob_hit dc.l weapongot .ob_die dc.l weapongot .ob_eyey dc 0 ;eye height .ob_firey dc 0 ;where bullets come from .ob_gutsy dc 0 .ob_othery dc 0 .ob_colltype dc 0 .ob_collwith dc 24 .ob_cntrl dc 0 ;for player 0,1=joyport .ob_damage dc 0 .ob_hitpoints dc 0 .ob_think dc 0 .ob_frame dc.l 0 .ob_framespeed dc.l $08000 .ob_base dc 4 .ob_range dc 4 .ob_weapon dc 1 .ob_reload dc 0 .ob_hurtpause dc 0 .ob_punchrate dc 0 .ob_bouncecnt dc 0 .ob_something dc 0 .ob_scale dc $200 .ob_apad dc 0 .ob_blood dc 0 ;color AND for blood .ob_ypad dc 0 thermo_ dc.l dummy .ob_rotspeed dc.l 0 .ob_movspeed dc.l 0 .ob_shape dc.l tokens .ob_logic dc.l rts .ob_render dc.l drawshape_1 .ob_hit dc.l thermogot .ob_die dc.l thermogot .ob_eyey dc 0 ;eye height .ob_firey dc 0 ;where bullets come from .ob_gutsy dc 0 .ob_othery dc 0 .ob_colltype dc 0 .ob_collwith dc 24 .ob_cntrl dc 0 ;for player 0,1=joyport .ob_damage dc 0 .ob_hitpoints dc 0 .ob_think dc 0 .ob_frame dc.l $00000 .ob_framespeed dc.l 0 .ob_base dc 0 .ob_range dc 0 .ob_weapon dc 0 .ob_reload dc 0 .ob_hurtpause dc 5 .ob_punchrate dc 0 .ob_bouncecnt dc 0 .ob_something dc 0 .ob_scale dc $200 .ob_apad dc 0 .ob_blood dc $f00 ;color AND for blood .ob_ypad dc 1 infra_ dc.l dummy .ob_rotspeed dc.l 0 .ob_movspeed dc.l 0 .ob_shape dc.l tokens .ob_logic dc.l rts .ob_render dc.l drawshape_1 .ob_hit dc.l thermogot .ob_die dc.l thermogot .ob_eyey dc 0 ;eye height .ob_firey dc 0 ;where bullets come from .ob_gutsy dc 0 .ob_othery dc 0 .ob_colltype dc 0 .ob_collwith dc 24 .ob_cntrl dc 0 ;for player 0,1=joyport .ob_damage dc 0 .ob_hitpoints dc 0 .ob_think dc 0 .ob_frame dc.l $00000 .ob_framespeed dc.l 0 .ob_base dc 0 .ob_range dc 0 .ob_weapon dc 0 .ob_reload dc 0 .ob_hurtpause dc 5 .ob_punchrate dc 0 .ob_bouncecnt dc 0 .ob_something dc 0 .ob_scale dc $200 .ob_apad dc 0 .ob_blood dc $f00 ;color AND for blood .ob_ypad dc 1 invisi_ dc.l dummy .ob_rotspeed dc.l 0 .ob_movspeed dc.l 0 .ob_shape dc.l tokens .ob_logic dc.l rts .ob_render dc.l drawshape_1 .ob_hit dc.l invisigot .ob_die dc.l invisigot .ob_eyey dc 0 ;eye height .ob_firey dc 0 ;where bullets come from .ob_gutsy dc 0 .ob_othery dc 0 .ob_colltype dc 0 .ob_collwith dc 24 .ob_cntrl dc 0 ;for player 0,1=joyport .ob_damage dc 0 .ob_hitpoints dc 0 .ob_think dc 0 .ob_frame dc.l $10000 .ob_framespeed dc.l 0 .ob_base dc 0 .ob_range dc 0 .ob_weapon dc 0 .ob_reload dc 0 .ob_hurtpause dc 5 .ob_punchrate dc 0 .ob_bouncecnt dc 0 .ob_something dc 0 .ob_scale dc $200 .ob_apad dc 0 .ob_blood dc $f00 ;color AND for blood .ob_ypad dc 1 invinc_ dc.l dummy .ob_rotspeed dc.l 0 .ob_movspeed dc.l 0 .ob_shape dc.l tokens .ob_logic dc.l rts .ob_render dc.l drawshape_1 .ob_hit dc.l invincgot .ob_die dc.l invincgot .ob_eyey dc 0 ;eye height .ob_firey dc 0 ;where bullets come from .ob_gutsy dc 0 .ob_othery dc 0 .ob_colltype dc 0 .ob_collwith dc 24 .ob_cntrl dc 0 ;for player 0,1=joyport .ob_damage dc 0 .ob_hitpoints dc 0 .ob_think dc 0 .ob_frame dc.l $20000 .ob_framespeed dc.l 0 .ob_base dc 0 .ob_range dc 0 .ob_weapon dc 0 .ob_reload dc 0 .ob_hurtpause dc 5 .ob_punchrate dc 0 .ob_bouncecnt dc 0 .ob_something dc 0 .ob_scale dc $200 .ob_apad dc 0 .ob_blood dc $f00 ;color AND for blood .ob_ypad dc 1 dragon_ dc.l dummy .ob_rotspeed dc.l $ffff0000 .ob_movspeed dc.l $c0000 .ob_shape dc.l dragon .ob_logic dc.l dragonlogic .ob_render dc.l drawshape_8 .ob_hit dc.l rts ;hurtngrunt .ob_die dc.l blowdragon ;object .ob_eyey dc -64 ;eye height .ob_firey dc -144 ;where bullets come from .ob_gutsy dc -64 .ob_othery dc 0 .ob_colltype dc 0 .ob_collwith dc 24+3 .ob_cntrl dc 0 ;for player 0,1=joyport .ob_damage dc 10 .ob_hitpoints dc 250 .ob_think dc 0 .ob_frame dc.l 0 .ob_framespeed dc.l $4000 .ob_base dc 16 .ob_range dc 32 .ob_weapon dc 0 ;weapon type... .ob_reload dc 0 .ob_hurtpause dc 5 .ob_punchrate dc 0 .ob_bouncecnt dc 0 .ob_something dc 0 .ob_scale dc $300 .ob_apad dc 0 .ob_blood dc $f00 ;color AND for blood .ob_ypad dc 1 bouncy_ dc.l dummy .ob_rotspeed dc.l 0 .ob_movspeed dc.l 0 .ob_shape dc.l tokens .ob_logic dc.l bouncylogic .ob_render dc.l drawshape_1 .ob_hit dc.l bouncygot .ob_die dc.l bouncygot .ob_eyey dc 0 ;eye height .ob_firey dc 0 ;where bullets come from .ob_gutsy dc 0 .ob_othery dc 0 .ob_colltype dc 0 .ob_collwith dc 24 .ob_cntrl dc 0 ;for player 0,1=joyport .ob_damage dc 0 .ob_hitpoints dc 0 .ob_think dc 0 .ob_frame dc.l $30000 .ob_framespeed dc.l 0 .ob_base dc 0 .ob_range dc 0 .ob_weapon dc 0 .ob_reload dc 0 .ob_hurtpause dc 0 .ob_punchrate dc 0 .ob_bouncecnt dc 0 .ob_something dc 0 .ob_scale dc $200 .ob_apad dc 0 .ob_blood dc $f00 ;color AND for blood .ob_ypad dc 1 marine_ dc.l dummy .ob_rotspeed dc.l $30000 .ob_movspeed dc.l $60000 .ob_shape dc.l marine .ob_logic dc.l monsterlogic .ob_render dc.l drawshape_8 .ob_hit dc.l hurtngrunt .ob_die dc.l blowobject .ob_eyey dc -64 ;eye height .ob_firey dc -60 ;where bullets come from .ob_gutsy dc -64 .ob_othery dc 0 .ob_colltype dc 0 .ob_collwith dc 24+3 .ob_cntrl dc 0 ;for player 0,1=joyport .ob_damage dc 1 .ob_hitpoints dc 5 .ob_think dc 0 .ob_frame dc.l 0 .ob_framespeed dc.l $6000 .ob_base dc 16 .ob_range dc 32 .ob_weapon dc 0 ;weapon type... .ob_reload dc 0 .ob_hurtpause dc 5 .ob_punchrate dc 0 .ob_bouncecnt dc 0 .ob_something dc 0 .ob_scale dc $200 .ob_apad dc 0 .ob_blood dc $f00 ;color AND for blood .ob_ypad dc 1 baldy_ dc.l dummy .ob_rotspeed dc.l $30000 .ob_movspeed dc.l $40000 .ob_shape dc.l baldy .ob_logic dc.l baldylogic .ob_render dc.l drawshape_8 .ob_hit dc.l hurtngrunt .ob_die dc.l blowobject .ob_eyey dc -64 ;eye height .ob_firey dc -60 ;where bullets come from .ob_gutsy dc -64 .ob_othery dc 0 .ob_colltype dc 0 .ob_collwith dc 24+3 .ob_cntrl dc 0 ;for player 0,1=joyport .ob_damage dc 2 .ob_hitpoints dc 10 .ob_think dc 0 .ob_frame dc.l 0 .ob_framespeed dc.l $4000 .ob_base dc 8 .ob_range dc 16 .ob_weapon dc 0 ;weapon type... .ob_reload dc 0 .ob_hurtpause dc 3 .ob_punchrate dc 4 .ob_bouncecnt dc 0 .ob_something dc 0 .ob_scale dc $220 .ob_apad dc 0 .ob_blood dc $f00 ;color AND for blood .ob_ypad dc 1 terra_ dc.l dummy .ob_rotspeed dc.l $30000 .ob_movspeed dc.l $20000 .ob_shape dc.l terra .ob_logic dc.l terralogic .ob_render dc.l drawshape_8 .ob_hit dc.l hurtterra ;ngrunt .ob_die dc.l blowterra .ob_eyey dc -64 ;eye height .ob_firey dc -60 ;where bullets come from .ob_gutsy dc -64 .ob_othery dc 0 .ob_colltype dc 0 .ob_collwith dc 24+3 .ob_cntrl dc 0 ;for player 0,1=joyport .ob_damage dc 1 .ob_hitpoints dc 35 .ob_think dc 0 .ob_frame dc.l 0 .ob_framespeed dc.l $6000 .ob_base dc 32 .ob_range dc 48 .ob_weapon dc 0 ;weapon type... .ob_reload dc 0 .ob_hurtpause dc 0 .ob_firerate dc 12 ;how often terra fires .ob_bouncecnt dc 0 ;how many times .ob_firecnt dc 5 .ob_scale dc $280 .ob_apad dc 0 .ob_blood dc $fff ;color AND for blood .ob_ypad dc 1 ghoul_ dc.l dummy .ob_rotspeed dc.l $0 .ob_movspeed dc.l $80000 .ob_shape dc.l ghoul .ob_logic dc.l ghoullogic .ob_render dc.l drawshape_8 .ob_hit dc.l hurtghoul .ob_die dc.l blowobject .ob_eyey dc -64 ;eye height .ob_firey dc -64 ;where bullets come from .ob_gutsy dc -64 .ob_othery dc 0 .ob_colltype dc 0 .ob_collwith dc 24+3 .ob_cntrl dc 0 ;for player 0,1=joyport .ob_damage dc 0 .ob_hitpoints dc 5 .ob_think dc 0 .ob_frame dc.l 0 .ob_framespeed dc.l 0 .ob_base dc 32 .ob_range dc 48 .ob_weapon dc 0 ;weapon type... .ob_reload dc 0 .ob_hurtpause dc 5 .ob_firerate dc 12 ;how often terra fires .ob_bouncecnt dc 0 ;how many times .ob_firecnt dc 5 .ob_scale dc $200 .ob_apad dc 0 .ob_blood dc $80f0 ;color AND for blood .ob_ypad dc 1 phantom_ dc.l dummy .ob_rotspeed dc.l $30000 .ob_movspeed dc.l $a0000 .ob_shape dc.l phantom .ob_logic dc.l phantomlogic .ob_render dc.l drawshape_8 .ob_hit dc.l hurtngrunt .ob_die dc.l blowobject .ob_eyey dc -64 ;eye height .ob_firey dc -60 ;where bullets come from .ob_gutsy dc -64 .ob_othery dc 0 .ob_colltype dc 0 .ob_collwith dc 3 .ob_cntrl dc 0 ;for player 0,1=joyport .ob_damage dc 3 .ob_hitpoints dc 10 .ob_think dc 0 .ob_frame dc.l 0 .ob_framespeed dc.l $a000 .ob_base dc 8 .ob_range dc 16 .ob_weapon dc 0 ;weapon type... .ob_reload dc 0 .ob_hurtpause dc 7 .ob_punchrate dc 0 .ob_bouncecnt dc 0 .ob_something dc 0 .ob_scale dc $280 .ob_apad dc 0 .ob_blood dc $ff0 ;color AND for blood .ob_ypad dc 1 demon_ dc.l dummy .ob_rotspeed dc.l $30000 .ob_movspeed dc.l $70000 .ob_shape dc.l demon .ob_logic dc.l demonlogic .ob_render dc.l drawshape_8 .ob_hit dc.l hurtngrunt .ob_die dc.l blowobject .ob_eyey dc -64 ;eye height .ob_firey dc -90 ;where bullets come from .ob_gutsy dc -72 .ob_othery dc 0 .ob_colltype dc 0 .ob_collwith dc 3 .ob_cntrl dc 0 ;for player 0,1=joyport .ob_damage dc 5 .ob_hitpoints dc 25 .ob_think dc 0 .ob_frame dc.l 0 .ob_framespeed dc.l $7000 .ob_base dc 32 .ob_range dc 4 .ob_weapon dc 0 ;weapon type... .ob_reload dc 0 .ob_hurtpause dc 5 .ob_punchrate dc 0 .ob_bouncecnt dc 0 .ob_something dc 0 .ob_scale dc $380 .ob_apad dc 0 .ob_blood dc $f00 ;color AND for blood .ob_ypad dc 1 weapon1_ dc.l dummy .ob_rotspeed dc.l 0 .ob_movspeed dc.l 0 .ob_shape dc.l weapon1 .ob_logic dc.l weaponlogic .ob_render dc.l drawshape_1 .ob_hit dc.l weapongot .ob_die dc.l weapongot .ob_eyey dc 0 ;eye height .ob_firey dc 0 ;where bullets come from .ob_gutsy dc 0 .ob_othery dc 0 .ob_colltype dc 0 .ob_collwith dc 24 .ob_cntrl dc 0 ;for player 0,1=joyport .ob_damage dc 0 .ob_hitpoints dc 0 .ob_think dc 0 .ob_frame dc.l 0 .ob_framespeed dc.l $08000 .ob_base dc 4 .ob_range dc 4 .ob_weapon dc 0 .ob_reload dc 0 .ob_hurtpause dc 0 .ob_punchrate dc 0 .ob_bouncecnt dc 0 .ob_something dc 0 .ob_scale dc $200 .ob_apad dc 0 .ob_blood dc 0 ;color AND for blood .ob_ypad dc 0 weapon2_ dc.l dummy .ob_rotspeed dc.l 0 .ob_movspeed dc.l 0 .ob_shape dc.l weapon2 .ob_logic dc.l weaponlogic .ob_render dc.l drawshape_1 .ob_hit dc.l weapongot .ob_die dc.l weapongot .ob_eyey dc 0 ;eye height .ob_firey dc 0 ;where bullets come from .ob_gutsy dc 0 .ob_othery dc 0 .ob_colltype dc 0 .ob_collwith dc 24 .ob_cntrl dc 0 ;for player 0,1=joyport .ob_damage dc 0 .ob_hitpoints dc 0 .ob_think dc 0 .ob_frame dc.l 0 .ob_framespeed dc.l $08000 .ob_base dc 4 .ob_range dc 4 .ob_weapon dc 1 .ob_reload dc 0 .ob_hurtpause dc 0 .ob_punchrate dc 0 .ob_bouncecnt dc 0 .ob_something dc 0 .ob_scale dc $200 .ob_apad dc 0 .ob_blood dc 0 ;color AND for blood .ob_ypad dc 0 weapon3_ dc.l dummy .ob_rotspeed dc.l 0 .ob_movspeed dc.l 0 .ob_shape dc.l weapon3 .ob_logic dc.l weaponlogic .ob_render dc.l drawshape_1 .ob_hit dc.l weapongot .ob_die dc.l weapongot .ob_eyey dc 0 ;eye height .ob_firey dc 0 ;where bullets come from .ob_gutsy dc 0 .ob_othery dc 0 .ob_colltype dc 0 .ob_collwith dc 24 .ob_cntrl dc 0 ;for player 0,1=joyport .ob_damage dc 0 .ob_hitpoints dc 0 .ob_think dc 0 .ob_frame dc.l 0 .ob_framespeed dc.l $08000 .ob_base dc 4 .ob_range dc 4 .ob_weapon dc 2 .ob_reload dc 0 .ob_hurtpause dc 0 .ob_punchrate dc 0 .ob_bouncecnt dc 0 .ob_something dc 0 .ob_scale dc $200 .ob_apad dc 0 .ob_blood dc 0 ;color AND for blood .ob_ypad dc 0 weapon4_ dc.l dummy .ob_rotspeed dc.l 0 .ob_movspeed dc.l 0 .ob_shape dc.l weapon4 .ob_logic dc.l weaponlogic .ob_render dc.l drawshape_1 .ob_hit dc.l weapongot .ob_die dc.l weapongot .ob_eyey dc 0 ;eye height .ob_firey dc 0 ;where bullets come from .ob_gutsy dc 0 .ob_othery dc 0 .ob_colltype dc 0 .ob_collwith dc 24 .ob_cntrl dc 0 ;for player 0,1=joyport .ob_damage dc 0 .ob_hitpoints dc 0 .ob_think dc 0 .ob_frame dc.l 0 .ob_framespeed dc.l $08000 .ob_base dc 4 .ob_range dc 4 .ob_weapon dc 3 .ob_reload dc 0 .ob_hurtpause dc 0 .ob_punchrate dc 0 .ob_bouncecnt dc 0 .ob_something dc 0 .ob_scale dc $200 .ob_apad dc 0 .ob_blood dc 0 ;color AND for blood .ob_ypad dc 0 weapon5_ dc.l dummy .ob_rotspeed dc.l 0 .ob_movspeed dc.l 0 .ob_shape dc.l weapon5 .ob_logic dc.l weaponlogic .ob_render dc.l drawshape_1 .ob_hit dc.l weapongot .ob_die dc.l weapongot .ob_eyey dc 0 ;eye height .ob_firey dc 0 ;where bullets come from .ob_gutsy dc 0 .ob_othery dc 0 .ob_colltype dc 0 .ob_collwith dc 24 .ob_cntrl dc 0 ;for player 0,1=joyport .ob_damage dc 0 .ob_hitpoints dc 0 .ob_think dc 0 .ob_frame dc.l 0 .ob_framespeed dc.l $08000 .ob_base dc 4 .ob_range dc 4 .ob_weapon dc 4 .ob_reload dc 0 .ob_hurtpause dc 0 .ob_punchrate dc 0 .ob_bouncecnt dc 0 .ob_something dc 0 .ob_scale dc $200 .ob_apad dc 0 .ob_blood dc 0 ;color AND for blood .ob_ypad dc 0 lizard_ dc.l dummy .ob_rotspeed dc.l $30000 .ob_movspeed dc.l $60000 .ob_shape dc.l lizard .ob_logic dc.l lizardlogic .ob_render dc.l drawshape_8 .ob_hit dc.l lizhurt .ob_die dc.l blowobject .ob_eyey dc -64 ;eye height .ob_firey dc -60 ;where bullets come from .ob_gutsy dc -64 .ob_othery dc 0 .ob_colltype dc 0 .ob_collwith dc 24+3 .ob_cntrl dc 0 ;for player 0,1=joyport .ob_damage dc 2 .ob_hitpoints dc 10 .ob_think dc 0 .ob_frame dc.l 0 .ob_framespeed dc.l $4000 .ob_base dc 8 .ob_range dc 8 .ob_weapon dc 0 ;weapon type... .ob_reload dc 0 .ob_hurtpause dc 2 .ob_punchrate dc 3 .ob_bouncecnt dc 0 .ob_something dc 0 .ob_scale dc $240 .ob_apad dc 0 .ob_blood dc $f0f ;color AND for blood .ob_ypad dc 1 deathhead_ dc.l dummy .ob_rotspeed dc.l 0 .ob_movspeed dc.l $c0000 .ob_shape dc.l deathhead .ob_logic dc.l deathheadlogic .ob_render dc.l drawshape_8 .ob_hit dc.l hurtdeath .ob_die dc.l blowdeath .ob_eyey dc -64 ;eye height .ob_firey dc -60 ;where bullets come from .ob_gutsy dc -96 .ob_othery dc 0 .ob_colltype dc 0 .ob_collwith dc 24+3 .ob_cntrl dc 0 ;for player 0,1=joyport .ob_damage dc 3 .ob_hitpoints dc 35 .ob_think dc 0 .ob_frame dc.l $8000 .ob_framespeed dc.l $6000 .ob_base dc -8 .ob_range dc 16 .ob_weapon dc 0 ;weapon type... .ob_reload dc 0 .ob_hurtpause dc 10 .ob_punchrate dc 0 .ob_bouncecnt dc 0 .ob_something dc 0 .ob_scale dc $200 .ob_apad dc 0 .ob_blood dc $f00 ;color AND for blood .ob_ypad dc 1 troll_ dc.l dummy .ob_rotspeed dc.l $30000 .ob_movspeed dc.l $60000 .ob_shape dc.l troll .ob_logic dc.l trolllogic .ob_render dc.l drawshape_8 .ob_hit dc.l trollhurt .ob_die dc.l blowobject .ob_eyey dc -64 ;eye height .ob_firey dc -60 ;where bullets come from .ob_gutsy dc -64 .ob_othery dc 0 .ob_colltype dc 0 .ob_collwith dc 24+3 .ob_cntrl dc 0 ;for player 0,1=joyport .ob_damage dc 3 .ob_hitpoints dc 18 .ob_think dc 0 .ob_frame dc.l 0 .ob_framespeed dc.l $4000 .ob_base dc 8 .ob_range dc 8 .ob_weapon dc 0 ;weapon type... .ob_reload dc 0 .ob_hurtpause dc 2 .ob_punchrate dc 3 .ob_bouncecnt dc 0 .ob_something dc 0 .ob_scale dc $240 .ob_apad dc 0 .ob_blood dc $f00 ;color AND for blood .ob_ypad dc 1 abouttext dc.b 14 dc.b 'GLOOM',0 dc.b 0 dc.b 'A BLACK MAGIC GAME',0 dc.b 0 dc.b 'PROGRAMMED BY MARK SIBLY',0 dc.b 'GRAPHICS BY THE BUTLER BROTHERS',0 dc.b 'MUSIC BY KEV STANNARD',0 dc.b 'AUDIO BY US',0 dc.b 'PRODUCED BY US',0 dc.b 'DESIGNED BY US',0 dc.b 'GAME CODED IN DEVPAC2',0 dc.b 'UTILITIES CODED IN BLITZ BASIC 2',0 dc.b 'RENDERED IN DPAINT3 AND DPAINT4',0 dc.b 'DECRUNCHING CODE BY THOMAS SCHWARZ',0 even sqrinc incbin sqr.bin weapon1 dc.l bullet1,sparks1 weapon2 dc.l bullet2,sparks2 weapon3 dc.l bullet3,sparks3 weapon4 dc.l bullet4,sparks4 weapon5 dc.l bullet5,sparks5 bullet1 incbin bullet1.bin bullet2 incbin bullet2.bin bullet3 incbin bullet3.bin bullet4 incbin bullet4.bin bullet5 incbin bullet5.bin sparks1 incbin sparks1.bin sparks2 incbin sparks2.bin sparks3 incbin sparks3.bin sparks4 incbin sparks4.bin sparks5 incbin sparks5.bin medplayer incbin medplay decrm incbin decrm castrotsinc incbin castrots128.bin camrotsinc incbin camrots.bin ;256 camrots2inc incbin camrots2.bin ;1024 chatfont incbin chatfont.bin copinit_ecs dc $096,$120 ; dc $08e,$2c81,$090,$1cc1 ;320X240 dc $092,$38,$094,$d0,$102,0,$104,0,$106,0 dc $100,$6200,$108,5*40,$10a,5*40,$10c,0 ; ;palette layout: ; ;hinybs of first 32,lonybs,hinybs of second 32,lonybs ; palette_ecs dc $180,0,$182,0,$184,0,$186,0 dc $188,0,$18a,0,$18c,0,$18e,0 dc $190,0,$192,0,$194,0,$196,0 dc $198,0,$19a,0,$19c,0,$19e,0 dc $1a0,0,$1a2,0,$1a4,0,$1a6,0 dc $1a8,0,$1aa,0,$1ac,0,$1ae,0 dc $1b0,0,$1b2,0,$1b4,0,$1b6,0 dc $1b8,0,$1ba,0,$1bc,0,$1be,0 ; bitplanes_ecs dc $e0,0,$e2,0 dc $e4,0,$e6,0 dc $e8,0,$ea,0 dc $ec,0,$ee,0 dc $f0,0,$f2,0 dc $f4,0,$f6,0 ; dc 26<<8+1,$fffe ; sprites_ecs dc $140,0,$142,0,$144,0,$146,0 dc $148,0,$14a,0,$14c,0,$14e,0 dc $150,0,$152,0,$154,0,$156,0 dc $158,0,$15a,0,$15c,0,$15e,0 dc $160,0,$162,0,$164,0,$166,0 dc $168,0,$16a,0,$16c,0,$16e,0 dc $170,0,$172,0,$174,0,$176,0 dc $178,0,$17a,0,$17c,0,$17e,0 ; dc 32<<8+1,$fffe,$096,$8100 ; dc.l $fffffffe copfinit_ecs ; cols32 macro ;bank,losel dc $106,(\1<<13)|(\2<<9) dc $180,0,$182,0,$184,0,$186,0 dc $188,0,$18a,0,$18c,0,$18e,0 dc $190,0,$192,0,$194,0,$196,0 dc $198,0,$19a,0,$19c,0,$19e,0 dc $1a0,0,$1a2,0,$1a4,0,$1a6,0 dc $1a8,0,$1aa,0,$1ac,0,$1ae,0 dc $1b0,0,$1b2,0,$1b4,0,$1b6,0 dc $1b8,0,$1ba,0,$1bc,0,$1be,0 endm copinit_aga ;copperlist for AGA amigas ; dc $1fc,15,$096,$120 ; dc $08e,$2c81,$090,$1cc1 dc $092,$38,$094,$a0,$102,0,$104,0,$106,0 dc $100,$7200,$108,7*40,$10a,7*40,$10c,0 ; ;palette layout: ; ;hinybs of first 32,lonybs,hinybs of second 32,lonybs ; palette_aga cols32 0,0 cols32 0,1 cols32 1,0 cols32 1,1 cols32 2,0 cols32 2,1 cols32 3,0 cols32 3,1 cols32 4,0 cols32 4,1 cols32 5,0 cols32 5,1 cols32 6,0 cols32 6,1 cols32 7,0 cols32 7,1 ; bitplanes_aga dc $e0,0,$e2,0 dc $e4,0,$e6,0 dc $e8,0,$ea,0 dc $ec,0,$ee,0 dc $f0,0,$f2,0 dc $f4,0,$f6,0 dc $f8,0,$fa,0 dc $fc,0,$fe,0 ; dc 26<<8+1,$fffe ; sprites_aga dc $140,0,$142,0,$144,0,$146,0 dc $148,0,$14a,0,$14c,0,$14e,0 dc $150,0,$152,0,$154,0,$156,0 dc $158,0,$15a,0,$15c,0,$15e,0 dc $160,0,$162,0,$164,0,$166,0 dc $168,0,$16a,0,$16c,0,$16e,0 dc $170,0,$172,0,$174,0,$176,0 dc $178,0,$17a,0,$17c,0,$17e,0 ; dc 32<<8+1,$fffe,$096,$8100 ; dc.l $fffffffe copfinit_aga ; paladjust ds.b 256 ;remaping for scrambled bitplanes map_rgbs_ ds.w 256 ;4bit RGB palette for a game