diff --git a/AGZ-1.IFF b/AGZ-1.IFF new file mode 100644 index 0000000..c834f70 Binary files /dev/null and b/AGZ-1.IFF differ diff --git a/AGZ-2.IFF b/AGZ-2.IFF new file mode 100644 index 0000000..e1b140a Binary files /dev/null and b/AGZ-2.IFF differ diff --git a/AGZ-3.IFF b/AGZ-3.IFF new file mode 100644 index 0000000..8c2d75b Binary files /dev/null and b/AGZ-3.IFF differ diff --git a/Devpac.prefs b/Devpac.prefs new file mode 100644 index 0000000..2dc8ff5 --- /dev/null +++ b/Devpac.prefs @@ -0,0 +1,36 @@ +TAB=16 +ICONS=NO +INDENT=NO +BACKUPS=NO +SCREEN=NO +KEYPAD=NO +LAYOUT=STACKED +EOL=IGNORE +WORD=ALT +UNIT=0 +FONT=topaz/8 +SCREENFONT=topaz/8 +DEFWIN=0,8,660,248 +PREFREQ=103,57 +FINDREQ=64,11 +FINDCASE=NO +FINDWORD=NO +PRINTREQ=97,51 +PRINT=FILE +COPIES=1 +NUMBERS=NO +DEVICE=PRT: +SIMPLEREQ=118,64 +TODISK=YES +ARGS= +EXECUTE= +EXECREQ=78,69 +RUNREQ=70,69 +TOOLDIR=work: +GENAM=FIRST +MONAM=FIRST +TOOLREQ=148,60 +CONTROLREQ=0,28 +OPTIONSREQ=7,36 +OPTIMISEREQ=28,37 +OUTPUTWIN=0,35,640,150 diff --git a/GLOOM_Man.iff b/GLOOM_Man.iff new file mode 100644 index 0000000..5696f6e Binary files /dev/null and b/GLOOM_Man.iff differ diff --git a/GenAm.opts b/GenAm.opts new file mode 100644 index 0000000..a39ca88 --- /dev/null +++ b/GenAm.opts @@ -0,0 +1,3 @@ +-vp=68020 +mex +nocase diff --git a/Gloom-_HD b/Gloom-_HD new file mode 100644 index 0000000..0f669f8 Binary files /dev/null and b/Gloom-_HD differ diff --git a/Gloom-_HD.info b/Gloom-_HD.info new file mode 100644 index 0000000..433877c Binary files /dev/null and b/Gloom-_HD.info differ diff --git a/Untitled b/Untitled new file mode 100644 index 0000000..70e1db3 Binary files /dev/null and b/Untitled differ diff --git a/advert b/advert new file mode 100644 index 0000000..d287054 Binary files /dev/null and b/advert differ diff --git a/advert.iff b/advert.iff new file mode 100644 index 0000000..4d0fcea Binary files /dev/null and b/advert.iff differ diff --git a/advert.iff.info b/advert.iff.info new file mode 100644 index 0000000..e3fd2db Binary files /dev/null and b/advert.iff.info differ diff --git a/advert.pal b/advert.pal new file mode 100644 index 0000000..1487ce6 Binary files /dev/null and b/advert.pal differ diff --git a/allbulls b/allbulls new file mode 100644 index 0000000..23b09ae Binary files /dev/null and b/allbulls differ diff --git a/allbulls.iff b/allbulls.iff new file mode 100644 index 0000000..b6d60af Binary files /dev/null and b/allbulls.iff differ diff --git a/allbulls.info b/allbulls.info new file mode 100644 index 0000000..f18f11a Binary files /dev/null and b/allbulls.info differ diff --git a/ap.s b/ap.s new file mode 100644 index 0000000..b7653c6 --- /dev/null +++ b/ap.s @@ -0,0 +1,12621 @@ + + ;OK, add a cheat mode! + ; + ;adding chat-line... + ; + ;OK, modem stuff... + ; + ;Once 2 machines are linked, player 1 gets to choose options! + ;player 2 is ignored... + ; + ;player 1 if linked=1, 2 if linked=-1 + + ;********* + ;* GLOOM * + ;********* + ; + ;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! + +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 +onedemo 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 6 +grdshft equ 8 +darkshft equ 7 ;smaller=smaller range=faster! +maxz equ 16<>1 + ; +linemod equ 40*7 + + 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 ;nomralized 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_copmod 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 ; + 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 bsr execscript_med +.wmf tst fadevol + bne.s .wmf + tst twowins + beq.s .n22 + bsr swaphflags +.n22 bsr bigfont + bra .intro + ; +exittoos bsr freeobjlist2 + move #$4000,$dff09a + move.l ciaa,a0 + movem.l rawstuff,d0-d1 + movem.l d0-d1,$64(a0) + move #$c000,$dff09a + jsr permit + jsr finitdisplay + jsr finitvbint + jsr finitsfx + jsr finitser + jsr freememlist + jsr undir + ; + 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 + ; + move.l player1,a5 + move.l ob_palette(a5),-(a7) + move.l #palettesw,ob_palette(a5) + move.l ob_window(a5),a2 + jsr plotwbmap + ; + tst twowins + beq .p1 + ; + move.l player2,a5 + move.l ob_palette(a5),-(a7) + move.l #palettesw,ob_palette(a5) + move.l ob_window(a5),a2 + jsr plotwbmap +.p1 ; + bsr drawall2 + ; + move.l player1,a5 + lea gamemenu,a4 + move.l ob_window(a5),a6 + jsr initmenu + ; +.loop bsr selmenu + beq .done + ; + subq #1,d0 + bne .notpsize + bsr newpsize + 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 bsr finitmenu + ; + tst twowins + beq.s .p12 + ; + move.l player2,a5 + move.l (a7)+,ob_palette(a5) + move.l ob_window(a5),a2 + jsr plotwbmap + bsr initstats + bsr showstats +.p12 ; + move.l player1,a5 + move.l (a7)+,ob_palette(a5) + move.l ob_window(a5),a2 + jsr plotwbmap + bsr initstats + bsr showstats + ; + move #$20,$dff09a + ; + move (a7)+,linked + move (a7)+,framecnt + clr paused + ; + move #$8020,$dff09a + ; + rts + +freewindows lea window1,a0 + jsr freewindow + tst twowins + beq.s .p1 + lea window2,a0 + jsr freewindow +.p1 rts + +largewin move.l player1,a5 + bsr large + tst twowins + beq refresh + move.l player2,a5 + bsr large + bra refresh + +large move.l ob_window(a5),a6 + move wi_pw(a6),d2 + ; + cmp #2,d2 + beq .lhr + ; + ;large lo-res window! + ; +.lores move #324,d0 + move #240,d1 + bra thinkwin + ; +.lhr bsr swappsize + bra.s .lores + ; + move #180,d0 + move #240,d1 + bra thinkwin + +newwsize ;window size stuff! + ; + move.l player1,a5 + bsr swapwsize + tst twowins + beq refresh + move.l player2,a5 + bsr swapwsize + bra refresh + +swapwsize ;increment window size! + ; + move.l ob_window(a5),a6 + movem wi_w(a6),d0-d1 ;w,h + move wi_pw(a6),d2 + mulu d2,d0 + mulu d2,d1 + cmp #2,d2 + beq .hr + ; + ;lo-res! + ; + cmp #318,d0 + bcs.s .inc + move #132,d0 + move d0,d1 + bra thinkwin +.inc add #24,d0 + move d0,d1 + cmp #240,d1 + bls thinkwin + move #240,d1 + bra thinkwin + ; +.hr cmp #180,d0 + bcs.s .inc2 + tst twowins + bne .min + add #18,d1 + cmp #240,d1 + bls thinkwin +.min move #132,d0 + move d0,d1 + bra thinkwin +.inc2 add #24,d0 + move d0,d1 + ; +thinkwin move #180,d3 ;max width! + cmp #2,d2 + beq .gmax + move #318,d3 +.gmax cmp d3,d0 + bls .nm + move d3,d0 +.nm ; + cmp #240,d1 + bls .n240 + move #240,d1 +.n240 tst twowins + beq.s .ggt + move #120,d1 +.ggt ; + move #160,d3 + move d0,d4 + lsr #1,d4 + sub d4,d3 ;wi_x + move d3,wi_x(a6) + ; + ext.l d0 + divu d2,d0 + move d0,wi_w(a6) + ; + tst twowins + bne.s .skip3 + ; + move #cy,d3 + move d1,d4 + lsr #1,d4 + sub d4,d3 + move d3,wi_y(a6) + ; +.skip3 ext.l d1 + divu d2,d1 + move d1,wi_h(a6) + ; + rts + +newpsize ;toggle pixel size between 2 and 3 + ; + ;copy windows to temp so we can free 'em up later + ; + move.l player1,a5 + bsr swappsize + tst twowins + beq refresh + move.l player2,a5 + bsr swappsize + ; +refresh jsr dispoff + bsr finitmenu + ; + bsr freewindows + bsr putwindow + ; + lea window1,a0 + jsr makewindow + lea window1,a0 + jsr showwindow + ; + tst twowins + beq.s .p1 + ; + lea window2,a0 + jsr makewindow + lea window2,a0 + jsr showwindow + ; +.p1 jsr calcbpos + ; + lea gamemenu,a4 + lea window1,a6 + jsr initmenu2 + ; + bsr drawall2 + jsr dispon + rts + +swappsize move.l ob_window(a5),a6 + movem wi_w(a6),d0-d1 ;w,h + move wi_pw(a6),d2 + mulu d2,d0 + mulu d2,d1 + eor #1,d2 ;2,3... + move d2,wi_pw(a6) + move d2,wi_ph(a6) + ; + bra thinkwin + +showflag dc 0 + +showit ;don't show if beam in the way! + ; + move showflag(pc),d0 + beq.s .rts + ; + move.l $dff004,d0 + lsr.l #8,d0 ;beampos + and #$1ff,d0 + ; + cmp minbpos(pc),d0 + bcs.s .show + cmp maxbpos(pc),d0 + bcs.s .rts + ; + ;cmp minbpos(pc),d0 + ;bcc.s .rts + ; +.show clr showflag + lea window1,a0 + jsr showwindowq + lea window2,a0 + jmp showwindowq + ; +.rts rts + +drawall2 bsr drawall + bsr drawall + bra vwait + +drawall ; +.wait move doneflag(pc),d0 + beq.s .wait ;wait for update + clr doneflag +.wait2 move showflag(pc),d0 + bne.s .wait2 + ; + move.l memory(pc),memat + move.l player1(pc),a5 + bsr calcscene + move.l player1(pc),a5 + bsr blitscene + move.l player1(pc),a5 + bsr drawscene + ; + move twowins(pc),d0 + beq.s .show + ; + move.l memory(pc),memat + move.l player2(pc),a5 + bsr calcscene + move.l player2(pc),a5 + bsr blitscene + move.l player2(pc),a5 + bsr drawscene + ; +.show st showflag + rts + +resetplayer st ob_update(a5) + clr ob_mega(a5) + clr ob_thermo(a5) + clr ob_infra(a5) + clr ob_invisible(a5) + clr ob_messtimer(a5) + clr ob_pixsize(a5) + clr ob_pixsizeadd(a5) + clr ob_bouncecnt(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 ;a6=window, 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 + ; +.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 .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 wi_bmap(a6),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 ; + rts + +initstats ; + ;health... + move.l ob_window(a5),a0 + moveq #2,d0 + add wi_x(a0),d0 + move.l wi_bmap(a0),a1 + move.l font(pc),a0 + moveq #2,d1 + moveq #39,d2 + bsr blit + ; + ;weapon... + move.l ob_window(a5),a0 + moveq #2,d0 + add wi_x(a0),d0 + move.l wi_bmap(a0),a1 + move.l font(pc),a0 + moveq #12,d1 + moveq #44,d2 + bra blit + +putstrip ;a0=window + ; + move.l wi_bmap(a0),a1 + move wi_bh(a0),d0 + lsr #2,d0 + mulu #7*40,d0 + add.l d0,a1 ;dest + move.l wi_strip(a0),a0 ;src + ; + btst #6,$dff002 +.bwait btst #6,$dff002 + bne.s .bwait + ; + move.l #$9f00000,$dff040 + move.l #-1,$dff044 + move #0,$dff064 + move #0,$dff066 + move.l a0,$dff050 + move.l a1,$dff054 + move #(7*7)<<6+20,$dff058 + rts + +loff dc 0 + +showstats ;a5=player + ; + ;ok, hitpoints... + ; + ;lagtime... + move.l ob_window(a5),a0 + moveq #2,d0 + add wi_x(a0),d0 + move.l wi_bmap(a0),a1 + move.l font(pc),a0 + moveq #22,d1 + move lagtime(pc),d2 + bsr blit + ; + move.l ob_window(a5),a0 + moveq #44,d5 + add wi_x(a0),d5 + moveq #40,d4 + moveq #0,d6 + move ob_hitpoints(a5),d7 + ; +.hploop cmp d7,d6 + bcs.s .hpskip + cmp #25,d7 + bcc.s .hpdone + moveq #41,d4 + moveq #25,d7 + bra.s .hploop + ; +.hpskip move.l font(pc),a0 + move.l ob_window(a5),a1 + move.l wi_bmap(a1),a1 + move d5,d0 + moveq #2,d1 + move d4,d2 + bsr blit + addq #2,d5 + addq #1,d6 + bra.s .hploop +.hpdone ; + ;show lives remaining... + ; + move.l ob_window(a5),a0 + move wi_bw(a0),d5 + add wi_x(a0),d5 + move ob_lives(a5),d7 + beq.s .lvdone + subq #1,d7 +.lvloop ; + move.l font(pc),a0 + move.l ob_window(a5),a1 + move.l wi_bmap(a1),a1 + subq #8,d5 + move d5,d0 + moveq #2,d1 + moveq #43,d2 + bsr blit + dbf d7,.lvloop +.lvdone ; + ;show weapons! + ; + move.l ob_window(a5),a0 + moveq #44,d5 + add wi_x(a0),d5 + moveq #49,d4 + sub ob_weapon(a5),d4 ;0...4 + moveq #1,d7 +.wploop ; + move.l font(pc),a0 + move.l ob_window(a5),a1 + move.l wi_bmap(a1),a1 + move d5,d0 + moveq #12,d1 + moveq #50,d2 + cmp.b ob_reload(a5),d7 + blt.s .nowp + move d4,d2 +.nowp bsr blit + ; + add #10,d5 + addq #1,d7 + cmp #6,d7 + bcs.s .wploop + ; + rts + +blit ;a0=shapetable to blit, a1=bitmap, d0=X, d1=Y, d2=char + ; + add.l 4(a0,d2*4),a0 + ; + mulu #280,d1 + add.l d1,a1 + move d0,d2 + asr #3,d2 + add d2,a1 ;dest! + move.l a0,a2 + add.l (a0),a2 + lea 8(a0),a3 + addq #4,a0 + and #15,d0 + ror #4,d0 + ; + btst #6,$dff002 +.bwait btst #6,$dff002 + bne.s .bwait + ; + move.l a2,$dff050 + move.l a3,$dff04c + move.l a1,$dff048 + move.l a1,$dff054 + ; + move d0,$dff042 + or blitmode(pc),d0 + move d0,$dff040 + move.l #$ffff0000,$dff044 + moveq #-2,d0 + move d0,$dff064 + move d0,$dff062 + moveq #38,d0 + sub (a0)+,d0 + move d0,$dff060 + move d0,$dff066 + move (a0)+,$dff058 + ; + rts + +blitmode dc $fca + +pixsize dc 0 ;pixel size...at least 2! + +pixelate ;pixel out the coplist...d0=pixelsize + ; + move d0,pixsize + move d0,d1 + ; + ;pixel out vertically, then horizontally + ; + move.l cop(pc),a0 + lea coloffs(pc),a1 + moveq #0,d2 ;x + move d1,d6 + lsr #1,d6 +.forx ; + move.l a0,a3 + lea 0(a1,d2*4),a2 + add.l (a2),a3 + ; + move d2,d5 + add d6,d5 + cmp width(pc),d5 + ble.s .xok + move width(pc),d5 +.xok sub d2,d5 + ble .done + subq #1,d5 + ; +.loop2 moveq #0,d3 + move.l a3,a4 + move.l a0,a5 + add.l (a2)+,a5 + move d1,d7 + lsr #1,d7 ;first Y add +.fory ; + move (a4),d0 ;start column! + move d3,d4 + add d7,d4 + cmp hite(pc),d4 + ble.s .yok + move hite(pc),d4 +.yok sub d3,d4 + ble .nextx + subq #1,d4 + ; +.loop move d0,(a5) + add copmod(pc),a4 + add copmod(pc),a5 + ; + dbf d4,.loop + ; +.nexty add d7,d3 + move d1,d7 + bra.s .fory + ; +.nextx dbf d5,.loop2 + ; + add d6,d2 + move d1,d6 + bra.s .forx + ; +.done rts + +makeqstrip ; + ;do a simple roof/floor strip for blitter to wack in... + ; + cmp #$100,con0poke + bne.s .doit + rts + ; +.doit move.l qstrip(pc),a0 + move.l darktable(pc),a1 + move.l palette(pc),a2 + move.l qstripbot(pc),a4 + moveq #0,d2 + ; + move floorflag(pc),d0 + bne.s .fdone + ; + move camy(pc),d0 + neg d0 + ext.l d0 + lsl.l #focshft,d0 + ; + move.b qcols+1(pc),d2 + move.l qstripbot(pc),a4 + move maxy(pc),d1 + ; +.floop subq #1,d1 + beq.s .fdone + ; + move.l d0,d3 + divs d1,d3 + cmp #maxz,d3 + bcc .fdone + ; + move 0(a1,d3*2),d3 ;darkness (0...15) + move.l 0(a2,d3*4),a3 ;pal to use + move 0(a3,d2*2),-(a4) ;colour! + ; + bra.s .floop + ; +.fdone move roofflag(pc),d0 + bne.s .rdone + ; + move #-256,d0 + sub camy(pc),d0 + ext.l d0 + lsl.l #focshft,d0 ;cam Y + ; + move.b qcols(pc),d2 + ; + move miny(pc),d1 ;SY + ; +.rloop beq.s .rdone + ; + move.l d0,d3 + divs d1,d3 + cmp #maxz,d3 + bcc .rdone + ; + move 0(a1,d3*2),d3 ;darkness (0...15) + move.l 0(a2,d3*4),a3 ;pal to use + move 0(a3,d2*2),(a0)+ ;colour! + ; + addq #1,d1 + bra.s .rloop +.rdone ; + moveq #0,d0 +.loop cmp.l a4,a0 + bcc.s .done + move.l d0,(a0)+ + bra.s .loop + ; +.done 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 copmod(pc),d1 + move d1,flatyadd2 + ; + move d7,d0 + add midy(pc),d0 + mulu copmod(pc),d0 + add.l cop(pc),d0 + add.l coloffs(pc),d0 + move.l d0,a2 +.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 + ; + ;move.l d4,d2 + ;asr.l #1,d2 + ;add.l d2,d0 + ; + ;move.l d6,d2 + ;asr.l #1,d2 + ;add.l d2,d1 + ; + swap d0 + add camx(pc),d0 + swap d1 + add camz(pc),d1 + swap d4 + swap d6 + ; + move d7,-(a7) + moveq #127,d7 + moveq #0,d2 + moveq #0,d3 + ; + move.l a2,a3 + ; + move wdiv32(pc),-(a7) + ; +.hloop2 moveq #31,d5 + ; +.hloop tst (a3) ;check destination! + 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 0(a5,d3*2),(a3) + addx d2,d1 + addq #4,a3 + dbf d5,.hloop + bra.s .hhh + ; +.skip add.l d4,d0 + addx d2,d0 + add.l d6,d1 + addx d2,d1 + addq #4,a3 + dbf d5,.hloop + ; +.hhh addq #4,a3 + subq #1,(a7) + bgt.s .hloop2 + bne.s .kl + ; + move wrem32(pc),d5 + bpl.s .hloop + ; +.kl 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 + +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.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) + ; + tst finished2 + bne exec_loop + ; + 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 + bsr 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 + bsr 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 + +savernd lea rndtable(pc),a0 + lea rndback(pc),a1 + moveq #(rndtablef-rndtable)/2-1,d0 +.loop move (a0)+,(a1)+ + dbf d0,.loop + rts + +loadrnd lea rndback(pc),a0 + lea rndtable(pc),a1 + moveq #(rndtablef-rndtable)/2-1,d0 +.loop move (a0)+,(a1)+ + dbf d0,.loop + rts + +rndtable ds.w 55 +k_index dc.l 0 +j_index dc.l 0 +rndtablef + +rndback ds.b rndtablef-rndtable + +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 + +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 + +currplayer dc.l 0 + +calcscene ;a5=player object + ; + move #$20,$dff09a + ; + move.l a5,currplayer + move.l ob_palette(a5),palette + move ob_thermo(a5),thermo + move ob_infra(a5),infra + move ob_pixsize(a5),pixsize + ; + clr.l shapelist + move.l a5,a0 + bsr calccamera + bsr makewalls + ; + lea objects(pc),a5 + ; +.loop move.l (a5),a5 + tst.l (a5) + beq.s .done + cmp.l currplayer(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 bclr #7,ob_update(a5) + beq.s .noupdate + ; + bclr #7,ob_update+1(a5) + beq.s .stats + ; + move.l ob_window(a5),a2 + moveq #9,d0 + bsr wcopy + bsr initstats + ; +.stats bsr showstats + ; +.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 + ; + move.l ob_window(a5),a0 + bsr dbwindow + ; + bsr castwalls + bsr makeqstrip + bsr renderwalls + ; + 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 move roofflag(pc),d0 + ble.s .noflat + ; + move #-255,d0 + sub camy(pc),d0 + moveq #1,d1 + move miny(pc),d7 + move.l roof(pc),a0 + bsr flat + ; +.noflat bsr drawshapes + bsr drawblood + ; + move.l currplayer(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 chatinget(pc),d0 + cmp chatinput(pc),d0 + beq.s .rts + and #31,d0 + lea chatin(pc),a0 + move.b 0(a0,d0),d0 + addq #1,chatinget + 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 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 + ; +.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 ; +.waitser bsr serget + bpl.s .sergot + ; + ;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 .waitser + ; +.sergot lea joyxs(pc),a0 + tst.b d0 + bpl .djoy + and #$ff,d0 + move d0,finished + moveq #0,d0 + ; +.djoy bsr decodejoy + move.l (a0)+,joyx + move.l (a0),joyb + rts + +escape dc 0 + +readjoys ;fill in appropriate 'joyxn' block...check escape + ; + qkey $45 + beq.s .noesc + st escape +.noesc move finished(pc),d0 + or finished2(pc),d0 + bne.s .rts + ; + move.l player1(pc),a0 + bsr readjoy + move gametype(pc),d0 + beq.s .rts + move.l player2(pc),a0 + bra readjoy +.rts rts + +vbhandler movem.l d2-d7/a2-a6,-(a7) + ; + subq #1,(a1)+ ;inc/dec frame counters + addq #1,(a1) + ; + ;this done every frame! + bsr showit + bsr chatstuff + bsr sfxvbint + ; + btst #0,framecnt+1 + beq exit_vb + tst paused + bne exit_vb + ; + ;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 + 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 + bsr showit + ; + 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 + +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 + ; + ;bsr pickplayer + ;tst ob_invisible(a0) + ;bne.s .useold ;can't see player! no intelligence... + ;bsr calcangle + ; + 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 + +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 clr ob_rotspeed(a5) ;towards player! + 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 + ; + ;OK, one player game done! + ; +.allover move #2,finished + rts + ; +.not1p move.l player1,a0 + cmp.l a5,a0 + bne.s .goth + move.l player2,a0 +.goth tst ob_hitpoints(a0) + ble.s .allover + rts + +waitrestart bsr getcntrl + ; + bsr checkfireb + beq.s .rts + ; + move ob_weapon(a5),d0 + move d0,-(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 + move (a0)+,ob_x(a5) + move (a0)+,ob_z(a5) + move (a0)+,ob_rot(a5) + ; + move (a7)+,d0 + move d0,ob_weapon(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! + ; + move.l player1,a0 + cmp.l a5,a0 + bne.s .got + move.l player2,a0 +.got tst ob_hitpoints(a0) + ble.s .draw ;it's a draw! + ; +.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 +.draw ; + rts +.notcom ; + ;2 player? do damage to both players! + ; + tst gametype + beq.s .nlink + bsr getother + move #-1,ob_update(a0) + subq #1,ob_lives(a0) + bpl.s .nlink + clr ob_lives(a0) + ; +.nlink move #-1,ob_update(a5) + subq #1,ob_lives(a5) + bgt.s .rts + clr ob_lives(a5) + 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 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 + bra.s .kill + ; +.notfull bsr message + dc.b 'weapon boost!',0 + even + ; +.kill st ob_update(a5) + 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 + bra.s .kill + +invisigot 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 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 + +bouncygot 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 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 .nomega + bsr message + dc.b 'mega wepaon out...',0 + even + ; +.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 + +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 move ob_bounce(a5),d1 + bne.s .nob + rts +.nob add #30,ob_bounce(a5) + move ob_bounce(a5),d1 + and #127,d1 + cmp #30,d1 + bcc .fskip + clr ob_bounce(a5) + clr ob_frame(a5) + bra footstep + ; +.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 + move.l player1(pc),a0 + cmp.l a5,a0 + bne.s .gotcha + move.l player2(pc),a0 +.gotcha 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 + ; +.newok move.l d6,ob_x(a5) + move.l d7,ob_z(a5) + ; +.nosuck rts + +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 + +drawblood lea blood(pc),a5 + ; +.loop move.l (a5),a5 + tst.l (a5) + beq .done + ; + 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 #32,d2 + bcc.s .pix + tst bl_y(a5) + bgt.s .pix + ; + ;blit to screen! + ; + move #$20,$dff09a + ; + bsr savernd + move.l window(pc),a0 + move wi_bh(a0),d0 + subq #8,d0 + bsr rndn + move d0,d2 ;Y + ; + move wi_bw(a0),d0 + subq #8,d0 + bsr rndn ;X + add wi_x(a0),d0 + move d2,d1 + ; + move.l wi_bmap(a0),a1 + move.l font(pc),a0 + moveq #51,d2 + bsr blit + ; + bsr loadrnd + ; + move.l a5,a0 + killitem blood + move.l a0,a5 + ; + move #$8020,$dff09a + bra .loop +.pix ; + add midx(pc),d0 + add midy(pc),d1 + ; + move.l darktable(pc),a0 + move 0(a0,d2*2),d3 + ; + move.l cop(pc),a1 + ; + lea coloffs,a2 + add.l 0(a2,d0*4),a1 + mulu copmod(pc),d1 + ; + move blcols(pc,d3*2),d3 + and bl_color(a5),d3 + move d3,0(a1,d1.l) + bra .loop + ; +.done 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 + ; + addq #1,frame + ; + 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 d0,a5 + ; + cmp wl_lsx(a5),d7 + blt.s .loop2 + cmp wl_rsx(a5),d7 + bgt.s .loop2 + ; + 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<d2 + jsr -156(a6) + move.l d2,vbr + ; + lea ciaaname,a1 + jsr -498(a6) + move.l d0,ciaa + move.l d0,a0 + movem.l $64(a0),d0-d1 + movem.l d0-d1,rawstuff + move #$4000,$dff09a + move.l rawtable(pc),$64(a0) + move.l #rawkeyread,$68(a0) + move #$c000,$dff09a + ; + move.l #8,d0 + move.l #$10002,d1 + allocmem chipzero + move.l d0,chipzero + ; + move.l #256,d0 ;128 words high max! + moveq #2,d1 + allocmem qstrip + move.l d0,qstrip + ; + 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 #16*512*2,d0 ;16 shades, 256 words + moveq #1,d1 + allocmem map_rgbs + ; + move.l #map_rgbs_,map_rgbs + ;move.l d0,map_rgbs + ;add.l #16*512,d0 + move.l d0,map_rgbsw + add.l #16*512,d0 + move.l d0,map_rgbsr + ; + st paused + clr dispnest + clr.l font + bsr initsfx + bsr initvbint + bsr initdisplay + bsr dispoff + ; + lea magicfiles,a0 + bsr loadfiles + ; + move.l magic,a0 + move.l magicpal,a1 + bsr makeiff + bsr showiff + bsr dispon + move #50,vbcounter + ; + lea progfiles,a0 + bsr loadfiles + ; + bsr initbmappal + bsr initmed + bsr initser + bsr calcbaud + bsr makecoloffs + bsr initdarktable + ; + bset #15,remapped + bne .noremap + ; + move.l map_rgbs(pc),a0 + move #-1,(a0)+ + move.l a0,map_rgbsat + ; + 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 + ; + elseif + lea 128*128+groundtile,a2 + move.l a2,a0 + bsr addpal + lea groundtile,a0 + move.l a2,a1 + bsr remap + ; + lea 128*128+ceilingtile,a2 + move.l a2,a0 + bsr addpal + lea ceilingtile,a0 + move.l a2,a1 + bsr remap + elseif + ; + lea qpal,a0 + bsr addpal + lea qcols,a0 + lea qpal,a1 + bsr remap + ; + 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 + ; +.w5sex tst vbcounter + bgt .w5sex + ; + bsr dispoff + lea iffwindow,a0 + bsr freewindow + ; + move.l magic,a1 + freemem magic + move.l magicpal,a1 + freemem magicpal + ; + bra forbid + +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) ;open 'misc/script' + 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 + +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 +; ; +;.li move.l lagtext(pc),d0 +; bsr longput +;.rl lea lagtext(pc),a2 +;.rw bsr serwait +; cmp.b (a2)+,d0 +; bne.s .li +; tst.b (a2) +; bne.s .rw +; ; +; bsr qsync + ; +calclag tst linked + bmi .slave + ; + ;MASTER - average out 32 sends of random data! + ; + moveq #0,d6 ;sum + moveq #31,d5 ;32 samples + ; +.mloop moveq #0,d7 + add #69,d0 + bsr vwait + bsr serput + ; +.mwait addq #2,d7 + bsr vwait + bsr vwait + bsr serget + bmi.s .mwait + ; +.got add d7,d6 + dbf d5,.mloop + ; + 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 'no events' 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 + move d0,pput + move d0,rput + ; + move #$c000,$dff09a + ; + rts + +lagtime dc 0 + +qsync ;OK, quick sync up! + ; + tst linked + beq.s .rts + ; +.loop bsr vwait + move.b #$80,d0 + bsr serput +.wait bsr serwait + cmp.b #$80,d0 + bne.s .loop + moveq #0,d0 + bsr serput +.wait2 bsr serwait + cmp.b #$80,d0 + beq.s .wait2 + tst.b d0 + bne.s .loop + ; +.rts rts + +initnewgame move gametype(pc),twowins + beq.s .skip + tst linked + beq.s .skip + ; + ifeq debugser + clr twowins + endc +.skip ; + tst.l map_test + bne.s .skhit + bset #15,gloomdata + bne.s .gotdata + ; +.skhit bsr askdatadisk +.gotdata ; + bsr qsync + ; + move.l medat(pc),a1 + jsr 12(a1) + ;move #$4000,fadevol + 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 + move #7,comsleft + ; + 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! + ; + 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 ;OK, where to continue from! + 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 tst d7 + beq initpstuff + addq #1,d7 + move.b d7,contmenu + ; + ;OK, need a continue game menu... + ; + lea gloom,a0 + lea gloompal,a1 + lea contmenu,a2 + bsr pmenu + ; + bsr selmenu + ; + bsr finitpmenu + ; + move curropt(pc),d0 + beq initpstuff + lea conts(pc),a0 + move.l -4(a0,d0*4),a0 +.leol cmp.b #10,(a0)+ + bne.s .leol + move.l a0,scriptat + ; +initpstuff move #4,p1_ob_collwith + move #4,p2_ob_collwith + moveq #3,d0 + tst linked + beq.s .nlink + moveq #6,d0 + moveq #1,d0 +.nlink move d0,p1lives + move d0,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 medat(pc),a1 + move.l loadingmed(pc),a0 + jsr 8(a1) ;start title 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 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 + lea gamename,a0 + move.l gloomgame,a1 + moveq #32,d0 + bsr savefile + 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 pic,a0 + move.l picpal,a1 + bsr makeiff + bsr showiff + 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 + +picpath dc.b 'pics/' +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 + +scriptpict ;load an iff + bsr freeiff + lea picname,a1 + bsr fetchrest + move.l a1,-(a7) + bsr permit + lea picpath,a0 + moveq #1,d1 + jsr loadfile + move.l d0,pic + lea pic_pal,a0 + move.l (a7)+,a1 +.loop move.b (a0)+,(a1)+ + bne.s .loop + lea picpath,a0 + moveq #1,d1 + jsr loadfile + move.l d0,picpal + bsr forbid + bra execscript + +scriptdark move.l iffwindow+wi_cop,a0 ;copperlist to darken! + ; + ;bank,32,bank,32... + ; + addq #6,a0 + moveq #3,d0 ;4 lots of 32 colours + moveq #31,d1 + ; + ;skip first 8 + ; + ;subq #8,d1 + ;lea 32(a0),a0 +.loop ; + move (a0),d2 ;hi nyb + move 132(a0),d3 ;lo nyb! + and #$eee,d3 + lsr #1,d3 + move d2,d4 + and #$111,d4 + lsl #3,d4 + or d4,d3 + and #$eee,d2 + lsr #1,d2 + move d2,(a0) + move d3,132(a0) + ; + addq #4,a0 + dbf d1,.loop + moveq #31,d1 + lea 136(a0),a0 + dbf d0,.loop + bra execscript + +text ds.b 64 + +scripttext ;print text on iff + ;a6=window, a4=message, d0=length of message, d6=Y + ; + move #2,pdelay + ; + lea text,a1 + bsr fetchrest + ; + lea iffwindow,a6 + lea text,a4 + move wi_bh(a6),d6 + sub #7,d6 + 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 readmenujoys + tst joyb + movem.l (a7)+,d0-d7/a0-a6 + rts + +waitany movem.l d0-d7/a0-a6,-(a7) +.wait bsr vwait + bsr readmenujoys + tst joyb + beq .wait + ; +.unwait bsr vwait + bsr readmenujoys + tst joyb + bne .unwait + ; + 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 + +getwindow tst twowins + bne.s .p2 + ; + lea defwindow1_1p,a0 + lea window1,a1 + bsr copywin + rts + ; +.p2 lea defwindow1_2p,a0 + lea window1,a1 + bsr copywin + ; + lea defwindow2_2p,a0 + lea window2,a1 + bsr copywin + rts + +putwindow tst twowins + bne.s .p2 + ; + lea window1,a0 + lea defwindow1_1p,a1 + bsr copywin + rts + ; +.p2 lea window1,a0 + lea defwindow1_2p,a1 + bsr copywin + ; + lea window2,a0 + lea defwindow2_2p,a1 + bsr copywin + rts + +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 $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) + ; + 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 + bsr makeiff + bsr showiff + bsr dispon + lea tilenum(pc),a0 + lea floortag(pc),a1 +.loop2 move.b (a0)+,(a1)+ + bne.s .loop2 + bra loadtile + +tilenum dc.b '1',0 + +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 ; + 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 calcpalettes + bsr forbid + bsr makepalettes + bsr dispoff + bsr freewindows + bsr getwindow + ; + ;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 player1(pc),a5 + move.l #window1,ob_window(a5) + move.l ob_window(a5),a0 + bsr makewindow + move.l ob_window(a5),a0 + bsr showwindow + bsr initstats + ; + tst twowins + beq.s .onew + ; + move.l player2(pc),a5 + move.l #window2,ob_window(a5) + move.l ob_window(a5),a0 + bsr makewindow + move.l ob_window(a5),a0 + bsr showwindow + bsr initstats +.onew ; + bsr calcbpos + ; + ;move #$4000,fadevol ;fadeout med! + ; + move.l medat(pc),a1 + clr fadevol + jsr 12(a1) ;stop song + ; + move #$1f3a,d0 + bsr seedrnd + clr.l sucker + clr.l sucking + clr finished + clr finished2 + clr doneflag + clr showflag + clr escape + ; + bsr syncup + ; + clr framecnt + clr paused + bsr drawall2 + bsr dispon + ; + bsr chaton + ; +mainloop bsr drawall + move escape(pc),d0 + beq.s .noesc + bsr dogamemenu + clr escape +.noesc move finished(pc),d0 + beq.s mainloop + ; + st paused + bsr chatoff + ; +.unlk bsr dispoff + bsr freewindows + 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 bsr sendback + 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 +.p1p1 ; + tst p1lives + bne.s .losk + tst gametype + beq.s .losk + tst p2lives + beq gameover +.losk 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),a0 + tst linked + beq .combatmess + lea ploses_(pc),a0 + bgt .combatmess + lea pwins_(pc),a0 + bra .combatmess + ; +.p2lost ;player 2 lost combat game + ; + lea p1wins(pc),a0 + tst linked + beq .combatmess + lea ploses_(pc),a0 + blt .combatmess + lea pwins_(pc),a0 + ; +.combatmess move.l a0,-(a7) + ; + move.l combat,a0 + move.l combatpal,a1 + jsr makeiff + jsr showiff + move.l (a7)+,a4 + lea iffwindow,a6 + bsr initmenu + bsr dispon + ; + bsr selmenu + ; + bsr dispoff + bsr finitmenu + lea iffwindow,a0 + bsr freewindow + bsr qsync + bra combatover + +flushser moveq #49,d7 +.loop bsr vwait +.loop2 bsr serget + bpl.s .loop2 + dbf d7,.loop + bra qsync + +sendback move linked(pc),d0 + beq.s .rts + ; + move finished(pc),d0 + bset #7,d0 + bne serput + move.b d0,d2 + bsr serput +.wait bsr serwait + cmp.b d0,d2 + bne.s .wait +.rts rts + +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 ; + lea gloom,a0 + lea gloompal,a1 + jsr makeiff + jsr showiff + ; + lea gloombrush,a0 + lea iffwindow,a1 + move.l wi_bmap(a1),a1 + add.l #168*7*40,a1 + bsr decodeiff + ; + bsr dispon + ; + bsr chaton + ; + bsr waitany + ; + lea startmenu,a4 + tst linked + beq.s .use + lea startmenu2,a4 +.use lea iffwindow,a6 + 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 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 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 + lea gloom,a0 + lea gloompal,a1 + lea abouttext,a2 + bsr pmenu + move numopts(pc),-(a7) + move #1,numopts + bsr selmenu + move (a7)+,numopts + bsr finitpmenu + bra dointro + ; +.notabout subq #1,d0 + bne .sel + ; +.exitgloom moveq #4,d0 + ; +.newgame move d0,gametype + ; + 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 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 finitqmenu + ; + clr chatok + clr chatoutget + clr chatoutput + ; + 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 + +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 + ; + 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 .skip + ; + ;I'm player 1 + move #1,linked + bra.s .linked + ; +.skip ;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 + +waitconnect ;wait for 'CONNECT' to arrive... + ;return eq if OK, else ne if 'esc'ed or not received. + ; + lea linkmess,a0 + bsr qmenu + ; +.retry lea wconnect(pc),a2 + ; +.loop qkey $45 ;ESC? + bne .notok + bsr serget + bpl.s .sgok + bsr vwait + bra.s .loop +.sgok cmp.b (a2)+,d0 + bne.s .retry + tst.b (a2) + bne.s .loop + ; +.ok ;OK, connect xxxx ends with 13,10... + ; +.w10 qkey $45 + bne .notok + bsr serget + bpl.s .sgok2 + bsr vwait + bra.s .w10 +.sgok2 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 5 + +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 + +makeiff ;show an IFF picture...128 colours...320 X 240 + ; + ;a0=trimmed iff, a1=iff's palette + ; + push + movem.l a0-a1,-(a7) + lea iffwindow,a0 + bsr freewindow + movem.l (a7)+,a0-a1 + ; + lea iffwindow,a2 + cmp.l #0,a0 + bne.s .notblank + addq #1,a0 + move.l a0,wi_iff(a2) + move.l #rgbs16,a1 + bra.s .blank + ; +.notblank move.l a0,wi_iff(a2) +.blank move.l a1,wi_pal(a2) + ; + ;copy font palette to IFF palette! + ; + move.l font(pc),d0 + beq.s .nofont + ; + move.l d0,a0 + add.l (a0),a0 + addq #2,a0 + clr.l (a1)+ + moveq #14,d0 +.loop move (a0),(a1)+ + move (a0)+,(a1)+ + dbf d0,.loop +.nofont ; + move.l a2,a0 + bsr makewindow + ; + pull + rts + +showiff push + lea iffwindow,a0 + bsr showwindow + pull + rts + +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 dc.b 'JOYSTICK 1',0 ;3 + ; + dc.b 'PLAYER 2 ' +p2ctype dc.b 'JOYSTICK 2',0 ;4 + ; + 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 move.l a0,-(a7) + sub.l a0,a0 + bsr makeiff + bsr showiff + move.l (a7)+,a4 + lea iffwindow,a6 + bsr initmenu + bra dispon + +pmenu move.l a2,-(a7) + bsr makeiff + bsr showiff + move.l (a7)+,a4 + lea iffwindow,a6 + bsr initmenu + bra dispon + +finitpmenu ; +finitqmenu bsr dispoff + bsr finitmenu + lea iffwindow,a0 + bra freewindow + +initmenu clr curropt +initmenu2 ; + ;do a menu...menu in a4, window in a6 + ; + move.l a6,menuwindow + move.b (a4)+,d0 ;how many + ext d0 + move d0,numopts + move d0,-(a7) ;counter + move wi_bh(a6),d6 + move.l wi_bmap(a6),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 #40*7,d0 + mulu fonth(pc),d0 + moveq #2,d1 + allocmem menustrip + move.l d0,(a5)+ + move.l d0,a1 + move.l wi_bmap(a6),a0 + move d6,d0 + mulu #7*40,d0 + add.l d0,a0 + ; + move #40*7,d0 + mulu fonth(pc),d0 + lsr.l #2,d0 + subq #1,d0 + ; +.sloop move.l (a0)+,(a1)+ + dbf d0,.sloop + ; + move.l a4,a0 + moveq #-1,d0 +.cnt addq #1,d0 + tst.b (a0)+ + bne.s .cnt + ; + bsr printmess2 + ; + add fonth(pc),d6 + subq #1,(a7) + bgt.s .loop + addq #2,a7 + ; + ifne debugmem + bsr showmem + lea memasc,a4 + moveq #8,d0 + bsr 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 + bsr printmess2 +.nomemerr ; + endc + ; + rts + + ifne debugmem +showmem push + move.l 4.w,a6 + moveq #1,d1 + jsr -216(a6) + 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 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 #7*40,d6 + move.l menubmap(pc),a1 + add.l d6,a1 + ; + move fonth(pc),d0 + mulu #7,d0 + lsl #6,d0 + or #20,d0 + ; + btst #6,$dff002 +.bwait btst #6,$dff002 + bne.s .bwait + ; + move.l #$9f00000,$dff040 + move.l #-1,$dff044 + move #0,$dff064 + move #0,$dff066 + move.l a0,$dff050 + move.l a1,$dff054 + move d0,$dff058 + ; + move #13,flashdelay + ; + rts + +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 + bsr printmess2 + ; + move #13,flashdelay + ; + rts + +readmenujoys ;if in charge...read and send else rec. + ; + tst linked + beq.s .read + bpl.s .readsend + ; +.get bsr serget + bmi.s .none + bsr serput ;send back! + lea joyx(pc),a0 + jmp decodejoy +.none clr.l joyx + clr.l joyb + rts + ; +.readsend bsr .read + lea joyx(pc),a0 + jsr encodejoy + tst.b d0 + beq.s .rts + bsr serput + bsr serwait ;wait for send back! +.rts rts + ; +.read ;OK, read joystick in port 2, and keyboard! + ;merge into joyx,joyy,joyb + ; + 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 + bne.s .fire + rts +.fire move #-1,joyb + rts + +selmenu ;select a menu item...return item in d0 + ; + ;flash selected option on/off + ; + bsr optoff + ; +.loop1 bsr vwait + bsr readmenujoys + tst joyy + blt .up2 + bgt .down2 + tst joyb + bne .sel2 + ; + subq #1,flashdelay + bgt .loop1 + ; + bsr opton + ; +.loop2 bsr vwait + bsr readmenujoys + tst joyy + blt .up + bgt .down + tst joyb + bne .sel + ; + subq #1,flashdelay + bgt .loop2 + ; + bra selmenu + ; +.up2 bsr opton +.up subq #1,curropt + bpl.s .upskip + move numopts(pc),d0 + subq #1,d0 + move d0,curropt +.upskip bsr vwait + bsr readmenujoys + tst joyy + bmi .upskip + bra selmenu + ; +.down2 bsr opton +.down addq #1,curropt + move curropt(pc),d0 + cmp numopts(pc),d0 + bcs.s .downskip + clr curropt +.downskip bsr vwait + bsr readmenujoys + tst joyy + bgt .downskip + bra selmenu + ; +.sel2 bsr opton +.sel bsr vwait + bsr readmenujoys + tst joyb + bne .sel + move curropt(pc),d0 + rts + +finitmenu ;clean up menu operation + ; + lea menustrips(pc),a5 + move numopts(pc),d2 + subq #1,d2 +.loop addq #4,a5 + move.l (a5)+,a1 + freemem menustrip + dbf d2,.loop + rts + +initbmappal move.l smallfont_,a0 + add.l (a0),a0 + addq #2,a0 + moveq #22,d0 ;23 colours to poke! + move.l coplist(pc),a1 + move.l a1,a2 + move.l a1,a3 + move.l a1,a4 + ; + lea cols1+6-copinit(a1),a1 + lea cols2+6-copinit(a2),a2 + lea cols3+6-copinit(a3),a3 + lea cols4+6-copinit(a4),a4 + ; +.loop move (a0),(a1) + move (a0),(a2) + move (a0),(a3) + move (a0)+,(a4) + addq #4,a1 + addq #4,a2 + addq #4,a3 + addq #4,a4 + dbf d0,.loop + rts + +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 decrm+32 + 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 + +andtable dc $ffff,0 ;rgb and, brightness add...wht + dc $ff00,8 ;red + +makepalettes ; + ;make wht and red pals + ; + ;create pointers... + ; + lea palettes(pc),a0 + move.l map_rgbs(pc),d0 + lea palettesw(pc),a1 + move.l map_rgbsw(pc),d1 + lea palettesr(pc),a2 + move.l map_rgbsr(pc),d2 + ; + moveq #15,d7 + ; +.loop move.l (a0)+,d3 + sub.l d0,d3 ;offset! + move.l d3,d4 + add.l d1,d3 + move.l d3,(a1)+ + add.l d2,d4 + move.l d4,(a2)+ + ; + dbf d7,.loop + ; + move.l map_rgbsend(pc),d7 + sub.l map_rgbs(pc),d7 ;how many bytes! + lsr #1,d7 + subq #1,d7 ;words! + ; + move.l map_rgbsw(pc),a1 + move #$ffff,d1 ;col and + move #0,d2 ;gamma + bsr makeapal + ; + move.l map_rgbsr(pc),a1 + move #$ff00,d1 + moveq #16,d2 + bsr makeapal + ; + rts + +makeapal move.l map_rgbs(pc),a0 + ; +.loop move (a0)+,d4 ;src colour...find briteness + ; + move d4,d5 + move d4,d6 + and #$f00,d4 + lsr #8,d4 + and #$0f0,d5 + lsr #4,d5 + and #$00f,d6 + add d6,d5 + add d5,d4 + add d2,d4 + cmp #16*3,d4 + bcs.s .bok + moveq #16*3-1,d4 +.bok ext.l d4 + divu #3,d4 ;(r+g+b)/3=briteness! + ; + move d4,d5 + move d4,d6 + lsl #8,d4 + lsl #4,d5 + or d6,d5 + or d5,d4 ;RGB + and d1,d4 + ; + move d4,(a1)+ + ; + cmp.l map_rgbsend(pc),a0 + bcs.s .loop + ; + rts + +calcpalettes ;OK, our palette currently runs from: + ; + ;map_rgbs + ; to + ;map_rgbsat + ; + ;append brightness versions... + ; + lea palettes(pc),a2 + move.l map_rgbs(pc),(a2)+ ;first brightness! + move.l map_rgbsat(pc),a1 ;first brightness! + move.l a1,a3 + moveq #1,d0 ;rgb subtract + ; +.loop move.l map_rgbs(pc),a0 + move.l a1,(a2)+ + ; +.loop2 move (a0)+,d1 + move d1,d2 + move d1,d3 + ; + and #$f00,d1 + lsr #8,d1 + sub d0,d1 + bpl.s .rok + moveq #0,d1 +.rok ; + and #$f0,d2 + lsr #4,d2 + sub d0,d2 + bpl.s .gok + moveq #0,d2 +.gok ; + and #$0f,d3 + sub d0,d3 + bpl.s .bok + moveq #0,d3 +.bok ; + lsl #8,d1 + lsl #4,d2 + or d3,d2 + or d2,d1 + or #$8000,d1 + ; + move d1,(a1)+ + cmp.l a3,a0 + bcs.s .loop2 + ; + addq #1,d0 + cmp #16,d0 + bcs.s .loop + ; + move.l a1,map_rgbsend + ; + rts + +map_rgbsend dc.l 0 + +dispoff tst dispnest + bne.s .skip + bsr vwait + move #$01a0,$dff096 ;bp/cop/spr off! +.skip addq #1,dispnest + rts + +dispon subq #1,dispnest + bgt.s .skip + bsr vwait + move.l coplist(pc),$dff080 + move #0,$dff088 + move #$8080,$dff096 ;cop on! + move #0,$dff088 +.skip rts + +forbid 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 + +permit push + move.l 4.w,a6 + jsr -138(a6) + bsr disownblitter + pull + 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 + +ownblitter push + move.l grbase,a6 + jsr -456(a6) + btst #6,$dff002 +.bwait btst #6,$dff002 + bne.s .bwait + pull + rts + +disownblitter push + btst #6,$dff002 +.bwait btst #6,$dff002 + bne.s .bwait + move.l grbase,a6 + jsr -462(a6) + pull + rts + +makecoloffs push + ; + lea coloffs,a0 + moveq #2,d0 + moveq #3,d2 +.loop addq.l #4,d0 + moveq #31,d1 +.loop2 move.l d0,(a0)+ + addq.l #4,d0 + dbf d1,.loop2 + dbf d2,.loop + ; + pull + 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 + +calcbpos ;also: calc qstripbot, con0poke... + ; + move window1+wi_h,d0 + add d0,d0 + ext.l d0 + add.l qstrip(pc),d0 + move.l d0,qstripbot + ; + move #$100,con0poke + move floorflag(pc),d0 + and roofflag(pc),d0 + bne.s .cp + move #$9f0,con0poke ;one of them is cop strip! +.cp ; + move window1+wi_y,d0 + subq #4,d0 + move d0,minbpos + tst twowins + beq.s .p1 + ; + move window2+wi_y,d0 + add window2+wi_bh,d0 + addq #4,d0 + move d0,maxbpos + rts + ; +.p1 move window1+wi_y,d0 + add window1+wi_bh,d0 + addq #4,d0 + move d0,maxbpos + ; + rts + +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 + ; + 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 + +chatmap dc.l 0 + +initdisplay push + ; + lea grname,a1 + move.l 4.w,a6 + jsr -408(a6) + move.l d0,grbase + ; + move.l d0,a6 + move.l 34(a6),oldview + sub.l a1,a1 + jsr -222(a6) ;loadview + ; + move.l #copinitf-copinit,d0 + moveq #2,d1 + allocmem copinit + move.l d0,coplist + ; + move.l d0,a1 + lea copinit,a0 + lea copinitf,a2 + ; +.loop cmp.l a2,a0 + bcc.s .done + move.l (a0)+,(a1)+ + bra.s .loop +.done ; + add.l #sl1-copinit,d0 + move.l d0,slice1 + add.l #sl2-sl1,d0 + move.l d0,slice2 + add.l #cstop-sl2,d0 + move.l d0,copstop + ; + move.l copstop,d0 + move.l slice1,a0 + move.l slice2,a1 + ; + move d0,72+6(a0) + move d0,72+6(a1) + swap d0 + move d0,72+2(a0) + move d0,72+2(a1) + ; + move.l #80*2*5,d0 + moveq #2,d1 + allocmem chatplanes + move.l d0,chatmap + ; + move d0,chatplanes+6 + swap d0 + move d0,chatplanes+2 + swap d0 + add.l #80,d0 + move d0,chatplanes+14 + swap d0 + move d0,chatplanes+10 + ; + bsr chatoff + ; + jsr -270(a6) + jsr -270(a6) + move.l coplist,$dff080 + move #0,$dff088 + ; + pull + rts + +allocwbmap move wi_w(a2),d0 + mulu wi_pw(a2),d0 + move d0,wi_bw(a2) + ; + move wi_h(a2),d0 + mulu wi_ph(a2),d0 + move d0,wi_bh(a2) + ; + mulu #40*7,d0 + ; + move.l #$10002,d1 + move.l d0,wi_bmapmem(a2) + allocmem wi_bmap + move.l d0,wi_bmap(a2) + ; + move.l #40*7*7,d0 + moveq #2,d1 + allocmem wi_strip + move.l d0,wi_strip(a2) + ; + rts + +windowiff ;draw iff into window! + ; + move.l wi_iff(a2),a0 + cmp.l #1,a0 + bne.s .do + rts + ; +.do move.l wi_bmap(a2),a1 + ; + move 2(a0),d1 + cmp #240,d1 + bcs.s .skip + move #240,d1 +.skip move #120,d2 + lsr #1,d1 + sub d1,d2 + mulu #7*40,d2 + add.l d2,a1 + ; +decodeiff ;for 40 columns... + ; + ;a0=trimmed IFF file, + ;a1=destination bitmap... + ; + move.l a2,-(a7) + moveq #40,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 + ; +.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 d7,a1 + dbf d5,.loop4 + dbf d1,.loop5 + ; + move.l (a7)+,a2 + rts + +plotwbmap ;OK, plot colours on bitmap! + ; + move.l wi_iff(a2),d0 + bne windowiff + ; + move.l wi_bmap(a2),a0 + move wi_x(a2),d0 + move d0,d1 + lsr #3,d0 + not d1 + and #7,d1 + moveq #127,d7 ;colour + move wi_w(a2),d6 ;width + subq #1,d6 + ; +.wloop move wi_pw(a2),d5 + subq #1,d5 + ; +.wloop2 move d7,d4 + moveq #6,d3 + ; +.dloop bclr d1,0(a0,d0) + lsr #1,d4 + bcc.s .dskip + bset d1,0(a0,d0) +.dskip lea 40(a0),a0 + dbf d3,.dloop + ; + lea -40*7(a0),a0 + subq #1,d1 + bpl.s .dskip2 + moveq #7,d1 + addq #1,d0 +.dskip2 dbf d5,.wloop2 + ; + subq #1,d7 + dbf d6,.wloop + ; + move wi_bh(a2),d0 ;how many to copy + subq #1,d0 + bsr wcopy + ; + move.l wi_bmap(a2),a0 + move.l wi_strip(a2),a1 + move wi_bh(a2),d0 + lsr #2,d0 + mulu #7*40,d0 + add.l d0,a0 + move #7*7*10-1,d2 + ; +.loop move.l (a0)+,(a1)+ + dbf d2,.loop + ; + rts + +wcopy ;copy top scanline to next d0 scanlines + ; + move.l wi_bmap(a2),a0 + mulu #10*7,d0 + subq #1,d0 + lea 40*7(a0),a1 +.cbloop move.l (a0)+,(a1)+ + dbf d0,.cbloop + ; + rts + +freewindow ;window in a0 + ; + push + move.l a0,a2 + move.l wi_bmap(a2),d0 + beq.s .no1 + clr.l wi_bmap(a2) + move.l d0,a1 + freemem wi_bmap +.no1 move.l wi_strip(a2),d0 + beq.s .no2 + clr.l wi_strip(a2) + move.l d0,a1 + freemem wi_strip +.no2 move.l wi_cop1(a2),d0 + beq.s .no3 + clr.l wi_cop1(a2) + move.l d0,a1 + freemem wi_cop +.no3 pull + rts + +makewindow ;make window + ; + ;a0=window struct! + ; + push + ; + move.l a0,a2 + ; + bsr allocwbmap + bsr plotwbmap + ; + tst.l wi_iff(a2) + beq wchunky + ; + ;make a palette coplist for the window + ; + ;to write 32 colours... + ;set bank, write hi nybs, set bank, write lo nybs... + ;=66 copins. + ;*4=264 total + ;+1 for final wait +3 for final copjump=268 + ; + move.l #268<<2,d0 + move.l d0,wi_copmem(a2) + moveq #2,d1 + allocmem wi_iffcop + move.l d0,wi_cop(a2) + move.l d0,wi_cop1(a2) + move.l d0,wi_cop2(a2) + move.l d0,a0 ;dest + move.l wi_pal(a2),a1 ;palette! + ; + moveq #0,d0 ;bank + moveq #3,d3 ;something. + ; +.loop move #$106,(a0)+ + move d0,(a0)+ + move #$180,d1 + moveq #31,d2 +.hiloop move d1,(a0)+ + move (a1),(a0)+ + addq #4,a1 + addq #2,d1 + dbf d2,.hiloop + ; + lea -128+2(a1),a1 + move #$106,(a0)+ + bset #9,d0 + move d0,(a0)+ + bclr #9,d0 + move #$180,d1 + moveq #31,d2 +.loloop move d1,(a0)+ + move (a1),(a0)+ + addq #4,a1 + addq #2,d1 + dbf d2,.loloop + subq #2,a1 + ; + add #$2000,d0 ;next bank! + dbf d3,.loop + ; + move.l #$fffffffe,(a0)+ + move.l #$00840000,(a0)+ + move.l #$00860000,(a0)+ + move.l #$008a0000,(a0)+ + pull + rts + ; +wchunky ;how many copins on one line? + ; + move wi_w(a2),d0 + move d0,d1 + subq #1,d0 + lsr #5,d0 ;how many bank changes per line! + addq #3,d0 ;1 waits - 1 eor, 1 init bank select + add d1,d0 ;+colpokes + ; + move d0,d1 + lsl #2,d1 + move d1,wi_copmod(a2) + ; + mulu wi_h(a2),d0 + addq #4,d0 ;1 wait and cop jump at end + ; + lsl.l #2,d0 ;4 bytes/copins + moveq #2,d1 ;cop in chip + move.l d0,wi_copmem(a2) + lsl.l #1,d0 ;2 coplists! + allocmem wi_chunkycop + move.l d0,wi_cop(a2) + move.l d0,wi_cop1(a2) + ; + move.l d0,a0 + move wi_y(a2),d6 + move wi_h(a2),d7 + subq #1,d7 + move #$111,d3 ;test colour + move #$8000,d4 ;Colour Eor + ; +.hloop ;make one copline... + ; + moveq #127,d0 ;colour reg to poke + move wi_w(a2),d1 + subq #1,d1 + ; +.lloop move d0,d2 + addq #1,d2 + and #31,d2 + bne.s .notnbank + ; + ;new bank.... + move d0,d2 + sub #31,d2 + and #$ffe0,d2 + lsl #8,d2 + or d4,d2 ;eor bank + move #$106,(a0)+ ;bank select + move d2,(a0)+ + ; +.notnbank move d0,d2 + and #31,d2 + add d2,d2 + add #$180,d2 + move d2,(a0)+ ;colour poke + move d3,(a0)+ + add #$111,d3 + subq #1,d0 + dbf d1,.lloop + ; + bsr .makewait + ; + ;ok, now do EOR! + move #$10c,(a0)+ + move d4,(a0)+ + bchg #15,d4 + ; + dbf d7,.hloop + ; + bsr .makewait + ; + move.l #$00840000,(a0)+ + move.l #$00860000,(a0)+ + move.l #$008a0000,(a0)+ + ; + ;OK, 1 list created...copy to other! + ; + move.l wi_cop1(a2),a0 + move.l a0,a1 + add.l wi_copmem(a2),a1 + move.l a1,wi_cop2(a2) + move.l a1,a3 + ; +.copycop move.l (a0)+,(a3)+ + cmp.l a1,a0 + bcs.s .copycop + ; + pull + rts + +.makewait ; + ;make wait ins. at pos d6 + ; + subq #1,d6 + move.b d6,(a0)+ + move.b #$e1,(a0)+ + move #$fffe,(a0)+ + addq #1,d6 + add wi_ph(a2),d6 + 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,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 + +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 +.ob_colltype dc 8 +p1_ob_collwith dc 6 ;6=combat, 4=game +p1_ob_cntrl dc 0 ;for player 0,1=joyport, 2=keys +.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 +.ob_colltype dc 16 +p2_ob_collwith dc 5 ;5=combat, 4=game +p2_ob_cntrl dc 1 ;for player 0,1=joyport, 2=keys, 3=serial +.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 $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 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 $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 + +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 $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 + +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 $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 + +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 $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 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 0 +.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 -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 10 +.ob_hitpoints dc 100 +.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 rts +.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 $60000 +.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 + +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 + +gloombrush incbin gloombrush + +gloom incbin title +gloompal incbin title.pal + +medplayer incbin medplay +decrm incbin decrm + +castrotsinc incbin castrots.bin +camrotsinc incbin camrots.bin ;256 +camrots2inc incbin camrots2.bin ;1024 +chatfont incbin chatfont.bin + +rgbs16 ds.l 16 +map_rgbs_ ds.w 256*16 diff --git a/arc.bin b/arc.bin new file mode 100644 index 0000000..249546d Binary files /dev/null and b/arc.bin differ diff --git a/baldy.anim b/baldy.anim new file mode 100644 index 0000000..5880ee3 Binary files /dev/null and b/baldy.anim differ diff --git a/baldy.anim.info b/baldy.anim.info new file mode 100644 index 0000000..4ce447c Binary files /dev/null and b/baldy.anim.info differ diff --git a/baldy.chunks b/baldy.chunks new file mode 100644 index 0000000..4fbfac2 Binary files /dev/null and b/baldy.chunks differ diff --git a/baldy.chunks.info b/baldy.chunks.info new file mode 100644 index 0000000..9319c03 Binary files /dev/null and b/baldy.chunks.info differ diff --git a/baldy.iff b/baldy.iff new file mode 100644 index 0000000..5880ee3 Binary files /dev/null and b/baldy.iff differ diff --git a/baldy.iff.info b/baldy.iff.info new file mode 100644 index 0000000..4ce447c Binary files /dev/null and b/baldy.iff.info differ diff --git a/bang.bin b/bang.bin new file mode 100644 index 0000000..5b32b51 Binary files /dev/null and b/bang.bin differ diff --git a/bang.iff b/bang.iff new file mode 100644 index 0000000..184e4a2 Binary files /dev/null and b/bang.iff differ diff --git a/bigfont.iff b/bigfont.iff new file mode 100644 index 0000000..3e49c79 Binary files /dev/null and b/bigfont.iff differ diff --git a/bigfont.iff.info b/bigfont.iff.info new file mode 100644 index 0000000..351af61 Binary files /dev/null and b/bigfont.iff.info differ diff --git a/bigfont2.iff b/bigfont2.iff new file mode 100644 index 0000000..1aa675c Binary files /dev/null and b/bigfont2.iff differ diff --git a/bigfont2.iff.info b/bigfont2.iff.info new file mode 100644 index 0000000..638d9a6 Binary files /dev/null and b/bigfont2.iff.info differ diff --git a/bitmap.iff b/bitmap.iff new file mode 100644 index 0000000..5ac5491 Binary files /dev/null and b/bitmap.iff differ diff --git a/blackmagic.bin b/blackmagic.bin new file mode 100644 index 0000000..05fd3fc Binary files /dev/null and b/blackmagic.bin differ diff --git a/blackmagic.iff b/blackmagic.iff new file mode 100644 index 0000000..558fd76 Binary files /dev/null and b/blackmagic.iff differ diff --git a/blackmagic.iff.info b/blackmagic.iff.info new file mode 100644 index 0000000..25c1f36 Binary files /dev/null and b/blackmagic.iff.info differ diff --git a/blackmagic.pal b/blackmagic.pal new file mode 100644 index 0000000..a1e47cf Binary files /dev/null and b/blackmagic.pal differ diff --git a/blackmagic_ehb.iff b/blackmagic_ehb.iff new file mode 100644 index 0000000..7dfb865 Binary files /dev/null and b/blackmagic_ehb.iff differ diff --git a/blob.chk b/blob.chk new file mode 100644 index 0000000..1828490 Binary files /dev/null and b/blob.chk differ diff --git a/blob.iff b/blob.iff new file mode 100644 index 0000000..910f200 Binary files /dev/null and b/blob.iff differ diff --git a/bounce.bb2 b/bounce.bb2 new file mode 100644 index 0000000..2011ee0 Binary files /dev/null and b/bounce.bb2 differ diff --git a/bounce.bb2.bak b/bounce.bb2.bak new file mode 100644 index 0000000..bd48d31 Binary files /dev/null and b/bounce.bb2.bak differ diff --git a/bounce.bb2.info b/bounce.bb2.info new file mode 100644 index 0000000..6baf883 Binary files /dev/null and b/bounce.bb2.info differ diff --git a/bounce.bb2.xtra b/bounce.bb2.xtra new file mode 100644 index 0000000..4a1d1bb Binary files /dev/null and b/bounce.bb2.xtra differ diff --git a/btest.bb2 b/btest.bb2 new file mode 100644 index 0000000..a609cf5 Binary files /dev/null and b/btest.bb2 differ diff --git a/btest.bb2.bak b/btest.bb2.bak new file mode 100644 index 0000000..b62e40e Binary files /dev/null and b/btest.bb2.bak differ diff --git a/btest.bb2.info b/btest.bb2.info new file mode 100644 index 0000000..6baf883 Binary files /dev/null and b/btest.bb2.info differ diff --git a/btest.bb2.xtra b/btest.bb2.xtra new file mode 100644 index 0000000..77d6262 Binary files /dev/null and b/btest.bb2.xtra differ diff --git a/bullet1.bin b/bullet1.bin new file mode 100644 index 0000000..578b88f Binary files /dev/null and b/bullet1.bin differ diff --git a/bullet2.bin b/bullet2.bin new file mode 100644 index 0000000..e5de264 Binary files /dev/null and b/bullet2.bin differ diff --git a/bullet3.bin b/bullet3.bin new file mode 100644 index 0000000..ba04312 Binary files /dev/null and b/bullet3.bin differ diff --git a/bullet4.bin b/bullet4.bin new file mode 100644 index 0000000..7f54611 Binary files /dev/null and b/bullet4.bin differ diff --git a/bullet5.bin b/bullet5.bin new file mode 100644 index 0000000..c7aa0a7 Binary files /dev/null and b/bullet5.bin differ diff --git a/bullets.1 b/bullets.1 new file mode 100644 index 0000000..685574e Binary files /dev/null and b/bullets.1 differ diff --git a/bullets.2 b/bullets.2 new file mode 100644 index 0000000..c43a51c Binary files /dev/null and b/bullets.2 differ diff --git a/bullets.3 b/bullets.3 new file mode 100644 index 0000000..e176e44 Binary files /dev/null and b/bullets.3 differ diff --git a/bullets.4 b/bullets.4 new file mode 100644 index 0000000..cd0d4d9 Binary files /dev/null and b/bullets.4 differ diff --git a/bullets.4.info b/bullets.4.info new file mode 100644 index 0000000..d07ada2 Binary files /dev/null and b/bullets.4.info differ diff --git a/bullets.5 b/bullets.5 new file mode 100644 index 0000000..37b72b6 Binary files /dev/null and b/bullets.5 differ diff --git a/bullets.5.info b/bullets.5.info new file mode 100644 index 0000000..d865de2 Binary files /dev/null and b/bullets.5.info differ diff --git a/c2p.bb2 b/c2p.bb2 new file mode 100644 index 0000000..cea2c52 Binary files /dev/null and b/c2p.bb2 differ diff --git a/c2p.bb2.bak b/c2p.bb2.bak new file mode 100644 index 0000000..13cf5d4 Binary files /dev/null and b/c2p.bb2.bak differ diff --git a/c2p.bb2.info b/c2p.bb2.info new file mode 100644 index 0000000..6baf883 Binary files /dev/null and b/c2p.bb2.info differ diff --git a/c2p.bb2.old b/c2p.bb2.old new file mode 100644 index 0000000..53e0376 Binary files /dev/null and b/c2p.bb2.old differ diff --git a/c2p.bb2.xtra b/c2p.bb2.xtra new file mode 100644 index 0000000..77d6262 Binary files /dev/null and b/c2p.bb2.xtra differ diff --git a/c2p/blackmagic_1 b/c2p/blackmagic_1 new file mode 100644 index 0000000..7356f7b Binary files /dev/null and b/c2p/blackmagic_1 differ diff --git a/c2p/blackmagic_1.s b/c2p/blackmagic_1.s new file mode 100644 index 0000000..02fa6bd --- /dev/null +++ b/c2p/blackmagic_1.s @@ -0,0 +1,364 @@ + + ;offset 0: + bra initc2p + + ;offset 4: + bra doc2p_1X1X8 + + ;offset 8: + bra doc2p_1X1X6 + + ;offset 12: + dc.l 0 + + ;offset 16: + dc.l 0 + +initc2p ;create 2 tables for Gloom + ; + ;a0=columns buffer to fill in (array of longs) + ;d0=how many columns (multiple of 32) + ; + ;create d0 long offsets for each column offset of chunky buffer + ;this allows for scrambling of buffer + ; + ;a1=palette remapping array (array of bytes) + ; + ;this allows for scrambled bitplanes. + ; + ;do palette remapping first... + ; + move #$ff,d1 ;#colours +.loop ; + move.b d1,0(a1,d1) + ; + dbf d1,.loop + ; + ;column offsets... + ; + ;0,2,4,6,8,10,12,14 + ;1,3,5,7,9,11,13,15 + ;16,18,20... + ; + lsr #4,d0 + subq #1,d0 + moveq #0,d1 + ; +.loop2 moveq #7,d2 + ; +.loop3 move.l d1,(a0)+ + addq.l #2,d1 + dbf d2,.loop3 + ; + sub.l #15,d1 + moveq #7,d2 + ; +.loop4 move.l d1,(a0)+ + addq.l #2,d1 + dbf d2,.loop4 + ; + subq.l #1,d1 + ; + dbf d0,.loop2 + ; + rts + +rotbits macro ;macro for rotating/merging bits. + ; + ;rotbits reg1,reg2,shift + ; + move.l \1,d4 + and.l d6,\1 + eor.l \1,d4 + lsl.l #\3,\1 + ; + move.l \2,d5 + and.l d6,d5 + eor.l d5,\2 + lsr.l #\3,\2 + or.l d4,\2 + or.l d5,\1 + ; + endm + +doc2p_1X1X8 ; + ;inputs: + ;a0.l=src chunky buffer + ;a1.l=dest chipmem bitmap + ;d0.w=width (in pixels - multiple of 32) to convert + ;d1.w=height (in pixels - even) + ;d2.l=modulo from one bitplane to next (copmod-ish) + ;d3.l=modulo from start of one line to start of next (linemod) + ; + ;internal: + ;d6=current and reg. + ;d7=loop counter + ;a2=4 bit and + ;a3=2 bit and + ;a4=1 bit and + ;a5=bitplane modulo, 1 bp to next + ;a6=subtract at end of one loop + ; + move.l #$0f0f0f0f,a2 + move.l #$33333333,a3 + move.l #$5555aaaa,a4 + move.l d2,a5 ;one bp to next. + ; + lsl.l #3,d2 ;8 bitplanes + move.l d2,a6 + sub.l a5,a6 ;7 * bpmod + subq.l #2,a6 ;to next word + ; + lsr #4,d0 ;16 pixels at a time + move d0,d2 + ext.l d2 + add.l d2,d2 + add.l a6,d2 + sub.l d2,d3 + move.l d3,-(a7) + ; + subq #1,d1 + move d1,d7 ;hite dbf + swap d7 + subq #1,d0 + move d0,d7 + subq #2,a7 ;long align + move d7,-(a7) + ; + movem.l (a0)+,d0-d3 ;next 16 pixels. + move.l a2,d6 ;4 bit and + bra.s .here + ; +.loop2 swap d7 + bra.s .here + ; +.loop movem.l (a0)+,d0-d3 ;next 16 pixels. + move.l a2,d6 ;4 bit and + ; + swap d4 + move d4,(a1) ;plane 7 + sub.l a6,a1 ;back to start of next pixel. + ; +.here rotbits d0,d2,4 + rotbits d1,d3,4 + ; + move.l a3,d6 ;2 bit and + rotbits d0,d1,2 + move.l a4,d6 ;1 bit and + ; + move.l d0,d4 + and.l d6,d4 + eor.l d4,d0 + lsr #1,d4 + swap d4 + add d4,d4 + or.l d4,d0 + ; + move d0,(a1) ;plane 0 + add.l a5,a1 + ; + move.l d1,d4 + and.l d6,d4 + eor.l d4,d1 + ; + swap d0 + move d0,(a1) + add.l a5,a1 + ; + lsr #1,d4 + swap d4 + add d4,d4 + or.l d4,d1 + ; + move d1,(a1) ;plane 2 + add.l a5,a1 + ; + move.l a3,d6 ;2 bit and + rotbits d2,d3,2 + move.l a4,d6 ;1 bit and + ; + move.l d2,d4 + and.l d6,d4 + eor.l d4,d2 + ; + swap d1 + move d1,(a1) ;plane 3 + add.l a5,a1 + ; + lsr #1,d4 + swap d4 + add d4,d4 + or.l d4,d2 + ; + move d2,(a1) ;plane 4 + add.l a5,a1 + ; + move.l d3,d4 + and.l d6,d4 + eor.l d4,d3 + ; + swap d2 + move d2,(a1) ;plane 5 + add.l a5,a1 + ; + lsr #1,d4 + swap d4 + add d4,d4 + or.l d3,d4 + ; + move d4,(a1) ;plane 6 + add.l a5,a1 + ; + dbf d7,.loop ;end of width? + move (a7),d7 + swap d7 + ; + movem.l (a0)+,d0-d3 ;get next 16 pixels. + move.l a2,d6 ;4 bit and + ; + swap d4 + move d4,(a1) ;plane 7. + add.l 4(a7),a1 ;start of next line + ; + dbf d7,.loop2 + ; + list +.check set *-.loop2 ;loop size (<256?) + nolist + ; + addq #8,a7 + ; + rts + +doc2p_1X1X6 ; + ;inputs: + ;a0.l=src chunky buffer + ;a1.l=dest chipmem bitmap + ;d0.w=width (in pixels - multiple of 32) to convert + ;d1.w=height (in pixels - even) + ;d2.l=modulo from one bitplane to next (copmod-ish) + ;d3.l=modulo from start of one line to start of next (linemod) + ; + ;internal: + ;d6=current and reg. + ;d7=loop counter + ;a2=4 bit and + ;a3=2 bit and + ;a4=1 bit and + ;a5=bitplane modulo, 1 bp to next + ;a6=subtract at end of one loop + ; + move.l #$0f0f0f0f,a2 + move.l #$33333333,a3 + move.l #$5555aaaa,a4 + move.l d2,a5 ;one bp to next. + ; + lsl.l #2,d2 ;*4 + add.l a5,d2 ;*5 + move.l d2,a6 + subq.l #2,a6 + ; + lsr #4,d0 ;16 pixels at a time + move d0,d2 + ext.l d2 + add.l d2,d2 ;bytes + add.l a6,d2 + sub.l d2,d3 + move.l d3,-(a7) + ; + subq #1,d1 + move d1,d7 ;hite dbf + swap d7 + subq #1,d0 + move d0,d7 + subq #2,a7 ;long align + move d7,-(a7) + ; + movem.l (a0)+,d0-d3 ;next 16 pixels. + move.l a2,d6 ;4 bit and + bra.s .here + ; +.loop2 swap d7 + bra.s .here + ; +.loop movem.l (a0)+,d0-d3 ;next 16 pixels. + move.l a2,d6 ;4 bit and + ; + swap d4 + move d4,(a1) ;plane 7 + sub.l a6,a1 ;back to start of next pixel. + ; +.here rotbits d0,d2,4 + rotbits d1,d3,4 + ; + move.l a3,d6 ;2 bit and + rotbits d0,d1,2 + move.l a4,d6 ;1 bit and + ; + move.l d0,d4 + and.l d6,d4 + eor.l d4,d0 + lsr #1,d4 + swap d4 + add d4,d4 + or.l d4,d0 + ; + move d0,(a1) ;plane 0 + add.l a5,a1 + ; + move.l d1,d4 + and.l d6,d4 + eor.l d4,d1 + ; + swap d0 + move d0,(a1) ;plane 1 + add.l a5,a1 + ; + lsr #1,d4 + swap d4 + add d4,d4 + or.l d4,d1 + ; + move d1,(a1) ;plane 2 + add.l a5,a1 + ; + move.l a3,d6 ;2 bit and + rotbits d2,d3,2 + move.l a4,d6 ;1 bit and + ; + move.l d2,d4 + and.l d6,d4 + eor.l d4,d2 + ; + swap d1 + move d1,(a1) ;plane 3 + add.l a5,a1 + ; + lsr #1,d4 + swap d4 + add d4,d4 + or.l d2,d4 + ; + move d4,(a1) ;plane 4 + add.l a5,a1 + ; + dbf d7,.loop ;end of width? + move (a7),d7 + swap d7 + ; + movem.l (a0)+,d0-d3 ;get next 16 pixels. + move.l a2,d6 ;4 bit and + ; + swap d4 + move d4,(a1) ;plane 7. + add.l 4(a7),a1 ;start of next line + ; + dbf d7,.loop2 + ; + list +.check set *-.loop2 ;loop size (<256?) + nolist + ; + addq #8,a7 + ; + rts diff --git a/c2p/simons040_1.s b/c2p/simons040_1.s new file mode 100644 index 0000000..ae992d2 --- /dev/null +++ b/c2p/simons040_1.s @@ -0,0 +1,596 @@ + + ;offset 0: + bra initc2p + + ;offset 4: + bra doc2p_1X1X8 + + ;offset 8: + bra doc2p_1X1X6 + + ;offset 12: + dc.l 0 + + ;offset 16: + dc.l 0 + +initc2p ;create 2 tables for Gloom + + ; + ;a0=columns buffer to fill in (array of longs) + ;d0=how many columns (multiple of 32) + ; + ;create d0 long offsets for each column offset of chunky buffer + ;this allows for scrambling of buffer + ; + ;a1=palette remapping array (array of bytes) + ; + ;this allows for scrambled bitplanes. + ; + ;do palette remapping first... + ; + move #$ff,d1 ;#colours +.loop move.b d1,0(a1,d1) + dbf d1,.loop + ; + subq #1,d0 + moveq #0,d1 +.loop2 move.l d1,(a0)+ + addq.l #1,d1 + dbf d0,.loop2 + ; + rts + +rotbits macro ;macro for rotating/merging bits. + ; + ;rotbits reg1,reg2,shift + ; + move.l \1,d4 + and.l d6,\1 + eor.l \1,d4 + lsl.l #\3,\1 + ; + move.l \2,d5 + and.l d6,d5 + eor.l d5,\2 + lsr.l #\3,\2 + or.l d4,\2 + or.l d5,\1 + ; + endm + +doc2p_1X1X8 ; + ;inputs: + ;a0.l=src chunky buffer + ;a1.l=dest chipmem bitmap + ;d0.w=width (in pixels - multiple of 32) to convert + ;d1.w=height (in pixels - even) + ;d2.l=modulo from one bitplane to next (copmod-ish) + ;d3.l=modulo from start of one line to start of next (linemod) + ; + ;internal: + ;d6=current and reg. + ;d7=loop counter + ;a2=4 bit and + ;a3=2 bit and + ;a4=1 bit and + ;a5=bitplane modulo, 1 bp to next + ;a6=subtract at end of one loop + ; + move.l #$0f0f0f0f,a2 + move.l #$33333333,a3 + move.l #$5555aaaa,a4 + move.l d2,a5 ;one bp to next. + ; + lsl.l #3,d2 ;8 bitplanes + move.l d2,a6 + sub.l a5,a6 ;7 * bpmod + subq.l #2,a6 ;to next word + ; + lsr #4,d0 ;16 pixels at a time + move d0,d2 + ext.l d2 + add.l d2,d2 + add.l a6,d2 + sub.l d2,d3 + move.l d3,-(a7) + ; + subq #1,d1 + move d1,d7 ;hite dbf + swap d7 + subq #1,d0 + move d0,d7 + subq #2,a7 ;long align + move d7,-(a7) + ; + movem.l (a0)+,d0-d3 ;next 16 pixels. + move.l a2,d6 ;4 bit and + bra.s .here + ; +.loop2 swap d7 + bra.s .here + ; +.loop movem.l (a0)+,d0-d3 ;next 16 pixels. + move.l a2,d6 ;4 bit and + ; + swap d4 + move d4,(a1) ;plane 7 + sub.l a6,a1 ;back to start of next pixel. + ; +.here rotbits d0,d2,4 + rotbits d1,d3,4 + ; + move.l a3,d6 ;2 bit and + rotbits d0,d1,2 + move.l a4,d6 ;1 bit and + ; + move.l d0,d4 + and.l d6,d4 + eor.l d4,d0 + lsr #1,d4 + swap d4 + add d4,d4 + or.l d4,d0 + ; + move d0,(a1) ;plane 0 + add.l a5,a1 + ; + move.l d1,d4 + and.l d6,d4 + eor.l d4,d1 + ; + swap d0 + move d0,(a1) + add.l a5,a1 + ; + lsr #1,d4 + swap d4 + add d4,d4 + or.l d4,d1 + ; + move d1,(a1) ;plane 2 + add.l a5,a1 + ; + move.l a3,d6 ;2 bit and + rotbits d2,d3,2 + move.l a4,d6 ;1 bit and + ; + move.l d2,d4 + and.l d6,d4 + eor.l d4,d2 + ; + swap d1 + move d1,(a1) ;plane 3 + add.l a5,a1 + ; + lsr #1,d4 + swap d4 + add d4,d4 + or.l d4,d2 + ; + move d2,(a1) ;plane 4 + add.l a5,a1 + ; + move.l d3,d4 + and.l d6,d4 + eor.l d4,d3 + ; + swap d2 + move d2,(a1) ;plane 5 + add.l a5,a1 + ; + lsr #1,d4 + swap d4 + add d4,d4 + or.l d3,d4 + ; + move d4,(a1) ;plane 6 + add.l a5,a1 + ; + dbf d7,.loop ;end of width? + move (a7),d7 + swap d7 + ; + movem.l (a0)+,d0-d3 ;get next 16 pixels. + move.l a2,d6 ;4 bit and + ; + swap d4 + move d4,(a1) ;plane 7. + add.l 4(a7),a1 ;start of next line + ; + dbf d7,.loop2 + ; + list +.check set *-.loop2 ;loop size (<256?) + nolist + ; + addq #8,a7 + ; + rts + +doc2p_1X1X6 ; + ;inputs: + ;a0.l=src chunky buffer + ;a1.l=dest chipmem bitmap + ;d0.w=width (in pixels - multiple of 32) to convert + ;d1.w=height (in pixels - even) + ;d2.l=modulo from one bitplane to next (copmod-ish) + ;d3.l=modulo from start of one line to start of next (linemod) + ; + ;internal: + ;d6=current and reg. + ;d7=loop counter + ;a2=4 bit and + ;a3=2 bit and + ;a4=1 bit and + ;a5=bitplane modulo, 1 bp to next + ;a6=subtract at end of one loop + ; + move.l #$0f0f0f0f,a2 + move.l #$33333333,a3 + move.l #$5555aaaa,a4 + move.l d2,a5 ;one bp to next. + ; + lsl.l #2,d2 ;*4 + add.l a5,d2 ;*5 + move.l d2,a6 + subq.l #2,a6 + ; + lsr #4,d0 ;16 pixels at a time + move d0,d2 + ext.l d2 + add.l d2,d2 ;bytes + add.l a6,d2 + sub.l d2,d3 + move.l d3,-(a7) + ; + subq #1,d1 + move d1,d7 ;hite dbf + swap d7 + subq #1,d0 + move d0,d7 + subq #2,a7 ;long align + move d7,-(a7) + ; + movem.l (a0)+,d0-d3 ;next 16 pixels. + move.l a2,d6 ;4 bit and + bra.s .here + ; +.loop2 swap d7 + bra.s .here + ; +.loop movem.l (a0)+,d0-d3 ;next 16 pixels. + move.l a2,d6 ;4 bit and + ; + swap d4 + move d4,(a1) ;plane 7 + sub.l a6,a1 ;back to start of next pixel. + ; +.here rotbits d0,d2,4 + rotbits d1,d3,4 + ; + move.l a3,d6 ;2 bit and + rotbits d0,d1,2 + move.l a4,d6 ;1 bit and + ; + move.l d0,d4 + and.l d6,d4 + eor.l d4,d0 + lsr #1,d4 + swap d4 + add d4,d4 + or.l d4,d0 + ; + move d0,(a1) ;plane 0 + add.l a5,a1 + ; + move.l d1,d4 + and.l d6,d4 + eor.l d4,d1 + ; + swap d0 + move d0,(a1) ;plane 1 + add.l a5,a1 + ; + lsr #1,d4 + swap d4 + add d4,d4 + or.l d4,d1 + ; + move d1,(a1) ;plane 2 + add.l a5,a1 + ; + move.l a3,d6 ;2 bit and + rotbits d2,d3,2 + move.l a4,d6 ;1 bit and + ; + move.l d2,d4 + and.l d6,d4 + eor.l d4,d2 + ; + swap d1 + move d1,(a1) ;plane 3 + add.l a5,a1 + ; + lsr #1,d4 + swap d4 + add d4,d4 + or.l d2,d4 + ; + move d4,(a1) ;plane 4 + add.l a5,a1 + ; + dbf d7,.loop ;end of width? + move (a7),d7 + swap d7 + ; + movem.l (a0)+,d0-d3 ;get next 16 pixels. + move.l a2,d6 ;4 bit and + ; + swap d4 + move d4,(a1) ;plane 7. + add.l 4(a7),a1 ;start of next line + ; + dbf d7,.loop2 + ; + list +.check set *-.loop2 ;loop size (<256?) + nolist + ; + addq #8,a7 + ; + rts + +; Chunky2Planar algorithm. +; +; Cpu only solution VERSION 2 +; Optimised for 040+fastram +; analyse instruction offsets to check performance + +; output five_pass.o +; opt l+ ;Linkable code +; opt c+ ;Case sensitive +; opt d- ;No debugging information +; opt m+ ;Expand macros in listing +; opt o- ;No optimisation + +;quad_begin: +; cnop 0,16 + +; xdef _chunky2planar + +; a0 -> chunky pixels +; a1 -> plane0 + +width equ 320 ; must be multiple of 32 +height equ 200 +plsiz equ (width/8)*height + + +merge MACRO in1,in2,tmp3,tmp4,mask,shift + ; \1 = abqr + ; \2 = ijyz + move.l \2,\4 + move.l #\5,\3 + and.l \3,\2 \2 = 0j0z + and.l \1,\3 \3 = 0b0r + eor.l \3,\1 \1 = a0q0 + eor.l \2,\4 \4 = i0y0 + IFEQ \6-1 + add.l \3,\3 + ELSE + lsl.l #\6,\3 \3 = b0r0 + ENDC + lsr.l #\6,\4 \4 = 0i0y + or.l \3,\2 \2 = bjrz + or.l \4,\1 \1 = aiqy + ENDM + + +_chunky2planar: + jmp next +next + ; round down address of c2p + lea c2p(pc),a0 + move.l a0,d0 + and.b #%11110000,d0 + move.l d0,a1 + + ; patch jmp + move.l d0,_chunky2planar+2 + move.w #(end-c2p)-1,d0 +loop move.b (a0)+,(a1)+ + dbra d0,loop + + ;tidy cache + movem.l d2-d7/a2-a6,-(sp) + move.l $4.w,a6 + jsr -636(a6) + movem.l (sp)+,d2-d7/a2-a6 + rts + + cnop 0,16 +c2p: + movem.l d2-d7/a2-a6,-(sp) + + ; a0 = chunky buffer + ; a1 = output area + + lea 4*plsiz(a1),a1 ; a1 -> plane4 + + move.l a0,d0 + add.l #16,d0 + and.b #%11110000,d0 + move.l d0,a0 + + move.l a0,a2 + add.l #8*plsiz,a2 + + lea p0(pc),a3 + bra.s mainloop + + cnop 0,16 +mainloop: + move.l 0(a0),d0 + move.l 4(a0),d2 + move.l 8(a0),d1 + move.l 12(a0),d3 + move.l 2(a0),d4 + move.l 10(a0),d5 + move.l 6(a0),d6 + move.l 14(a0),d7 + + move.w 16(a0),d0 + move.w 24(a0),d1 + move.w 20(a0),d2 + move.w 28(a0),d3 + move.w 18(a0),d4 + move.w 26(a0),d5 + move.w 22(a0),d6 + move.w 30(a0),d7 + + adda.w #32,a0 + move.l d6,a5 + move.l d7,a6 + + merge d0,d1,d6,d7,$00FF00FF,8 + merge d2,d3,d6,d7,$00FF00FF,8 + + merge d0,d2,d6,d7,$0F0F0F0F,4 + merge d1,d3,d6,d7,$0F0F0F0F,4 + + exg.l d0,a5 + exg.l d1,a6 + + merge d4,d5,d6,d7,$00FF00FF,8 + merge d0,d1,d6,d7,$00FF00FF,8 + + merge d4,d0,d6,d7,$0F0F0F0F,4 + merge d5,d1,d6,d7,$0F0F0F0F,4 + + merge d2,d0,d6,d7,$33333333,2 + merge d3,d1,d6,d7,$33333333,2 + + merge d2,d3,d6,d7,$55555555,1 + merge d0,d1,d6,d7,$55555555,1 + move.l d3,2*4(a3) ;plane2 + move.l d2,3*4(a3) ;plane3 + move.l d1,0*4(a3) ;plane0 + move.l d0,1*4(a3) ;plane1 + + move.l a5,d2 + move.l a6,d3 + + merge d2,d4,d6,d7,$33333333,2 + merge d3,d5,d6,d7,$33333333,2 + + merge d2,d3,d6,d7,$55555555,1 + merge d4,d5,d6,d7,$55555555,1 + move.l d3,6*4(a3) ;bitplane6 + move.l d2,7*4(a3) ;bitplane7 + move.l d5,4*4(a3) ;bitplane4 + move.l d4,5*4(a3) ;bitplane5 + + +inner: + move.l 0(a0),d0 + move.l 4(a0),d2 + move.l 8(a0),d1 + move.l 12(a0),d3 + move.l 2(a0),d4 + move.l 10(a0),d5 + move.l 6(a0),d6 + move.l 14(a0),d7 + + move.w 16(a0),d0 + move.w 24(a0),d1 + move.w 20(a0),d2 + move.w 28(a0),d3 + move.w 18(a0),d4 + move.w 26(a0),d5 + move.w 22(a0),d6 + move.w 30(a0),d7 + + adda.w #32,a0 + move.l d6,a5 + move.l d7,a6 + + ; write bitplane 7 + + move.l 2*4(a3),-2*plsiz(a1) ;plane2 + merge d0,d1,d6,d7,$00FF00FF,8 + merge d2,d3,d6,d7,$00FF00FF,8 + + ; write + move.l 3*4(a3),-plsiz(a1) ;plane3 + merge d0,d2,d6,d7,$0F0F0F0F,4 + merge d1,d3,d6,d7,$0F0F0F0F,4 + + exg.l d0,a5 + exg.l d1,a6 + + ; write + move.l 0*4(a3),-4*plsiz(a1) ;plane0 + merge d4,d5,d6,d7,$00FF00FF,8 + merge d0,d1,d6,d7,$00FF00FF,8 + + ; write + move.l 1*4(a3),-3*plsiz(a1) ;plane1 + merge d4,d0,d6,d7,$0F0F0F0F,4 + merge d5,d1,d6,d7,$0F0F0F0F,4 + + ; write + move.l 6*4(a3),2*plsiz(a1) ;bitplane6 + merge d2,d0,d6,d7,$33333333,2 + merge d3,d1,d6,d7,$33333333,2 + + ; write + move.l 7*4(a3),3*plsiz(a1) ;bitplane7 + merge d2,d3,d6,d7,$55555555,1 + merge d0,d1,d6,d7,$55555555,1 + move.l d3,2*4(a3) ;plane2 + move.l d2,3*4(a3) ;plane3 + move.l d1,0*4(a3) ;plane0 + move.l d0,1*4(a3) ;plane1 + + move.l a5,d2 + move.l a6,d3 + + move.l 4*4(a3),(a1)+ ;bitplane4 + merge d2,d4,d6,d7,$33333333,2 + merge d3,d5,d6,d7,$33333333,2 + + move.l 5*4(a3),-4+1*plsiz(a1) ;bitplane5 + merge d2,d3,d6,d7,$55555555,1 + merge d4,d5,d6,d7,$55555555,1 + move.l d3,6*4(a3) ;bitplane6 + move.l d2,7*4(a3) ;bitplane7 + move.l d5,4*4(a3) ;bitplane4 + move.l d4,5*4(a3) ;bitplane5 + + cmpa.l a0,a2 + bne.w inner + + move.l 2*4(a3),-2*plsiz(a1) ;plane2 + move.l 3*4(a3),-plsiz(a1) ;plane3 + move.l 0*4(a3),-4*plsiz(a1) ;plane0 + move.l 1*4(a3),-3*plsiz(a1) ;plane1 + move.l 6*4(a3),2*plsiz(a1) ;bitplane6 + move.l 7*4(a3),3*plsiz(a1) ;bitplane7 + move.l 4*4(a3),(a1)+ ;bitplane4 + move.l 5*4(a3),-4+1*plsiz(a1) ;bitplane5 + +exit + movem.l (sp)+,d2-d7/a2-a6 + rts + + cnop 0,4 +end: +p0 dc.l 0 +p1 dc.l 0 +p2 dc.l 0 +p3 dc.l 0 +p4 dc.l 0 +p5 dc.l 0 +p6 dc.l 0 +p7 dc.l 0 diff --git a/c2p/writepixelarray8 b/c2p/writepixelarray8 new file mode 100644 index 0000000..986eab6 Binary files /dev/null and b/c2p/writepixelarray8 differ diff --git a/c2ptest.bb2 b/c2ptest.bb2 new file mode 100644 index 0000000..d352d3e Binary files /dev/null and b/c2ptest.bb2 differ diff --git a/c2ptest.bb2.bak b/c2ptest.bb2.bak new file mode 100644 index 0000000..d352d3e Binary files /dev/null and b/c2ptest.bb2.bak differ diff --git a/c2ptest.bb2.info b/c2ptest.bb2.info new file mode 100644 index 0000000..6baf883 Binary files /dev/null and b/c2ptest.bb2.info differ diff --git a/c2ptest.bb2.xtra b/c2ptest.bb2.xtra new file mode 100644 index 0000000..4a1d1bb Binary files /dev/null and b/c2ptest.bb2.xtra differ diff --git a/camrots.bin b/camrots.bin new file mode 100644 index 0000000..1d255d4 Binary files /dev/null and b/camrots.bin differ diff --git a/camrots2.bin b/camrots2.bin new file mode 100644 index 0000000..1d91836 Binary files /dev/null and b/camrots2.bin differ diff --git a/castrots128.bin b/castrots128.bin new file mode 100644 index 0000000..e1e462e Binary files /dev/null and b/castrots128.bin differ diff --git a/castrots64.bin b/castrots64.bin new file mode 100644 index 0000000..3f1be34 Binary files /dev/null and b/castrots64.bin differ diff --git a/cd32.bb2 b/cd32.bb2 new file mode 100644 index 0000000..e901ed7 Binary files /dev/null and b/cd32.bb2 differ diff --git a/cd32.bb2.bak b/cd32.bb2.bak new file mode 100644 index 0000000..ee75c7b Binary files /dev/null and b/cd32.bb2.bak differ diff --git a/cd32.bb2.info b/cd32.bb2.info new file mode 100644 index 0000000..6baf883 Binary files /dev/null and b/cd32.bb2.info differ diff --git a/cd32.bb2.xtra b/cd32.bb2.xtra new file mode 100644 index 0000000..77d6262 Binary files /dev/null and b/cd32.bb2.xtra differ diff --git a/chatfont.bin b/chatfont.bin new file mode 100644 index 0000000..2ceb14d Binary files /dev/null and b/chatfont.bin differ diff --git a/chatfont.iff b/chatfont.iff new file mode 100644 index 0000000..b46393c Binary files /dev/null and b/chatfont.iff differ diff --git a/chatfont.iff.info b/chatfont.iff.info new file mode 100644 index 0000000..854ee47 Binary files /dev/null and b/chatfont.iff.info differ diff --git a/chunks.bin b/chunks.bin new file mode 100644 index 0000000..e1d49ca Binary files /dev/null and b/chunks.bin differ diff --git a/chunks.iff b/chunks.iff new file mode 100644 index 0000000..64d5bf4 Binary files /dev/null and b/chunks.iff differ diff --git a/chunks.iff.info b/chunks.iff.info new file mode 100644 index 0000000..f738aa4 Binary files /dev/null and b/chunks.iff.info differ diff --git a/combat b/combat new file mode 100644 index 0000000..0a90f08 Binary files /dev/null and b/combat differ diff --git a/combat.bin b/combat.bin new file mode 100644 index 0000000..fa6fb93 Binary files /dev/null and b/combat.bin differ diff --git a/combat.iff b/combat.iff new file mode 100644 index 0000000..ee8e809 Binary files /dev/null and b/combat.iff differ diff --git a/combat.iff.info b/combat.iff.info new file mode 100644 index 0000000..8144a38 Binary files /dev/null and b/combat.iff.info differ diff --git a/combat.pal b/combat.pal new file mode 100644 index 0000000..650795d Binary files /dev/null and b/combat.pal differ diff --git a/combat_ehb.iff b/combat_ehb.iff new file mode 100644 index 0000000..9030fbe Binary files /dev/null and b/combat_ehb.iff differ diff --git a/crunch b/crunch new file mode 100644 index 0000000..74b0bcf Binary files /dev/null and b/crunch differ diff --git a/crunch.s b/crunch.s new file mode 100644 index 0000000..6d3fd8a --- /dev/null +++ b/crunch.s @@ -0,0 +1,1286 @@ + + ;crunch stuff! + ; + ;(c) 1991, 92 by Thomas Schwarz, all rights reserved + ; + ;includes imploder/deploder/crmdecrunch + ; + + bra _startcrunch ;0 + bra _decrunch ;4 + bra _crm ;8 + bra _ppdecrunch ;12 + +; implode: +; +; In: a0.l=*buffer +; a1.l=*info routine (d0.l=0:break; -1:continue) +; d0.l=data length +; d1.l=crunch mode +; +; Out: d0.l=<0:user break; 0:error; <>0:crunched length +; +;------------------------------------------------ +_startcrunch: + MOVE.l d0,a0 + MOVE.l d1,d0 +; LEA $100000,a0 + LEA Own(pc),a1 +; MOVE.l #30000,d0 + MOVEQ #8,d1 +; MOVE.w #$4000,$dff09a ; System Off + BSR Implode +; MOVE.w #$c000,$dff09a ; System On + RTS +;------------------------------------------------ +Own: MOVE.w d1,$dff180 + BTST #6,$bfe001 + BNE own1 + MOVEQ #0,d0 + BRA own2 +own1: MOVEQ #-1,d0 +own2: RTS +;------------------------------------------------ +Implode: MOVEM.l d2-d7/a2-a6,-(a7) + MOVE.w #$57,d2 +im01: CLR.w -(a7) + DBF d2,im01 + MOVE.l a7,a6 + MOVE.l a5,2(a6) + CMP.l #$40,d0 + BCS im23 + LSR.l #8,d1 + SCS (a6) + LSR.l #8,d1 + CMP.b #12,d1 + BCS im02 + MOVEQ #0,d1 +im02: MOVE.l a1,6(a6) + MOVE.l a0,10(a6) + MOVE.l a0,$22(a6) + MOVE.l a0,$26(a6) + MOVE.l d0,$12(a6) + ADD.l d0,a0 + MOVE.l a0,14(a6) + LEA imtab0(pc),a0 + LSL.w #2,d1 + MOVE.l 0(a0,d1.w),d1 + ADDQ.l #1,d1 + CMP.l d0,d1 + BLS im03 + MOVE.l d0,d1 + SUBQ.l #1,d1 +im03: MOVE.l d1,$1A(a6) + SUBQ.l #1,d1 + MOVEQ #0,d0 +im04: CMP.l (a0)+,d1 + BLS im05 + ADDQ.b #1,d0 + BRA im04 +im05: MOVE.b d0,1(a6) + LEA $A4(a6),a1 + MOVEQ #12,d1 + MULU d1,d0 + LEA imtab1(pc),a0 + ADD.l d0,a0 + SUBQ.w #1,d1 +im06: MOVE.b (a0)+,(a1)+ + DBF d1,im06 + LEA $74(a6),a1 + LEA $A4(a6),a0 + MOVEQ #11,d1 +im07: MOVE.b (a0)+,d0 + MOVEQ #0,d2 + BSET d0,d2 + MOVE.l d2,(a1)+ + DBF d1,im07 + LEA $74(a6),a0 + LEA $84(a6),a1 + MOVEQ #7,d1 +im08: MOVE.l (a0)+,d0 + ADD.l d0,(a1)+ + DBF d1,im08 + TST.b (a6) + BEQ im11 + LEA $74(a6),a1 + MOVEQ #7,d0 +im09: MOVE.l (a1)+,d1 + MOVE.w d1,(a2)+ + DBF d0,im09 + LEA $A4(a6),a1 + MOVEQ #11,d0 +im10: MOVE.b (a1)+,(a2)+ + DBF d0,im10 +im11: MOVE.b #7,$2D(a6) +im12: BSR im26 + BNE im22 + BSR im28 + BEQ im15 + BSR im55 + BNE im13 + MOVE.l $22(a6),a0 + MOVE.l $26(a6),a1 + MOVE.b (a0),(a1) + ADDQ.l #1,$22(a6) + ADDQ.l #1,$26(a6) + ADDQ.l #1,$30(a6) + ADDQ.l #1,$1E(a6) + CMP.l #$4012,$30(a6) + BCS im12 + BRA im15 +im13: MOVE.b $5C(a6),d0 + MOVE.l $60(a6),d1 + BSR im37 + MOVE.b $5E(a6),d0 + MOVE.w $66(a6),d1 + BSR im37 + MOVE.b $5D(a6),d0 + MOVE.w $64(a6),d1 + CMP.b #13,d0 + BNE im14 + MOVE.l $26(a6),a0 + MOVE.b d1,(a0)+ + MOVE.l a0,$26(a6) + MOVEQ #5,d0 + MOVEQ #$1F,d1 +im14: BSR im37 + MOVEQ #0,d0 + MOVE.b $2E(a6),d0 + ADD.l d0,$22(a6) + CLR.l $30(a6) + BRA im12 +im15: BSR im26 + BNE im22 + MOVE.l $22(a6),a0 + MOVE.l $26(a6),a1 + MOVE.b (a0),(a1) + ADDQ.l #1,$22(a6) + ADDQ.l #1,$26(a6) + ADDQ.l #1,$30(a6) + ADDQ.l #1,$1E(a6) + MOVE.l $22(a6),d0 + CMP.l 14(a6),d0 + BNE im15 + BSR im26 + BNE im22 + TST.b (a6) + BNE im19 + MOVE.l $26(a6),d0 + SUB.l 10(a6),d0 + CMP.l #12,d0 + BCS im23 + MOVE.l $12(a6),d1 + SUB.l d0,d1 + CMP.l #$36,d1 + BLS im23 + MOVE.l 10(a6),a1 + MOVE.l $26(a6),a0 + MOVE.l #$FF00,d7 + BTST #0,d0 + BEQ im16 + MOVEQ #0,d7 + ADDQ.l #1,d0 + CLR.b (a0)+ +im16: MOVE.l (a1),8(a0) + MOVE.l #"IMP!",(a1) + MOVE.l 4(a1),4(a0) + MOVE.l $12(a6),4(a1) + MOVE.l 8(a1),(a0) + MOVE.l d0,8(a1) + ADD.l #$2E,d0 + MOVE.l d0,$16(a6) + MOVE.l $30(a6),12(a0) + MOVE.b $2C(a6),d1 + AND.w #$FE,d1 + MOVE.b $2D(a6),d0 + BSET d0,d1 + OR.w d7,d1 + MOVE.w d1,$10(a0) + LEA $74(a6),a1 + ADD.w #$12,a0 + MOVEQ #7,d0 +im17: MOVE.l (a1)+,d1 + MOVE.w d1,(a0)+ + DBF d0,im17 + LEA $A4(a6),a1 + MOVEQ #11,d0 +im18: MOVE.b (a1)+,(a0)+ + DBF d0,im18 + BRA im23 +im19: MOVE.l $26(a6),d0 + SUB.l 10(a6),d0 + MOVE.l $12(a6),d1 + SUB.l d0,d1 + CMP.l #6,d1 + BLS im23 + MOVE.b $2C(a6),d1 + AND.b #$FE,d1 + MOVE.b $2D(a6),d2 + BSET d2,d1 + MOVE.l $26(a6),a0 + BTST #0,d0 + BEQ im20 + MOVE.b d1,(a0)+ + MOVE.l $30(a6),(a0) + BRA im21 +im20: MOVE.l $30(a6),(a0)+ + MOVE.b d1,(a0) +im21: ADDQ.l #5,d0 + MOVE.l d0,$16(a6) + BRA im23 +im22: MOVEQ #-1,d0 + BRA im24 +im23: MOVE.l $16(a6),d0 +im24: MOVE.w #$57,d2 +im25: CLR.w (a7)+ + DBF d2,im25 + MOVEM.l (a7)+,d2-d7/a2-a6 + TST.l d0 + RTS +;------------------------------------------------ +imtab0: Dc.l 128,256,512,1024,1792,3328,5376,9472,20736,37376,67840,67840 +imtab1: Dc.l $5050505,$5050505,$6060606,$5060707,$6060606,$7070606 + Dc.l $5060707,$7070707,$8080808,$5060708,$7070808,$8080909 + Dc.l $6070708,$7080909,$8090A0A,$6070708,$709090A,$80A0B0B + Dc.l $6070808,$709090A,$80A0B0C,$6070808,$709090A,$90A0C0D + Dc.l $6070708,$709090C,$90A0C0E,$6070809,$7090A0C,$90B0D0F + Dc.l $6070808,$70A0B0B,$90C0D10,$6080809,$70B0C0C,$90D0E11 +imtab2: Dc.l $2060E,$1020304 +imtab3: Dc.l $1010101,$2030304,$405070E +imtab4: Dc.l $20002,$20002,$6000A,$A0012,$16002A,$8A4012 +;------------------------------------------------ +im26: MOVE.l 6(a6),d0 + BEQ im27 + MOVE.l d0,a0 + MOVE.l 14(a6),d0 + SUB.l $22(a6),d0 + MOVE.l $22(a6),d1 + SUB.l $26(a6),d1 + MOVEQ #0,d2 + MOVE.b 1(a6),d2 + MOVE.l 2(a6),a5 + MOVE.l a6,-(a7) + JSR (a0) + MOVE.l (a7)+,a6 + NOT.l d0 +im27: TST.l d0 + RTS +;------------------------------------------------ +im28: MOVE.l $22(a6),a5 + MOVE.l 14(a6),d4 + MOVE.l a5,d0 + ADDQ.l #1,d0 + ADD.l $1A(a6),d0 + CMP.l d4,d0 + BLS im29 + MOVE.l d4,d0 + MOVE.l d0,d1 + SUB.l a5,d1 + CMP.l #3,d1 + BCC im29 + MOVEQ #0,d0 + RTS +;------------------------------------------------ +im29: MOVE.l d0,d5 + MOVE.l a5,a2 + ADDQ.l #1,a2 + MOVE.l a2,a4 + MOVEQ #1,d7 + MOVE.b (a5),d3 + LEA $34(a6),a3 +im30: CMP.b (a2)+,d3 + BEQ im32 + CMP.b (a2)+,d3 + BEQ im32 + CMP.b (a2)+,d3 + BEQ im32 + CMP.b (a2)+,d3 + BEQ im32 + CMP.b (a2)+,d3 + BEQ im32 + CMP.b (a2)+,d3 + BEQ im32 + CMP.b (a2)+,d3 + BEQ im32 + CMP.b (a2)+,d3 + BEQ im32 + CMP.b (a2)+,d3 + BEQ im32 + CMP.b (a2)+,d3 + BEQ im32 + CMP.b (a2)+,d3 + BEQ im32 + CMP.b (a2)+,d3 + BEQ im32 + CMP.b (a2)+,d3 + BEQ im32 + CMP.b (a2)+,d3 + BEQ im32 + CMP.b (a2)+,d3 + BEQ im32 + CMP.b (a2)+,d3 + BEQ im32 + CMP.l a2,d5 + BHI im30 +im31: MOVEQ #-1,d0 + RTS +;------------------------------------------------ +im32: CMP.l a2,d5 + BLS im31 + MOVE.l a4,a0 + MOVE.l a2,a1 + CMPM.b (a0)+,(a1)+ + BNE im30 + CMPM.b (a0)+,(a1)+ + BNE im35 + CMPM.b (a0)+,(a1)+ + BNE im34 + MOVE.w #251,d0 +im33: CMPM.b (a0)+,(a1)+ + DBNE d0,im33 +im34: CMP.l d4,a1 + BLS im35 + MOVE.l d4,a1 +im35: MOVE.l a1,d6 + SUB.l a2,d6 + CMP.w d6,d7 + BCC im30 + MOVE.w d6,d7 + CMP.w #8,d6 + BHI im36 + TST.b -2(a3,d6.w) + BNE im30 + MOVE.b d6,-2(a3,d6.w) + MOVE.l a2,d0 + SUB.l a5,d0 + SUBQ.l #2,d0 + MOVE.w d6,d1 + LSL.w #2,d1 + MOVE.l d0,0(a3,d1.w) + BRA im30 +im36: MOVE.b d6,7(a3) + MOVE.l a2,d0 + SUB.l a5,d0 + SUBQ.l #2,d0 + MOVE.l d0,$24(a3) + CMP.b #$FF,d6 + BNE im30 + BRA im31 +im37: MOVE.b $2C(a6),d2 + MOVE.b $2D(a6),d3 + MOVE.l $26(a6),a0 +im38: LSR.l #1,d1 + ROXR.b #1,d2 + SUBQ.b #1,d3 + BPL im39 + MOVEQ #7,d3 + MOVE.b d2,(a0)+ + MOVEQ #0,d2 +im39: SUBQ.b #1,d0 + BNE im38 + MOVE.l a0,$26(a6) + MOVE.b d3,$2D(a6) + MOVE.b d2,$2C(a6) + RTS +;------------------------------------------------ +im40: AND.l #$FF,d0 + CMP.b #13,d0 + BHI im42 + CMP.b #5,d0 + BHI im41 + LEA imtab2(pc),a0 + MOVE.b -2(a0,d0.w),$71(a6) + MOVE.b 2(a0,d0.w),$69(a6) + BRA im44 +im41: SUBQ.b #6,d0 + OR.b #$F0,d0 + MOVE.b d0,$71(a6) + MOVE.b #8,$69(a6) + BRA im43 +im42: MOVE.b #$1F,$70(a6) + MOVE.b d0,$71(a6) + MOVE.b #13,$69(a6) +im43: MOVEQ #5,d0 +im44: SUBQ.b #2,d0 + MOVE.l $30(a6),d2 + LEA imtab3(pc),a1 + LEA imtab4(pc),a0 + ADD.l d0,a0 + ADD.l d0,a0 + CMP.w (a0),d2 + BCC im45 + MOVE.b 0(a1,d0.w),d6 + MOVE.b d6,d3 + ADDQ.b #1,d3 + MOVE.b #0,$73(a6) + MOVEQ #0,d4 + BRA im48 +im45: CMP.w 8(a0),d2 + BCC im46 + MOVE.b 4(a1,d0.w),d6 + MOVE.b d6,d3 + ADDQ.b #2,d3 + MOVE.b #2,$73(a6) + MOVE.w (a0),d4 + BRA im48 +im46: CMP.w $10(a0),d2 + BCS im47 + MOVEQ #0,d0 + RTS +;------------------------------------------------ +im47: MOVE.b 8(a1,d0.w),d6 + MOVE.b d6,d3 + ADDQ.b #2,d3 + MOVE.b #3,$73(a6) + MOVE.w 8(a0),d4 +im48: MOVE.b d3,$6A(a6) + SUB.w d4,d2 + MOVEQ #$10,d5 + SUB.b d6,d5 + LSL.w d5,d2 +im49: ADD.w d2,d2 + ROXL $72(a6) + SUBQ.b #1,d6 + BNE im49 + LEA $A4(a6),a1 + LEA $74(a6),a0 + ADD.w d0,a0 + ADD.w d0,a0 + ADD.w d0,a0 + ADD.w d0,a0 + CMP.l (a0),d1 + BCC im50 + MOVE.b 0(a1,d0.w),d6 + MOVE.b d6,d3 + ADDQ.b #1,d3 + MOVEQ #0,d7 + MOVEQ #0,d4 + BRA im53 +im50: CMP.l $10(a0),d1 + BCC im51 + MOVE.b 4(a1,d0.w),d6 + MOVE.b d6,d3 + ADDQ.b #2,d3 + MOVEQ #2,d7 + MOVE.l (a0),d4 + BRA im53 +im51: CMP.l $20(a0),d1 + BCS im52 + MOVEQ #0,d0 + RTS +;------------------------------------------------ +im52: MOVE.b 8(a1,d0.w),d6 + MOVE.b d6,d3 + ADDQ.b #2,d3 + MOVEQ #3,d7 + MOVE.l $10(a0),d4 +im53: MOVE.b d3,$68(a6) + SUB.l d4,d1 + MOVEQ #$20,d5 + SUB.b d6,d5 + LSL.l d5,d1 +im54: ADD.l d1,d1 + ADDX.l d7,d7 + SUBQ.b #1,d6 + BNE im54 + MOVE.l d7,$6C(a6) + MOVEQ #-1,d0 + RTS +;------------------------------------------------ +im55: CLR.w $2A(a6) + CLR.b $2E(a6) + LEA $34(a6),a4 + LEA $3C(a6),a5 +im56: MOVE.l (a5)+,d1 + MOVE.b (a4)+,d0 + BEQ im58 + BSR im40 + BEQ im58 + MOVEQ #0,d0 + MOVEQ #0,d1 + MOVE.b -1(a4),d0 + LSL.w #3,d0 + ADD.b $69(a6),d1 + ADD.b $68(a6),d1 + ADD.b $6A(a6),d1 + SUB.w d1,d0 + BMI im58 + CMP.w $2A(a6),d0 + BCS im58 + MOVE.w d0,$2A(a6) + MOVE.b -1(a4),$2E(a6) + LEA $5C(a6),a0 + LEA $68(a6),a1 + MOVEQ #12,d1 +im57: MOVE.b (a1)+,(a0)+ + DBF d1,im57 +im58: MOVE.l a4,d0 + SUB.l a6,d0 + CMP.w #$3C,d0 + BNE im56 + CLR.l -(a4) + CLR.l -(a4) + TST.w $2E(a6) + RTS +;------------------------------------------------ + + + +_decrunch: ;LEA $50000,a0 + MOVE.l d0,a0 +;********************************** +;* FILE IMPLODER DECRUNCH ROUTINE * +;* FOR ASMONE ASSEMBLER * +;********************************** +; +; Entry: a0 = address of crunched file +; Exit: d0 = 0 error or d0 = -1 depack ok +; +; File structure to check: +; +; 0(a0) = 'IMP!' +; 4(a0) = len of depacked file +; 8(a0) = len of packed file-$32 +; A(a0) = here start the datas +; +; +deplode: + CMP.l #"IMP!",(a0) + BNE I1802 + MOVEM.l d2-d5/a2-a4,-(a7) + MOVE.l a0,a3 + MOVE.l a0,a4 + TST.l (a0)+ + ADD.l (a0)+,a4 + ADD.l (a0)+,a3 + MOVE.l a3,a2 + MOVE.l (a2)+,-(a0) + MOVE.l (a2)+,-(a0) + MOVE.l (a2)+,-(a0) + MOVE.l (a2)+,d2 + MOVE.w (a2)+,d3 + BMI I17EE + SUBQ.l #1,a3 +I17EE: + LEA -$1C(a7),a7 + MOVE.l a7,a1 + MOVEQ #6,d0 +I17F6: + MOVE.l (a2)+,(a1)+ + DBF d0,I17F6 + MOVE.l a7,a1 + BRA I1E70 +I1802: + MOVEQ #0,d0 + RTS +I1E70: + TST.l d2 + BEQ I1E7A +I1E74: + MOVE.b -(a3),-(a4) + SUBQ.l #1,d2 + BNE I1E74 +I1E7A: + CMP.l a4,a0 + BCS I1E92 + LEA $1C(a7),a7 + MOVEQ #-$1,d0 + CMP.l a3,a0 + BEQ I1E8A + MOVEQ #0,d0 +I1E8A: + MOVEM.l (a7)+,d2-d5/a2-a4 + TST.l d0 + RTS +I1E92: + ADD.b d3,d3 + BNE I1E9A + MOVE.b -(a3),d3 + ADDX.b d3,d3 +I1E9A: + BCC I1F04 + ADD.b d3,d3 + BNE I1EA4 + MOVE.b -(a3),d3 + ADDX.b d3,d3 +I1EA4: + BCC I1EFE + ADD.b d3,d3 + BNE I1EAE + MOVE.b -(a3),d3 + ADDX.b d3,d3 +I1EAE: + BCC I1EF8 + ADD.b d3,d3 + BNE I1EB8 + MOVE.b -(a3),d3 + ADDX.b d3,d3 +I1EB8: + BCC I1EF2 + MOVEQ #0,d4 + ADD.b d3,d3 + BNE I1EC4 + MOVE.b -(a3),d3 + ADDX.b d3,d3 +I1EC4: + BCC I1ECE + MOVE.b -(a3),d4 + MOVEQ #3,d0 + SUBQ.b #1,d4 + BRA I1F08 +I1ECE: + ADD.b d3,d3 + BNE I1ED6 + MOVE.b -(a3),d3 + ADDX.b d3,d3 +I1ED6: + ADDX.b d4,d4 + ADD.b d3,d3 + BNE I1EE0 + MOVE.b -(a3),d3 + ADDX.b d3,d3 +I1EE0: + ADDX.b d4,d4 + ADD.b d3,d3 + BNE I1EEA + MOVE.b -(a3),d3 + ADDX.b d3,d3 +I1EEA: + ADDX.b d4,d4 + ADDQ.b #5,d4 + MOVEQ #3,d0 + BRA I1F08 +I1EF2: + MOVEQ #4,d4 + MOVEQ #3,d0 + BRA I1F08 +I1EF8: + MOVEQ #3,d4 + MOVEQ #2,d0 + BRA I1F08 +I1EFE: + MOVEQ #2,d4 + MOVEQ #1,d0 + BRA I1F08 +I1F04: + MOVEQ #1,d4 + MOVEQ #0,d0 +I1F08: + MOVEQ #0,d5 + MOVE.w d0,d1 + ADD.b d3,d3 + BNE I1F14 + MOVE.b -(a3),d3 + ADDX.b d3,d3 +I1F14: + BCC I1F2C + ADD.b d3,d3 + BNE I1F1E + MOVE.b -(a3),d3 + ADDX.b d3,d3 +I1F1E: + BCC I1F28 + MOVE.b I1F8C(pc,d0.w),d5 + ADDQ.b #8,d0 + BRA I1F2C +I1F28: + MOVEQ #2,d5 + ADDQ.b #4,d0 +I1F2C: + MOVE.b I1F90(pc,d0.w),d0 +I1F30: + ADD.b d3,d3 + BNE I1F38 + MOVE.b -(a3),d3 + ADDX.b d3,d3 +I1F38: + ADDX.w d2,d2 + SUBQ.b #1,d0 + BNE I1F30 + ADD.w d5,d2 + MOVEQ #0,d5 + MOVE.l d5,a2 + MOVE.w d1,d0 + ADD.b d3,d3 + BNE I1F4E + MOVE.b -(a3),d3 + ADDX.b d3,d3 +I1F4E: + BCC I1F6A + ADD.w d1,d1 + ADD.b d3,d3 + BNE I1F5A + MOVE.b -(a3),d3 + ADDX.b d3,d3 +I1F5A: + BCC I1F64 + MOVE.w 8(a1,d1.w),a2 + ADDQ.b #8,d0 + BRA I1F6A +I1F64: + MOVE.w 0(a1,d1.w),a2 + ADDQ.b #4,d0 +I1F6A: + MOVE.b $10(a1,d0.w),d0 +I1F6E: + ADD.b d3,d3 + BNE I1F76 + MOVE.b -(a3),d3 + ADDX.b d3,d3 +I1F76: + ADDX.l d5,d5 + SUBQ.b #1,d0 + BNE I1F6E + ADDQ.w #1,a2 + ADD.l d5,a2 + ADD.l a4,a2 +I1F82: + MOVE.b -(a2),-(a4) + DBF d4,I1F82 + BRA I1E70 +I1F8C: + Dc.l $60A0A12 +I1F90: + Dc.l $1010101 + Dc.l $2030304 + Dc.l $405070E + +;***------------------------------------------------------------------------ +;*** This is the ultimate Data-Decrunch-Routine +;*** For Crunch-Mania V1.7 +;*** (c) 1991, 92 by -;> Thomas Schwarz <+-, all rights reserved +;*** You may Use this piece of code as long as you don't claim that +;*** you have written it. In any Case the author (me) has To be +;*** mentioned someplace in your proggy. +;*** Note: Source- AND Destinationaddresses have To be always Even Addresses +;***------------------------------------------------------------------------ +;*** Here is the Format of the Header: +;*** Type Offset Contents Function +;*** LONG 0 "CrM!"/"CrM2" To recongnize crunched files +;*** WORD 4 Minimum Security Distance To savely decrunch Data when +;*** Source AND Dest is in the same +;*** Memoryblock +;*** LONG 6 Original Len Datalen before packing +;*** LONG 10 ($a) Crunched Len Datalen after packing without +;*** Header +;***------------------------------------------------------------------------ +;** Jump here To decrunch some Data with overlap check +;** You need some Memory directly in front of the Destination Area +;** which has To be as large as the MinSecDist +;** Load the Regs with: +;** a0: Adr of Source (with Header) ** a1: Adr of Dest +;**------------------------------------------------------------------------- +;Test = 0 ;set this to 1 to decrunch ram:Test +;*************************************************************************** +; ifne Test +_crm: + MOVE.l d0,a0 + MOVE.l d0,a1 + +; MOVE.l d0,_Data +; LEA _Data(pc),a0 +; LEA 14(a0),a1 +; BRA NormalDecrunch +; endc +;*----------- + +OverlapDecrunch: + MOVEM.l d0-d7/a0-a6,-(a7) + LEA FastDecruncher(pc),a5 + MOVE.l (a0)+,d0 + CMP.l #"CrM!",d0 + BEQ.b decr + LEA LZHDecruncher(pc),a5 + CMP.l #"CrM2",d0 + BNE.b NotCrunched +decr: MOVEQ #0,d0 + MOVE.w (a0)+,d0 ;MinSecDist + MOVE.l (a0)+,d1 ;DestLen + MOVE.l (a0)+,d2 ;SrcLen + LEA 0(a0,d0.l),a2 + CMP.l a1,a2 + BLE.b NoCopy + MOVE.l a0,a2 + MOVE.l a1,a0 + SUB.l d0,a0 ;MinSecDist abziehen + MOVE.l a0,a3 + MOVE.l d2,d7 + LSR.l #2,d7 ;Longs +CopyLoop: + MOVE.l (a2)+,(a3)+ + SUBQ.l #1,d7 + BNE.b CopyLoop + MOVE.l (a2)+,(a3)+ ;in case of ... +NoCopy: + MOVE.l a0,a2 + JSR (a5) +NotCrunched: + MOVEM.l (a7)+,d0-d7/a0-a6 + RTS +;**------------------------------------------------------------------------- +;** Jump here To decrunch some Data without any overlap checks +;** The Regs have To loaded with: +;** a0: Adr of Source (with Header) +;** a1: Adr of Dest +;**------------------------------------------------------------------------- +NormalDecrunch: + MOVEM.l d0-d7/a0-a6,-(a7) + MOVE.l (a0)+,d0 + LEA FastDecruncher(pc),a5 + CMP.l #"CrM!",d0 + BEQ.b decr2 + LEA LZHDecruncher(pc),a5 + CMP.l #"CrM2",d0 + BNE.b NotCrunched2 +decr2: TST.w (a0)+ ;skip MinSecDist + MOVE.l (a0)+,d1 ;OrgLen + MOVE.l (a0)+,d2 ;CrLen + MOVE.l a0,a2 + JSR (a5) +NotCrunched2: + MOVEM.l (a7)+,d0-d7/a0-a6 + RTS +;**------------------------------------------------------------------------- +;** This is the pure Decrunch-Routine +;** The Registers have To be loaded with the following values: +;** a1: Adr of Destination (normal) ** a2: Adr of Source (packed) +;** d1: Len of Destination ** d2: Len of Source +;** Leave everything below this Line in its original state! +;**------------------------------------------------------------------------- +FastDecruncher: + MOVE.l a1,a5 ;Decrunched Anfang (hier Ende des Decrunchens) + ADD.l d1,a1 + ADD.l d2,a2 + MOVE.w -(a2),d0 ;Anz Bits in letztem Wort + MOVE.l -(a2),d6 ;1.LW + MOVEQ #16,d7 ;Anz Bits + SUB.w d0,d7 ;Anz Bits, die rotiert werden m|ssen + LSR.l d7,d6 ;1.Bits an Anfang bringen + MOVE.w d0,d7 ;Anz Bits, die noch im Wort sind + MOVEQ #16,d3 + MOVEQ #0,d4 +DecrLoop: + CMP.l a5,a1 + BLE.l DecrEnd ;a1=a5: fertig (a1d0:Bits + MOVE.w d6,d0 ;d6:Akt Wort + LSR.l d1,d6 ;ndchste Bits nach vorne bringen + SUB.w d1,d7 ;d7:Anz Bits, die noch im Wort sind + BGT.b GBNoLoop +; add.w #16,d7 ;BitCounter korrigieren + ADD.w d3,d7 ;BitCounter korrigieren + ROR.l d7,d6 ;restliche Bits re rausschieben + MOVE.w -(a2),d6 ;ndchstes Wort holen + ROL.l d7,d6 ;und zur|ckrotieren +GBNoLoop: + ADD.w d1,d1 ;*2 (in Tab sind Ws) + AND.w AndData-2(pc,d1.w),d0 ;unerw|nschte Bits rausschmei_en + RTS +;*---------- +AndData: + Dc.w %1,%11,%111,%1111,%11111,%111111,%1111111 + Dc.w %11111111,%111111111,%1111111111 + Dc.w %11111111111,%111111111111 + Dc.w %1111111111111,%11111111111111 +;*----------- +DecrEnd: + RTS ;a5: Start of decrunched Data +;*************************************************************************** +OCmpTab = 0 +OAddTab = 64 +ORealTab = 128 +OAnzPerBits = 1182 +OBufLen = 1246+2 +;****************************** +LZHDecruncher: + LEA Tabbs+2(pc),a6 +; addq.l #2,a6 + ADD.l d1,a1 + ADD.l d2,a2 + + MOVE.w -(a2),d0 ;Anz Bits in letztem Wort + MOVE.l -(a2),d6 ;1.LW + MOVEQ #16,d7 ;Anz Bits + SUB.w d0,d7 ;Anz Bits, die rotiert werden m|ssen + LSR.l d7,d6 ;1.Bits an Anfang bringen + MOVE.w d0,d7 ;Anz Bits, die noch im Wort sind + MOVEQ #16,d3 + +BufLoop: + LEA OAnzPerBits(a6),a0 + MOVEQ #16-1,d2 +clear: CLR.l (a0)+ + DBF d2,clear + + LEA OAnzPerBits+32(a6),a0 + LEA ORealTab+30(a6),a4 + MOVEQ #9,d2 + BSR ReadTab + LEA OAnzPerBits(a6),a0 + LEA ORealTab(a6),a4 + MOVEQ #4,d2 + BSR ReadTab + + LEA OAnzPerBits+32(a6),a3 + LEA OCmpTab-2(a6),a4 + BSR CalcCmpTab + LEA OAnzPerBits(a6),a3 + LEA OCmpTab+30(a6),a4 + BSR CalcCmpTab + + MOVEQ #16,d1 + BSR GetBits2 + MOVE.w d0,d5 + LEA ORealTab+30(a6),a0 + LEA -30(a0),a5 +decrloop2: ;** tabu: d3/d6/d7/a0-a2/a4 + MOVE.l a6,a4 + BSR ReadIt + BTST #8,d0 + BNE.b skip + MOVE.w d0,d4 + + LEA OCmpTab+32(a6),a4 + EXG a0,a5 + BSR ReadIt + EXG a0,a5 + MOVE.w d0,d1 + MOVE.w d0,d2 + BNE.b sc1 + MOVEQ #1,d1 + MOVEQ #16,d2 +sc1: BSR GetBits2 + BSET d2,d0 +sc2: LEA 1(a1,d0.w),a3 +sloop: MOVE.b -(a3),-(a1) + DBF d4,sloop + + MOVE.b -(a3),-(a1) + MOVE.b -(a3),d0 +skip: MOVE.b d0,-(a1) + DBF d5,decrloop2 + MOVEQ #1,d1 + BSR GetBits2 + BNE.w BufLoop + BRA LZHDecrEnd +;*-----------******************* +ReadIt: + MOVEQ #0,d1 ;Nr Byte +RIloop: + SUBQ.w #1,d7 + BEQ.b BTLoop + LSR.l #1,d6 ;Bit rausschieben und Flags setzen + BRA BTEnd +BTLoop: + MOVEQ #16,d7 ;hier kein add notwendig: d7 vorher 0 + MOVE.w d6,d0 + LSR.l #1,d6 ;Bit rausschieben und Flags setzen + SWAP d6 ;ror.l #16,d6 + MOVE.w -(a2),d6 ;ndchstes Wort holen + SWAP d6 ;rol.l #16,d6 + LSR.w #1,d0 ;Bit rausschieben und Flags setzen +BTEnd: + ROXL.w #1,d1 + MOVE.w (a4)+,d0 + CMP.w d1,d0 + BLS.b RIloop + + ADD.w 62(a4),d1 + ADD.w d1,d1 + MOVE.w 0(a0,d1.w),d0 + RTS +;*------------------------------------- +GetBits2: ;d1:AnzBits->d0:Bits + MOVE.w d6,d0 ;d6:Akt Wort + LSR.l d1,d6 ;ndchste Bits nach vorne bringen + SUB.w d1,d7 ;d7:Anz Bits, die noch im Wort sind + BGT.b GBNoLoop2 + ADD.w d3,d7 ;BitCounter korrigieren + ROR.l d7,d6 ;restliche Bits re rausschieben + MOVE.w -(a2),d6 ;ndchstes Wort holen + ROL.l d7,d6 ;und zur|ckrotieren +GBNoLoop2: + ADD.w d1,d1 ;*2 (in Tab sind Ws) + AND.w AndData2-2(pc,d1.w),d0 ;unerw|nschte Bits rausschmei_en + RTS +;*---------- +AndData2: + Dc.w %1,%11,%111,%1111,%11111,%111111,%1111111 + Dc.w %11111111,%111111111,%1111111111 + Dc.w %11111111111,%111111111111 + Dc.w %1111111111111,%11111111111111 + Dc.w %111111111111111,%1111111111111111 +;*--------------------------------------- +ReadTab: + MOVEM.l d1-d5/a3,-(a7) + MOVEQ #4,d1 + BSR GetBits2 ;Anz AnzPerBits + MOVE.w d0,d5 + SUBQ.w #1,d5 + MOVEQ #0,d4 + SUB.l a3,a3 +RTlop: ADDQ.w #1,d4 + MOVE.w d4,d1 + CMP.w d2,d1 + BLE.b c1 + MOVE.w d2,d1 +c1: BSR GetBits2 + MOVE.w d0,(a0)+ + ADD.w d0,a3 + DBF d5,RTlop + + MOVE.w a3,d5 + SUBQ.w #1,d5 +RTlp2: MOVE.w d2,d1 + BSR GetBits2 + MOVE.w d0,(a4)+ + DBF d5,RTlp2 + MOVEM.l (a7)+,d1-d5/a3 + RTS +;************************************************************** +CalcCmpTab: + MOVEM.l d0-d7,-(a7) + CLR.w (a4)+ + MOVEQ #15-1,d7 + MOVEQ #-1,d4 + MOVEQ #0,d2 + MOVEQ #0,d3 + MOVEQ #1,d1 +CClop: MOVE.w (a3)+,d6 + MOVE.w d3,64(a4) + MOVE.w -2(a4),d0 + ADD.w d0,d0 + SUB.w d0,64(a4) + ADD.w d6,d3 + MULU d1,d6 + ADD.w d6,d2 + MOVE.w d2,(a4)+ +cont2: + LSL.w #1,d2 + DBF d7,CClop + MOVEM.l (a7)+,d0-d7 + RTS +;********************************************* +LZHDecrEnd: +;LZHDecrLen equ *-LZHDecruncher + + RTS +;*********************************** +Tabbs: Dc.w 0 ;unbedingt!!!!!!! +CmpTab: Ds.w 16 ;Len + Ds.w 16 ;Dist +AddTab: Ds.w 16 ;Len + Ds.w 16 ;Dist +RealTab: + Ds.w 527 ;Dist+Len +AnzPerBits: + Ds.w 32 ;Dist+Len +;*************************************************************************** +;** Leave everything above this Line in its original state! +; ifne Test +_Data: Dc.l 0 + +;IncBin work:decruncher.s +; Ds.l 10000 +; endc + +;A0 : Start des gecr. Files +;A1 : Ende des gecr. Files +;A2 : Zieladresse an die decruncht werden soll + +_ppdecrunch: + MOVEM.l d0-d7/a0-a6,-(a7) + MOVE.l d0,a0 + MOVE.l d1,a1 + MOVE.l d2,a2 + bsr dec + MOVEM.l (a7)+,d0-d7/a0-a6 + RTS + +dec: CMP.l #"PP20",(a0) + BNE.b nopower + LEA 4(a0),a5 ;Effiziens + MOVE.l a1,a0 + MOVE.l a2,a3 + MOVEQ #3,d6 + MOVEQ #7,d7 + MOVEQ #1,d5 + MOVE.l a3,a2 ; remember start of file + MOVE.l -(a0),d1 ; get file length and empty bits + TST.b d1 + BEQ.b NoEmptyBits + BSR ReadBit ; this will always get the next long (D5 = 1) + SUBQ.b #1,d1 + LSR.l d1,d5 ; get rid of empty bits +NoEmptyBits: + LSR.l #8,d1 + ADD.l d1,a3 ; a3 = endfile +LoopCheckCrunch: + BSR ReadBit ; check if crunch or normal + BCS.b CrunchedBytes +NormalBytes: + MOVEQ #0,d2 +_Read2BitsRow: + MOVEQ #1,d0 + BSR ReadD1 + ADD.w d1,d2 + CMP.w d6,d1 + BEQ.b _Read2BitsRow +ReadNormalByte: + MOVEQ #7,d0 + BSR ReadD1 + MOVE.b d1,-(a3) + DBF d2,ReadNormalByte + CMP.l a3,a2 + BCS.b CrunchedBytes +nopower:RTS + + +ReadBit: + LSR.l #1,d5 ; this will also set X if d5 becomes zero + BEQ.b GetNextLong + RTS +GetNextLong: + MOVE.l -(a0),d5 + ROXR.l #1,d5 ; X-bit set by lsr above + RTS +ReadD1_SUB: + SUBQ.w #1,d0 +ReadD1: + MOVEQ #0,d1 +ReadBits: + LSR.l #1,d5 ; this will also set X if d5 becomes zero + BEQ.b GetNext +RotX: + ROXL.l #1,d1 + DBF d0,ReadBits + RTS +GetNext: + MOVE.l -(a0),d5 + ROXR.l #1,d5 ; X-bit set by lsr above + BRA RotX +CrunchedBytes: + MOVEQ #1,d0 + BSR ReadD1 ; read code + MOVEQ #0,d0 + MOVE.b 0(a5,d1.w),d0 ; get number of bits of offset + MOVE.w d1,d2 ; d2 = code = length-2 + CMP.w d6,d2 ; if d2 = 3 check offset bit and read length + BNE.b ReadOffset + BSR ReadBit ; read offset bit (long/short) + BCS.b LongBlockOffset + MOVEQ #7,d0 +LongBlockOffset: + BSR ReadD1_SUB + MOVE.w d1,d3 ; d3 = offset +_Read3BitsRow: + MOVEQ #2,d0 + BSR ReadD1 + ADD.w d1,d2 ; d2 = length-1 + CMP.w d7,d1 ; cmp with #7 + BEQ.b _Read3BitsRow + BRA DecrunchBlock +ReadOffset: + BSR ReadD1_SUB ; read offset + MOVE.w d1,d3 ; d3 = offset +DecrunchBlock: + ADDQ.w #1,d2 +DecrunchBlockLoop: + MOVE.b 0(a3,d3.w),-(a3) + DBF d2,DecrunchBlockLoop +EndOfLoop: + CMP.l a3,a2 + BCS.l LoopCheckCrunch + RTS diff --git a/ctest.bb2 b/ctest.bb2 new file mode 100644 index 0000000..f7cfc0c Binary files /dev/null and b/ctest.bb2 differ diff --git a/ctest.bb2.bak b/ctest.bb2.bak new file mode 100644 index 0000000..f0ae266 Binary files /dev/null and b/ctest.bb2.bak differ diff --git a/ctest.bb2.info b/ctest.bb2.info new file mode 100644 index 0000000..6baf883 Binary files /dev/null and b/ctest.bb2.info differ diff --git a/ctest.bb2.xtra b/ctest.bb2.xtra new file mode 100644 index 0000000..4a1d1bb Binary files /dev/null and b/ctest.bb2.xtra differ diff --git a/cunt b/cunt new file mode 100644 index 0000000..5d47dfb Binary files /dev/null and b/cunt differ diff --git a/cunt.bak b/cunt.bak new file mode 100644 index 0000000..39d21bb Binary files /dev/null and b/cunt.bak differ diff --git a/cunt.bb2 b/cunt.bb2 new file mode 100644 index 0000000..2fff465 Binary files /dev/null and b/cunt.bb2 differ diff --git a/cunt.bb2.info b/cunt.bb2.info new file mode 100644 index 0000000..6baf883 Binary files /dev/null and b/cunt.bb2.info differ diff --git a/cunt.bb2.xtra b/cunt.bb2.xtra new file mode 100644 index 0000000..77d6262 Binary files /dev/null and b/cunt.bb2.xtra differ diff --git a/cunt.info b/cunt.info new file mode 100644 index 0000000..6baf883 Binary files /dev/null and b/cunt.info differ diff --git a/cunt.xtra b/cunt.xtra new file mode 100644 index 0000000..4a1d1bb Binary files /dev/null and b/cunt.xtra differ diff --git a/data/gloomgame b/data/gloomgame new file mode 100644 index 0000000..31fd5de --- /dev/null +++ b/data/gloomgame @@ -0,0 +1 @@ +gamegamegamegamegamegamegamegame \ No newline at end of file diff --git a/data/maps/com1_1 b/data/maps/com1_1 new file mode 100644 index 0000000..4feaebb Binary files /dev/null and b/data/maps/com1_1 differ diff --git a/data/maps/com1_2 b/data/maps/com1_2 new file mode 100644 index 0000000..6b29693 Binary files /dev/null and b/data/maps/com1_2 differ diff --git a/data/maps/com1_3 b/data/maps/com1_3 new file mode 100644 index 0000000..db7acf7 Binary files /dev/null and b/data/maps/com1_3 differ diff --git a/data/maps/com1_4 b/data/maps/com1_4 new file mode 100644 index 0000000..11526b6 Binary files /dev/null and b/data/maps/com1_4 differ diff --git a/data/maps/com1_5 b/data/maps/com1_5 new file mode 100644 index 0000000..05f2371 Binary files /dev/null and b/data/maps/com1_5 differ diff --git a/data/maps/com1_6 b/data/maps/com1_6 new file mode 100644 index 0000000..5f0b68a Binary files /dev/null and b/data/maps/com1_6 differ diff --git a/data/maps/com1_7 b/data/maps/com1_7 new file mode 100644 index 0000000..562f05c Binary files /dev/null and b/data/maps/com1_7 differ diff --git a/data/maps/com2_1 b/data/maps/com2_1 new file mode 100644 index 0000000..23fcd83 Binary files /dev/null and b/data/maps/com2_1 differ diff --git a/data/maps/com2_2 b/data/maps/com2_2 new file mode 100644 index 0000000..4919ef5 Binary files /dev/null and b/data/maps/com2_2 differ diff --git a/data/maps/com2_3 b/data/maps/com2_3 new file mode 100644 index 0000000..2d57bce Binary files /dev/null and b/data/maps/com2_3 differ diff --git a/data/maps/com2_4 b/data/maps/com2_4 new file mode 100644 index 0000000..779492a Binary files /dev/null and b/data/maps/com2_4 differ diff --git a/data/maps/com2_5 b/data/maps/com2_5 new file mode 100644 index 0000000..0622705 Binary files /dev/null and b/data/maps/com2_5 differ diff --git a/data/maps/com2_6 b/data/maps/com2_6 new file mode 100644 index 0000000..bd96487 Binary files /dev/null and b/data/maps/com2_6 differ diff --git a/data/maps/com2_7 b/data/maps/com2_7 new file mode 100644 index 0000000..3305505 Binary files /dev/null and b/data/maps/com2_7 differ diff --git a/data/maps/com3_1 b/data/maps/com3_1 new file mode 100644 index 0000000..b22a314 Binary files /dev/null and b/data/maps/com3_1 differ diff --git a/data/maps/com3_2 b/data/maps/com3_2 new file mode 100644 index 0000000..f36f3e9 Binary files /dev/null and b/data/maps/com3_2 differ diff --git a/data/maps/com3_3 b/data/maps/com3_3 new file mode 100644 index 0000000..8792b7a Binary files /dev/null and b/data/maps/com3_3 differ diff --git a/data/maps/com3_4 b/data/maps/com3_4 new file mode 100644 index 0000000..aaf31f6 Binary files /dev/null and b/data/maps/com3_4 differ diff --git a/data/maps/com3_5 b/data/maps/com3_5 new file mode 100644 index 0000000..71d0fb5 Binary files /dev/null and b/data/maps/com3_5 differ diff --git a/data/maps/com3_6 b/data/maps/com3_6 new file mode 100644 index 0000000..2dd51e3 Binary files /dev/null and b/data/maps/com3_6 differ diff --git a/data/maps/com3_7 b/data/maps/com3_7 new file mode 100644 index 0000000..a907f33 Binary files /dev/null and b/data/maps/com3_7 differ diff --git a/data/maps/map1_1 b/data/maps/map1_1 new file mode 100644 index 0000000..734d441 Binary files /dev/null and b/data/maps/map1_1 differ diff --git a/data/maps/map1_2 b/data/maps/map1_2 new file mode 100644 index 0000000..f44d61e Binary files /dev/null and b/data/maps/map1_2 differ diff --git a/data/maps/map1_3 b/data/maps/map1_3 new file mode 100644 index 0000000..716e0b7 Binary files /dev/null and b/data/maps/map1_3 differ diff --git a/data/maps/map1_4 b/data/maps/map1_4 new file mode 100644 index 0000000..11ada33 Binary files /dev/null and b/data/maps/map1_4 differ diff --git a/data/maps/map1_5 b/data/maps/map1_5 new file mode 100644 index 0000000..30b45ce Binary files /dev/null and b/data/maps/map1_5 differ diff --git a/data/maps/map1_6 b/data/maps/map1_6 new file mode 100644 index 0000000..3f8accd Binary files /dev/null and b/data/maps/map1_6 differ diff --git a/data/maps/map1_7 b/data/maps/map1_7 new file mode 100644 index 0000000..974c5ab Binary files /dev/null and b/data/maps/map1_7 differ diff --git a/data/maps/map3_1 b/data/maps/map3_1 new file mode 100644 index 0000000..5279dc7 Binary files /dev/null and b/data/maps/map3_1 differ diff --git a/data/maps/map3_2 b/data/maps/map3_2 new file mode 100644 index 0000000..aea5c53 Binary files /dev/null and b/data/maps/map3_2 differ diff --git a/data/maps/map3_3 b/data/maps/map3_3 new file mode 100644 index 0000000..123da33 Binary files /dev/null and b/data/maps/map3_3 differ diff --git a/data/maps/map3_4 b/data/maps/map3_4 new file mode 100644 index 0000000..ef8d7c5 Binary files /dev/null and b/data/maps/map3_4 differ diff --git a/data/maps/map3_5 b/data/maps/map3_5 new file mode 100644 index 0000000..cd29858 Binary files /dev/null and b/data/maps/map3_5 differ diff --git a/data/maps/map3_6 b/data/maps/map3_6 new file mode 100644 index 0000000..a078a34 Binary files /dev/null and b/data/maps/map3_6 differ diff --git a/data/maps/map3_7 b/data/maps/map3_7 new file mode 100644 index 0000000..6822a17 Binary files /dev/null and b/data/maps/map3_7 differ diff --git a/data/maps/map4_1 b/data/maps/map4_1 new file mode 100644 index 0000000..f41d21a Binary files /dev/null and b/data/maps/map4_1 differ diff --git a/data/maps/map4_2 b/data/maps/map4_2 new file mode 100644 index 0000000..27b79f5 Binary files /dev/null and b/data/maps/map4_2 differ diff --git a/data/maps/map4_3 b/data/maps/map4_3 new file mode 100644 index 0000000..76440ba Binary files /dev/null and b/data/maps/map4_3 differ diff --git a/data/maps/map4_4 b/data/maps/map4_4 new file mode 100644 index 0000000..71fd478 Binary files /dev/null and b/data/maps/map4_4 differ diff --git a/data/maps/map4_5 b/data/maps/map4_5 new file mode 100644 index 0000000..e27052e Binary files /dev/null and b/data/maps/map4_5 differ diff --git a/data/maps/map4_6 b/data/maps/map4_6 new file mode 100644 index 0000000..30a5797 Binary files /dev/null and b/data/maps/map4_6 differ diff --git a/data/maps/map4_7 b/data/maps/map4_7 new file mode 100644 index 0000000..0671482 Binary files /dev/null and b/data/maps/map4_7 differ diff --git a/data/misc/script b/data/misc/script new file mode 100644 index 0000000..e691982 Binary files /dev/null and b/data/misc/script differ diff --git a/data/objs/baldy b/data/objs/baldy new file mode 100644 index 0000000..fc50709 Binary files /dev/null and b/data/objs/baldy differ diff --git a/data/objs/baldy2 b/data/objs/baldy2 new file mode 100644 index 0000000..944b369 Binary files /dev/null and b/data/objs/baldy2 differ diff --git a/data/objs/deathhead b/data/objs/deathhead new file mode 100644 index 0000000..d10fbaf Binary files /dev/null and b/data/objs/deathhead differ diff --git a/data/objs/demon b/data/objs/demon new file mode 100644 index 0000000..24318fa Binary files /dev/null and b/data/objs/demon differ diff --git a/data/objs/demon2 b/data/objs/demon2 new file mode 100644 index 0000000..8a757ed Binary files /dev/null and b/data/objs/demon2 differ diff --git a/data/objs/dragon b/data/objs/dragon new file mode 100644 index 0000000..fa9e7a7 Binary files /dev/null and b/data/objs/dragon differ diff --git a/data/objs/dragon2 b/data/objs/dragon2 new file mode 100644 index 0000000..ddcbb87 Binary files /dev/null and b/data/objs/dragon2 differ diff --git a/data/objs/ghoul b/data/objs/ghoul new file mode 100644 index 0000000..ead4452 Binary files /dev/null and b/data/objs/ghoul differ diff --git a/data/objs/lizard b/data/objs/lizard new file mode 100644 index 0000000..9c4f45f Binary files /dev/null and b/data/objs/lizard differ diff --git a/data/objs/lizard2 b/data/objs/lizard2 new file mode 100644 index 0000000..027e9ec Binary files /dev/null and b/data/objs/lizard2 differ diff --git a/data/objs/marine b/data/objs/marine new file mode 100644 index 0000000..a472396 Binary files /dev/null and b/data/objs/marine differ diff --git a/data/objs/marine2 b/data/objs/marine2 new file mode 100644 index 0000000..d7939d0 Binary files /dev/null and b/data/objs/marine2 differ diff --git a/data/objs/phantom b/data/objs/phantom new file mode 100644 index 0000000..4e9b91c Binary files /dev/null and b/data/objs/phantom differ diff --git a/data/objs/phantom2 b/data/objs/phantom2 new file mode 100644 index 0000000..a572dce Binary files /dev/null and b/data/objs/phantom2 differ diff --git a/data/objs/terra b/data/objs/terra new file mode 100644 index 0000000..e25a794 Binary files /dev/null and b/data/objs/terra differ diff --git a/data/objs/terra2 b/data/objs/terra2 new file mode 100644 index 0000000..4443d10 Binary files /dev/null and b/data/objs/terra2 differ diff --git a/data/objs/troll b/data/objs/troll new file mode 100644 index 0000000..fa8c6a0 Binary files /dev/null and b/data/objs/troll differ diff --git a/data/objs/troll2 b/data/objs/troll2 new file mode 100644 index 0000000..1ac76e3 Binary files /dev/null and b/data/objs/troll2 differ diff --git a/data/pics/combat b/data/pics/combat new file mode 100644 index 0000000..8ac500b Binary files /dev/null and b/data/pics/combat differ diff --git a/data/pics/combat.pal b/data/pics/combat.pal new file mode 100644 index 0000000..650795d Binary files /dev/null and b/data/pics/combat.pal differ diff --git a/data/pics/gothic b/data/pics/gothic new file mode 100644 index 0000000..ccd69f5 Binary files /dev/null and b/data/pics/gothic differ diff --git a/data/pics/gothic.pal b/data/pics/gothic.pal new file mode 100644 index 0000000..0d9085b Binary files /dev/null and b/data/pics/gothic.pal differ diff --git a/data/pics/hell b/data/pics/hell new file mode 100644 index 0000000..acb7394 Binary files /dev/null and b/data/pics/hell differ diff --git a/data/pics/hell.pal b/data/pics/hell.pal new file mode 100644 index 0000000..0017912 Binary files /dev/null and b/data/pics/hell.pal differ diff --git a/data/pics/spacehulk b/data/pics/spacehulk new file mode 100644 index 0000000..de40f07 Binary files /dev/null and b/data/pics/spacehulk differ diff --git a/data/pics/spacehulk.pal b/data/pics/spacehulk.pal new file mode 100644 index 0000000..7496dfe Binary files /dev/null and b/data/pics/spacehulk.pal differ diff --git a/data/pics/theend b/data/pics/theend new file mode 100644 index 0000000..74c1310 Binary files /dev/null and b/data/pics/theend differ diff --git a/data/pics/theend.pal b/data/pics/theend.pal new file mode 100644 index 0000000..afa68e1 Binary files /dev/null and b/data/pics/theend.pal differ diff --git a/data/txts/floor1 b/data/txts/floor1 new file mode 100644 index 0000000..628f855 Binary files /dev/null and b/data/txts/floor1 differ diff --git a/data/txts/floor2 b/data/txts/floor2 new file mode 100644 index 0000000..f046dd1 Binary files /dev/null and b/data/txts/floor2 differ diff --git a/data/txts/floor3 b/data/txts/floor3 new file mode 100644 index 0000000..20d491e Binary files /dev/null and b/data/txts/floor3 differ diff --git a/data/txts/roof1 b/data/txts/roof1 new file mode 100644 index 0000000..df3f6cb Binary files /dev/null and b/data/txts/roof1 differ diff --git a/data/txts/roof2 b/data/txts/roof2 new file mode 100644 index 0000000..3cd1995 Binary files /dev/null and b/data/txts/roof2 differ diff --git a/data/txts/roof3 b/data/txts/roof3 new file mode 100644 index 0000000..050a4b4 Binary files /dev/null and b/data/txts/roof3 differ diff --git a/data/txts/txt1_0 b/data/txts/txt1_0 new file mode 100644 index 0000000..e9231d6 Binary files /dev/null and b/data/txts/txt1_0 differ diff --git a/data/txts/txt1_1 b/data/txts/txt1_1 new file mode 100644 index 0000000..611e375 Binary files /dev/null and b/data/txts/txt1_1 differ diff --git a/data/txts/txt1_2 b/data/txts/txt1_2 new file mode 100644 index 0000000..c767174 Binary files /dev/null and b/data/txts/txt1_2 differ diff --git a/data/txts/txt1_3 b/data/txts/txt1_3 new file mode 100644 index 0000000..496b58d Binary files /dev/null and b/data/txts/txt1_3 differ diff --git a/data/txts/txt1_4 b/data/txts/txt1_4 new file mode 100644 index 0000000..e338400 Binary files /dev/null and b/data/txts/txt1_4 differ diff --git a/data/txts/txt3_1 b/data/txts/txt3_1 new file mode 100644 index 0000000..a451665 Binary files /dev/null and b/data/txts/txt3_1 differ diff --git a/data/txts/txt3_2 b/data/txts/txt3_2 new file mode 100644 index 0000000..9c4670f Binary files /dev/null and b/data/txts/txt3_2 differ diff --git a/data/txts/txt3_3 b/data/txts/txt3_3 new file mode 100644 index 0000000..d2b670e Binary files /dev/null and b/data/txts/txt3_3 differ diff --git a/data/txts/txt3_4 b/data/txts/txt3_4 new file mode 100644 index 0000000..88b0b11 Binary files /dev/null and b/data/txts/txt3_4 differ diff --git a/data/txts/txt4_1 b/data/txts/txt4_1 new file mode 100644 index 0000000..4c54914 Binary files /dev/null and b/data/txts/txt4_1 differ diff --git a/data/txts/txt4_2 b/data/txts/txt4_2 new file mode 100644 index 0000000..b183002 Binary files /dev/null and b/data/txts/txt4_2 differ diff --git a/data/txts/txt4_3 b/data/txts/txt4_3 new file mode 100644 index 0000000..5019d0f Binary files /dev/null and b/data/txts/txt4_3 differ diff --git a/deathhead b/deathhead new file mode 100644 index 0000000..16b4033 Binary files /dev/null and b/deathhead differ diff --git a/deathhead2 b/deathhead2 new file mode 100644 index 0000000..1f6f701 Binary files /dev/null and b/deathhead2 differ diff --git a/deathhead2.info b/deathhead2.info new file mode 100644 index 0000000..cbcf6ab Binary files /dev/null and b/deathhead2.info differ diff --git a/decrm b/decrm new file mode 100644 index 0000000..bc75a87 Binary files /dev/null and b/decrm differ diff --git a/decrm.s b/decrm.s new file mode 100644 index 0000000..be36789 --- /dev/null +++ b/decrm.s @@ -0,0 +1,399 @@ + + ;crunchmania decruncher.... + ; + + elseif + +OverlapDecrunch: + MOVEM.l d0-d7/a0-a6,-(a7) + ; + MOVE.l d0,a0 + MOVE.l d0,a1 + ; + LEA FastDecruncher(pc),a5 + MOVE.l (a0)+,d0 + CMP.l #"CrM!",d0 + BEQ.b decr + LEA LZHDecruncher(pc),a5 + CMP.l #"CrM2",d0 + BNE.b NotCrunched +decr: MOVEQ #0,d0 + MOVE.w (a0)+,d0 ;MinSecDist + MOVE.l (a0)+,d1 ;DestLen + MOVE.l (a0)+,d2 ;SrcLen + LEA 0(a0,d0.l),a2 + CMP.l a1,a2 + BLE.b NoCopy + MOVE.l a0,a2 + MOVE.l a1,a0 + SUB.l d0,a0 ;MinSecDist abziehen + MOVE.l a0,a3 + MOVE.l d2,d7 + LSR.l #2,d7 ;Longs +CopyLoop: + MOVE.l (a2)+,(a3)+ + SUBQ.l #1,d7 + BNE.b CopyLoop + MOVE.l (a2)+,(a3)+ ;in case of ... +NoCopy: + MOVE.l a0,a2 + JSR (a5) +NotCrunched: + MOVEM.l (a7)+,d0-d7/a0-a6 + RTS + + elseif + +;**------------------------------------------------------------------------- +;** Jump here To decrunch some Data without any overlap checks +;** The Regs have To loaded with: +;** a0: Adr of Source (with Header) +;** a1: Adr of Dest +;**------------------------------------------------------------------------- + +NormalDecrunch: + MOVEM.l d0-d7/a0-a6,-(a7) + MOVE.l (a0)+,d0 + LEA FastDecruncher(pc),a5 + CMP.l #"CrM!",d0 + BEQ.b decr2 + LEA LZHDecruncher(pc),a5 + CMP.l #"CrM2",d0 + BNE.b NotCrunched2 +decr2: TST.w (a0)+ ;skip MinSecDist + MOVE.l (a0)+,d1 ;OrgLen + MOVE.l (a0)+,d2 ;CrLen + MOVE.l a0,a2 + JSR (a5) +NotCrunched2: + MOVEM.l (a7)+,d0-d7/a0-a6 + RTS +;**------------------------------------------------------------------------- +;** This is the pure Decrunch-Routine +;** The Registers have To be loaded with the following values: +;** a1: Adr of Destination (normal) ** a2: Adr of Source (packed) +;** d1: Len of Destination ** d2: Len of Source +;** Leave everything below this Line in its original state! +;**------------------------------------------------------------------------- +FastDecruncher: + MOVE.l a1,a5 ;Decrunched Anfang (hier Ende des Decrunchens) + ADD.l d1,a1 + ADD.l d2,a2 + MOVE.w -(a2),d0 ;Anz Bits in letztem Wort + MOVE.l -(a2),d6 ;1.LW + MOVEQ #16,d7 ;Anz Bits + SUB.w d0,d7 ;Anz Bits, die rotiert werden m|ssen + LSR.l d7,d6 ;1.Bits an Anfang bringen + MOVE.w d0,d7 ;Anz Bits, die noch im Wort sind + MOVEQ #16,d3 + MOVEQ #0,d4 +DecrLoop: + CMP.l a5,a1 + BLE.l DecrEnd ;a1=a5: fertig (a1d0:Bits + MOVE.w d6,d0 ;d6:Akt Wort + LSR.l d1,d6 ;ndchste Bits nach vorne bringen + SUB.w d1,d7 ;d7:Anz Bits, die noch im Wort sind + BGT.b GBNoLoop +; add.w #16,d7 ;BitCounter korrigieren + ADD.w d3,d7 ;BitCounter korrigieren + ROR.l d7,d6 ;restliche Bits re rausschieben + MOVE.w -(a2),d6 ;ndchstes Wort holen + ROL.l d7,d6 ;und zur|ckrotieren +GBNoLoop: + ADD.w d1,d1 ;*2 (in Tab sind Ws) + AND.w AndData-2(pc,d1.w),d0 ;unerw|nschte Bits rausschmei_en + RTS +;*---------- +AndData: + Dc.w %1,%11,%111,%1111,%11111,%111111,%1111111 + Dc.w %11111111,%111111111,%1111111111 + Dc.w %11111111111,%111111111111 + Dc.w %1111111111111,%11111111111111 +;*----------- +DecrEnd: + RTS ;a5: Start of decrunched Data + +;*************************************************************************** +OCmpTab = 0 +OAddTab = 64 +ORealTab = 128 +OAnzPerBits = 1182 +OBufLen = 1246+2 +;****************************** + +LZHDecruncher: + LEA Tabbs+2(pc),a6 +; addq.l #2,a6 + ADD.l d1,a1 + ADD.l d2,a2 + + MOVE.w -(a2),d0 ;Anz Bits in letztem Wort + MOVE.l -(a2),d6 ;1.LW + MOVEQ #16,d7 ;Anz Bits + SUB.w d0,d7 ;Anz Bits, die rotiert werden m|ssen + LSR.l d7,d6 ;1.Bits an Anfang bringen + MOVE.w d0,d7 ;Anz Bits, die noch im Wort sind + MOVEQ #16,d3 + +BufLoop: + LEA OAnzPerBits(a6),a0 + MOVEQ #16-1,d2 +clear: CLR.l (a0)+ + DBF d2,clear + + LEA OAnzPerBits+32(a6),a0 + LEA ORealTab+30(a6),a4 + MOVEQ #9,d2 + BSR ReadTab + LEA OAnzPerBits(a6),a0 + LEA ORealTab(a6),a4 + MOVEQ #4,d2 + BSR ReadTab + + LEA OAnzPerBits+32(a6),a3 + LEA OCmpTab-2(a6),a4 + BSR CalcCmpTab + LEA OAnzPerBits(a6),a3 + LEA OCmpTab+30(a6),a4 + BSR CalcCmpTab + + MOVEQ #16,d1 + BSR GetBits2 + MOVE.w d0,d5 + LEA ORealTab+30(a6),a0 + LEA -30(a0),a5 +decrloop2: ;** tabu: d3/d6/d7/a0-a2/a4 + MOVE.l a6,a4 + BSR ReadIt + BTST #8,d0 + BNE.b skip + MOVE.w d0,d4 + + LEA OCmpTab+32(a6),a4 + EXG a0,a5 + BSR ReadIt + EXG a0,a5 + MOVE.w d0,d1 + MOVE.w d0,d2 + BNE.b sc1 + MOVEQ #1,d1 + MOVEQ #16,d2 +sc1: BSR GetBits2 + BSET d2,d0 +sc2: LEA 1(a1,d0.w),a3 +sloop: MOVE.b -(a3),-(a1) + DBF d4,sloop + + MOVE.b -(a3),-(a1) + MOVE.b -(a3),d0 +skip: MOVE.b d0,-(a1) + DBF d5,decrloop2 + MOVEQ #1,d1 + BSR GetBits2 + BNE.w BufLoop + BRA LZHDecrEnd +;*-----------******************* +ReadIt: + MOVEQ #0,d1 ;Nr Byte +RIloop: + SUBQ.w #1,d7 + BEQ.b BTLoop + LSR.l #1,d6 ;Bit rausschieben und Flags setzen + BRA BTEnd +BTLoop: + MOVEQ #16,d7 ;hier kein add notwendig: d7 vorher 0 + MOVE.w d6,d0 + LSR.l #1,d6 ;Bit rausschieben und Flags setzen + SWAP d6 ;ror.l #16,d6 + MOVE.w -(a2),d6 ;ndchstes Wort holen + SWAP d6 ;rol.l #16,d6 + LSR.w #1,d0 ;Bit rausschieben und Flags setzen +BTEnd: + ROXL.w #1,d1 + MOVE.w (a4)+,d0 + CMP.w d1,d0 + BLS.b RIloop + + ADD.w 62(a4),d1 + ADD.w d1,d1 + MOVE.w 0(a0,d1.w),d0 + RTS +;*------------------------------------- +GetBits2: ;d1:AnzBits->d0:Bits + MOVE.w d6,d0 ;d6:Akt Wort + LSR.l d1,d6 ;ndchste Bits nach vorne bringen + SUB.w d1,d7 ;d7:Anz Bits, die noch im Wort sind + BGT.b GBNoLoop2 + ADD.w d3,d7 ;BitCounter korrigieren + ROR.l d7,d6 ;restliche Bits re rausschieben + MOVE.w -(a2),d6 ;ndchstes Wort holen + ROL.l d7,d6 ;und zur|ckrotieren +GBNoLoop2: + ADD.w d1,d1 ;*2 (in Tab sind Ws) + AND.w AndData2-2(pc,d1.w),d0 ;unerw|nschte Bits rausschmei_en + RTS +;*---------- +AndData2: + Dc.w %1,%11,%111,%1111,%11111,%111111,%1111111 + Dc.w %11111111,%111111111,%1111111111 + Dc.w %11111111111,%111111111111 + Dc.w %1111111111111,%11111111111111 + Dc.w %111111111111111,%1111111111111111 +;*--------------------------------------- +ReadTab: + MOVEM.l d1-d5/a3,-(a7) + MOVEQ #4,d1 + BSR GetBits2 ;Anz AnzPerBits + MOVE.w d0,d5 + SUBQ.w #1,d5 + MOVEQ #0,d4 + SUB.l a3,a3 +RTlop: ADDQ.w #1,d4 + MOVE.w d4,d1 + CMP.w d2,d1 + BLE.b c1 + MOVE.w d2,d1 +c1: BSR GetBits2 + MOVE.w d0,(a0)+ + ADD.w d0,a3 + DBF d5,RTlop + + MOVE.w a3,d5 + SUBQ.w #1,d5 +RTlp2: MOVE.w d2,d1 + BSR GetBits2 + MOVE.w d0,(a4)+ + DBF d5,RTlp2 + MOVEM.l (a7)+,d1-d5/a3 + RTS +;************************************************************** +CalcCmpTab: + MOVEM.l d0-d7,-(a7) + CLR.w (a4)+ + MOVEQ #15-1,d7 + MOVEQ #-1,d4 + MOVEQ #0,d2 + MOVEQ #0,d3 + MOVEQ #1,d1 +CClop: MOVE.w (a3)+,d6 + MOVE.w d3,64(a4) + MOVE.w -2(a4),d0 + ADD.w d0,d0 + SUB.w d0,64(a4) + ADD.w d6,d3 + MULU d1,d6 + ADD.w d6,d2 + MOVE.w d2,(a4)+ +cont2: + LSL.w #1,d2 + DBF d7,CClop + MOVEM.l (a7)+,d0-d7 + RTS +;********************************************* +LZHDecrEnd: +;LZHDecrLen equ *-LZHDecruncher + + RTS +;*********************************** +Tabbs: Dc.w 0 ;unbedingt!!!!!!! +CmpTab: Ds.w 16 ;Len + Ds.w 16 ;Dist +AddTab: Ds.w 16 ;Len + Ds.w 16 ;Dist +RealTab: + Ds.w 527 ;Dist+Len +AnzPerBits: + Ds.w 32 ;Dist+Len diff --git a/defender b/defender new file mode 100644 index 0000000..bc9f813 Binary files /dev/null and b/defender differ diff --git a/demon b/demon new file mode 100644 index 0000000..94354d2 Binary files /dev/null and b/demon differ diff --git a/demon.chunks b/demon.chunks new file mode 100644 index 0000000..725061c Binary files /dev/null and b/demon.chunks differ diff --git a/demon.chunks.info b/demon.chunks.info new file mode 100644 index 0000000..4c54718 Binary files /dev/null and b/demon.chunks.info differ diff --git a/demon.info b/demon.info new file mode 100644 index 0000000..6ca19e5 Binary files /dev/null and b/demon.info differ diff --git a/demon.pal b/demon.pal new file mode 100644 index 0000000..add6ed8 Binary files /dev/null and b/demon.pal differ diff --git a/dhead b/dhead new file mode 100644 index 0000000..0318693 Binary files /dev/null and b/dhead differ diff --git a/dhead.info b/dhead.info new file mode 100644 index 0000000..66b04c0 Binary files /dev/null and b/dhead.info differ diff --git a/dhead1 b/dhead1 new file mode 100644 index 0000000..3d9b522 Binary files /dev/null and b/dhead1 differ diff --git a/dhead1.info b/dhead1.info new file mode 100644 index 0000000..4c54718 Binary files /dev/null and b/dhead1.info differ diff --git a/dhead2 b/dhead2 new file mode 100644 index 0000000..d8ac188 Binary files /dev/null and b/dhead2 differ diff --git a/dhead2.info b/dhead2.info new file mode 100644 index 0000000..4c54718 Binary files /dev/null and b/dhead2.info differ diff --git a/dhead3 b/dhead3 new file mode 100644 index 0000000..b61a4dd Binary files /dev/null and b/dhead3 differ diff --git a/dhead3.info b/dhead3.info new file mode 100644 index 0000000..4c54718 Binary files /dev/null and b/dhead3.info differ diff --git a/diskreq.s b/diskreq.s new file mode 100644 index 0000000..45df4b7 --- /dev/null +++ b/diskreq.s @@ -0,0 +1,20 @@ +askfordisk jsr diskreq+32 + jsr qvwait + move.l d7,$dff080 + move #0,$dff088 + ; +.retry move.l #'GARD',d0 + move.l diskbuff,d1 + move.l sibdos,a0 + jsr (a0) + bne.s .got + ; + move #199,d7 +.vwloop jsr qvwait + dbf d7,.vwloop + bra.s .retry + ; +.got rts + +diskreq incbin loader + even diff --git a/display.s b/display.s new file mode 100644 index 0000000..2cf67ad --- /dev/null +++ b/display.s @@ -0,0 +1,179 @@ + + ;Display routines for planar Gloom + ; + bsr initdisplay + ; +loop btst #6,$bfe001 + bne loop + ; + bra finitdisplay + + + +finitdisplay ; + 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 + ; + rts + +initdisplay ; + lea grname,a1 + move.l 4.w,a6 + jsr -408(a6) + move.l d0,grbase + ; + move.l d0,a6 + move.l 34(a6),oldview + sub.l a1,a1 + jsr -222(a6) ;loadview + ; + move.l #80*2*5,d0 + moveq #2,d1 + allocmem chatplanes + move.l d0,chatmap + ; + move d0,chatplanes+6 + swap d0 + move d0,chatplanes+2 + swap d0 + add.l #80,d0 + move d0,chatplanes+14 + swap d0 + move d0,chatplanes+10 + ; + move.l #copinitf-copinit,d0 + moveq #2,d1 + allocmem copinit + move.l d0,coplist + ; + move.l d0,a1 + lea copinit,a0 + lea copinitf,a2 + ; +.loop cmp.l a2,a0 + bcc.s .done + move.l (a0)+,(a1)+ + bra.s .loop +.done ; + add.l #sl1-copinit,d0 + move.l d0,slice1 + add.l #sl2-sl1,d0 + move.l d0,slice2 + add.l #cstop-sl2,d0 + move.l d0,copstop + ; + move.l copstop,d0 + move.l slice1,a0 + move.l slice2,a1 + ; + move d0,72+6(a0) + move d0,72+6(a1) + swap d0 + move d0,72+2(a0) + move d0,72+2(a1) + ; + bsr dochatoff + ; + jsr -270(a6) + move #$81a0,$dff096 + ; + ;jsr -270(a6) + ;move.l coplist,$dff080 + ;move #0,$dff088 + ; + pull + rts + +cols24 macro + 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 + endm + +copinit ;initialization for display + ; + dc $1fc,15,$096,$120 + ; + dc $08e,$1e81,$090,$23c1,$1e4,$2000 + dc $092,$38,$094,$c0,$102,0 + ; + dc $100,$a200,$108,80,$10a,80 + dc $106,0,$10c,0 ;bank, eor + dc $182,$fff,$184,$f0f,$186,$ff0 + ; +chatplanes dc $e0,0,$e2,0,$e4,0,$e6,0 + ; + dc 26<<8+1,$fffe + ; + 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 + ; +chatdispon dc $1fe,0 ;096,$8100 + dc $2401,$fffe,$096,$100 + dc $094,$a0,$100,$7200,$108,6*40,$10a,6*40 + ; + ;lo colour nybs - lo bank + dc $106,$0200 +cols1 cols24 + ; + ;lo nybs - hi bank + dc $106,$8200 +cols2 cols24 + ; + ;hi colour nybs - lo bank + dc $106,0 +cols3 cols24 + ; + ;hi colour nybs - hi bank + dc $106,$8000 +cols4 cols24 + ; + ;slice... +sl1 ; + 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 $08e,$2c81,$090,$f4c1 ;diw + dc $0001,$fffe ;wait for slice! + dc $096,$8100 + ; + dc $084,0,$086,0,$08a,0 +sl2 ; + 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 + ;56 + dc $08e,$2c81,$090,$f4c1 ;diw + ;64 + dc $0001,$fffe ;wait for slice! + ;68 + dc $096,$8100 + ;72 + ; + dc $084,0,$086,0,$08a,0 + ; +cstop dc $096,$0100 ;display DMA off... + dc $ffff,$fffe diff --git a/doc b/doc new file mode 100644 index 0000000..b434bfe --- /dev/null +++ b/doc @@ -0,0 +1,23 @@ + + spacehulk (maps 1_1..1_8) + ************************* + +monsters: marine, baldy, terra + +firepower: red, green, darkgreen + + + gothic tomb + *********** + +monsters: lizard, ghoul, phantom, deathhead + +firepower: red, green, darkgreen, lightblue + + + hell + **** + +monsters: any! + +firepower: all! diff --git a/doc.info b/doc.info new file mode 100644 index 0000000..6baf883 Binary files /dev/null and b/doc.info differ diff --git a/doit b/doit new file mode 100644 index 0000000..70f67ed --- /dev/null +++ b/doit @@ -0,0 +1,13 @@ +txts +maps +data +ggfx +fonts +misc +prog +pics +objs +sfxs +c2p +pics_ehb +12 directories - 24 blocks used diff --git a/doom.bb2 b/doom.bb2 new file mode 100644 index 0000000..08fe810 Binary files /dev/null and b/doom.bb2 differ diff --git a/doom.bb2.bak b/doom.bb2.bak new file mode 100644 index 0000000..08fe810 Binary files /dev/null and b/doom.bb2.bak differ diff --git a/doom.bb2.info b/doom.bb2.info new file mode 100644 index 0000000..6baf883 Binary files /dev/null and b/doom.bb2.info differ diff --git a/doom.bb2.xtra b/doom.bb2.xtra new file mode 100644 index 0000000..46cf7ff Binary files /dev/null and b/doom.bb2.xtra differ diff --git a/dpal b/dpal new file mode 100644 index 0000000..5ccf9a3 Binary files /dev/null and b/dpal differ diff --git a/dragon.abrsh b/dragon.abrsh new file mode 100644 index 0000000..1595e08 Binary files /dev/null and b/dragon.abrsh differ diff --git a/dragon.chunks b/dragon.chunks new file mode 100644 index 0000000..11de18b Binary files /dev/null and b/dragon.chunks differ diff --git a/dragon.chunks.info b/dragon.chunks.info new file mode 100644 index 0000000..c1676ee Binary files /dev/null and b/dragon.chunks.info differ diff --git a/dragon.info b/dragon.info new file mode 100644 index 0000000..c01f202 Binary files /dev/null and b/dragon.info differ diff --git a/dragon1 b/dragon1 new file mode 100644 index 0000000..c73ae0f Binary files /dev/null and b/dragon1 differ diff --git a/dragon1.info b/dragon1.info new file mode 100644 index 0000000..01ce89d Binary files /dev/null and b/dragon1.info differ diff --git a/dragon2 b/dragon2 new file mode 100644 index 0000000..f74ea20 Binary files /dev/null and b/dragon2 differ diff --git a/dragon2.info b/dragon2.info new file mode 100644 index 0000000..01ce89d Binary files /dev/null and b/dragon2.info differ diff --git a/dragon3 b/dragon3 new file mode 100644 index 0000000..ca9b73d Binary files /dev/null and b/dragon3 differ diff --git a/dragon3.info b/dragon3.info new file mode 100644 index 0000000..01ce89d Binary files /dev/null and b/dragon3.info differ diff --git a/dragon4 b/dragon4 new file mode 100644 index 0000000..e15c68d Binary files /dev/null and b/dragon4 differ diff --git a/dragon4.info b/dragon4.info new file mode 100644 index 0000000..01ce89d Binary files /dev/null and b/dragon4.info differ diff --git a/ecstest.bb2 b/ecstest.bb2 new file mode 100644 index 0000000..befcfda Binary files /dev/null and b/ecstest.bb2 differ diff --git a/ecstest.bb2.bak b/ecstest.bb2.bak new file mode 100644 index 0000000..35d2472 Binary files /dev/null and b/ecstest.bb2.bak differ diff --git a/ecstest.bb2.info b/ecstest.bb2.info new file mode 100644 index 0000000..6baf883 Binary files /dev/null and b/ecstest.bb2.info differ diff --git a/ecstest.bb2.xtra b/ecstest.bb2.xtra new file mode 100644 index 0000000..4a1d1bb Binary files /dev/null and b/ecstest.bb2.xtra differ diff --git a/fire.bin b/fire.bin new file mode 100644 index 0000000..223b8a9 Binary files /dev/null and b/fire.bin differ diff --git a/fire.iff b/fire.iff new file mode 100644 index 0000000..f6dccbb Binary files /dev/null and b/fire.iff differ diff --git a/fire1.wav b/fire1.wav new file mode 100644 index 0000000..5095972 Binary files /dev/null and b/fire1.wav differ diff --git a/fire2.bin b/fire2.bin new file mode 100644 index 0000000..9b303c9 Binary files /dev/null and b/fire2.bin differ diff --git a/fire2.sfx b/fire2.sfx new file mode 100644 index 0000000..70afa7c Binary files /dev/null and b/fire2.sfx differ diff --git a/fire2.sfx.info b/fire2.sfx.info new file mode 100644 index 0000000..56c6cb5 Binary files /dev/null and b/fire2.sfx.info differ diff --git a/fire3.sfx b/fire3.sfx new file mode 100644 index 0000000..457ca40 Binary files /dev/null and b/fire3.sfx differ diff --git a/fire3.sfx.info b/fire3.sfx.info new file mode 100644 index 0000000..56c6cb5 Binary files /dev/null and b/fire3.sfx.info differ diff --git a/flat b/flat new file mode 100644 index 0000000..2106e95 Binary files /dev/null and b/flat differ diff --git a/flat.bin b/flat.bin new file mode 100644 index 0000000..ea4886c --- /dev/null +++ b/flat.bin @@ -0,0 +1 @@ +ÿ ̈Dÿ¿TC2 PÊà ̈D \ No newline at end of file diff --git a/flat.iff b/flat.iff new file mode 100644 index 0000000..b892ed3 Binary files /dev/null and b/flat.iff differ diff --git a/flat.iff.info b/flat.iff.info new file mode 100644 index 0000000..b396f7d Binary files /dev/null and b/flat.iff.info differ diff --git a/flat.s b/flat.s new file mode 100644 index 0000000..fd53be4 --- /dev/null +++ b/flat.s @@ -0,0 +1,65 @@ + + move #$4000,$dff09a + ; +vwait move #$20,$dff09c +.ll btst #5,$dff01f + beq.s .ll + move #$f00,$dff180 + ; + move #99,d7 + ; + lea lut,a0 + lea pal,a5 + moveq #0,d0 + moveq #0,d1 + moveq #0,d4 + moveq #0,d6 + moveq #0,d7 + ; + move #99,-(a7) + ; +.loop bsr flat + subq #1,(a7) + bpl.s .loop + addq #2,a7 + ; + move #0,$dff180 + btst #6,$bfe001 + bne vwait + ; + move #$c000,$dff09a + rts + +flat ; + moveq #31,d5 + lea dummy(pc),a3 + ; +.hloop tst (a3) ;check destination! + 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 0(a5,d3*2),(a3) + addx d2,d1 + addq #4,a3 + dbf d5,.hloop + rts + ; +.skip add.l d4,d0 + addx d2,d0 + add.l d6,d1 + addx d2,d1 + addq #4,a3 + dbf d5,.hloop + rts + +lut ds.b 512 +pal ds.b 512 +dummy ds.l 32 diff --git a/flat3.bin b/flat3.bin new file mode 100644 index 0000000..b565f02 --- /dev/null +++ b/flat3.bin @@ -0,0 +1,1666 @@ + + + + + + + + + + + + + + + + +  + + + + + + + + + + + + + + + +  + + + + + + + + + + + + + + + +  + + + + + + + + + + + + + + + +  + + + + + + + + + + + + + + + +  + + + + + + + + + + + + + + + +  + + + + + + + + + + + + + + + +  + + + + + + + + + + + + + + + +                                   + + + + + + + +  + + + + + + + +  + + + + + + + +  + + + + + + + +  + + + + + + + +  + + + + + + + +  + + + + + + + +  + + + + + + + +  + + + + + + + +  + + + + + + + +  + + + + + + + +  + + + + + + + +  + + + + + + + +  + + + + + + + +  + + + + + + + +  + + + + + + + +  + + + + + + + +  + + + + + + + +   + + + + + + + +  + + + + + + + +   + + + + + + + +  + + + + + + + +   + + + + + + + +  + + + + + + + +   + + + + + + + +  + + + + + + + +   + + + + + + + +  + + + + + + + +   + + + + + + + +  + + + + + + + +   + + + + + + + +  + + + + + + + +  + + + + + + + +    + + + + + + + +    + + + + + + + +    + + + + + + + +    + + + + + + + +    + + + + + + + +    + + + + + + + +    + + + + + + + +    + + + + + + + +     + + + + + + + +     + + + + + + + +     + + + + + + + +     + + + + + + + +     + + + + + + + +     + + + + + + + +     + + + + + + + +     + + + + + + + +  + + + + + + + + + + + + + + + +  + + + + + + + + + + + + + + + +  + + + + + + + + + + + + + + + +  + + + + + + + + + + + + + + + +  + + + + + + + + + + + + + + + +  + + + + + + + + + + + + + + + +  + + + + + + + + + + + + + + + +  + + + + + + + + + + + + + + + +    + + + + + + + +    + + + + + + + +    + + + + + + + +    + + + + + + + +    + + + + + + + +    + + + + + + + +    + + + + + + + +     + + + + + + + +   + + + + + + + + + + + + + + + +   + + + + + + + + + + + + + + + +   + + + + + + + + + + + + + + + +   + + + + + + + + + + + + + + + +   + + + + + + + + + + + + + + + +   + + + + + + + + + + + + + + + +   + + + + + + + + + + + + + + + +   + + + + + + + + + + + + + + + + + + + + + + + +   + + + + + + + + + + + + + + + + + + + + + + + +   + + + + + + + + + + + + + + + + + + + + + + + +   + + + + + + + + + + + + + + + + + + + + + + + +   + + + + + + + + + + + + + + + + + + + + + + + +   + + + + + + + + + + + + + + + + + + + + + + + +   + + + + + + + + + + + + + + + + + + + + + + + +   + + + + + + + + + + + + + + + + + + + + + + + +   + + + + + + + + + + + + + + + +  + + + + + + + +   + + + + + + + +  + + + + + + + +   + + + + + + + +  + + + + + + + +   + + + + + + + +  + + + + + + + +   + + + + + + + +  + + + + + + + +   + + + + + + + +  + + + + + + + +   + + + + + + + +  + + + + + + + +   + + + + + + + +  + + + + + + + +    + + + + + + + +    + + + + + + + +    + + + + + + + +    + + + + + + + +    + + + + + + + +    + + + + + + + +    + + + + + + + +    + + + + + + + +   + + + + + + + + + + + + + + + +   + + + + + + + + + + + + + + + +   + + + + + + + + + + + + + + + +   + + + + + + + + + + + + + + + +   + + + + + + + + + + + + + + + +   + + + + + + + + + + + + + + + +   + + + + + + + + + + + + + + + +   + + + + + + + + + + + + + + + +   + + + + + + + +  + + + + + + + +   + + + + + + + +  + + + + + + + +   + + + + + + + +  + + + + + + + +   + + + + + + + +  + + + + + + + +   + + + + + + + +  + + + + + + + +   + + + + + + + +  + + + + + + + +   + + + + + + + +  + + + + + + + +   + + + + + + + +  + + + + + + + +     + + + + + + + +     + + + + + + + +     + + + + + + + +     + + + + + + + +     + + + + + + + +     + + + + + + + +     + + + + + + + +     + + + + + + + +     + + + + + + + + + + + + + + + +     + + + + + + + + + + + + + + + +     + + + + + + + + + + + + + + + +     + + + + + + + + + + + + + + + +     + + + + + + + + + + + + + + + +     + + + + + + + + + + + + + + + +     + + + + + + + + + + + + + + + +     + + + + + + + + + + + + + + + +   ï Ý Ì Ì º © —™ˆwfTC" 1R +s ”¶¯ ßÿu•·U3T \ No newline at end of file diff --git a/flat3.iff b/flat3.iff new file mode 100644 index 0000000..b124d8f Binary files /dev/null and b/flat3.iff differ diff --git a/flat3.iff.info b/flat3.iff.info new file mode 100644 index 0000000..51271d3 Binary files /dev/null and b/flat3.iff.info differ diff --git a/flat4.iff b/flat4.iff new file mode 100644 index 0000000..b0ffa3f Binary files /dev/null and b/flat4.iff differ diff --git a/flat4.iff.info b/flat4.iff.info new file mode 100644 index 0000000..d43fa55 Binary files /dev/null and b/flat4.iff.info differ diff --git a/floor3 b/floor3 new file mode 100644 index 0000000..e7f39fc Binary files /dev/null and b/floor3 differ diff --git a/floor3.info b/floor3.info new file mode 100644 index 0000000..374662a Binary files /dev/null and b/floor3.info differ diff --git a/flush.s b/flush.s new file mode 100644 index 0000000..624286b --- /dev/null +++ b/flush.s @@ -0,0 +1,8 @@ +flushc 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 + diff --git a/font.bin b/font.bin new file mode 100644 index 0000000..c8f0d9e Binary files /dev/null and b/font.bin differ diff --git a/font.iff b/font.iff new file mode 100644 index 0000000..e69ba87 Binary files /dev/null and b/font.iff differ diff --git a/font.iff.info b/font.iff.info new file mode 100644 index 0000000..cdbdfc0 Binary files /dev/null and b/font.iff.info differ diff --git a/fonts/2001.font b/fonts/2001.font new file mode 100644 index 0000000..ce8dad6 Binary files /dev/null and b/fonts/2001.font differ diff --git a/fonts/2001/8 b/fonts/2001/8 new file mode 100644 index 0000000..a55d9a4 Binary files /dev/null and b/fonts/2001/8 differ diff --git a/fonts/microscopic.font b/fonts/microscopic.font new file mode 100644 index 0000000..043dfd3 Binary files /dev/null and b/fonts/microscopic.font differ diff --git a/fonts/microscopic/5 b/fonts/microscopic/5 new file mode 100644 index 0000000..9302e1e Binary files /dev/null and b/fonts/microscopic/5 differ diff --git a/g b/g new file mode 100644 index 0000000..932e3c4 Binary files /dev/null and b/g differ diff --git a/g.s.old b/g.s.old new file mode 100644 index 0000000..cda04e3 --- /dev/null +++ b/g.s.old @@ -0,0 +1,1646 @@ + +focshft equ 6 +grdshft equ 8 +darkshft equ 7 +maxz equ 16<>2-1,d5 + ; +.loop movem (a6)+,d2-d3 + ; + move d6,d0 + add d2,d0 + cmp #32,d0 + bcc .skip + ; + move d7,d1 + add d3,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*4),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 + move frame(pc),d0 + cmp (a1),d0 + beq .skip2 + move d0,(a1)+ + addq #1,wallcnt + ; + bsr rotandadd ;x1,z1 + bsr rotandadd ;x2,z2 + ; + move.l (a1)+,(a5)+ ;y,h + move.l (a1)+,(a5)+ ;scale + move.l (a1)+,(a5)+ ;texture + ; +.skip2 dbf d4,.loop2 + ; +.skip dbf d5,.loop + ; + rts + +rotandadd movem (a1)+,d0-d1 ;X,Z + sub camx(pc),d0 + sub camz(pc),d1 + move d0,d2 + move d1,d3 + ; + muls cm1(pc),d0 + muls cm2(pc),d1 + add.l d1,d0 + add.l d0,d0 + swap d0 + move d0,(a5)+ ;X + ; + muls cm3(pc),d2 + muls cm4(pc),d3 + add.l d3,d2 + add.l d2,d2 + swap d2 + move d2,(a5)+ ;Z + ; + rts + +castwalls ;process 'walls' list + ; + move.l castrots(pc),a6 + move.l vertdraws(pc),a4 + move minx(pc),d0 + lsl #3,d0 + add d0,a6 + move width(pc),d7 + subq #1,d7 + ; +.columnloop ;do this vert line! + ; + clr.l vd_data(a4) + move.l walls(pc),a5 + move wallcnt(pc),d6 + bmi .nextcolumn + ; + ;OK, here we use Z buffer to find nearest Z! + ; + move #32767,vd_z(a4) +.vertloop ; + move va_lx(a5),d0 + move va_lz(a5),d1 + muls (a6),d0 + muls 2(a6),d1 + add.l d1,d0 ;LX! + bgt .nextvert + ; + move va_rx(a5),d1 + move va_rz(a5),d2 + muls (a6),d1 + muls 2(a6),d2 + add.l d2,d1 ;RX! + lsl.l #4,d1 + swap d1 + tst d1 + ble .nextvert + ; + ;OK, this vertical section is in line with RAY! + ;gotta find middle Z! + ; + ;LX<0 (-lx)/(rx-lx) + ; + lsl.l #4,d0 + swap d0 + sub d0,d1 + ble .nextvert + swap d0 + neg.l d0 + divu d1,d0 ;fraction! + ; + move va_lx(a5),d1 + move va_lz(a5),d2 + muls 4(a6),d1 + muls 6(a6),d2 + add.l d2,d1 ;LZ + add.l d1,d1 + swap d1 + ; + move va_rx(a5),d2 + move va_rz(a5),d3 + muls 4(a6),d2 + muls 6(a6),d3 + add.l d3,d2 ;RZ + add.l d2,d2 + swap d2 + ; + move d0,d3 + lsr #1,d3 + sub d1,d2 + muls d3,d2 + add.l d2,d2 + swap d2 + add d1,d2 ;middle Z! + ble .nextvert + cmp #maxz,d2 + bcc .nextvert + ; + ;OK, d0.r=fraction, d2.w=middle Z!...calc real height! + ; + move d2,d3 + lsr #darkshft,d3 + movem d2-d3,vd_z(a4) + ; + move va_h(a5),d1 + ext.l d1 + lsl.l #focshft,d1 + divs d2,d1 ;real h + ble .nextvert + move d1,vd_h(a4) + ; + lea textures(pc),a3 + move va_texture(a5),d3 + move.l -4(a3,d3*4),a3 + ; + ;have to divide h into real height of texture! + ; + move te_hand(a3),d3 + addq #1,d3 + swap d3 + clr d3 + ext.l d1 + lsl.l #5,d1 + lsl.l #5,d3 + divu.l d1,d3 + move.l d3,vd_ystep(a4) + ; + move va_y(a5),d1 + ext.l d1 + lsl.l #focshft,d1 + divs d2,d1 ;real Y + move d1,vd_y(a4) + ; + ;find which column....0 -> w-1 + ; + ;scale up fraction to find texture column! + ; + and.l #$ffff,d0 + move.l va_scale(a5),d1 + mulu.l d1,d1:d0 + move d1,d0 + swap d0 + ; + move te_wshift(a3),d1 + lsl.l d1,d0 + swap d0 ;which column! + move te_wand(a3),d1 + and d1,d0 + ; + move te_hshift(a3),d1 + lsl d1,d0 + ; + lea te_size(a3,d0),a3 + move.l a3,vd_data(a4) + bra.s .nextcolumn + ; +.nextvert lea va_size(a5),a5 + dbf d6,.vertloop + ; +.nextcolumn lea vd_size(a4),a4 + addq #8,a6 + dbf d7,.columnloop + ; + check .columnloop + ; + rts + +dbwindow ;a0=window to double buffer.... + ; + movem.l wi_cop(a0),d0-d1 + cmp.l d0,d1 + bne.s .skip + move.l wi_cop2(a0),d1 +.skip move.l d1,wi_cop(a0) + ; +usewindow ;a0=window to use... + ; + move.l wi_cop(a0),cop + move wi_copmod(a0),copmod + move wi_w(a0),d0 + move d0,width + lsr #1,d0 + move d0,maxx + neg d0 + move d0,minx + move wi_h(a0),d1 + move d1,hite + lsr #1,d1 + move d1,maxy + neg d1 + move d1,miny + ; + rts + +clswindow ;clear window contents/arrays etc. + ; +blitcls ;use blitter to cls cop + ; + move width(pc),d0 + subq #1,d0 + ; + move hite(pc),d1 + lsl #6,d1 + or #1,d1 + ; + move copmod(pc),d2 + subq #2,d2 + ; + lea coloffs(pc),a0 + lea $dff000,a1 + ; + btst #6,2(a1) +.bwait btst #6,2(a1) + bne.s .bwait + ; + move.l #$1000000,$040(a1) + move d2,$066(a1) ;Dmod + ; +.loop move.l cop(pc),d2 + add.l (a0)+,d2 + ; + move.l d2,$054(a1) ;Dpth + move d1,$058(a1) ;size... + ; + btst #6,2(a1) +.bwait2 btst #6,2(a1) + bne.s .bwait2 + ; + dbf d0,.loop + rts + +blitcls2 ;use blitter to cls cop + ; + move width(pc),d0 + subq #1,d0 + ; + move hite(pc),d1 + lsr #1,d1 + lsl #6,d1 + or #1,d1 + ; + move copmod(pc),d2 + add d2,d2 + subq #2,d2 + ; + lea coloffs(pc),a0 + lea $dff000,a1 + move #$f00,d7 + move #0,d6 + ; + btst #6,6(a1) +.bwait btst #6,6(a1) + bne.s .bwait + ; + move.l #$1f00000,$040(a1) + move d2,$066(a1) ;Dmod + move.l #-1,$044(a1) + ; +.loop move.l cop(pc),d2 + add.l (a0)+,d2 + ; + move.l d2,$054(a1) ;Dpth + move d1,$058(a1) ;size... + move d7,$074(a1) + addq #1,d7 + and #$f0f,d7 + ; + btst #6,2(a1) +.bwait2 btst #6,2(a1) + bne.s .bwait2 + ; + move copmod(pc),d5 + ext.l d5 + add.l d5,d2 + move.l d2,$054(a1) ;Dpth + move d1,$058(a1) ;size... + move d6,$074(a1) + addq #1,d6 + and #$f0f,d6 + ; + btst #6,2(a1) +.bwait3 btst #6,2(a1) + bne.s .bwait3 + ; + dbf d0,.loop + rts + +renderwindow ; + ; +renderwalls move.l vertdraws(pc),a6 + lea coloffs(pc),a5 + move width(pc),d7 + subq #1,d7 + lea palettes,a2 + ; +.loop move.l vd_data(a6),d0 + beq .vertskip + move.l d0,a0 + ; + move.l cop(pc),a1 + add.l (a5),a1 + ; + move vd_h(a6),d5 + move.l vd_ystep(a6),d1 + ; + move vd_y(a6),d0 + add midy(pc),d0 + bpl.s .noclip + ; + ;gotta clip Y + add d0,d5 ;reduce hite + ble .vertskip + neg d0 + ext.l d0 + mulu.l d1,d0 ;y step* y + bra.s .skipclip + ; +.noclip mulu copmod(pc),d0 + add.l d0,a1 + moveq #0,d0 +.skipclip ; + swap d0 + swap d1 + move vd_pal(a6),d2 + move.l 0(a2,d2*4),a3 + moveq #0,d2 + moveq #0,d3 + move copmod(pc),d4 + ext.l d4 + cmp hite(pc),d5 + ble.s .hok + move hite(pc),d5 +.hok subq #1,d5 + ; +.vertloop ;a0=src texture column + ;a1=dest coppoke + ;a3=palette + ;d0=current Y + ;d1=Y step + ;d2=0 + ;d3=$00xx + ;d4=copmod + ;d5=count + ; + move.b 0(a0,d0),d3 ;lut entry + move 0(a3,d3*2),(a1) ;colour! + add.l d1,d0 + addx.l d2,d0 + add.l d4,a1 + dbf d5,.vertloop + ; +.vertskip addq #4,a5 + lea vd_size(a6),a6 + dbf d7,.loop + ; + check .loop + ; + rts + +vbhandler subq #1,(a1) + moveq #0,d0 + rts + +vwait move #1,vbcounter +.loop tst vbcounter + bgt.s .loop + rts + +;************** DATA *************************** + +data + +palettes ds.l 16 ;16 palettes for 16 brightnesses +rgbs ds.l 1 ;table for calculating palettes + +joyx0 dc 0 +joyy0 dc 0 +joyr0 dc 0 +joyb0 dc 0 + ; +joyx1 dc 0 +joyy1 dc 0 +joyr1 dc 0 +joyb1 dc 0 + +map_map dc.l mapinc +map_grid dc.l 0 +map_poly dc.l 0 +map_ppnt dc.l 0 +map_rgbs dc.l 0 +map_txts 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 + +castrots dc.l castrotsinc+8*160 ;middle of table +camrots dc.l camrotsinc +vertdraws dc.l 0 ;vertical strips to draw + +walls dc.l 0 ;linked list of walls to display +wallcnt dc.l 0 + ;already rotated around camera! +cop dc.l 0 +copmod dc 0 +width dc 0 +hite dc 0 +minx dc 0 +midx ; +maxx dc 0 +miny dc 0 +midy ; +maxy 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 + +window1 ; +slice dc.l slice1 +nslice dc.l copstop ;slice2 ;copstop here for 1 window + ; + dc 160-52*3 + dc 44 + dc 104 ;max width for 2 high = 90! + dc 80 + dc 3 + dc 3 + dc.l joyx1 + dc 0,0,0,0 ;camx,z,y,r + ; + dc 0 + dc.l 0 + dc.l 0 + ; + dc.l 0 + dc.l 0 + dc.l 0 + dc.l 0 + dc 0 + +window2 ; + dc.l slice2 + dc.l copstop + ; + dc 160-32*3 + dc 44+120 + dc 64 + dc 59 + dc 3 + dc 2 + dc.l joyx0 + dc 0,0,0,0 ;camx,z,y,r + ; + dc 0 + dc.l 0 + dc.l 0 + ; + dc.l 0 + dc.l 0 + dc.l 0 + dc.l 0 + dc 0 + +col0 equ $123 + +copinit ;initialization for display + ; + dc $1fc,15 + dc $096,$0120 ;cop/bit/spr DMA off + ;dc $08e,$2c81,$090,$f4c1 + dc $092,$38,$094,$a0 + dc $108,6*40,$10a,6*40 + dc $100,$7200 ;lores, 7 bitplanes + dc $102,0 + ; + dc 26<<8+1,$fffe + ; + ;lo colour nybs - lo bank + dc $106,$0200 + dc $180,col0 + ; + ;lo nybs - hi bank + dc $106,$8200 + dc $180,col0 + ; + ;hi colour nybs - lo bank + dc $106,0 + dc $180,col0 + ; + ;hi colour nybs - hi bank + dc $106,$8000 + dc $180,col0 + ; + ;slice... + ; +sl1 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 $08e,$2c81,$090,$f4c1 ;diw + dc $096,$8100 + dc $084,0,$086,0,$08a,0 + ; +sl2 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 + ;56 + dc $08e,$2c81,$090,$f4c1 ;diw + ;64 + dc $096,$8100 + ;68 + dc $084,0,$086,0,$08a,0 + ; +cstop dc $096,$0100 + dc $ffff,$fffe +copinitf ; + +bigdata + +textures ds.l 48 + +mapinc incbin maps/test +castrotsinc incbin castrots.bin +camrotsinc incbin camrots.bin +palette incbin texture.pal + +testwall dc -256,1024,256,1024 + dc -64,128 + dc.l $40000 + dc.l 0 + +;************** SLOW SUBS ********************** + +slowsubs + +loadfile ;a0=name, d1=memtype + ; + ;return d0=pointer + ; + push + ; + move.l d1,-(a7) + ; + move.l a0,d1 + move.l #1005,d2 + move.l dosbase,a6 + jsr -30(a6) ;open it! + move.l d0,d7 ;handle + beq .done + ; + 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) + ; + ;d0=length of file ? + ; + move.l d0,d3 + move.l (a7),d1 + jsr allocmem + ; + move.l d0,d2 + move.l d7,d1 + jsr -42(a6) + move.l d7,d1 + jsr -36(a6) + move.l d2,d0 + ; +.done addq #4,a7 + pull + ; + rts + +calcpalettes ;a0=palette! + ; + move.l map_rgbs(pc),a0 + ; + move.l rgbs(pc),a1 + move #255,d0 + move.l #$f0000,d1 + ; +.loop move (a0)+,d2 + ; + move d2,d3 + lsl.l #8,d2 + and.l d1,d2 + move.l d2,(a1)+ ;R + ; + move d3,d2 + lsl.l #8,d2 + lsl.l #4,d2 + and.l d1,d2 + move.l d2,(a1)+ ;G + ; + swap d3 + and.l d1,d3 + move.l d3,(a1)+ ;B + ; + dbf d0,.loop + ; + lea palettes(pc),a0 + moveq #15,d0 + ; +.loop2 move.l rgbs(pc),a1 + move.l (a0)+,a2 + move #255,d1 + ; +.loop3 movem.l (a1),d2-d4 + lsr.l #8,d2 + and #$f00,d2 + lsr.l #8,d3 + lsr.l #4,d3 + and #$f0,d3 + swap d4 + and #$f,d4 + or d4,d3 + or d3,d2 + move d2,(a2)+ + ; + move.l (a1),d2 + sub.l #$10000,d2 + bpl.s .rok + moveq #0,d2 +.rok move.l d2,(a1)+ + ; + move.l (a1),d3 + sub.l #$10000,d3 + bpl.s .gok + moveq #0,d3 +.gok move.l d3,(a1)+ + ; + move.l (a1),d4 + sub.l #$10000,d4 + bpl.s .bok + moveq #0,d4 +.bok move.l d4,(a1)+ + ; + dbf d1,.loop3 + dbf d0,.loop2 + rts + +dispoff tst dispnest + bne.s .skip + bsr vwait + move #$01a0,$dff096 +.skip addq #1,dispnest + rts + +dispon subq #1,dispnest + bgt.s .skip + bsr vwait + move #$8180,$dff096 +.skip rts + +forbid push + move.l 4.w,a6 + jsr -132(a6) + pull + rts + +permit push + move.l 4.w,a6 + jsr -138(a6) + pull + rts + +initvbint push + move.l 4.w,a6 + moveq #5,d0 + lea vbintserver,a1 + jsr -168(a6) ;addintserver + pull + rts + +vbcounter dc 0 +frame dc 0 + +vbintserver dc.l 0,0 + dc.b 2,0 + dc.l 0 +vbintdata dc.l vbcounter +vbintcode dc.l vbhandler + +finitvbint push + move.l 4.w,a6 + moveq #5,d0 + lea vbintserver,a1 + jsr -174(a6) + pull + rts + +ownblitter push + move.l grbase,a6 + jsr -456(a6) + btst #6,$dff002 +.bwait btst #6,$dff002 + bne.s .bwait + pull + rts + +disownblitter push + btst #6,$dff002 +.bwait btst #6,$dff002 + bne.s .bwait + move.l grbase,a6 + jsr -462(a6) + pull + rts + +makecoloffs push + lea coloffs,a0 + moveq #2,d0 + moveq #3,d2 +.loop addq.l #4,d0 + moveq #31,d1 +.loop2 move.l d0,(a0)+ + addq.l #4,d0 + dbf d1,.loop2 + dbf d2,.loop + pull + 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 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_slice(a0),a1 + move.l (a1),a1 + move.l wi_cop(a0),d0 + move d0,68+6(a1) + swap d0 + move d0,68+2(a1) + rts + +finitdisplay push + ; + 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 #0,$dff088 + move #$81a0,$dff096 + ; + pull + rts + +initdisplay push + ; + lea grname,a1 + move.l 4.w,a6 + jsr -408(a6) + move.l d0,grbase + ; + move.l d0,a6 + move.l 34(a6),oldview + sub.l a1,a1 + jsr -222(a6) ;loadview + ; + move.l #copinitf-copinit,d0 + moveq #2,d1 + bsr allocmem + move.l d0,coplist + ; + move.l d0,a1 + lea copinit,a0 + lea copinitf,a2 + ; +.loop cmp.l a2,a0 + bcc.s .done + move.l (a0)+,(a1)+ + bra.s .loop +.done ; + add.l #sl1-copinit,d0 + move.l d0,slice1 + add.l #sl2-sl1,d0 + move.l d0,slice2 + add.l #cstop-sl2,d0 + move.l d0,copstop + ; + move.l copstop,d0 + move.l slice1,a0 + move.l slice2,a1 + move d0,68+6(a0) + move d0,68+6(a1) + swap d0 + move d0,68+2(a0) + move d0,68+2(a1) + ; + jsr -270(a6) + jsr -270(a6) + move.l coplist,$dff080 + move #0,$dff088 + ; + pull + rts + +makewindow ; + ;a0=window struct! + ; + push + ; + move.l a0,a2 + ; + move wi_h(a2),d0 + mulu wi_ph(a2),d0 + move d0,wi_bh(a2) + mulu #40*7,d0 + ; + move.l #$10002,d1 + move.l d0,wi_bmapmem(a2) + bsr allocmem + move.l d0,wi_bmap(a2) + ; + ;OK, plot colours on bitmap! + move.l d0,a0 + move wi_x(a2),d0 + move d0,d1 + lsr #3,d0 + not d1 + and #7,d1 + moveq #127,d7 ;colour + move wi_w(a2),d6 ;width + subq #1,d6 + ; +.wloop move wi_pw(a2),d5 + subq #1,d5 + ; +.wloop2 move d7,d4 + moveq #6,d3 + ; +.dloop bclr d1,0(a0,d0) + lsr #1,d4 + bcc.s .dskip + bset d1,0(a0,d0) +.dskip lea 40(a0),a0 + dbf d3,.dloop + ; + lea -40*7(a0),a0 + subq #1,d1 + bpl.s .dskip2 + moveq #7,d1 + addq #1,d0 +.dskip2 dbf d5,.wloop2 + ; + subq #1,d7 + dbf d6,.wloop + ; + move.l wi_bmapmem(a2),d0 + sub.l #40*7,d0 + lsr.l #2,d0 + subq #1,d0 + lea 40*7(a0),a1 +.cbloop move.l (a0)+,(a1)+ + dbf d0,.cbloop + ; + ;how many copins on one line? + move wi_w(a2),d0 + move d0,d1 + subq #1,d0 + lsr #5,d0 ;how many bank changes per line! + addq #4,d0 ;2 waits - 1 eor, 1 init bank select + add d1,d0 ;+colpokes + ; + move d0,d1 + lsl #2,d1 + move d1,wi_copmod(a2) + ; + mulu wi_h(a2),d0 + addq #5,d0 ;2 waits and cop jump at end + ; + lsl.l #2,d0 ;4 bytes/copins + moveq #2,d1 ;cop in chip + move.l d0,wi_copmem(a2) + lsl.l #1,d0 ;2 coplists! + bsr allocmem + move.l d0,wi_cop(a2) + move.l d0,wi_cop1(a2) + ; + move.l d0,a0 + move wi_y(a2),d6 + move wi_h(a2),d7 + subq #1,d7 + move #$111,d3 ;test colour + move #$8000,d4 ;Colour Eor + ; +.hloop ;make one copline... + ; + moveq #127,d0 ;colour reg to poke + move wi_w(a2),d1 + subq #1,d1 + ; +.lloop move d0,d2 + addq #1,d2 + and #31,d2 + bne.s .notnbank + ; + ;new bank.... + move d0,d2 + sub #31,d2 + and #$ffe0,d2 + lsl #8,d2 + or d4,d2 ;eor bank + move #$106,(a0)+ ;bank select + move d2,(a0)+ + ; +.notnbank move d0,d2 + and #31,d2 + add d2,d2 + add #$180,d2 + move d2,(a0)+ ;colour poke + move d3,(a0)+ + add #$111,d3 + subq #1,d0 + dbf d1,.lloop + ; + bsr .makewait + ; + ;ok, now do EOR! + move #$10c,(a0)+ + ;move #0,d4 + move d4,(a0)+ + bchg #15,d4 + ; + dbf d7,.hloop + ; + bsr .makewait + ; + move.l #$00840000,(a0)+ + move.l #$00860000,(a0)+ + move.l #$008a0000,(a0)+ + ; + ;OK, 1 list created...copy to other! + ; + move.l wi_cop1(a2),a0 + move.l a0,a1 + add.l wi_copmem(a2),a1 + move.l a1,wi_cop2(a2) + move.l a1,a3 + ; +.copycop move.l (a0)+,(a3)+ + cmp.l a1,a0 + bcs.s .copycop + ; + pull + rts + +.makewait ; + ;make wait ins. + move.l #$01fe0000,(a0)+ ;no wait - nop + cmp #256,d6 + blt.s .not256 + move.l #$00e1fffe,-4(a0) + sub #256,d6 +.not256 move.b d6,(a0)+ + move.b #1,(a0)+ + move #$fffe,(a0)+ ;wait! + add wi_ph(a2),d6 + rts + +allocmem ; + ;d0=size, d1=requirements + ; + push + move.l 4.w,a6 + ; + addq.l #8,d0 + move.l d0,-(a7) + jsr -198(a6) + move.l d0,a0 + move.l memlist,(a0) + move.l (a7)+,4(a0) + move.l a0,memlist + addq.l #8,a0 + move.l a0,d0 + ; + pull + rts + +freememlist push + move.l 4.w,a6 + ; +.more move.l memlist,d0 + beq.s .done + move.l d0,a1 + move.l (a1),memlist + move.l 4(a1),d0 + jsr -210(a6) + bra.s .more + ; +.done pull + rts + +freemem ; + ;a1=address to free! + ; + push + move.l 4.w,a6 + subq.l #8,a1 + move.l #memlist,d0 + ; +.more move.l d0,a0 + move.l (a0),d0 + beq.s .done ;not found! + cmp.l d0,a1 + bne.s .more + ; + move.l (a1),(a0) + move.l 4(a1),d0 + jsr -210(a6) + ; +.done pull + rts + +initmap 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_rgbs + ; + move.l a0,a1 + add.l 16(a0),a1 + move.l a1,map_txts + ; + jsr calcpalettes + jsr loadtxts + ; + lea window1,a0 + bsr initwindow + lea window2,a0 + bsr initwindow + ; + pull + rts + +loadtxts move.l map_txts,a5 ;texture names + lea textures,a6 + moveq #47,d7 +.ltl lea .temp(pc),a0 +.ltl2 move.b (a5)+,(a0)+ + bne.s .ltl2 + cmp.l #.temp+1,a0 + beq.s .notext + lea .temp2(pc),a0 + moveq #1,d1 + jsr loadfile +.notext move.l d0,(a6)+ + dbf d7,.ltl + rts + +.temp2 dc.b 'txts/' +.temp ds.b 64 + +initwindow move #16<>1 + ; +linemod equ 40*7 + + 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_copmod 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 bsr execscript_med +.wmf tst fadevol + bne.s .wmf + tst twowins + beq.s .n22 + bsr swaphflags +.n22 bsr bigfont + bra .intro + ; +exittoos bsr freeobjlist2 + move #$4000,$dff09a + move.l ciaa,a0 + movem.l rawstuff,d0-d1 + movem.l d0-d1,$64(a0) + move #$c000,$dff09a + 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 + ; + move.l player1,a5 + move.l ob_palette(a5),-(a7) + move.l #palettesw,ob_palette(a5) + move.l ob_window(a5),a2 + jsr plotwbmap + ; + tst twowins + beq .p1 + ; + move.l player2,a5 + move.l ob_palette(a5),-(a7) + move.l #palettesw,ob_palette(a5) + move.l ob_window(a5),a2 + jsr plotwbmap +.p1 ; + bsr drawall2 + ; + move.l player1,a5 + lea gamemenu,a4 + move.l ob_window(a5),a6 + jsr initmenu + ; +.loop jsr selmenu + beq .done + ; + subq #1,d0 + bne .notpsize + bsr newpsize + 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 finitmenu + ; + tst twowins + beq.s .p12 + ; + move.l player2,a5 + move.l (a7)+,ob_palette(a5) + move.l ob_window(a5),a2 + jsr plotwbmap + bsr initstats + bsr showstats +.p12 ; + move.l player1,a5 + move.l (a7)+,ob_palette(a5) + move.l ob_window(a5),a2 + jsr plotwbmap + bsr initstats + bsr showstats + ; + 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 + +freewindows lea window1,a0 + jsr freewindow + tst twowins + beq.s .p1 + lea window2,a0 + jsr freewindow +.p1 rts + +largewin move.l player1,a5 + bsr large + tst twowins + beq refresh + move.l player2,a5 + bsr large + bra refresh + +large move.l ob_window(a5),a6 + move wi_pw(a6),d2 + ; + cmp #2,d2 + beq .lhr + ; + ;large lo-res window! + ; +.lores move #324,d0 + move #240,d1 + bra thinkwin + ; +.lhr bsr swappsize + bra.s .lores + ; + move #180,d0 + move #240,d1 + bra thinkwin + +newwsize ;window size stuff! + ; + move.l player1,a5 + bsr swapwsize + tst twowins + beq refresh + move.l player2,a5 + bsr swapwsize + bra refresh + +swapwsize ;increment window size! + ; + move.l ob_window(a5),a6 + movem wi_w(a6),d0-d1 ;w,h + move wi_pw(a6),d2 + mulu d2,d0 + mulu d2,d1 + cmp #2,d2 + beq .hr + ; + ;lo-res! + ; + cmp #318,d0 + bcs.s .inc + move #132,d0 + move d0,d1 + bra thinkwin +.inc add #24,d0 + move d0,d1 + cmp #240,d1 + bls thinkwin + move #240,d1 + bra thinkwin + ; +.hr cmp #180,d0 + bcs.s .inc2 + tst twowins + bne .min + add #18,d1 + cmp #240,d1 + bls thinkwin +.min move #132,d0 + move d0,d1 + bra thinkwin +.inc2 add #24,d0 + move d0,d1 + ; +thinkwin move #180,d3 ;max width! + cmp #2,d2 + beq .gmax + move #318,d3 +.gmax cmp d3,d0 + bls .nm + move d3,d0 +.nm ; + cmp #240,d1 + bls .n240 + move #240,d1 +.n240 tst twowins + beq.s .ggt + move #120,d1 +.ggt ; + move #160,d3 + move d0,d4 + lsr #1,d4 + sub d4,d3 ;wi_x + move d3,wi_x(a6) + ; + ext.l d0 + divu d2,d0 + move d0,wi_w(a6) + ; + tst twowins + bne.s .skip3 + ; + move #cy,d3 + move d1,d4 + lsr #1,d4 + sub d4,d3 + move d3,wi_y(a6) + ; +.skip3 ext.l d1 + divu d2,d1 + move d1,wi_h(a6) + ; + rts + +newpsize ;toggle pixel size between 2 and 3 + ; + ;copy windows to temp so we can free 'em up later + ; + move.l player1,a5 + bsr swappsize + tst twowins + beq refresh + move.l player2,a5 + bsr swappsize + ; +refresh jsr dispoff + jsr finitmenu + ; + bsr freewindows + bsr putwindow + ; + lea window1,a0 + jsr makewindow + lea window1,a0 + jsr showwindow + ; + tst twowins + beq.s .p1 + ; + lea window2,a0 + jsr makewindow + lea window2,a0 + jsr showwindow + ; +.p1 jsr calcbpos + ; + lea gamemenu,a4 + lea window1,a6 + jsr initmenu2 + ; + bsr drawall2 + jsr dispon + rts + +swappsize move.l ob_window(a5),a6 + movem wi_w(a6),d0-d1 ;w,h + move wi_pw(a6),d2 + mulu d2,d0 + mulu d2,d1 + eor #1,d2 ;2,3... + move d2,wi_pw(a6) + move d2,wi_ph(a6) + ; + bra thinkwin + +showflag dc 0 + +showit ;don't show if beam in the way! + ; + move showflag(pc),d0 + beq.s .rts + ; + move.l $dff004,d0 + lsr.l #8,d0 ;beampos + and #$1ff,d0 + ; + cmp minbpos(pc),d0 + bcs.s .show + cmp maxbpos(pc),d0 + bcs.s .rts + ; + ;cmp minbpos(pc),d0 + ;bcc.s .rts + ; +.show clr showflag + lea window1,a0 + jsr showwindowq + lea window2,a0 + jmp showwindowq + ; +.rts rts + +drawall2 bsr drawall + bsr drawall + bra vwait + +drawall ; +.wait move doneflag(pc),d0 + beq.s .wait ;wait for update + clr doneflag +.wait2 move showflag(pc),d0 + bne.s .wait2 + ; + move.l memory(pc),memat + move.l player1(pc),a5 + bsr calcscene + move.l player1(pc),a5 + bsr blitscene + move.l player1(pc),a5 + bsr drawscene + ; + move twowins(pc),d0 + beq.s .show + ; + move.l memory(pc),memat + move.l player2(pc),a5 + bsr calcscene + move.l player2(pc),a5 + bsr blitscene + move.l player2(pc),a5 + bsr drawscene + ; +.show st showflag + 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 ;a6=window, 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 + ; +.loop2 move.b (a4)+,d2 + beq .done + cmp.b #' ',d2 + beq .spc + cmp.b #'\',d2 + beq .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 wi_bmap(a6),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 ; + rts + +initstats ; + ;health... + move.l ob_window(a5),a0 + moveq #2,d0 + add wi_x(a0),d0 + move.l wi_bmap(a0),a1 + move.l font(pc),a0 + moveq #2,d1 + moveq #39,d2 + bsr blit + ; + ;weapon... + move.l ob_window(a5),a0 + moveq #2,d0 + add wi_x(a0),d0 + move.l wi_bmap(a0),a1 + move.l font(pc),a0 + moveq #12,d1 + moveq #44,d2 + bra blit + +putstrip ;a0=window + ; + move.l wi_bmap(a0),a1 + move wi_bh(a0),d0 + lsr #2,d0 + mulu #7*40,d0 + add.l d0,a1 ;dest + move.l wi_strip(a0),a0 ;src + ; + btst #6,$dff002 +.bwait btst #6,$dff002 + bne.s .bwait + ; + move.l #$9f00000,$dff040 + move.l #-1,$dff044 + move #0,$dff064 + move #0,$dff066 + move.l a0,$dff050 + move.l a1,$dff054 + move #(7*7)<<6+20,$dff058 + rts + +loff dc 0 + +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 + ; + ;ok, hitpoints... + ; + elseif + ; + ;lagtime... + move.l ob_window(a5),a0 + moveq #2,d0 + add wi_x(a0),d0 + move.l wi_bmap(a0),a1 + move.l font(pc),a0 + moveq #22,d1 + move lagtime(pc),d2 + bsr blit + ; + elseif + ; + move.l ob_window(a5),a0 + moveq #44,d5 + add wi_x(a0),d5 + moveq #40,d4 + moveq #0,d6 + move ob_hitpoints(a5),d7 + ; +.hploop cmp d7,d6 + bcs.s .hpskip + cmp #25,d7 + bcc.s .hpdone + moveq #41,d4 + moveq #25,d7 + bra.s .hploop + ; +.hpskip move.l font(pc),a0 + move.l ob_window(a5),a1 + move.l wi_bmap(a1),a1 + move d5,d0 + moveq #2,d1 + move d4,d2 + bsr blit + addq #2,d5 + addq #1,d6 + bra.s .hploop +.hpdone ; + ;show lives remaining... + ; + move.l ob_window(a5),a0 + move wi_bw(a0),d5 + add wi_x(a0),d5 + move ob_lives(a5),d7 + beq.s .lvdone + subq #1,d7 +.lvloop ; + move.l font(pc),a0 + move.l ob_window(a5),a1 + move.l wi_bmap(a1),a1 + subq #8,d5 + move d5,d0 + moveq #2,d1 + moveq #43,d2 + bsr blit + dbf d7,.lvloop +.lvdone ; + ;show weapons! + ; + move.l ob_window(a5),a0 + moveq #44,d5 + add wi_x(a0),d5 + moveq #49,d4 + sub ob_weapon(a5),d4 ;0...4 + moveq #1,d7 +.wploop ; + move.l font(pc),a0 + move.l ob_window(a5),a1 + move.l wi_bmap(a1),a1 + move d5,d0 + moveq #12,d1 + moveq #50,d2 + cmp.b ob_reload(a5),d7 + blt.s .nowp + move d4,d2 +.nowp bsr blit + ; + add #10,d5 + addq #1,d7 + cmp #6,d7 + bcs.s .wploop + ; + rts + +blit ;a0=shapetable to blit, a1=bitmap, d0=X, d1=Y, d2=char + ; + add.l 4(a0,d2*4),a0 + ; + mulu #280,d1 + add.l d1,a1 + move d0,d2 + asr #3,d2 + add d2,a1 ;dest! + move.l a0,a2 + add.l (a0),a2 + lea 8(a0),a3 + addq #4,a0 + and #15,d0 + ror #4,d0 + ; + btst #6,$dff002 +.bwait btst #6,$dff002 + bne.s .bwait + ; + move.l a2,$dff050 + move.l a3,$dff04c + move.l a1,$dff048 + move.l a1,$dff054 + ; + move d0,$dff042 + or blitmode(pc),d0 + move d0,$dff040 + move.l #$ffff0000,$dff044 + moveq #-2,d0 + move d0,$dff064 + move d0,$dff062 + moveq #38,d0 + sub (a0)+,d0 + move d0,$dff060 + move d0,$dff066 + move (a0)+,$dff058 + ; + rts + +blitmode dc $fca + +pixsize dc 0 ;pixel size...at least 2! + +pixelate ;pixel out the coplist...d0=pixelsize + ; + move d0,pixsize + move d0,d1 + ; + ;pixel out vertically, then horizontally + ; + move.l cop(pc),a0 + lea coloffs(pc),a1 + moveq #0,d2 ;x + move d1,d6 + lsr #1,d6 +.forx ; + move.l a0,a3 + lea 0(a1,d2*4),a2 + add.l (a2),a3 + ; + move d2,d5 + add d6,d5 + cmp width(pc),d5 + ble.s .xok + move width(pc),d5 +.xok sub d2,d5 + ble .done + subq #1,d5 + ; +.loop2 moveq #0,d3 + move.l a3,a4 + move.l a0,a5 + add.l (a2)+,a5 + move d1,d7 + lsr #1,d7 ;first Y add +.fory ; + move (a4),d0 ;start column! + move d3,d4 + add d7,d4 + cmp hite(pc),d4 + ble.s .yok + move hite(pc),d4 +.yok sub d3,d4 + ble .nextx + subq #1,d4 + ; +.loop move d0,(a5) + add copmod(pc),a4 + add copmod(pc),a5 + ; + dbf d4,.loop + ; +.nexty add d7,d3 + move d1,d7 + bra.s .fory + ; +.nextx dbf d5,.loop2 + ; + add d6,d2 + move d1,d6 + bra.s .forx + ; +.done rts + +makeqstrip ; + ;do a simple roof/floor strip for blitter to wack in... + ; + cmp #$100,con0poke + bne.s .doit + rts + ; +.doit move.l qstrip(pc),a0 + move.l darktable(pc),a1 + move.l palette(pc),a2 + move.l qstripbot(pc),a4 + moveq #0,d2 + ; + move floorflag(pc),d0 + bne.s .fdone + ; + move camy(pc),d0 + neg d0 + ext.l d0 + lsl.l #focshft,d0 + ; + move.b qcols+1(pc),d2 + move.l qstripbot(pc),a4 + move maxy(pc),d1 + ; +.floop subq #1,d1 + beq.s .fdone + ; + move.l d0,d3 + divs d1,d3 + cmp #maxz,d3 + bcc .fdone + ; + move 0(a1,d3*2),d3 ;darkness (0...15) + move.l 0(a2,d3*4),a3 ;pal to use + move 0(a3,d2*2),-(a4) ;colour! + ; + bra.s .floop + ; +.fdone move roofflag(pc),d0 + bne.s .rdone + ; + move #-256,d0 + sub camy(pc),d0 + ext.l d0 + lsl.l #focshft,d0 ;cam Y + ; + move.b qcols(pc),d2 + ; + move miny(pc),d1 ;SY + ; +.rloop beq.s .rdone + ; + move.l d0,d3 + divs d1,d3 + cmp #maxz,d3 + bcc .rdone + ; + move 0(a1,d3*2),d3 ;darkness (0...15) + move.l 0(a2,d3*4),a3 ;pal to use + move 0(a3,d2*2),(a0)+ ;colour! + ; + addq #1,d1 + bra.s .rloop +.rdone ; + moveq #0,d0 +.loop cmp.l a4,a0 + bcc.s .done + move.l d0,(a0)+ + bra.s .loop + ; +.done 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 copmod(pc),d1 + move d1,flatyadd2 + ; + move d7,d0 + add midy(pc),d0 + mulu copmod(pc),d0 + add.l cop(pc),d0 + add.l coloffs(pc),d0 + move.l d0,a2 +.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 + ; + ;move.l d4,d2 + ;asr.l #1,d2 + ;add.l d2,d0 + ; + ;move.l d6,d2 + ;asr.l #1,d2 + ;add.l d2,d1 + ; + swap d0 + add camx(pc),d0 + swap d1 + add camz(pc),d1 + swap d4 + swap d6 + ; + move d7,-(a7) + moveq #127,d7 + moveq #0,d2 + moveq #0,d3 + ; + move.l a2,a3 + ; + move wdiv32(pc),-(a7) + ; +.hloop2 moveq #31,d5 + ; +.hloop tst (a3) ;check destination! + 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 0(a5,d3*2),(a3) + addx d2,d1 + addq #4,a3 + dbf d5,.hloop + bra.s .hhh + ; +.skip add.l d4,d0 + addx d2,d0 + add.l d6,d1 + addx d2,d1 + addq #4,a3 + dbf d5,.hloop + ; +.hhh addq #4,a3 + subq #1,(a7) + bgt.s .hloop2 + bne.s .kl + ; + move wrem32(pc),d5 + bpl.s .hloop + ; +.kl 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 + +currplayer dc.l 0 + +calcscene ;a5=player object + ; + move #$20,$dff09a + ; + move.l a5,currplayer + move.l ob_palette(a5),palette + move ob_thermo(a5),thermo + move ob_infra(a5),infra + move ob_pixsize(a5),pixsize + ; + clr.l shapelist + move.l a5,a0 + bsr calccamera + bsr makewalls + ; + lea objects(pc),a5 + ; +.loop move.l (a5),a5 + tst.l (a5) + beq.s .done + cmp.l currplayer(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 ; + bclr #7,ob_update(a5) + beq.s .noupdate + ; + bclr #7,ob_update+1(a5) + beq.s .stats + ; + move.l ob_window(a5),a2 + moveq #9,d0 + jsr wcopy + bsr initstats + ; +.stats bsr showstats + ; +.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 + ; + move.l ob_window(a5),a0 + bsr dbwindow + ; + bsr castwalls + bsr makeqstrip + bsr renderwalls + ; + 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 move roofflag(pc),d0 + ble.s .noflat + ; + move #-255,d0 + sub camy(pc),d0 + moveq #1,d1 + move miny(pc),d7 + move.l roof(pc),a0 + bsr flat + ; +.noflat bsr drawshapes + bsr drawblood + ; + move.l currplayer(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 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 showit + bsr chatstuff + bsr sfxvbint + ; + btst #0,framecnt+1 + beq exit_vb + tst paused + bne exit_vb + ; + ;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 + bsr showit + ; + 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 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 + bra.s .kill + ; +.notfull bsr message + dc.b 'weapon boost!',0 + even + ; +.kill st ob_update(a5) + 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 + bra.s .kill + +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 .nomega + bsr message + dc.b 'mega weapon out...',0 + even + ; +.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 cop(pc),a1 + ; + lea coloffs,a2 + add.l 0(a2,d0*4),a1 + mulu copmod(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 d0,a5 + ; + cmp wl_lsx(a5),d7 + blt.s .loop2 + cmp wl_rsx(a5),d7 + bgt.s .loop2 + ; + 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<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 + +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 + move.l coplist(pc),a0 + move.l #$0968100,chatdispon-copinit(a0) + ; +.rts rts + +chatoff ;disable chat mode + ; + tst linked + beq.s chatoffrts + tst chatok + beq.s chatoffrts + ; +dochatoff sf chatok + bsr chatcls + move.l coplist(pc),a0 + move.l #$1fe0000,chatdispon-copinit(a0) + ; +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 + +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 + +progfiles dc.l bigfont_+1 ;odd=chipmem! + dc.b 'misc/bigfont.bin',0 + even + dc.l smallfont_+1 ;odd=chipmem! + dc.b 'misc/smallfont.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 + +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 magicpal + dc.b 'pics/blackmagic.pal',0 + even + dc.l 0 + +magic dc.l 0 +magicpal dc.l 0 +vbr dc.l 0 + +initmain ; + move.l 4.w,a6 + move.l 276(a6),a0 + move.l #-1,184(a0) + ; + bsr initrawmap + ; + jsr -150(a6) ;supervisor + dc $4e7a,$2801 ;get vbr->d2 + jsr -156(a6) + move.l d2,vbr + ; + lea ciaaname,a1 + jsr -498(a6) + move.l d0,ciaa + move.l d0,a0 + movem.l $64(a0),d0-d1 + movem.l d0-d1,rawstuff + move #$4000,$dff09a + move.l rawtable(pc),$64(a0) + move.l #rawkeyread,$68(a0) + move #$c000,$dff09a + ; + move.l #8,d0 + move.l #$10002,d1 + allocmem chipzero + move.l d0,chipzero + ; + move.l #256,d0 ;128 words high max! + moveq #2,d1 + allocmem qstrip + move.l d0,qstrip + ; + 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 #16*512*2,d0 ;16 shades, 256 words + moveq #1,d1 + allocmem map_rgbs + ; + move.l #map_rgbs_,map_rgbs + ;move.l d0,map_rgbs + ;add.l #16*512,d0 + move.l d0,map_rgbsw + add.l #16*512,d0 + move.l d0,map_rgbsr + ; + st paused + clr dispnest + clr.l font + bsr initsfx + bsr initvbint + bsr initdisplay + bsr dispoff + ; + lea magicfiles,a0 + bsr loadfiles + ; + move.l magic,a0 + move.l magicpal,a1 + bsr makeiff + bsr showiff + bsr dispon + move #50,vbcounter + ; + lea progfiles,a0 + bsr loadfiles + ; + bsr initbmappal + bsr initmed + bsr initser + bsr calcbaud + bsr makecoloffs + bsr initdarktable + ; + bset #15,remapped + bne .noremap + ; + move.l map_rgbs(pc),a0 + move #-1,(a0)+ + move.l a0,map_rgbsat + ; + 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 + ; + elseif + lea 128*128+groundtile,a2 + move.l a2,a0 + bsr addpal + lea groundtile,a0 + move.l a2,a1 + bsr remap + ; + lea 128*128+ceilingtile,a2 + move.l a2,a0 + bsr addpal + lea ceilingtile,a0 + move.l a2,a1 + bsr remap + elseif + ; + lea qpal,a0 + bsr addpal + lea qcols,a0 + lea qpal,a1 + bsr remap + ; + 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 + lea iffwindow,a0 + bsr freewindow + ; + 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 + lea gloom,a0 + lea gloompal,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 pic,a0 + move.l picpal,a1 + bsr makeiff + bsr showiff + 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 + +picpath dc.b 'pics/' +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 + +scriptpict ;load an iff + bsr freeiff + lea picname,a1 + bsr fetchrest + move.l a1,-(a7) + bsr permit + lea picpath,a0 + moveq #1,d1 + jsr loadfile + move.l d0,pic + lea pic_pal,a0 + move.l (a7)+,a1 +.loop move.b (a0)+,(a1)+ + bne.s .loop + lea picpath,a0 + moveq #1,d1 + jsr loadfile + move.l d0,picpal + bsr forbid + bra execscript + +scriptdark move.l iffwindow+wi_cop,a0 ;copperlist to darken! + ; + ;bank,32,bank,32... + ; + addq #6,a0 + moveq #3,d0 ;4 lots of 32 colours + moveq #31,d1 + ; + ;skip first 8 + ; + ;subq #8,d1 + ;lea 32(a0),a0 +.loop ; + move (a0),d2 ;hi nyb + move 132(a0),d3 ;lo nyb! + and #$eee,d3 + lsr #1,d3 + move d2,d4 + and #$111,d4 + lsl #3,d4 + or d4,d3 + and #$eee,d2 + lsr #1,d2 + move d2,(a0) + move d3,132(a0) + ; + addq #4,a0 + dbf d1,.loop + moveq #31,d1 + lea 136(a0),a0 + dbf d0,.loop + bra execscript + +text ds.b 64 + +scripttext ;print text on iff + ;a6=window, a4=message, d0=length of message, d6=Y + ; + move #2,pdelay + ; + lea text,a1 + bsr fetchrest + ; + lea iffwindow,a6 + lea text,a4 + move wi_bh(a6),d6 + sub #7,d6 + 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 + +getwindow tst twowins + bne.s .p2 + ; + lea defwindow1_1p,a0 + lea window1,a1 + bsr copywin + rts + ; +.p2 lea defwindow1_2p,a0 + lea window1,a1 + bsr copywin + ; + lea defwindow2_2p,a0 + lea window2,a1 + bsr copywin + rts + +putwindow tst twowins + bne.s .p2 + ; + lea window1,a0 + lea defwindow1_1p,a1 + bsr copywin + rts + ; +.p2 lea window1,a0 + lea defwindow1_2p,a1 + bsr copywin + ; + lea window2,a0 + lea defwindow2_2p,a1 + bsr copywin + rts + +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 + bsr makeiff + bsr showiff + bsr dispon + 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 ; + 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 calcpalettes + bsr forbid + bsr makepalettes + bsr dispoff + bsr freewindows + bsr getwindow + ; + ;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 player1(pc),a5 + move.l #window1,ob_window(a5) + move.l ob_window(a5),a0 + bsr makewindow + move.l ob_window(a5),a0 + bsr showwindow + bsr initstats + ; + tst twowins + beq.s .onew + ; + move.l player2(pc),a5 + move.l #window2,ob_window(a5) + move.l ob_window(a5),a0 + bsr makewindow + move.l ob_window(a5),a0 + bsr showwindow + bsr initstats +.onew ; + bsr calcbpos + ; + ;move #$4000,fadevol ;fadeout med! + ; + 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 drawall2 + bsr dispon + bsr chaton + ; +mainloop bsr drawall + move escape(pc),d0 + beq.s .noesc + bsr dogamemenu + clr escape +.noesc move finished(pc),d0 + beq.s mainloop + ; + st paused + bsr chatoff + bsr dispoff + bsr qsync2 + bsr freewindows + 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 ; + lea gloom,a0 + lea gloompal,a1 + jsr makeiff + jsr showiff + ; + lea gloombrush,a0 + lea iffwindow,a1 + move.l wi_bmap(a1),a1 + add.l #168*7*40,a1 + bsr decodeiff + ; + bsr dispon + ; + bsr chaton + ; + bsr waitany + ; + lea startmenu,a4 + tst linked + beq.s .use + lea startmenu2,a4 +.use lea iffwindow,a6 + 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 + lea gloom,a0 + lea gloompal,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 + +makeiff ;show an IFF picture...128 colours...320 X 240 + ; + ;a0=trimmed iff, a1=iff's palette + ; + push + movem.l a0-a1,-(a7) + lea iffwindow,a0 + bsr freewindow + movem.l (a7)+,a0-a1 + ; + lea iffwindow,a2 + cmp.l #0,a0 + bne.s .notblank + addq #1,a0 + move.l a0,wi_iff(a2) + move.l #rgbs16,a1 + bra.s .blank + ; +.notblank move.l a0,wi_iff(a2) +.blank move.l a1,wi_pal(a2) + ; + ;copy font palette to IFF palette! + ; + move.l font(pc),d0 + beq.s .nofont + ; + move.l d0,a0 + add.l (a0),a0 + addq #2,a0 + clr.l (a1)+ + moveq #14,d0 +.loop move (a0),(a1)+ + move (a0)+,(a1)+ + dbf d0,.loop +.nofont ; + move.l a2,a0 + bsr makewindow + ; + pull + rts + +showiff push + lea iffwindow,a0 + bsr showwindow + pull + rts + +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 move.l a0,-(a7) + sub.l a0,a0 + bsr makeiff + bsr showiff + move.l (a7)+,a4 + lea iffwindow,a6 + bsr initmenu + bra dispon + +pmenu move.l a2,-(a7) + bsr makeiff + bsr showiff + move.l (a7)+,a4 + lea iffwindow,a6 + bsr initmenu + bra dispon + +finitpmenu ; +finitqmenu bsr dispoff + bsr finitmenu + lea iffwindow,a0 + bra freewindow + +initmenu clr curropt +initmenu2 ; + ;do a menu...menu in a4, window in a6 + ; + move.l a6,menuwindow + move.b (a4)+,d0 ;how many + ext d0 + move d0,numopts + move d0,-(a7) ;counter + move wi_bh(a6),d6 + move.l wi_bmap(a6),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 #40*7,d0 + mulu fonth(pc),d0 + moveq #2,d1 + allocmem menustrip + move.l d0,(a5)+ + move.l d0,a1 + move.l wi_bmap(a6),a0 + move d6,d0 + mulu #7*40,d0 + add.l d0,a0 + ; + move #40*7,d0 + mulu fonth(pc),d0 + lsr.l #2,d0 + subq #1,d0 + ; +.sloop move.l (a0)+,(a1)+ + dbf d0,.sloop + ; + 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 + ; + rts + +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 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 #7*40,d6 + move.l menubmap(pc),a1 + add.l d6,a1 + ; + move fonth(pc),d0 + mulu #7,d0 + lsl #6,d0 + or #20,d0 + ; + btst #6,$dff002 +.bwait btst #6,$dff002 + bne.s .bwait + ; + move.l #$9f00000,$dff040 + move.l #-1,$dff044 + move #0,$dff064 + move #0,$dff066 + move.l a0,$dff050 + move.l a1,$dff054 + move d0,$dff058 + ; + move #13,flashdelay + ; + rts + +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 + ; + 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 + ; + lea menustrips(pc),a5 + move numopts(pc),d2 + subq #1,d2 +.loop addq #4,a5 + move.l (a5)+,a1 + freemem menustrip + dbf d2,.loop + rts + +initbmappal move.l smallfont_,a0 + add.l (a0),a0 + addq #2,a0 + moveq #22,d0 ;23 colours to poke! + move.l coplist(pc),a1 + move.l a1,a2 + move.l a1,a3 + move.l a1,a4 + ; + lea cols1+6-copinit(a1),a1 + lea cols2+6-copinit(a2),a2 + lea cols3+6-copinit(a3),a3 + lea cols4+6-copinit(a4),a4 + ; +.loop move (a0),(a1) + move (a0),(a2) + move (a0),(a3) + move (a0)+,(a4) + addq #4,a1 + addq #4,a2 + addq #4,a3 + addq #4,a4 + dbf d0,.loop + rts + +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 + +andtable dc $ffff,0 ;rgb and, brightness add...wht + dc $ff00,8 ;red + +makepalettes ; + ;make wht and red pals + ; + ;create pointers... + ; + lea palettes(pc),a0 + move.l map_rgbs(pc),d0 + lea palettesw(pc),a1 + move.l map_rgbsw(pc),d1 + lea palettesr(pc),a2 + move.l map_rgbsr(pc),d2 + ; + moveq #15,d7 + ; +.loop move.l (a0)+,d3 + sub.l d0,d3 ;offset! + move.l d3,d4 + add.l d1,d3 + move.l d3,(a1)+ + add.l d2,d4 + move.l d4,(a2)+ + ; + dbf d7,.loop + ; + move.l map_rgbsend(pc),d7 + sub.l map_rgbs(pc),d7 ;how many bytes! + lsr #1,d7 + subq #1,d7 ;words! + ; + move.l map_rgbsw(pc),a1 + move #$ffff,d1 ;col and + move #0,d2 ;gamma + bsr makeapal + ; + move.l map_rgbsr(pc),a1 + move #$ff00,d1 + moveq #16,d2 + bsr makeapal + ; + rts + +makeapal move.l map_rgbs(pc),a0 + ; +.loop move (a0)+,d4 ;src colour...find briteness + ; + move d4,d5 + move d4,d6 + and #$f00,d4 + lsr #8,d4 + and #$0f0,d5 + lsr #4,d5 + and #$00f,d6 + add d6,d5 + add d5,d4 + add d2,d4 + cmp #16*3,d4 + bcs.s .bok + moveq #16*3-1,d4 +.bok ext.l d4 + divu #3,d4 ;(r+g+b)/3=briteness! + ; + move d4,d5 + move d4,d6 + lsl #8,d4 + lsl #4,d5 + or d6,d5 + or d5,d4 ;RGB + and d1,d4 + ; + move d4,(a1)+ + ; + cmp.l map_rgbsend(pc),a0 + bcs.s .loop + ; + rts + +calcpalettes ;OK, our palette currently runs from: + ; + ;map_rgbs + ; to + ;map_rgbsat + ; + ;append brightness versions... + ; + lea palettes(pc),a2 + move.l map_rgbs(pc),(a2)+ ;first brightness! + move.l map_rgbsat(pc),a1 ;first brightness! + move.l a1,a3 + moveq #1,d0 ;rgb subtract + ; +.loop move.l map_rgbs(pc),a0 + move.l a1,(a2)+ + ; +.loop2 move (a0)+,d1 + move d1,d2 + move d1,d3 + ; + and #$f00,d1 + lsr #8,d1 + sub d0,d1 + bpl.s .rok + moveq #0,d1 +.rok ; + and #$f0,d2 + lsr #4,d2 + sub d0,d2 + bpl.s .gok + moveq #0,d2 +.gok ; + and #$0f,d3 + sub d0,d3 + bpl.s .bok + moveq #0,d3 +.bok ; + lsl #8,d1 + lsl #4,d2 + or d3,d2 + or d2,d1 + or #$8000,d1 + ; + move d1,(a1)+ + cmp.l a3,a0 + bcs.s .loop2 + ; + addq #1,d0 + cmp #16,d0 + bcs.s .loop + ; + move.l a1,map_rgbsend + ; + rts + +map_rgbsend dc.l 0 + +dispoff tst dispnest + bne.s .skip + bsr vwait + move #$01a0,$dff096 ;bp/cop/spr off! +.skip addq #1,dispnest + rts + +dispon subq #1,dispnest + bgt.s .skip + bsr vwait + move.l coplist(pc),$dff080 + move #0,$dff088 + move #$8080,$dff096 ;cop on! + move #0,$dff088 +.skip rts + +forbid 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 + +permit push + move.l 4.w,a6 + jsr -138(a6) + bsr disownblitter + pull + 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 + +ownblitter push + move.l grbase,a6 + jsr -456(a6) + btst #6,$dff002 +.bwait btst #6,$dff002 + bne.s .bwait + pull + rts + +disownblitter push + btst #6,$dff002 +.bwait btst #6,$dff002 + bne.s .bwait + move.l grbase,a6 + jsr -462(a6) + pull + rts + +makecoloffs push + ; + lea coloffs,a0 + moveq #2,d0 + moveq #3,d2 +.loop addq.l #4,d0 + moveq #31,d1 +.loop2 move.l d0,(a0)+ + addq.l #4,d0 + dbf d1,.loop2 + dbf d2,.loop + ; + pull + 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 + +calcbpos ;also: calc qstripbot, con0poke... + ; + move window1+wi_h,d0 + add d0,d0 + ext.l d0 + add.l qstrip(pc),d0 + move.l d0,qstripbot + ; + move #$100,con0poke + move floorflag(pc),d0 + and roofflag(pc),d0 + bne.s .cp + move #$9f0,con0poke ;one of them is cop strip! +.cp ; + move window1+wi_y,d0 + subq #4,d0 + move d0,minbpos + tst twowins + beq.s .p1 + ; + move window2+wi_y,d0 + add window2+wi_bh,d0 + addq #4,d0 + move d0,maxbpos + rts + ; +.p1 move window1+wi_y,d0 + add window1+wi_bh,d0 + addq #4,d0 + move d0,maxbpos + ; + rts + +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 + ; + 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 + +chatmap dc.l 0 + +initdisplay push + ; + lea grname,a1 + move.l 4.w,a6 + jsr -408(a6) + move.l d0,grbase + ; + move.l d0,a6 + move.l 34(a6),oldview + sub.l a1,a1 + jsr -222(a6) ;loadview + ; + move.l #80*2*5,d0 + moveq #2,d1 + allocmem chatplanes + move.l d0,chatmap + ; + move d0,chatplanes+6 + swap d0 + move d0,chatplanes+2 + swap d0 + add.l #80,d0 + move d0,chatplanes+14 + swap d0 + move d0,chatplanes+10 + ; + move.l #copinitf-copinit,d0 + moveq #2,d1 + allocmem copinit + move.l d0,coplist + ; + move.l d0,a1 + lea copinit,a0 + lea copinitf,a2 + ; +.loop cmp.l a2,a0 + bcc.s .done + move.l (a0)+,(a1)+ + bra.s .loop +.done ; + add.l #sl1-copinit,d0 + move.l d0,slice1 + add.l #sl2-sl1,d0 + move.l d0,slice2 + add.l #cstop-sl2,d0 + move.l d0,copstop + ; + move.l copstop,d0 + move.l slice1,a0 + move.l slice2,a1 + ; + move d0,72+6(a0) + move d0,72+6(a1) + swap d0 + move d0,72+2(a0) + move d0,72+2(a1) + ; + bsr dochatoff + ; + jsr -270(a6) + move #$81a0,$dff096 + ; + ;jsr -270(a6) + ;move.l coplist,$dff080 + ;move #0,$dff088 + ; + pull + rts + +allocwbmap move wi_w(a2),d0 + mulu wi_pw(a2),d0 + move d0,wi_bw(a2) + ; + move wi_h(a2),d0 + mulu wi_ph(a2),d0 + move d0,wi_bh(a2) + ; + mulu #40*7,d0 + ; + move.l #$10002,d1 + move.l d0,wi_bmapmem(a2) + allocmem wi_bmap + move.l d0,wi_bmap(a2) + ; + move.l #40*7*7,d0 + moveq #2,d1 + allocmem wi_strip + move.l d0,wi_strip(a2) + ; + rts + +windowiff ;draw iff into window! + ; + move.l wi_iff(a2),a0 + cmp.l #1,a0 + bne.s .do + rts + ; +.do move.l wi_bmap(a2),a1 + ; + move 2(a0),d1 + cmp #240,d1 + bcs.s .skip + move #240,d1 +.skip move #120,d2 + lsr #1,d1 + sub d1,d2 + mulu #7*40,d2 + add.l d2,a1 + ; +decodeiff ;for 40 columns... + ; + ;a0=trimmed IFF file, + ;a1=destination bitmap... + ; + move.l a2,-(a7) + moveq #40,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 + ; +.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 d7,a1 + dbf d5,.loop4 + dbf d1,.loop5 + ; + move.l (a7)+,a2 + rts + +plotwbmap ;OK, plot colours on bitmap! + ; + move.l wi_iff(a2),d0 + bne windowiff + ; + move.l wi_bmap(a2),a0 + move wi_x(a2),d0 + move d0,d1 + lsr #3,d0 + not d1 + and #7,d1 + moveq #127,d7 ;colour + move wi_w(a2),d6 ;width + subq #1,d6 + ; +.wloop move wi_pw(a2),d5 + subq #1,d5 + ; +.wloop2 move d7,d4 + moveq #6,d3 + ; +.dloop bclr d1,0(a0,d0) + lsr #1,d4 + bcc.s .dskip + bset d1,0(a0,d0) +.dskip lea 40(a0),a0 + dbf d3,.dloop + ; + lea -40*7(a0),a0 + subq #1,d1 + bpl.s .dskip2 + moveq #7,d1 + addq #1,d0 +.dskip2 dbf d5,.wloop2 + ; + subq #1,d7 + dbf d6,.wloop + ; + move wi_bh(a2),d0 ;how many to copy + subq #1,d0 + bsr wcopy + ; + move.l wi_bmap(a2),a0 + move.l wi_strip(a2),a1 + move wi_bh(a2),d0 + lsr #2,d0 + mulu #7*40,d0 + add.l d0,a0 + move #7*7*10-1,d2 + ; +.loop move.l (a0)+,(a1)+ + dbf d2,.loop + ; + rts + +wcopy ;copy top scanline to next d0 scanlines + ; + move.l wi_bmap(a2),a0 + mulu #10*7,d0 + subq #1,d0 + lea 40*7(a0),a1 +.cbloop move.l (a0)+,(a1)+ + dbf d0,.cbloop + ; + rts + +freewindow ;window in a0 + ; + push + move.l a0,a2 + move.l wi_bmap(a2),d0 + beq.s .no1 + clr.l wi_bmap(a2) + move.l d0,a1 + freemem wi_bmap +.no1 move.l wi_strip(a2),d0 + beq.s .no2 + clr.l wi_strip(a2) + move.l d0,a1 + freemem wi_strip +.no2 move.l wi_cop1(a2),d0 + beq.s .no3 + clr.l wi_cop1(a2) + move.l d0,a1 + freemem wi_cop +.no3 pull + rts + +makewindow ;make window + ; + ;a0=window struct! + ; + push + ; + move.l a0,a2 + ; + bsr allocwbmap + bsr plotwbmap + ; + tst.l wi_iff(a2) + beq wchunky + ; + ;make a palette coplist for the window + ; + ;to write 32 colours... + ;set bank, write hi nybs, set bank, write lo nybs... + ;=66 copins. + ;*4=264 total + ;+1 for final wait +3 for final copjump=268 + ; + move.l #268<<2,d0 + move.l d0,wi_copmem(a2) + moveq #2,d1 + allocmem wi_iffcop + move.l d0,wi_cop(a2) + move.l d0,wi_cop1(a2) + move.l d0,wi_cop2(a2) + move.l d0,a0 ;dest + move.l wi_pal(a2),a1 ;palette! + ; + moveq #0,d0 ;bank + moveq #3,d3 ;something. + ; +.loop move #$106,(a0)+ + move d0,(a0)+ + move #$180,d1 + moveq #31,d2 +.hiloop move d1,(a0)+ + move (a1),(a0)+ + addq #4,a1 + addq #2,d1 + dbf d2,.hiloop + ; + lea -128+2(a1),a1 + move #$106,(a0)+ + bset #9,d0 + move d0,(a0)+ + bclr #9,d0 + move #$180,d1 + moveq #31,d2 +.loloop move d1,(a0)+ + move (a1),(a0)+ + addq #4,a1 + addq #2,d1 + dbf d2,.loloop + subq #2,a1 + ; + add #$2000,d0 ;next bank! + dbf d3,.loop + ; + move.l #$fffffffe,(a0)+ + move.l #$00840000,(a0)+ + move.l #$00860000,(a0)+ + move.l #$008a0000,(a0)+ + pull + rts + ; +wchunky ;how many copins on one line? + ; + move wi_w(a2),d0 + move d0,d1 + subq #1,d0 + lsr #5,d0 ;how many bank changes per line! + addq #3,d0 ;1 waits - 1 eor, 1 init bank select + add d1,d0 ;+colpokes + ; + move d0,d1 + lsl #2,d1 + move d1,wi_copmod(a2) + ; + mulu wi_h(a2),d0 + addq #4,d0 ;1 wait and cop jump at end + ; + lsl.l #2,d0 ;4 bytes/copins + moveq #2,d1 ;cop in chip + move.l d0,wi_copmem(a2) + lsl.l #1,d0 ;2 coplists! + allocmem wi_chunkycop + move.l d0,wi_cop(a2) + move.l d0,wi_cop1(a2) + ; + move.l d0,a0 + move wi_y(a2),d6 + move wi_h(a2),d7 + subq #1,d7 + move #$111,d3 ;test colour + move #$8000,d4 ;Colour Eor + ; +.hloop ;make one copline... + ; + moveq #127,d0 ;colour reg to poke + move wi_w(a2),d1 + subq #1,d1 + ; +.lloop move d0,d2 + addq #1,d2 + and #31,d2 + bne.s .notnbank + ; + ;new bank.... + move d0,d2 + sub #31,d2 + and #$ffe0,d2 + lsl #8,d2 + or d4,d2 ;eor bank + move #$106,(a0)+ ;bank select + move d2,(a0)+ + ; +.notnbank move d0,d2 + and #31,d2 + add d2,d2 + add #$180,d2 + move d2,(a0)+ ;colour poke + move d3,(a0)+ + add #$111,d3 + subq #1,d0 + dbf d1,.lloop + ; + bsr .makewait + ; + ;ok, now do EOR! + move #$10c,(a0)+ + move d4,(a0)+ + bchg #15,d4 + ; + dbf d7,.hloop + ; + bsr .makewait + ; + move.l #$00840000,(a0)+ + move.l #$00860000,(a0)+ + move.l #$008a0000,(a0)+ + ; + ;OK, 1 list created...copy to other! + ; + move.l wi_cop1(a2),a0 + move.l a0,a1 + add.l wi_copmem(a2),a1 + move.l a1,wi_cop2(a2) + move.l a1,a3 + ; +.copycop move.l (a0)+,(a3)+ + cmp.l a1,a0 + bcs.s .copycop + ; + pull + rts + +.makewait ; + ;make wait ins. at pos d6 + ; + subq #1,d6 + move.b d6,(a0)+ + move.b #$e1,(a0)+ + move #$fffe,(a0)+ + addq #1,d6 + add wi_ph(a2),d6 + 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 + +gloombrush incbin gloombrush + +gloom incbin title +gloompal incbin title.pal + +medplayer incbin medplay +decrm incbin decrm + +castrotsinc incbin castrots64.bin +camrotsinc incbin camrots.bin ;256 +camrots2inc incbin camrots2.bin ;1024 +chatfont incbin chatfont.bin + +rgbs16 ds.l 16 +map_rgbs_ ds.w 256*16 + diff --git a/gloom.s.help b/gloom.s.help new file mode 100644 index 0000000..80603dc --- /dev/null +++ b/gloom.s.help @@ -0,0 +1,11792 @@ + + ;adding chat-line... + ; + ;OK, modem stuff... + ; + ;Once 2 machines are linked, player 1 gets to choose options! + ;player 2 is ignored... + ; + ;player 1 if linked=1, 2 if linked=-1 + + ;********* + ;* GLOOM * + ;********* + ; + ;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! + +cy equ 160 + +pl_eyey equ 110 +pl_firey equ 60 +pl_gutsy equ 64 + +debugser equ 0 +debugmem equ 0 +onedemo equ 0 + ; +ireload equ 8 ;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 6 +grdshft equ 8 +darkshft equ 7 ;smaller=smaller range=faster! +maxz equ 16<>1 + ; +linemod equ 40*7 + + 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_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_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 +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 ;nomralized 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_copmod 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 + +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 + +entrypoint +cli ; + move.l a0,a2 + ; + 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 + ; + clr.l map_test + cmp.b #'@',(a2)+ + bne.s main + lea tempfile,a0 + move.l a0,map_test +.loop move.b (a2)+,(a0) + beq.s main + cmp.b #10,(a0)+ + bne.s .loop + clr.b -(a0) +main ; + 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 bsr execscript_med +.wmf tst fadevol + bne.s .wmf + tst twowins + beq.s .n22 + bsr swaphflags +.n22 bsr bigfont + bra .intro + ; +exittoos bsr freeobjlist2 + move #$4000,$dff09a + move.l ciaa(pc),a0 + movem.l rawstuff(pc),d0-d1 + movem.l d0-d1,$64(a0) + move #$c000,$dff09a + jsr permit + jsr finitser + jsr finitsfx + jsr finitvbint + jsr finitdisplay + jsr freememlist + bsr undir + 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 + 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 #$4000,$dff09a + ; + st paused + move framecnt(pc),-(a7) + move linked(pc),-(a7) + clr linked + ; + move #$c000,$dff09a + ; + move.l player1,a5 + move.l ob_palette(a5),-(a7) + move.l #palettesw,ob_palette(a5) + move.l ob_window(a5),a2 + bsr plotwbmap + ; + tst twowins + beq .p1 + ; + move.l player2,a5 + move.l ob_palette(a5),-(a7) + move.l #palettesw,ob_palette(a5) + move.l ob_window(a5),a2 + bsr plotwbmap +.p1 ; + bsr drawall2 + ; + move.l player1,a5 + lea gamemenu,a4 + move.l ob_window(a5),a6 + jsr initmenu + ; +.loop bsr selmenu + beq .done + ; + subq #1,d0 + bne .notpsize + bsr newpsize + 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 bsr finitmenu + ; + tst twowins + beq.s .p12 + ; + move.l player2,a5 + move.l (a7)+,ob_palette(a5) + move.l ob_window(a5),a2 + bsr plotwbmap + bsr initstats + bsr showstats +.p12 ; + move.l player1,a5 + move.l (a7)+,ob_palette(a5) + move.l ob_window(a5),a2 + bsr plotwbmap + bsr initstats + bsr showstats + ; + move #$4000,$dff09a + ; + move (a7)+,linked + move (a7)+,framecnt + clr paused + ; + move #$c000,$dff09a + ; + rts + +freewindows lea window1,a0 + bsr freewindow + tst twowins + beq.s .p1 + lea window2,a0 + bsr freewindow +.p1 rts + +largewin move.l player1,a5 + bsr large + tst twowins + beq refresh + move.l player2,a5 + bsr large + bra refresh + +large move.l ob_window(a5),a6 + move wi_pw(a6),d2 + ; + cmp #2,d2 + beq .lhr + ; + ;large lo-res window! + ; +.lores move #324,d0 + move #240,d1 + bra thinkwin + ; +.lhr bsr swappsize + bra.s .lores + ; + move #180,d0 + move #240,d1 + bra thinkwin + +newwsize ;window size stuff! + ; + move.l player1,a5 + bsr swapwsize + tst twowins + beq refresh + move.l player2,a5 + bsr swapwsize + bra refresh + +swapwsize ;increment window size! + ; + move.l ob_window(a5),a6 + movem wi_w(a6),d0-d1 ;w,h + move wi_pw(a6),d2 + mulu d2,d0 + mulu d2,d1 + cmp #2,d2 + beq .hr + ; + ;lo-res! + ; + cmp #318,d0 + bcs.s .inc + move #132,d0 + move d0,d1 + bra thinkwin +.inc add #24,d0 + move d0,d1 + cmp #240,d1 + bls thinkwin + move #240,d1 + bra thinkwin + ; +.hr cmp #180,d0 + bcs.s .inc2 + tst twowins + bne .min + add #18,d1 + cmp #240,d1 + bls thinkwin +.min move #132,d0 + move d0,d1 + bra thinkwin +.inc2 add #24,d0 + move d0,d1 + ; +thinkwin move #180,d3 ;max width! + cmp #2,d2 + beq .gmax + move #318,d3 +.gmax cmp d3,d0 + bls .nm + move d3,d0 +.nm ; + cmp #240,d1 + bls .n240 + move #240,d1 +.n240 tst twowins + beq.s .ggt + move #120,d1 +.ggt ; + move #160,d3 + move d0,d4 + lsr #1,d4 + sub d4,d3 ;wi_x + move d3,wi_x(a6) + ; + ext.l d0 + divu d2,d0 + move d0,wi_w(a6) + ; + tst twowins + bne.s .skip3 + ; + move #cy,d3 + move d1,d4 + lsr #1,d4 + sub d4,d3 + move d3,wi_y(a6) + ; +.skip3 ext.l d1 + divu d2,d1 + move d1,wi_h(a6) + ; + rts + +newpsize ;toggle pixel size between 2 and 3 + ; + ;copy windows to temp so we can free 'em up later + ; + move.l player1,a5 + bsr swappsize + tst twowins + beq refresh + move.l player2,a5 + bsr swappsize + ; +refresh bsr dispoff + bsr finitmenu + ; + bsr freewindows + bsr putwindow + ; + lea window1,a0 + bsr makewindow + lea window1,a0 + bsr showwindow + ; + tst twowins + beq.s .p1 + ; + lea window2,a0 + bsr makewindow + lea window2,a0 + bsr showwindow + ; +.p1 bsr calcbpos + ; + lea gamemenu,a4 + lea window1,a6 + jsr initmenu2 + ; + bsr drawall2 + bsr dispon + rts + +swappsize move.l ob_window(a5),a6 + movem wi_w(a6),d0-d1 ;w,h + move wi_pw(a6),d2 + mulu d2,d0 + mulu d2,d1 + eor #1,d2 ;2,3... + move d2,wi_pw(a6) + move d2,wi_ph(a6) + ; + bra thinkwin + +drawall2 bsr drawall + st showflag +.wait tst showflag + bne.s .wait + ; + bsr drawall + st showflag +.wait2 tst showflag + bne.s .wait2 + ; + bra vwait + +drawall move doneflag(pc),d0 + beq.s drawall ;wait for updated! + clr doneflag + ; + move.l memory(pc),memat + move.l player1(pc),a5 + bsr calcscene + move.l player1(pc),a5 + bsr blitscene + move.l player1(pc),a5 + bsr drawscene + ; + move twowins(pc),d0 + beq.s .rts + ; + move.l memory(pc),memat + move.l player2(pc),a5 + bsr calcscene + move.l player2(pc),a5 + bsr blitscene + move.l player2(pc),a5 + bsr drawscene + ; +.rts rts + +resetplayer st ob_update(a5) + clr ob_thermo(a5) + clr ob_infra(a5) + clr ob_invisible(a5) + clr ob_messtimer(a5) + clr ob_pixsize(a5) + clr ob_pixsizeadd(a5) + clr ob_bouncecnt(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 ;a6=window, 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 + ; +.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 .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 wi_bmap(a6),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 ; + rts + +initstats ; + ;health... + move.l ob_window(a5),a0 + moveq #2,d0 + add wi_x(a0),d0 + move.l wi_bmap(a0),a1 + move.l font(pc),a0 + moveq #2,d1 + moveq #39,d2 + bsr blit + ; + ;weapon... + move.l ob_window(a5),a0 + moveq #2,d0 + add wi_x(a0),d0 + move.l wi_bmap(a0),a1 + move.l font(pc),a0 + moveq #12,d1 + moveq #44,d2 + bra blit + +putstrip ;a0=window + ; + move.l wi_bmap(a0),a1 + move wi_bh(a0),d0 + lsr #2,d0 + mulu #7*40,d0 + add.l d0,a1 ;dest + move.l wi_strip(a0),a0 ;src + ; + btst #6,$dff002 +.bwait btst #6,$dff002 + bne.s .bwait + ; + move.l #$9f00000,$dff040 + move.l #-1,$dff044 + move #0,$dff064 + move #0,$dff066 + move.l a0,$dff050 + move.l a1,$dff054 + move #(7*7)<<6+20,$dff058 + rts + +loff dc 0 + +showstats ;a5=player + ; + ;ok, hitpoints... + ; + ;lagtime... + move.l ob_window(a5),a0 + moveq #2,d0 + add wi_x(a0),d0 + move.l wi_bmap(a0),a1 + move.l font(pc),a0 + moveq #22,d1 + move lagtime(pc),d2 + bsr blit + ; + move.l ob_window(a5),a0 + moveq #44,d5 + add wi_x(a0),d5 + moveq #40,d4 + moveq #0,d6 + move ob_hitpoints(a5),d7 + ; +.hploop cmp d7,d6 + bcs.s .hpskip + cmp #25,d7 + bcc.s .hpdone + moveq #41,d4 + moveq #25,d7 + bra.s .hploop + ; +.hpskip move.l font(pc),a0 + move.l ob_window(a5),a1 + move.l wi_bmap(a1),a1 + move d5,d0 + moveq #2,d1 + move d4,d2 + bsr blit + addq #2,d5 + addq #1,d6 + bra.s .hploop +.hpdone ; + ;show lives remaining... + ; + move.l ob_window(a5),a0 + move wi_bw(a0),d5 + add wi_x(a0),d5 + move ob_lives(a5),d7 + beq.s .lvdone + subq #1,d7 +.lvloop ; + move.l font(pc),a0 + move.l ob_window(a5),a1 + move.l wi_bmap(a1),a1 + subq #8,d5 + move d5,d0 + moveq #2,d1 + moveq #43,d2 + bsr blit + dbf d7,.lvloop +.lvdone ; + ;show weapons! + ; + move.l ob_window(a5),a0 + moveq #44,d5 + add wi_x(a0),d5 + move ob_weapon(a5),d6 + moveq #45,d4 + moveq #4,d7 + ; +.wploop btst d7,d6 + beq.s .nowp + ; + move.l font(pc),a0 + move.l ob_window(a5),a1 + move.l wi_bmap(a1),a1 + move d5,d0 + moveq #12,d1 + move d4,d2 + bsr blit + ; +.nowp addq #1,d4 + add #10,d5 + dbf d7,.wploop + ; + rts + +blit ;a0=shapetable to blit, a1=bitmap, d0=X, d1=Y, d2=char + ; + add.l 4(a0,d2*4),a0 + ; + mulu #280,d1 + add.l d1,a1 + move d0,d2 + asr #3,d2 + add d2,a1 ;dest! + move.l a0,a2 + add.l (a0),a2 + lea 8(a0),a3 + addq #4,a0 + and #15,d0 + ror #4,d0 + ; + btst #6,$dff002 +.bwait btst #6,$dff002 + bne.s .bwait + ; + move.l a2,$dff050 + move.l a3,$dff04c + move.l a1,$dff048 + move.l a1,$dff054 + ; + move d0,$dff042 + or blitmode(pc),d0 + move d0,$dff040 + move.l #$ffff0000,$dff044 + moveq #-2,d0 + move d0,$dff064 + move d0,$dff062 + moveq #38,d0 + sub (a0)+,d0 + move d0,$dff060 + move d0,$dff066 + move (a0)+,$dff058 + ; + rts + +blitmode dc $fca + +pixsize dc 0 ;pixel size...at least 2! + +pixelate ;pixel out the coplist...d0=pixelsize + ; + move d0,pixsize + move d0,d1 + ; + ;pixel out vertically, then horizontally + ; + move.l cop(pc),a0 + lea coloffs(pc),a1 + moveq #0,d2 ;x + move d1,d6 + lsr #1,d6 +.forx ; + move.l a0,a3 + lea 0(a1,d2*4),a2 + add.l (a2),a3 + ; + move d2,d5 + add d6,d5 + cmp width(pc),d5 + ble.s .xok + move width(pc),d5 +.xok sub d2,d5 + ble .done + subq #1,d5 + ; +.loop2 moveq #0,d3 + move.l a3,a4 + move.l a0,a5 + add.l (a2)+,a5 + move d1,d7 + lsr #1,d7 ;first Y add +.fory ; + move (a4),d0 ;start column! + move d3,d4 + add d7,d4 + cmp hite(pc),d4 + ble.s .yok + move hite(pc),d4 +.yok sub d3,d4 + ble .nextx + subq #1,d4 + ; +.loop move d0,(a5) + add copmod(pc),a4 + add copmod(pc),a5 + ; + dbf d4,.loop + ; +.nexty add d7,d3 + move d1,d7 + bra.s .fory + ; +.nextx dbf d5,.loop2 + ; + add d6,d2 + move d1,d6 + bra.s .forx + ; +.done rts + +makeqstrip ; + ;do a simple roof/floor strip for blitter to wack in... + ; + cmp #$100,con0poke + bne.s .doit + rts + ; +.doit move.l qstrip(pc),a0 + move.l darktable(pc),a1 + move.l palette(pc),a2 + move.l qstripbot(pc),a4 + moveq #0,d2 + ; + move floorflag(pc),d0 + bne.s .fdone + ; + move camy(pc),d0 + neg d0 + ext.l d0 + lsl.l #focshft,d0 + ; + move.b qcols+1(pc),d2 + move.l qstripbot(pc),a4 + move maxy(pc),d1 + ; +.floop subq #1,d1 + beq.s .fdone + ; + move.l d0,d3 + divs d1,d3 + cmp #maxz,d3 + bcc .fdone + ; + move 0(a1,d3*2),d3 ;darkness (0...15) + move.l 0(a2,d3*4),a3 ;pal to use + move 0(a3,d2*2),-(a4) ;colour! + ; + bra.s .floop + ; +.fdone move roofflag(pc),d0 + bne.s .rdone + ; + move #-256,d0 + sub camy(pc),d0 + ext.l d0 + lsl.l #focshft,d0 ;cam Y + ; + move.b qcols(pc),d2 + ; + move miny(pc),d1 ;SY + ; +.rloop beq.s .rdone + ; + move.l d0,d3 + divs d1,d3 + cmp #maxz,d3 + bcc .rdone + ; + move 0(a1,d3*2),d3 ;darkness (0...15) + move.l 0(a2,d3*4),a3 ;pal to use + move 0(a3,d2*2),(a0)+ ;colour! + ; + addq #1,d1 + bra.s .rloop +.rdone ; + moveq #0,d0 +.loop cmp.l a4,a0 + bcc.s .done + move.l d0,(a0)+ + bra.s .loop + ; +.done 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 copmod(pc),d1 + move d1,flatyadd2 + ; + move d7,d0 + add midy(pc),d0 + mulu copmod(pc),d0 + add.l cop(pc),d0 + add.l coloffs(pc),d0 + move.l d0,a2 +.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 + ; + ;move.l d4,d2 + ;asr.l #1,d2 + ;add.l d2,d0 + ; + ;move.l d6,d2 + ;asr.l #1,d2 + ;add.l d2,d1 + ; + swap d0 + add camx(pc),d0 + swap d1 + add camz(pc),d1 + swap d4 + swap d6 + ; + move d7,-(a7) + moveq #127,d7 + moveq #0,d2 + moveq #0,d3 + ; + move.l a2,a3 + ; + move wdiv32(pc),-(a7) + ; +.hloop2 moveq #31,d5 + ; +.hloop tst (a3) ;check destination! + 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 0(a5,d3*2),(a3) + addx d2,d1 + addq #4,a3 + dbf d5,.hloop + bra.s .hhh + ; +.skip add.l d4,d0 + addx d2,d0 + add.l d6,d1 + addx d2,d1 + addq #4,a3 + dbf d5,.hloop + ; +.hhh addq #4,a3 + subq #1,(a7) + bgt.s .hloop2 + bne.s .kl + ; + move wrem32(pc),d5 + bpl.s .hloop + ; +.kl 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 + +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.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) + ; + tst finished2 + bne exec_loop + ; + 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 + bsr loadfile + move.l d0,(a2) + beq.s .skip + move.l d0,a0 + bsr 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 + bsr loadfile + clr.b (a3) + move.l d0,4(a2) + beq.s .rts + move.l d0,a0 + bsr 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 + +savernd lea rndtable(pc),a0 + lea rndback(pc),a1 + moveq #(rndtablef-rndtable)/2-1,d0 +.loop move (a0)+,(a1)+ + dbf d0,.loop + rts + +loadrnd lea rndback(pc),a0 + lea rndtable(pc),a1 + moveq #(rndtablef-rndtable)/2-1,d0 +.loop move (a0)+,(a1)+ + dbf d0,.loop + rts + +rndtable ds.w 55 +k_index dc.l 0 +j_index dc.l 0 +rndtablef + +rndback ds.b rndtablef-rndtable + +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 + +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 + +currplayer dc.l 0 + +calcscene ;a5=player object + ; + move #$20,$dff09a + ; + move.l a5,currplayer + move.l ob_palette(a5),palette + move ob_thermo(a5),thermo + move ob_infra(a5),infra + move ob_pixsize(a5),pixsize + ; + clr.l shapelist + move.l a5,a0 + bsr calccamera + bsr makewalls + ; + lea objects(pc),a5 + ; +.loop move.l (a5),a5 + tst.l (a5) + beq.s .done + cmp.l currplayer(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 bclr #7,ob_update(a5) + beq.s .noupdate + ; + bclr #7,ob_update+1(a5) + beq.s .stats + ; + move.l ob_window(a5),a2 + moveq #9,d0 + bsr wcopy + bsr initstats + ; +.stats bsr showstats + ; +.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 + ; +.wait move showflag(pc),d0 + bne.s .wait + ; + move.l ob_window(a5),a0 + bsr dbwindow + ; + bsr castwalls + bsr makeqstrip + bsr renderwalls + ; + 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 move roofflag(pc),d0 + ble.s .noflat + ; + move #-255,d0 + sub camy(pc),d0 + moveq #1,d1 + move miny(pc),d7 + move.l roof(pc),a0 + bsr flat + ; +.noflat bsr drawshapes + bsr drawblood + ; + move.l currplayer(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 chatprint + move (a7)+,d0 + sub.b #32,d0 ;encode for chat + bset #6,d0 + bsr serput + ; +.noout move chatinget(pc),d0 + cmp chatinput(pc),d0 + beq.s .rts + and #31,d0 + lea chatin(pc),a0 + move.b 0(a0,d0),d0 + addq #1,chatinget + moveq #2,d1 + bsr chatprint + ; +.rts rts + +showstuff move showflag(pc),d0 + beq.s .noshow + ; + ;don't show if beam in the way! + ; + move.l $dff004,d0 + lsr.l #8,d0 ;beampos + and #$1ff,d0 + cmp minbpos(pc),d0 + bcs.s .ok + cmp maxbpos(pc),d0 + bcs.s .noshow + ; +.ok clr showflag + lea window1,a0 + bsr showwindowq + lea window2,a0 + bra showwindowq + ; +.noshow 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 + +vbhandler movem.l d2-d7/a2-a6,-(a7) + ; + subq #1,(a1)+ ;inc/dec frame counters + addq #1,(a1) + ; + ;this done every frame! + bsr showstuff + bsr chatstuff + bsr sfxvbint + ; + btst #0,framecnt+1 + beq exit_vb + tst paused + bne exit_vb + ; + ;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 + 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 + ; + 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 + +blowobject move.l diesfx(pc),a0 + moveq #64,d0 + moveq #2,d1 + bsr playsfx + ; + 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 + 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 + bra killobject + +hurtghoul moveq #31,d7 + bsr bloodymess + rts + +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 + +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 + ; + ;bsr pickplayer + ;tst ob_invisible(a0) + ;bne.s .useold ;can't see player! no intelligence... + ;bsr calcangle + ; + 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 + +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) + bgt monstermove + ; + ;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 pickplayer + ;bsr calcangle + ; + 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 + ; + 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 + 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,-(a7) + and #15,d0 + subq #8,d0 + add (a7)+,d0 + ; + and #255,d0 + 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 + +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 + +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) + move.l player1,a0 + cmp.l a5,a0 + bne.s .got + move.l player2,a0 +.got 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 + ; + ;OK, one player game done! + ; +.allover move #2,finished + rts + ; +.not1p move.l player1,a0 + cmp.l a5,a0 + bne.s .goth + move.l player2,a0 +.goth tst ob_hitpoints(a0) + ble.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 + move (a0)+,ob_x(a5) + move (a0)+,ob_z(a5) + move (a0)+,ob_rot(a5) + ; + move (a7)+,d0 + moveq #4,d1 +.wloop bclr d1,d0 + dbne d1,.wloop + tst d0 + bne.s .wdone + moveq #1,d0 +.wdone move d0,ob_weapon(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! + ; + move.l player1,a0 + cmp.l a5,a0 + bne.s .got + move.l player2,a0 +.got tst ob_hitpoints(a0) + ble.s .draw ;it's a draw! + ; +.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 +.draw ; + rts +.notcom ; + tst linked + beq.s .nlink + bsr getother + move #-1,ob_update(a0) + subq #1,ob_lives(a0) + ; +.nlink move #-1,ob_update(a5) + subq #1,ob_lives(a5) + bne.s .rts + 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 + +healthgot bsr playtsfx + addq #5,ob_hitpoints(a0) + cmp #25,ob_hitpoints(a0) + ble.s .skip + move #25,ob_hitpoints(a0) +.skip st ob_update(a0) + move.l a5,-(a7) + move.l a0,a5 + bsr message + dc.b 'health bonus!',0 + even + 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 bit! + move.l a0,a5 + move ob_weapon(a5),d1 + bset d0,d1 + beq.s .new ;newweapon! + ; + subq.b #1,ob_reload(a5) + bmi.s .skip + bne.s .notfull + bsr message + dc.b 'weapon at full boost!',0 + even + bra.s .kill + ; +.notfull bsr message + dc.b 'weapon bonus!',0 + even +.kill move.l (a7)+,a5 + bra killobject + ; +.skip clr.b ob_reload(a5) + bra.s .kill + ; +.new move d1,ob_weapon(a5) + move.b #ireload,ob_reload(a5) + st ob_update(a5) + bsr message + dc.b 'weapon boost!',0 + even + bra.s .kill + +invisigot 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 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 + +bouncygot 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 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_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 + +cntrls dc.l joyx0,joyx1,joyx2,joyx3 + +pbuff ds.b 128 ;player controls to use! +pput dc 0 ;put new cntrl here +pget dc 0 ;read this for actual + +getcntrlq lea cntrls(pc),a0 + move.l 0(a0,d0*4),a0 ;address of cntrl table... + move.l (a0)+,joyx + move.l (a0),joyb + rts + +getcntrl move ob_cntrl(a5),d0 + tst gametype + beq getcntrlq + tst linked + beq getcntrlq + ; + cmp #3,d0 ;null modem? + bne.s .notnull + ; +.waitser bsr serget + bpl.s .sergot + ; + ;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 .waitser + ; +.sergot lea joyx3(pc),a0 + tst.b d0 + bpl .djoy + and #$ff,d0 + move d0,finished + move.l #rts,ob_logic(a5) + moveq #0,d0 +.djoy bsr decodejoy + move.l (a0)+,joyx + move.l (a0),joyb + rts + ; +.notnull lea cntrls(pc),a0 + move.l 0(a0,d0*4),a0 ;address of cntrl table... + ; + bsr encodejoy + movem.l d0/a0,-(a7) + bsr serput + movem.l (a7)+,d0/a0 + ; + 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 + ; + bsr decodejoy + move.l (a0)+,joyx + move.l (a0),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 + +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 move ob_bounce(a5),d1 + bne.s .nob + rts +.nob add #30,ob_bounce(a5) + move ob_bounce(a5),d1 + and #127,d1 + cmp #30,d1 + bcc .fskip + clr ob_bounce(a5) + clr ob_frame(a5) + bra footstep + ; +.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 + move.l player1(pc),a0 + cmp.l a5,a0 + bne.s .gotcha + move.l player2(pc),a0 +.gotcha 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 + +playerlogic bsr playertimers ;do timer stuff... + bsr getcntrl ;player control + ; + move.l ob_x(a5),d6 + move.l ob_z(a5),d7 + ; + ;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 checkevent ;in an event zone? + bsr rotplayer ;rotate + bsr moveplayer ;forward/back/strafe +checkfire ; + tst.b ob_reloadcnt(a5) + beq.s .rok + subq.b #1,ob_reloadcnt(a5) +.rok bsr checkfireb + beq .rts + ; + tst.b ob_reloadcnt(a5) + bne .rts + move.b ob_reload(a5),ob_reloadcnt(a5) + ; + move ob_collwith(a5),d2 + and #3,d2 + eor #3,d2 ;colltype + ; + move ob_weapon(a5),d1 + moveq #4,d0 +.loop btst d0,d1 + dbne d0,.loop + 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) + ; + moveq #0,d3 + bsr shoot + ; + move.l (a7)+,a0 + move.l (a0),a0 + moveq #32,d0 + moveq #0,d1 + bsr playsfx + ; +.rts rts + + ; + ;hitpoints + ;damage + ;speed + ; +wtable dc 1,1,32 + dc.l bullet1,sparks1,shootsfx3 + dc 5,2,36 + dc.l bullet2,sparks2,shootsfx2 + dc 10,3,40 + dc.l bullet3,sparks3,shootsfx + dc 15,4,40 + dc.l bullet4,sparks4,shootsfx4 + dc 20,7,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 + ; + add.l #$8000,bl_yvec(a5) + ; + movem.l bl_xvec(a5),d0-d2 + add.l d1,bl_y(a5) + blt.s .ok + ; + move.l a5,a0 + killitem blood + move.l a0,a5 + bra.s .loop + ; +.ok add.l d0,bl_x(a5) + add.l d2,bl_z(a5) + bra.s .loop + ; +.done rts + +drawblood lea blood(pc),a5 + ; +.loop move.l (a5),a5 + tst.l (a5) + beq .done + ; + move bl_x(a5),d0 + sub camx(pc),d0 + move bl_y(a5),d1 + 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 #32,d2 + bcc.s .pix + ; + ;blit to screen! + ; + move #$20,$dff09a + ; + bsr savernd + move.l window(pc),a0 + move wi_bh(a0),d0 + subq #8,d0 + bsr rndn + move d0,d2 ;Y + ; + move wi_bw(a0),d0 + subq #8,d0 + bsr rndn ;X + add wi_x(a0),d0 + move d2,d1 + ; + move.l wi_bmap(a0),a1 + move.l font(pc),a0 + moveq #50,d2 + bsr blit + ; + bsr loadrnd + ; + move.l a5,a0 + killitem blood + move.l a0,a5 + ; + move #$8020,$dff09a + bra .loop +.pix ; + add midx(pc),d0 + add midy(pc),d1 + ; + move.l darktable(pc),a0 + move 0(a0,d2*2),d3 + ; + move.l cop(pc),a1 + ; + lea coloffs,a2 + add.l 0(a2,d0*4),a1 + mulu copmod(pc),d1 + ; + move blcols(pc,d3*2),d3 + and bl_color(a5),d3 + move d3,0(a1,d1.l) + bra .loop + ; +.done rts + +blcols dc $ccc,$bbb,$aaa,$999,$888,$777,$666,$555 + dc $444,$333,$222,$111,$000,$000,$000,$000 + +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 + ; + addq #1,frame + ; + 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 d0,a5 + ; + cmp wl_lsx(a5),d7 + blt.s .loop2 + cmp wl_rsx(a5),d7 + bgt.s .loop2 + ; + 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<d2 + jsr -156(a6) + move.l d2,vbr + ; + lea ciaaname,a1 + jsr -498(a6) + move.l d0,ciaa + move.l d0,a0 + movem.l $64(a0),d0-d1 + movem.l d0-d1,rawstuff + move #$4000,$dff09a + move.l rawtable(pc),$64(a0) + move.l #rawkeyread,$68(a0) + move #$c000,$dff09a + ; + move.l #8,d0 + move.l #$10002,d1 + allocmem chipzero + move.l d0,chipzero + ; + move.l #256,d0 ;128 words high max! + moveq #2,d1 + allocmem qstrip + move.l d0,qstrip + ; + 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 #16*512*2,d0 ;16 shades, 256 words + moveq #1,d1 + allocmem map_rgbs + ; + move.l #map_rgbs_,map_rgbs + ;move.l d0,map_rgbs + ;add.l #16*512,d0 + move.l d0,map_rgbsw + add.l #16*512,d0 + move.l d0,map_rgbsr + ; + st paused + clr dispnest + clr showflag + clr.l font + bsr initsfx + bsr initvbint + bsr initdisplay + bsr dispoff + ; + lea magicfiles,a0 + bsr loadfiles + ; + move.l magic,a0 + move.l magicpal,a1 + bsr makeiff + bsr showiff + bsr dispon + move #50,vbcounter + ; + lea progfiles,a0 + bsr loadfiles + ; + bsr initbmappal + bsr initmed + bsr initser + bsr calcbaud + bsr makecoloffs + bsr initdarktable + ; + bset #15,remapped + bne .noremap + ; + move.l map_rgbs(pc),a0 + move #-1,(a0)+ + move.l a0,map_rgbsat + ; + 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 + ; + elseif + lea 128*128+groundtile,a2 + move.l a2,a0 + bsr addpal + lea groundtile,a0 + move.l a2,a1 + bsr remap + ; + lea 128*128+ceilingtile,a2 + move.l a2,a0 + bsr addpal + lea ceilingtile,a0 + move.l a2,a1 + bsr remap + elseif + ; + lea qpal,a0 + bsr addpal + lea qcols,a0 + lea qpal,a1 + bsr remap + ; + 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 + ; +.w5sex tst vbcounter + bgt .w5sex + ; + bsr dispoff + lea iffwindow,a0 + bsr freewindow + move.l magic,a1 + freemem magic + move.l magicpal,a1 + freemem magicpal + ; + bra forbid + + elseif +;OK, sample device list prog... +; +d=OldOpenLibrary_("dos.library") +r=Peek.l(d+34) ;root +i=Peek.l(r+24):i LSL 2 ;info +l=Peek.l(i+4) ;list! + +While l + l LSL 2 + s=Peek.l(l+40):s LSL 2 + NPrint Peeks$(s+1,Peek.b(s)) + l=Peek.l(l) +Wend + elseif + +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 ; + bsr checkdatadisk + beq .dataok ;already there? + ; + sub.l a0,a0 + bsr makeiff + bsr showiff + lea diskmenu,a4 + lea iffwindow,a6 + bsr initmenu + bsr dispon + ; + ;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 dispoff + bsr finitmenu + lea iffwindow,a0 + bsr freewindow + ; +.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 + ; + lea datafiles,a0 + bsr loadfiles + bsr forbid + ; + rts + +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 + +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 move.l lagtext(pc),d0 + bsr longput +.rl lea lagtext(pc),a2 +.rw bsr serwait + cmp.b (a2)+,d0 + bne.s .rl + tst.b (a2) + bne.s .rw + ; +calclag tst linked + bmi .slave + ; + ;MASTER - average out 32 sends of random data! + ; + moveq #0,d6 ;sum + moveq #31,d5 ;32 samples + ; +.mloop moveq #0,d7 + add #69,d0 + bsr vwait + bsr serput + ; +.mwait addq #1,d7 + bsr vwait + bsr serget + bmi.s .mwait + ; +.got add d7,d6 + dbf d5,.mloop + ; + 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 'no events' 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 tput + clr tget + clr pget + clr rget + move d0,pput + move d0,rput + ; + move #$c000,$dff09a + ; + bsr vwait + ; + rts + +lagtime dc 0 + +qsync bsr vwait + move.b #$80,d0 + bsr serput + bsr serget + bmi.s qsync + cmp.b #$80,d0 + bne.s qsync + bsr vwait + moveq #0,d0 + bsr serput + bsr serwait + tst.b d0 + bne.s qsync + ; + rts + +initnewgame move gametype(pc),twowins + beq.s .skip + tst linked + beq.s .skip + ; + ifeq debugser + clr twowins + endc +.skip ; + bset #15,gloomdata + bne.s .gotdata + ; + bsr askdatadisk +.gotdata ; + bsr qsync + ; + move.l medat(pc),a1 + jsr 12(a1) + ;move #$4000,fadevol + cmp #2,gametype + bne normalgame + ; + ;combat type game! + ; + move #6,p1_ob_collwith + move #5,p2_ob_collwith + ; + lea combat,a0 + lea combatpal,a1 + bsr makeiff + bsr showiff + ; + lea combatmenu,a4 + lea iffwindow,a6 + bsr initmenu + ; + bsr dispon + ; +.loop bsr selmenu + tst d0 + beq .play + ; + ;change number of wins... + ; + addq.b #1,comnum + cmp.b #'9',comnum + bls .loop + move.b #'2',comnum + bra .loop + ; +.play bsr dispoff + bsr finitmenu + lea iffwindow,a0 + bsr freewindow + ; + move.b comnum(pc),d0 + sub.b #'0',d0 + ext d0 + move d0,p1lives + move d0,p2lives + rts + ; +normalgame move #4,p1_ob_collwith + move #4,p2_ob_collwith + ; + move.l script,a0 + move.l a0,scriptat + lea conttxts(pc),a1 + lea conts(pc),a2 + moveq #0,d7 ;how many conts found! + ; + ;OK, any continue points in script? + ; +.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 '_' + cmp.l #'cont',d0 + beq.s .cont + cmp.l #'done',d0 + beq.s .done + ; +.eol cmp.b #10,(a0)+ + bne.s .eol + bra .loop + ; +.cont ;continue point! + ; + lea context(pc),a3 +.cont2 move.b (a3)+,(a1)+ + bne.s .cont2 + subq #1,a1 + ; +.clp move.b (a0)+,(a1) + cmp.b #'_',(a1)+ + bne.s .clp + clr.b -1(a1) + move.l a0,(a2)+ + addq #1,d7 + bra .eol + ; +.done tst d7 + beq initpstuff + addq #1,d7 + move.b d7,contmenu + ; + ;OK, need a continue game menu... + ; + lea gloom,a0 + lea gloompal,a1 + bsr makeiff + bsr showiff + ; + lea contmenu,a4 + lea iffwindow,a6 + bsr initmenu + bsr dispon + ; + bsr selmenu + ; + bsr dispoff + bsr finitmenu + lea iffwindow,a0 + bsr freewindow + ; + move curropt(pc),d0 + beq initpstuff + lea conts(pc),a0 + move.l -4(a0,d0*4),scriptat + ; +initpstuff moveq #3,d0 + tst linked + beq.s .nlink + moveq #6,d0 +.nlink move d0,p1lives + move d0,p2lives + move #25,p1health + move #25,p2health + move #1,p1weapon + move #1,p2weapon + move.b #ireload,p1reload + move.b #ireload,p2reload + ; + rts + +conts ds.l 8 ;8 slots! + +combatmenu dc.b 2 + dc.b 'play combat game',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 medat(pc),a1 + move.l loadingmed(pc),a0 + jsr 8(a1) ;start title 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 #'cont',d0 + beq scriptcont + cmp.l #'tile',d0 + beq scripttile + ; + warn #$f80 + ; + ;Hmmm....bad command +.fucked ; +scriptdone bsr freeiff + rts + +sccont dc.b 'cont_' + even + +scriptcont cmp.b #10,(a0)+ + bne.s scriptcont + move.l a0,scriptat + ; + bra execscript + + ;a0=name, a1=mem, d0=length + +scriptrest ;restart point! change to 'cont_' and save script out... + ; + lea sccont(pc),a1 + subq #5,a0 +.loop move.b (a1)+,(a0) + cmp.b #'_',(a0)+ + bne.s .loop + ; +.leol cmp.b #10,(a0)+ + bne.s .leol + move.l a0,scriptat + ; + ;save script! + ; + bsr permit + ; + lea scriptname,a0 + move.l script,a1 + move.l -12(a1),d0 + subq.l #8,d0 + subq.l #8,d0 + ; + bsr savefile + ; + 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 pic,a0 + move.l picpal,a1 + bsr makeiff + bsr showiff + 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 + +picpath dc.b 'pics/' +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 + +scriptpict ;load an iff + bsr freeiff + lea picname,a1 + bsr fetchrest + move.l a1,-(a7) + bsr permit + lea picpath,a0 + moveq #1,d1 + jsr loadfile + move.l d0,pic + lea pic_pal,a0 + move.l (a7)+,a1 +.loop move.b (a0)+,(a1)+ + bne.s .loop + lea picpath,a0 + moveq #1,d1 + jsr loadfile + move.l d0,picpal + bsr forbid + bra execscript + +scriptdark move.l iffwindow+wi_cop,a0 ;copperlist to darken! + ; + ;bank,32,bank,32... + ; + addq #6,a0 + moveq #3,d0 ;4 lots of 32 colours + moveq #31,d1 + ; + ;skip first 8 + ; + ;subq #8,d1 + ;lea 32(a0),a0 +.loop ; + move (a0),d2 ;hi nyb + move 132(a0),d3 ;lo nyb! + and #$eee,d3 + lsr #1,d3 + move d2,d4 + and #$111,d4 + lsl #3,d4 + or d4,d3 + and #$eee,d2 + lsr #1,d2 + move d2,(a0) + move d3,132(a0) + ; + addq #4,a0 + dbf d1,.loop + moveq #31,d1 + lea 136(a0),a0 + dbf d0,.loop + bra execscript + +text ds.b 64 + +scripttext ;print text on iff + ;a6=window, a4=message, d0=length of message, d6=Y + ; + move #2,pdelay + ; + lea text,a1 + bsr fetchrest + ; + lea iffwindow,a6 + lea text,a4 + move wi_bh(a6),d6 + sub #7,d6 + 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 readmenujoys + tst joyb4 + movem.l (a7)+,d0-d7/a0-a6 + rts + +waitany movem.l d0-d7/a0-a6,-(a7) +.wait bsr vwait + bsr readmenujoys + tst joyb4 + beq .wait + ; +.unwait bsr vwait + bsr readmenujoys + tst joyb4 + bne .unwait + ; + 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 + +getwindow tst twowins + bne.s .p2 + ; + lea defwindow1_1p,a0 + lea window1,a1 + bsr copywin + rts + ; +.p2 lea defwindow1_2p,a0 + lea window1,a1 + bsr copywin + ; + lea defwindow2_2p,a0 + lea window2,a1 + bsr copywin + rts + +putwindow tst twowins + bne.s .p2 + ; + lea window1,a0 + lea defwindow1_1p,a1 + bsr copywin + rts + ; +.p2 lea window1,a0 + lea defwindow1_2p,a1 + bsr copywin + ; + lea window2,a0 + lea defwindow2_2p,a1 + bsr copywin + rts + +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... + ; + lea comname(pc),a0 +.loop move.b (a0)+,(a1)+ + bne.s .loop + ; + lea combat,a0 + lea combatpal,a1 + bsr makeiff + bsr showiff + bsr dispon + lea tilenum(pc),a0 + lea floortag(pc),a1 +.loop2 move.b (a0)+,(a1)+ + bne.s .loop2 + bra loadtile + +tilenum dc.b '1',0 + +comname dc.b 'map0_1',0 + even + +scriptplay ; + 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 + ; + tst twowins + beq.s .not2pg + ; + ;OK, see if either player is out of lives...if so, revert to single window + ; + move p2lives(pc),d0 + beq.s .g0 + move p1lives(pc),d0 + bne.s .not2pg + move p2health(pc),p1health + move p2weapon(pc),p1weapon + move p2lives(pc),p1lives + move p2reload(pc),p1reload +.g0 bsr swaphflags + clr gametype + clr twowins + ; +.not2pg 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 calcpalettes + bsr forbid + bsr makepalettes + bsr dispoff + bsr freewindows + bsr getwindow + ; + ;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 #1,p1weapon + 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 + clr p2weapon +.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 player1(pc),a5 + move.l #window1,ob_window(a5) + move.l ob_window(a5),a0 + bsr makewindow + move.l ob_window(a5),a0 + bsr showwindow + bsr initstats + ; + tst twowins + beq.s .onew + ; + move.l player2(pc),a5 + move.l #window2,ob_window(a5) + move.l ob_window(a5),a0 + bsr makewindow + move.l ob_window(a5),a0 + bsr showwindow + bsr initstats +.onew ; + bsr calcbpos + move #$4000,fadevol ;fadeout med! + ; + ;move.l medat(pc),a1 + ;clr fadevol + ;jsr 12(a1) ;stop song + ; + move #$1f3a,d0 + bsr seedrnd + clr finished + clr finished2 + clr doneflag + clr showflag + ; + bsr syncup + ; + clr framecnt + clr paused + bsr drawall2 + bsr dispon + ; + bsr chaton + ; +mainloop bsr drawall + st showflag + ; + qkey $45 ;ESC? + beq .notesc + bsr dogamemenu +.notesc move finished(pc),d0 + beq.s mainloop + ; + st paused + bsr chatoff + ; +.unlk bsr dispoff + bsr freewindows + 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 combatover + ; +.fuck warn #$f08 + warn #$80f + bra.s .fuck + ; +exitgame bsr sendback + bsr freeiff + bra freetiles +gameover ; + bsr freeiff + bra freetiles +levelover ; + move.l player1,a5 + move ob_hitpoints(a5),p1health + move ob_weapon(a5),p1weapon + move ob_lives(a5),p1lives + move.b ob_reload(a5),p1reload + ; + tst gametype + beq.s .p1p1 + ; + move.l player2,a5 + move ob_hitpoints(a5),p2health + move ob_weapon(a5),p2weapon + move ob_lives(a5),p2lives + move.b ob_reload(a5),p2reload +.p1p1 ; + tst.l map_test + beq execscript_med + bra exitgame ;tell other! + ; +combatover 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),a0 + tst linked + beq .combatmess + lea ploses_(pc),a0 + bgt .combatmess + lea pwins_(pc),a0 + bra .combatmess + ; +.p2lost ;player 2 lost combat game + ; + lea p1wins(pc),a0 + tst linked + beq .combatmess + lea ploses_(pc),a0 + blt .combatmess + lea pwins_(pc),a0 + ; +.combatmess move.l a0,-(a7) + ; + bsr freeiff + bsr freetiles + lea combat,a0 + lea combatpal,a1 + jsr makeiff + jsr showiff + move.l (a7)+,a4 + lea iffwindow,a6 + bsr initmenu + bsr dispon + ; + bsr selmenu + ; + bsr dispoff + bsr finitmenu + lea iffwindow,a0 + bra freewindow + +sendback move linked(pc),d0 + beq.s .rts + move finished(pc),d0 + bset #7,d0 + beq serput +.rts rts + +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 + +dointro ; + lea gloom,a0 + lea gloompal,a1 + jsr makeiff + jsr showiff + ; + lea gloombrush,a0 + lea iffwindow,a1 + move.l wi_bmap(a1),a1 + add.l #168*7*40,a1 + bsr decodeiff + ; + bsr dispon + ; + bsr chaton + ; + bsr waitany + ; + lea startmenu,a4 + tst linked + beq.s .use + lea startmenu2,a4 +.use lea iffwindow,a6 + 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 dispoff + bsr finitmenu + lea iffwindow,a0 + bsr freewindow + clr linked + bra dointro + ; +.newgame2 addq #1,d0 + move d0,gametype + bsr chatoff + bsr dispoff + bsr finitmenu + lea iffwindow,a0 + bra freewindow + ; +.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 + tst linked + beq.s .here + ; + addq #1,(a2) ;0,1,2 + cmp #3,(a2) + bcs.s .pok2 + clr (a2) +.pok2 move (a2),d0 + bra.s .there + ; +.here addq #1,(a2) + cmp #3,(a2) + bcs.s .pok + clr (a2) +.pok move (a2),d0 + cmp (a3),d0 + beq.s .here + ; +.there lea popts(pc),a0 + move.l 0(a0,d0*4),a0 + ; +.sk move.b (a0)+,(a1)+ + bne.s .sk + bra .sel + ; +.notp1 subq #1,d0 + bne.s .notp2 + ; + lea p2ctype(pc),a1 + lea p2_ob_cntrl,a2 + lea p1_ob_cntrl,a3 + bra.s .here + ; +.notp2 subq #1,d0 + bne.s .notlink + ; + bsr dispoff + bsr finitmenu + lea iffwindow,a0 + bsr freewindow + 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 dispoff + bsr finitmenu + lea gloom,a0 + lea gloompal,a1 + bsr makeiff + bsr showiff + ; + lea abouttext,a4 + lea iffwindow,a6 + bsr initmenu + move numopts(pc),-(a7) + move #1,numopts + ; + bsr dispon + bsr selmenu + ; + move (a7)+,numopts + ; + bsr dispoff + bsr finitmenu + bra dointro + ; +.notabout subq #1,d0 + bne .sel + ; +.exitgloom moveq #4,d0 + ; +.newgame move d0,gametype + ; + bsr chatoff + jsr dispoff + jsr finitmenu + lea iffwindow,a0 + bra freewindow + +linkup ;link up... + ; + sub.l a0,a0 + bsr makeiff + bsr showiff + lea linkupmenu,a4 + lea iffwindow,a6 + bsr initmenu + ; + bsr dispon + ; +.loop bsr selmenu + cmp #3,d0 + bne.s .notb + bsr optbaud + bra.s .loop + ; +.notb move d0,-(a7) + bsr dispoff + bsr finitmenu + move (a7)+,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) + ; + sub.l a0,a0 + bsr makeiff + bsr showiff + lea linkmenu0,a4 + lea iffwindow,a6 + bsr initmenu + bsr dispon + ; +.loop moveq #-1,d0 + move.l d0,keyoff + ; +.wkey cmp.l keyoff(pc),d0 + beq.s .wkey + ; + move keyoff(pc),d0 + lsl #3,d0 + or keybit(pc),d0 + beq.s .wkey + ; + cmp #$44,d0 + beq.s .done + cmp #$41,d0 + bne.s .notdel + ; + move.l phoneat(pc),a0 + cmp.l #phonenum,a0 + beq.s .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 + ; +.notdel cmp #10,d0 + bhi.s .loop + bcs.s .nz + moveq #0,d0 +.nz add #48,d0 + ; + 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 + ; +.done bsr dispoff + bsr finitmenu + ; + 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 + +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 + ; + moveq #0,d7 + move #$4000,$dff09a ;ints off! + ; +.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 #$c000,$dff09a + ; + move.l d7,d0 + bsr longput + bsr longget + cmp.l d0,d7 + beq.s .calcmaster + blt.s .skip + ; + ;I'm player 1 + move #1,linked + bra.s .linked + ; +.skip ;I'm actually player 2! + move #-1,linked + ; +.linked move #3,p2_ob_cntrl + sub.l a0,a0 + bsr makeiff + bsr showiff + lea incharge(pc),a4 + tst linked + bgt.s .goz + lea notincharge(pc),a4 +.goz lea iffwindow,a6 + bsr initmenu + bsr dispon + ; + bsr chaton + ; + bsr selmenu + ; + bsr dispoff + bra finitmenu + +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 + +waitconnect ;wait for 'CONNECT' to arrive... + ;return eq if OK, else ne if 'esc'ed or not received. + ; + sub.l a0,a0 + bsr makeiff + bsr showiff + lea linkmess,a4 + lea iffwindow,a6 + bsr initmenu + bsr dispon + ; +.retry lea wconnect(pc),a2 + ; +.loop qkey $45 ;ESC? + bne .notok + bsr serget + bpl.s .sgok + bsr vwait + bra.s .loop +.sgok cmp.b (a2)+,d0 + bne.s .retry + tst.b (a2) + bne.s .loop + ; +.ok ;OK, connect xxxx ends with 13,10... + ; +.w10 qkey $45 + bne .notok + bsr serget + bpl.s .sgok2 + bsr vwait + bra.s .w10 +.sgok2 cmp.b #10,d0 + bne.s .w10 + ; + bsr dispoff + bsr finitmenu + moveq #0,d0 + rts + ; +.notok bsr dispoff + bsr finitmenu + 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 5 + +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 + +popts dc.l popt1,popt2,popt3,popt4 +popt1 dc.b 'JOYSTICK 2',0 +popt2 dc.b 'JOYSTICK 1',0 +popt3 dc.b ' KEYBOARD ',0 +popt4 dc.b 'NULL MODEM',0 + + even + +makeiff ;show an IFF picture...128 colours...320 X 240 + ; + ;a0=trimmed iff, a1=iff's palette + ; + push + movem.l a0-a1,-(a7) + lea iffwindow,a0 + bsr freewindow + movem.l (a7)+,a0-a1 + ; + lea iffwindow,a2 + cmp.l #0,a0 + bne.s .notblank + addq #1,a0 + move.l a0,wi_iff(a2) + move.l #rgbs16,a1 + bra.s .blank + ; +.notblank move.l a0,wi_iff(a2) +.blank move.l a1,wi_pal(a2) + ; + ;copy font palette to IFF palette! + ; + move.l font(pc),d0 + beq.s .nofont + ; + move.l d0,a0 + add.l (a0),a0 + addq #2,a0 + clr.l (a1)+ + moveq #14,d0 +.loop move (a0),(a1)+ + move (a0)+,(a1)+ + dbf d0,.loop +.nofont ; + move.l a2,a0 + bsr makewindow + ; + pull + rts + +showiff push + lea iffwindow,a0 + bsr showwindow + pull + rts + +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 dc.b 'JOYSTICK 1',0 ;3 + ; + dc.b 'PLAYER 2 ' +p2ctype dc.b 'JOYSTICK 2',0 ;4 + ; + 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! + +initmenu clr curropt +initmenu2 ; + ;do a menu...menu in a4, window in a6 + ; + move.l a6,menuwindow + move.b (a4)+,d0 ;how many + ext d0 + move d0,numopts + move d0,-(a7) ;counter + move wi_bh(a6),d6 + move.l wi_bmap(a6),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 #40*7,d0 + mulu fonth(pc),d0 + moveq #2,d1 + allocmem menustrip + move.l d0,(a5)+ + move.l d0,a1 + move.l wi_bmap(a6),a0 + move d6,d0 + mulu #7*40,d0 + add.l d0,a0 + ; + move #40*7,d0 + mulu fonth(pc),d0 + lsr.l #2,d0 + subq #1,d0 + ; +.sloop move.l (a0)+,(a1)+ + dbf d0,.sloop + ; + move.l a4,a0 + moveq #-1,d0 +.cnt addq #1,d0 + tst.b (a0)+ + bne.s .cnt + ; + bsr printmess2 + ; + add fonth(pc),d6 + subq #1,(a7) + bgt.s .loop + addq #2,a7 + ; + ifne debugmem + bsr showmem + lea memasc,a4 + moveq #8,d0 + bsr 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 + bsr printmess2 +.nomemerr ; + endc + ; + rts + + ifne debugmem +showmem push + move.l 4.w,a6 + moveq #1,d1 + jsr -216(a6) + 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 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 #7*40,d6 + move.l menubmap(pc),a1 + add.l d6,a1 + ; + move fonth(pc),d0 + mulu #7,d0 + lsl #6,d0 + or #20,d0 + ; + btst #6,$dff002 +.bwait btst #6,$dff002 + bne.s .bwait + ; + move.l #$9f00000,$dff040 + move.l #-1,$dff044 + move #0,$dff064 + move #0,$dff066 + move.l a0,$dff050 + move.l a1,$dff054 + move d0,$dff058 + ; + move #13,flashdelay + ; + rts + +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 + bsr printmess2 + ; + move #13,flashdelay + ; + rts + +readmenujoys ;if in charge...read and send else rec. + ; + tst linked + beq.s .read + ; + bpl.s .readsend + ; +.get bsr serget + bmi.s .none + lea joyx4(pc),a0 + bra decodejoy +.none clr joyx4 + clr joyy4 + clr joyb4 + clr joys4 + rts + ; +.readsend bsr .read + lea joyx4(pc),a0 + bsr encodejoy + tst.b d0 + bne serput + rts + ; +.read bsr readjoys + ; + ;up/down + ; + move joyy2(pc),d0 + bne.s .gy + move joyy1(pc),d0 +.gy move d0,joyy4 + ; + ;fire! + ; + move joyb2(pc),d0 + bne.s .gf + move joyb1(pc),d0 + bne.s .gf + key $44 ;ret + bne.s .fire + key $45 ;esc + bne.s .fire + moveq #0,d0 + bra.s .gf +.fire moveq #-1,d0 +.gf move d0,joyb4 + rts + +selmenu ;select a menu item...return item in d0 + ; + ;flash selected option on/off + ; + bsr optoff + ; +.loop1 bsr vwait + bsr readmenujoys + tst joyy4 + blt .up2 + bgt .down2 + tst joyb4 + bne .sel2 + ; + subq #1,flashdelay + bgt .loop1 + ; + bsr opton + ; +.loop2 bsr vwait + bsr readmenujoys + tst joyy4 + blt .up + bgt .down + tst joyb4 + bne .sel + ; + subq #1,flashdelay + bgt .loop2 + ; + bra selmenu + ; +.up2 bsr opton +.up subq #1,curropt + bpl.s .upskip + move numopts(pc),d0 + subq #1,d0 + move d0,curropt +.upskip bsr vwait + bsr readmenujoys + tst joyy4 + bmi .upskip + bra selmenu + ; +.down2 bsr opton +.down addq #1,curropt + move curropt(pc),d0 + cmp numopts(pc),d0 + bcs.s .downskip + clr curropt +.downskip bsr vwait + bsr readmenujoys + tst joyy4 + bgt .downskip + bra selmenu + ; +.sel2 bsr opton +.sel bsr vwait + bsr readmenujoys + tst joyb4 + bne .sel + move curropt(pc),d0 + rts + +finitmenu ;clean up menu operation + ; + lea menustrips(pc),a5 + move numopts(pc),d2 + subq #1,d2 +.loop addq #4,a5 + move.l (a5)+,a1 + freemem menustrip + dbf d2,.loop + rts + +initbmappal move.l smallfont_,a0 + add.l (a0),a0 + addq #2,a0 + moveq #22,d0 ;23 colours to poke! + move.l coplist(pc),a1 + move.l a1,a2 + move.l a1,a3 + move.l a1,a4 + ; + lea cols1+6-copinit(a1),a1 + lea cols2+6-copinit(a2),a2 + lea cols3+6-copinit(a3),a3 + lea cols4+6-copinit(a4),a4 + ; +.loop move (a0),(a1) + move (a0),(a2) + move (a0),(a3) + move (a0)+,(a4) + addq #4,a1 + addq #4,a2 + addq #4,a3 + addq #4,a4 + dbf d0,.loop + rts + +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 +.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 + +keyoff dc 0 +keybit dc 0 + +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 $ff + even + +rawmap ds.b 128 + +chatout ds.b 32 +chatoutput dc 0 +chatoutget dc 0 + +chatin ds.b 32 +chatinput dc 0 +chatinget dc 0 + +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! + movem d0-d1,keyoff + ; + ;OK, key down... + move chatok(pc),d0 + beq.s .skip + lea rawmap(pc),a0 + 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/a1,-(a7) + ; + move.l dosbase,a6 + move.l a0,d1 + move.l #1006,d2 + jsr -30(a6) + move.l d0,d7 + beq .done + ; + move.l d7,d1 + movem.l (a7)+,d0/a1 + move.l a1,d2 + move.l d0,d3 + jsr -48(a6) + ; + move.l d7,d1 + jsr -36(a6) + ; +.done pull + rts + +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 decrm+32 + 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 + +andtable dc $ffff,0 ;rgb and, brightness add...wht + dc $ff00,8 ;red + +makepalettes ; + ;make wht and red pals + ; + ;create pointers... + ; + lea palettes(pc),a0 + move.l map_rgbs(pc),d0 + lea palettesw(pc),a1 + move.l map_rgbsw(pc),d1 + lea palettesr(pc),a2 + move.l map_rgbsr(pc),d2 + ; + moveq #15,d7 + ; +.loop move.l (a0)+,d3 + sub.l d0,d3 ;offset! + move.l d3,d4 + add.l d1,d3 + move.l d3,(a1)+ + add.l d2,d4 + move.l d4,(a2)+ + ; + dbf d7,.loop + ; + move.l map_rgbsend(pc),d7 + sub.l map_rgbs(pc),d7 ;how many bytes! + lsr #1,d7 + subq #1,d7 ;words! + ; + move.l map_rgbsw(pc),a1 + move #$ffff,d1 ;col and + move #0,d2 ;gamma + bsr makeapal + ; + move.l map_rgbsr(pc),a1 + move #$ff00,d1 + moveq #16,d2 + bsr makeapal + ; + rts + +makeapal move.l map_rgbs(pc),a0 + ; +.loop move (a0)+,d4 ;src colour...find briteness + ; + move d4,d5 + move d4,d6 + and #$f00,d4 + lsr #8,d4 + and #$0f0,d5 + lsr #4,d5 + and #$00f,d6 + add d6,d5 + add d5,d4 + add d2,d4 + cmp #16*3,d4 + bcs.s .bok + moveq #16*3-1,d4 +.bok ext.l d4 + divu #3,d4 ;(r+g+b)/3=briteness! + ; + move d4,d5 + move d4,d6 + lsl #8,d4 + lsl #4,d5 + or d6,d5 + or d5,d4 ;RGB + and d1,d4 + ; + move d4,(a1)+ + ; + cmp.l map_rgbsend(pc),a0 + bcs.s .loop + ; + rts + +calcpalettes ;OK, our palette currently runs from: + ; + ;map_rgbs + ; to + ;map_rgbsat + ; + ;append brightness versions... + ; + lea palettes(pc),a2 + move.l map_rgbs(pc),(a2)+ ;first brightness! + move.l map_rgbsat(pc),a1 ;first brightness! + move.l a1,a3 + moveq #1,d0 ;rgb subtract + ; +.loop move.l map_rgbs(pc),a0 + move.l a1,(a2)+ + ; +.loop2 move (a0)+,d1 + move d1,d2 + move d1,d3 + ; + and #$f00,d1 + lsr #8,d1 + sub d0,d1 + bpl.s .rok + moveq #0,d1 +.rok ; + and #$f0,d2 + lsr #4,d2 + sub d0,d2 + bpl.s .gok + moveq #0,d2 +.gok ; + and #$0f,d3 + sub d0,d3 + bpl.s .bok + moveq #0,d3 +.bok ; + lsl #8,d1 + lsl #4,d2 + or d3,d2 + or d2,d1 + or #$8000,d1 + ; + move d1,(a1)+ + cmp.l a3,a0 + bcs.s .loop2 + ; + addq #1,d0 + cmp #16,d0 + bcs.s .loop + ; + move.l a1,map_rgbsend + ; + rts + +map_rgbsend dc.l 0 + +dispoff tst dispnest + bne.s .skip + bsr vwait + move #$01a0,$dff096 ;bp/cop/spr off! +.skip addq #1,dispnest + rts + +dispon subq #1,dispnest + bgt.s .skip + bsr vwait + move.l coplist(pc),$dff080 + move #0,$dff088 + move #$8080,$dff096 ;cop on! + move #0,$dff088 +.skip rts + +forbid 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 + +permit push + move.l rawstuff,a0 + clr.l $70(a0) + move.l 4.w,a6 + jsr -138(a6) + bsr disownblitter + pull + 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 + +tbeintserver dc.l 0,0 + dc.b 2,0 + dc.l 0 +tbeintdata dc.l tbuff +tbeintcode dc.l tbe + +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 + +ownblitter push + move.l grbase,a6 + jsr -456(a6) + btst #6,$dff002 +.bwait btst #6,$dff002 + bne.s .bwait + pull + rts + +disownblitter push + btst #6,$dff002 +.bwait btst #6,$dff002 + bne.s .bwait + move.l grbase,a6 + jsr -462(a6) + pull + rts + +makecoloffs push + ; + lea coloffs,a0 + moveq #2,d0 + moveq #3,d2 +.loop addq.l #4,d0 + moveq #31,d1 +.loop2 move.l d0,(a0)+ + addq.l #4,d0 + dbf d1,.loop2 + dbf d2,.loop + ; + pull + 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 + +calcbpos ;also: calc qstripbot, con0poke... + ; + move window1+wi_h,d0 + add d0,d0 + ext.l d0 + add.l qstrip(pc),d0 + move.l d0,qstripbot + ; + move #$100,con0poke + move floorflag(pc),d0 + and roofflag(pc),d0 + bne.s .cp + move #$9f0,con0poke ;one of them is cop strip! +.cp ; + move window1+wi_y,d0 + subq #4,d0 + move d0,minbpos + tst twowins + beq.s .p1 + ; + move window2+wi_y,d0 + add window2+wi_bh,d0 + addq #4,d0 + move d0,maxbpos + rts + ; +.p1 move window1+wi_y,d0 + add window1+wi_bh,d0 + addq #4,d0 + move d0,maxbpos + ; + rts + +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 + ; + 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 + +chatmap dc.l 0 + +initdisplay push + ; + lea grname,a1 + move.l 4.w,a6 + jsr -408(a6) + move.l d0,grbase + ; + move.l d0,a6 + move.l 34(a6),oldview + sub.l a1,a1 + jsr -222(a6) ;loadview + ; + move.l #80*2*5,d0 + moveq #2,d1 + allocmem chatplanes + move.l d0,chatmap + ; + move d0,chatplanes+6 + swap d0 + move d0,chatplanes+2 + swap d0 + add.l #80,d0 + move d0,chatplanes+14 + swap d0 + move d0,chatplanes+10 + ; + bsr chatcls + ; + move.l #copinitf-copinit,d0 + moveq #2,d1 + allocmem copinit + move.l d0,coplist + ; + move.l d0,a1 + lea copinit,a0 + lea copinitf,a2 + ; +.loop cmp.l a2,a0 + bcc.s .done + move.l (a0)+,(a1)+ + bra.s .loop +.done ; + add.l #sl1-copinit,d0 + move.l d0,slice1 + add.l #sl2-sl1,d0 + move.l d0,slice2 + add.l #cstop-sl2,d0 + move.l d0,copstop + ; + move.l copstop,d0 + move.l slice1,a0 + move.l slice2,a1 + ; + move d0,72+6(a0) + move d0,72+6(a1) + swap d0 + move d0,72+2(a0) + move d0,72+2(a1) + ; + jsr -270(a6) + jsr -270(a6) + move.l coplist,$dff080 + move #0,$dff088 + ; + ;move #0,$dff1dc + pull + rts + +allocwbmap move wi_w(a2),d0 + mulu wi_pw(a2),d0 + move d0,wi_bw(a2) + ; + move wi_h(a2),d0 + mulu wi_ph(a2),d0 + move d0,wi_bh(a2) + ; + mulu #40*7,d0 + ; + move.l #$10002,d1 + move.l d0,wi_bmapmem(a2) + allocmem wi_bmap + move.l d0,wi_bmap(a2) + ; + move.l #40*7*7,d0 + moveq #2,d1 + allocmem wi_strip + move.l d0,wi_strip(a2) + ; + rts + +windowiff ;draw iff into window! + ; + move.l wi_iff(a2),a0 + cmp.l #1,a0 + bne.s .do + rts + ; +.do move.l wi_bmap(a2),a1 + ; + move 2(a0),d1 + cmp #240,d1 + bcs.s .skip + move #240,d1 +.skip move #120,d2 + lsr #1,d1 + sub d1,d2 + mulu #7*40,d2 + add.l d2,a1 + ; +decodeiff ;for 40 columns... + ; + ;a0=trimmed IFF file, + ;a1=destination bitmap... + ; + move.l a2,-(a7) + moveq #40,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 + ; +.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 d7,a1 + dbf d5,.loop4 + dbf d1,.loop5 + ; + move.l (a7)+,a2 + rts + +plotwbmap ;OK, plot colours on bitmap! + ; + move.l wi_iff(a2),d0 + bne windowiff + ; + move.l wi_bmap(a2),a0 + move wi_x(a2),d0 + move d0,d1 + lsr #3,d0 + not d1 + and #7,d1 + moveq #127,d7 ;colour + move wi_w(a2),d6 ;width + subq #1,d6 + ; +.wloop move wi_pw(a2),d5 + subq #1,d5 + ; +.wloop2 move d7,d4 + moveq #6,d3 + ; +.dloop bclr d1,0(a0,d0) + lsr #1,d4 + bcc.s .dskip + bset d1,0(a0,d0) +.dskip lea 40(a0),a0 + dbf d3,.dloop + ; + lea -40*7(a0),a0 + subq #1,d1 + bpl.s .dskip2 + moveq #7,d1 + addq #1,d0 +.dskip2 dbf d5,.wloop2 + ; + subq #1,d7 + dbf d6,.wloop + ; + move wi_bh(a2),d0 ;how many to copy + subq #1,d0 + bsr wcopy + ; + move.l wi_bmap(a2),a0 + move.l wi_strip(a2),a1 + move wi_bh(a2),d0 + lsr #2,d0 + mulu #7*40,d0 + add.l d0,a0 + move #7*7*10-1,d2 + ; +.loop move.l (a0)+,(a1)+ + dbf d2,.loop + ; + rts + +wcopy ;copy top scanline to next d0 scanlines + ; + move.l wi_bmap(a2),a0 + mulu #10*7,d0 + subq #1,d0 + lea 40*7(a0),a1 +.cbloop move.l (a0)+,(a1)+ + dbf d0,.cbloop + ; + rts + +freewindow ;window in a0 + ; + push + move.l a0,a2 + move.l wi_bmap(a2),d0 + beq.s .no1 + clr.l wi_bmap(a2) + move.l d0,a1 + freemem wi_bmap +.no1 move.l wi_strip(a2),d0 + beq.s .no2 + clr.l wi_strip(a2) + move.l d0,a1 + freemem wi_strip +.no2 move.l wi_cop1(a2),d0 + beq.s .no3 + clr.l wi_cop1(a2) + move.l d0,a1 + freemem wi_cop +.no3 pull + rts + +makewindow ;make window + ; + ;a0=window struct! + ; + push + ; + move.l a0,a2 + ; + bsr allocwbmap + bsr plotwbmap + ; + tst.l wi_iff(a2) + beq wchunky + ; + ;make a palette coplist for the window + ; + ;to write 32 colours... + ;set bank, write hi nybs, set bank, write lo nybs... + ;=66 copins. + ;*4=264 total + ;+1 for final wait +3 for final copjump=268 + ; + move.l #268<<2,d0 + move.l d0,wi_copmem(a2) + moveq #2,d1 + allocmem wi_iffcop + move.l d0,wi_cop(a2) + move.l d0,wi_cop1(a2) + move.l d0,wi_cop2(a2) + move.l d0,a0 ;dest + move.l wi_pal(a2),a1 ;palette! + ; + moveq #0,d0 ;bank + moveq #3,d3 ;something. + ; +.loop move #$106,(a0)+ + move d0,(a0)+ + move #$180,d1 + moveq #31,d2 +.hiloop move d1,(a0)+ + move (a1),(a0)+ + addq #4,a1 + addq #2,d1 + dbf d2,.hiloop + ; + lea -128+2(a1),a1 + move #$106,(a0)+ + bset #9,d0 + move d0,(a0)+ + bclr #9,d0 + move #$180,d1 + moveq #31,d2 +.loloop move d1,(a0)+ + move (a1),(a0)+ + addq #4,a1 + addq #2,d1 + dbf d2,.loloop + subq #2,a1 + ; + add #$2000,d0 ;next bank! + dbf d3,.loop + ; + move.l #$fffffffe,(a0)+ + move.l #$00840000,(a0)+ + move.l #$00860000,(a0)+ + move.l #$008a0000,(a0)+ + pull + rts + ; +wchunky ;how many copins on one line? + ; + move wi_w(a2),d0 + move d0,d1 + subq #1,d0 + lsr #5,d0 ;how many bank changes per line! + addq #3,d0 ;1 waits - 1 eor, 1 init bank select + add d1,d0 ;+colpokes + ; + move d0,d1 + lsl #2,d1 + move d1,wi_copmod(a2) + ; + mulu wi_h(a2),d0 + addq #4,d0 ;1 wait and cop jump at end + ; + lsl.l #2,d0 ;4 bytes/copins + moveq #2,d1 ;cop in chip + move.l d0,wi_copmem(a2) + lsl.l #1,d0 ;2 coplists! + allocmem wi_chunkycop + move.l d0,wi_cop(a2) + move.l d0,wi_cop1(a2) + ; + move.l d0,a0 + move wi_y(a2),d6 + move wi_h(a2),d7 + subq #1,d7 + move #$111,d3 ;test colour + move #$8000,d4 ;Colour Eor + ; +.hloop ;make one copline... + ; + moveq #127,d0 ;colour reg to poke + move wi_w(a2),d1 + subq #1,d1 + ; +.lloop move d0,d2 + addq #1,d2 + and #31,d2 + bne.s .notnbank + ; + ;new bank.... + move d0,d2 + sub #31,d2 + and #$ffe0,d2 + lsl #8,d2 + or d4,d2 ;eor bank + move #$106,(a0)+ ;bank select + move d2,(a0)+ + ; +.notnbank move d0,d2 + and #31,d2 + add d2,d2 + add #$180,d2 + move d2,(a0)+ ;colour poke + move d3,(a0)+ + add #$111,d3 + subq #1,d0 + dbf d1,.lloop + ; + bsr .makewait + ; + ;ok, now do EOR! + move #$10c,(a0)+ + move d4,(a0)+ + bchg #15,d4 + ; + dbf d7,.hloop + ; + bsr .makewait + ; + move.l #$00840000,(a0)+ + move.l #$00860000,(a0)+ + move.l #$008a0000,(a0)+ + ; + ;OK, 1 list created...copy to other! + ; + move.l wi_cop1(a2),a0 + move.l a0,a1 + add.l wi_copmem(a2),a1 + move.l a1,wi_cop2(a2) + move.l a1,a3 + ; +.copycop move.l (a0)+,(a3)+ + cmp.l a1,a0 + bcs.s .copycop + ; + pull + rts + +.makewait ; + ;make wait ins. at pos d6 + ; + subq #1,d6 + move.b d6,(a0)+ + move.b #$e1,(a0)+ + move #$fffe,(a0)+ + addq #1,d6 + add wi_ph(a2),d6 + 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,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 + +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 +.ob_colltype dc 8 +p1_ob_collwith dc 6 ;6=combat, 4=game +p1_ob_cntrl dc 1 ;for player 0,1=joyport, 2=keys +.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 1 ;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 ;$40000 +.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 +.ob_colltype dc 16 +p2_ob_collwith dc 5 ;5=combat, 4=game +p2_ob_cntrl dc 0 ;for player 0,1=joyport, 2=keys, 3=serial +.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 1 ;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 $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 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 2 +.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 $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 + +infra_ ds.b oilen + +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 $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 + +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 $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 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 + + ;END OF GAME GOD goes here... + ; +blank1_ ds.b oilen + +bouncy_ 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 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 $60000 +.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 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 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 25 +.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 $50000 +.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 15 +.ob_think dc 0 +.ob_frame dc.l 0 +.ob_framespeed dc.l $5000 +.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 2 +.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 2 +.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 2 +.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 2 +.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 2 +.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 + +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 + +gloombrush incbin gloombrush + +gloom incbin title +gloompal incbin title.pal + +combat incbin combat +combatpal incbin combat.pal + +medplayer incbin medplay +decrm incbin decrm + +castrotsinc incbin castrots.bin +camrotsinc incbin camrots.bin ;256 +camrots2inc incbin camrots2.bin ;1024 +chatfont incbin chatfont.bin + +rgbs16 ds.l 16 +map_rgbs_ ds.w 256*16 diff --git a/gloom.s.ok b/gloom.s.ok new file mode 100644 index 0000000..7ceecb5 --- /dev/null +++ b/gloom.s.ok @@ -0,0 +1,12657 @@ + + ;OK, add a cheat mode! + ; + ;adding chat-line... + ; + ;OK, modem stuff... + ; + ;Once 2 machines are linked, player 1 gets to choose options! + ;player 2 is ignored... + ; + ;player 1 if linked=1, 2 if linked=-1 + + ;********* + ;* GLOOM * + ;********* + ; + ;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! + +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 +onedemo 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 6 +grdshft equ 8 +darkshft equ 7 ;smaller=smaller range=faster! +maxz equ 16<>1 + ; +linemod equ 40*7 + + 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 ;nomralized 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_copmod 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 ; + 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 bsr execscript_med +.wmf tst fadevol + bne.s .wmf + tst twowins + beq.s .n22 + bsr swaphflags +.n22 bsr bigfont + bra .intro + ; +exittoos bsr freeobjlist2 + move #$4000,$dff09a + move.l ciaa,a0 + movem.l rawstuff,d0-d1 + movem.l d0-d1,$64(a0) + move #$c000,$dff09a + jsr permit + jsr finitdisplay + jsr finitvbint + jsr finitsfx + jsr finitser + jsr freememlist + jsr undir + ; + 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 + ; + move.l player1,a5 + move.l ob_palette(a5),-(a7) + move.l #palettesw,ob_palette(a5) + move.l ob_window(a5),a2 + jsr plotwbmap + ; + tst twowins + beq .p1 + ; + move.l player2,a5 + move.l ob_palette(a5),-(a7) + move.l #palettesw,ob_palette(a5) + move.l ob_window(a5),a2 + jsr plotwbmap +.p1 ; + bsr drawall2 + ; + move.l player1,a5 + lea gamemenu,a4 + move.l ob_window(a5),a6 + jsr initmenu + ; +.loop bsr selmenu + beq .done + ; + subq #1,d0 + bne .notpsize + bsr newpsize + 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 bsr finitmenu + ; + tst twowins + beq.s .p12 + ; + move.l player2,a5 + move.l (a7)+,ob_palette(a5) + move.l ob_window(a5),a2 + jsr plotwbmap + bsr initstats + bsr showstats +.p12 ; + move.l player1,a5 + move.l (a7)+,ob_palette(a5) + move.l ob_window(a5),a2 + jsr plotwbmap + bsr initstats + bsr showstats + ; + move #$20,$dff09a + ; + move (a7)+,linked + move (a7)+,framecnt + clr paused + ; + move #$8020,$dff09a + ; + rts + +freewindows lea window1,a0 + jsr freewindow + tst twowins + beq.s .p1 + lea window2,a0 + jsr freewindow +.p1 rts + +largewin move.l player1,a5 + bsr large + tst twowins + beq refresh + move.l player2,a5 + bsr large + bra refresh + +large move.l ob_window(a5),a6 + move wi_pw(a6),d2 + ; + cmp #2,d2 + beq .lhr + ; + ;large lo-res window! + ; +.lores move #324,d0 + move #240,d1 + bra thinkwin + ; +.lhr bsr swappsize + bra.s .lores + ; + move #180,d0 + move #240,d1 + bra thinkwin + +newwsize ;window size stuff! + ; + move.l player1,a5 + bsr swapwsize + tst twowins + beq refresh + move.l player2,a5 + bsr swapwsize + bra refresh + +swapwsize ;increment window size! + ; + move.l ob_window(a5),a6 + movem wi_w(a6),d0-d1 ;w,h + move wi_pw(a6),d2 + mulu d2,d0 + mulu d2,d1 + cmp #2,d2 + beq .hr + ; + ;lo-res! + ; + cmp #318,d0 + bcs.s .inc + move #132,d0 + move d0,d1 + bra thinkwin +.inc add #24,d0 + move d0,d1 + cmp #240,d1 + bls thinkwin + move #240,d1 + bra thinkwin + ; +.hr cmp #180,d0 + bcs.s .inc2 + tst twowins + bne .min + add #18,d1 + cmp #240,d1 + bls thinkwin +.min move #132,d0 + move d0,d1 + bra thinkwin +.inc2 add #24,d0 + move d0,d1 + ; +thinkwin move #180,d3 ;max width! + cmp #2,d2 + beq .gmax + move #318,d3 +.gmax cmp d3,d0 + bls .nm + move d3,d0 +.nm ; + cmp #240,d1 + bls .n240 + move #240,d1 +.n240 tst twowins + beq.s .ggt + move #120,d1 +.ggt ; + move #160,d3 + move d0,d4 + lsr #1,d4 + sub d4,d3 ;wi_x + move d3,wi_x(a6) + ; + ext.l d0 + divu d2,d0 + move d0,wi_w(a6) + ; + tst twowins + bne.s .skip3 + ; + move #cy,d3 + move d1,d4 + lsr #1,d4 + sub d4,d3 + move d3,wi_y(a6) + ; +.skip3 ext.l d1 + divu d2,d1 + move d1,wi_h(a6) + ; + rts + +newpsize ;toggle pixel size between 2 and 3 + ; + ;copy windows to temp so we can free 'em up later + ; + move.l player1,a5 + bsr swappsize + tst twowins + beq refresh + move.l player2,a5 + bsr swappsize + ; +refresh jsr dispoff + bsr finitmenu + ; + bsr freewindows + bsr putwindow + ; + lea window1,a0 + jsr makewindow + lea window1,a0 + jsr showwindow + ; + tst twowins + beq.s .p1 + ; + lea window2,a0 + jsr makewindow + lea window2,a0 + jsr showwindow + ; +.p1 jsr calcbpos + ; + lea gamemenu,a4 + lea window1,a6 + jsr initmenu2 + ; + bsr drawall2 + jsr dispon + rts + +swappsize move.l ob_window(a5),a6 + movem wi_w(a6),d0-d1 ;w,h + move wi_pw(a6),d2 + mulu d2,d0 + mulu d2,d1 + eor #1,d2 ;2,3... + move d2,wi_pw(a6) + move d2,wi_ph(a6) + ; + bra thinkwin + +showflag dc 0 + +showit ;don't show if beam in the way! + ; + move showflag(pc),d0 + beq.s .rts + ; + move.l $dff004,d0 + lsr.l #8,d0 ;beampos + and #$1ff,d0 + ; + cmp minbpos(pc),d0 + bcs.s .show + cmp maxbpos(pc),d0 + bcs.s .rts + ; + ;cmp minbpos(pc),d0 + ;bcc.s .rts + ; +.show clr showflag + lea window1,a0 + jsr showwindowq + lea window2,a0 + jmp showwindowq + ; +.rts rts + +drawall2 bsr drawall + bsr drawall + bra vwait + +drawall ; +.wait move doneflag(pc),d0 + beq.s .wait ;wait for update + clr doneflag +.wait2 move showflag(pc),d0 + bne.s .wait2 + ; + move.l memory(pc),memat + move.l player1(pc),a5 + bsr calcscene + move.l player1(pc),a5 + bsr blitscene + move.l player1(pc),a5 + bsr drawscene + ; + move twowins(pc),d0 + beq.s .show + ; + move.l memory(pc),memat + move.l player2(pc),a5 + bsr calcscene + move.l player2(pc),a5 + bsr blitscene + move.l player2(pc),a5 + bsr drawscene + ; +.show st showflag + rts + +resetplayer st ob_update(a5) + clr ob_mega(a5) + clr ob_thermo(a5) + clr ob_infra(a5) + clr ob_invisible(a5) + clr ob_messtimer(a5) + clr ob_pixsize(a5) + clr ob_pixsizeadd(a5) + clr ob_bouncecnt(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 ;a6=window, 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 + ; +.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 .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 wi_bmap(a6),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 ; + rts + +initstats ; + ;health... + move.l ob_window(a5),a0 + moveq #2,d0 + add wi_x(a0),d0 + move.l wi_bmap(a0),a1 + move.l font(pc),a0 + moveq #2,d1 + moveq #39,d2 + bsr blit + ; + ;weapon... + move.l ob_window(a5),a0 + moveq #2,d0 + add wi_x(a0),d0 + move.l wi_bmap(a0),a1 + move.l font(pc),a0 + moveq #12,d1 + moveq #44,d2 + bra blit + +putstrip ;a0=window + ; + move.l wi_bmap(a0),a1 + move wi_bh(a0),d0 + lsr #2,d0 + mulu #7*40,d0 + add.l d0,a1 ;dest + move.l wi_strip(a0),a0 ;src + ; + btst #6,$dff002 +.bwait btst #6,$dff002 + bne.s .bwait + ; + move.l #$9f00000,$dff040 + move.l #-1,$dff044 + move #0,$dff064 + move #0,$dff066 + move.l a0,$dff050 + move.l a1,$dff054 + move #(7*7)<<6+20,$dff058 + rts + +loff dc 0 + +showstats ;a5=player + ; + ;ok, hitpoints... + ; + ;lagtime... + move.l ob_window(a5),a0 + moveq #2,d0 + add wi_x(a0),d0 + move.l wi_bmap(a0),a1 + move.l font(pc),a0 + moveq #22,d1 + move lagtime(pc),d2 + bsr blit + ; + move.l ob_window(a5),a0 + moveq #44,d5 + add wi_x(a0),d5 + moveq #40,d4 + moveq #0,d6 + move ob_hitpoints(a5),d7 + ; +.hploop cmp d7,d6 + bcs.s .hpskip + cmp #25,d7 + bcc.s .hpdone + moveq #41,d4 + moveq #25,d7 + bra.s .hploop + ; +.hpskip move.l font(pc),a0 + move.l ob_window(a5),a1 + move.l wi_bmap(a1),a1 + move d5,d0 + moveq #2,d1 + move d4,d2 + bsr blit + addq #2,d5 + addq #1,d6 + bra.s .hploop +.hpdone ; + ;show lives remaining... + ; + move.l ob_window(a5),a0 + move wi_bw(a0),d5 + add wi_x(a0),d5 + move ob_lives(a5),d7 + beq.s .lvdone + subq #1,d7 +.lvloop ; + move.l font(pc),a0 + move.l ob_window(a5),a1 + move.l wi_bmap(a1),a1 + subq #8,d5 + move d5,d0 + moveq #2,d1 + moveq #43,d2 + bsr blit + dbf d7,.lvloop +.lvdone ; + ;show weapons! + ; + move.l ob_window(a5),a0 + moveq #44,d5 + add wi_x(a0),d5 + moveq #49,d4 + sub ob_weapon(a5),d4 ;0...4 + moveq #1,d7 +.wploop ; + move.l font(pc),a0 + move.l ob_window(a5),a1 + move.l wi_bmap(a1),a1 + move d5,d0 + moveq #12,d1 + moveq #50,d2 + cmp.b ob_reload(a5),d7 + blt.s .nowp + move d4,d2 +.nowp bsr blit + ; + add #10,d5 + addq #1,d7 + cmp #6,d7 + bcs.s .wploop + ; + rts + +blit ;a0=shapetable to blit, a1=bitmap, d0=X, d1=Y, d2=char + ; + add.l 4(a0,d2*4),a0 + ; + mulu #280,d1 + add.l d1,a1 + move d0,d2 + asr #3,d2 + add d2,a1 ;dest! + move.l a0,a2 + add.l (a0),a2 + lea 8(a0),a3 + addq #4,a0 + and #15,d0 + ror #4,d0 + ; + btst #6,$dff002 +.bwait btst #6,$dff002 + bne.s .bwait + ; + move.l a2,$dff050 + move.l a3,$dff04c + move.l a1,$dff048 + move.l a1,$dff054 + ; + move d0,$dff042 + or blitmode(pc),d0 + move d0,$dff040 + move.l #$ffff0000,$dff044 + moveq #-2,d0 + move d0,$dff064 + move d0,$dff062 + moveq #38,d0 + sub (a0)+,d0 + move d0,$dff060 + move d0,$dff066 + move (a0)+,$dff058 + ; + rts + +blitmode dc $fca + +pixsize dc 0 ;pixel size...at least 2! + +pixelate ;pixel out the coplist...d0=pixelsize + ; + move d0,pixsize + move d0,d1 + ; + ;pixel out vertically, then horizontally + ; + move.l cop(pc),a0 + lea coloffs(pc),a1 + moveq #0,d2 ;x + move d1,d6 + lsr #1,d6 +.forx ; + move.l a0,a3 + lea 0(a1,d2*4),a2 + add.l (a2),a3 + ; + move d2,d5 + add d6,d5 + cmp width(pc),d5 + ble.s .xok + move width(pc),d5 +.xok sub d2,d5 + ble .done + subq #1,d5 + ; +.loop2 moveq #0,d3 + move.l a3,a4 + move.l a0,a5 + add.l (a2)+,a5 + move d1,d7 + lsr #1,d7 ;first Y add +.fory ; + move (a4),d0 ;start column! + move d3,d4 + add d7,d4 + cmp hite(pc),d4 + ble.s .yok + move hite(pc),d4 +.yok sub d3,d4 + ble .nextx + subq #1,d4 + ; +.loop move d0,(a5) + add copmod(pc),a4 + add copmod(pc),a5 + ; + dbf d4,.loop + ; +.nexty add d7,d3 + move d1,d7 + bra.s .fory + ; +.nextx dbf d5,.loop2 + ; + add d6,d2 + move d1,d6 + bra.s .forx + ; +.done rts + +makeqstrip ; + ;do a simple roof/floor strip for blitter to wack in... + ; + cmp #$100,con0poke + bne.s .doit + rts + ; +.doit move.l qstrip(pc),a0 + move.l darktable(pc),a1 + move.l palette(pc),a2 + move.l qstripbot(pc),a4 + moveq #0,d2 + ; + move floorflag(pc),d0 + bne.s .fdone + ; + move camy(pc),d0 + neg d0 + ext.l d0 + lsl.l #focshft,d0 + ; + move.b qcols+1(pc),d2 + move.l qstripbot(pc),a4 + move maxy(pc),d1 + ; +.floop subq #1,d1 + beq.s .fdone + ; + move.l d0,d3 + divs d1,d3 + cmp #maxz,d3 + bcc .fdone + ; + move 0(a1,d3*2),d3 ;darkness (0...15) + move.l 0(a2,d3*4),a3 ;pal to use + move 0(a3,d2*2),-(a4) ;colour! + ; + bra.s .floop + ; +.fdone move roofflag(pc),d0 + bne.s .rdone + ; + move #-256,d0 + sub camy(pc),d0 + ext.l d0 + lsl.l #focshft,d0 ;cam Y + ; + move.b qcols(pc),d2 + ; + move miny(pc),d1 ;SY + ; +.rloop beq.s .rdone + ; + move.l d0,d3 + divs d1,d3 + cmp #maxz,d3 + bcc .rdone + ; + move 0(a1,d3*2),d3 ;darkness (0...15) + move.l 0(a2,d3*4),a3 ;pal to use + move 0(a3,d2*2),(a0)+ ;colour! + ; + addq #1,d1 + bra.s .rloop +.rdone ; + moveq #0,d0 +.loop cmp.l a4,a0 + bcc.s .done + move.l d0,(a0)+ + bra.s .loop + ; +.done 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 copmod(pc),d1 + move d1,flatyadd2 + ; + move d7,d0 + add midy(pc),d0 + mulu copmod(pc),d0 + add.l cop(pc),d0 + add.l coloffs(pc),d0 + move.l d0,a2 +.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 + ; + ;move.l d4,d2 + ;asr.l #1,d2 + ;add.l d2,d0 + ; + ;move.l d6,d2 + ;asr.l #1,d2 + ;add.l d2,d1 + ; + swap d0 + add camx(pc),d0 + swap d1 + add camz(pc),d1 + swap d4 + swap d6 + ; + move d7,-(a7) + moveq #127,d7 + moveq #0,d2 + moveq #0,d3 + ; + move.l a2,a3 + ; + move wdiv32(pc),-(a7) + ; +.hloop2 moveq #31,d5 + ; +.hloop tst (a3) ;check destination! + 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 0(a5,d3*2),(a3) + addx d2,d1 + addq #4,a3 + dbf d5,.hloop + bra.s .hhh + ; +.skip add.l d4,d0 + addx d2,d0 + add.l d6,d1 + addx d2,d1 + addq #4,a3 + dbf d5,.hloop + ; +.hhh addq #4,a3 + subq #1,(a7) + bgt.s .hloop2 + bne.s .kl + ; + move wrem32(pc),d5 + bpl.s .hloop + ; +.kl 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 + +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.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) + ; + tst finished2 + bne exec_loop + ; + 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 + bsr 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 + bsr 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 + +savernd lea rndtable(pc),a0 + lea rndback(pc),a1 + moveq #(rndtablef-rndtable)/2-1,d0 +.loop move (a0)+,(a1)+ + dbf d0,.loop + rts + +loadrnd lea rndback(pc),a0 + lea rndtable(pc),a1 + moveq #(rndtablef-rndtable)/2-1,d0 +.loop move (a0)+,(a1)+ + dbf d0,.loop + rts + +rndtable ds.w 55 +k_index dc.l 0 +j_index dc.l 0 +rndtablef + +rndback ds.b rndtablef-rndtable + +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 + +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 + +currplayer dc.l 0 + +calcscene ;a5=player object + ; + move #$20,$dff09a + ; + move.l a5,currplayer + move.l ob_palette(a5),palette + move ob_thermo(a5),thermo + move ob_infra(a5),infra + move ob_pixsize(a5),pixsize + ; + clr.l shapelist + move.l a5,a0 + bsr calccamera + bsr makewalls + ; + lea objects(pc),a5 + ; +.loop move.l (a5),a5 + tst.l (a5) + beq.s .done + cmp.l currplayer(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 bclr #7,ob_update(a5) + beq.s .noupdate + ; + bclr #7,ob_update+1(a5) + beq.s .stats + ; + move.l ob_window(a5),a2 + moveq #9,d0 + bsr wcopy + bsr initstats + ; +.stats bsr showstats + ; +.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 + ; + move.l ob_window(a5),a0 + bsr dbwindow + ; + bsr castwalls + bsr makeqstrip + bsr renderwalls + ; + 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 move roofflag(pc),d0 + ble.s .noflat + ; + move #-255,d0 + sub camy(pc),d0 + moveq #1,d1 + move miny(pc),d7 + move.l roof(pc),a0 + bsr flat + ; +.noflat bsr drawshapes + bsr drawblood + ; + move.l currplayer(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 chatinget(pc),d0 + cmp chatinput(pc),d0 + beq.s .rts + and #31,d0 + lea chatin(pc),a0 + move.b 0(a0,d0),d0 + addq #1,chatinget + 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 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 + ; +.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 ; +.waitser bsr serget + bpl.s .sergot + ; + ;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 .waitser + ; +.sergot lea joyxs(pc),a0 + tst.b d0 + bpl .djoy + and #$ff,d0 + move d0,finished + moveq #0,d0 + ; +.djoy bsr decodejoy + move.l (a0)+,joyx + move.l (a0),joyb + rts + +escape dc 0 + +readjoys ;fill in appropriate 'joyxn' block...check escape + ; + qkey $45 + beq.s .noesc + st escape +.noesc move finished(pc),d0 + or finished2(pc),d0 + bne.s .rts + ; + move.l player1(pc),a0 + bsr readjoy + move gametype(pc),d0 + beq.s .rts + move.l player2(pc),a0 + bra readjoy +.rts rts + +vbhandler movem.l d2-d7/a2-a6,-(a7) + ; + subq #1,(a1)+ ;inc/dec frame counters + addq #1,(a1) + ; + ;this done every frame! + bsr showit + bsr chatstuff + bsr sfxvbint + ; + btst #0,framecnt+1 + beq exit_vb + tst paused + bne exit_vb + ; + ;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 + 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 + bsr showit + ; + 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 + +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 + ; + ;bsr pickplayer + ;tst ob_invisible(a0) + ;bne.s .useold ;can't see player! no intelligence... + ;bsr calcangle + ; + 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 + +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 clr ob_rotspeed(a5) ;towards player! + 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 + ; + ;OK, one player game done! + ; +.allover move #2,finished + rts + ; +.not1p move.l player1,a0 + cmp.l a5,a0 + bne.s .goth + move.l player2,a0 +.goth tst ob_hitpoints(a0) + ble.s .allover + rts + +waitrestart bsr getcntrl + ; + bsr checkfireb + beq.s .rts + ; + move ob_weapon(a5),d0 + move d0,-(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 + move (a0)+,ob_x(a5) + move (a0)+,ob_z(a5) + move (a0)+,ob_rot(a5) + ; + move (a7)+,d0 + move d0,ob_weapon(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! + ; + move.l player1,a0 + cmp.l a5,a0 + bne.s .got + move.l player2,a0 +.got tst ob_hitpoints(a0) + ble.s .draw ;it's a draw! + ; +.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 +.draw ; + rts +.notcom ; + ;2 player? do damage to both players! + ; + tst gametype + beq.s .nlink + bsr getother + move #-1,ob_update(a0) + subq #1,ob_lives(a0) + bpl.s .nlink + clr ob_lives(a0) + ; +.nlink move #-1,ob_update(a5) + subq #1,ob_lives(a5) + bgt.s .rts + clr ob_lives(a5) + 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 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 + bra.s .kill + ; +.notfull bsr message + dc.b 'weapon boost!',0 + even + ; +.kill st ob_update(a5) + 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 + bra.s .kill + +invisigot 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 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 + +bouncygot 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 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 .nomega + bsr message + dc.b 'mega wepaon out...',0 + even + ; +.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 + +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 move ob_bounce(a5),d1 + bne.s .nob + rts +.nob add #30,ob_bounce(a5) + move ob_bounce(a5),d1 + and #127,d1 + cmp #30,d1 + bcc .fskip + clr ob_bounce(a5) + clr ob_frame(a5) + bra footstep + ; +.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 + move.l player1(pc),a0 + cmp.l a5,a0 + bne.s .gotcha + move.l player2(pc),a0 +.gotcha 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 + ; +.newok move.l d6,ob_x(a5) + move.l d7,ob_z(a5) + ; +.nosuck rts + +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 + +drawblood lea blood(pc),a5 + ; +.loop move.l (a5),a5 + tst.l (a5) + beq .done + ; + 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 #32,d2 + bcc.s .pix + tst bl_y(a5) + bgt.s .pix + ; + ;blit to screen! + ; + move #$20,$dff09a + ; + bsr savernd + move.l window(pc),a0 + move wi_bh(a0),d0 + subq #8,d0 + bsr rndn + move d0,d2 ;Y + ; + move wi_bw(a0),d0 + subq #8,d0 + bsr rndn ;X + add wi_x(a0),d0 + move d2,d1 + ; + move.l wi_bmap(a0),a1 + move.l font(pc),a0 + moveq #51,d2 + bsr blit + ; + bsr loadrnd + ; + move.l a5,a0 + killitem blood + move.l a0,a5 + ; + move #$8020,$dff09a + bra .loop +.pix ; + add midx(pc),d0 + add midy(pc),d1 + ; + move.l darktable(pc),a0 + move 0(a0,d2*2),d3 + ; + move.l cop(pc),a1 + ; + lea coloffs,a2 + add.l 0(a2,d0*4),a1 + mulu copmod(pc),d1 + ; + move blcols(pc,d3*2),d3 + and bl_color(a5),d3 + move d3,0(a1,d1.l) + bra .loop + ; +.done 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 + ; + addq #1,frame + ; + 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 d0,a5 + ; + cmp wl_lsx(a5),d7 + blt.s .loop2 + cmp wl_rsx(a5),d7 + bgt.s .loop2 + ; + 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<d2 + jsr -156(a6) + move.l d2,vbr + ; + lea ciaaname,a1 + jsr -498(a6) + move.l d0,ciaa + move.l d0,a0 + movem.l $64(a0),d0-d1 + movem.l d0-d1,rawstuff + move #$4000,$dff09a + move.l rawtable(pc),$64(a0) + move.l #rawkeyread,$68(a0) + move #$c000,$dff09a + ; + move.l #8,d0 + move.l #$10002,d1 + allocmem chipzero + move.l d0,chipzero + ; + move.l #256,d0 ;128 words high max! + moveq #2,d1 + allocmem qstrip + move.l d0,qstrip + ; + 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 #16*512*2,d0 ;16 shades, 256 words + moveq #1,d1 + allocmem map_rgbs + ; + move.l #map_rgbs_,map_rgbs + ;move.l d0,map_rgbs + ;add.l #16*512,d0 + move.l d0,map_rgbsw + add.l #16*512,d0 + move.l d0,map_rgbsr + ; + st paused + clr dispnest + clr.l font + bsr initsfx + bsr initvbint + bsr initdisplay + bsr dispoff + ; + lea magicfiles,a0 + bsr loadfiles + ; + move.l magic,a0 + move.l magicpal,a1 + bsr makeiff + bsr showiff + bsr dispon + move #50,vbcounter + ; + lea progfiles,a0 + bsr loadfiles + ; + bsr initbmappal + bsr initmed + bsr initser + bsr calcbaud + bsr makecoloffs + bsr initdarktable + ; + bset #15,remapped + bne .noremap + ; + move.l map_rgbs(pc),a0 + move #-1,(a0)+ + move.l a0,map_rgbsat + ; + 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 + ; + elseif + lea 128*128+groundtile,a2 + move.l a2,a0 + bsr addpal + lea groundtile,a0 + move.l a2,a1 + bsr remap + ; + lea 128*128+ceilingtile,a2 + move.l a2,a0 + bsr addpal + lea ceilingtile,a0 + move.l a2,a1 + bsr remap + elseif + ; + lea qpal,a0 + bsr addpal + lea qcols,a0 + lea qpal,a1 + bsr remap + ; + 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 + ; +.w5sex tst vbcounter + bgt .w5sex + ; + bsr dispoff + lea iffwindow,a0 + bsr freewindow + move.l magic,a1 + freemem magic + move.l magicpal,a1 + freemem magicpal + ; + bra forbid + +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) ;open 'misc/script' + move.l d0,d1 + beq.s .nolock + jsr -36(a6) ;close it! + bra .load + ; +.nolock bsr forbid + bsr checkdatadisk + beq .dataok ;already there? + ; + sub.l a0,a0 + bsr makeiff + bsr showiff + lea diskmenu,a4 + lea iffwindow,a6 + bsr initmenu + bsr dispon + ; + ;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 dispoff + bsr finitmenu + lea iffwindow,a0 + bsr freewindow + ; +.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 + +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 +; ; +;.li move.l lagtext(pc),d0 +; bsr longput +;.rl lea lagtext(pc),a2 +;.rw bsr serwait +; cmp.b (a2)+,d0 +; bne.s .li +; tst.b (a2) +; bne.s .rw +; ; +; bsr qsync + ; +calclag tst linked + bmi .slave + ; + ;MASTER - average out 32 sends of random data! + ; + moveq #0,d6 ;sum + moveq #31,d5 ;32 samples + ; +.mloop moveq #0,d7 + add #69,d0 + bsr vwait + bsr serput + ; +.mwait addq #2,d7 + bsr vwait + bsr vwait + bsr serget + bmi.s .mwait + ; +.got add d7,d6 + dbf d5,.mloop + ; + 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 'no events' 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 + move d0,pput + move d0,rput + ; + move #$c000,$dff09a + ; + rts + +lagtime dc 0 + +qsync ;OK, quick sync up! + ; + tst linked + beq.s .rts + ; +.loop bsr vwait + move.b #$80,d0 + bsr serput +.wait bsr serwait + cmp.b #$80,d0 + bne.s .loop + moveq #0,d0 + bsr serput +.wait2 bsr serwait + cmp.b #$80,d0 + beq.s .wait2 + tst.b d0 + bne.s .loop + ; +.rts rts + +initnewgame move gametype(pc),twowins + beq.s .skip + tst linked + beq.s .skip + ; + ifeq debugser + clr twowins + endc +.skip ; + tst.l map_test + bne.s .skhit + bset #15,gloomdata + bne.s .gotdata + ; +.skhit bsr askdatadisk +.gotdata ; + bsr qsync + ; + move.l medat(pc),a1 + jsr 12(a1) + ;move #$4000,fadevol + cmp #2,gametype + bne normalgame + ; + ;combat type game! + ; + move #6,p1_ob_collwith + move #5,p2_ob_collwith + ; + lea combat,a0 + lea combatpal,a1 + bsr makeiff + bsr showiff + ; + lea combatmenu,a4 + lea iffwindow,a6 + bsr initmenu + ; + bsr dispon + ; +.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 + move #7,comsleft + bsr dispoff + bsr finitmenu + lea iffwindow,a0 + bsr freewindow + ; + move.b comnum(pc),d0 + sub.b #'0',d0 + ext d0 + move d0,p1lives + move d0,p2lives + rts + ; +normalgame ;check for continue offsets in 'gloomgame' file! + ; + 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 ;OK, where to continue from! + 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 tst d7 + beq initpstuff + addq #1,d7 + move.b d7,contmenu + ; + ;OK, need a continue game menu... + ; + lea gloom,a0 + lea gloompal,a1 + bsr makeiff + bsr showiff + ; + lea contmenu,a4 + lea iffwindow,a6 + bsr initmenu + bsr dispon + ; + bsr selmenu + ; + bsr dispoff + bsr finitmenu + lea iffwindow,a0 + bsr freewindow + ; + move curropt(pc),d0 + beq initpstuff + lea conts(pc),a0 + move.l -4(a0,d0*4),a0 +.leol cmp.b #10,(a0)+ + bne.s .leol + move.l a0,scriptat + ; +initpstuff move #4,p1_ob_collwith + move #4,p2_ob_collwith + moveq #3,d0 + tst linked + beq.s .nlink + moveq #6,d0 + moveq #1,d0 +.nlink move d0,p1lives + move d0,p2lives + move #25,p1health + move #25,p2health + move #0,p1weapon + move #0,p2weapon + move.b #ireload,p1reload + move.b #ireload,p2reload + ; + rts + +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 medat(pc),a1 + move.l loadingmed(pc),a0 + jsr 8(a1) ;start title 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 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 + lea gamename,a0 + move.l gloomgame,a1 + moveq #32,d0 + bsr savefile + 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 pic,a0 + move.l picpal,a1 + bsr makeiff + bsr showiff + 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 + +picpath dc.b 'pics/' +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 + +scriptpict ;load an iff + bsr freeiff + lea picname,a1 + bsr fetchrest + move.l a1,-(a7) + bsr permit + lea picpath,a0 + moveq #1,d1 + jsr loadfile + move.l d0,pic + lea pic_pal,a0 + move.l (a7)+,a1 +.loop move.b (a0)+,(a1)+ + bne.s .loop + lea picpath,a0 + moveq #1,d1 + jsr loadfile + move.l d0,picpal + bsr forbid + bra execscript + +scriptdark move.l iffwindow+wi_cop,a0 ;copperlist to darken! + ; + ;bank,32,bank,32... + ; + addq #6,a0 + moveq #3,d0 ;4 lots of 32 colours + moveq #31,d1 + ; + ;skip first 8 + ; + ;subq #8,d1 + ;lea 32(a0),a0 +.loop ; + move (a0),d2 ;hi nyb + move 132(a0),d3 ;lo nyb! + and #$eee,d3 + lsr #1,d3 + move d2,d4 + and #$111,d4 + lsl #3,d4 + or d4,d3 + and #$eee,d2 + lsr #1,d2 + move d2,(a0) + move d3,132(a0) + ; + addq #4,a0 + dbf d1,.loop + moveq #31,d1 + lea 136(a0),a0 + dbf d0,.loop + bra execscript + +text ds.b 64 + +scripttext ;print text on iff + ;a6=window, a4=message, d0=length of message, d6=Y + ; + move #2,pdelay + ; + lea text,a1 + bsr fetchrest + ; + lea iffwindow,a6 + lea text,a4 + move wi_bh(a6),d6 + sub #7,d6 + 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 readmenujoys + tst joyb + movem.l (a7)+,d0-d7/a0-a6 + rts + +waitany movem.l d0-d7/a0-a6,-(a7) +.wait bsr vwait + bsr readmenujoys + tst joyb + beq .wait + ; +.unwait bsr vwait + bsr readmenujoys + tst joyb + bne .unwait + ; + 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 + +getwindow tst twowins + bne.s .p2 + ; + lea defwindow1_1p,a0 + lea window1,a1 + bsr copywin + rts + ; +.p2 lea defwindow1_2p,a0 + lea window1,a1 + bsr copywin + ; + lea defwindow2_2p,a0 + lea window2,a1 + bsr copywin + rts + +putwindow tst twowins + bne.s .p2 + ; + lea window1,a0 + lea defwindow1_1p,a1 + bsr copywin + rts + ; +.p2 lea window1,a0 + lea defwindow1_2p,a1 + bsr copywin + ; + lea window2,a0 + lea defwindow2_2p,a1 + bsr copywin + rts + +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 $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) + ; + add.b #48,d2 + move.b d2,comseriesmap + ; + lea comname(pc),a0 +.loop move.b (a0)+,(a1)+ + bne.s .loop + ; + lea combat,a0 + lea combatpal,a1 + bsr makeiff + bsr showiff + bsr dispon + lea tilenum(pc),a0 + lea floortag(pc),a1 +.loop2 move.b (a0)+,(a1)+ + bne.s .loop2 + bra loadtile + +tilenum dc.b '1',0 + +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 ; + 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 calcpalettes + bsr forbid + bsr makepalettes + bsr dispoff + bsr freewindows + bsr getwindow + ; + ;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 player1(pc),a5 + move.l #window1,ob_window(a5) + move.l ob_window(a5),a0 + bsr makewindow + move.l ob_window(a5),a0 + bsr showwindow + bsr initstats + ; + tst twowins + beq.s .onew + ; + move.l player2(pc),a5 + move.l #window2,ob_window(a5) + move.l ob_window(a5),a0 + bsr makewindow + move.l ob_window(a5),a0 + bsr showwindow + bsr initstats +.onew ; + bsr calcbpos + ; + ;move #$4000,fadevol ;fadeout med! + ; + move.l medat(pc),a1 + clr fadevol + jsr 12(a1) ;stop song + ; + move #$1f3a,d0 + bsr seedrnd + clr.l sucker + clr.l sucking + clr finished + clr finished2 + clr doneflag + clr showflag + clr escape + ; + bsr syncup + ; + clr framecnt + clr paused + bsr drawall2 + bsr dispon + ; + bsr chaton + ; +mainloop bsr drawall + move escape(pc),d0 + beq.s .noesc + bsr dogamemenu + clr escape +.noesc move finished(pc),d0 + beq.s mainloop + ; + st paused + bsr chatoff + ; +.unlk bsr dispoff + bsr freewindows + 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 combatover + ; +.fuck warn #$f08 + warn #$80f + bra.s .fuck + ; +exitgame bsr sendback + bsr freeiff + bra freetiles +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 +.p1p1 ; + tst p1lives + bne.s .losk + tst gametype + beq.s .losk + tst p2lives + beq gameover +.losk tst.l map_test + bne gameover + bra execscript_med + ; +combatover 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),a0 + tst linked + beq .combatmess + lea ploses_(pc),a0 + bgt .combatmess + lea pwins_(pc),a0 + bra .combatmess + ; +.p2lost ;player 2 lost combat game + ; + lea p1wins(pc),a0 + tst linked + beq .combatmess + lea ploses_(pc),a0 + blt .combatmess + lea pwins_(pc),a0 + ; +.combatmess move.l a0,-(a7) + ; + bsr freeiff + bsr freetiles + lea combat,a0 + lea combatpal,a1 + jsr makeiff + jsr showiff + move.l (a7)+,a4 + lea iffwindow,a6 + bsr initmenu + bsr dispon + ; + bsr selmenu + ; + bsr dispoff + bsr finitmenu + lea iffwindow,a0 + bsr freewindow + bra qsync + +flushser moveq #49,d7 +.loop bsr vwait +.loop2 bsr serget + bpl.s .loop2 + dbf d7,.loop + bra qsync + +sendback move linked(pc),d0 + beq.s .rts + ; + move finished(pc),d0 + bset #7,d0 + bne serput + move.b d0,d2 + bsr serput +.wait bsr serwait + cmp.b d0,d2 + bne.s .wait +.rts rts + +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 ; + lea gloom,a0 + lea gloompal,a1 + jsr makeiff + jsr showiff + ; + lea gloombrush,a0 + lea iffwindow,a1 + move.l wi_bmap(a1),a1 + add.l #168*7*40,a1 + bsr decodeiff + ; + bsr dispon + ; + bsr chaton + ; + bsr waitany + ; + lea startmenu,a4 + tst linked + beq.s .use + lea startmenu2,a4 +.use lea iffwindow,a6 + 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 chatoff + clr linked + lea p2ctype(pc),a1 + lea p2_ob_cntrl,a2 + lea p1_ob_cntrl,a3 + bsr inccntrl + bsr dispoff + bsr finitmenu + lea iffwindow,a0 + bsr freewindow + bra dointro + ; +.newgame2 addq #1,d0 + move d0,gametype + bsr chatoff + bsr dispoff + bsr finitmenu + lea iffwindow,a0 + bra freewindow + ; +.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 dispoff + bsr finitmenu + lea iffwindow,a0 + bsr freewindow + 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 dispoff + bsr finitmenu + lea gloom,a0 + lea gloompal,a1 + bsr makeiff + bsr showiff + ; + lea abouttext,a4 + lea iffwindow,a6 + bsr initmenu + move numopts(pc),-(a7) + move #1,numopts + ; + bsr dispon + bsr selmenu + ; + move (a7)+,numopts + ; + bsr dispoff + bsr finitmenu + bra dointro + ; +.notabout subq #1,d0 + bne .sel + ; +.exitgloom moveq #4,d0 + ; +.newgame move d0,gametype + ; + bsr chatoff + jsr dispoff + jsr finitmenu + lea iffwindow,a0 + bra freewindow + +linkup ;link up... + ; + sub.l a0,a0 + bsr makeiff + bsr showiff + lea linkupmenu,a4 + lea iffwindow,a6 + bsr initmenu + ; + bsr dispon + ; +.loop bsr selmenu + cmp #3,d0 + bne.s .notb + bsr optbaud + bra.s .loop + ; +.notb move d0,-(a7) + bsr dispoff + bsr finitmenu + move (a7)+,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) + ; + sub.l a0,a0 + bsr makeiff + bsr showiff + lea linkmenu0,a4 + lea iffwindow,a6 + bsr initmenu + bsr dispon + ; +.loop moveq #-1,d0 + move.l d0,keyoff + ; +.wkey cmp.l keyoff(pc),d0 + beq.s .wkey + ; + move keyoff(pc),d0 + lsl #3,d0 + or keybit(pc),d0 + beq.s .wkey + ; + cmp #$44,d0 + beq.s .done + cmp #$41,d0 + bne.s .notdel + ; + move.l phoneat(pc),a0 + cmp.l #phonenum,a0 + beq.s .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 + ; +.notdel cmp #10,d0 + bhi.s .loop + bcs.s .nz + moveq #0,d0 +.nz add #48,d0 + ; + 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 + ; +.done bsr dispoff + bsr finitmenu + ; + 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 + +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 + ; + 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 .skip + ; + ;I'm player 1 + move #1,linked + bra.s .linked + ; +.skip ;I'm actually player 2! + move #-1,linked + ; +.linked move #-1,p2_ob_cntrl + sub.l a0,a0 + bsr makeiff + bsr showiff + lea incharge(pc),a4 + tst linked + bgt.s .goz + lea notincharge(pc),a4 +.goz lea iffwindow,a6 + bsr initmenu + bsr dispon + ; + bsr chaton + bsr selmenu + ; + bsr dispoff + bra finitmenu + +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 + +waitconnect ;wait for 'CONNECT' to arrive... + ;return eq if OK, else ne if 'esc'ed or not received. + ; + sub.l a0,a0 + bsr makeiff + bsr showiff + lea linkmess,a4 + lea iffwindow,a6 + bsr initmenu + bsr dispon + ; +.retry lea wconnect(pc),a2 + ; +.loop qkey $45 ;ESC? + bne .notok + bsr serget + bpl.s .sgok + bsr vwait + bra.s .loop +.sgok cmp.b (a2)+,d0 + bne.s .retry + tst.b (a2) + bne.s .loop + ; +.ok ;OK, connect xxxx ends with 13,10... + ; +.w10 qkey $45 + bne .notok + bsr serget + bpl.s .sgok2 + bsr vwait + bra.s .w10 +.sgok2 cmp.b #10,d0 + bne.s .w10 + ; + bsr dispoff + bsr finitmenu + moveq #0,d0 + rts + ; +.notok bsr dispoff + bsr finitmenu + 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 5 + +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 + +makeiff ;show an IFF picture...128 colours...320 X 240 + ; + ;a0=trimmed iff, a1=iff's palette + ; + push + movem.l a0-a1,-(a7) + lea iffwindow,a0 + bsr freewindow + movem.l (a7)+,a0-a1 + ; + lea iffwindow,a2 + cmp.l #0,a0 + bne.s .notblank + addq #1,a0 + move.l a0,wi_iff(a2) + move.l #rgbs16,a1 + bra.s .blank + ; +.notblank move.l a0,wi_iff(a2) +.blank move.l a1,wi_pal(a2) + ; + ;copy font palette to IFF palette! + ; + move.l font(pc),d0 + beq.s .nofont + ; + move.l d0,a0 + add.l (a0),a0 + addq #2,a0 + clr.l (a1)+ + moveq #14,d0 +.loop move (a0),(a1)+ + move (a0)+,(a1)+ + dbf d0,.loop +.nofont ; + move.l a2,a0 + bsr makewindow + ; + pull + rts + +showiff push + lea iffwindow,a0 + bsr showwindow + pull + rts + +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 dc.b 'JOYSTICK 1',0 ;3 + ; + dc.b 'PLAYER 2 ' +p2ctype dc.b 'JOYSTICK 2',0 ;4 + ; + 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! + +initmenu clr curropt +initmenu2 ; + ;do a menu...menu in a4, window in a6 + ; + move.l a6,menuwindow + move.b (a4)+,d0 ;how many + ext d0 + move d0,numopts + move d0,-(a7) ;counter + move wi_bh(a6),d6 + move.l wi_bmap(a6),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 #40*7,d0 + mulu fonth(pc),d0 + moveq #2,d1 + allocmem menustrip + move.l d0,(a5)+ + move.l d0,a1 + move.l wi_bmap(a6),a0 + move d6,d0 + mulu #7*40,d0 + add.l d0,a0 + ; + move #40*7,d0 + mulu fonth(pc),d0 + lsr.l #2,d0 + subq #1,d0 + ; +.sloop move.l (a0)+,(a1)+ + dbf d0,.sloop + ; + move.l a4,a0 + moveq #-1,d0 +.cnt addq #1,d0 + tst.b (a0)+ + bne.s .cnt + ; + bsr printmess2 + ; + add fonth(pc),d6 + subq #1,(a7) + bgt.s .loop + addq #2,a7 + ; + ifne debugmem + bsr showmem + lea memasc,a4 + moveq #8,d0 + bsr 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 + bsr printmess2 +.nomemerr ; + endc + ; + rts + + ifne debugmem +showmem push + move.l 4.w,a6 + moveq #1,d1 + jsr -216(a6) + 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 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 #7*40,d6 + move.l menubmap(pc),a1 + add.l d6,a1 + ; + move fonth(pc),d0 + mulu #7,d0 + lsl #6,d0 + or #20,d0 + ; + btst #6,$dff002 +.bwait btst #6,$dff002 + bne.s .bwait + ; + move.l #$9f00000,$dff040 + move.l #-1,$dff044 + move #0,$dff064 + move #0,$dff066 + move.l a0,$dff050 + move.l a1,$dff054 + move d0,$dff058 + ; + move #13,flashdelay + ; + rts + +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 + bsr printmess2 + ; + move #13,flashdelay + ; + rts + +readmenujoys ;if in charge...read and send else rec. + ; + tst linked + beq.s .read + bpl.s .readsend + ; +.get bsr serget + bmi.s .none + bsr serput ;send back! + lea joyx(pc),a0 + jmp decodejoy +.none clr.l joyx + clr.l joyb + rts + ; +.readsend bsr .read + lea joyx(pc),a0 + jsr encodejoy + tst.b d0 + beq.s .rts + bsr serput + bsr serwait ;wait for send back! +.rts rts + ; +.read ;OK, read joystick in port 2, and keyboard! + ;merge into joyx,joyy,joyb + ; + 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 + bne.s .fire + rts +.fire move #-1,joyb + rts + +selmenu ;select a menu item...return item in d0 + ; + ;flash selected option on/off + ; + bsr optoff + ; +.loop1 bsr vwait + bsr readmenujoys + tst joyy + blt .up2 + bgt .down2 + tst joyb + bne .sel2 + ; + subq #1,flashdelay + bgt .loop1 + ; + bsr opton + ; +.loop2 bsr vwait + bsr readmenujoys + tst joyy + blt .up + bgt .down + tst joyb + bne .sel + ; + subq #1,flashdelay + bgt .loop2 + ; + bra selmenu + ; +.up2 bsr opton +.up subq #1,curropt + bpl.s .upskip + move numopts(pc),d0 + subq #1,d0 + move d0,curropt +.upskip bsr vwait + bsr readmenujoys + tst joyy + bmi .upskip + bra selmenu + ; +.down2 bsr opton +.down addq #1,curropt + move curropt(pc),d0 + cmp numopts(pc),d0 + bcs.s .downskip + clr curropt +.downskip bsr vwait + bsr readmenujoys + tst joyy + bgt .downskip + bra selmenu + ; +.sel2 bsr opton +.sel bsr vwait + bsr readmenujoys + tst joyb + bne .sel + move curropt(pc),d0 + rts + +finitmenu ;clean up menu operation + ; + lea menustrips(pc),a5 + move numopts(pc),d2 + subq #1,d2 +.loop addq #4,a5 + move.l (a5)+,a1 + freemem menustrip + dbf d2,.loop + rts + +initbmappal move.l smallfont_,a0 + add.l (a0),a0 + addq #2,a0 + moveq #22,d0 ;23 colours to poke! + move.l coplist(pc),a1 + move.l a1,a2 + move.l a1,a3 + move.l a1,a4 + ; + lea cols1+6-copinit(a1),a1 + lea cols2+6-copinit(a2),a2 + lea cols3+6-copinit(a3),a3 + lea cols4+6-copinit(a4),a4 + ; +.loop move (a0),(a1) + move (a0),(a2) + move (a0),(a3) + move (a0)+,(a4) + addq #4,a1 + addq #4,a2 + addq #4,a3 + addq #4,a4 + dbf d0,.loop + rts + +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 + +keyoff dc 0 +keybit dc 0 + +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! + movem d0-d1,keyoff + ; + ;OK, key down... + 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 + ; + sub.l a0,a0 + bsr makeiff + bsr showiff + lea wpmess,a4 + lea iffwindow,a6 + bsr initmenu + bsr dispon + ; +.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 dispoff + bsr finitmenu + 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 decrm+32 + 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 + +andtable dc $ffff,0 ;rgb and, brightness add...wht + dc $ff00,8 ;red + +makepalettes ; + ;make wht and red pals + ; + ;create pointers... + ; + lea palettes(pc),a0 + move.l map_rgbs(pc),d0 + lea palettesw(pc),a1 + move.l map_rgbsw(pc),d1 + lea palettesr(pc),a2 + move.l map_rgbsr(pc),d2 + ; + moveq #15,d7 + ; +.loop move.l (a0)+,d3 + sub.l d0,d3 ;offset! + move.l d3,d4 + add.l d1,d3 + move.l d3,(a1)+ + add.l d2,d4 + move.l d4,(a2)+ + ; + dbf d7,.loop + ; + move.l map_rgbsend(pc),d7 + sub.l map_rgbs(pc),d7 ;how many bytes! + lsr #1,d7 + subq #1,d7 ;words! + ; + move.l map_rgbsw(pc),a1 + move #$ffff,d1 ;col and + move #0,d2 ;gamma + bsr makeapal + ; + move.l map_rgbsr(pc),a1 + move #$ff00,d1 + moveq #16,d2 + bsr makeapal + ; + rts + +makeapal move.l map_rgbs(pc),a0 + ; +.loop move (a0)+,d4 ;src colour...find briteness + ; + move d4,d5 + move d4,d6 + and #$f00,d4 + lsr #8,d4 + and #$0f0,d5 + lsr #4,d5 + and #$00f,d6 + add d6,d5 + add d5,d4 + add d2,d4 + cmp #16*3,d4 + bcs.s .bok + moveq #16*3-1,d4 +.bok ext.l d4 + divu #3,d4 ;(r+g+b)/3=briteness! + ; + move d4,d5 + move d4,d6 + lsl #8,d4 + lsl #4,d5 + or d6,d5 + or d5,d4 ;RGB + and d1,d4 + ; + move d4,(a1)+ + ; + cmp.l map_rgbsend(pc),a0 + bcs.s .loop + ; + rts + +calcpalettes ;OK, our palette currently runs from: + ; + ;map_rgbs + ; to + ;map_rgbsat + ; + ;append brightness versions... + ; + lea palettes(pc),a2 + move.l map_rgbs(pc),(a2)+ ;first brightness! + move.l map_rgbsat(pc),a1 ;first brightness! + move.l a1,a3 + moveq #1,d0 ;rgb subtract + ; +.loop move.l map_rgbs(pc),a0 + move.l a1,(a2)+ + ; +.loop2 move (a0)+,d1 + move d1,d2 + move d1,d3 + ; + and #$f00,d1 + lsr #8,d1 + sub d0,d1 + bpl.s .rok + moveq #0,d1 +.rok ; + and #$f0,d2 + lsr #4,d2 + sub d0,d2 + bpl.s .gok + moveq #0,d2 +.gok ; + and #$0f,d3 + sub d0,d3 + bpl.s .bok + moveq #0,d3 +.bok ; + lsl #8,d1 + lsl #4,d2 + or d3,d2 + or d2,d1 + or #$8000,d1 + ; + move d1,(a1)+ + cmp.l a3,a0 + bcs.s .loop2 + ; + addq #1,d0 + cmp #16,d0 + bcs.s .loop + ; + move.l a1,map_rgbsend + ; + rts + +map_rgbsend dc.l 0 + +dispoff tst dispnest + bne.s .skip + bsr vwait + move #$01a0,$dff096 ;bp/cop/spr off! +.skip addq #1,dispnest + rts + +dispon subq #1,dispnest + bgt.s .skip + bsr vwait + move.l coplist(pc),$dff080 + move #0,$dff088 + move #$8080,$dff096 ;cop on! + move #0,$dff088 +.skip rts + +forbid 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 + +permit push + move.l 4.w,a6 + jsr -138(a6) + bsr disownblitter + pull + 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 + +ownblitter push + move.l grbase,a6 + jsr -456(a6) + btst #6,$dff002 +.bwait btst #6,$dff002 + bne.s .bwait + pull + rts + +disownblitter push + btst #6,$dff002 +.bwait btst #6,$dff002 + bne.s .bwait + move.l grbase,a6 + jsr -462(a6) + pull + rts + +makecoloffs push + ; + lea coloffs,a0 + moveq #2,d0 + moveq #3,d2 +.loop addq.l #4,d0 + moveq #31,d1 +.loop2 move.l d0,(a0)+ + addq.l #4,d0 + dbf d1,.loop2 + dbf d2,.loop + ; + pull + 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 + +calcbpos ;also: calc qstripbot, con0poke... + ; + move window1+wi_h,d0 + add d0,d0 + ext.l d0 + add.l qstrip(pc),d0 + move.l d0,qstripbot + ; + move #$100,con0poke + move floorflag(pc),d0 + and roofflag(pc),d0 + bne.s .cp + move #$9f0,con0poke ;one of them is cop strip! +.cp ; + move window1+wi_y,d0 + subq #4,d0 + move d0,minbpos + tst twowins + beq.s .p1 + ; + move window2+wi_y,d0 + add window2+wi_bh,d0 + addq #4,d0 + move d0,maxbpos + rts + ; +.p1 move window1+wi_y,d0 + add window1+wi_bh,d0 + addq #4,d0 + move d0,maxbpos + ; + rts + +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 + ; + 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 + +chatmap dc.l 0 + +initdisplay push + ; + lea grname,a1 + move.l 4.w,a6 + jsr -408(a6) + move.l d0,grbase + ; + move.l d0,a6 + move.l 34(a6),oldview + sub.l a1,a1 + jsr -222(a6) ;loadview + ; + move.l #copinitf-copinit,d0 + moveq #2,d1 + allocmem copinit + move.l d0,coplist + ; + move.l d0,a1 + lea copinit,a0 + lea copinitf,a2 + ; +.loop cmp.l a2,a0 + bcc.s .done + move.l (a0)+,(a1)+ + bra.s .loop +.done ; + add.l #sl1-copinit,d0 + move.l d0,slice1 + add.l #sl2-sl1,d0 + move.l d0,slice2 + add.l #cstop-sl2,d0 + move.l d0,copstop + ; + move.l copstop,d0 + move.l slice1,a0 + move.l slice2,a1 + ; + move d0,72+6(a0) + move d0,72+6(a1) + swap d0 + move d0,72+2(a0) + move d0,72+2(a1) + ; + move.l #80*2*5,d0 + moveq #2,d1 + allocmem chatplanes + move.l d0,chatmap + ; + move d0,chatplanes+6 + swap d0 + move d0,chatplanes+2 + swap d0 + add.l #80,d0 + move d0,chatplanes+14 + swap d0 + move d0,chatplanes+10 + ; + bsr chatoff + ; + jsr -270(a6) + jsr -270(a6) + move.l coplist,$dff080 + move #0,$dff088 + ; + pull + rts + +allocwbmap move wi_w(a2),d0 + mulu wi_pw(a2),d0 + move d0,wi_bw(a2) + ; + move wi_h(a2),d0 + mulu wi_ph(a2),d0 + move d0,wi_bh(a2) + ; + mulu #40*7,d0 + ; + move.l #$10002,d1 + move.l d0,wi_bmapmem(a2) + allocmem wi_bmap + move.l d0,wi_bmap(a2) + ; + move.l #40*7*7,d0 + moveq #2,d1 + allocmem wi_strip + move.l d0,wi_strip(a2) + ; + rts + +windowiff ;draw iff into window! + ; + move.l wi_iff(a2),a0 + cmp.l #1,a0 + bne.s .do + rts + ; +.do move.l wi_bmap(a2),a1 + ; + move 2(a0),d1 + cmp #240,d1 + bcs.s .skip + move #240,d1 +.skip move #120,d2 + lsr #1,d1 + sub d1,d2 + mulu #7*40,d2 + add.l d2,a1 + ; +decodeiff ;for 40 columns... + ; + ;a0=trimmed IFF file, + ;a1=destination bitmap... + ; + move.l a2,-(a7) + moveq #40,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 + ; +.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 d7,a1 + dbf d5,.loop4 + dbf d1,.loop5 + ; + move.l (a7)+,a2 + rts + +plotwbmap ;OK, plot colours on bitmap! + ; + move.l wi_iff(a2),d0 + bne windowiff + ; + move.l wi_bmap(a2),a0 + move wi_x(a2),d0 + move d0,d1 + lsr #3,d0 + not d1 + and #7,d1 + moveq #127,d7 ;colour + move wi_w(a2),d6 ;width + subq #1,d6 + ; +.wloop move wi_pw(a2),d5 + subq #1,d5 + ; +.wloop2 move d7,d4 + moveq #6,d3 + ; +.dloop bclr d1,0(a0,d0) + lsr #1,d4 + bcc.s .dskip + bset d1,0(a0,d0) +.dskip lea 40(a0),a0 + dbf d3,.dloop + ; + lea -40*7(a0),a0 + subq #1,d1 + bpl.s .dskip2 + moveq #7,d1 + addq #1,d0 +.dskip2 dbf d5,.wloop2 + ; + subq #1,d7 + dbf d6,.wloop + ; + move wi_bh(a2),d0 ;how many to copy + subq #1,d0 + bsr wcopy + ; + move.l wi_bmap(a2),a0 + move.l wi_strip(a2),a1 + move wi_bh(a2),d0 + lsr #2,d0 + mulu #7*40,d0 + add.l d0,a0 + move #7*7*10-1,d2 + ; +.loop move.l (a0)+,(a1)+ + dbf d2,.loop + ; + rts + +wcopy ;copy top scanline to next d0 scanlines + ; + move.l wi_bmap(a2),a0 + mulu #10*7,d0 + subq #1,d0 + lea 40*7(a0),a1 +.cbloop move.l (a0)+,(a1)+ + dbf d0,.cbloop + ; + rts + +freewindow ;window in a0 + ; + push + move.l a0,a2 + move.l wi_bmap(a2),d0 + beq.s .no1 + clr.l wi_bmap(a2) + move.l d0,a1 + freemem wi_bmap +.no1 move.l wi_strip(a2),d0 + beq.s .no2 + clr.l wi_strip(a2) + move.l d0,a1 + freemem wi_strip +.no2 move.l wi_cop1(a2),d0 + beq.s .no3 + clr.l wi_cop1(a2) + move.l d0,a1 + freemem wi_cop +.no3 pull + rts + +makewindow ;make window + ; + ;a0=window struct! + ; + push + ; + move.l a0,a2 + ; + bsr allocwbmap + bsr plotwbmap + ; + tst.l wi_iff(a2) + beq wchunky + ; + ;make a palette coplist for the window + ; + ;to write 32 colours... + ;set bank, write hi nybs, set bank, write lo nybs... + ;=66 copins. + ;*4=264 total + ;+1 for final wait +3 for final copjump=268 + ; + move.l #268<<2,d0 + move.l d0,wi_copmem(a2) + moveq #2,d1 + allocmem wi_iffcop + move.l d0,wi_cop(a2) + move.l d0,wi_cop1(a2) + move.l d0,wi_cop2(a2) + move.l d0,a0 ;dest + move.l wi_pal(a2),a1 ;palette! + ; + moveq #0,d0 ;bank + moveq #3,d3 ;something. + ; +.loop move #$106,(a0)+ + move d0,(a0)+ + move #$180,d1 + moveq #31,d2 +.hiloop move d1,(a0)+ + move (a1),(a0)+ + addq #4,a1 + addq #2,d1 + dbf d2,.hiloop + ; + lea -128+2(a1),a1 + move #$106,(a0)+ + bset #9,d0 + move d0,(a0)+ + bclr #9,d0 + move #$180,d1 + moveq #31,d2 +.loloop move d1,(a0)+ + move (a1),(a0)+ + addq #4,a1 + addq #2,d1 + dbf d2,.loloop + subq #2,a1 + ; + add #$2000,d0 ;next bank! + dbf d3,.loop + ; + move.l #$fffffffe,(a0)+ + move.l #$00840000,(a0)+ + move.l #$00860000,(a0)+ + move.l #$008a0000,(a0)+ + pull + rts + ; +wchunky ;how many copins on one line? + ; + move wi_w(a2),d0 + move d0,d1 + subq #1,d0 + lsr #5,d0 ;how many bank changes per line! + addq #3,d0 ;1 waits - 1 eor, 1 init bank select + add d1,d0 ;+colpokes + ; + move d0,d1 + lsl #2,d1 + move d1,wi_copmod(a2) + ; + mulu wi_h(a2),d0 + addq #4,d0 ;1 wait and cop jump at end + ; + lsl.l #2,d0 ;4 bytes/copins + moveq #2,d1 ;cop in chip + move.l d0,wi_copmem(a2) + lsl.l #1,d0 ;2 coplists! + allocmem wi_chunkycop + move.l d0,wi_cop(a2) + move.l d0,wi_cop1(a2) + ; + move.l d0,a0 + move wi_y(a2),d6 + move wi_h(a2),d7 + subq #1,d7 + move #$111,d3 ;test colour + move #$8000,d4 ;Colour Eor + ; +.hloop ;make one copline... + ; + moveq #127,d0 ;colour reg to poke + move wi_w(a2),d1 + subq #1,d1 + ; +.lloop move d0,d2 + addq #1,d2 + and #31,d2 + bne.s .notnbank + ; + ;new bank.... + move d0,d2 + sub #31,d2 + and #$ffe0,d2 + lsl #8,d2 + or d4,d2 ;eor bank + move #$106,(a0)+ ;bank select + move d2,(a0)+ + ; +.notnbank move d0,d2 + and #31,d2 + add d2,d2 + add #$180,d2 + move d2,(a0)+ ;colour poke + move d3,(a0)+ + add #$111,d3 + subq #1,d0 + dbf d1,.lloop + ; + bsr .makewait + ; + ;ok, now do EOR! + move #$10c,(a0)+ + move d4,(a0)+ + bchg #15,d4 + ; + dbf d7,.hloop + ; + bsr .makewait + ; + move.l #$00840000,(a0)+ + move.l #$00860000,(a0)+ + move.l #$008a0000,(a0)+ + ; + ;OK, 1 list created...copy to other! + ; + move.l wi_cop1(a2),a0 + move.l a0,a1 + add.l wi_copmem(a2),a1 + move.l a1,wi_cop2(a2) + move.l a1,a3 + ; +.copycop move.l (a0)+,(a3)+ + cmp.l a1,a0 + bcs.s .copycop + ; + pull + rts + +.makewait ; + ;make wait ins. at pos d6 + ; + subq #1,d6 + move.b d6,(a0)+ + move.b #$e1,(a0)+ + move #$fffe,(a0)+ + addq #1,d6 + add wi_ph(a2),d6 + 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,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 + +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 +.ob_colltype dc 8 +p1_ob_collwith dc 6 ;6=combat, 4=game +p1_ob_cntrl dc 0 ;for player 0,1=joyport, 2=keys +.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 +.ob_colltype dc 16 +p2_ob_collwith dc 5 ;5=combat, 4=game +p2_ob_cntrl dc 1 ;for player 0,1=joyport, 2=keys, 3=serial +.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 $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 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 $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 + +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 $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 + +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 $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 + +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 $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 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 0 +.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 -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 10 +.ob_hitpoints dc 100 +.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 rts +.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 $60000 +.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 + +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 + +gloombrush incbin gloombrush + +gloom incbin title +gloompal incbin title.pal + +combat ;incbin combat +combatpal ;incbin combat.pal + +medplayer incbin medplay +decrm incbin decrm + +castrotsinc incbin castrots.bin +camrotsinc incbin camrots.bin ;256 +camrots2inc incbin camrots2.bin ;1024 +chatfont incbin chatfont.bin + +rgbs16 ds.l 16 +map_rgbs_ ds.w 256*16 diff --git a/gloom.s.okay b/gloom.s.okay new file mode 100644 index 0000000..d04d67e --- /dev/null +++ b/gloom.s.okay @@ -0,0 +1,10316 @@ + + ;********* + ;* GLOOM * + ;********* + ; + ;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! + ; +debugser equ 0 +debugmem equ 0 +onedemo equ 0 +aga equ -1 + ; +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 16 ;max rotating thingys. + ; +focshft equ 6 +grdshft equ 8 +darkshft equ 7 ;smaller=smaller range=faster! +maxz equ 16<>1 + ; +linemod equ 40*7 + + 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*15 ;=16 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_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_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_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... +ob_wlevel rs.w 1 ;weapon type (0...4) +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 ;nomralized 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_copmod 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 + +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 + +entrypoint +cli ; + move.l a0,a2 + ; + 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 + ; + clr.l map_test + cmp.b #'@',(a2)+ + bne.s main + lea tempfile,a0 + move.l a0,map_test +.loop move.b (a2)+,(a0) + beq.s main + cmp.b #10,(a0)+ + bne.s .loop + clr.b -(a0) +main ; + bsr bigfont + jsr initmain + ; +.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 + bsr execscript_med + bsr bigfont + ; + bra .intro + ; +exittoos bsr freeobjlist2 + bsr permit + move.l rawstuff,a0 + bclr #0,$3d(a0) + bsr finitser + bsr finitsfx + bsr finitvbint + bsr finitdisplay + bsr freememlist + bsr undir + rts + +; ************* FAST SUBS ******************** + +fastsubs + +smallfont move #6,fontw + move #8,fonth + clr fontoff + rts + +bigfont move #8,fontw + move #10,fonth + move #51,fontoff + 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 = joyf 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 = joyf 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 + +playsfx ;sfx file in a0, vol in d0, priority in d1 + ; + move #$4000,$dff09a + 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 + +sfxvbint movem.l d2-d3/a1-a2,-(a7) + 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 + ; + movem.l (a7)+,d2-d3/a1-a2 + rts + +dogamemenu ; + move #$0020,$dff09a + st paused + move framecnt(pc),-(a7) + move #$8020,$dff09a + ; + move.l player1,a5 + move.l ob_palette(a5),-(a7) + move.l #palettesw,ob_palette(a5) + move.l ob_window(a5),a2 + bsr plotwbmap + ; + tst twowins + beq .p1 + ; + move.l player2,a5 + move.l ob_palette(a5),-(a7) + move.l #palettesw,ob_palette(a5) + move.l ob_window(a5),a2 + bsr plotwbmap +.p1 ; + bsr drawall2 + ; + move.l player1,a5 + lea gamemenu,a4 + move.l ob_window(a5),a6 + jsr initmenu + ; +.loop bsr selmenu + beq .done + ; + subq #1,d0 + bne .notpsize + bsr newpsize + 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 ; + ;MUST BE QUIT GAME! + ; + ;tst linked + ;beq.s .unlk + ;move.b #$80,d0 + ;bsr serput + ; +.unlk move #1,finished + ; +.done bsr finitmenu + ; + tst twowins + beq.s .p12 + ; + move.l player2,a5 + move.l (a7)+,ob_palette(a5) + move.l ob_window(a5),a2 + bsr plotwbmap + bsr initstats + bsr showstats +.p12 ; + move.l player1,a5 + move.l (a7)+,ob_palette(a5) + move.l ob_window(a5),a2 + bsr plotwbmap + bsr initstats + bsr showstats + ; + move #$0020,$dff09a + move (a7)+,framecnt + clr paused + move #$8020,$dff09a + ; + rts + +freewindows lea window1,a0 + bsr freewindow + tst twowins + beq.s .p1 + lea window2,a0 + bsr freewindow +.p1 rts + +largewin move.l player1,a5 + bsr large + tst twowins + beq refresh + move.l player2,a5 + bsr large + bra refresh + +large move.l ob_window(a5),a6 + move wi_pw(a6),d2 + ; + cmp #2,d2 + beq .lhr + ; + ;large lo-res window! + ; + move #324,d0 + move #240,d1 + bra thinkwin + ; +.lhr move #180,d0 + move #240,d1 + bra thinkwin + +newwsize ;window size stuff! + ; + move.l player1,a5 + bsr swapwsize + tst twowins + beq refresh + move.l player2,a5 + bsr swapwsize + bra refresh + +swapwsize ;increment window size! + ; + move.l ob_window(a5),a6 + movem wi_w(a6),d0-d1 ;w,h + move wi_pw(a6),d2 + mulu d2,d0 + mulu d2,d1 + cmp #2,d2 + beq .hr + ; + ;lo-res! + ; + cmp #318,d0 + bcs.s .inc + move #132,d0 + move d0,d1 + bra thinkwin +.inc add #24,d0 + move d0,d1 + cmp #240,d1 + bls thinkwin + move #240,d1 + bra thinkwin + ; +.hr cmp #180,d0 + bcs.s .inc2 + tst twowins + bne .min + add #18,d1 + cmp #240,d1 + bls thinkwin +.min move #132,d0 + move d0,d1 + bra thinkwin +.inc2 add #24,d0 + move d0,d1 + ; +thinkwin move #180,d3 ;max width! + cmp #2,d2 + beq .gmax + move #318,d3 +.gmax cmp d3,d0 + bls .nm + move d3,d0 +.nm ; + cmp #240,d1 + bls .n240 + move #240,d1 +.n240 tst twowins + beq.s .ggt + move #120,d1 +.ggt ; + move #160,d3 + move d0,d4 + lsr #1,d4 + sub d4,d3 ;wi_x + move d3,wi_x(a6) + ; + ext.l d0 + divu d2,d0 + move d0,wi_w(a6) + ; + tst twowins + bne.s .skip3 + ; + move #166,d3 + move d1,d4 + lsr #1,d4 + sub d4,d3 + move d3,wi_y(a6) + ; +.skip3 ext.l d1 + divu d2,d1 + move d1,wi_h(a6) + ; + rts + +newpsize ;toggle pixel size between 2 and 3 + ; + ;copy windows to temp so we can free 'em up later + ; + move.l player1,a5 + bsr swappsize + tst twowins + beq refresh + move.l player2,a5 + bsr swappsize + ; +refresh bsr dispoff + bsr finitmenu + ; + bsr freewindows + bsr putwindow + bsr calcbpos + ; + lea window1,a0 + bsr makewindow + lea window1,a0 + bsr showwindow + ; + tst twowins + beq.s .p1 + ; + lea window2,a0 + bsr makewindow + lea window2,a0 + bsr showwindow + ; +.p1 lea gamemenu,a4 + lea window1,a6 + jsr initmenu2 + ; + bsr drawall2 + bsr dispon + rts + +swappsize move.l ob_window(a5),a6 + movem wi_w(a6),d0-d1 ;w,h + move wi_pw(a6),d2 + mulu d2,d0 + mulu d2,d1 + eor #1,d2 ;2,3... + move d2,wi_pw(a6) + move d2,wi_ph(a6) + ; + bra thinkwin + +drawall2 bsr drawall + bsr drawall +.wait tst showflag + bne.s .wait + rts + +drawall tst doneflag + beq.s drawall ;wait for updated! + clr doneflag + ; + move.l memory(pc),memat + move.l player1(pc),a5 + bsr calcscene + move.l player1(pc),a5 + bsr blitscene + move.l player1(pc),a5 + bsr drawscene + ; + move twowins(pc),d0 + beq.s .p1 + ; + move.l memory(pc),memat + move.l player2(pc),a5 + bsr calcscene + move.l player2(pc),a5 + bsr blitscene + move.l player2(pc),a5 + bsr drawscene + ; +.p1 st showflag + ; + rts + +resetplayer st ob_update(a5) + clr ob_thermo(a5) + clr ob_infra(a5) + clr ob_invisible(a5) + clr ob_messtimer(a5) + clr ob_pixsize(a5) + clr ob_pixsizeadd(a5) + move.l #palettes,ob_palette(a5) + rts + +calcwlevel moveq #0,d0 + move.b ob_weapon(a5),d0 + beq.s .wlg + subq #1,d0 + divu #5,d0 + mulu #20,d0 + ;lsl #4,d0 +.wlg move d0,ob_wlevel(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 ;a6=window, 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 + ; +.loop2 move.b (a4)+,d2 + beq.s .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 .notex + moveq #65+26,d2 + bra.s .notfs +.notex cmp.b #'.',d2 + bne.s .notfs + moveq #65+27,d2 +.notfs and #31,d2 + add #17,d2 +.here add fontoff(pc),d2 + move.l font(pc),a0 + move.l wi_bmap(a6),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.s .loop2 +.done ; + rts + +initstats ; + ;health... + move.l ob_window(a5),a0 + moveq #2,d0 + add wi_x(a0),d0 + move.l wi_bmap(a0),a1 + move.l font(pc),a0 + moveq #2,d1 + moveq #10,d2 + bsr blit + ; + ;weapon... + move.l ob_window(a5),a0 + moveq #2,d0 + add wi_x(a0),d0 + move.l wi_bmap(a0),a1 + move.l font(pc),a0 + moveq #10,d1 + moveq #11,d2 + bsr blit + ; + rts + +putstrip ;a0=window + ; + move.l wi_bmap(a0),a1 + move wi_bh(a0),d0 + lsr #2,d0 + mulu #7*40,d0 + add.l d0,a1 ;dest + move.l wi_strip(a0),a0 ;src + ; + btst #6,$dff002 +.bwait btst #6,$dff002 + bne.s .bwait + ; + move.l #$9f00000,$dff040 + move.l #-1,$dff044 + move #0,$dff064 + move #0,$dff066 + move.l a0,$dff050 + move.l a1,$dff054 + move #(7*7)<<6+20,$dff058 + rts + +loff dc 0 + +showstats ;a5=player + ; + moveq #2,d5 + move ob_hitpoints(a5),d6 + clr loff + bsr showlevel + ; + moveq #10,d5 + move ob_weapon(a5),d6 + lsr #8,d6 + move #51,loff + bsr showlevel + ; + cmp #2,gametype + bne.s .lives + ; + movem wins1(pc),d6-d7 + cmp.l player1,a5 + beq.s .skip + exg d6,d7 +.skip sub d7,d6 + ble.s .rts + ; + subq #1,d6 + move.l ob_window(a5),a0 + move wi_bw(a0),d7 + subq #2,d7 + ; +.loop subq #6,d7 + move d7,d0 + move.l ob_window(a5),a0 + add wi_x(a0),d0 + moveq #2,d1 + moveq #50,d2 + move.l wi_bmap(a0),a1 + move.l font(pc),a0 + bsr blit + dbf d6,.loop + ; +.rts rts + ; +.lives ;show how many lives + move ob_lives(a5),d6 ;how many lives! + beq.s .nolives + ; + move.l ob_window(a5),a0 + move wi_bw(a0),d7 + subq #2,d7 + subq #1,d6 + ; +.lloop subq #6,d7 + move d7,d0 + move.l ob_window(a5),a0 + add wi_x(a0),d0 + moveq #2,d1 + moveq #50,d2 + move.l wi_bmap(a0),a1 + move.l font(pc),a0 + bsr blit + dbf d6,.lloop + ; +.nolives rts + +showlevel moveq #47,d7 + ext.l d6 + divu #5,d6 + subq #1,d6 + bmi.s .skip + ; +.loop moveq #12,d2 + bsr drawh2 + dbf d6,.loop +.skip ; + swap d6 + tst d6 + beq.s .rest + moveq #17,d2 + sub d6,d2 + bsr drawh2 + ; +.rest cmp #47+6*5,d7 + bcc.s .hdone + moveq #17,d2 + bsr drawh2 + bra.s .rest +.hdone ; + rts + +drawh2 add loff(pc),d2 + ; +drawh move.l ob_window(a5),a0 + move d7,d0 + move d5,d1 + add wi_x(a0),d0 + move.l wi_bmap(a0),a1 + move.l font(pc),a0 + addq #6,d7 + ; +blit ;a0=shapetable to blit, a1=bitmap, d0=X, d1=Y, d2=char + ; + add.l 4(a0,d2*4),a0 + ; + mulu #280,d1 + add.l d1,a1 + move d0,d2 + asr #3,d2 + add d2,a1 ;dest! + move.l a0,a2 + add.l (a0),a2 + lea 8(a0),a3 + addq #4,a0 + and #15,d0 + ror #4,d0 + ; + btst #6,$dff002 +.bwait btst #6,$dff002 + bne.s .bwait + ; + move.l a2,$dff050 + move.l a3,$dff04c + move.l a1,$dff048 + move.l a1,$dff054 + ; + move d0,$dff042 + or #$fca,d0 + move d0,$dff040 + move.l #$ffff0000,$dff044 + moveq #-2,d0 + move d0,$dff064 + move d0,$dff062 + moveq #38,d0 + sub (a0)+,d0 + move d0,$dff060 + move d0,$dff066 + move (a0)+,$dff058 + ; + rts + +pixsize dc 0 ;pixel size...at least 2! + +pixelate ;pixel out the coplist! + ; + move pixsize(pc),d1 ;x/y add + ; + ;pixel out vertically, then horizontally + ; + move.l cop(pc),a0 + lea coloffs(pc),a1 + moveq #0,d2 ;x + move d1,d6 + lsr #1,d6 +.forx ; + move.l a0,a3 + lea 0(a1,d2*4),a2 + add.l (a2),a3 + ; + move d2,d5 + add d6,d5 + cmp width(pc),d5 + ble.s .xok + move width(pc),d5 +.xok sub d2,d5 + ble .done + subq #1,d5 + ; +.loop2 moveq #0,d3 + move.l a3,a4 + move.l a0,a5 + add.l (a2)+,a5 + move d1,d7 + lsr #1,d7 ;first Y add +.fory ; + move (a4),d0 ;start column! + move d3,d4 + add d7,d4 + cmp hite(pc),d4 + ble.s .yok + move hite(pc),d4 +.yok sub d3,d4 + ble .nextx + subq #1,d4 + ; +.loop move d0,(a5) + add copmod(pc),a4 + add copmod(pc),a5 + ; + dbf d4,.loop + ; +.nexty add d7,d3 + move d1,d7 + bra.s .fory + ; +.nextx dbf d5,.loop2 + ; + add d6,d2 + move d1,d6 + bra.s .forx + ; +.done rts + +makeqstrip ; + ;do a simple roof/floor strip for blitter to wack in... + ; + cmp #$100,con0poke + bne.s .doit + rts + ; +.doit move.l qstrip(pc),a0 + move.l darktable(pc),a1 + move.l palette(pc),a2 + move.l qstripbot(pc),a4 + moveq #0,d2 + ; + move floorflag(pc),d0 + bne.s .fdone + ; + move camy(pc),d0 + neg d0 + ext.l d0 + lsl.l #focshft,d0 + ; + move.b qcols+1(pc),d2 + move.l qstripbot(pc),a4 + move maxy(pc),d1 + ; +.floop subq #1,d1 + beq.s .fdone + ; + move.l d0,d3 + divs d1,d3 + cmp #maxz,d3 + bcc .fdone + ; + move 0(a1,d3*2),d3 ;darkness (0...15) + move.l 0(a2,d3*4),a3 ;pal to use + move 0(a3,d2*2),-(a4) ;colour! + ; + bra.s .floop + ; +.fdone move roofflag(pc),d0 + bne.s .rdone + ; + move #-256,d0 + sub camy(pc),d0 + ext.l d0 + lsl.l #focshft,d0 ;cam Y + ; + move.b qcols(pc),d2 + ; + move miny(pc),d1 ;SY + ; +.rloop beq.s .rdone + ; + move.l d0,d3 + divs d1,d3 + cmp #maxz,d3 + bcc .rdone + ; + move 0(a1,d3*2),d3 ;darkness (0...15) + move.l 0(a2,d3*4),a3 ;pal to use + move 0(a3,d2*2),(a0)+ ;colour! + ; + addq #1,d1 + bra.s .rloop +.rdone ; + moveq #0,d0 +.loop cmp.l a4,a0 + bcc.s .done + move.l d0,(a0)+ + bra.s .loop + ; +.done 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 copmod(pc),d1 + move d1,flatyadd2 + ; + move d7,d0 + add midy(pc),d0 + mulu copmod(pc),d0 + add.l cop(pc),d0 + add.l coloffs(pc),d0 + move.l d0,a2 +.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 d7,-(a7) + moveq #127,d7 + moveq #0,d2 + moveq #0,d3 + ; + move.l a2,a3 + ; + move wdiv32(pc),-(a7) + ; +.hloop2 moveq #31,d5 + ; +.hloop tst (a3) ;check destination! + bne.s .skip + ; + and d7,d0 + and d7,d1 ;X/Z for fetch! + move d0,d2 + lsl #7,d2 + lea 0(a0,d2),a6 + move.b 0(a6,d1),d3 + move 0(a5,d3*2),(a3) + ; +.skip add.l d4,d0 + addx d2,d0 + add.l d6,d1 + addx d2,d1 + addq #4,a3 + dbf d5,.hloop + ; + addq #4,a3 + subq #1,(a7) + bgt.s .hloop2 + bne.s .kl + ; + move wrem32(pc),d5 + bpl.s .hloop + ; +.kl 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 + ; + ifne aga + add.l 0(a0,d0*4),a6 + elseif + lsl #2,d0 + add.l 0(a0,d0),a6 + endc + ; +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 + +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.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 #4,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 + bsr loadfile + move.l d0,(a2) + beq.s .skip + move.l d0,a0 + bsr 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 + bsr loadfile + clr.b (a3) + move.l d0,4(a2) + beq.s .rts + move.l d0,a0 + bsr 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 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 + ; + 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 + +savernd lea rndtable(pc),a0 + lea rndback(pc),a1 + moveq #(rndtablef-rndtable)/2-1,d0 +.loop move (a0)+,(a1)+ + dbf d0,.loop + rts + +loadrnd lea rndback(pc),a0 + lea rndtable(pc),a1 + moveq #(rndtablef-rndtable)/2-1,d0 +.loop move (a0)+,(a1)+ + dbf d0,.loop + rts + +rndtable ds.w 55 +k_index dc.l 0 +j_index dc.l 0 +rndtablef + +rndback ds.b rndtablef-rndtable + +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 + +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 + +currplayer dc.l 0 + +calcscene ;a5=player object + ; + move #$20,$dff09a + ; + move.l a5,currplayer + move.l ob_palette(a5),palette + move ob_thermo(a5),thermo + move ob_infra(a5),infra + move ob_pixsize(a5),pixsize + ; + clr.l shapelist + move.l a5,a0 + bsr calccamera + bsr makewalls + ; + lea objects(pc),a5 + ; +.loop move.l (a5),a5 + tst.l (a5) + beq.s .done + cmp.l currplayer(pc),a5 + beq.s .loop + move.l ob_render(a5),a0 + 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 bclr #7,ob_update(a5) + beq.s .noupdate + ; + bclr #7,ob_update+1(a5) + beq.s .stats + ; + move.l ob_window(a5),a2 + moveq #9,d0 + bsr wcopy + bsr initstats + ; +.stats bsr showstats + ; +.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 + ; +.wait tst showflag + bne.s .wait + ; + move.l ob_window(a5),a0 + bsr dbwindow + ; + bsr castwalls + bsr makeqstrip + bsr renderwalls + ; + move floorflag(pc),d0 + ble.s .nofloor + ; + move camy(pc),d0 + neg d0 + moveq #-1,d1 + move maxy(pc),d7 + subq #1,d7 + lea groundtile,a0 + bsr flat + ; +.nofloor move roofflag(pc),d0 + ble.s .noflat + ; + move #-255,d0 + sub camy(pc),d0 + moveq #1,d1 + move miny(pc),d7 + lea ceilingtile,a0 + bsr flat + ; +.noflat bsr drawshapes + bsr drawblood + ; + move.l currplayer(pc),a0 + move ob_pixsizeadd(a0),d0 + beq .done + add d0,ob_pixsize(a0) + move ob_pixsize(a0),d0 + beq .fin + cmp #24,d0 + bne .pix + ; + ;ok, big pixels + ; + move finished2(pc),finished + bne .pix + ; + move #$20,$dff09a + move ob_telex(a0),ob_x(a0) + move ob_telez(a0),ob_z(a0) + move ob_telerot(a0),ob_rot(a0) + neg ob_pixsizeadd(a0) + move #$8020,$dff09a + bra.s .pix + ; +.fin clr ob_pixsizeadd(a0) + ; +.pix move d0,pixsize + bsr pixelate + ; +.done rts + +vbhandler ; + subq #1,(a1)+ + addq #1,(a1) + ; + tst showflag + beq.s .noshow + ; + ;don't show if beam in the way! + ; + move.l $dff004,d0 + lsr.l #8,d0 ;beampos + and #$1ff,d0 + cmp minbpos(pc),d0 + bcs.s .ok + cmp maxbpos(pc),d0 + bcs.s .noshow + ; +.ok clr showflag + lea window1,a0 + bsr showwindowq + lea window2,a0 + bsr showwindowq + ; +.noshow bsr sfxvbint + ; + move fadevol(pc),d0 + beq.s .nofade + move.l medat(pc),a1 + sub #$80,fadevol + bgt.s .setvol + clr fadevol + jsr 12(a1) ;stop song + bra.s .nofade +.setvol move fadevol(pc),d0 + lsr #8,d0 + jsr 16(a1) ;set volume + ; +.nofade btst #0,framecnt+1 + beq rts + tst paused + bne exit_vb2 + ; + ;OK, movement/animation stuff! + ; + movem.l d0-d7/a0-a6,-(a7) + ; + 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 + 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 movem.l (a7)+,d0-d7/a0-a6 +exit_vb2 st doneflag + 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_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 + +blowobject move.l diesfx(pc),a0 + moveq #64,d0 + moveq #2,d1 + bsr playsfx + ; + 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 + 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_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 + bra killobject + +hurtghoul moveq #31,d7 + bsr bloodymess + rts + +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 + +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 pickplayer + tst ob_invisible(a0) + bne.s .useold ;can't see player! no intelligence... + ; + bsr calcangle + 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_frame(a0) + move.l a3,ob_chunks(a0) + ; + move ob_rot(a5),d0 + and #255,d0 + move.l camrots(pc),a1 + ; + ifne aga + lea 0(a1,d0*8),a1 + elseif + lsl #3,d0 + lea 0(a1,d0),a1 + endc + ; + 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 + +fire1 bsr pickplayer + bsr calcangle + move d0,-(a7) + bsr rndw + tst ob_invisible(a0) + bne.s .inv + and #16,d0 + subq #8,d0 +.inv 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 #baldylogic,ob_logic(a5) + bsr rnddelay + ; + bra monsterfix + ; +baldy_skip ;close to player? start throwing punches around! + ; + bsr pickplayer + bsr calcangle + 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 + +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? + ; + bsr pickplayer + bsr calcbangle + ; + 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 #baldycharge,ob_logic(a5) + ; + rts + +terralogic ; + move ob_rot(a5),ob_oldrot(a5) + subq #1,ob_delay(a5) + bgt monstermove + ; + ;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 pickplayer + bsr calcangle + 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 + ; + 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 pickplayer + bsr calcangle + 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 + ; +.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 #20,d0 + lea wtable(pc),a0 + moveq #4,d2 ;colltype + moveq #0,d3 ;collwith + movem 2(a0,d0),d4-d6 ;hits,dam,speed + moveq #0,d7 ;acc + move.l 8(a0,d0),a2 ;bullets + move.l 12(a0,d0),a3 ;sparks + move.l 16(a0,d0),-(a7) + ; + 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 pickplayer + bsr calcangle + move d0,-(a7) + bsr rndw + tst ob_invisible(a0) + bne.s .inv + and #16,d0 + subq #8,d0 +.inv add (a7)+,d0 + and #255,d0 + 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 pickplayer + bsr calcangle + 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 + +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 + +calcvecs move ob_rot(a5),d0 + and #255,d0 + move.l camrots(pc),a0 + ; + ifne aga + lea 0(a0,d0*8),a0 + elseif + lsl #3,d0 + lea 0(a0,d0),a0 + endc + ; + 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 + ; +checkvecs2 bsr checknewslow ;ok to stand here? + beq.s .ok + bsr adjustposq + 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 #3,finished2 + move #2,ob_pixsizeadd(a5) + move.l #rts,ob_logic(a5) + move.l player1,a0 + cmp.l a5,a0 + bne.s .got + move.l player2,a0 +.got move #2,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 + ; + ;OK, one player game done! + ; +.allover move #1,finished + rts + ; +.not1p move.l player1,a0 + cmp.l a5,a0 + bne.s .goth + move.l player2,a0 +.goth tst ob_hitpoints(a0) + ble.s .allover + rts + +waitrestart bsr getcntrl + ; + bsr checkfireb + beq.s .rts + ; + 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 + move (a0)+,ob_x(a5) + move (a0)+,ob_z(a5) + move (a0)+,ob_rot(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 + 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 + ; + move.l player1,a0 + cmp.l a5,a0 + bne.s .got + move.l player2,a0 +.got tst ob_hitpoints(a0) + ble.s .draw + ; +.win move.l a5,-(a7) + move.l a0,a5 + addq #1,wins1 + cmp.l player1,a5 + beq.s .wd + subq #1,wins1 + addq #1,wins2 +.wd st ob_update(a5) + clr ob_collwith(a5) + clr ob_colltype(a5) + bsr message + dc.b 'winner!',0 + even + move.l (a7)+,a5 + st ob_update(a5) + bsr message + dc.b 'loser!',0 + even + rts +.draw ; + rts +.notcom ; + subq #1,ob_lives(a5) + bne.s .ngo + bsr message + dc.b 'game over',0 + even +.ngo move #-1,ob_update(a5) + ; +.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 + +healthgot bsr playtsfx + addq #5,ob_hitpoints(a0) + cmp #25,ob_hitpoints(a0) + ble.s .skip + move #25,ob_hitpoints(a0) +.skip st ob_update(a0) + move.l a5,-(a7) + move.l a0,a5 + bsr message + dc.b 'health bonus!',0 + even + 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 + add #$c0,ob_weapon(a0) + cmp #$1900,ob_weapon(a0) + ble.s .skip + move #$1900,ob_weapon(a0) +.skip st ob_update(a0) + move.l a5,-(a7) + move.l a0,a5 + move ob_wlevel(a5),d2 + bsr calcwlevel + cmp ob_wlevel(a5),d2 + beq.s .nob + bsr message + dc.b 'weapon boost!',0 + even + bra.s .nob2 +.nob bsr message + dc.b 'weapon bonus...',0 + even +.nob2 move.l (a7)+,a5 + bra killobject + +invisigot add #1500,ob_invisible(a0) + move.l #rts,ob_render(a0) + move.l a5,-(a7) + move.l a0,a5 + bsr calcwlevel + bsr message + dc.b 'invisibility!',0 + even + move.l (a7)+,a5 + bra killobject + +thermogot 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 + +playertimers 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 + move.l #drawshape_8,ob_render(a5) + 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 ; + rts + +footstep move.l d0,-(a7) + move.l footstepsfx(pc),a0 + moveq #16,d0 + moveq #0,d1 + bsr playsfx + move.l (a7)+,d0 + rts + +prevjoy dc 0 ;previous joy reading! + +cntrls dc.l joyx0,joyx1,joyx2,joyx3 + +getcntrl move ob_cntrl(a5),d0 + cmp #3,d0 ;null modem? + bne.s .notnull + ; + ;OK, control from null modem! + ; + move linkcnt(pc),d0 + beq.s .waitser + ; + subq #1,linkcnt + moveq #0,d0 + lea joyx3(pc),a0 + bra decodejoy + ; +.waitser bsr serget + bpl.s .sergot + ; + ;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 + bra.s .waitser + ; +.sergot lea joyx3(pc),a0 + tst.b d0 + bpl decodejoy + and #$ff,d0 + move d0,finished + move.l #rts,ob_logic(a5) + moveq #0,d0 + bra decodejoy + ; +.notnull lea cntrls(pc),a0 + move.l 0(a0,d0*4),a0 ;address of cntrl table... + move linked(pc),d0 + beq.s .rts + ; + bsr encodejoy + move.l a0,a2 + bsr serput ;output it! + move.l a2,a0 + move prevjoy(pc),d1 ;use previous! + move d0,prevjoy ;new previous + move d1,d0 + bra decodejoy + ; +.rts rts + +playerlogic bsr playertimers + ; + move.l ob_x(a5),d6 + move.l ob_z(a5),d7 + ; + 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 getcntrl ;update controller block, + ;and put in a0 + ; + move (a0),d0 ;joyx - rotate + muls ob_rotspeed(a5),d0 + add ob_rot(a5),d0 + and #255,d0 + move d0,ob_rot(a5) + ; + move 2(a0),d4 ;joyy + bne.s .speed + ; + ;OK, standing still! + ; + and #255,ob_bounce(a5) + beq.s .nob + add #32,ob_bounce(a5) + cmp #128,ob_bounce(a5) + ble.s .nob + clr ob_bounce(a5) + bsr footstep +.nob clr.l ob_frame(a5) + bra checkfire + ; +.speed add #16,ob_bounce(a5) + move ob_bounce(a5),d1 + sub #64,d1 + and #255,d1 + bne.s .fskip + bsr footstep +.fskip ; + move.l ob_framespeed(a5),d1 + add.l d1,ob_frame(a5) + and #3,ob_frame(a5) + ; + neg d4 + muls ob_movspeed(a5),d4 ;speed + move.l camrots(pc),a1 + lea 0(a1,d0*8),a1 + ; + move d4,d5 ;real speed + muls 2(a1),d4 + add.l d4,d4 + muls 6(a1),d5 + add.l d5,d5 + ; + move.l ob_x(a5),d6 + move.l ob_z(a5),d7 + ; + neg.l d4 + add.l d4,d6 + add.l d5,d7 + ; + 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 .useold + ; +.newpos move.l d6,ob_x(a5) + move.l d7,ob_z(a5) +.useold ; + tst ob_pixsizeadd(a5) + bne checkfire + ; + bsr checknew2 ;in a trigger zone? + beq.s checkfire + ; + move zo_ev(a4),d0 ;poly->event + bmi.s checkfire + ; + cmp #24,d0 + bne.s .notexit + ; + move #3,finished2 ;pattern done! + move #2,ob_pixsizeadd(a5) + ; + move d0,-(a7) + bsr dotelesfx + move (a7)+,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 + bsr execevent + move.l eventobj(pc),a5 +checkfire ; + bsr checkfireb + beq .rts + ; + move ob_collwith(a5),d2 + and #3,d2 + eor #3,d2 ;colltype + ; + lea wtable(pc),a0 + move ob_wlevel(a5),d0 + movem 0(a0,d0),d3-d6 + movem.l 8(a0,d0),a2-a3 + move.l 16(a0,d0),-(a7) + ; + move.b ob_weapon(a5),d0 + sub d3,ob_weapon(a5) + cmp.b ob_weapon(a5),d0 + beq.s .noup + ; + bsr calcwlevel + st ob_update(a5) + ; +.noup moveq #0,d3 + bsr shoot + ; + move.l (a7)+,a0 + move.l (a0),a0 + moveq #32,d0 + moveq #0,d1 + bsr playsfx + ; +.rts rts + + ; + ;weaponuse.w + ;hitpoints + ;damage + ;speed + ; +wtable dc 0,1,1,32 + dc.l bullet1,sparks1,shootsfx3 + dc $8,5,2,36 + dc.l bullet2,sparks2,shootsfx2 + dc $c,10,3,40 + dc.l bullet3,sparks3,shootsfx + dc $10,15,4,40 + dc.l bullet4,sparks4,shootsfx4 + dc $20,20,7,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 lea cntrls(pc),a0 + move ob_cntrl(a5),d0 + move.l 0(a0,d0*4),a0 + move 4(a0),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 ; + 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) + ; + move.l d2,d6 + add.l ob_x(a5),d6 + move.l d3,d7 + add.l ob_z(a5),d7 + ; + bsr checkvecs2 + 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 + ; + add.l #$8000,bl_yvec(a5) + ; + movem.l bl_xvec(a5),d0-d2 + add.l d1,bl_y(a5) + blt.s .ok + ; + move.l a5,a0 + killitem blood + move.l a0,a5 + bra.s .loop + ; +.ok add.l d0,bl_x(a5) + add.l d2,bl_z(a5) + bra.s .loop + ; +.done rts + +drawblood lea blood(pc),a5 + ; +.loop move.l (a5),a5 + tst.l (a5) + beq .done + ; + move bl_x(a5),d0 + sub camx(pc),d0 + move bl_y(a5),d1 + 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 #32,d2 + bcc.s .pix + ; + ;blit to screen! + ; + move #$4000,$dff09a + ; + bsr savernd + move.l window(pc),a0 + move wi_bh(a0),d0 + subq #8,d0 + bsr rndn + move d0,d2 ;Y + ; + move wi_bw(a0),d0 + subq #8,d0 + bsr rndn ;X + add wi_x(a0),d0 + move d2,d1 + ; + move.l wi_bmap(a0),a1 + move.l font(pc),a0 + moveq #46,d2 + bsr blit + ; + bsr loadrnd + ; + move.l a5,a0 + killitem blood + move.l a0,a5 + ; + move #$c000,$dff09a + bra .loop +.pix ; + add midx(pc),d0 + add midy(pc),d1 + ; + move.l darktable(pc),a0 + move 0(a0,d2*2),d3 + ; + move.l cop(pc),a1 + ; + lea coloffs,a2 + add.l 0(a2,d0*4),a1 + mulu copmod(pc),d1 + ; + move blcols(pc,d3*2),d3 + and bl_color(a5),d3 + move d3,0(a1,d1.l) + bra .loop + ; +.done rts + +blcols dc $ccc,$bbb,$aaa,$999,$888,$777,$666,$555 + dc $444,$333,$222,$111,$000,$000,$000,$000 + +;blcols dc $fff,$eee,$ddd,$ccc,$bbb,$aaa,$999,$888 + dc $777,$666,$555,$444,$333,$222,$111,$000 + +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 + ; + ifne aga + add.l 12(a0,d0*4),a0 + elseif + lsl #2,d0 + add.l 12(a0,d0),a0 + endc + ; +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) + ; + 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 + ; + addq #1,frame + ; + 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 + ; + ifne aga + lea 0(a3,d0*2),a0 + elseif + add d0,d0 + lea 0(a3,d0),a0 + endc + ; +.loop2 move (a0)+,d0 ;poly# + lsl #5,d0 + lea 0(a4,d0),a1 ;actual poly + move frame(pc),d0 + cmp zo_done(a1),d0 + beq .skip3 + move d0,zo_done(a1) + tst zo_open(a1) + bmi .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 + ; + 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 dbf d4,.loop2 ;finish sq + ; +.skip dbf d5,.loop ;gridoffs + ; +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 + + 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 + ; + ifne aga + lea 0(a6,d7*8),a6 + elseif + move d7,d0 + lsl #3,d0 + lea 0(a6,d0),a6 + endc + ; + move.l vertdraws(pc),a4 + ; +.loop ;do this vert line! + ; + lea outlist(pc),a5 + ; +.loop2 move.l (a5),d0 + beq .empty + move.l d0,a5 + ; + cmp wl_lsx(a5),d7 + blt.s .loop2 + cmp wl_rsx(a5),d7 + bgt.s .loop2 + ; + movem wl_lx(a5),d0-d1 + muls (a6),d0 + muls 2(a6),d1 + add.l d1,d0 ;LX! + bgt .loop2 + ; + movem wl_rx(a5),d1-d2 + muls (a6),d1 + muls 2(a6),d2 + add.l d2,d1 ;RX! + blt .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<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 decrm+32 + 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 + +andtable dc $ffff,0 ;rgb and, brightness add...wht + dc $ff00,8 ;red + +makepalettes ; + ;make wht and red pals + ; + ;create pointers... + ; + lea palettes(pc),a0 + move.l map_rgbs(pc),d0 + lea palettesw(pc),a1 + move.l map_rgbsw(pc),d1 + lea palettesr(pc),a2 + move.l map_rgbsr(pc),d2 + ; + moveq #15,d7 + ; +.loop move.l (a0)+,d3 + sub.l d0,d3 ;offset! + move.l d3,d4 + add.l d1,d3 + move.l d3,(a1)+ + add.l d2,d4 + move.l d4,(a2)+ + ; + dbf d7,.loop + ; + move.l map_rgbsend(pc),d7 + sub.l map_rgbs(pc),d7 ;how many bytes! + lsr #1,d7 + subq #1,d7 ;words! + ; + move.l map_rgbsw(pc),a1 + move #$ffff,d1 ;col and + move #0,d2 ;gamma + bsr makeapal + ; + move.l map_rgbsr(pc),a1 + move #$ff00,d1 + moveq #16,d2 + bsr makeapal + ; + rts + +makeapal move.l map_rgbs(pc),a0 + ; +.loop move (a0)+,d4 ;src colour...find briteness + ; + move d4,d5 + move d4,d6 + and #$f00,d4 + lsr #8,d4 + and #$0f0,d5 + lsr #4,d5 + and #$00f,d6 + add d6,d5 + add d5,d4 + add d2,d4 + cmp #16*3,d4 + bcs.s .bok + moveq #16*3-1,d4 +.bok ext.l d4 + divu #3,d4 ;(r+g+b)/3=briteness! + ; + move d4,d5 + move d4,d6 + lsl #8,d4 + lsl #4,d5 + or d6,d5 + or d5,d4 ;RGB + and d1,d4 + ; + move d4,(a1)+ + ; + cmp.l map_rgbsend(pc),a0 + bcs.s .loop + ; + rts + +calcpalettes ;OK, our palette currently runs from: + ; + ;map_rgbs + ; to + ;map_rgbsat + ; + ;append brightness versions... + ; + lea palettes(pc),a2 + move.l map_rgbs(pc),(a2)+ ;first brightness! + move.l map_rgbsat(pc),a1 ;first brightness! + move.l a1,a3 + moveq #1,d0 ;rgb subtract + ; +.loop move.l map_rgbs(pc),a0 + move.l a1,(a2)+ + ; +.loop2 move (a0)+,d1 + move d1,d2 + move d1,d3 + ; + and #$f00,d1 + lsr #8,d1 + sub d0,d1 + bpl.s .rok + moveq #0,d1 +.rok ; + and #$f0,d2 + lsr #4,d2 + sub d0,d2 + bpl.s .gok + moveq #0,d2 +.gok ; + and #$0f,d3 + sub d0,d3 + bpl.s .bok + moveq #0,d3 +.bok ; + lsl #8,d1 + lsl #4,d2 + or d3,d2 + or d2,d1 + or #$8000,d1 + ; + move d1,(a1)+ + cmp.l a3,a0 + bcs.s .loop2 + ; + addq #1,d0 + cmp #16,d0 + bcs.s .loop + ; + move.l a1,map_rgbsend + ; + rts + +map_rgbsend dc.l 0 + +dispoff tst dispnest + bne.s .skip + bsr vwait + move #$01a0,$dff096 +.skip addq #1,dispnest + rts + +dispon subq #1,dispnest + bgt.s .skip + bsr vwait + move.l coplist(pc),$dff080 + move #$8180,$dff096 + move #0,$dff088 +.skip rts + +forbid push + moveq #49,d0 +.fl bsr vwait + dbf d0,.fl + bsr ownblitter + move.l 4.w,a6 + jsr -132(a6) + move #$8400,$dff096 + pull + rts + +permit push + move.l rawstuff,a0 + clr.l $70(a0) + move.l 4.w,a6 + jsr -138(a6) + bsr disownblitter + pull + 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 + +finitvbint push + move.l 4.w,a6 + moveq #5,d0 + lea vbintserver,a1 + jsr -174(a6) + pull + rts + +ownblitter push + move.l grbase,a6 + jsr -456(a6) + btst #6,$dff002 +.bwait btst #6,$dff002 + bne.s .bwait + pull + rts + +disownblitter push + btst #6,$dff002 +.bwait btst #6,$dff002 + bne.s .bwait + move.l grbase,a6 + jsr -462(a6) + pull + rts + +makecoloffs push + ; + ifne aga + ; + lea coloffs,a0 + moveq #2,d0 + moveq #3,d2 +.loop addq.l #4,d0 + moveq #31,d1 +.loop2 move.l d0,(a0)+ + addq.l #4,d0 + dbf d1,.loop2 + dbf d2,.loop + ; + elseif + ; + lea coloffs,a0 + moveq #18,d0 + moveq #127,d1 + ; +.loop move.l d0,(a0)+ + addq.l #4,d0 + dbf d1,.loop + ; + endc + ; + pull + 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 + +calcbpos ;also: calc qstripbot, con0poke... + ; + move window1+wi_h,d0 + add d0,d0 + ext.l d0 + add.l qstrip(pc),d0 + move.l d0,qstripbot + ; + move #$100,con0poke + move floorflag(pc),d0 + and roofflag(pc),d0 + bne.s .cp + move #$9f0,con0poke ;one of them is cop strip! +.cp ; + move window1+wi_y,d0 + subq #4,d0 + move d0,minbpos + tst twowins + beq.s .p1 + ; + move window2+wi_y,d0 + add window2+wi_bh,d0 + addq #4,d0 + move d0,maxbpos + rts + ; +.p1 move window1+wi_y,d0 + add window1+wi_bh,d0 + addq #4,d0 + move d0,maxbpos + ; + rts + +showwindow ;a0=window + ; + push + ; + ifne aga + ; + ;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) + ; + move wi_y(a0),d0 + subq #3,d0 + move.b d0,64(a1) + ; + endc + ; + ;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 + ; + ifne aga + ; + move d0,72+6(a0) + swap d0 + move d0,72+2(a0) + ; + elseif + ; + move d0,6(a0) + swap d0 + move d0,2(a0) + ; + endc + ; + rts + +finitdisplay push + ; + 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 + +initdisplay push + ; + lea grname,a1 + move.l 4.w,a6 + jsr -408(a6) + move.l d0,grbase + ; + move.l d0,a6 + move.l 34(a6),oldview + sub.l a1,a1 + jsr -222(a6) ;loadview + ; + move.l #copinitf-copinit,d0 + moveq #2,d1 + allocmem copinit + move.l d0,coplist + ; + move.l d0,a1 + lea copinit,a0 + lea copinitf,a2 + ; +.loop cmp.l a2,a0 + bcc.s .done + move.l (a0)+,(a1)+ + bra.s .loop +.done ; + add.l #sl1-copinit,d0 + move.l d0,slice1 + add.l #sl2-sl1,d0 + move.l d0,slice2 + add.l #cstop-sl2,d0 + move.l d0,copstop + ; + move.l copstop,d0 + move.l slice1,a0 + move.l slice2,a1 + ; + ifne aga + ; + move d0,72+6(a0) + move d0,72+6(a1) + swap d0 + move d0,72+2(a0) + move d0,72+2(a1) + ; + elseif + ; + move d0,6(a0) + move d0,6(a1) + swap d0 + move d0,2(a0) + move d0,2(a1) + ; + endc + ; + jsr -270(a6) + jsr -270(a6) + move.l coplist,$dff080 + move #0,$dff088 + ; + pull + rts + +allocwbmap move wi_w(a2),d0 + mulu wi_pw(a2),d0 + move d0,wi_bw(a2) + ; + move wi_h(a2),d0 + mulu wi_ph(a2),d0 + move d0,wi_bh(a2) + ; + mulu #40*7,d0 + ; + move.l #$10002,d1 + move.l d0,wi_bmapmem(a2) + allocmem wi_bmap + move.l d0,wi_bmap(a2) + ; + move.l #40*7*7,d0 + moveq #2,d1 + allocmem wi_strip + move.l d0,wi_strip(a2) + ; + rts + +windowiff ;draw iff into window! + ; + move.l wi_iff(a2),a0 + cmp.l #1,a0 + bne.s .do + rts + ; +.do move.l wi_bmap(a2),a1 + ; + move 2(a0),d1 + cmp #240,d1 + bcs.s .skip + move #240,d1 +.skip move #120,d2 + lsr #1,d1 + sub d1,d2 + mulu #7*40,d2 + add.l d2,a1 + ; +decodeiff ;for 40 columns... + ; + ;a0=trimmed IFF file, + ;a1=destination bitmap... + ; + move.l a2,-(a7) + moveq #40,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 + ; +.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 d7,a1 + dbf d5,.loop4 + dbf d1,.loop5 + ; + move.l (a7)+,a2 + rts + +plotwbmap ;OK, plot colours on bitmap! + ; + tst.l wi_iff(a2) + bne windowiff + ; + move.l wi_bmap(a2),a0 + move wi_x(a2),d0 + move d0,d1 + lsr #3,d0 + not d1 + and #7,d1 + moveq #127,d7 ;colour + move wi_w(a2),d6 ;width + subq #1,d6 + ; +.wloop move wi_pw(a2),d5 + subq #1,d5 + ; +.wloop2 move d7,d4 + moveq #6,d3 + ; +.dloop bclr d1,0(a0,d0) + lsr #1,d4 + bcc.s .dskip + bset d1,0(a0,d0) +.dskip lea 40(a0),a0 + dbf d3,.dloop + ; + lea -40*7(a0),a0 + subq #1,d1 + bpl.s .dskip2 + moveq #7,d1 + addq #1,d0 +.dskip2 dbf d5,.wloop2 + ; + subq #1,d7 + dbf d6,.wloop + ; + move wi_bh(a2),d0 ;how many to copy + subq #1,d0 + bsr wcopy + ; + move.l wi_bmap(a2),a0 + move.l wi_strip(a2),a1 + move wi_bh(a2),d0 + lsr #2,d0 + mulu #7*40,d0 + add.l d0,a0 + move #7*7*10-1,d2 + ; +.loop move.l (a0)+,(a1)+ + dbf d2,.loop + ; + rts + +wcopy ;copy top scanline to next d0 scanlines + ; + move.l wi_bmap(a2),a0 + mulu #10*7,d0 + subq #1,d0 + lea 40*7(a0),a1 +.cbloop move.l (a0)+,(a1)+ + dbf d0,.cbloop + ; + rts + +freewindow ;window in a0 + ; + push + move.l a0,a2 + move.l wi_bmap(a2),d0 + beq.s .no1 + clr.l wi_bmap(a2) + move.l d0,a1 + freemem wi_bmap +.no1 move.l wi_strip(a2),d0 + beq.s .no2 + clr.l wi_strip(a2) + move.l d0,a1 + freemem wi_strip +.no2 move.l wi_cop1(a2),d0 + beq.s .no3 + clr.l wi_cop1(a2) + move.l d0,a1 + freemem wi_cop +.no3 pull + rts + + ifne aga + ; +agawindow ; +makewindow ;AGA make window + ; + ;a0=window struct! + ; + push + ; + move.l a0,a2 + ; + bsr allocwbmap + bsr plotwbmap + ; + tst.l wi_iff(a2) + beq wchunky + ; + ;make a palette coplist for the window + ; + ;to write 32 colours... + ;set bank, write hi nybs, set bank, write lo nybs... + ;=66 copins. + ;*4=264 total + ;+1 for final wait +3 for final copjump=268 + ; + move.l #268<<2,d0 + move.l d0,wi_copmem(a2) + moveq #2,d1 + allocmem wi_iffcop + move.l d0,wi_cop(a2) + move.l d0,wi_cop1(a2) + move.l d0,wi_cop2(a2) + move.l d0,a0 ;dest + move.l wi_pal(a2),a1 ;palette! + ; + moveq #0,d0 ;bank + moveq #3,d3 + ; +.loop move #$106,(a0)+ + move d0,(a0)+ + move #$180,d1 + moveq #31,d2 +.hiloop move d1,(a0)+ + move (a1),(a0)+ + addq #4,a1 + addq #2,d1 + dbf d2,.hiloop + ; + lea -128+2(a1),a1 + move #$106,(a0)+ + bset #9,d0 + move d0,(a0)+ + bclr #9,d0 + move #$180,d1 + moveq #31,d2 +.loloop move d1,(a0)+ + move (a1),(a0)+ + addq #4,a1 + addq #2,d1 + dbf d2,.loloop + subq #2,a1 + ; + add #$2000,d0 ;next bank! + dbf d3,.loop + ; + move.l #$fffffffe,(a0)+ + move.l #$00840000,(a0)+ + move.l #$00860000,(a0)+ + move.l #$008a0000,(a0)+ + pull + rts + ; +wchunky ;how many copins on one line? + ; + move wi_w(a2),d0 + move d0,d1 + subq #1,d0 + lsr #5,d0 ;how many bank changes per line! + addq #3,d0 ;1 waits - 1 eor, 1 init bank select + add d1,d0 ;+colpokes + ; + move d0,d1 + lsl #2,d1 + move d1,wi_copmod(a2) + ; + mulu wi_h(a2),d0 + addq #4,d0 ;1 wait and cop jump at end + ; + lsl.l #2,d0 ;4 bytes/copins + moveq #2,d1 ;cop in chip + move.l d0,wi_copmem(a2) + lsl.l #1,d0 ;2 coplists! + allocmem wi_chunkycop + move.l d0,wi_cop(a2) + move.l d0,wi_cop1(a2) + ; + move.l d0,a0 + move wi_y(a2),d6 + move wi_h(a2),d7 + subq #1,d7 + move #$111,d3 ;test colour + move #$8000,d4 ;Colour Eor + ; +.hloop ;make one copline... + ; + moveq #127,d0 ;colour reg to poke + move wi_w(a2),d1 + subq #1,d1 + ; +.lloop move d0,d2 + addq #1,d2 + and #31,d2 + bne.s .notnbank + ; + ;new bank.... + move d0,d2 + sub #31,d2 + and #$ffe0,d2 + lsl #8,d2 + or d4,d2 ;eor bank + move #$106,(a0)+ ;bank select + move d2,(a0)+ + ; +.notnbank move d0,d2 + and #31,d2 + add d2,d2 + add #$180,d2 + move d2,(a0)+ ;colour poke + move d3,(a0)+ + add #$111,d3 + subq #1,d0 + dbf d1,.lloop + ; + bsr .makewait + ; + ;ok, now do EOR! + move #$10c,(a0)+ + move d4,(a0)+ + bchg #15,d4 + ; + dbf d7,.hloop + ; + bsr .makewait + ; + move.l #$00840000,(a0)+ + move.l #$00860000,(a0)+ + move.l #$008a0000,(a0)+ + ; + ;OK, 1 list created...copy to other! + ; + move.l wi_cop1(a2),a0 + move.l a0,a1 + add.l wi_copmem(a2),a1 + move.l a1,wi_cop2(a2) + move.l a1,a3 + ; +.copycop move.l (a0)+,(a3)+ + cmp.l a1,a0 + bcs.s .copycop + ; + pull + rts + +.makewait ; + ;make wait ins. at pos d6 + ; + subq #1,d6 + move.b d6,(a0)+ + move.b #$e1,(a0)+ + move #$fffe,(a0)+ + addq #1,d6 + add wi_ph(a2),d6 + rts + + elseif + +ecswindow +makewindow ;ECS makewindow...no bitmap needed! + ; + ;a0=window struct + ; + push + ; + move.l a0,a2 + ; + ;how many copins on one line? + ; + ;2 waits... + ;width moves + ;1 colour 0 poke... + ; + ;=width+3! + ; + move wi_w(a2),d0 + addq #7,d0 + ; + move d0,d1 + lsl #2,d1 + move d1,wi_copmod(a2) + ; + mulu wi_h(a2),d0 + addq #4,d0 ;1 waits at begin and cop jump + ;at end + ; + lsl.l #2,d0 ;4 bytes/copins + moveq #2,d1 ;cop in chip + move.l d0,wi_copmem(a2) + lsl.l #1,d0 ;2 coplists! + allocmem wi_chunkycop + move.l d0,wi_cop(a2) + move.l d0,wi_cop1(a2) + ; + move.l d0,a0 + move #$47,d5 + sub wi_w(a2),d5 + add d5,d5 + or #1,d5 + move wi_y(a2),d6 + move wi_h(a2),d7 + subq #1,d7 + ; + moveq #0,d3 + move #$fffe,d4 + bsr .makewait ;wait! + ; +.hloop ;make one copline... + cmp #128,d6 + ble.s .yn + move.b #$80,d3 +.yn ; + move.l a0,d2 ;prepare jump address + addq.l #8,d2 + ; + move #$084,(a0)+ + swap d2 + move d2,(a0)+ + move #$086,(a0)+ + swap d2 + move d2,(a0)+ + ; + ;wait for start X pos... + ; + move.b d3,(a0)+ + move.b d5,(a0)+ + move #$80fe,(a0)+ + ; + move wi_w(a2),d1 + subq #1,d1 + ; +.lloop move.l #$1800f00,(a0)+ + dbf d1,.lloop + move #$180,(a0)+ + move #col0,(a0)+ + ; + move.b d3,(a0)+ + move.b #$e1,(a0)+ + move #$80fe,(a0)+ ;wait for end of line! + ; + move #$ffff,d4 ;skip! + bsr .makewait + move.l #$8a0000,(a0)+ ;strobe! + ; + dbf d7,.hloop + ; + move.l #$00840000,(a0)+ + move.l #$00860000,(a0)+ + move.l #$008a0000,(a0)+ + ; + ;OK, 1 list created...copy to other! + ; + move.l wi_cop1(a2),a0 + move.l a0,a1 + add.l wi_copmem(a2),a1 + move.l a1,wi_cop2(a2) + move.l a1,a3 + ; + move.l a1,d0 + sub.l a0,d0 + ; +.copycop move.l (a0)+,(a3)+ + cmp #$084,-8(a3) + bne.s .noafix + move -6(a3),d2 + swap d2 + move -2(a3),d2 + add.l d0,d2 + move d2,-2(a3) + swap d2 + move d2,-6(a3) +.noafix cmp.l a1,a0 + bcs.s .copycop + ; + pull + rts + +.makewait ; + ;make wait ins. at pos d6 + ;cmp #256,d6 + ;blt.s .not256 + ;move.l #$ffe1fffe,(a0)+ + ;add wi_ph(a2),d6 + ;rts + ; +.not256 move.b d6,(a0)+ + move.b #1,(a0)+ + move d4,(a0)+ ;wait/skip + add wi_ph(a2),d6 + rts + + endc + +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_rgbsfrom,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,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 + +objinfo +player1_ dc.l player1 +.ob_rotspeed dc.l $40000 +.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 -110 ;eye height +.ob_firey dc -60 ;where bullets come from +.ob_gutsy dc -64 +.ob_othery dc 0 +.ob_colltype dc 8 +p1_ob_collwith dc 6 ;6=combat, 4=game +p1_ob_cntrl dc 1 ;for player 0,1=joyport, 2=keys +.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_wlevel dc 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 $40000 +.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 -110 ;eye height +.ob_firey dc -60 ;where bullets come from +.ob_gutsy dc -64 +.ob_othery dc 0 +.ob_colltype dc 16 +p2_ob_collwith dc 5 ;5=combat, 4=game +p2_ob_cntrl dc 0 ;for player 0,1=joyport, 2=keys, 3=null +.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_wlevel dc 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 $30000 +.ob_framespeed dc.l 0 +.ob_base dc 0 +.ob_range dc 0 +.ob_weapon dc 0 +.ob_wlevel 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 tokens +.ob_logic dc.l rts +.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 $50000 +.ob_framespeed dc.l 0 +.ob_base dc 0 +.ob_range dc 0 +.ob_weapon dc 0 +.ob_wlevel 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 + +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 $10000 +.ob_framespeed dc.l 0 +.ob_base dc 0 +.ob_range dc 0 +.ob_weapon dc 0 +.ob_wlevel 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_ ds.b oilen + +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 $20000 +.ob_framespeed dc.l 0 +.ob_base dc 0 +.ob_range dc 0 +.ob_weapon dc 0 +.ob_wlevel 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_ ds.b oilen + +blank1_ ds.b oilen + +blank2_ ds.b oilen + +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 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_wlevel 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_wlevel 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 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 12 +.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_wlevel 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 $a0000 +.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 10 +.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_wlevel 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 $0f0 ;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_wlevel 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 $50000 +.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 15 +.ob_think dc 0 +.ob_frame dc.l 0 +.ob_framespeed dc.l $5000 +.ob_base dc 32 +.ob_range dc 4 +.ob_weapon dc 0 ;weapon type... +.ob_wlevel 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 + +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 + +groundtile incbin tile2.bin +ceilingtile incbin tile.bin + +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 + +gloombrush incbin gloombrush + +gloom incbin title +gloompal incbin title.pal + +combat incbin combat +combatpal incbin combat.pal + +medplayer incbin medplay +decrm incbin decrm + +castrotsinc incbin castrots.bin +camrotsinc incbin camrots.bin ;256 +camrots2inc incbin camrots2.bin ;1024 + +rgbs16 ds.l 16 +map_rgbs_ ds.w 256*16 diff --git a/gloom.s.old b/gloom.s.old new file mode 100644 index 0000000..84cde41 --- /dev/null +++ b/gloom.s.old @@ -0,0 +1,12674 @@ + + ;OK, add a cheat mode! + ; + ;adding chat-line... + ; + ;OK, modem stuff... + ; + ;Once 2 machines are linked, player 1 gets to choose options! + ;player 2 is ignored... + ; + ;player 1 if linked=1, 2 if linked=-1 + + ;********* + ;* GLOOM * + ;********* + ; + ;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! + +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 +onedemo 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 6 +grdshft equ 8 +darkshft equ 7 ;smaller=smaller range=faster! +maxz equ 16<>1 + ; +linemod equ 40*7 + + 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 ;nomralized 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_copmod 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 ; + 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 bsr execscript_med +.wmf tst fadevol + bne.s .wmf + tst twowins + beq.s .n22 + bsr swaphflags +.n22 bsr bigfont + bra .intro + ; +exittoos bsr freeobjlist2 + move #$4000,$dff09a + move.l ciaa,a0 + movem.l rawstuff,d0-d1 + movem.l d0-d1,$64(a0) + move #$c000,$dff09a + jsr permit + jsr finitdisplay + jsr finitvbint + jsr finitsfx + jsr finitser + jsr freememlist + jsr undir + ; + 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 + ; + move.l player1,a5 + move.l ob_palette(a5),-(a7) + move.l #palettesw,ob_palette(a5) + move.l ob_window(a5),a2 + jsr plotwbmap + ; + tst twowins + beq .p1 + ; + move.l player2,a5 + move.l ob_palette(a5),-(a7) + move.l #palettesw,ob_palette(a5) + move.l ob_window(a5),a2 + jsr plotwbmap +.p1 ; + bsr drawall2 + ; + move.l player1,a5 + lea gamemenu,a4 + move.l ob_window(a5),a6 + jsr initmenu + ; +.loop bsr selmenu + beq .done + ; + subq #1,d0 + bne .notpsize + bsr newpsize + 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 bsr finitmenu + ; + tst twowins + beq.s .p12 + ; + move.l player2,a5 + move.l (a7)+,ob_palette(a5) + move.l ob_window(a5),a2 + jsr plotwbmap + bsr initstats + bsr showstats +.p12 ; + move.l player1,a5 + move.l (a7)+,ob_palette(a5) + move.l ob_window(a5),a2 + jsr plotwbmap + bsr initstats + bsr showstats + ; + move #$20,$dff09a + ; + move (a7)+,linked + move (a7)+,framecnt + clr paused + ; + move #$8020,$dff09a + ; + rts + +freewindows lea window1,a0 + jsr freewindow + tst twowins + beq.s .p1 + lea window2,a0 + jsr freewindow +.p1 rts + +largewin move.l player1,a5 + bsr large + tst twowins + beq refresh + move.l player2,a5 + bsr large + bra refresh + +large move.l ob_window(a5),a6 + move wi_pw(a6),d2 + ; + cmp #2,d2 + beq .lhr + ; + ;large lo-res window! + ; +.lores move #324,d0 + move #240,d1 + bra thinkwin + ; +.lhr bsr swappsize + bra.s .lores + ; + move #180,d0 + move #240,d1 + bra thinkwin + +newwsize ;window size stuff! + ; + move.l player1,a5 + bsr swapwsize + tst twowins + beq refresh + move.l player2,a5 + bsr swapwsize + bra refresh + +swapwsize ;increment window size! + ; + move.l ob_window(a5),a6 + movem wi_w(a6),d0-d1 ;w,h + move wi_pw(a6),d2 + mulu d2,d0 + mulu d2,d1 + cmp #2,d2 + beq .hr + ; + ;lo-res! + ; + cmp #318,d0 + bcs.s .inc + move #132,d0 + move d0,d1 + bra thinkwin +.inc add #24,d0 + move d0,d1 + cmp #240,d1 + bls thinkwin + move #240,d1 + bra thinkwin + ; +.hr cmp #180,d0 + bcs.s .inc2 + tst twowins + bne .min + add #18,d1 + cmp #240,d1 + bls thinkwin +.min move #132,d0 + move d0,d1 + bra thinkwin +.inc2 add #24,d0 + move d0,d1 + ; +thinkwin move #180,d3 ;max width! + cmp #2,d2 + beq .gmax + move #318,d3 +.gmax cmp d3,d0 + bls .nm + move d3,d0 +.nm ; + cmp #240,d1 + bls .n240 + move #240,d1 +.n240 tst twowins + beq.s .ggt + move #120,d1 +.ggt ; + move #160,d3 + move d0,d4 + lsr #1,d4 + sub d4,d3 ;wi_x + move d3,wi_x(a6) + ; + ext.l d0 + divu d2,d0 + move d0,wi_w(a6) + ; + tst twowins + bne.s .skip3 + ; + move #cy,d3 + move d1,d4 + lsr #1,d4 + sub d4,d3 + move d3,wi_y(a6) + ; +.skip3 ext.l d1 + divu d2,d1 + move d1,wi_h(a6) + ; + rts + +newpsize ;toggle pixel size between 2 and 3 + ; + ;copy windows to temp so we can free 'em up later + ; + move.l player1,a5 + bsr swappsize + tst twowins + beq refresh + move.l player2,a5 + bsr swappsize + ; +refresh jsr dispoff + bsr finitmenu + ; + bsr freewindows + bsr putwindow + ; + lea window1,a0 + jsr makewindow + lea window1,a0 + jsr showwindow + ; + tst twowins + beq.s .p1 + ; + lea window2,a0 + jsr makewindow + lea window2,a0 + jsr showwindow + ; +.p1 jsr calcbpos + ; + lea gamemenu,a4 + lea window1,a6 + jsr initmenu2 + ; + bsr drawall2 + jsr dispon + rts + +swappsize move.l ob_window(a5),a6 + movem wi_w(a6),d0-d1 ;w,h + move wi_pw(a6),d2 + mulu d2,d0 + mulu d2,d1 + eor #1,d2 ;2,3... + move d2,wi_pw(a6) + move d2,wi_ph(a6) + ; + bra thinkwin + +showflag dc 0 + +showit ;don't show if beam in the way! + ; + move showflag(pc),d0 + beq.s .rts + ; + move.l $dff004,d0 + lsr.l #8,d0 ;beampos + and #$1ff,d0 + ; + cmp minbpos(pc),d0 + bcs.s .show + cmp maxbpos(pc),d0 + bcs.s .rts + ; + ;cmp minbpos(pc),d0 + ;bcc.s .rts + ; +.show clr showflag + lea window1,a0 + jsr showwindowq + lea window2,a0 + jmp showwindowq + ; +.rts rts + +drawall2 bsr drawall + bsr drawall + bra vwait + +drawall ; +.wait move doneflag(pc),d0 + beq.s .wait ;wait for update + clr doneflag +.wait2 move showflag(pc),d0 + bne.s .wait2 + ; + move.l memory(pc),memat + move.l player1(pc),a5 + bsr calcscene + move.l player1(pc),a5 + bsr blitscene + move.l player1(pc),a5 + bsr drawscene + ; + move twowins(pc),d0 + beq.s .show + ; + move.l memory(pc),memat + move.l player2(pc),a5 + bsr calcscene + move.l player2(pc),a5 + bsr blitscene + move.l player2(pc),a5 + bsr drawscene + ; +.show st showflag + rts + +resetplayer st ob_update(a5) + clr ob_mega(a5) + clr ob_thermo(a5) + clr ob_infra(a5) + clr ob_invisible(a5) + clr ob_messtimer(a5) + clr ob_pixsize(a5) + clr ob_pixsizeadd(a5) + clr ob_bouncecnt(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 ;a6=window, 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 + ; +.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 .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 wi_bmap(a6),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 ; + rts + +initstats ; + ;health... + move.l ob_window(a5),a0 + moveq #2,d0 + add wi_x(a0),d0 + move.l wi_bmap(a0),a1 + move.l font(pc),a0 + moveq #2,d1 + moveq #39,d2 + bsr blit + ; + ;weapon... + move.l ob_window(a5),a0 + moveq #2,d0 + add wi_x(a0),d0 + move.l wi_bmap(a0),a1 + move.l font(pc),a0 + moveq #12,d1 + moveq #44,d2 + bra blit + +putstrip ;a0=window + ; + move.l wi_bmap(a0),a1 + move wi_bh(a0),d0 + lsr #2,d0 + mulu #7*40,d0 + add.l d0,a1 ;dest + move.l wi_strip(a0),a0 ;src + ; + btst #6,$dff002 +.bwait btst #6,$dff002 + bne.s .bwait + ; + move.l #$9f00000,$dff040 + move.l #-1,$dff044 + move #0,$dff064 + move #0,$dff066 + move.l a0,$dff050 + move.l a1,$dff054 + move #(7*7)<<6+20,$dff058 + rts + +loff dc 0 + +showstats ;a5=player + ; + ;ok, hitpoints... + ; + ;lagtime... + move.l ob_window(a5),a0 + moveq #2,d0 + add wi_x(a0),d0 + move.l wi_bmap(a0),a1 + move.l font(pc),a0 + moveq #22,d1 + move lagtime(pc),d2 + bsr blit + ; + move.l ob_window(a5),a0 + moveq #44,d5 + add wi_x(a0),d5 + moveq #40,d4 + moveq #0,d6 + move ob_hitpoints(a5),d7 + ; +.hploop cmp d7,d6 + bcs.s .hpskip + cmp #25,d7 + bcc.s .hpdone + moveq #41,d4 + moveq #25,d7 + bra.s .hploop + ; +.hpskip move.l font(pc),a0 + move.l ob_window(a5),a1 + move.l wi_bmap(a1),a1 + move d5,d0 + moveq #2,d1 + move d4,d2 + bsr blit + addq #2,d5 + addq #1,d6 + bra.s .hploop +.hpdone ; + ;show lives remaining... + ; + move.l ob_window(a5),a0 + move wi_bw(a0),d5 + add wi_x(a0),d5 + move ob_lives(a5),d7 + beq.s .lvdone + subq #1,d7 +.lvloop ; + move.l font(pc),a0 + move.l ob_window(a5),a1 + move.l wi_bmap(a1),a1 + subq #8,d5 + move d5,d0 + moveq #2,d1 + moveq #43,d2 + bsr blit + dbf d7,.lvloop +.lvdone ; + ;show weapons! + ; + move.l ob_window(a5),a0 + moveq #44,d5 + add wi_x(a0),d5 + moveq #49,d4 + sub ob_weapon(a5),d4 ;0...4 + moveq #1,d7 +.wploop ; + move.l font(pc),a0 + move.l ob_window(a5),a1 + move.l wi_bmap(a1),a1 + move d5,d0 + moveq #12,d1 + moveq #50,d2 + cmp.b ob_reload(a5),d7 + blt.s .nowp + move d4,d2 +.nowp bsr blit + ; + add #10,d5 + addq #1,d7 + cmp #6,d7 + bcs.s .wploop + ; + rts + +blit ;a0=shapetable to blit, a1=bitmap, d0=X, d1=Y, d2=char + ; + add.l 4(a0,d2*4),a0 + ; + mulu #280,d1 + add.l d1,a1 + move d0,d2 + asr #3,d2 + add d2,a1 ;dest! + move.l a0,a2 + add.l (a0),a2 + lea 8(a0),a3 + addq #4,a0 + and #15,d0 + ror #4,d0 + ; + btst #6,$dff002 +.bwait btst #6,$dff002 + bne.s .bwait + ; + move.l a2,$dff050 + move.l a3,$dff04c + move.l a1,$dff048 + move.l a1,$dff054 + ; + move d0,$dff042 + or blitmode(pc),d0 + move d0,$dff040 + move.l #$ffff0000,$dff044 + moveq #-2,d0 + move d0,$dff064 + move d0,$dff062 + moveq #38,d0 + sub (a0)+,d0 + move d0,$dff060 + move d0,$dff066 + move (a0)+,$dff058 + ; + rts + +blitmode dc $fca + +pixsize dc 0 ;pixel size...at least 2! + +pixelate ;pixel out the coplist...d0=pixelsize + ; + move d0,pixsize + move d0,d1 + ; + ;pixel out vertically, then horizontally + ; + move.l cop(pc),a0 + lea coloffs(pc),a1 + moveq #0,d2 ;x + move d1,d6 + lsr #1,d6 +.forx ; + move.l a0,a3 + lea 0(a1,d2*4),a2 + add.l (a2),a3 + ; + move d2,d5 + add d6,d5 + cmp width(pc),d5 + ble.s .xok + move width(pc),d5 +.xok sub d2,d5 + ble .done + subq #1,d5 + ; +.loop2 moveq #0,d3 + move.l a3,a4 + move.l a0,a5 + add.l (a2)+,a5 + move d1,d7 + lsr #1,d7 ;first Y add +.fory ; + move (a4),d0 ;start column! + move d3,d4 + add d7,d4 + cmp hite(pc),d4 + ble.s .yok + move hite(pc),d4 +.yok sub d3,d4 + ble .nextx + subq #1,d4 + ; +.loop move d0,(a5) + add copmod(pc),a4 + add copmod(pc),a5 + ; + dbf d4,.loop + ; +.nexty add d7,d3 + move d1,d7 + bra.s .fory + ; +.nextx dbf d5,.loop2 + ; + add d6,d2 + move d1,d6 + bra.s .forx + ; +.done rts + +makeqstrip ; + ;do a simple roof/floor strip for blitter to wack in... + ; + cmp #$100,con0poke + bne.s .doit + rts + ; +.doit move.l qstrip(pc),a0 + move.l darktable(pc),a1 + move.l palette(pc),a2 + move.l qstripbot(pc),a4 + moveq #0,d2 + ; + move floorflag(pc),d0 + bne.s .fdone + ; + move camy(pc),d0 + neg d0 + ext.l d0 + lsl.l #focshft,d0 + ; + move.b qcols+1(pc),d2 + move.l qstripbot(pc),a4 + move maxy(pc),d1 + ; +.floop subq #1,d1 + beq.s .fdone + ; + move.l d0,d3 + divs d1,d3 + cmp #maxz,d3 + bcc .fdone + ; + move 0(a1,d3*2),d3 ;darkness (0...15) + move.l 0(a2,d3*4),a3 ;pal to use + move 0(a3,d2*2),-(a4) ;colour! + ; + bra.s .floop + ; +.fdone move roofflag(pc),d0 + bne.s .rdone + ; + move #-256,d0 + sub camy(pc),d0 + ext.l d0 + lsl.l #focshft,d0 ;cam Y + ; + move.b qcols(pc),d2 + ; + move miny(pc),d1 ;SY + ; +.rloop beq.s .rdone + ; + move.l d0,d3 + divs d1,d3 + cmp #maxz,d3 + bcc .rdone + ; + move 0(a1,d3*2),d3 ;darkness (0...15) + move.l 0(a2,d3*4),a3 ;pal to use + move 0(a3,d2*2),(a0)+ ;colour! + ; + addq #1,d1 + bra.s .rloop +.rdone ; + moveq #0,d0 +.loop cmp.l a4,a0 + bcc.s .done + move.l d0,(a0)+ + bra.s .loop + ; +.done 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 copmod(pc),d1 + move d1,flatyadd2 + ; + move d7,d0 + add midy(pc),d0 + mulu copmod(pc),d0 + add.l cop(pc),d0 + add.l coloffs(pc),d0 + move.l d0,a2 +.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 + ; + ;move.l d4,d2 + ;asr.l #1,d2 + ;add.l d2,d0 + ; + ;move.l d6,d2 + ;asr.l #1,d2 + ;add.l d2,d1 + ; + swap d0 + add camx(pc),d0 + swap d1 + add camz(pc),d1 + swap d4 + swap d6 + ; + move d7,-(a7) + moveq #127,d7 + moveq #0,d2 + moveq #0,d3 + ; + move.l a2,a3 + ; + move wdiv32(pc),-(a7) + ; +.hloop2 moveq #31,d5 + ; +.hloop tst (a3) ;check destination! + 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 0(a5,d3*2),(a3) + addx d2,d1 + addq #4,a3 + dbf d5,.hloop + bra.s .hhh + ; +.skip add.l d4,d0 + addx d2,d0 + add.l d6,d1 + addx d2,d1 + addq #4,a3 + dbf d5,.hloop + ; +.hhh addq #4,a3 + subq #1,(a7) + bgt.s .hloop2 + bne.s .kl + ; + move wrem32(pc),d5 + bpl.s .hloop + ; +.kl 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 + +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.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) + ; + tst finished2 + bne exec_loop + ; + 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 + bsr 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 + bsr 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 + +savernd lea rndtable(pc),a0 + lea rndback(pc),a1 + moveq #(rndtablef-rndtable)/2-1,d0 +.loop move (a0)+,(a1)+ + dbf d0,.loop + rts + +loadrnd lea rndback(pc),a0 + lea rndtable(pc),a1 + moveq #(rndtablef-rndtable)/2-1,d0 +.loop move (a0)+,(a1)+ + dbf d0,.loop + rts + +rndtable ds.w 55 +k_index dc.l 0 +j_index dc.l 0 +rndtablef + +rndback ds.b rndtablef-rndtable + +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 + +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 + +currplayer dc.l 0 + +calcscene ;a5=player object + ; + move #$20,$dff09a + ; + move.l a5,currplayer + move.l ob_palette(a5),palette + move ob_thermo(a5),thermo + move ob_infra(a5),infra + move ob_pixsize(a5),pixsize + ; + clr.l shapelist + move.l a5,a0 + bsr calccamera + bsr makewalls + ; + lea objects(pc),a5 + ; +.loop move.l (a5),a5 + tst.l (a5) + beq.s .done + cmp.l currplayer(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 bclr #7,ob_update(a5) + beq.s .noupdate + ; + bclr #7,ob_update+1(a5) + beq.s .stats + ; + move.l ob_window(a5),a2 + moveq #9,d0 + bsr wcopy + bsr initstats + ; +.stats bsr showstats + ; +.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 + ; + move.l ob_window(a5),a0 + bsr dbwindow + ; + bsr castwalls + bsr makeqstrip + bsr renderwalls + ; + 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 move roofflag(pc),d0 + ble.s .noflat + ; + move #-255,d0 + sub camy(pc),d0 + moveq #1,d1 + move miny(pc),d7 + move.l roof(pc),a0 + bsr flat + ; +.noflat bsr drawshapes + bsr drawblood + ; + move.l currplayer(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 chatinget(pc),d0 + cmp chatinput(pc),d0 + beq.s .rts + and #31,d0 + lea chatin(pc),a0 + move.b 0(a0,d0),d0 + addq #1,chatinget + 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 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 + ; +.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 ; +.waitser bsr serget + bpl.s .sergot + ; + ;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 .waitser + ; +.sergot lea joyxs(pc),a0 + tst.b d0 + bpl .djoy + and #$ff,d0 + move d0,finished + moveq #0,d0 + ; +.djoy bsr decodejoy + move.l (a0)+,joyx + move.l (a0),joyb + rts + +escape dc 0 + +readjoys ;fill in appropriate 'joyxn' block...check escape + ; + qkey $45 + beq.s .noesc + st escape +.noesc move finished(pc),d0 + or finished2(pc),d0 + bne.s .rts + ; + move.l player1(pc),a0 + bsr readjoy + move gametype(pc),d0 + beq.s .rts + move.l player2(pc),a0 + bra readjoy +.rts rts + +vbhandler movem.l d2-d7/a2-a6,-(a7) + ; + subq #1,(a1)+ ;inc/dec frame counters + addq #1,(a1) + ; + ;this done every frame! + bsr showit + bsr chatstuff + bsr sfxvbint + ; + btst #0,framecnt+1 + beq exit_vb + tst paused + bne exit_vb + ; + ;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 + 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 + bsr showit + ; + 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 + +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 + ; + ;bsr pickplayer + ;tst ob_invisible(a0) + ;bne.s .useold ;can't see player! no intelligence... + ;bsr calcangle + ; + 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 + +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 clr ob_rotspeed(a5) ;towards player! + 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 + ; + ;OK, one player game done! + ; +.allover move #2,finished + rts + ; +.not1p move.l player1,a0 + cmp.l a5,a0 + bne.s .goth + move.l player2,a0 +.goth tst ob_hitpoints(a0) + ble.s .allover + rts + +waitrestart bsr getcntrl + ; + bsr checkfireb + beq.s .rts + ; + move ob_weapon(a5),d0 + move d0,-(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 + move (a0)+,ob_x(a5) + move (a0)+,ob_z(a5) + move (a0)+,ob_rot(a5) + ; + move (a7)+,d0 + move d0,ob_weapon(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! + ; + move.l player1,a0 + cmp.l a5,a0 + bne.s .got + move.l player2,a0 +.got tst ob_hitpoints(a0) + ble.s .draw ;it's a draw! + ; +.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 +.draw ; + rts +.notcom ; + ;2 player? do damage to both players! + ; + tst gametype + beq.s .nlink + bsr getother + move #-1,ob_update(a0) + subq #1,ob_lives(a0) + bpl.s .nlink + clr ob_lives(a0) + ; +.nlink move #-1,ob_update(a5) + subq #1,ob_lives(a5) + bgt.s .rts + clr ob_lives(a5) + 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 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 + bra.s .kill + ; +.notfull bsr message + dc.b 'weapon boost!',0 + even + ; +.kill st ob_update(a5) + 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 + bra.s .kill + +invisigot 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 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 + +bouncygot 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 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 .nomega + bsr message + dc.b 'mega wepaon out...',0 + even + ; +.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 + +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 move ob_bounce(a5),d1 + bne.s .nob + rts +.nob add #30,ob_bounce(a5) + move ob_bounce(a5),d1 + and #127,d1 + cmp #30,d1 + bcc .fskip + clr ob_bounce(a5) + clr ob_frame(a5) + bra footstep + ; +.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 + move.l player1(pc),a0 + cmp.l a5,a0 + bne.s .gotcha + move.l player2(pc),a0 +.gotcha 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 + ; +.newok move.l d6,ob_x(a5) + move.l d7,ob_z(a5) + ; +.nosuck rts + +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 + +drawblood lea blood(pc),a5 + ; +.loop move.l (a5),a5 + tst.l (a5) + beq .done + ; + 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 #32,d2 + bcc.s .pix + tst bl_y(a5) + bgt.s .pix + ; + ;blit to screen! + ; + move #$20,$dff09a + ; + bsr savernd + move.l window(pc),a0 + move wi_bh(a0),d0 + subq #8,d0 + bsr rndn + move d0,d2 ;Y + ; + move wi_bw(a0),d0 + subq #8,d0 + bsr rndn ;X + add wi_x(a0),d0 + move d2,d1 + ; + move.l wi_bmap(a0),a1 + move.l font(pc),a0 + moveq #51,d2 + bsr blit + ; + bsr loadrnd + ; + move.l a5,a0 + killitem blood + move.l a0,a5 + ; + move #$8020,$dff09a + bra .loop +.pix ; + add midx(pc),d0 + add midy(pc),d1 + ; + move.l darktable(pc),a0 + move 0(a0,d2*2),d3 + ; + move.l cop(pc),a1 + ; + lea coloffs,a2 + add.l 0(a2,d0*4),a1 + mulu copmod(pc),d1 + ; + move blcols(pc,d3*2),d3 + and bl_color(a5),d3 + move d3,0(a1,d1.l) + bra .loop + ; +.done 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 + ; + addq #1,frame + ; + 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 d0,a5 + ; + cmp wl_lsx(a5),d7 + blt.s .loop2 + cmp wl_rsx(a5),d7 + bgt.s .loop2 + ; + 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<d2 + jsr -156(a6) + move.l d2,vbr + ; + lea ciaaname,a1 + jsr -498(a6) + move.l d0,ciaa + move.l d0,a0 + movem.l $64(a0),d0-d1 + movem.l d0-d1,rawstuff + move #$4000,$dff09a + move.l rawtable(pc),$64(a0) + move.l #rawkeyread,$68(a0) + move #$c000,$dff09a + ; + move.l #8,d0 + move.l #$10002,d1 + allocmem chipzero + move.l d0,chipzero + ; + move.l #256,d0 ;128 words high max! + moveq #2,d1 + allocmem qstrip + move.l d0,qstrip + ; + 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 #16*512*2,d0 ;16 shades, 256 words + moveq #1,d1 + allocmem map_rgbs + ; + move.l #map_rgbs_,map_rgbs + ;move.l d0,map_rgbs + ;add.l #16*512,d0 + move.l d0,map_rgbsw + add.l #16*512,d0 + move.l d0,map_rgbsr + ; + st paused + clr dispnest + clr.l font + bsr initsfx + bsr initvbint + bsr initdisplay + bsr dispoff + ; + lea magicfiles,a0 + bsr loadfiles + ; + move.l magic,a0 + move.l magicpal,a1 + bsr makeiff + bsr showiff + bsr dispon + move #50,vbcounter + ; + lea progfiles,a0 + bsr loadfiles + ; + bsr initbmappal + bsr initmed + bsr initser + bsr calcbaud + bsr makecoloffs + bsr initdarktable + ; + bset #15,remapped + bne .noremap + ; + move.l map_rgbs(pc),a0 + move #-1,(a0)+ + move.l a0,map_rgbsat + ; + 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 + ; + elseif + lea 128*128+groundtile,a2 + move.l a2,a0 + bsr addpal + lea groundtile,a0 + move.l a2,a1 + bsr remap + ; + lea 128*128+ceilingtile,a2 + move.l a2,a0 + bsr addpal + lea ceilingtile,a0 + move.l a2,a1 + bsr remap + elseif + ; + lea qpal,a0 + bsr addpal + lea qcols,a0 + lea qpal,a1 + bsr remap + ; + 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 + ; +.w5sex tst vbcounter + bgt .w5sex + ; + bsr dispoff + lea iffwindow,a0 + bsr freewindow + move.l magic,a1 + freemem magic + move.l magicpal,a1 + freemem magicpal + ; + bra forbid + +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) ;open 'misc/script' + move.l d0,d1 + beq.s .nolock + jsr -36(a6) ;close it! + bra .load + ; +.nolock bsr forbid + bsr checkdatadisk + beq .dataok ;already there? + ; + sub.l a0,a0 + bsr makeiff + bsr showiff + lea diskmenu,a4 + lea iffwindow,a6 + bsr initmenu + bsr dispon + ; + ;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 dispoff + bsr finitmenu + lea iffwindow,a0 + bsr freewindow + ; +.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 + +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 +; ; +;.li move.l lagtext(pc),d0 +; bsr longput +;.rl lea lagtext(pc),a2 +;.rw bsr serwait +; cmp.b (a2)+,d0 +; bne.s .li +; tst.b (a2) +; bne.s .rw +; ; +; bsr qsync + ; +calclag tst linked + bmi .slave + ; + ;MASTER - average out 32 sends of random data! + ; + moveq #0,d6 ;sum + moveq #31,d5 ;32 samples + ; +.mloop moveq #0,d7 + add #69,d0 + bsr vwait + bsr serput + ; +.mwait addq #2,d7 + bsr vwait + bsr vwait + bsr serget + bmi.s .mwait + ; +.got add d7,d6 + dbf d5,.mloop + ; + 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 'no events' 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 + move d0,pput + move d0,rput + ; + move #$c000,$dff09a + ; + rts + +lagtime dc 0 + +qsync ;OK, quick sync up! + ; + tst linked + beq.s .rts + ; +.loop bsr vwait + move.b #$80,d0 + bsr serput +.wait bsr serwait + cmp.b #$80,d0 + bne.s .loop + moveq #0,d0 + bsr serput +.wait2 bsr serwait + cmp.b #$80,d0 + beq.s .wait2 + tst.b d0 + bne.s .loop + ; +.rts rts + +initnewgame move gametype(pc),twowins + beq.s .skip + tst linked + beq.s .skip + ; + ifeq debugser + clr twowins + endc +.skip ; + tst.l map_test + bne.s .skhit + bset #15,gloomdata + bne.s .gotdata + ; +.skhit bsr askdatadisk +.gotdata ; + bsr qsync + ; + move.l medat(pc),a1 + jsr 12(a1) + ;move #$4000,fadevol + cmp #2,gametype + bne normalgame + ; + ;combat type game! + ; + move #6,p1_ob_collwith + move #5,p2_ob_collwith + ; + sub.l a0,a0 + bsr makeiff + bsr showiff + lea combatmenu,a4 + lea iffwindow,a6 + bsr initmenu + ; + bsr dispon + ; +.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 + move #7,comsleft + bsr dispoff + bsr finitmenu + ; + 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! + ; + 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 ;OK, where to continue from! + 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 tst d7 + beq initpstuff + addq #1,d7 + move.b d7,contmenu + ; + ;OK, need a continue game menu... + ; + lea gloom,a0 + lea gloompal,a1 + bsr makeiff + bsr showiff + ; + lea contmenu,a4 + lea iffwindow,a6 + bsr initmenu + bsr dispon + ; + bsr selmenu + ; + bsr dispoff + bsr finitmenu + lea iffwindow,a0 + bsr freewindow + ; + move curropt(pc),d0 + beq initpstuff + lea conts(pc),a0 + move.l -4(a0,d0*4),a0 +.leol cmp.b #10,(a0)+ + bne.s .leol + move.l a0,scriptat + ; +initpstuff move #4,p1_ob_collwith + move #4,p2_ob_collwith + moveq #3,d0 + tst linked + beq.s .nlink + moveq #6,d0 + moveq #1,d0 +.nlink move d0,p1lives + move d0,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 medat(pc),a1 + move.l loadingmed(pc),a0 + jsr 8(a1) ;start title 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 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 + lea gamename,a0 + move.l gloomgame,a1 + moveq #32,d0 + bsr savefile + 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 pic,a0 + move.l picpal,a1 + bsr makeiff + bsr showiff + 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 + +picpath dc.b 'pics/' +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 + +scriptpict ;load an iff + bsr freeiff + lea picname,a1 + bsr fetchrest + move.l a1,-(a7) + bsr permit + lea picpath,a0 + moveq #1,d1 + jsr loadfile + move.l d0,pic + lea pic_pal,a0 + move.l (a7)+,a1 +.loop move.b (a0)+,(a1)+ + bne.s .loop + lea picpath,a0 + moveq #1,d1 + jsr loadfile + move.l d0,picpal + bsr forbid + bra execscript + +scriptdark move.l iffwindow+wi_cop,a0 ;copperlist to darken! + ; + ;bank,32,bank,32... + ; + addq #6,a0 + moveq #3,d0 ;4 lots of 32 colours + moveq #31,d1 + ; + ;skip first 8 + ; + ;subq #8,d1 + ;lea 32(a0),a0 +.loop ; + move (a0),d2 ;hi nyb + move 132(a0),d3 ;lo nyb! + and #$eee,d3 + lsr #1,d3 + move d2,d4 + and #$111,d4 + lsl #3,d4 + or d4,d3 + and #$eee,d2 + lsr #1,d2 + move d2,(a0) + move d3,132(a0) + ; + addq #4,a0 + dbf d1,.loop + moveq #31,d1 + lea 136(a0),a0 + dbf d0,.loop + bra execscript + +text ds.b 64 + +scripttext ;print text on iff + ;a6=window, a4=message, d0=length of message, d6=Y + ; + move #2,pdelay + ; + lea text,a1 + bsr fetchrest + ; + lea iffwindow,a6 + lea text,a4 + move wi_bh(a6),d6 + sub #7,d6 + 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 readmenujoys + tst joyb + movem.l (a7)+,d0-d7/a0-a6 + rts + +waitany movem.l d0-d7/a0-a6,-(a7) +.wait bsr vwait + bsr readmenujoys + tst joyb + beq .wait + ; +.unwait bsr vwait + bsr readmenujoys + tst joyb + bne .unwait + ; + 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 + +getwindow tst twowins + bne.s .p2 + ; + lea defwindow1_1p,a0 + lea window1,a1 + bsr copywin + rts + ; +.p2 lea defwindow1_2p,a0 + lea window1,a1 + bsr copywin + ; + lea defwindow2_2p,a0 + lea window2,a1 + bsr copywin + rts + +putwindow tst twowins + bne.s .p2 + ; + lea window1,a0 + lea defwindow1_1p,a1 + bsr copywin + rts + ; +.p2 lea window1,a0 + lea defwindow1_2p,a1 + bsr copywin + ; + lea window2,a0 + lea defwindow2_2p,a1 + bsr copywin + rts + +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 $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) + ; + 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 + bsr makeiff + bsr showiff + bsr dispon + lea tilenum(pc),a0 + lea floortag(pc),a1 +.loop2 move.b (a0)+,(a1)+ + bne.s .loop2 + bra loadtile + +tilenum dc.b '1',0 + +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 ; + 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 calcpalettes + bsr forbid + bsr makepalettes + bsr dispoff + bsr freewindows + bsr getwindow + ; + ;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 player1(pc),a5 + move.l #window1,ob_window(a5) + move.l ob_window(a5),a0 + bsr makewindow + move.l ob_window(a5),a0 + bsr showwindow + bsr initstats + ; + tst twowins + beq.s .onew + ; + move.l player2(pc),a5 + move.l #window2,ob_window(a5) + move.l ob_window(a5),a0 + bsr makewindow + move.l ob_window(a5),a0 + bsr showwindow + bsr initstats +.onew ; + bsr calcbpos + ; + ;move #$4000,fadevol ;fadeout med! + ; + move.l medat(pc),a1 + clr fadevol + jsr 12(a1) ;stop song + ; + move #$1f3a,d0 + bsr seedrnd + clr.l sucker + clr.l sucking + clr finished + clr finished2 + clr doneflag + clr showflag + clr escape + ; + bsr syncup + ; + clr framecnt + clr paused + bsr drawall2 + bsr dispon + ; + bsr chaton + ; +mainloop bsr drawall + move escape(pc),d0 + beq.s .noesc + bsr dogamemenu + clr escape +.noesc move finished(pc),d0 + beq.s mainloop + ; + st paused + bsr chatoff + ; +.unlk bsr dispoff + bsr freewindows + 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 bsr sendback + 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 +.p1p1 ; + tst p1lives + bne.s .losk + tst gametype + beq.s .losk + tst p2lives + beq gameover +.losk 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),a0 + tst linked + beq .combatmess + lea ploses_(pc),a0 + bgt .combatmess + lea pwins_(pc),a0 + bra .combatmess + ; +.p2lost ;player 2 lost combat game + ; + lea p1wins(pc),a0 + tst linked + beq .combatmess + lea ploses_(pc),a0 + blt .combatmess + lea pwins_(pc),a0 + ; +.combatmess move.l a0,-(a7) + ; + move.l combat,a0 + move.l combatpal,a1 + jsr makeiff + jsr showiff + move.l (a7)+,a4 + lea iffwindow,a6 + bsr initmenu + bsr dispon + ; + bsr selmenu + ; + bsr dispoff + bsr finitmenu + lea iffwindow,a0 + bsr freewindow + bsr qsync + bra combatover + +flushser moveq #49,d7 +.loop bsr vwait +.loop2 bsr serget + bpl.s .loop2 + dbf d7,.loop + bra qsync + +sendback move linked(pc),d0 + beq.s .rts + ; + move finished(pc),d0 + bset #7,d0 + bne serput + move.b d0,d2 + bsr serput +.wait bsr serwait + cmp.b d0,d2 + bne.s .wait +.rts rts + +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 ; + lea gloom,a0 + lea gloompal,a1 + jsr makeiff + jsr showiff + ; + lea gloombrush,a0 + lea iffwindow,a1 + move.l wi_bmap(a1),a1 + add.l #168*7*40,a1 + bsr decodeiff + ; + bsr dispon + ; + bsr chaton + ; + bsr waitany + ; + lea startmenu,a4 + tst linked + beq.s .use + lea startmenu2,a4 +.use lea iffwindow,a6 + 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 chatoff + clr linked + lea p2ctype(pc),a1 + lea p2_ob_cntrl,a2 + lea p1_ob_cntrl,a3 + bsr inccntrl + bsr dispoff + bsr finitmenu + lea iffwindow,a0 + bsr freewindow + bra dointro + ; +.newgame2 addq #1,d0 + move d0,gametype + bsr chatoff + bsr dispoff + bsr finitmenu + lea iffwindow,a0 + bra freewindow + ; +.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 dispoff + bsr finitmenu + lea iffwindow,a0 + bsr freewindow + 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 dispoff + bsr finitmenu + lea gloom,a0 + lea gloompal,a1 + bsr makeiff + bsr showiff + ; + lea abouttext,a4 + lea iffwindow,a6 + bsr initmenu + move numopts(pc),-(a7) + move #1,numopts + ; + bsr dispon + bsr selmenu + ; + move (a7)+,numopts + ; + bsr dispoff + bsr finitmenu + bra dointro + ; +.notabout subq #1,d0 + bne .sel + ; +.exitgloom moveq #4,d0 + ; +.newgame move d0,gametype + ; + bsr chatoff + jsr dispoff + jsr finitmenu + lea iffwindow,a0 + bra freewindow + +linkup ;link up... + ; + sub.l a0,a0 + bsr makeiff + bsr showiff + lea linkupmenu,a4 + lea iffwindow,a6 + bsr initmenu + ; + bsr dispon + ; +.loop bsr selmenu + cmp #3,d0 + bne.s .notb + bsr optbaud + bra.s .loop + ; +.notb move d0,-(a7) + bsr dispoff + bsr finitmenu + move (a7)+,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) + ; + sub.l a0,a0 + bsr makeiff + bsr showiff + lea linkmenu0,a4 + lea iffwindow,a6 + bsr initmenu + bsr dispon + ; + st chatok + ; +.wkey 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 .wkey + cmp #58,d0 + bcc.s .wkey + ; + 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 .wkey + ; +.del move.l phoneat(pc),a0 + cmp.l #phonenum,a0 + beq .wkey + cmp.b #127,(a0) + bne.s .noc + move.b #32,(a0) + subq #1,a0 +.noc move.b #127,(a0) + move.l a0,phoneat + ; +.undel qkey $41 + bne.s .undel + ; + bra.s .skinc + ; +.done qkey $44 + bne.s .done + ; + bsr dispoff + bsr finitmenu + ; + clr chatok + clr chatoutget + clr chatoutput + ; + 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 + +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 + ; + 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 .skip + ; + ;I'm player 1 + move #1,linked + bra.s .linked + ; +.skip ;I'm actually player 2! + move #-1,linked + ; +.linked move #-1,p2_ob_cntrl + sub.l a0,a0 + bsr makeiff + bsr showiff + lea incharge(pc),a4 + tst linked + bgt.s .goz + lea notincharge(pc),a4 +.goz lea iffwindow,a6 + bsr initmenu + bsr dispon + ; + bsr chaton + bsr selmenu + ; + bsr dispoff + bra finitmenu + +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 + +waitconnect ;wait for 'CONNECT' to arrive... + ;return eq if OK, else ne if 'esc'ed or not received. + ; + sub.l a0,a0 + bsr makeiff + bsr showiff + lea linkmess,a4 + lea iffwindow,a6 + bsr initmenu + bsr dispon + ; +.retry lea wconnect(pc),a2 + ; +.loop qkey $45 ;ESC? + bne .notok + bsr serget + bpl.s .sgok + bsr vwait + bra.s .loop +.sgok cmp.b (a2)+,d0 + bne.s .retry + tst.b (a2) + bne.s .loop + ; +.ok ;OK, connect xxxx ends with 13,10... + ; +.w10 qkey $45 + bne .notok + bsr serget + bpl.s .sgok2 + bsr vwait + bra.s .w10 +.sgok2 cmp.b #10,d0 + bne.s .w10 + ; + bsr dispoff + bsr finitmenu + moveq #0,d0 + rts + ; +.notok bsr dispoff + bsr finitmenu + 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 5 + +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 + +makeiff ;show an IFF picture...128 colours...320 X 240 + ; + ;a0=trimmed iff, a1=iff's palette + ; + push + movem.l a0-a1,-(a7) + lea iffwindow,a0 + bsr freewindow + movem.l (a7)+,a0-a1 + ; + lea iffwindow,a2 + cmp.l #0,a0 + bne.s .notblank + addq #1,a0 + move.l a0,wi_iff(a2) + move.l #rgbs16,a1 + bra.s .blank + ; +.notblank move.l a0,wi_iff(a2) +.blank move.l a1,wi_pal(a2) + ; + ;copy font palette to IFF palette! + ; + move.l font(pc),d0 + beq.s .nofont + ; + move.l d0,a0 + add.l (a0),a0 + addq #2,a0 + clr.l (a1)+ + moveq #14,d0 +.loop move (a0),(a1)+ + move (a0)+,(a1)+ + dbf d0,.loop +.nofont ; + move.l a2,a0 + bsr makewindow + ; + pull + rts + +showiff push + lea iffwindow,a0 + bsr showwindow + pull + rts + +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 dc.b 'JOYSTICK 1',0 ;3 + ; + dc.b 'PLAYER 2 ' +p2ctype dc.b 'JOYSTICK 2',0 ;4 + ; + 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! + +initmenu clr curropt +initmenu2 ; + ;do a menu...menu in a4, window in a6 + ; + move.l a6,menuwindow + move.b (a4)+,d0 ;how many + ext d0 + move d0,numopts + move d0,-(a7) ;counter + move wi_bh(a6),d6 + move.l wi_bmap(a6),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 #40*7,d0 + mulu fonth(pc),d0 + moveq #2,d1 + allocmem menustrip + move.l d0,(a5)+ + move.l d0,a1 + move.l wi_bmap(a6),a0 + move d6,d0 + mulu #7*40,d0 + add.l d0,a0 + ; + move #40*7,d0 + mulu fonth(pc),d0 + lsr.l #2,d0 + subq #1,d0 + ; +.sloop move.l (a0)+,(a1)+ + dbf d0,.sloop + ; + move.l a4,a0 + moveq #-1,d0 +.cnt addq #1,d0 + tst.b (a0)+ + bne.s .cnt + ; + bsr printmess2 + ; + add fonth(pc),d6 + subq #1,(a7) + bgt.s .loop + addq #2,a7 + ; + ifne debugmem + bsr showmem + lea memasc,a4 + moveq #8,d0 + bsr 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 + bsr printmess2 +.nomemerr ; + endc + ; + rts + + ifne debugmem +showmem push + move.l 4.w,a6 + moveq #1,d1 + jsr -216(a6) + 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 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 #7*40,d6 + move.l menubmap(pc),a1 + add.l d6,a1 + ; + move fonth(pc),d0 + mulu #7,d0 + lsl #6,d0 + or #20,d0 + ; + btst #6,$dff002 +.bwait btst #6,$dff002 + bne.s .bwait + ; + move.l #$9f00000,$dff040 + move.l #-1,$dff044 + move #0,$dff064 + move #0,$dff066 + move.l a0,$dff050 + move.l a1,$dff054 + move d0,$dff058 + ; + move #13,flashdelay + ; + rts + +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 + bsr printmess2 + ; + move #13,flashdelay + ; + rts + +readmenujoys ;if in charge...read and send else rec. + ; + tst linked + beq.s .read + bpl.s .readsend + ; +.get bsr serget + bmi.s .none + bsr serput ;send back! + lea joyx(pc),a0 + jmp decodejoy +.none clr.l joyx + clr.l joyb + rts + ; +.readsend bsr .read + lea joyx(pc),a0 + jsr encodejoy + tst.b d0 + beq.s .rts + bsr serput + bsr serwait ;wait for send back! +.rts rts + ; +.read ;OK, read joystick in port 2, and keyboard! + ;merge into joyx,joyy,joyb + ; + 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 + bne.s .fire + rts +.fire move #-1,joyb + rts + +selmenu ;select a menu item...return item in d0 + ; + ;flash selected option on/off + ; + bsr optoff + ; +.loop1 bsr vwait + bsr readmenujoys + tst joyy + blt .up2 + bgt .down2 + tst joyb + bne .sel2 + ; + subq #1,flashdelay + bgt .loop1 + ; + bsr opton + ; +.loop2 bsr vwait + bsr readmenujoys + tst joyy + blt .up + bgt .down + tst joyb + bne .sel + ; + subq #1,flashdelay + bgt .loop2 + ; + bra selmenu + ; +.up2 bsr opton +.up subq #1,curropt + bpl.s .upskip + move numopts(pc),d0 + subq #1,d0 + move d0,curropt +.upskip bsr vwait + bsr readmenujoys + tst joyy + bmi .upskip + bra selmenu + ; +.down2 bsr opton +.down addq #1,curropt + move curropt(pc),d0 + cmp numopts(pc),d0 + bcs.s .downskip + clr curropt +.downskip bsr vwait + bsr readmenujoys + tst joyy + bgt .downskip + bra selmenu + ; +.sel2 bsr opton +.sel bsr vwait + bsr readmenujoys + tst joyb + bne .sel + move curropt(pc),d0 + rts + +finitmenu ;clean up menu operation + ; + lea menustrips(pc),a5 + move numopts(pc),d2 + subq #1,d2 +.loop addq #4,a5 + move.l (a5)+,a1 + freemem menustrip + dbf d2,.loop + rts + +initbmappal move.l smallfont_,a0 + add.l (a0),a0 + addq #2,a0 + moveq #22,d0 ;23 colours to poke! + move.l coplist(pc),a1 + move.l a1,a2 + move.l a1,a3 + move.l a1,a4 + ; + lea cols1+6-copinit(a1),a1 + lea cols2+6-copinit(a2),a2 + lea cols3+6-copinit(a3),a3 + lea cols4+6-copinit(a4),a4 + ; +.loop move (a0),(a1) + move (a0),(a2) + move (a0),(a3) + move (a0)+,(a4) + addq #4,a1 + addq #4,a2 + addq #4,a3 + addq #4,a4 + dbf d0,.loop + rts + +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 + ; + sub.l a0,a0 + bsr makeiff + bsr showiff + lea wpmess,a4 + lea iffwindow,a6 + bsr initmenu + bsr dispon + ; +.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 dispoff + bsr finitmenu + 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 decrm+32 + 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 + +andtable dc $ffff,0 ;rgb and, brightness add...wht + dc $ff00,8 ;red + +makepalettes ; + ;make wht and red pals + ; + ;create pointers... + ; + lea palettes(pc),a0 + move.l map_rgbs(pc),d0 + lea palettesw(pc),a1 + move.l map_rgbsw(pc),d1 + lea palettesr(pc),a2 + move.l map_rgbsr(pc),d2 + ; + moveq #15,d7 + ; +.loop move.l (a0)+,d3 + sub.l d0,d3 ;offset! + move.l d3,d4 + add.l d1,d3 + move.l d3,(a1)+ + add.l d2,d4 + move.l d4,(a2)+ + ; + dbf d7,.loop + ; + move.l map_rgbsend(pc),d7 + sub.l map_rgbs(pc),d7 ;how many bytes! + lsr #1,d7 + subq #1,d7 ;words! + ; + move.l map_rgbsw(pc),a1 + move #$ffff,d1 ;col and + move #0,d2 ;gamma + bsr makeapal + ; + move.l map_rgbsr(pc),a1 + move #$ff00,d1 + moveq #16,d2 + bsr makeapal + ; + rts + +makeapal move.l map_rgbs(pc),a0 + ; +.loop move (a0)+,d4 ;src colour...find briteness + ; + move d4,d5 + move d4,d6 + and #$f00,d4 + lsr #8,d4 + and #$0f0,d5 + lsr #4,d5 + and #$00f,d6 + add d6,d5 + add d5,d4 + add d2,d4 + cmp #16*3,d4 + bcs.s .bok + moveq #16*3-1,d4 +.bok ext.l d4 + divu #3,d4 ;(r+g+b)/3=briteness! + ; + move d4,d5 + move d4,d6 + lsl #8,d4 + lsl #4,d5 + or d6,d5 + or d5,d4 ;RGB + and d1,d4 + ; + move d4,(a1)+ + ; + cmp.l map_rgbsend(pc),a0 + bcs.s .loop + ; + rts + +calcpalettes ;OK, our palette currently runs from: + ; + ;map_rgbs + ; to + ;map_rgbsat + ; + ;append brightness versions... + ; + lea palettes(pc),a2 + move.l map_rgbs(pc),(a2)+ ;first brightness! + move.l map_rgbsat(pc),a1 ;first brightness! + move.l a1,a3 + moveq #1,d0 ;rgb subtract + ; +.loop move.l map_rgbs(pc),a0 + move.l a1,(a2)+ + ; +.loop2 move (a0)+,d1 + move d1,d2 + move d1,d3 + ; + and #$f00,d1 + lsr #8,d1 + sub d0,d1 + bpl.s .rok + moveq #0,d1 +.rok ; + and #$f0,d2 + lsr #4,d2 + sub d0,d2 + bpl.s .gok + moveq #0,d2 +.gok ; + and #$0f,d3 + sub d0,d3 + bpl.s .bok + moveq #0,d3 +.bok ; + lsl #8,d1 + lsl #4,d2 + or d3,d2 + or d2,d1 + or #$8000,d1 + ; + move d1,(a1)+ + cmp.l a3,a0 + bcs.s .loop2 + ; + addq #1,d0 + cmp #16,d0 + bcs.s .loop + ; + move.l a1,map_rgbsend + ; + rts + +map_rgbsend dc.l 0 + +dispoff tst dispnest + bne.s .skip + bsr vwait + move #$01a0,$dff096 ;bp/cop/spr off! +.skip addq #1,dispnest + rts + +dispon subq #1,dispnest + bgt.s .skip + bsr vwait + move.l coplist(pc),$dff080 + move #0,$dff088 + move #$8080,$dff096 ;cop on! + move #0,$dff088 +.skip rts + +forbid 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 + +permit push + move.l 4.w,a6 + jsr -138(a6) + bsr disownblitter + pull + 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 + +ownblitter push + move.l grbase,a6 + jsr -456(a6) + btst #6,$dff002 +.bwait btst #6,$dff002 + bne.s .bwait + pull + rts + +disownblitter push + btst #6,$dff002 +.bwait btst #6,$dff002 + bne.s .bwait + move.l grbase,a6 + jsr -462(a6) + pull + rts + +makecoloffs push + ; + lea coloffs,a0 + moveq #2,d0 + moveq #3,d2 +.loop addq.l #4,d0 + moveq #31,d1 +.loop2 move.l d0,(a0)+ + addq.l #4,d0 + dbf d1,.loop2 + dbf d2,.loop + ; + pull + 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 + +calcbpos ;also: calc qstripbot, con0poke... + ; + move window1+wi_h,d0 + add d0,d0 + ext.l d0 + add.l qstrip(pc),d0 + move.l d0,qstripbot + ; + move #$100,con0poke + move floorflag(pc),d0 + and roofflag(pc),d0 + bne.s .cp + move #$9f0,con0poke ;one of them is cop strip! +.cp ; + move window1+wi_y,d0 + subq #4,d0 + move d0,minbpos + tst twowins + beq.s .p1 + ; + move window2+wi_y,d0 + add window2+wi_bh,d0 + addq #4,d0 + move d0,maxbpos + rts + ; +.p1 move window1+wi_y,d0 + add window1+wi_bh,d0 + addq #4,d0 + move d0,maxbpos + ; + rts + +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 + ; + 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 + +chatmap dc.l 0 + +initdisplay push + ; + lea grname,a1 + move.l 4.w,a6 + jsr -408(a6) + move.l d0,grbase + ; + move.l d0,a6 + move.l 34(a6),oldview + sub.l a1,a1 + jsr -222(a6) ;loadview + ; + move.l #copinitf-copinit,d0 + moveq #2,d1 + allocmem copinit + move.l d0,coplist + ; + move.l d0,a1 + lea copinit,a0 + lea copinitf,a2 + ; +.loop cmp.l a2,a0 + bcc.s .done + move.l (a0)+,(a1)+ + bra.s .loop +.done ; + add.l #sl1-copinit,d0 + move.l d0,slice1 + add.l #sl2-sl1,d0 + move.l d0,slice2 + add.l #cstop-sl2,d0 + move.l d0,copstop + ; + move.l copstop,d0 + move.l slice1,a0 + move.l slice2,a1 + ; + move d0,72+6(a0) + move d0,72+6(a1) + swap d0 + move d0,72+2(a0) + move d0,72+2(a1) + ; + move.l #80*2*5,d0 + moveq #2,d1 + allocmem chatplanes + move.l d0,chatmap + ; + move d0,chatplanes+6 + swap d0 + move d0,chatplanes+2 + swap d0 + add.l #80,d0 + move d0,chatplanes+14 + swap d0 + move d0,chatplanes+10 + ; + bsr chatoff + ; + jsr -270(a6) + jsr -270(a6) + move.l coplist,$dff080 + move #0,$dff088 + ; + pull + rts + +allocwbmap move wi_w(a2),d0 + mulu wi_pw(a2),d0 + move d0,wi_bw(a2) + ; + move wi_h(a2),d0 + mulu wi_ph(a2),d0 + move d0,wi_bh(a2) + ; + mulu #40*7,d0 + ; + move.l #$10002,d1 + move.l d0,wi_bmapmem(a2) + allocmem wi_bmap + move.l d0,wi_bmap(a2) + ; + move.l #40*7*7,d0 + moveq #2,d1 + allocmem wi_strip + move.l d0,wi_strip(a2) + ; + rts + +windowiff ;draw iff into window! + ; + move.l wi_iff(a2),a0 + cmp.l #1,a0 + bne.s .do + rts + ; +.do move.l wi_bmap(a2),a1 + ; + move 2(a0),d1 + cmp #240,d1 + bcs.s .skip + move #240,d1 +.skip move #120,d2 + lsr #1,d1 + sub d1,d2 + mulu #7*40,d2 + add.l d2,a1 + ; +decodeiff ;for 40 columns... + ; + ;a0=trimmed IFF file, + ;a1=destination bitmap... + ; + move.l a2,-(a7) + moveq #40,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 + ; +.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 d7,a1 + dbf d5,.loop4 + dbf d1,.loop5 + ; + move.l (a7)+,a2 + rts + +plotwbmap ;OK, plot colours on bitmap! + ; + move.l wi_iff(a2),d0 + bne windowiff + ; + move.l wi_bmap(a2),a0 + move wi_x(a2),d0 + move d0,d1 + lsr #3,d0 + not d1 + and #7,d1 + moveq #127,d7 ;colour + move wi_w(a2),d6 ;width + subq #1,d6 + ; +.wloop move wi_pw(a2),d5 + subq #1,d5 + ; +.wloop2 move d7,d4 + moveq #6,d3 + ; +.dloop bclr d1,0(a0,d0) + lsr #1,d4 + bcc.s .dskip + bset d1,0(a0,d0) +.dskip lea 40(a0),a0 + dbf d3,.dloop + ; + lea -40*7(a0),a0 + subq #1,d1 + bpl.s .dskip2 + moveq #7,d1 + addq #1,d0 +.dskip2 dbf d5,.wloop2 + ; + subq #1,d7 + dbf d6,.wloop + ; + move wi_bh(a2),d0 ;how many to copy + subq #1,d0 + bsr wcopy + ; + move.l wi_bmap(a2),a0 + move.l wi_strip(a2),a1 + move wi_bh(a2),d0 + lsr #2,d0 + mulu #7*40,d0 + add.l d0,a0 + move #7*7*10-1,d2 + ; +.loop move.l (a0)+,(a1)+ + dbf d2,.loop + ; + rts + +wcopy ;copy top scanline to next d0 scanlines + ; + move.l wi_bmap(a2),a0 + mulu #10*7,d0 + subq #1,d0 + lea 40*7(a0),a1 +.cbloop move.l (a0)+,(a1)+ + dbf d0,.cbloop + ; + rts + +freewindow ;window in a0 + ; + push + move.l a0,a2 + move.l wi_bmap(a2),d0 + beq.s .no1 + clr.l wi_bmap(a2) + move.l d0,a1 + freemem wi_bmap +.no1 move.l wi_strip(a2),d0 + beq.s .no2 + clr.l wi_strip(a2) + move.l d0,a1 + freemem wi_strip +.no2 move.l wi_cop1(a2),d0 + beq.s .no3 + clr.l wi_cop1(a2) + move.l d0,a1 + freemem wi_cop +.no3 pull + rts + +makewindow ;make window + ; + ;a0=window struct! + ; + push + ; + move.l a0,a2 + ; + bsr allocwbmap + bsr plotwbmap + ; + tst.l wi_iff(a2) + beq wchunky + ; + ;make a palette coplist for the window + ; + ;to write 32 colours... + ;set bank, write hi nybs, set bank, write lo nybs... + ;=66 copins. + ;*4=264 total + ;+1 for final wait +3 for final copjump=268 + ; + move.l #268<<2,d0 + move.l d0,wi_copmem(a2) + moveq #2,d1 + allocmem wi_iffcop + move.l d0,wi_cop(a2) + move.l d0,wi_cop1(a2) + move.l d0,wi_cop2(a2) + move.l d0,a0 ;dest + move.l wi_pal(a2),a1 ;palette! + ; + moveq #0,d0 ;bank + moveq #3,d3 ;something. + ; +.loop move #$106,(a0)+ + move d0,(a0)+ + move #$180,d1 + moveq #31,d2 +.hiloop move d1,(a0)+ + move (a1),(a0)+ + addq #4,a1 + addq #2,d1 + dbf d2,.hiloop + ; + lea -128+2(a1),a1 + move #$106,(a0)+ + bset #9,d0 + move d0,(a0)+ + bclr #9,d0 + move #$180,d1 + moveq #31,d2 +.loloop move d1,(a0)+ + move (a1),(a0)+ + addq #4,a1 + addq #2,d1 + dbf d2,.loloop + subq #2,a1 + ; + add #$2000,d0 ;next bank! + dbf d3,.loop + ; + move.l #$fffffffe,(a0)+ + move.l #$00840000,(a0)+ + move.l #$00860000,(a0)+ + move.l #$008a0000,(a0)+ + pull + rts + ; +wchunky ;how many copins on one line? + ; + move wi_w(a2),d0 + move d0,d1 + subq #1,d0 + lsr #5,d0 ;how many bank changes per line! + addq #3,d0 ;1 waits - 1 eor, 1 init bank select + add d1,d0 ;+colpokes + ; + move d0,d1 + lsl #2,d1 + move d1,wi_copmod(a2) + ; + mulu wi_h(a2),d0 + addq #4,d0 ;1 wait and cop jump at end + ; + lsl.l #2,d0 ;4 bytes/copins + moveq #2,d1 ;cop in chip + move.l d0,wi_copmem(a2) + lsl.l #1,d0 ;2 coplists! + allocmem wi_chunkycop + move.l d0,wi_cop(a2) + move.l d0,wi_cop1(a2) + ; + move.l d0,a0 + move wi_y(a2),d6 + move wi_h(a2),d7 + subq #1,d7 + move #$111,d3 ;test colour + move #$8000,d4 ;Colour Eor + ; +.hloop ;make one copline... + ; + moveq #127,d0 ;colour reg to poke + move wi_w(a2),d1 + subq #1,d1 + ; +.lloop move d0,d2 + addq #1,d2 + and #31,d2 + bne.s .notnbank + ; + ;new bank.... + move d0,d2 + sub #31,d2 + and #$ffe0,d2 + lsl #8,d2 + or d4,d2 ;eor bank + move #$106,(a0)+ ;bank select + move d2,(a0)+ + ; +.notnbank move d0,d2 + and #31,d2 + add d2,d2 + add #$180,d2 + move d2,(a0)+ ;colour poke + move d3,(a0)+ + add #$111,d3 + subq #1,d0 + dbf d1,.lloop + ; + bsr .makewait + ; + ;ok, now do EOR! + move #$10c,(a0)+ + move d4,(a0)+ + bchg #15,d4 + ; + dbf d7,.hloop + ; + bsr .makewait + ; + move.l #$00840000,(a0)+ + move.l #$00860000,(a0)+ + move.l #$008a0000,(a0)+ + ; + ;OK, 1 list created...copy to other! + ; + move.l wi_cop1(a2),a0 + move.l a0,a1 + add.l wi_copmem(a2),a1 + move.l a1,wi_cop2(a2) + move.l a1,a3 + ; +.copycop move.l (a0)+,(a3)+ + cmp.l a1,a0 + bcs.s .copycop + ; + pull + rts + +.makewait ; + ;make wait ins. at pos d6 + ; + subq #1,d6 + move.b d6,(a0)+ + move.b #$e1,(a0)+ + move #$fffe,(a0)+ + addq #1,d6 + add wi_ph(a2),d6 + 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,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 + +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 +.ob_colltype dc 8 +p1_ob_collwith dc 6 ;6=combat, 4=game +p1_ob_cntrl dc 0 ;for player 0,1=joyport, 2=keys +.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 +.ob_colltype dc 16 +p2_ob_collwith dc 5 ;5=combat, 4=game +p2_ob_cntrl dc 1 ;for player 0,1=joyport, 2=keys, 3=serial +.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 $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 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 $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 + +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 $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 + +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 $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 + +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 $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 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 0 +.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 -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 10 +.ob_hitpoints dc 100 +.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 rts +.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 $60000 +.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 + +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 + +gloombrush incbin gloombrush + +gloom incbin title +gloompal incbin title.pal + +medplayer incbin medplay +decrm incbin decrm + +castrotsinc incbin castrots.bin +camrotsinc incbin camrots.bin ;256 +camrots2inc incbin camrots2.bin ;1024 +chatfont incbin chatfont.bin + +rgbs16 ds.l 16 +map_rgbs_ ds.w 256*16 diff --git a/gloom.s.squash b/gloom.s.squash new file mode 100644 index 0000000..37d3064 --- /dev/null +++ b/gloom.s.squash @@ -0,0 +1,10348 @@ + + ;********* + ;* GLOOM * + ;********* + ; + ;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! + ; +debugser equ 0 +debugmem equ 0 +onedemo equ 0 +aga equ -1 + ; +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 16 ;max rotating thingys. + ; +focshft equ 6 +grdshft equ 8 +darkshft equ 7 ;smaller=smaller range=faster! +maxz equ 16<>1 + ; +linemod equ 40*7 + + 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*15 ;=16 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_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_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_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... +ob_wlevel rs.w 1 ;weapon type (0...4) +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 ;nomralized 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_copmod 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 + +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 + +entrypoint +cli ; + move.l a0,a2 + ; + 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 + ; + clr.l map_test + cmp.b #'@',(a2)+ + bne.s main + lea tempfile,a0 + move.l a0,map_test +.loop move.b (a2)+,(a0) + beq.s main + cmp.b #10,(a0)+ + bne.s .loop + clr.b -(a0) +main ; + bsr bigfont + jsr initmain + ; +.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 + bsr execscript_med + bsr bigfont + ; + bra .intro + ; +exittoos bsr freeobjlist2 + bsr permit + move.l rawstuff,a0 + bclr #0,$3d(a0) + bsr finitser + bsr finitsfx + bsr finitvbint + bsr finitdisplay + bsr freememlist + bsr undir + rts + +; ************* FAST SUBS ******************** + +fastsubs + +smallfont move #6,fontw + move #8,fonth + clr fontoff + rts + +bigfont move #8,fontw + move #10,fonth + move #51,fontoff + 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 = joyf 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 = joyf 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 + +playsfx ;sfx file in a0, vol in d0, priority in d1 + ; + move #$4000,$dff09a + 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 + +sfxvbint movem.l d2-d3/a1-a2,-(a7) + 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 + ; + movem.l (a7)+,d2-d3/a1-a2 + rts + +dogamemenu ; + move #$0020,$dff09a + st paused + move framecnt(pc),-(a7) + move #$8020,$dff09a + ; + move.l player1,a5 + move.l ob_palette(a5),-(a7) + move.l #palettesw,ob_palette(a5) + move.l ob_window(a5),a2 + bsr plotwbmap + ; + tst twowins + beq .p1 + ; + move.l player2,a5 + move.l ob_palette(a5),-(a7) + move.l #palettesw,ob_palette(a5) + move.l ob_window(a5),a2 + bsr plotwbmap +.p1 ; + bsr drawall2 + ; + move.l player1,a5 + lea gamemenu,a4 + move.l ob_window(a5),a6 + jsr initmenu + ; +.loop bsr selmenu + beq .done + ; + subq #1,d0 + bne .notpsize + bsr newpsize + 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 ; + ;MUST BE QUIT GAME! + ; + ;tst linked + ;beq.s .unlk + ;move.b #$80,d0 + ;bsr serput + ; +.unlk move #1,finished + ; +.done bsr finitmenu + ; + tst twowins + beq.s .p12 + ; + move.l player2,a5 + move.l (a7)+,ob_palette(a5) + move.l ob_window(a5),a2 + bsr plotwbmap + bsr initstats + bsr showstats +.p12 ; + move.l player1,a5 + move.l (a7)+,ob_palette(a5) + move.l ob_window(a5),a2 + bsr plotwbmap + bsr initstats + bsr showstats + ; + move #$0020,$dff09a + move (a7)+,framecnt + clr paused + move #$8020,$dff09a + ; + rts + +freewindows lea window1,a0 + bsr freewindow + tst twowins + beq.s .p1 + lea window2,a0 + bsr freewindow +.p1 rts + +largewin move.l player1,a5 + bsr large + tst twowins + beq refresh + move.l player2,a5 + bsr large + bra refresh + +large move.l ob_window(a5),a6 + move wi_pw(a6),d2 + ; + cmp #2,d2 + beq .lhr + ; + ;large lo-res window! + ; + move #324,d0 + move #240,d1 + bra thinkwin + ; +.lhr move #180,d0 + move #240,d1 + bra thinkwin + +newwsize ;window size stuff! + ; + move.l player1,a5 + bsr swapwsize + tst twowins + beq refresh + move.l player2,a5 + bsr swapwsize + bra refresh + +swapwsize ;increment window size! + ; + move.l ob_window(a5),a6 + movem wi_w(a6),d0-d1 ;w,h + move wi_pw(a6),d2 + mulu d2,d0 + mulu d2,d1 + cmp #2,d2 + beq .hr + ; + ;lo-res! + ; + cmp #318,d0 + bcs.s .inc + move #132,d0 + move d0,d1 + bra thinkwin +.inc add #24,d0 + move d0,d1 + cmp #240,d1 + bls thinkwin + move #240,d1 + bra thinkwin + ; +.hr cmp #180,d0 + bcs.s .inc2 + tst twowins + bne .min + add #18,d1 + cmp #240,d1 + bls thinkwin +.min move #132,d0 + move d0,d1 + bra thinkwin +.inc2 add #24,d0 + move d0,d1 + ; +thinkwin move #180,d3 ;max width! + cmp #2,d2 + beq .gmax + move #318,d3 +.gmax cmp d3,d0 + bls .nm + move d3,d0 +.nm ; + cmp #240,d1 + bls .n240 + move #240,d1 +.n240 tst twowins + beq.s .ggt + move #120,d1 +.ggt ; + move #160,d3 + move d0,d4 + lsr #1,d4 + sub d4,d3 ;wi_x + move d3,wi_x(a6) + ; + ext.l d0 + divu d2,d0 + move d0,wi_w(a6) + ; + tst twowins + bne.s .skip3 + ; + move #166,d3 + move d1,d4 + lsr #1,d4 + sub d4,d3 + move d3,wi_y(a6) + ; +.skip3 ext.l d1 + divu d2,d1 + move d1,wi_h(a6) + ; + rts + +newpsize ;toggle pixel size between 2 and 3 + ; + ;copy windows to temp so we can free 'em up later + ; + move.l player1,a5 + bsr swappsize + tst twowins + beq refresh + move.l player2,a5 + bsr swappsize + ; +refresh bsr dispoff + bsr finitmenu + ; + bsr freewindows + bsr putwindow + bsr calcbpos + ; + lea window1,a0 + bsr makewindow + lea window1,a0 + bsr showwindow + ; + tst twowins + beq.s .p1 + ; + lea window2,a0 + bsr makewindow + lea window2,a0 + bsr showwindow + ; +.p1 lea gamemenu,a4 + lea window1,a6 + jsr initmenu2 + ; + bsr drawall2 + bsr dispon + rts + +swappsize move.l ob_window(a5),a6 + movem wi_w(a6),d0-d1 ;w,h + move wi_pw(a6),d2 + mulu d2,d0 + mulu d2,d1 + eor #1,d2 ;2,3... + move d2,wi_pw(a6) + move d2,wi_ph(a6) + ; + bra thinkwin + +drawall2 bsr drawall + bsr drawall +.wait tst showflag + bne.s .wait + rts + +drawall tst doneflag + beq.s drawall ;wait for updated! + clr doneflag + ; + move.l memory(pc),memat + move.l player1(pc),a5 + bsr calcscene + move.l player1(pc),a5 + bsr blitscene + move.l player1(pc),a5 + bsr drawscene + ; + move twowins(pc),d0 + beq.s .p1 + ; + move.l memory(pc),memat + move.l player2(pc),a5 + bsr calcscene + move.l player2(pc),a5 + bsr blitscene + move.l player2(pc),a5 + bsr drawscene + ; +.p1 st showflag + ; + rts + +resetplayer st ob_update(a5) + clr ob_thermo(a5) + clr ob_infra(a5) + clr ob_invisible(a5) + clr ob_messtimer(a5) + clr ob_pixsize(a5) + clr ob_pixsizeadd(a5) + move.l #palettes,ob_palette(a5) + rts + +calcwlevel moveq #0,d0 + move.b ob_weapon(a5),d0 + beq.s .wlg + subq #1,d0 + divu #5,d0 + mulu #20,d0 + ;lsl #4,d0 +.wlg move d0,ob_wlevel(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 ;a6=window, 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 + ; +.loop2 move.b (a4)+,d2 + beq.s .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 .notex + moveq #65+26,d2 + bra.s .notfs +.notex cmp.b #'.',d2 + bne.s .notfs + moveq #65+27,d2 +.notfs and #31,d2 + add #17,d2 +.here add fontoff(pc),d2 + move.l font(pc),a0 + move.l wi_bmap(a6),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.s .loop2 +.done ; + rts + +initstats ; + ;health... + move.l ob_window(a5),a0 + moveq #2,d0 + add wi_x(a0),d0 + move.l wi_bmap(a0),a1 + move.l font(pc),a0 + moveq #2,d1 + moveq #10,d2 + bsr blit + ; + ;weapon... + move.l ob_window(a5),a0 + moveq #2,d0 + add wi_x(a0),d0 + move.l wi_bmap(a0),a1 + move.l font(pc),a0 + moveq #10,d1 + moveq #11,d2 + bsr blit + ; + rts + +putstrip ;a0=window + ; + move.l wi_bmap(a0),a1 + move wi_bh(a0),d0 + lsr #2,d0 + mulu #7*40,d0 + add.l d0,a1 ;dest + move.l wi_strip(a0),a0 ;src + ; + btst #6,$dff002 +.bwait btst #6,$dff002 + bne.s .bwait + ; + move.l #$9f00000,$dff040 + move.l #-1,$dff044 + move #0,$dff064 + move #0,$dff066 + move.l a0,$dff050 + move.l a1,$dff054 + move #(7*7)<<6+20,$dff058 + rts + +loff dc 0 + +showstats ;a5=player + ; + moveq #2,d5 + move ob_hitpoints(a5),d6 + clr loff + bsr showlevel + ; + moveq #10,d5 + move ob_weapon(a5),d6 + lsr #8,d6 + move #51,loff + bsr showlevel + ; + cmp #2,gametype + bne.s .lives + ; + movem wins1(pc),d6-d7 + cmp.l player1,a5 + beq.s .skip + exg d6,d7 +.skip sub d7,d6 + ble.s .rts + ; + subq #1,d6 + move.l ob_window(a5),a0 + move wi_bw(a0),d7 + subq #2,d7 + ; +.loop subq #6,d7 + move d7,d0 + move.l ob_window(a5),a0 + add wi_x(a0),d0 + moveq #2,d1 + moveq #50,d2 + move.l wi_bmap(a0),a1 + move.l font(pc),a0 + bsr blit + dbf d6,.loop + ; +.rts rts + ; +.lives ;show how many lives + move ob_lives(a5),d6 ;how many lives! + beq.s .nolives + ; + move.l ob_window(a5),a0 + move wi_bw(a0),d7 + subq #2,d7 + subq #1,d6 + ; +.lloop subq #6,d7 + move d7,d0 + move.l ob_window(a5),a0 + add wi_x(a0),d0 + moveq #2,d1 + moveq #50,d2 + move.l wi_bmap(a0),a1 + move.l font(pc),a0 + bsr blit + dbf d6,.lloop + ; +.nolives rts + +showlevel moveq #47,d7 + ext.l d6 + divu #5,d6 + subq #1,d6 + bmi.s .skip + ; +.loop moveq #12,d2 + bsr drawh2 + dbf d6,.loop +.skip ; + swap d6 + tst d6 + beq.s .rest + moveq #17,d2 + sub d6,d2 + bsr drawh2 + ; +.rest cmp #47+6*5,d7 + bcc.s .hdone + moveq #17,d2 + bsr drawh2 + bra.s .rest +.hdone ; + rts + +drawh2 add loff(pc),d2 + ; +drawh move.l ob_window(a5),a0 + move d7,d0 + move d5,d1 + add wi_x(a0),d0 + move.l wi_bmap(a0),a1 + move.l font(pc),a0 + addq #6,d7 + ; +blit ;a0=shapetable to blit, a1=bitmap, d0=X, d1=Y, d2=char + ; + add.l 4(a0,d2*4),a0 + ; + mulu #280,d1 + add.l d1,a1 + move d0,d2 + asr #3,d2 + add d2,a1 ;dest! + move.l a0,a2 + add.l (a0),a2 + lea 8(a0),a3 + addq #4,a0 + and #15,d0 + ror #4,d0 + ; + btst #6,$dff002 +.bwait btst #6,$dff002 + bne.s .bwait + ; + move.l a2,$dff050 + move.l a3,$dff04c + move.l a1,$dff048 + move.l a1,$dff054 + ; + move d0,$dff042 + or #$fca,d0 + move d0,$dff040 + move.l #$ffff0000,$dff044 + moveq #-2,d0 + move d0,$dff064 + move d0,$dff062 + moveq #38,d0 + sub (a0)+,d0 + move d0,$dff060 + move d0,$dff066 + move (a0)+,$dff058 + ; + rts + +pixsize dc 0 ;pixel size...at least 2! + +pixelate ;pixel out the coplist! + ; + move pixsize(pc),d1 ;x/y add + ; + ;pixel out vertically, then horizontally + ; + move.l cop(pc),a0 + lea coloffs(pc),a1 + moveq #0,d2 ;x + move d1,d6 + lsr #1,d6 +.forx ; + move.l a0,a3 + lea 0(a1,d2*4),a2 + add.l (a2),a3 + ; + move d2,d5 + add d6,d5 + cmp width(pc),d5 + ble.s .xok + move width(pc),d5 +.xok sub d2,d5 + ble .done + subq #1,d5 + ; +.loop2 moveq #0,d3 + move.l a3,a4 + move.l a0,a5 + add.l (a2)+,a5 + move d1,d7 + lsr #1,d7 ;first Y add +.fory ; + move (a4),d0 ;start column! + move d3,d4 + add d7,d4 + cmp hite(pc),d4 + ble.s .yok + move hite(pc),d4 +.yok sub d3,d4 + ble .nextx + subq #1,d4 + ; +.loop move d0,(a5) + add copmod(pc),a4 + add copmod(pc),a5 + ; + dbf d4,.loop + ; +.nexty add d7,d3 + move d1,d7 + bra.s .fory + ; +.nextx dbf d5,.loop2 + ; + add d6,d2 + move d1,d6 + bra.s .forx + ; +.done rts + +makeqstrip ; + ;do a simple roof/floor strip for blitter to wack in... + ; + cmp #$100,con0poke + bne.s .doit + rts + ; +.doit move.l qstrip(pc),a0 + move.l darktable(pc),a1 + move.l palette(pc),a2 + move.l qstripbot(pc),a4 + moveq #0,d2 + ; + move floorflag(pc),d0 + bne.s .fdone + ; + move camy(pc),d0 + neg d0 + ext.l d0 + lsl.l #focshft,d0 + ; + move.b qcols+1(pc),d2 + move.l qstripbot(pc),a4 + move maxy(pc),d1 + ; +.floop subq #1,d1 + beq.s .fdone + ; + move.l d0,d3 + divs d1,d3 + cmp #maxz,d3 + bcc .fdone + ; + move 0(a1,d3*2),d3 ;darkness (0...15) + move.l 0(a2,d3*4),a3 ;pal to use + move 0(a3,d2*2),-(a4) ;colour! + ; + bra.s .floop + ; +.fdone move roofflag(pc),d0 + bne.s .rdone + ; + move #-256,d0 + sub camy(pc),d0 + ext.l d0 + lsl.l #focshft,d0 ;cam Y + ; + move.b qcols(pc),d2 + ; + move miny(pc),d1 ;SY + ; +.rloop beq.s .rdone + ; + move.l d0,d3 + divs d1,d3 + cmp #maxz,d3 + bcc .rdone + ; + move 0(a1,d3*2),d3 ;darkness (0...15) + move.l 0(a2,d3*4),a3 ;pal to use + move 0(a3,d2*2),(a0)+ ;colour! + ; + addq #1,d1 + bra.s .rloop +.rdone ; + moveq #0,d0 +.loop cmp.l a4,a0 + bcc.s .done + move.l d0,(a0)+ + bra.s .loop + ; +.done 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 copmod(pc),d1 + move d1,flatyadd2 + ; + move d7,d0 + add midy(pc),d0 + mulu copmod(pc),d0 + add.l cop(pc),d0 + add.l coloffs(pc),d0 + move.l d0,a2 +.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 d7,-(a7) + moveq #127,d7 + moveq #0,d2 + moveq #0,d3 + ; + move.l a2,a3 + ; + move wdiv32(pc),-(a7) + ; +.hloop2 moveq #31,d5 + ; +.hloop tst (a3) ;check destination! + bne.s .skip + ; + and d7,d0 + and d7,d1 ;X/Z for fetch! + move d0,d2 + lsl #7,d2 + lea 0(a0,d2),a6 + move.b 0(a6,d1),d3 + move 0(a5,d3*2),(a3) + ; +.skip add.l d4,d0 + addx d2,d0 + add.l d6,d1 + addx d2,d1 + addq #4,a3 + dbf d5,.hloop + ; + addq #4,a3 + subq #1,(a7) + bgt.s .hloop2 + bne.s .kl + ; + move wrem32(pc),d5 + bpl.s .hloop + ; +.kl 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 + ; + ifne aga + add.l 0(a0,d0*4),a6 + elseif + lsl #2,d0 + add.l 0(a0,d0),a6 + endc + ; +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 + +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.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 #4,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 + bsr loadfile + move.l d0,(a2) + beq.s .skip + move.l d0,a0 + bsr 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 + bsr loadfile + clr.b (a3) + move.l d0,4(a2) + beq.s .rts + move.l d0,a0 + bsr 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 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 + ; + rts + +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 + ; + 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 + +savernd lea rndtable(pc),a0 + lea rndback(pc),a1 + moveq #(rndtablef-rndtable)/2-1,d0 +.loop move (a0)+,(a1)+ + dbf d0,.loop + rts + +loadrnd lea rndback(pc),a0 + lea rndtable(pc),a1 + moveq #(rndtablef-rndtable)/2-1,d0 +.loop move (a0)+,(a1)+ + dbf d0,.loop + rts + +rndtable ds.w 55 +k_index dc.l 0 +j_index dc.l 0 +rndtablef + +rndback ds.b rndtablef-rndtable + +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 + +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 + +currplayer dc.l 0 + +calcscene ;a5=player object + ; + move #$20,$dff09a + ; + move.l a5,currplayer + move.l ob_palette(a5),palette + move ob_thermo(a5),thermo + move ob_infra(a5),infra + move ob_pixsize(a5),pixsize + ; + clr.l shapelist + move.l a5,a0 + bsr calccamera + bsr makewalls + ; + lea objects(pc),a5 + ; +.loop move.l (a5),a5 + tst.l (a5) + beq.s .done + cmp.l currplayer(pc),a5 + beq.s .loop + move.l ob_render(a5),a0 + 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 bclr #7,ob_update(a5) + beq.s .noupdate + ; + bclr #7,ob_update+1(a5) + beq.s .stats + ; + move.l ob_window(a5),a2 + moveq #9,d0 + bsr wcopy + bsr initstats + ; +.stats bsr showstats + ; +.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 + ; +.wait tst showflag + bne.s .wait + ; + move.l ob_window(a5),a0 + bsr dbwindow + ; + bsr castwalls + bsr makeqstrip + bsr renderwalls + ; + move floorflag(pc),d0 + ble.s .nofloor + ; + move camy(pc),d0 + neg d0 + moveq #-1,d1 + move maxy(pc),d7 + subq #1,d7 + lea groundtile,a0 + bsr flat + ; +.nofloor move roofflag(pc),d0 + ble.s .noflat + ; + move #-255,d0 + sub camy(pc),d0 + moveq #1,d1 + move miny(pc),d7 + lea ceilingtile,a0 + bsr flat + ; +.noflat bsr drawshapes + bsr drawblood + ; + move.l currplayer(pc),a0 + move ob_pixsizeadd(a0),d0 + beq .done + add d0,ob_pixsize(a0) + move ob_pixsize(a0),d0 + beq .fin + cmp #24,d0 + bne .pix + ; + ;ok, big pixels + ; + move finished2(pc),finished + bne .pix + ; + move #$20,$dff09a + move ob_telex(a0),ob_x(a0) + move ob_telez(a0),ob_z(a0) + move ob_telerot(a0),ob_rot(a0) + neg ob_pixsizeadd(a0) + move #$8020,$dff09a + bra.s .pix + ; +.fin clr ob_pixsizeadd(a0) + ; +.pix move d0,pixsize + bsr pixelate + ; +.done rts + +vbhandler ; + subq #1,(a1)+ + addq #1,(a1) + ; + tst showflag + beq.s .noshow + ; + ;don't show if beam in the way! + ; + move.l $dff004,d0 + lsr.l #8,d0 ;beampos + and #$1ff,d0 + cmp minbpos(pc),d0 + bcs.s .ok + cmp maxbpos(pc),d0 + bcs.s .noshow + ; +.ok clr showflag + lea window1,a0 + bsr showwindowq + lea window2,a0 + bsr showwindowq + ; +.noshow bsr sfxvbint + ; + move fadevol(pc),d0 + beq.s .nofade + move.l medat(pc),a1 + sub #$80,fadevol + bgt.s .setvol + clr fadevol + jsr 12(a1) ;stop song + bra.s .nofade +.setvol move fadevol(pc),d0 + lsr #8,d0 + jsr 16(a1) ;set volume + ; +.nofade btst #0,framecnt+1 + beq rts + tst paused + bne exit_vb2 + ; + ;OK, movement/animation stuff! + ; + movem.l d0-d7/a0-a6,-(a7) + ; + 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 + 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 movem.l (a7)+,d0-d7/a0-a6 +exit_vb2 st doneflag + 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_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) + movem.l ob_xvec(a5),d6-d7 + add.l ob_x(a5),d6 + add.l ob_z(a5),d7 + bsr checknew + beq.s .newok + clr.l ob_xvec(a5) + clr.l ob_zvec(a5) + rts + ; +.newok move.l d6,ob_x(a5) + move.l d7,ob_z(a5) + 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 + +blowobject move.l diesfx(pc),a0 + moveq #64,d0 + moveq #2,d1 + bsr playsfx + ; + 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 + 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_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 + bra killobject + +hurtghoul moveq #31,d7 + bsr bloodymess + rts + +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 + +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 pickplayer + tst ob_invisible(a0) + bne.s .useold ;can't see player! no intelligence... + ; + bsr calcangle + 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_frame(a0) + move.l a3,ob_chunks(a0) + ; + move ob_rot(a5),d0 + and #255,d0 + move.l camrots(pc),a1 + ; + ifne aga + lea 0(a1,d0*8),a1 + elseif + lsl #3,d0 + lea 0(a1,d0),a1 + endc + ; + 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 + +fire1 bsr pickplayer + bsr calcangle + move d0,-(a7) + bsr rndw + tst ob_invisible(a0) + bne.s .inv + and #16,d0 + subq #8,d0 +.inv 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 #baldylogic,ob_logic(a5) + bsr rnddelay + ; + bra monsterfix + ; +baldy_skip ;close to player? start throwing punches around! + ; + bsr pickplayer + bsr calcangle + 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 + +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? + ; + bsr pickplayer + bsr calcbangle + ; + 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 #baldycharge,ob_logic(a5) + ; + rts + +terralogic ; + move ob_rot(a5),ob_oldrot(a5) + subq #1,ob_delay(a5) + bgt monstermove + ; + ;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 pickplayer + bsr calcangle + 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 + ; + 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 pickplayer + bsr calcangle + 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 + ; +.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 #20,d0 + lea wtable(pc),a0 + moveq #4,d2 ;colltype + moveq #0,d3 ;collwith + movem 2(a0,d0),d4-d6 ;hits,dam,speed + moveq #0,d7 ;acc + move.l 8(a0,d0),a2 ;bullets + move.l 12(a0,d0),a3 ;sparks + move.l 16(a0,d0),-(a7) + ; + 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 pickplayer + bsr calcangle + move d0,-(a7) + bsr rndw + tst ob_invisible(a0) + bne.s .inv + and #16,d0 + subq #8,d0 +.inv add (a7)+,d0 + and #255,d0 + 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 pickplayer + bsr calcangle + 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 + +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 d6,ob_x(a5) + move.l d7,ob_z(a5) + move.l ob_framespeed(a5),d0 + add.l d0,ob_frame(a5) + and #3,ob_frame(a5) + rts + +calcvecs move ob_rot(a5),d0 + and #255,d0 + move.l camrots(pc),a0 + ; + ifne aga + lea 0(a0,d0*8),a0 + elseif + lsl #3,d0 + lea 0(a0,d0),a0 + endc + ; + 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 move.l ob_x(a5),d6 + add.l ob_xvec(a5),d6 + move.l ob_z(a5),d7 + add.l ob_zvec(a5),d7 + bra checknew ;ok to stand here? + +playerdead bsr getcntrl + ; + subq #1,ob_delay(a5) + bgt.s .rts + ; + cmp #2,gametype + bne.s .notcom + ; + ;combat game! + ; + move #3,finished2 + move #2,ob_pixsizeadd(a5) + move.l #rts,ob_logic(a5) + move.l player1,a0 + cmp.l a5,a0 + bne.s .got + move.l player2,a0 +.got move #2,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 + ; + ;OK, one player game done! + ; +.allover move #1,finished + rts + ; +.not1p move.l player1,a0 + cmp.l a5,a0 + bne.s .goth + move.l player2,a0 +.goth tst ob_hitpoints(a0) + ble.s .allover + rts + +waitrestart bsr getcntrl + ; + bsr checkfireb + beq.s .rts + ; + 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 + move (a0)+,ob_x(a5) + move (a0)+,ob_z(a5) + move (a0)+,ob_rot(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 + 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 + ; + move.l player1,a0 + cmp.l a5,a0 + bne.s .got + move.l player2,a0 +.got tst ob_hitpoints(a0) + ble.s .draw + ; +.win move.l a5,-(a7) + move.l a0,a5 + addq #1,wins1 + cmp.l player1,a5 + beq.s .wd + subq #1,wins1 + addq #1,wins2 +.wd st ob_update(a5) + clr ob_collwith(a5) + clr ob_colltype(a5) + bsr message + dc.b 'winner!',0 + even + move.l (a7)+,a5 + st ob_update(a5) + bsr message + dc.b 'loser!',0 + even + rts +.draw ; + rts +.notcom ; + subq #1,ob_lives(a5) + bne.s .ngo + bsr message + dc.b 'game over',0 + even +.ngo move #-1,ob_update(a5) + ; +.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 + +healthgot bsr playtsfx + addq #5,ob_hitpoints(a0) + cmp #25,ob_hitpoints(a0) + ble.s .skip + move #25,ob_hitpoints(a0) +.skip st ob_update(a0) + move.l a5,-(a7) + move.l a0,a5 + bsr message + dc.b 'health bonus!',0 + even + 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 + add #$c0,ob_weapon(a0) + cmp #$1900,ob_weapon(a0) + ble.s .skip + move #$1900,ob_weapon(a0) +.skip st ob_update(a0) + move.l a5,-(a7) + move.l a0,a5 + move ob_wlevel(a5),d2 + bsr calcwlevel + cmp ob_wlevel(a5),d2 + beq.s .nob + bsr message + dc.b 'weapon boost!',0 + even + bra.s .nob2 +.nob bsr message + dc.b 'weapon bonus...',0 + even +.nob2 move.l (a7)+,a5 + bra killobject + +invisigot add #1500,ob_invisible(a0) + move.l #rts,ob_render(a0) + move.l a5,-(a7) + move.l a0,a5 + bsr calcwlevel + bsr message + dc.b 'invisibility!',0 + even + move.l (a7)+,a5 + bra killobject + +thermogot 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 + +playertimers 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 + move.l #drawshape_8,ob_render(a5) + 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 ; + rts + +footstep move.l d0,-(a7) + move.l footstepsfx(pc),a0 + moveq #16,d0 + moveq #0,d1 + bsr playsfx + move.l (a7)+,d0 + rts + +prevjoy dc 0 ;previous joy reading! + +cntrls dc.l joyx0,joyx1,joyx2,joyx3 + +getcntrl move ob_cntrl(a5),d0 + cmp #3,d0 ;null modem? + bne.s .notnull + ; + ;OK, control from null modem! + ; + move linkcnt(pc),d0 + beq.s .waitser + ; + subq #1,linkcnt + moveq #0,d0 + lea joyx3(pc),a0 + bra decodejoy + ; +.waitser bsr serget + bpl.s .sergot + ; + ;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 + bra.s .waitser + ; +.sergot lea joyx3(pc),a0 + tst.b d0 + bpl decodejoy + and #$ff,d0 + move d0,finished + move.l #rts,ob_logic(a5) + moveq #0,d0 + bra decodejoy + ; +.notnull lea cntrls(pc),a0 + move.l 0(a0,d0*4),a0 ;address of cntrl table... + move linked(pc),d0 + beq.s .rts + ; + bsr encodejoy + move.l a0,a2 + bsr serput ;output it! + move.l a2,a0 + move prevjoy(pc),d1 ;use previous! + move d0,prevjoy ;new previous + move d1,d0 + bra decodejoy + ; +.rts rts + +playerlogic bsr playertimers + ; + move.l ob_x(a5),d6 + move.l ob_z(a5),d7 + ; + bsr checknewslow + beq.s .newok + bsr adjustpos + beq.s .newok2 + ; + subq #1,ob_hitpoints(a5) + st ob_update(a5) + bra redpal + ; + ;bsr adjustpos + ;beq.s .newok2 + ; + warn #$f00 + ; +.newok2 move.l d6,ob_x(a5) + move.l d7,ob_z(a5) +.newok ; + bsr getcntrl ;update controller block, + ;and put in a0 + ; + move (a0),d0 ;joyx - rotate + muls ob_rotspeed(a5),d0 + add ob_rot(a5),d0 + and #255,d0 + move d0,ob_rot(a5) + ; + move 2(a0),d4 ;joyy + bne.s .speed + ; + ;OK, standing still! + ; + and #255,ob_bounce(a5) + beq.s .nob + add #32,ob_bounce(a5) + cmp #128,ob_bounce(a5) + ble.s .nob + clr ob_bounce(a5) + bsr footstep +.nob clr.l ob_frame(a5) + bra checkfire + ; +.speed add #16,ob_bounce(a5) + move ob_bounce(a5),d1 + sub #64,d1 + and #255,d1 + bne.s .fskip + bsr footstep +.fskip ; + move.l ob_framespeed(a5),d1 + add.l d1,ob_frame(a5) + and #3,ob_frame(a5) + ; + neg d4 + muls ob_movspeed(a5),d4 ;speed + move.l camrots(pc),a1 + lea 0(a1,d0*8),a1 + ; + move d4,d5 ;real speed + muls 2(a1),d4 + add.l d4,d4 + muls 6(a1),d5 + add.l d5,d5 + ; + move.l ob_x(a5),d6 + move.l ob_z(a5),d7 + ; + neg.l d4 + add.l d4,d6 + add.l d5,d7 + ; + bsr checknewslow + beq.s .newpos + bsr adjustpos + beq.s .newpos + bsr adjustposq + ; +.newpos move.l d6,ob_x(a5) + move.l d7,ob_z(a5) +.useold ; + tst ob_pixsizeadd(a5) + bne checkfire + ; + bsr checknew2 ;in a trigger zone? + beq.s checkfire + ; + move zo_ev(a4),d0 ;poly->event + bmi.s checkfire + ; + cmp #24,d0 + bne.s .notexit + ; + move #3,finished2 ;pattern done! + move #2,ob_pixsizeadd(a5) + ; + move d0,-(a7) + bsr dotelesfx + move (a7)+,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 + bsr execevent + move.l eventobj(pc),a5 +checkfire ; + bsr checkfireb + beq .rts + ; + move ob_collwith(a5),d2 + and #3,d2 + eor #3,d2 ;colltype + ; + lea wtable(pc),a0 + move ob_wlevel(a5),d0 + movem 0(a0,d0),d3-d6 + movem.l 8(a0,d0),a2-a3 + move.l 16(a0,d0),-(a7) + ; + move.b ob_weapon(a5),d0 + sub d3,ob_weapon(a5) + cmp.b ob_weapon(a5),d0 + beq.s .noup + ; + bsr calcwlevel + st ob_update(a5) + ; +.noup moveq #0,d3 + bsr shoot + ; + move.l (a7)+,a0 + move.l (a0),a0 + moveq #32,d0 + moveq #0,d1 + bsr playsfx + ; +.rts rts + + ; + ;weaponuse.w + ;hitpoints + ;damage + ;speed + ; +wtable dc 0,1,1,32 + dc.l bullet1,sparks1,shootsfx3 + dc $8,5,2,36 + dc.l bullet2,sparks2,shootsfx2 + dc $c,10,3,40 + dc.l bullet3,sparks3,shootsfx + dc $10,15,4,40 + dc.l bullet4,sparks4,shootsfx4 + dc $20,20,7,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 lea cntrls(pc),a0 + move ob_cntrl(a5),d0 + move.l 0(a0,d0*4),a0 + move 4(a0),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 ; + 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) + ; + move.l d2,d6 + add.l ob_x(a5),d6 + move.l d3,d7 + add.l ob_z(a5),d7 + ; + bsr checknew + beq putfire + ; + bra calcbounce + +firelogic ; + move.l ob_xvec(a5),d6 + add.l ob_x(a5),d6 + move.l ob_zvec(a5),d7 + add.l ob_z(a5),d7 + ; + bsr checknew + bne calcbounce +.nokill ; +putfire move.l d6,ob_x(a5) + move.l d7,ob_z(a5) + ; + 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 + ; + add.l #$8000,bl_yvec(a5) + ; + movem.l bl_xvec(a5),d0-d2 + add.l d1,bl_y(a5) + blt.s .ok + ; + move.l a5,a0 + killitem blood + move.l a0,a5 + bra.s .loop + ; +.ok add.l d0,bl_x(a5) + add.l d2,bl_z(a5) + bra.s .loop + ; +.done rts + +drawblood lea blood(pc),a5 + ; +.loop move.l (a5),a5 + tst.l (a5) + beq .done + ; + move bl_x(a5),d0 + sub camx(pc),d0 + move bl_y(a5),d1 + 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 #32,d2 + bcc.s .pix + ; + ;blit to screen! + ; + move #$4000,$dff09a + ; + bsr savernd + move.l window(pc),a0 + move wi_bh(a0),d0 + subq #8,d0 + bsr rndn + move d0,d2 ;Y + ; + move wi_bw(a0),d0 + subq #8,d0 + bsr rndn ;X + add wi_x(a0),d0 + move d2,d1 + ; + move.l wi_bmap(a0),a1 + move.l font(pc),a0 + moveq #46,d2 + bsr blit + ; + bsr loadrnd + ; + move.l a5,a0 + killitem blood + move.l a0,a5 + ; + move #$c000,$dff09a + bra .loop +.pix ; + add midx(pc),d0 + add midy(pc),d1 + ; + move.l darktable(pc),a0 + move 0(a0,d2*2),d3 + ; + move.l cop(pc),a1 + ; + lea coloffs,a2 + add.l 0(a2,d0*4),a1 + mulu copmod(pc),d1 + ; + move blcols(pc,d3*2),d3 + and bl_color(a5),d3 + move d3,0(a1,d1.l) + bra .loop + ; +.done rts + +blcols dc $ccc,$bbb,$aaa,$999,$888,$777,$666,$555 + dc $444,$333,$222,$111,$000,$000,$000,$000 + +;blcols dc $fff,$eee,$ddd,$ccc,$bbb,$aaa,$999,$888 + dc $777,$666,$555,$444,$333,$222,$111,$000 + +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 + ; + ifne aga + add.l 12(a0,d0*4),a0 + elseif + lsl #2,d0 + add.l 12(a0,d0),a0 + endc + ; +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) + ; + 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 + +mover ; + ;d4=x speed + ;d5=z speed + ;d6=x + ;d7=z + ; + ;return d0, ne if a wall was hit! + ;check only walls zone (player) + ; + neg.l d4 + moveq #0,d3 + add.l d4,d6 + bsr checknew + beq.s .xok + moveq #-1,d3 + sub.l d4,d6 +.xok ; + add.l d5,d7 + bsr checknew + beq.s .zok + moveq #-1,d3 + sub.l d5,d7 +.zok tst d3 + 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 + ; + addq #1,frame + ; + 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 + ; + ifne aga + lea 0(a3,d0*2),a0 + elseif + add d0,d0 + lea 0(a3,d0),a0 + endc + ; +.loop2 move (a0)+,d0 ;poly# + lsl #5,d0 + lea 0(a4,d0),a1 ;actual poly + move frame(pc),d0 + cmp zo_done(a1),d0 + beq .skip3 + move d0,zo_done(a1) + tst zo_open(a1) + bmi .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 + ; + 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 dbf d4,.loop2 ;finish sq + ; +.skip dbf d5,.loop ;gridoffs + ; +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 + + 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 + ; + ifne aga + lea 0(a6,d7*8),a6 + elseif + move d7,d0 + lsl #3,d0 + lea 0(a6,d0),a6 + endc + ; + move.l vertdraws(pc),a4 + ; +.loop ;do this vert line! + ; + lea outlist(pc),a5 + ; +.loop2 move.l (a5),d0 + beq .empty + move.l d0,a5 + ; + cmp wl_lsx(a5),d7 + blt.s .loop2 + cmp wl_rsx(a5),d7 + bgt.s .loop2 + ; + movem wl_lx(a5),d0-d1 + muls (a6),d0 + muls 2(a6),d1 + add.l d1,d0 ;LX! + bgt .loop2 + ; + movem wl_rx(a5),d1-d2 + muls (a6),d1 + muls 2(a6),d2 + add.l d2,d1 ;RX! + blt .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<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 decrm+32 + 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 + +andtable dc $ffff,0 ;rgb and, brightness add...wht + dc $ff00,8 ;red + +makepalettes ; + ;make wht and red pals + ; + ;create pointers... + ; + lea palettes(pc),a0 + move.l map_rgbs(pc),d0 + lea palettesw(pc),a1 + move.l map_rgbsw(pc),d1 + lea palettesr(pc),a2 + move.l map_rgbsr(pc),d2 + ; + moveq #15,d7 + ; +.loop move.l (a0)+,d3 + sub.l d0,d3 ;offset! + move.l d3,d4 + add.l d1,d3 + move.l d3,(a1)+ + add.l d2,d4 + move.l d4,(a2)+ + ; + dbf d7,.loop + ; + move.l map_rgbsend(pc),d7 + sub.l map_rgbs(pc),d7 ;how many bytes! + lsr #1,d7 + subq #1,d7 ;words! + ; + move.l map_rgbsw(pc),a1 + move #$ffff,d1 ;col and + move #0,d2 ;gamma + bsr makeapal + ; + move.l map_rgbsr(pc),a1 + move #$ff00,d1 + moveq #16,d2 + bsr makeapal + ; + rts + +makeapal move.l map_rgbs(pc),a0 + ; +.loop move (a0)+,d4 ;src colour...find briteness + ; + move d4,d5 + move d4,d6 + and #$f00,d4 + lsr #8,d4 + and #$0f0,d5 + lsr #4,d5 + and #$00f,d6 + add d6,d5 + add d5,d4 + add d2,d4 + cmp #16*3,d4 + bcs.s .bok + moveq #16*3-1,d4 +.bok ext.l d4 + divu #3,d4 ;(r+g+b)/3=briteness! + ; + move d4,d5 + move d4,d6 + lsl #8,d4 + lsl #4,d5 + or d6,d5 + or d5,d4 ;RGB + and d1,d4 + ; + move d4,(a1)+ + ; + cmp.l map_rgbsend(pc),a0 + bcs.s .loop + ; + rts + +calcpalettes ;OK, our palette currently runs from: + ; + ;map_rgbs + ; to + ;map_rgbsat + ; + ;append brightness versions... + ; + lea palettes(pc),a2 + move.l map_rgbs(pc),(a2)+ ;first brightness! + move.l map_rgbsat(pc),a1 ;first brightness! + move.l a1,a3 + moveq #1,d0 ;rgb subtract + ; +.loop move.l map_rgbs(pc),a0 + move.l a1,(a2)+ + ; +.loop2 move (a0)+,d1 + move d1,d2 + move d1,d3 + ; + and #$f00,d1 + lsr #8,d1 + sub d0,d1 + bpl.s .rok + moveq #0,d1 +.rok ; + and #$f0,d2 + lsr #4,d2 + sub d0,d2 + bpl.s .gok + moveq #0,d2 +.gok ; + and #$0f,d3 + sub d0,d3 + bpl.s .bok + moveq #0,d3 +.bok ; + lsl #8,d1 + lsl #4,d2 + or d3,d2 + or d2,d1 + or #$8000,d1 + ; + move d1,(a1)+ + cmp.l a3,a0 + bcs.s .loop2 + ; + addq #1,d0 + cmp #16,d0 + bcs.s .loop + ; + move.l a1,map_rgbsend + ; + rts + +map_rgbsend dc.l 0 + +dispoff tst dispnest + bne.s .skip + bsr vwait + move #$01a0,$dff096 +.skip addq #1,dispnest + rts + +dispon subq #1,dispnest + bgt.s .skip + bsr vwait + move.l coplist(pc),$dff080 + move #$8180,$dff096 + move #0,$dff088 +.skip rts + +forbid push + moveq #49,d0 +.fl bsr vwait + dbf d0,.fl + bsr ownblitter + move.l 4.w,a6 + jsr -132(a6) + move #$8400,$dff096 + pull + rts + +permit push + move.l rawstuff,a0 + clr.l $70(a0) + move.l 4.w,a6 + jsr -138(a6) + bsr disownblitter + pull + 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 + +finitvbint push + move.l 4.w,a6 + moveq #5,d0 + lea vbintserver,a1 + jsr -174(a6) + pull + rts + +ownblitter push + move.l grbase,a6 + jsr -456(a6) + btst #6,$dff002 +.bwait btst #6,$dff002 + bne.s .bwait + pull + rts + +disownblitter push + btst #6,$dff002 +.bwait btst #6,$dff002 + bne.s .bwait + move.l grbase,a6 + jsr -462(a6) + pull + rts + +makecoloffs push + ; + ifne aga + ; + lea coloffs,a0 + moveq #2,d0 + moveq #3,d2 +.loop addq.l #4,d0 + moveq #31,d1 +.loop2 move.l d0,(a0)+ + addq.l #4,d0 + dbf d1,.loop2 + dbf d2,.loop + ; + elseif + ; + lea coloffs,a0 + moveq #18,d0 + moveq #127,d1 + ; +.loop move.l d0,(a0)+ + addq.l #4,d0 + dbf d1,.loop + ; + endc + ; + pull + 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 + +calcbpos ;also: calc qstripbot, con0poke... + ; + move window1+wi_h,d0 + add d0,d0 + ext.l d0 + add.l qstrip(pc),d0 + move.l d0,qstripbot + ; + move #$100,con0poke + move floorflag(pc),d0 + and roofflag(pc),d0 + bne.s .cp + move #$9f0,con0poke ;one of them is cop strip! +.cp ; + move window1+wi_y,d0 + subq #4,d0 + move d0,minbpos + tst twowins + beq.s .p1 + ; + move window2+wi_y,d0 + add window2+wi_bh,d0 + addq #4,d0 + move d0,maxbpos + rts + ; +.p1 move window1+wi_y,d0 + add window1+wi_bh,d0 + addq #4,d0 + move d0,maxbpos + ; + rts + +showwindow ;a0=window + ; + push + ; + ifne aga + ; + ;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) + ; + move wi_y(a0),d0 + subq #3,d0 + move.b d0,64(a1) + ; + endc + ; + ;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 + ; + ifne aga + ; + move d0,72+6(a0) + swap d0 + move d0,72+2(a0) + ; + elseif + ; + move d0,6(a0) + swap d0 + move d0,2(a0) + ; + endc + ; + rts + +finitdisplay push + ; + 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 + +initdisplay push + ; + lea grname,a1 + move.l 4.w,a6 + jsr -408(a6) + move.l d0,grbase + ; + move.l d0,a6 + move.l 34(a6),oldview + sub.l a1,a1 + jsr -222(a6) ;loadview + ; + move.l #copinitf-copinit,d0 + moveq #2,d1 + allocmem copinit + move.l d0,coplist + ; + move.l d0,a1 + lea copinit,a0 + lea copinitf,a2 + ; +.loop cmp.l a2,a0 + bcc.s .done + move.l (a0)+,(a1)+ + bra.s .loop +.done ; + add.l #sl1-copinit,d0 + move.l d0,slice1 + add.l #sl2-sl1,d0 + move.l d0,slice2 + add.l #cstop-sl2,d0 + move.l d0,copstop + ; + move.l copstop,d0 + move.l slice1,a0 + move.l slice2,a1 + ; + ifne aga + ; + move d0,72+6(a0) + move d0,72+6(a1) + swap d0 + move d0,72+2(a0) + move d0,72+2(a1) + ; + elseif + ; + move d0,6(a0) + move d0,6(a1) + swap d0 + move d0,2(a0) + move d0,2(a1) + ; + endc + ; + jsr -270(a6) + jsr -270(a6) + move.l coplist,$dff080 + move #0,$dff088 + ; + pull + rts + +allocwbmap move wi_w(a2),d0 + mulu wi_pw(a2),d0 + move d0,wi_bw(a2) + ; + move wi_h(a2),d0 + mulu wi_ph(a2),d0 + move d0,wi_bh(a2) + ; + mulu #40*7,d0 + ; + move.l #$10002,d1 + move.l d0,wi_bmapmem(a2) + allocmem wi_bmap + move.l d0,wi_bmap(a2) + ; + move.l #40*7*7,d0 + moveq #2,d1 + allocmem wi_strip + move.l d0,wi_strip(a2) + ; + rts + +windowiff ;draw iff into window! + ; + move.l wi_iff(a2),a0 + cmp.l #1,a0 + bne.s .do + rts + ; +.do move.l wi_bmap(a2),a1 + ; + move 2(a0),d1 + cmp #240,d1 + bcs.s .skip + move #240,d1 +.skip move #120,d2 + lsr #1,d1 + sub d1,d2 + mulu #7*40,d2 + add.l d2,a1 + ; +decodeiff ;for 40 columns... + ; + ;a0=trimmed IFF file, + ;a1=destination bitmap... + ; + move.l a2,-(a7) + moveq #40,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 + ; +.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 d7,a1 + dbf d5,.loop4 + dbf d1,.loop5 + ; + move.l (a7)+,a2 + rts + +plotwbmap ;OK, plot colours on bitmap! + ; + tst.l wi_iff(a2) + bne windowiff + ; + move.l wi_bmap(a2),a0 + move wi_x(a2),d0 + move d0,d1 + lsr #3,d0 + not d1 + and #7,d1 + moveq #127,d7 ;colour + move wi_w(a2),d6 ;width + subq #1,d6 + ; +.wloop move wi_pw(a2),d5 + subq #1,d5 + ; +.wloop2 move d7,d4 + moveq #6,d3 + ; +.dloop bclr d1,0(a0,d0) + lsr #1,d4 + bcc.s .dskip + bset d1,0(a0,d0) +.dskip lea 40(a0),a0 + dbf d3,.dloop + ; + lea -40*7(a0),a0 + subq #1,d1 + bpl.s .dskip2 + moveq #7,d1 + addq #1,d0 +.dskip2 dbf d5,.wloop2 + ; + subq #1,d7 + dbf d6,.wloop + ; + move wi_bh(a2),d0 ;how many to copy + subq #1,d0 + bsr wcopy + ; + move.l wi_bmap(a2),a0 + move.l wi_strip(a2),a1 + move wi_bh(a2),d0 + lsr #2,d0 + mulu #7*40,d0 + add.l d0,a0 + move #7*7*10-1,d2 + ; +.loop move.l (a0)+,(a1)+ + dbf d2,.loop + ; + rts + +wcopy ;copy top scanline to next d0 scanlines + ; + move.l wi_bmap(a2),a0 + mulu #10*7,d0 + subq #1,d0 + lea 40*7(a0),a1 +.cbloop move.l (a0)+,(a1)+ + dbf d0,.cbloop + ; + rts + +freewindow ;window in a0 + ; + push + move.l a0,a2 + move.l wi_bmap(a2),d0 + beq.s .no1 + clr.l wi_bmap(a2) + move.l d0,a1 + freemem wi_bmap +.no1 move.l wi_strip(a2),d0 + beq.s .no2 + clr.l wi_strip(a2) + move.l d0,a1 + freemem wi_strip +.no2 move.l wi_cop1(a2),d0 + beq.s .no3 + clr.l wi_cop1(a2) + move.l d0,a1 + freemem wi_cop +.no3 pull + rts + + ifne aga + ; +agawindow ; +makewindow ;AGA make window + ; + ;a0=window struct! + ; + push + ; + move.l a0,a2 + ; + bsr allocwbmap + bsr plotwbmap + ; + tst.l wi_iff(a2) + beq wchunky + ; + ;make a palette coplist for the window + ; + ;to write 32 colours... + ;set bank, write hi nybs, set bank, write lo nybs... + ;=66 copins. + ;*4=264 total + ;+1 for final wait +3 for final copjump=268 + ; + move.l #268<<2,d0 + move.l d0,wi_copmem(a2) + moveq #2,d1 + allocmem wi_iffcop + move.l d0,wi_cop(a2) + move.l d0,wi_cop1(a2) + move.l d0,wi_cop2(a2) + move.l d0,a0 ;dest + move.l wi_pal(a2),a1 ;palette! + ; + moveq #0,d0 ;bank + moveq #3,d3 + ; +.loop move #$106,(a0)+ + move d0,(a0)+ + move #$180,d1 + moveq #31,d2 +.hiloop move d1,(a0)+ + move (a1),(a0)+ + addq #4,a1 + addq #2,d1 + dbf d2,.hiloop + ; + lea -128+2(a1),a1 + move #$106,(a0)+ + bset #9,d0 + move d0,(a0)+ + bclr #9,d0 + move #$180,d1 + moveq #31,d2 +.loloop move d1,(a0)+ + move (a1),(a0)+ + addq #4,a1 + addq #2,d1 + dbf d2,.loloop + subq #2,a1 + ; + add #$2000,d0 ;next bank! + dbf d3,.loop + ; + move.l #$fffffffe,(a0)+ + move.l #$00840000,(a0)+ + move.l #$00860000,(a0)+ + move.l #$008a0000,(a0)+ + pull + rts + ; +wchunky ;how many copins on one line? + ; + move wi_w(a2),d0 + move d0,d1 + subq #1,d0 + lsr #5,d0 ;how many bank changes per line! + addq #3,d0 ;1 waits - 1 eor, 1 init bank select + add d1,d0 ;+colpokes + ; + move d0,d1 + lsl #2,d1 + move d1,wi_copmod(a2) + ; + mulu wi_h(a2),d0 + addq #4,d0 ;1 wait and cop jump at end + ; + lsl.l #2,d0 ;4 bytes/copins + moveq #2,d1 ;cop in chip + move.l d0,wi_copmem(a2) + lsl.l #1,d0 ;2 coplists! + allocmem wi_chunkycop + move.l d0,wi_cop(a2) + move.l d0,wi_cop1(a2) + ; + move.l d0,a0 + move wi_y(a2),d6 + move wi_h(a2),d7 + subq #1,d7 + move #$111,d3 ;test colour + move #$8000,d4 ;Colour Eor + ; +.hloop ;make one copline... + ; + moveq #127,d0 ;colour reg to poke + move wi_w(a2),d1 + subq #1,d1 + ; +.lloop move d0,d2 + addq #1,d2 + and #31,d2 + bne.s .notnbank + ; + ;new bank.... + move d0,d2 + sub #31,d2 + and #$ffe0,d2 + lsl #8,d2 + or d4,d2 ;eor bank + move #$106,(a0)+ ;bank select + move d2,(a0)+ + ; +.notnbank move d0,d2 + and #31,d2 + add d2,d2 + add #$180,d2 + move d2,(a0)+ ;colour poke + move d3,(a0)+ + add #$111,d3 + subq #1,d0 + dbf d1,.lloop + ; + bsr .makewait + ; + ;ok, now do EOR! + move #$10c,(a0)+ + move d4,(a0)+ + bchg #15,d4 + ; + dbf d7,.hloop + ; + bsr .makewait + ; + move.l #$00840000,(a0)+ + move.l #$00860000,(a0)+ + move.l #$008a0000,(a0)+ + ; + ;OK, 1 list created...copy to other! + ; + move.l wi_cop1(a2),a0 + move.l a0,a1 + add.l wi_copmem(a2),a1 + move.l a1,wi_cop2(a2) + move.l a1,a3 + ; +.copycop move.l (a0)+,(a3)+ + cmp.l a1,a0 + bcs.s .copycop + ; + pull + rts + +.makewait ; + ;make wait ins. at pos d6 + ; + subq #1,d6 + move.b d6,(a0)+ + move.b #$e1,(a0)+ + move #$fffe,(a0)+ + addq #1,d6 + add wi_ph(a2),d6 + rts + + elseif + +ecswindow +makewindow ;ECS makewindow...no bitmap needed! + ; + ;a0=window struct + ; + push + ; + move.l a0,a2 + ; + ;how many copins on one line? + ; + ;2 waits... + ;width moves + ;1 colour 0 poke... + ; + ;=width+3! + ; + move wi_w(a2),d0 + addq #7,d0 + ; + move d0,d1 + lsl #2,d1 + move d1,wi_copmod(a2) + ; + mulu wi_h(a2),d0 + addq #4,d0 ;1 waits at begin and cop jump + ;at end + ; + lsl.l #2,d0 ;4 bytes/copins + moveq #2,d1 ;cop in chip + move.l d0,wi_copmem(a2) + lsl.l #1,d0 ;2 coplists! + allocmem wi_chunkycop + move.l d0,wi_cop(a2) + move.l d0,wi_cop1(a2) + ; + move.l d0,a0 + move #$47,d5 + sub wi_w(a2),d5 + add d5,d5 + or #1,d5 + move wi_y(a2),d6 + move wi_h(a2),d7 + subq #1,d7 + ; + moveq #0,d3 + move #$fffe,d4 + bsr .makewait ;wait! + ; +.hloop ;make one copline... + cmp #128,d6 + ble.s .yn + move.b #$80,d3 +.yn ; + move.l a0,d2 ;prepare jump address + addq.l #8,d2 + ; + move #$084,(a0)+ + swap d2 + move d2,(a0)+ + move #$086,(a0)+ + swap d2 + move d2,(a0)+ + ; + ;wait for start X pos... + ; + move.b d3,(a0)+ + move.b d5,(a0)+ + move #$80fe,(a0)+ + ; + move wi_w(a2),d1 + subq #1,d1 + ; +.lloop move.l #$1800f00,(a0)+ + dbf d1,.lloop + move #$180,(a0)+ + move #col0,(a0)+ + ; + move.b d3,(a0)+ + move.b #$e1,(a0)+ + move #$80fe,(a0)+ ;wait for end of line! + ; + move #$ffff,d4 ;skip! + bsr .makewait + move.l #$8a0000,(a0)+ ;strobe! + ; + dbf d7,.hloop + ; + move.l #$00840000,(a0)+ + move.l #$00860000,(a0)+ + move.l #$008a0000,(a0)+ + ; + ;OK, 1 list created...copy to other! + ; + move.l wi_cop1(a2),a0 + move.l a0,a1 + add.l wi_copmem(a2),a1 + move.l a1,wi_cop2(a2) + move.l a1,a3 + ; + move.l a1,d0 + sub.l a0,d0 + ; +.copycop move.l (a0)+,(a3)+ + cmp #$084,-8(a3) + bne.s .noafix + move -6(a3),d2 + swap d2 + move -2(a3),d2 + add.l d0,d2 + move d2,-2(a3) + swap d2 + move d2,-6(a3) +.noafix cmp.l a1,a0 + bcs.s .copycop + ; + pull + rts + +.makewait ; + ;make wait ins. at pos d6 + ;cmp #256,d6 + ;blt.s .not256 + ;move.l #$ffe1fffe,(a0)+ + ;add wi_ph(a2),d6 + ;rts + ; +.not256 move.b d6,(a0)+ + move.b #1,(a0)+ + move d4,(a0)+ ;wait/skip + add wi_ph(a2),d6 + rts + + endc + +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_rgbsfrom,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,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 + +objinfo +player1_ dc.l player1 +.ob_rotspeed dc.l $40000 +.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 -110 ;eye height +.ob_firey dc -60 ;where bullets come from +.ob_gutsy dc -64 +.ob_othery dc 0 +.ob_colltype dc 8 +p1_ob_collwith dc 6 ;6=combat, 4=game +p1_ob_cntrl dc 1 ;for player 0,1=joyport, 2=keys +.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_wlevel dc 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 $40000 +.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 -110 ;eye height +.ob_firey dc -60 ;where bullets come from +.ob_gutsy dc -64 +.ob_othery dc 0 +.ob_colltype dc 16 +p2_ob_collwith dc 5 ;5=combat, 4=game +p2_ob_cntrl dc 0 ;for player 0,1=joyport, 2=keys, 3=null +.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_wlevel dc 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 $30000 +.ob_framespeed dc.l 0 +.ob_base dc 0 +.ob_range dc 0 +.ob_weapon dc 0 +.ob_wlevel 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 tokens +.ob_logic dc.l rts +.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 $50000 +.ob_framespeed dc.l 0 +.ob_base dc 0 +.ob_range dc 0 +.ob_weapon dc 0 +.ob_wlevel 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 + +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 $10000 +.ob_framespeed dc.l 0 +.ob_base dc 0 +.ob_range dc 0 +.ob_weapon dc 0 +.ob_wlevel 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_ ds.b oilen + +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 $20000 +.ob_framespeed dc.l 0 +.ob_base dc 0 +.ob_range dc 0 +.ob_weapon dc 0 +.ob_wlevel 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_ ds.b oilen + +blank1_ ds.b oilen + +blank2_ ds.b oilen + +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 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_wlevel 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_wlevel 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 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 12 +.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_wlevel 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 $a0000 +.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 10 +.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_wlevel 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 $0f0 ;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_wlevel 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 $50000 +.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 15 +.ob_think dc 0 +.ob_frame dc.l 0 +.ob_framespeed dc.l $5000 +.ob_base dc 32 +.ob_range dc 4 +.ob_weapon dc 0 ;weapon type... +.ob_wlevel 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 + +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 + +groundtile incbin tile2.bin +ceilingtile incbin tile.bin + +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 + +gloombrush incbin gloombrush + +gloom incbin title +gloompal incbin title.pal + +combat incbin combat +combatpal incbin combat.pal + +medplayer incbin medplay +decrm incbin decrm + +castrotsinc incbin castrots.bin +camrotsinc incbin camrots.bin ;256 +camrots2inc incbin camrots2.bin ;1024 + +rgbs16 ds.l 16 +map_rgbs_ ds.w 256*16 diff --git a/gloom.s.vg b/gloom.s.vg new file mode 100644 index 0000000..0ed27d2 --- /dev/null +++ b/gloom.s.vg @@ -0,0 +1,8959 @@ + + ;OK, add a chunky to planar option! + ;A500 etc. here we come! + ; + ;this'll require: + ; + ;user can select: + ; + ;internal 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 -1 +debugmem equ 0 +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! + ; +focshft equ 6 +grdshft equ 8 +darkshft equ 7 ;smaller=smaller range=faster! +maxz equ 16<>1 + ; +linemod equ 40*7 + + jmp entrypoint + + 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_yvec rs.l 1 +bl_zvec rs.l 1 +bl_color rs.l 1 + ; +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, $7fff=open! +wl_prec rs.w 1 ;precision info. +wl_pad rs.w 1 +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 +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_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_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... +ob_wlevel rs.w 1 ;weapon type (0...4) +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_apad rs.w 1 + ; +ob_acc rs.l 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 ;nomralized 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_copmod 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 + +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 + + + +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 + +entrypoint +cli ; + move.l a0,a2 + ; + 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 + ; + clr.l map_test + cmp.b #'@',(a2)+ + bne.s main + lea tempfile,a0 + move.l a0,map_test +.loop move.b (a2)+,(a0) + beq.s main + cmp.b #10,(a0)+ + bne.s .loop + clr.b -(a0) +main ; + bsr bigfont + jsr initmain + ; +.intro move.l medat(pc),a1 + move.l titlemed(pc),a0 + jsr 8(a1) + ; + jsr dointro ;returns gametype + cmp #3,gametype + bcs.s .play + ; + move.l medat(pc),a1 + jsr 12(a1) + bra.s exittoos +.play ; + bsr initnewgame + ; + move #$4000,fadevol + ; + bsr smallfont + bsr execscript + bsr bigfont + ; + bra .intro + ; +exittoos bsr freeobjlist2 + bsr permit + move.l rawstuff,a0 + bclr #0,$3d(a0) + bsr finitsfx + bsr finitvbint + bsr finitdisplay + bsr freememlist + bsr undir + rts + +smallfont move #6,fontw + move #8,fonth + clr fontoff + rts + +bigfont move #8,fontw + move #10,fonth + move #51,fontoff + rts + +; ************* FAST SUBS ******************** + +fastsubs + +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 + +playsfx ;sfx file in a0, vol in d0, priority in d1 + ; + move #$4000,$dff09a + 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 + +sfxvbint movem.l d2-d3/a1-a2,-(a7) + 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 + ; + movem.l (a7)+,d2-d3/a1-a2 + rts + +dogamemenu ; + st paused + ; + move.l player1,a5 + move.l ob_palette(a5),-(a7) + move.l #palettesw,ob_palette(a5) + move.l ob_window(a5),a2 + bsr plotwbmap + ; + tst gametype + beq .p1 + ; + move.l player2,a5 + move.l ob_palette(a5),-(a7) + move.l #palettesw,ob_palette(a5) + move.l ob_window(a5),a2 + bsr plotwbmap +.p1 ; + bsr drawall2 + ; + move.l player1,a5 + lea gamemenu,a4 + move.l ob_window(a5),a6 + jsr initmenu + ; +.loop bsr selmenu + beq .done + ; + subq #1,d0 + bne .notpsize + bsr newpsize + 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 ; + ;MUST BE QUIT GAME! + ; + move #1,finished + ; +.done bsr finitmenu + ; + tst gametype + beq.s .p12 + ; + move.l player2,a5 + move.l (a7)+,ob_palette(a5) + move.l ob_window(a5),a2 + bsr plotwbmap + bsr initstats + bsr showstats +.p12 ; + move.l player1,a5 + move.l (a7)+,ob_palette(a5) + move.l ob_window(a5),a2 + bsr plotwbmap + bsr initstats + bsr showstats + ; + clr paused + rts + +freewindows lea window1,a0 + bsr freewindow + tst gametype + beq.s .p1 + lea window2,a0 + bsr freewindow +.p1 rts + +largewin move.l player1,a5 + bsr large + tst gametype + beq refresh + move.l player2,a5 + bsr large + bra refresh + +large move.l ob_window(a5),a6 + move wi_pw(a6),d2 + ; + cmp #2,d2 + beq .lhr + ; + ;large lo-res window! + ; + move #324,d0 + move #240,d1 + bra thinkwin + ; +.lhr move #180,d0 + move #240,d1 + bra thinkwin + +newwsize ;window size stuff! + ; + move.l player1,a5 + bsr swapwsize + tst gametype + beq refresh + move.l player2,a5 + bsr swapwsize + bra refresh + +swapwsize ;increment window size! + ; + move.l ob_window(a5),a6 + movem wi_w(a6),d0-d1 ;w,h + move wi_pw(a6),d2 + mulu d2,d0 + mulu d2,d1 + cmp #2,d2 + beq .hr + ; + ;lo-res! + ; + cmp #318,d0 + bcs.s .inc + move #132,d0 + move d0,d1 + bra thinkwin +.inc add #24,d0 + move d0,d1 + cmp #240,d1 + bls thinkwin + move #240,d1 + bra thinkwin + ; +.hr cmp #180,d0 + bcs.s .inc2 + tst gametype + bne .min + add #18,d1 + cmp #240,d1 + bls thinkwin +.min move #132,d0 + move d0,d1 + bra thinkwin +.inc2 add #24,d0 + move d0,d1 + ; +thinkwin move #180,d3 ;max width! + cmp #2,d2 + beq .gmax + move #318,d3 +.gmax cmp d3,d0 + bls .nm + move d3,d0 +.nm ; + cmp #240,d1 + bls .n240 + move #240,d1 +.n240 tst gametype + beq.s .ggt + move #120,d1 +.ggt ; + move #160,d3 + move d0,d4 + lsr #1,d4 + sub d4,d3 ;wi_x + move d3,wi_x(a6) + ; + ext.l d0 + divu d2,d0 + move d0,wi_w(a6) + ; + tst gametype + bne.s .skip3 + ; + move #166,d3 + move d1,d4 + lsr #1,d4 + sub d4,d3 + move d3,wi_y(a6) + ; +.skip3 ext.l d1 + divu d2,d1 + move d1,wi_h(a6) + ; + rts + +newpsize ;toggle pixel size between 2 and 3 + ; + ;copy windows to temp so we can free 'em up later + ; + move.l player1,a5 + bsr swappsize + tst gametype + beq refresh + move.l player2,a5 + bsr swappsize + ; +refresh bsr dispoff + bsr finitmenu + ; + bsr freewindows + bsr putwindow + bsr calcbpos + ; + lea window1,a0 + bsr makewindow + lea window1,a0 + bsr showwindow + ; + tst gametype + beq.s .p1 + ; + lea window2,a0 + bsr makewindow + lea window2,a0 + bsr showwindow + ; +.p1 lea gamemenu,a4 + lea window1,a6 + jsr initmenu2 + ; + bsr drawall2 + bsr dispon + rts + +swappsize move.l ob_window(a5),a6 + movem wi_w(a6),d0-d1 ;w,h + move wi_pw(a6),d2 + mulu d2,d0 + mulu d2,d1 + eor #1,d2 ;2,3... + move d2,wi_pw(a6) + move d2,wi_ph(a6) + ; + bra thinkwin + +drawall2 bsr drawall + bsr drawall +.wait tst showflag + bne.s .wait + rts + +drawall tst doneflag + beq.s drawall ;wait for updated! + clr doneflag + ; + move.l memory(pc),memat + move.l player1(pc),a5 + bsr calcscene + move.l player1(pc),a5 + bsr blitscene + move.l player1(pc),a5 + bsr drawscene + ; + move gametype(pc),d0 + beq.s .p1 + ; + move.l memory(pc),memat + move.l player2(pc),a5 + bsr calcscene + move.l player2(pc),a5 + bsr blitscene + move.l player2(pc),a5 + bsr drawscene + ; +.p1 st showflag + ; + rts + +resetplayer st ob_update(a5) + clr ob_thermo(a5) + clr ob_infra(a5) + clr ob_invisible(a5) + clr ob_messtimer(a5) + clr ob_pixsize(a5) + clr ob_pixsizeadd(a5) + move.l #palettes,ob_palette(a5) + rts + +initplayer bsr resetplayer + bsr calcwlevel + bra initstats + +calcwlevel moveq #0,d0 + move.b ob_weapon(a5),d0 + beq.s .wlg + subq #1,d0 + divu #5,d0 + lsl #4,d0 +.wlg move d0,ob_wlevel(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 ;a6=window, 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 + ; +.loop2 move.b (a4)+,d2 + beq.s .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 .notex + moveq #65+26,d2 + bra.s .notfs +.notex cmp.b #'.',d2 + bne.s .notfs + moveq #65+27,d2 +.notfs and #31,d2 + add #17,d2 +.here add fontoff(pc),d2 + move.l font(pc),a0 + move.l wi_bmap(a6),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.s .loop2 +.done ; + rts + +initstats move.l ob_window(a5),a0 + moveq #2,d0 + add wi_x(a0),d0 + move.l wi_bmap(a0),a1 + move.l font(pc),a0 + moveq #2,d1 + moveq #10,d2 + bsr blit + ; + move.l ob_window(a5),a0 + moveq #2,d0 + add wi_x(a0),d0 + move.l wi_bmap(a0),a1 + move.l font(pc),a0 + moveq #10,d1 + moveq #11,d2 + ; + bsr blit + ; + rts + +putstrip ;a0=window + ; + move.l wi_bmap(a0),a1 + move wi_bh(a0),d0 + lsr #2,d0 + mulu #7*40,d0 + add.l d0,a1 ;dest + move.l wi_strip(a0),a0 ;src + ; + btst #6,$dff002 +.bwait btst #6,$dff002 + bne.s .bwait + ; + move.l #$9f00000,$dff040 + move.l #-1,$dff044 + move #0,$dff064 + move #0,$dff066 + move.l a0,$dff050 + move.l a1,$dff054 + move #(7*7)<<6+20,$dff058 + rts + +showstats ;a5=player + ; + ;show health! + ; + moveq #2,d5 + move ob_hitpoints(a5),d6 + bsr showlevel + ; + moveq #10,d5 + move ob_weapon(a5),d6 + lsr #8,d6 + bsr showlevel + ; + cmp #2,gametype + bne.s .rts + ; + movem wins1(pc),d6-d7 + cmp.l player1,a5 + beq.s .skip + exg d6,d7 +.skip sub d7,d6 + ble.s .rts + ; + subq #1,d6 + move.l ob_window(a5),a0 + move wi_bw(a0),d7 + subq #2,d7 + ; +.loop subq #6,d7 + move d7,d0 + move.l ob_window(a5),a0 + add wi_x(a0),d0 + moveq #2,d1 + moveq #50,d2 + move.l wi_bmap(a0),a1 + move.l font(pc),a0 + bsr blit + dbf d6,.loop + ; +.rts rts + +showlevel moveq #47,d7 + ext.l d6 + divu #5,d6 + subq #1,d6 + bmi.s .skip + ; +.loop moveq #12,d2 + bsr drawh + dbf d6,.loop +.skip ; + swap d6 + tst d6 + beq.s .rest + moveq #17,d2 + sub d6,d2 + bsr drawh + ; +.rest cmp #47+6*5,d7 + bcc.s .hdone + moveq #17,d2 + bsr drawh + bra.s .rest +.hdone ; + rts + +drawh move.l ob_window(a5),a0 + move d7,d0 + move d5,d1 + add wi_x(a0),d0 + move.l wi_bmap(a0),a1 + move.l font(pc),a0 + addq #6,d7 + ; +blit ;a0=shapetable to blit, a1=bitmap, d0=X, d1=Y, d2=char + ; + add.l 4(a0,d2*4),a0 + ; + mulu #280,d1 + add.l d1,a1 + move d0,d2 + asr #3,d2 + add d2,a1 ;dest! + move.l a0,a2 + add.l (a0),a2 + lea 8(a0),a3 + addq #4,a0 + and #15,d0 + ror #4,d0 + ; + btst #6,$dff002 +.bwait btst #6,$dff002 + bne.s .bwait + ; + move.l a2,$dff050 + move.l a3,$dff04c + move.l a1,$dff048 + move.l a1,$dff054 + ; + move d0,$dff042 + or #$fca,d0 + move d0,$dff040 + move.l #$ffff0000,$dff044 + moveq #-2,d0 + move d0,$dff064 + move d0,$dff062 + moveq #38,d0 + sub (a0)+,d0 + move d0,$dff060 + move d0,$dff066 + move (a0)+,$dff058 + ; + rts + +pixsize dc 0 ;pixel size...at least 2! + +pixelate ;pixel out the coplist! + ; + move pixsize(pc),d1 ;x/y add + ; + ;pixel out vertically, then horizontally + ; + move.l cop(pc),a0 + lea coloffs(pc),a1 + moveq #0,d2 ;x + move d1,d6 + lsr #1,d6 +.forx ; + move.l a0,a3 + lea 0(a1,d2*4),a2 + add.l (a2),a3 + ; + move d2,d5 + add d6,d5 + cmp width(pc),d5 + ble.s .xok + move width(pc),d5 +.xok sub d2,d5 + ble .done + subq #1,d5 + ; +.loop2 moveq #0,d3 + move.l a3,a4 + move.l a0,a5 + add.l (a2)+,a5 + move d1,d7 + lsr #1,d7 ;first Y add +.fory ; + move (a4),d0 ;start column! + move d3,d4 + add d7,d4 + cmp hite(pc),d4 + ble.s .yok + move hite(pc),d4 +.yok sub d3,d4 + ble .nextx + subq #1,d4 + ; +.loop move d0,(a5) + add copmod(pc),a4 + add copmod(pc),a5 + ; + dbf d4,.loop + ; +.nexty add d7,d3 + move d1,d7 + bra.s .fory + ; +.nextx dbf d5,.loop2 + ; + add d6,d2 + move d1,d6 + bra.s .forx + ; +.done rts + +makeqstrip ; + ;do a simple roof/floor strip for blitter to wack in... + ; + cmp #$100,con0poke + bne.s .doit + rts + ; +.doit move.l qstrip(pc),a0 + move.l darktable(pc),a1 + move.l palette(pc),a2 + move.l qstripbot(pc),a4 + moveq #0,d2 + ; + move floorflag(pc),d0 + bne.s .fdone + ; + move camy(pc),d0 + neg d0 + ext.l d0 + lsl.l #focshft,d0 + ; + move.b qcols+1(pc),d2 + move.l qstripbot(pc),a4 + move maxy(pc),d1 + ; +.floop subq #1,d1 + beq.s .fdone + ; + move.l d0,d3 + divs d1,d3 + cmp #maxz,d3 + bcc .fdone + ; + move 0(a1,d3*2),d3 ;darkness (0...15) + move.l 0(a2,d3*4),a3 ;pal to use + move 0(a3,d2*2),-(a4) ;colour! + ; + bra.s .floop + ; +.fdone move roofflag(pc),d0 + bne.s .rdone + ; + move #-256,d0 + sub camy(pc),d0 + ext.l d0 + lsl.l #focshft,d0 ;cam Y + ; + move.b qcols(pc),d2 + ; + move miny(pc),d1 ;SY + ; +.rloop beq.s .rdone + ; + move.l d0,d3 + divs d1,d3 + cmp #maxz,d3 + bcc .rdone + ; + move 0(a1,d3*2),d3 ;darkness (0...15) + move.l 0(a2,d3*4),a3 ;pal to use + move 0(a3,d2*2),(a0)+ ;colour! + ; + addq #1,d1 + bra.s .rloop +.rdone ; + moveq #0,d0 +.loop cmp.l a4,a0 + bcc.s .done + move.l d0,(a0)+ + bra.s .loop + ; +.done 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 copmod(pc),d1 + move d1,flatyadd2 + ; + move d7,d0 + add midy(pc),d0 + mulu copmod(pc),d0 + add.l cop(pc),d0 + add.l coloffs(pc),d0 + move.l d0,a2 +.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 d7,-(a7) + moveq #127,d7 + moveq #0,d2 + moveq #0,d3 + ; + move.l a2,a3 + ; + move wdiv32(pc),-(a7) + ; +.hloop2 moveq #31,d5 + ; +.hloop tst (a3) ;check destination! + bne.s .skip + ; + and d7,d0 + and d7,d1 ;X/Z for fetch! + move d0,d2 + lsl #7,d2 + lea 0(a0,d2),a6 + move.b 0(a6,d1),d3 + move 0(a5,d3*2),(a3) + ; +.skip add.l d4,d0 + addx d2,d0 + add.l d6,d1 + addx d2,d1 + addq #4,a3 + dbf d5,.hloop + ; + addq #4,a3 + subq #1,(a7) + bgt.s .hloop2 + bne.s .kl + ; + move wrem32(pc),d5 + bpl.s .hloop + ; +.kl 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 + +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 + ; + ifne aga + add.l 16(a6,d0*4),a6 + elseif + lsl #2,d0 + add.l 16(a6,d0),a6 + endc + ; +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 + ; + 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 + +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.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 #4,ob_pixsizeadd(a0) + ; + bra exec_loop + +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 + bsr loadfile + move.l d0,(a2) + beq.s .skip + move.l d0,a0 + bsr 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 + bsr loadfile + clr.b (a3) + move.l d0,4(a2) + beq.s .rts + move.l d0,a0 + bsr remapanim + ; +.rts rts + +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 + ; + 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,(a0) + 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 + +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 + +currplayer dc.l 0 + +calcscene ;a5=player object + ; + move #$20,$dff09a + ; + move.l a5,currplayer + move.l ob_palette(a5),palette + move ob_thermo(a5),thermo + move ob_infra(a5),infra + move ob_pixsize(a5),pixsize + ; + clr.l shapelist + move.l a5,a0 + bsr calccamera + bsr makewalls + ; + lea objects(pc),a5 + ; +.loop move.l (a5),a5 + tst.l (a5) + beq.s .done + cmp.l currplayer(pc),a5 + beq.s .loop + move.l ob_render(a5),a0 + 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 + +ipals dc.l palettesb,palettesw,palettesr + +blitscene bclr #7,ob_update(a5) + beq.s .noupdate + bsr showstats + ; +.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 + ; +.wait tst showflag + bne.s .wait + ; + move.l ob_window(a5),a0 + bsr dbwindow + ; + bsr castwalls + bsr makeqstrip + bsr renderwalls + ; + move floorflag(pc),d0 + ble.s .nofloor + ; + move camy(pc),d0 + neg d0 + moveq #-1,d1 + move maxy(pc),d7 + subq #1,d7 + lea groundtile,a0 + bsr flat + ; +.nofloor move roofflag(pc),d0 + ble.s .noflat + ; + move #-255,d0 + sub camy(pc),d0 + moveq #1,d1 + move miny(pc),d7 + lea ceilingtile,a0 + bsr flat + ; +.noflat bsr drawshapes + bsr drawblood + ; + move.l currplayer(pc),a0 + move ob_pixsizeadd(a0),d0 + beq .done + add d0,ob_pixsize(a0) + move ob_pixsize(a0),d0 + beq .fin + cmp #24,d0 + bne .pix + ; + ;ok, big pixels + ; + move finished2(pc),finished + bne .pix + ; + move #$20,$dff09a + move ob_telex(a0),ob_x(a0) + move ob_telez(a0),ob_z(a0) + move ob_telerot(a0),ob_rot(a0) + neg ob_pixsizeadd(a0) + move #$8020,$dff09a + bra.s .pix + ; +.fin clr ob_pixsizeadd(a0) + ; +.pix move d0,pixsize + bsr pixelate + ; +.done rts + +vbhandler ; + subq #1,(a1)+ + addq #1,(a1) + ; + tst showflag + beq.s .noshow + ; + ;don't show if beam in the way! + ; + move.l $dff004,d0 + lsr.l #8,d0 ;beampos + and #$1ff,d0 + cmp minbpos(pc),d0 + bcs.s .ok + cmp maxbpos(pc),d0 + bcs.s .noshow + ; +.ok clr showflag + lea window1,a0 + bsr showwindowq + lea window2,a0 + bsr showwindowq + ; +.noshow bsr sfxvbint + ; + move fadevol(pc),d0 + beq.s .nofade + move.l medat(pc),a1 + sub #$40,fadevol + bne.s .setvol + jsr 12(a1) + bra.s .nofade +.setvol move fadevol(pc),d0 + lsr #8,d0 + jsr 16(a1) + ; +.nofade btst #0,framecnt+1 + beq rts + tst paused + bne exit_vb2 + ; + ;OK, movement/animation stuff! + ; + movem.l d0-d7/a0-a6,-(a7) + ; + bsr readjoys + bsr dodoors + bsr doanims + bsr moveblood + ; + 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 movem.l (a7)+,d0-d7/a0-a6 +exit_vb2 st doneflag + 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_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) + bsr rndw + and #$031,d0 + move d0,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) + bsr rndw + and #$031,d0 + move d0,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) + movem.l ob_xvec(a5),d6-d7 + add.l ob_x(a5),d6 + add.l ob_z(a5),d7 + bsr checknew + beq.s .newok + clr.l ob_xvec(a5) + clr.l ob_zvec(a5) + rts + ; +.newok move.l d6,ob_x(a5) + move.l d7,ob_z(a5) + 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 + +blowobject move.l diesfx(pc),a0 + moveq #64,d0 + moveq #2,d1 + bsr playsfx + ; + moveq #31,d7 + bsr bloodymess2 + ; + move.l ob_chunks(a5),a4 + 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_colltype(a0) + clr ob_collwith(a0) + move.l #chunklogic,ob_logic(a0) + move.l a4,ob_shape(a0) + move.l #drawshape_1,ob_render(a0) + move d7,ob_frame(a0) + ; + move an_maxw(a4),d0 + move d0,ob_rad(a0) + mulu d0,d0 + move.l d0,ob_radsq(a0) + ; + dbf d7,.loop + bra killobject + +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 + +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 pickplayer + tst ob_invisible(a0) + bne.s .useold ;can't see player! no intelligence... + ; + bsr calcangle + 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_frame(a0) + move.l a3,ob_chunks(a0) + ; + move ob_rot(a5),d0 + and #255,d0 + move.l camrots(pc),a1 + ; + ifne aga + lea 0(a1,d0*8),a1 + elseif + lsl #3,d0 + lea 0(a1,d0),a1 + endc + ; + 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 + +fire1 bsr pickplayer + bsr calcangle + move d0,-(a7) + bsr rndw + tst ob_invisible(a0) + bne.s .inv + and #16,d0 + subq #8,d0 +.inv 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 + +checkvecs move.l ob_x(a5),d6 + add.l ob_xvec(a5),d6 + move.l ob_z(a5),d7 + add.l ob_zvec(a5),d7 + bra checknew ;ok to stand here? + +pickplayer ;pick a player at random + move.l player1(pc),a0 + tst gametype + 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 1 + ; + move.l player2(pc),a1 + 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 2 + ; + cmp.l d1,d0 + bcs.s .rts + ; + 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 #baldylogic,ob_logic(a5) + bsr rnddelay + ; + bra monsterfix + ; +baldy_skip ;close to player? start throwing punches around! + ; + bsr pickplayer + bsr calcangle + 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 + +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? + ; + bsr pickplayer + bsr calcbangle + ; + 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 #baldycharge,ob_logic(a5) + ; + rts + +terralogic ; + move ob_rot(a5),ob_oldrot(a5) + subq #1,ob_delay(a5) + bgt monstermove + ; + ;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 pickplayer + bsr calcangle + 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 bullet3,a2 + lea sparks3,a3 + ; + bsr shoot + ; + subq #1,ob_delay2(a5) + bgt.s .rts + ; + bsr rnddelay + move.l #terralogic,ob_logic(a5) + ; +.rts rts + +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 d6,ob_x(a5) + move.l d7,ob_z(a5) + move.l ob_framespeed(a5),d0 + add.l d0,ob_frame(a5) + and #3,ob_frame(a5) + rts + +calcvecs move ob_rot(a5),d0 + and #255,d0 + move.l camrots(pc),a0 + ; + ifne aga + lea 0(a0,d0*8),a0 + elseif + lsl #3,d0 + lea 0(a0,d0),a0 + endc + ; + 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 + +playerdead subq #1,ob_delay(a5) + bgt.s .rts + ; + cmp #2,gametype + bne.s .notcom + ; + ;combat game! + ; + move #3,finished2 + move #2,ob_pixsizeadd(a5) + move.l #rts,ob_logic(a5) + move.l player1,a0 + cmp.l a5,a0 + bne.s .got + move.l player2,a0 +.got move #2,ob_pixsizeadd(a0) +.rts rts +.notcom ; + move.l #waitrestart,ob_logic(a5) + ; +waitrestart bsr checkfireb + beq.s .rts + ; + 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 + move (a0)+,ob_x(a5) + move (a0)+,ob_z(a5) + move (a0)+,ob_rot(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 + ; +.rts rts + +playerdeath addq #4,ob_rot(a5) + addq #4,ob_eyey(a5) + cmp #-32,ob_eyey(a5) + blt.s .rts + move #-32,ob_eyey(a5) + move.l #playerdead,ob_logic(a5) + move #63,ob_delay(a5) + ; + cmp #2,gametype + bne.s .notcom + ; + move.l player1,a0 + cmp.l a5,a0 + bne.s .got + move.l player2,a0 +.got tst ob_hitpoints(a0) + ble.s .draw + ; +.win move.l a5,-(a7) + move.l a0,a5 + addq #1,wins1 + cmp.l player1,a5 + beq.s .wd + subq #1,wins1 + addq #1,wins2 +.wd st ob_update(a5) + clr ob_collwith(a5) + clr ob_colltype(a5) + bsr message + dc.b 'winner!',0 + even + move.l (a7)+,a5 + st ob_update(a5) + bsr message + dc.b 'loser!',0 + even + ; +.draw +.notcom ; +.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 + +healthgot bsr playtsfx + addq #5,ob_hitpoints(a0) + cmp #25,ob_hitpoints(a0) + ble.s .skip + move #25,ob_hitpoints(a0) +.skip st ob_update(a0) + move.l a5,-(a7) + move.l a0,a5 + bsr message + dc.b 'health bonus!',0 + even + 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 + add #$100,ob_weapon(a0) + cmp #$1900,ob_weapon(a0) + ble.s .skip + move #$1900,ob_weapon(a0) +.skip st ob_update(a0) + move.l a5,-(a7) + move.l a0,a5 + move ob_wlevel(a5),d2 + bsr calcwlevel + cmp ob_wlevel(a5),d2 + beq.s .nob + bsr message + dc.b 'weapon boost!',0 + even + bra.s .nob2 +.nob bsr message + dc.b 'weapon bonus...',0 + even +.nob2 move.l (a7)+,a5 + bra killobject + +invisigot add #1500,ob_invisible(a0) + move.l #rts,ob_render(a0) + move.l a5,-(a7) + move.l a0,a5 + bsr calcwlevel + bsr message + dc.b 'invisibility!',0 + even + move.l (a7)+,a5 + bra killobject + +thermogot 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 + +playertimers 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 + move.l #drawshape_8,ob_render(a5) + 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 ; + rts + +footstep move.l d0,-(a7) + move.l footstepsfx(pc),a0 + moveq #16,d0 + moveq #0,d1 + bsr playsfx + move.l (a7)+,d0 + rts + +cntrls dc.l joyx0,joyx1,joyx2 + +playerlogic bsr playertimers + ; + lea cntrls(pc),a0 + move ob_cntrl(a5),d0 + move.l 0(a0,d0*4),a0 + ; + move (a0),d0 ;joyx - rotate + muls ob_rotspeed(a5),d0 + add ob_rot(a5),d0 + and #255,d0 + move d0,ob_rot(a5) + ; + ;move... + ; + move 2(a0),d4 ;joyy + bne.s .speed + ; + and #255,ob_bounce(a5) + beq.s .nob + add #32,ob_bounce(a5) + cmp #128,ob_bounce(a5) + ble.s .nob + clr ob_bounce(a5) + bsr footstep + ; +.nob clr.l ob_frame(a5) + bra checkfire + ; +.speed add #16,ob_bounce(a5) + move ob_bounce(a5),d1 + sub #64,d1 + and #255,d1 + bne.s .fskip + bsr footstep +.fskip ; + move.l ob_framespeed(a5),d1 + add.l d1,ob_frame(a5) + and #3,ob_frame(a5) + ; + neg d4 + muls ob_movspeed(a5),d4 ;speed + move.l camrots(pc),a1 + ; + ifne aga + lea 0(a1,d0*8),a1 + elseif + lsl #3,d0 + lea 0(a1,d0),a1 + endc + ; + move d4,d5 ;real speed + muls 2(a1),d4 + add.l d4,d4 + muls 6(a1),d5 + add.l d5,d5 + move.l ob_x(a5),d6 + move.l ob_z(a5),d7 + ; + bsr mover + ; + move.l d6,ob_x(a5) + move.l d7,ob_z(a5) + ; + tst ob_pixsizeadd(a5) + bne checkfire + ; + bsr checknew2 ;in a trigger zone? + beq.s checkfire + ; + move zo_ev(a4),d0 ;poly->event + bmi.s checkfire + ; + cmp #24,d0 + bne.s .notexit + ; + move #3,finished2 ;pattern done! + move #2,ob_pixsizeadd(a5) + ; +.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 + bsr execevent + move.l eventobj(pc),a5 +checkfire ; + bsr checkfireb + beq .rts + ; + move ob_collwith(a5),d2 + and #3,d2 + eor #3,d2 ;colltype + ; + lea wtable(pc),a0 + move ob_wlevel(a5),d0 + movem 0(a0,d0),d3-d6 + movem.l 8(a0,d0),a2-a3 + ; + move.b ob_weapon(a5),d0 + sub d3,ob_weapon(a5) + cmp.b ob_weapon(a5),d0 + beq.s .noup + ; + bsr calcwlevel + st ob_update(a5) + ; +.noup moveq #0,d3 + bsr shoot + ; + move.l shootsfx,a0 + moveq #32,d0 + moveq #0,d1 + bsr playsfx + ; +.rts rts + +checkfireb lea cntrls(pc),a0 + move ob_cntrl(a5),d0 + move.l 0(a0,d0*4),a0 + tst 8(a0) + rts + +eventobj dc.l 0 + + ; + ;weaponuse.w + ;hitpoints + ;damage + ;speed + ; +wtable dc 0,1,1,32 + dc.l bullet1,sparks1 + dc $8,5,2,36 + dc.l bullet2,sparks2 + dc $10,10,3,40 + dc.l bullet3,sparks3 + dc $20,15,4,40 + dc.l bullet4,sparks4 + dc $40,20,7,24 + dc.l bullet5,sparks5 + +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 ; + 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) + ; + move.l d2,d6 + add.l ob_x(a5),d6 + move.l d3,d7 + add.l ob_z(a5),d7 + ; + bsr checknew + beq putfire + ; + bra calcbounce + +firelogic ; + move.l ob_xvec(a5),d6 + add.l ob_x(a5),d6 + move.l ob_zvec(a5),d7 + add.l ob_z(a5),d7 + ; + bsr checknew + bne calcbounce +.nokill ; +putfire move.l d6,ob_x(a5) + move.l d7,ob_z(a5) + ; + 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 + ; + add.l #$8000,bl_yvec(a5) + ; + movem.l bl_xvec(a5),d0-d2 + add.l d1,bl_y(a5) + blt.s .ok + ; + move.l a5,a0 + killitem blood + move.l a0,a5 + bra.s .loop + ; +.ok add.l d0,bl_x(a5) + add.l d2,bl_z(a5) + bra.s .loop + ; +.done rts + +drawblood lea blood(pc),a5 + ; +.loop move.l (a5),a5 + tst.l (a5) + beq .done + ; + move bl_x(a5),d0 + sub camx(pc),d0 + move bl_y(a5),d1 + 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 #32,d2 + bcc.s .pix + ; + ;blit to screen! + ; + move.l window(pc),a0 + ; + move wi_bh(a0),d0 + subq #8,d0 + bsr rndn + move d0,d2 ;Y + ; + move wi_bw(a0),d0 + subq #8,d0 + bsr rndn ;X + add wi_x(a0),d0 + move d2,d1 + ; + move.l wi_bmap(a0),a1 + move.l font(pc),a0 + moveq #46,d2 + bsr blit + ; + move #$4000,$dff09a + move.l a5,a0 + killitem blood + move.l a0,a5 + move #$c000,$dff09a + bra .loop +.pix ; + add midx(pc),d0 + add midy(pc),d1 + ; + move.l darktable(pc),a0 + move 0(a0,d2*2),d3 + eor #15,d3 + lsl #8,d3 ;shade of red! + ; + move.l cop(pc),a1 + ; + lea coloffs,a2 + add.l 0(a2,d0*4),a1 + mulu copmod(pc),d1 + ; + or bl_color(a5),d3 + move d3,0(a1,d1.l) + bra .loop + ; +.done rts + +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 + ; + ifne aga + add.l 12(a0,d0*4),a0 + elseif + lsl #2,d0 + add.l 12(a0,d0),a0 + endc + ; +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) + ; + 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 + +mover ; + ;d4=x speed + ;d5=z speed + ;d6=x + ;d7=z + ; + ;return d0, ne if a wall was hit! + ;check only walls zone (player) + ; + neg.l d4 + moveq #0,d3 + add.l d4,d6 + bsr checknew + beq.s .xok + moveq #-1,d3 + sub.l d4,d6 +.xok ; + add.l d5,d7 + bsr checknew + beq.s .zok + moveq #-1,d3 + sub.l d5,d7 +.zok tst d3 + rts + +mover2 ; + ;d4=x speed + ;d5=z speed + ;d6=x + ;d7=z + ; + ;return d0, ne if a wall was hit! + ;check walls AND monster zones + ; + neg.l d4 + moveq #0,d3 + add.l d4,d6 + bsr checknew + bne.s .xbad + bsr checknew2 + beq.s .xok +.xbad moveq #-1,d3 + sub.l d4,d6 +.xok ; + add.l d5,d7 + bsr checknew + bne.s .zbad + bsr checknew2 + beq.s .zok +.zbad moveq #-1,d3 + sub.l d5,d7 +.zok tst d3 + 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 + ; + addq #1,frame + ; + 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 + ; + ifne aga + lea 0(a3,d0*2),a0 + elseif + add d0,d0 + lea 0(a3,d0),a0 + endc + ; +.loop2 move (a0)+,d0 ;poly# + lsl #5,d0 + lea 0(a4,d0),a1 ;actual poly + move frame(pc),d0 + cmp zo_done(a1),d0 + beq .skip3 + move d0,zo_done(a1) + tst zo_open(a1) + bmi .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 + ; + 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 dbf d4,.loop2 ;finish sq + ; +.skip dbf d5,.loop ;gridoffs + ; +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 + ; + ;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 + + 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 + ; + ifne aga + lea 0(a6,d7*8),a6 + elseif + move d7,d0 + lsl #3,d0 + lea 0(a6,d0),a6 + endc + ; + move.l vertdraws(pc),a4 + ; +.loop ;do this vert line! + ; + lea outlist(pc),a5 + ; +.loop2 move.l (a5),d0 + beq .empty + move.l d0,a5 + ; + cmp wl_lsx(a5),d7 + blt.s .loop2 + cmp wl_rsx(a5),d7 + bgt.s .loop2 + ; + movem wl_lx(a5),d0-d1 + muls (a6),d0 + muls 2(a6),d1 + add.l d1,d0 ;LX! + bgt .loop2 + ; + movem wl_rx(a5),d1-d2 + muls (a6),d1 + muls 2(a6),d2 + add.l d2,d1 ;RX! + blt .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<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 decrm+32 + 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 d4,d0 + move.l d5,d1 + move.l d6,d2 ;offset XS + allocmem2 loadfile + sub.l d6,d0 + ; + 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 + +andtable dc $ffff,0 ;rgb and, brightness add... + dc $ff00,8 + dc $f0f0,8 + dc $f00f,12 + dc $fff0,8 + dc $ff0f,8 + dc $f0ff,8 + +makepalettes ; + ;make r,g,b,y,p,c palettes + ; + lea andtable(pc),a0 + moveq #6,d0 + lea palettesw,a2 ;dest + ; +.loop lea palettes,a1 + movem (a0)+,d1/d7 ;what we're anding, briteness correction + ; + moveq #15,d2 ;16 shades + ; +.loop2 move.l (a1)+,a3 ;src + move.l (a2)+,a4 ;dest + move #255,d3 ;256 colours + ; +.loop3 move (a3)+,d4 ;src colour...find briteness + ; + move d4,d5 + move d4,d6 + and #$f00,d4 + lsr #8,d4 + and #$0f0,d5 + lsr #4,d5 + and #$00f,d6 + add d6,d5 + add d5,d4 + add d7,d4 + cmp #16*3,d4 + bcs.s .bok + moveq #16*3-1,d4 +.bok ext.l d4 + divu #3,d4 ;(r+g+b)/3=briteness! + ; + move d4,d5 + move d4,d6 + lsl #8,d4 + lsl #4,d5 + or d6,d5 + or d5,d4 ;RGB + and d1,d4 + ; + move d4,(a4)+ + dbf d3,.loop3 + ; + dbf d2,.loop2 + ; + dbf d0,.loop + ; + rts + +calcpalettes ;a0=palette! + ; + move.l map_rgbs(pc),a0 + ; + move.l rgbs(pc),a1 + move #255,d0 + move.l #$f0000,d1 + ; +.loop move (a0)+,d2 + ; + move d2,d3 + move d2,d4 + and #$f00,d2 + lsr #8,d2 + move d2,(a1)+ + and #$f0,d3 + lsr #4,d3 + move d3,(a1)+ + and #$f,d4 + move d4,(a1)+ + ; + dbf d0,.loop + ; + lea palettes(pc),a0 + moveq #15,d0 + ; +.loop2 move.l rgbs(pc),a1 + move.l (a0)+,a2 + move #255,d1 + ; +.loop3 movem (a1),d2-d4 ;r,g,b + ; + lsl #8,d2 + lsl #4,d3 + or d4,d3 + or d3,d2 + move d2,(a2)+ + bne.s .hmmm + move #$8000,-2(a2) ;no BLACK! +.hmmm ; + ;movem (a1),d2-d4 + ;add d4,d3 + ;add d3,d2 + ;cmp #4,d2 + ;bcc .do + ;addq #6,a1 + ;bra .bok + ; +.do subq #1,(a1)+ + bpl.s .rok + clr -2(a1) + ; +.rok subq #1,(a1)+ + bpl.s .gok + clr -2(a1) + ; +.gok subq #1,(a1)+ + bpl.s .bok + clr -2(a1) +.bok ; + dbf d1,.loop3 + dbf d0,.loop2 + rts + +calcpalettes2 ;a0=palette! + ; + move.l map_rgbs(pc),a0 + ; + move.l rgbs(pc),a1 + move #255,d0 + move.l #$f0000,d1 + ; +.loop move (a0)+,d2 + ; + move d2,d3 + lsl.l #8,d2 + and.l d1,d2 + move.l d2,(a1)+ ;R + ; + move d3,d2 + lsl.l #8,d2 + lsl.l #4,d2 + and.l d1,d2 + move.l d2,(a1)+ ;G + ; + swap d3 + and.l d1,d3 + move.l d3,(a1)+ ;B + ; + dbf d0,.loop + ; + lea palettes(pc),a0 + moveq #15,d0 + ; +.loop2 move.l rgbs(pc),a1 + move.l (a0)+,a2 + move #255,d1 + ; +.loop3 movem.l (a1),d2-d4 + lsr.l #8,d2 + and #$f00,d2 + lsr.l #8,d3 + lsr.l #4,d3 + and #$f0,d3 + swap d4 + and #$f,d4 + or d4,d3 + or d3,d2 + move d2,(a2)+ + bne.s .hmmm + move #$8000,-2(a2) +.hmmm ; + move.l (a1),d2 + sub.l #$10000,d2 + bpl.s .rok + moveq #0,d2 +.rok move.l d2,(a1)+ + ; + move.l (a1),d3 + sub.l #$10000,d3 + bpl.s .gok + moveq #0,d3 +.gok move.l d3,(a1)+ + ; + move.l (a1),d4 + sub.l #$10000,d4 + bpl.s .bok + moveq #0,d4 +.bok move.l d4,(a1)+ + ; + dbf d1,.loop3 + dbf d0,.loop2 + rts + +dispoff tst dispnest + bne.s .skip + bsr vwait + move #$01a0,$dff096 +.skip addq #1,dispnest + rts + +dispon subq #1,dispnest + bgt.s .skip + bsr vwait + move.l coplist(pc),$dff080 + move #$8180,$dff096 + move #0,$dff088 +.skip rts + +forbid push + moveq #49,d0 +.fl bsr vwait + dbf d0,.fl + bsr ownblitter + move.l 4.w,a6 + jsr -132(a6) + move #$8400,$dff096 + pull + rts + +permit push + move.l rawstuff,a0 + clr.l $70(a0) + move.l 4.w,a6 + jsr -138(a6) + bsr disownblitter + pull + 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 + +finitvbint push + move.l 4.w,a6 + moveq #5,d0 + lea vbintserver,a1 + jsr -174(a6) + pull + rts + +ownblitter push + move.l grbase,a6 + jsr -456(a6) + btst #6,$dff002 +.bwait btst #6,$dff002 + bne.s .bwait + pull + rts + +disownblitter push + btst #6,$dff002 +.bwait btst #6,$dff002 + bne.s .bwait + move.l grbase,a6 + jsr -462(a6) + pull + rts + +makecoloffs push + ; + ifne aga + ; + lea coloffs,a0 + moveq #2,d0 + moveq #3,d2 +.loop addq.l #4,d0 + moveq #31,d1 +.loop2 move.l d0,(a0)+ + addq.l #4,d0 + dbf d1,.loop2 + dbf d2,.loop + ; + elseif + ; + lea coloffs,a0 + moveq #18,d0 + moveq #127,d1 + ; +.loop move.l d0,(a0)+ + addq.l #4,d0 + dbf d1,.loop + ; + endc + ; + pull + 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 + +calcbpos ;also: calc qstripbot, con0poke... + ; + move window1+wi_h,d0 + add d0,d0 + ext.l d0 + add.l qstrip(pc),d0 + move.l d0,qstripbot + ; + move #$100,con0poke + move floorflag(pc),d0 + and roofflag(pc),d0 + bne.s .cp + move #$9f0,con0poke ;one of them is cop strip! +.cp ; + move window1+wi_y,d0 + subq #4,d0 + move d0,minbpos + tst gametype + beq.s .p1 + ; + move window2+wi_y,d0 + add window2+wi_bh,d0 + addq #4,d0 + move d0,maxbpos + rts + ; +.p1 move window1+wi_y,d0 + add window1+wi_bh,d0 + addq #4,d0 + move d0,maxbpos + ; + rts + +showwindow ;a0=window + ; + push + ; + ifne aga + ; + ;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) + ; + move wi_y(a0),d0 + subq #3,d0 + move.b d0,64(a1) + ; + endc + ; + ;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 + ; + ifne aga + ; + move d0,72+6(a0) + swap d0 + move d0,72+2(a0) + ; + elseif + ; + move d0,6(a0) + swap d0 + move d0,2(a0) + ; + endc + ; + rts + +finitdisplay push + ; + 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 + +initdisplay push + ; + lea grname,a1 + move.l 4.w,a6 + jsr -408(a6) + move.l d0,grbase + ; + move.l d0,a6 + move.l 34(a6),oldview + sub.l a1,a1 + jsr -222(a6) ;loadview + ; + move.l #copinitf-copinit,d0 + moveq #2,d1 + allocmem copinit + move.l d0,coplist + ; + move.l d0,a1 + lea copinit,a0 + lea copinitf,a2 + ; +.loop cmp.l a2,a0 + bcc.s .done + move.l (a0)+,(a1)+ + bra.s .loop +.done ; + add.l #sl1-copinit,d0 + move.l d0,slice1 + add.l #sl2-sl1,d0 + move.l d0,slice2 + add.l #cstop-sl2,d0 + move.l d0,copstop + ; + move.l copstop,d0 + move.l slice1,a0 + move.l slice2,a1 + ; + ifne aga + ; + move d0,72+6(a0) + move d0,72+6(a1) + swap d0 + move d0,72+2(a0) + move d0,72+2(a1) + ; + elseif + ; + move d0,6(a0) + move d0,6(a1) + swap d0 + move d0,2(a0) + move d0,2(a1) + ; + endc + ; + jsr -270(a6) + jsr -270(a6) + move.l coplist,$dff080 + move #0,$dff088 + ; + pull + rts + +allocwbmap move wi_w(a2),d0 + mulu wi_pw(a2),d0 + move d0,wi_bw(a2) + ; + move wi_h(a2),d0 + mulu wi_ph(a2),d0 + move d0,wi_bh(a2) + ; + mulu #40*7,d0 + ; + move.l #$10002,d1 + move.l d0,wi_bmapmem(a2) + allocmem wi_bmap + move.l d0,wi_bmap(a2) + ; + move.l #40*7*7,d0 + moveq #2,d1 + allocmem wi_strip + move.l d0,wi_strip(a2) + ; + rts + +windowiff ;draw iff into window! + ; + move.l wi_iff(a2),a0 + cmp.l #1,a0 + bne.s .do + rts + ; +.do move.l wi_bmap(a2),a1 + ; + move 2(a0),d1 + cmp #240,d1 + bcs.s .skip + move #240,d1 +.skip move #120,d2 + lsr #1,d1 + sub d1,d2 + mulu #7*40,d2 + add.l d2,a1 + ; +decodeiff ;for 40 columns... + ; + ;a0=trimmed IFF file, + ;a1=destination bitmap... + ; + move.l a2,-(a7) + moveq #40,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 + ; +.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 d7,a1 + dbf d5,.loop4 + dbf d1,.loop5 + ; + move.l (a7)+,a2 + rts + +plotwbmap ;OK, plot colours on bitmap! + ; + tst.l wi_iff(a2) + bne windowiff + ; + move.l wi_bmap(a2),a0 + move wi_x(a2),d0 + move d0,d1 + lsr #3,d0 + not d1 + and #7,d1 + moveq #127,d7 ;colour + move wi_w(a2),d6 ;width + subq #1,d6 + ; +.wloop move wi_pw(a2),d5 + subq #1,d5 + ; +.wloop2 move d7,d4 + moveq #6,d3 + ; +.dloop bclr d1,0(a0,d0) + lsr #1,d4 + bcc.s .dskip + bset d1,0(a0,d0) +.dskip lea 40(a0),a0 + dbf d3,.dloop + ; + lea -40*7(a0),a0 + subq #1,d1 + bpl.s .dskip2 + moveq #7,d1 + addq #1,d0 +.dskip2 dbf d5,.wloop2 + ; + subq #1,d7 + dbf d6,.wloop + ; + move.l wi_bmapmem(a2),d0 + sub.l #40*7,d0 + lsr.l #2,d0 + subq #1,d0 + lea 40*7(a0),a1 +.cbloop move.l (a0)+,(a1)+ + dbf d0,.cbloop + ; + move.l wi_bmap(a2),a0 + move.l wi_strip(a2),a1 + move wi_bh(a2),d0 + lsr #2,d0 + mulu #7*40,d0 + add.l d0,a0 + move #7*7*10-1,d2 + ; +.loop move.l (a0)+,(a1)+ + dbf d2,.loop + ; + rts + +freewindow ;window in a0 + ; + push + move.l a0,a2 + move.l wi_bmap(a2),d0 + beq.s .no1 + clr.l wi_bmap(a2) + move.l d0,a1 + freemem wi_bmap +.no1 move.l wi_strip(a2),d0 + beq.s .no2 + clr.l wi_strip(a2) + move.l d0,a1 + freemem wi_strip +.no2 move.l wi_cop1(a2),d0 + beq.s .no3 + clr.l wi_cop1(a2) + move.l d0,a1 + freemem wi_cop +.no3 pull + rts + + ifne aga + ; +agawindow ; +makewindow ;AGA make window + ; + ;a0=window struct! + ; + push + ; + move.l a0,a2 + ; + bsr allocwbmap + bsr plotwbmap + ; + tst.l wi_iff(a2) + beq wchunky + ; + ;make a palette coplist for the window + ; + ;to write 32 colours... + ;set bank, write hi nybs, set bank, write lo nybs... + ;=66 copins. + ;*4=264 total + ;+1 for final wait +3 for final copjump=268 + ; + move.l #268<<2,d0 + move.l d0,wi_copmem(a2) + moveq #2,d1 + allocmem wi_iffcop + move.l d0,wi_cop(a2) + move.l d0,wi_cop1(a2) + move.l d0,wi_cop2(a2) + move.l d0,a0 ;dest + move.l wi_pal(a2),a1 ;palette! + ; + moveq #0,d0 ;bank + moveq #3,d3 + ; +.loop move #$106,(a0)+ + move d0,(a0)+ + move #$180,d1 + moveq #31,d2 +.hiloop move d1,(a0)+ + move (a1),(a0)+ + addq #4,a1 + addq #2,d1 + dbf d2,.hiloop + ; + lea -128+2(a1),a1 + move #$106,(a0)+ + bset #9,d0 + move d0,(a0)+ + bclr #9,d0 + move #$180,d1 + moveq #31,d2 +.loloop move d1,(a0)+ + move (a1),(a0)+ + addq #4,a1 + addq #2,d1 + dbf d2,.loloop + subq #2,a1 + ; + add #$2000,d0 ;next bank! + dbf d3,.loop + ; + move.l #$fffffffe,(a0)+ + move.l #$00840000,(a0)+ + move.l #$00860000,(a0)+ + move.l #$008a0000,(a0)+ + pull + rts + ; +wchunky ;how many copins on one line? + ; + move wi_w(a2),d0 + move d0,d1 + subq #1,d0 + lsr #5,d0 ;how many bank changes per line! + addq #3,d0 ;1 waits - 1 eor, 1 init bank select + add d1,d0 ;+colpokes + ; + move d0,d1 + lsl #2,d1 + move d1,wi_copmod(a2) + ; + mulu wi_h(a2),d0 + addq #4,d0 ;1 wait and cop jump at end + ; + lsl.l #2,d0 ;4 bytes/copins + moveq #2,d1 ;cop in chip + move.l d0,wi_copmem(a2) + lsl.l #1,d0 ;2 coplists! + allocmem wi_chunkycop + move.l d0,wi_cop(a2) + move.l d0,wi_cop1(a2) + ; + move.l d0,a0 + move wi_y(a2),d6 + move wi_h(a2),d7 + subq #1,d7 + move #$111,d3 ;test colour + move #$8000,d4 ;Colour Eor + ; +.hloop ;make one copline... + ; + moveq #127,d0 ;colour reg to poke + move wi_w(a2),d1 + subq #1,d1 + ; +.lloop move d0,d2 + addq #1,d2 + and #31,d2 + bne.s .notnbank + ; + ;new bank.... + move d0,d2 + sub #31,d2 + and #$ffe0,d2 + lsl #8,d2 + or d4,d2 ;eor bank + move #$106,(a0)+ ;bank select + move d2,(a0)+ + ; +.notnbank move d0,d2 + and #31,d2 + add d2,d2 + add #$180,d2 + move d2,(a0)+ ;colour poke + move d3,(a0)+ + add #$111,d3 + subq #1,d0 + dbf d1,.lloop + ; + bsr .makewait + ; + ;ok, now do EOR! + move #$10c,(a0)+ + move d4,(a0)+ + bchg #15,d4 + ; + dbf d7,.hloop + ; + bsr .makewait + ; + move.l #$00840000,(a0)+ + move.l #$00860000,(a0)+ + move.l #$008a0000,(a0)+ + ; + ;OK, 1 list created...copy to other! + ; + move.l wi_cop1(a2),a0 + move.l a0,a1 + add.l wi_copmem(a2),a1 + move.l a1,wi_cop2(a2) + move.l a1,a3 + ; +.copycop move.l (a0)+,(a3)+ + cmp.l a1,a0 + bcs.s .copycop + ; + pull + rts + +.makewait ; + ;make wait ins. at pos d6 + ; + subq #1,d6 + move.b d6,(a0)+ + move.b #$e1,(a0)+ + move #$fffe,(a0)+ + addq #1,d6 + add wi_ph(a2),d6 + rts + + elseif + +ecswindow +makewindow ;ECS makewindow...no bitmap needed! + ; + ;a0=window struct + ; + push + ; + move.l a0,a2 + ; + ;how many copins on one line? + ; + ;2 waits... + ;width moves + ;1 colour 0 poke... + ; + ;=width+3! + ; + move wi_w(a2),d0 + addq #7,d0 + ; + move d0,d1 + lsl #2,d1 + move d1,wi_copmod(a2) + ; + mulu wi_h(a2),d0 + addq #4,d0 ;1 waits at begin and cop jump + ;at end + ; + lsl.l #2,d0 ;4 bytes/copins + moveq #2,d1 ;cop in chip + move.l d0,wi_copmem(a2) + lsl.l #1,d0 ;2 coplists! + allocmem wi_chunkycop + move.l d0,wi_cop(a2) + move.l d0,wi_cop1(a2) + ; + move.l d0,a0 + move #$47,d5 + sub wi_w(a2),d5 + add d5,d5 + or #1,d5 + move wi_y(a2),d6 + move wi_h(a2),d7 + subq #1,d7 + ; + moveq #0,d3 + move #$fffe,d4 + bsr .makewait ;wait! + ; +.hloop ;make one copline... + cmp #128,d6 + ble.s .yn + move.b #$80,d3 +.yn ; + move.l a0,d2 ;prepare jump address + addq.l #8,d2 + ; + move #$084,(a0)+ + swap d2 + move d2,(a0)+ + move #$086,(a0)+ + swap d2 + move d2,(a0)+ + ; + ;wait for start X pos... + ; + move.b d3,(a0)+ + move.b d5,(a0)+ + move #$80fe,(a0)+ + ; + move wi_w(a2),d1 + subq #1,d1 + ; +.lloop move.l #$1800f00,(a0)+ + dbf d1,.lloop + move #$180,(a0)+ + move #col0,(a0)+ + ; + move.b d3,(a0)+ + move.b #$e1,(a0)+ + move #$80fe,(a0)+ ;wait for end of line! + ; + move #$ffff,d4 ;skip! + bsr .makewait + move.l #$8a0000,(a0)+ ;strobe! + ; + dbf d7,.hloop + ; + move.l #$00840000,(a0)+ + move.l #$00860000,(a0)+ + move.l #$008a0000,(a0)+ + ; + ;OK, 1 list created...copy to other! + ; + move.l wi_cop1(a2),a0 + move.l a0,a1 + add.l wi_copmem(a2),a1 + move.l a1,wi_cop2(a2) + move.l a1,a3 + ; + move.l a1,d0 + sub.l a0,d0 + ; +.copycop move.l (a0)+,(a3)+ + cmp #$084,-8(a3) + bne.s .noafix + move -6(a3),d2 + swap d2 + move -2(a3),d2 + add.l d0,d2 + move d2,-2(a3) + swap d2 + move d2,-6(a3) +.noafix cmp.l a1,a0 + bcs.s .copycop + ; + pull + rts + +.makewait ; + ;make wait ins. at pos d6 + ;cmp #256,d6 + ;blt.s .not256 + ;move.l #$ffe1fffe,(a0)+ + ;add wi_ph(a2),d6 + ;rts + ; +.not256 move.b d6,(a0)+ + move.b #1,(a0)+ + move d4,(a0)+ ;wait/skip + add wi_ph(a2),d6 + rts + + endc + +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 map_rgbsfrom,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,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 +demon dc.l 0,0 + dc.b 'objs/demon',0,0 + even + +objinfo +player1_ dc.l player1 +.ob_rotspeed dc.l $40000 +.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 -110 ;eye height +.ob_firey dc -60 ;where bullets come from +.ob_gutsy dc -64 +.ob_othery dc 0 +.ob_colltype dc 8 +p1_ob_collwith dc 6 ;6=combat, 4=game +p1_ob_cntrl dc 1 ;for player 0,1=joyport, 2=keys +.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_wlevel dc 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 +; +objinfof + +oilen equ objinfof-objinfo + +player2_ dc.l player2 +.ob_rotspeed dc.l $40000 +.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 -110 ;eye height +.ob_firey dc -60 ;where bullets come from +.ob_gutsy dc -64 +.ob_othery dc 0 +.ob_colltype dc 16 +p2_ob_collwith dc 5 ;5=combat, 4=game +p2_ob_cntrl dc 0 ;for player 0,1=joyport, 2=keys +.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_wlevel dc 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 + +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 $30000 +.ob_framespeed dc.l 0 +.ob_base dc 0 +.ob_range dc 0 +.ob_weapon dc 0 +.ob_wlevel 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 + +weapon_ 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 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 $50000 +.ob_framespeed dc.l 0 +.ob_base dc 0 +.ob_range dc 0 +.ob_weapon dc 0 +.ob_wlevel 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 + +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 $10000 +.ob_framespeed dc.l 0 +.ob_base dc 0 +.ob_range dc 0 +.ob_weapon dc 0 +.ob_wlevel 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 + +infra_ ds.b oilen + +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 $20000 +.ob_framespeed dc.l 0 +.ob_base dc 0 +.ob_range dc 0 +.ob_weapon dc 0 +.ob_wlevel 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 + +invinc_ ds.b oilen + +blank1_ ds.b oilen + +blank2_ ds.b oilen + +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 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_wlevel 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 + +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_wlevel 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 + +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 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 1 +.ob_hitpoints dc 12 +.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_wlevel 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 $280 +.ob_apad dc 0 + +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 + +groundtile incbin tile2.bin +ceilingtile incbin tile.bin + +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 + +gloombrush incbin gloombrush + +gloom incbin title +gloompal incbin title.pal + +combat incbin combat +combatpal incbin combat.pal + +medplayer incbin medplay + +rgbs16 ds.w 32 + +map_rgbs_ ds.w 256 + +decrm incbin decrm diff --git a/gloom.s.zclip b/gloom.s.zclip new file mode 100644 index 0000000..5d6d2d6 --- /dev/null +++ b/gloom.s.zclip @@ -0,0 +1,3057 @@ + + ;OK, how to do object processing... + ; + ;process objects every 2nd vertical blank...set 'done' flag + ; + ;main program waits for 'done' flag, clrs it, disables ints, + ;fetches display stuff, enables ints, draws display, waits for VB + ;and shows it! + ; +focshft equ 6 +grdshft equ 8 +darkshft equ 7 ;smaller=smaller range=faster! +maxz equ 16<>3(a0) + 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 + jsr allocmem + 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 + + + +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 + +entrypoint +cli ; + move.l a0,a2 + ; + lea dosname,a1 + move.l 4.w,a6 + jsr -408(a6) + move.l d0,dosbase + ; + cmp.b #'@',(a2)+ + bne.s main + move.l a2,a0 + moveq #1,d1 + bsr loadfile + move.l d0,map_map + bne.s main + rts +main ; + lea ciaaname,a1 + move.l 4.w,a6 + jsr -498(a6) + move.l d0,a0 + move.l $64(a0),a0 + lea $136(a0),a0 + move.l a0,rawtable + ; + move #$8400,$dff096 + ; + move.l #32768,d0 + moveq #1,d1 + jsr allocmem + move.l d0,memory + ; + lea palettes,a2 + moveq #15,d2 +.palloop move.l #512,d0 + moveq #1,d1 + jsr allocmem + move.l d0,(a2)+ + dbf d2,.palloop + ; + move.l #24*256,d0 + moveq #1,d1 + jsr allocmem + move.l d0,rgbs + ; + move.l #320*vd_size,d0 + moveq #1,d1 + jsr allocmem + move.l d0,vertdraws + ; + jsr initmap + jsr initdisplay + jsr ownblitter + jsr initvbint + jsr forbid + ; + move.l map_poly(pc),a0 +.loop cmp.l map_ppnt(pc),a0 + bcc.s .done + clr (a0) + lea 32(a0),a0 + bra.s .loop +.done clr frame + ; + alloclist objects,#maxobjects,#ob_size + ; + jsr dispoff + ; + jsr makecoloffs + ; + lea window1,a0 + bsr makewindow + lea window2,a0 + bsr makewindow + ; + lea window1,a0 + bsr showwindow + lea window1,a0 + bsr dbwindow + lea window2,a0 + bsr showwindow + lea window2,a0 + bsr dbwindow + ; + move blob+6,d0 + lsr #1,d0 + move d0,blob+2 + ; + move blob2+6,d0 + lsr #1,d0 + move d0,blob2+2 + ; + move #$1f3a,d0 + bsr seedrnd + ; + clr.l player1 + clr.l player2 + not.l player2 + moveq #1,d0 + bsr execevent + ; + bsr dispon + clr doneflag + ; +mainloop tst doneflag + beq.s mainloop ;wait for updated! + clr doneflag + ; + move.l memory(pc),memat + ; + move.l player1(pc),a0 + bsr calcscene + lea window1,a0 + bsr drawscene + ; + ;move.l player2(pc),a0 + ;bsr calcscene + ;lea window2,a0 + ;bsr drawscene + ; + ;bsr vwait ;!*! + ; + lea window1,a0 + bsr showwindowq + lea window2,a0 + bsr showwindowq + ; + move.l rawtable(pc),a0 + key $45 + beq mainloop + ; + bsr permit + bsr finitvbint + bsr disownblitter + bsr finitdisplay + ; + bsr freememlist + rts + +; ************* FAST SUBS ******************** + +fastsubs + +execevent ;d0=event number to execute...1,2... + ; + move.l map_map(pc),a6 + add.l 16(a6,d0*4),a6 + ; +exec_loop move (a6)+,d0 + beq.s .rts + subq #1,d0 + beq exec_addobj ;1 + subq #1,d0 + beq exec_loop ;2 + subq #1,d0 + beq exec_loop ;3 + subq #1,d0 + beq exec_loop ;4 + subq #1,d0 + beq exec_loop ;5 + ; +.rts rts + +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 addlast objects + 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) + sub #64,ob_rot(a5) + and #255,ob_rot(a5) + lea ob_info(a5),a3 + move #(objinfof-objinfo-4)>>1-1,d0 +.loop move (a2)+,(a3)+ + dbf d0,.loop + ; + bsr calcvecs + movem.l d4-d5,ob_xvec(a5) + bra exec_loop + +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,(a0) + 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 + +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 ;a0=player object + ; + move #$4000,$dff09a + move.l a0,-(a7) + clr.l shapelist + bsr calccamera + bsr makewalls + ; + lea objects(pc),a5 +.loop move.l (a5),a5 + tst.l (a5) + beq.s .done + cmp.l (a7),a5 + beq.s .loop + move.l ob_render(a5),a0 + jsr (a0) + bra.s .loop +.done ; + move #$c000,$dff09a + addq #4,a7 + rts + +drawscene ;a0=window + ; + bsr dbwindow + bsr castwalls + bsr renderwindow + bsr drawshapes + rts + +vbhandler subq #1,(a1)+ + addq #1,(a1) + btst #0,1(a1) + beq rts + ; + ;OK, movement/animation stuff! + ; + movem.l d0-d7/a0-a6,-(a7) + ; + bsr readjoys + ; + ;do object logic + ; + 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.l ob_shape(a5),a0 + move 4(a0),d1 + lsr #1,d1 ;radius! + move ob_x(a5),d6 + move ob_z(a5),d7 + ; + lea objects(pc),a0 + ; +.loop2 move.l (a0),a0 + cmp.l a5,a0 + beq.s obj_loop + ; + move ob_colltype(a0),d2 + and d0,d2 + beq.s .loop2 + ; + move.l ob_shape(a0),a1 + move 4(a1),d2 + lsr #1,d2 ;radius! + 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 + ; + col #$fff + ; + subq #1,ob_hitpoints(a0) + bgt.s hit_skip + ; + move.l #killobject3,killjsr + move.l a5,obj_a5 + ; + move.l a0,a5 + move.l ob_die(a5),a0 + jsr (a0) +hit_ret ; + move.l obj_a5(pc),a5 + move.l #killobject2,killjsr + ; +hit_skip subq #1,ob_hitpoints(a5) + bgt.s hit_skip2 + move.l ob_die(a5),a0 + jsr (a0) +hit_skip2 ; + bra obj_loop + ; +exit_vb st doneflag + movem.l (a7)+,d0-d7/a0-a6 + moveq #0,d0 + ; +rts rts + +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 + +monsterlogic ; + ;monster cruising around minding his own business... + ; + bsr rndw + cmp ob_rndturn(a5),d0 + bcc.s .noturn + ; +.turn ;turn 45 degrees randomly left or right! + ; + moveq #32,d1 + bsr rndw + tst d0 + bpl.s .pl + neg d1 +.pl add d1,ob_rot(a5) + movem.l d1,-(a7) + bsr calcvecs + move.l ob_x(a5),d6 + move.l ob_z(a5),d7 + bsr mover2 + movem.l (a7)+,d1 + bne.s .pl + movem.l d4-d5,ob_xvec(a5) + move.l d6,ob_x(a5) + move.l d7,ob_z(a5) + rts + ; +.noturn movem.l ob_xvec(a5),d4-d5 + move.l ob_x(a5),d6 + move.l ob_z(a5),d7 + bsr mover2 + bne.s .turn + move.l d6,ob_x(a5) + move.l d7,ob_z(a5) + 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 + muls 6(a0),d5 + add.l d5,d5 + rts + +playerdeath addq #4,ob_rot(a5) + addq #4,ob_eyey(a5) + blt.s .rts + move.l #rts,ob_logic(a5) +.rts rts + +playerdie move.l #playerdeath,ob_logic(a5) + clr.l ob_colltype(a5) + rts + +playerlogic lea joyx0(pc),a0 + move ob_cntrl(a5),d0 + beq.s .skip + lea joyx1(pc),a0 +.skip ; + move (a0),d0 ;joyx - rotate + muls ob_rotspeed(a5),d0 + add ob_rot(a5),d0 + and #255,d0 + move d0,ob_rot(a5) + ; + ;move... + ; + move 2(a0),d4 + neg d4 + muls ob_movspeed(a5),d4 ;speed + move.l camrots(pc),a1 + lea 0(a1,d0*8),a1 + move d4,d5 ;real speed + muls 2(a1),d4 + add.l d4,d4 + muls 6(a1),d5 + add.l d5,d5 + move.l ob_x(a5),d6 + move.l ob_z(a5),d7 + ; + bsr mover + ; + move.l d6,ob_x(a5) + move.l d7,ob_z(a5) + ; + bra checkfire + ; + bsr checknew3 ;in a trigger zone? + bne.s checkfire + ; + move.l new_grid(pc),a0 + moveq #-16,d0 +.loop tst (a0) + bpl.s .here + add.l d0,a0 + bra.s .loop + ; +.here move 2(a0),d0 ;first + move.l map_ppnt(pc),a1 + move 0(a1,d0*2),d0 ;poly# + move.l map_poly(pc),a0 + lsl #5,d0 + move zo_ev(a0,d0),d0 + beq.s checkfire + ; + ;OK, gotta clear all 'event' zones with same type! + ; + moveq #32,d1 + moveq #0,d2 +.loop2 cmp zo_ev(a0),d0 + bne.s .skip2 + move d2,zo_ev(a0) +.skip2 add.l d1,a0 + cmp.l a1,a0 + bcs.s .loop2 + ; + move.l a5,-(a7) + bsr execevent + move.l (a7)+,a5 + ; +checkfire move joyf0(pc),d0 + tst ob_cntrl(a5) + beq.s .skip + move joyf1(pc),d0 +.skip tst d0 + beq .rts + ; + addfirst objects + beq .rts + ; + 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,ob_render(a0) + move.l #killobject,ob_die(a0) + move.l #blob,ob_shape(a0) + move ob_collwith(a5),d0 + eor #3,d0 + move d0,ob_colltype(a0) + cmp #2,d0 + beq.s .sk + move.l #blob2,ob_shape(a0) +.sk move #0,ob_collwith(a0) + move #1,ob_hitpoints(a0) + ; + move ob_rot(a5),d0 + move.l camrots(pc),a1 + lea 0(a1,d0*8),a1 + ; + move 2(a1),d0 + ext.l d0 + lsl.l #6,d0 + ; + move 6(a1),d1 + ext.l d1 + lsl.l #6,d1 + ; + movem.l d0-d1,ob_xvec(a0) + ; +.rts rts + +firelogic ; + movem.l ob_xvec(a5),d4-d5 + move.l ob_x(a5),d6 + move.l ob_z(a5),d7 + bsr mover + bne killobject + move.l d6,ob_x(a5) + move.l d7,ob_z(a5) + rts + +drawshape_8 ; + ;shape has 8 rotations! + ; + bsr calcangle2 + add #16,d0 + add ob_rot(a5),d0 + lsr #5,d0 + and #7,d0 + lea shrots,a0 + move.l 0(a0,d0*4),a0 + move ob_x(a5),d0 + move ob_y(a5),d1 + move ob_z(a5),d2 + bra.s drawshape_ + +drawshape ; + move ob_x(a5),d0 + move ob_y(a5),d1 + move ob_z(a5),d2 + move.l ob_shape(a5),a0 +drawshape_ ; + ;A0=shape + ;D0=X + ;D1=Y + ;D2=Z + ; + ;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 + ; + cmp #maxz,d2 + bge .rts + cmp #1,d2 + ble .rts + ; + muls cm1(pc),d0 + muls cm2(pc),d5 + add.l d5,d0 + add.l d0,d0 + swap d0 + ; + sub (a0)+,d0 ;handles! + sub (a0)+,d1 + ; + move.l memat(pc),a1 + add.l #sh_size,memat + movem d0-d2,sh_x(a1) + move.l a0,sh_shape(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 + blt.s .loop + move.l a2,(a1) + move.l a1,(a3) + rts +.end move.l d0,(a1) + move.l a1,(a2) +.rts rts + +drawshapes lea shapelist(pc),a6 + ; +.drawloop move.l (a6),d0 + beq .rts + move.l d0,a6 + movem sh_x(a6),d0-d2 + move.l sh_shape(a6),a0 + ; + ;d0=rotated X, d1=Y, d2=Z + ; + ;work out real width/height! + ; + lsl.l #focshft,d0 + divs d2,d0 ;Screen X + cmp maxx(pc),d0 + bge .drawloop ;X too big! + ; + lsl.l #focshft,d1 + divs d2,d1 ;Screen Y + cmp maxy(pc),d1 + bge .drawloop + ; + movem (a0),d3-d4 + ; + move.l d3,d5 + lsl.l #focshft,d3 + divs d2,d3 ;screen width + ext.l d3 + ble .drawloop + ; + move.l d4,d6 + lsl.l #focshft,d4 + divs d2,d4 ;hite + ext.l d4 + ble .drawloop + ; + swap d5 + divu.l d3,d5 ;x step.q + ; + add midx(pc),d0 + bpl.s .xcskip + add d0,d3 ;reduce width + ble .drawloop + moveq #0,d7 + neg d0 + ext.l d0 + mulu.l d5,d0 ;start column in shape + cmp width(pc),d3 + ble.s .xcdone + move width(pc),d3 + bra.s .xcdone + ; +.xcskip move d0,d7 ;sc X + add d3,d0 + sub width(pc),d0 + ble.s .xcdone2 + sub d0,d3 + ble .drawloop +.xcdone2 move.l d5,d0 + lsr.l #1,d0 +.xcdone ; + swap d6 + divu.l d4,d6 ;y step + ; + move.l cop(pc),a1 + ; + add midy(pc),d1 + bpl.s .ycskip + add d1,d4 ;hite + ble .drawloop + neg d1 + ext.l d1 + mulu.l d6,d1 + cmp hite(pc),d4 + ble.s .ycdone + move hite(pc),d4 + bra.s .ycdone + ; +.ycskip move d1,-(a7) + mulu copmod(pc),d1 + add.l d1,a1 + move (a7)+,d1 + add d4,d1 + sub hite(pc),d1 + ble.s .ycdone2 + sub d1,d4 + ble .drawloop +.ycdone2 move.l d6,d1 + lsr.l #1,d1 +.ycdone ; + ;draw bit... + ; + ;a0=src, a1=dest, a2=palette + ; + ;d0.q=src x + ;d1.q=src y + ;d2.w = Z! + ;d3.w=width + ;d4.w=height + ;d5.q=x step + ;d6.q=y step + ;d7.w=start screen column + ;a0.l=src + ;a1.l=dest + ;a2.l=palette + ; + move.l a6,-(a7) + ; + lea coloffs,a5 + lea 0(a5,d7*4),a5 + ; + move.l vertdraws(pc),a6 + mulu #vd_size,d7 + lea 0(a6,d7),a6 + ; + lea palettes,a2 + move d2,d7 + lsr #darkshft,d7 + move.l 0(a2,d7*4),a2 + ; + subq #1,d3 + subq #1,d4 + swap d0 + swap d1 + swap d5 + swap d6 + addq #2,a0 + ; +.hloop move.l a1,a4 + add.l (a5)+,a4 + cmp vd_z(a6),d2 + bge .zbad + ; + movem.l d0-d1/d4-d5,-(a7) + ; + mulu (a0),d0 + lea 2(a0,d0),a3 ;src + ; + move copmod(pc),d7 + ext.l d7 + moveq #0,d5 + moveq #0,d0 + ; +.vloop move.b 0(a3,d1),d5 + beq.s .skip + move 0(a2,d5*2),(a4) +.skip add.l d6,d1 ;next src Y + addx.l d0,d1 + 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 + ; + move.l (a7)+,a6 + bra .drawloop + ; +.rts rts + +printcampos move camx(pc),d6 + lsr #grdshft,d6 + ext.l d6 + ; + move camz(pc),d7 + lsr #grdshft,d7 + ext.l d7 + ; + move d7,d5 + lsl #5,d5 + add d6,d5 + move.l map_grid(pc),a0 + move 0(a0,d5*4),d5 + and.l #$ffff,d5 + ; + printlong d6 + printlong d7 + printlong d5 + ; + rts + +mover ; + ;d4=x speed + ;d5=z speed + ;d6=x + ;d7=z + ; + ;return d0, ne if a wall was hit! + ;check only walls zone (player) + ; + neg.l d4 + moveq #0,d3 + add.l d4,d6 + add.l d4,d6 + add.l d4,d6 + bsr checknew + beq.s .xok + moveq #-1,d3 + sub.l d4,d6 +.xok sub.l d4,d6 + sub.l d4,d6 + ; + add.l d5,d7 + add.l d5,d7 + add.l d5,d7 + bsr checknew + beq.s .zok + moveq #-1,d3 + sub.l d5,d7 +.zok sub.l d5,d7 + sub.l d5,d7 + tst d3 + rts + +mover2 ; + ;d4=x speed + ;d5=z speed + ;d6=x + ;d7=z + ; + ;return d0, ne if a wall was hit! + ;check walls AND monster zones + ; + neg.l d4 + moveq #0,d3 + add.l d4,d6 + add.l d4,d6 + add.l d4,d6 + bsr checknew + bne.s .xbad + bsr checknew2 + beq.s .xok +.xbad moveq #-1,d3 + sub.l d4,d6 +.xok sub.l d4,d6 + sub.l d4,d6 + ; + add.l d5,d7 + add.l d5,d7 + add.l d5,d7 + bsr checknew + bne.s .zbad + bsr checknew2 + beq.s .zok +.zbad moveq #-1,d3 + sub.l d5,d7 +.zok sub.l d5,d7 + sub.l d5,d7 + tst d3 + rts + +checknew3 ;check trigger event zone + move.l map_grid(pc),a0 + addq #8,a0 + bra.s checknew_ +new_grid dc.l 0 + +checknew2 ;check monster zone + move.l map_grid(pc),a0 + addq #4,a0 + bra.s checknew_ + +checknew ;check wall zone + move.l map_grid(pc),a0 + ; +checknew_ movem.l d3-d5,-(a7) + swap d6 + swap d7 + ; + addq #1,frame + move frame(pc),d5 + move d6,d0 + move d7,d1 + lsr #grdshft,d0 ;x count + lsr #grdshft,d1 + lsl #5,d1 + add d0,d1 + lsl #4,d1 + lea 0(a0,d1),a0 + move.l a0,new_grid + moveq #1,d1 + move.l map_ppnt(pc),a1 + move.l map_poly(pc),a2 + ; + ;d0=counter to left of map! + ;d1=in/out counter + ; +.loop move (a0)+,d2 ;how many in this grid! + bmi .next + ; + move (a0),d3 + lea 0(a1,d3*2),a3 + ; +.loop2 move (a3)+,d3 + lsl #5,d3 + lea 0(a2,d3),a4 + ; + cmp zo_done(a4),d5 + beq .next2 + move d5,zo_done(a4) + ; + cmp zo_minz(a4),d7 + blt .next2 + cmp zo_maxz(a4),d7 + bge .next2 + ; + ;OK, we are in the z area! + ; + cmp zo_minx(a4),d6 + blt .next2 ;too far left! + cmp zo_maxx(a4),d6 + bgt .inc + ; + ;have to do test! + ; + movem zo_x1(a4),d3-d4 ;x1,z1 + sub d6,d3 + muls zo_a(a4),d3 + sub d7,d4 + muls zo_b(a4),d4 + add.l d4,d3 + bpl.s .next2 + ; +.inc addq #1,d1 + ; +.next2 dbf d2,.loop2 + ; +.next lea -18(a0),a0 + dbf d0,.loop + ; + swap d6 + swap d7 + and #1,d1 + movem.l (a7)+,d3-d5 + rts + +calccamera ;a0=player object + ; + move ob_x(a0),camx + move ob_y(a0),d0 + add ob_eyey(a0),d0 + move d0,camy + move ob_z(a0),camz + move ob_rot(a0),d0 + and #255,d0 + move d0,camr + move.l camrots(pc),a1 + lea 0(a1,d0*8),a1 + move.l (a1)+,cm1 + move.l (a1),cm3 + ; + rts + +readjoys ;set up joyx0,joyy0,joyx1,joyy1 + ; + move.l rawtable(pc),a0 + moveq #0,d0 + key $4f + beq.s .nleft + moveq #-1,d0 +.nleft key $4e + beq.s .nrite + moveq #1,d0 +.nrite move d0,joyx0 + moveq #0,d0 + key $4c + beq.s .nup + moveq #-1,d0 +.nup key $4d + beq.s .ndown + moveq #1,d0 +.ndown move d0,joyy0 + key $64 + sne d0 + ext d0 + move d0,d1 + beq.s .nofire + tst joyb0 + beq.s .nofire + moveq #0,d1 +.nofire move d1,joyf0 + move d0,joyb0 + ; + elseif + move.b $bfe001,d3 + move $dff00a,d2 ;joy0 + bsr readjoy + move d0,joyx0 + move d1,joyy0 + bsr makerot + move d0,joyr0 + btst #6,$bfe001 + seq d0 + ext d0 + move d0,d1 + beq.s .nofire + tst joyb0 + beq.s .nofire + moveq #0,d1 +.nofire move d1,joyf0 + move d1,help + move d0,joyb0 + elseif + ; + move $dff00c,d2 + bsr readjoy + move d0,joyx1 + move d1,joyy1 + bsr makerot + move d0,joyr1 + btst #7,$bfe001 + seq d0 + ext d0 + move d0,d1 + beq.s .nofire2 + tst joyb1 + beq.s .nofire2 + moveq #0,d1 +.nofire2 move d1,joyf1 + move d0,joyb1 + ; + rts + +makerot ;convert d0,d1 into a rotation type setting... + ; + ;0=up, 1=up/rite, 2=rite etc... + ; + ;<0=no dir + ; + addq #1,d0 + lsl #2,d0 + addq #1,d1 + or d1,d0 + add d0,d0 + move rots(pc,d0),d0 + rts + +rots ;x=-1 + dc 7,6,5,-1 + ;x=0 + dc 0,-1,4,-1 + ;x=1 + dc 1,2,3,-1 + +readjoy bsr joydir + move d1,d0 + move d2,d1 + add d1,d1 + eor d1,d2 + ; +joydir btst #9,d2 + bne.s .neg + btst #1,d2 + bne.s .pos + moveq #0,d1 + rts +.neg moveq #-1,d1 + rts +.pos moveq #1,d1 + rts + +gridoffs incbin gridoffs.bin +gridoffsf + +makewalls ; + ;New approach! + ; + ;use poly's line eq to test perpendicular distance to wall + ;produce nearest -> furthest wall list. + ; + ;optimizations... + ;check if both z's are negative after rotation + ;check if projected left/rite ends are on screen + ; + addq #1,frame + ; + clr.l inlist + move.l #inlist,inlistf + clr.l outlist + move.l #outlist,outlistf + ; + 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 + lsl #4,d0 + lea 0(a2,d0),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 + move frame(pc),d0 + cmp zo_done(a1),d0 + beq .skip3 + move d0,zo_done(a1) + ; + ;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_x1(a1),d0-d3 ;x1,z1,x2,z2 + movem camx(pc),d6-d7 + ; + sub d6,d0 + sub d7,d1 + sub d6,d2 + sub d7,d3 + ; + move d0,d4 + move d1,d5 + muls cm1(pc),d0 + muls cm2(pc),d5 + add.l d5,d0 + add.l d0,d0 + swap d0 ;LX + 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 + ; + tst d3 + bgt.s .zok + tst d1 + ble .skip2 + ; +.zok ;do backface check...generate a,b,c... + ; + 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) + ; + ;gotta create screen coords...z clip + ; + ;elseif + ; + tst d1 + bgt.s .z1ok + ; + ;lz bad, rz must be OK... + ; + move #-32768,d5 + bra .z1sk + ; + move d3,d5 + sub d1,d5 + move d1,d6 + neg d6 + swap d6 + clr d6 + divu d5,d6 ;frac + move d2,d5 + sub d0,d5 + mulu d6,d5 + swap d5 + add d0,d5 + bra.s .z1sk + ; +.z1ok move d0,d5 + ext.l d5 + lsl.l #focshft,d5 + divs d1,d5 + ; +.z1sk move d5,wl_lsx(a5) + ; + tst d3 + bgt.s .z2ok + ; + ;rz bad, lz must be OK... + ; + move #32767,d2 + bra .z2sk + ; + move d1,d5 + sub d3,d5 + move d1,d6 + swap d6 + clr d6 + divu d5,d6 + sub d0,d2 + mulu d6,d2 + swap d2 + add d0,d2 + bra.s .z2sk + ; +.z2ok ext.l d2 + lsl.l #focshft,d2 + divs d3,d2 + ; +.z2sk move d2,wl_rsx(a5) + ; + movem wl_lsx(a5),d0/d2 + cmp d0,d2 + bge.s .sxok + move d2,wl_lsx(a5) + move d0,wl_rsx(a5) +.sxok ; + ;elseif + ; + cmp d1,d3 + bge.s .zskp + exg d1,d3 +.zskp movem d1/d3,wl_nz(a5) ;near/far Z + move zo_t(a1),wl_t(a5) + move zo_sc(a1),wl_sc(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 dbf d4,.loop2 ;finish sq + ; +.skip dbf d5,.loop ;gridoffs + +makeoutlist ;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 + ; + ;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 + ; +.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 + + ;a1=-(y2-y1):b1=(x2-x1):c1=x1*a1+y1*b1 ;line a/campos + ;a2=-(y4-y3):b2=(x4-x3):c2=x3*a2+y3*b2 ;line b/campos + ; + ;If both B in front of A, yes! + ; + ;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 + ; + ;if both A behind B, yes! + ; + ;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 + ; + ;if both A in front of B, no! + ; + ;If Sgn((x3-x1)*a2+(y3-y1)*b2)=Sgn(c2) + ; If Sgn((x3-x2)*a2+(y3-y2)*b2)=Sgn(c2) + ; tr=0:Return + ; EndIf + ;EndIf + ; + ;if both B behind A, no! + ; + ;If Sgn((x1-x3)*a1+(y1-y3)*b1)<>Sgn(c1) + ; If Sgn((x1-x4)*a1+(y1-y4)*b1)<>Sgn(c1) + ; tr=0:Return + ; EndIf + ;EndIf + ; + ;tr=-1:Return + + 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 + ; +.loop2a move.l (a5),d0 + beq .empty + move.l d0,a5 + ; + cmp wl_lsx(a5),d7 + beq .empty + blt.s .loop2a + cmp wl_rsx(a5),d7 + beq .empty + bgt.s .loop2a + ; + movem wl_lx(a5),d0-d1 + muls (a6),d0 + muls 2(a6),d1 + add.l d1,d0 ;LX! + bgt .loop2a + ; + movem wl_rx(a5),d1-d2 + muls (a6),d1 + muls 2(a6),d2 + add.l d2,d1 ;RX! + blt .loop2a + ; + lsl.l #exshft,d0 + lsl.l #exshft,d1 + sub.l d0,d1 + add.l #1<<(exshft-1),d1 ;+.5 + ; + 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 + ; + 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 + add.l #$8000,d2 ;+.5 + swap d2 + muls d0,d2 + add.l d2,d2 + add.l d1,d2 + add.l #$8000,d2 + ; + swap d2 + tst d2 + ble .loop2a + ; + cmp #maxz,d2 + bcs .zisok + ; +.empty move #32767,vd_z(a4) + clr.l vd_data(a4) + bra .next +.zisok ; + ;d0=frac, d2=z, a5=item + ; + move d2,d3 + lsr #darkshft,d3 + movem d2-d3,vd_z(a4) + ; + moveq #-128,d3 + sub camy(pc),d3 + ext.l d3 + lsl.l #focshft,d3 + divs d2,d3 ;top Y + ; + move camy(pc),d4 + neg d4 + ext.l d4 + lsl.l #focshft,d4 + divs d2,d4 ;bot Y (0) + ; + sub d3,d4 + movem d3-d4,vd_y(a4) + ; + lea textures(pc),a3 + move wl_t(a5),d1 + move.l -4(a3,d1*4),a3 ;texture! + ; + ;calc ystep... + movem te_hand(a3),d1 + addq #1,d1 + swap d1 + ext.l d4 + divu.l d4,d1 + move.l d1,vd_ystep(a4) + ; + ;calc column# + mulu wl_sc(a5),d0 + ; + move te_wshift(a3),d1 + addq #1,d1 + lsl.l d1,d0 + swap d0 + move te_wand(a3),d1 + and d1,d0 + ; + move te_hshift(a3),d1 + lsl d1,d0 + ; + lea te_size(a3,d0),a3 + move.l a3,vd_data(a4) + ; +.next ;onto next display column + ; + lea vd_size(a4),a4 + addq #8,a6 + addq #1,d7 + cmp maxx(pc),d7 + blt .loop + ; + rts + +dbwindow ;a0=window to double buffer.... + ; + movem.l wi_cop(a0),d0-d1 + cmp.l d0,d1 + bne.s .skip + move.l wi_cop2(a0),d1 +.skip move.l d1,wi_cop(a0) + ; +usewindow ;a0=window to use... + ; + move.l wi_cop(a0),cop + move.l wi_bmap(a0),bitmap + clr.l cursx + ; + move wi_copmod(a0),copmod + move wi_w(a0),d0 + move d0,width + lsr #1,d0 + move d0,maxx + neg d0 + move d0,minx + move wi_h(a0),d1 + move d1,hite + lsr #1,d1 + move d1,maxy + neg d1 + move d1,miny + ; + rts + +renderwindow ; + ; +renderwalls ; + move.l vertdraws(pc),a6 + lea coloffs(pc),a5 + move width(pc),d7 + subq #1,d7 + lea palettes,a2 + ; + move copmod(pc),d0 + subq #2,d0 + ; + bwait + move.l #$1f00000,$dff040 + move d0,$dff066 + move.l #-1,$dff044 + move #0,$dff074 + ; +.loop move.l cop(pc),a1 + add.l (a5)+,a1 + move hite(pc),d6 + ; + move.l vd_data(a6),d0 + beq .vertskip + ; + move.l d0,a0 + ; + move vd_h(a6),d5 + move.l vd_ystep(a6),d1 + ; + ;setup d6, how much more to cls! + ; + move vd_y(a6),d0 + add midy(pc),d0 + bpl.s .noclip + ; + ;gotta clip Y + add d0,d5 ;reduce hite + ble .vertskip + neg d0 + ext.l d0 + mulu.l d1,d0 ;y step* y + move.l d1,d2 + asr.l #1,d2 + add.l d2,d0 + cmp d6,d5 + ble .skipclip + move d6,d5 + bra.s .skipclip + ; +.noclip ;OK, cls down to Y in d0! + ; + beq.s .skcl + move d0,d2 + lsl #6,d2 + or #1,d2 + bwait + move.l a1,$dff054 ;Dpth + move d2,$dff058 ;size... + ; + ;start draw from here... +.skcl move d0,d2 + mulu copmod(pc),d2 + add.l d2,a1 + ; + move d0,d2 + add d5,d2 + sub d6,d2 + ble.s .skipclip2 + sub d2,d5 + ble .vertskip + ; +.skipclip2 sub d0,d6 + move.l d1,d0 + asr.l #1,d0 +.skipclip ; + sub d5,d6 + ; + subq #1,d5 + swap d0 + swap d1 + move vd_pal(a6),d2 + move.l 0(a2,d2*4),a3 + moveq #0,d2 + moveq #0,d3 + move copmod(pc),d4 + ext.l d4 + ; +.vertloop ;a0=src texture column + ;a1=dest coppoke + ;a3=palette + ;d0=current Y + ;d1=Y step + ;d2=0 + ;d3=$00xx + ;d4=copmod + ;d5=count + ; + move.b 0(a0,d0),d3 ;lut entry + add.l d1,d0 + addx.l d2,d0 + move 0(a3,d3*2),(a1) ;colour! + add.l d4,a1 + dbf d5,.vertloop + ; +.vertskip lsl #6,d6 + ble.s .vertskip2 + or #1,d6 + bwait + move.l a1,$dff054 + move d6,$dff058 + ; +.vertskip2 lea vd_size(a6),a6 + dbf d7,.loop + ; + check .loop + ; + rts + +vwait move #1,vbcounter +.loop tst vbcounter + bgt.s .loop + rts + +;************** DATA *************************** + +data + +inlist dc.l 0 +inlistf dc.l inlist +outlist dc.l 0 +outlistf dc.l outlist + +dummy dc.l 0 +player1 dc.l 0 +player2 dc.l 0 +doneflag dc.l 0 +memory dc.l 0 +memat dc.l 0 +shapelist dc.l 0 +bitmap dc.l 0 +palettes ds.l 16 ;16 palettes for 16 brightnesses +rgbs ds.l 1 ;table for calculating palettes + +joyx0 dc 0 +joyy0 dc 0 +joyr0 dc 0 +joyb0 dc 0 +joyf0 dc 0 +joyz0 dc 0 + ; +joyx1 dc 0 +joyy1 dc 0 +joyr1 dc 0 +joyb1 dc 0 +joyf1 dc 0 +joyz1 dc 0 + +map_map dc.l mapinc +map_grid dc.l 0 +map_poly dc.l 0 +map_ppnt dc.l 0 +map_rgbs dc.l 0 +map_txts 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 + +castrots dc.l castrotsinc+8*160 ;middle of table +camrots dc.l camrotsinc + +vertdraws dc.l 0 ;draws for player 1 + +cop dc.l 0 +copmod dc 0 +width dc 0 +hite dc 0 +minx dc 0 +midx ; +maxx dc 0 +miny dc 0 +midy ; +maxy 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 + +window1 ; +slice dc.l slice1 +nslice dc.l copstop ;slice2 ;copstop here for 1 window + ; + dc 160-45*2 + dc 164-45*2 + dc 90 ;max width for 2 high = 90! + dc 90 + dc 2 + dc 2 + ; + dc 0 + dc.l 0 + dc.l 0 + ; + dc.l 0 + dc.l 0 + dc.l 0 + dc.l 0 + dc 0 + +window2 ; + dc.l slice2 + dc.l copstop + ; + dc 160-32*2 + dc 164 + dc 64 + dc 59 + dc 2 + dc 2 + ; + dc 0 + dc.l 0 + dc.l 0 + ; + dc.l 0 + dc.l 0 + dc.l 0 + dc.l 0 + dc 0 + +col0 equ $123 +col1 equ $fff + +copinit ;initialization for display + ; + dc $1fc,15 + dc $096,$0120 ;cop/bit/spr DMA off + ;dc $08e,$2c81,$090,$f4c1 + dc $092,$38,$094,$a0 + dc $108,6*40,$10a,6*40 + dc $100,$7200 ;lores, 7 bitplanes + dc $102,0 + ; + ;lo colour nybs - lo bank + dc $106,$0200 + dc $180,col0,$182,col1 + ; + ;lo nybs - hi bank + dc $106,$8200 + dc $180,col0,$182,col1 + ; + ;hi colour nybs - lo bank + dc $106,0 + dc $180,col0,$182,col1 + ; + ;hi colour nybs - hi bank + dc $106,$8000 + dc $180,col0,$182,col1 + ; + dc 26<<8+1,$fffe + ; + ;slice... + ; +sl1 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 $08e,$2c81,$090,$f4c1 ;diw + dc $096,$8100 + dc $084,0,$086,0,$08a,0 + ; +sl2 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 + ;56 + dc $08e,$2c81,$090,$f4c1 ;diw + ;64 + dc $096,$8100 + ;68 + dc $084,0,$086,0,$08a,0 + ; +cstop dc $096,$0100 + dc $ffff,$fffe +copinitf ; + +bigdata + +textures ds.l 48 + +castrotsinc incbin castrots.bin +camrotsinc incbin camrots.bin +palette incbin texture.pal +font incbin font.bin +shrots dc.l rot1,rot2,rot3,rot4,rot5,rot6,rot7,rot8 + +;************** SLOW SUBS ********************** + +slowsubs + +rawtable dc.l 0 +ciaaname dc.b 'ciaa.resource',0 + even + +cursx dc 0 +cursy dc 0 + +printlong_ movem.l d0-d7/a0-a6,-(a7) + move.l bitmap(pc),a0 + move cursy(pc),d0 + mulu #linemod*8,d0 + add.l d0,a0 + move cursx(pc),d0 + add d0,a0 + ; + move.l 64(a7),d0 ;num to print + lea font,a1 + moveq #7,d1 + ; +.loop rol.l #4,d0 + move d0,d2 + and #15,d2 + lea 0(a1,d2*8),a2 + move.l a0,a3 + moveq #7,d3 + ; +.loop2 move.b (a2)+,(a3) + lea linemod(a3),a3 + dbf d3,.loop2 + ; + addq #1,a0 + dbf d1,.loop + ; + add #1,cursy + movem.l (a7)+,d0-d7/a0-a6 + move.l (a7)+,(a7) + rts + +loadfile ;a0=name, d1=memtype + ; + ;return d0=pointer + ; + push + ; + move.l d1,-(a7) + ; + move.l a0,d1 + move.l #1005,d2 + move.l dosbase,a6 + jsr -30(a6) ;open it! + move.l d0,d7 ;handle + beq .done + ; + 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) + ; + ;d0=length of file ? + ; + move.l d0,d3 + move.l (a7),d1 + jsr allocmem + ; + move.l d0,d2 + move.l d7,d1 + jsr -42(a6) + move.l d7,d1 + jsr -36(a6) + move.l d2,d0 + ; +.done addq #4,a7 + pull + ; + rts + +calcpalettes ;a0=palette! + ; + move.l map_rgbs(pc),a0 + ; + move.l rgbs(pc),a1 + move #255,d0 + move.l #$f0000,d1 + ; +.loop move (a0)+,d2 + ; + move d2,d3 + lsl.l #8,d2 + and.l d1,d2 + move.l d2,(a1)+ ;R + ; + move d3,d2 + lsl.l #8,d2 + lsl.l #4,d2 + and.l d1,d2 + move.l d2,(a1)+ ;G + ; + swap d3 + and.l d1,d3 + move.l d3,(a1)+ ;B + ; + dbf d0,.loop + ; + lea palettes(pc),a0 + moveq #15,d0 + ; +.loop2 move.l rgbs(pc),a1 + move.l (a0)+,a2 + move #255,d1 + ; +.loop3 movem.l (a1),d2-d4 + lsr.l #8,d2 + and #$f00,d2 + lsr.l #8,d3 + lsr.l #4,d3 + and #$f0,d3 + swap d4 + and #$f,d4 + or d4,d3 + or d3,d2 + move d2,(a2)+ + ; + move.l (a1),d2 + sub.l #$10000,d2 + bpl.s .rok + moveq #0,d2 +.rok move.l d2,(a1)+ + ; + move.l (a1),d3 + sub.l #$10000,d3 + bpl.s .gok + moveq #0,d3 +.gok move.l d3,(a1)+ + ; + move.l (a1),d4 + sub.l #$10000,d4 + bpl.s .bok + moveq #0,d4 +.bok move.l d4,(a1)+ + ; + dbf d1,.loop3 + dbf d0,.loop2 + rts + +dispoff tst dispnest + bne.s .skip + bsr vwait + move #$01a0,$dff096 +.skip addq #1,dispnest + rts + +dispon subq #1,dispnest + bgt.s .skip + bsr vwait + move #$8180,$dff096 +.skip rts + +forbid push + move.l 4.w,a6 + jsr -132(a6) + pull + rts + +permit push + move.l 4.w,a6 + jsr -138(a6) + pull + 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 + +finitvbint push + move.l 4.w,a6 + moveq #5,d0 + lea vbintserver,a1 + jsr -174(a6) + pull + rts + +ownblitter push + move.l grbase,a6 + jsr -456(a6) + btst #6,$dff002 +.bwait btst #6,$dff002 + bne.s .bwait + pull + rts + +disownblitter push + btst #6,$dff002 +.bwait btst #6,$dff002 + bne.s .bwait + move.l grbase,a6 + jsr -462(a6) + pull + rts + +makecoloffs push + lea coloffs,a0 + moveq #2,d0 + moveq #3,d2 +.loop addq.l #4,d0 + moveq #31,d1 +.loop2 move.l d0,(a0)+ + addq.l #4,d0 + dbf d1,.loop2 + dbf d2,.loop + pull + 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 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_slice(a0),a1 + move.l (a1),a1 + move.l wi_cop(a0),d0 + move d0,68+6(a1) + swap d0 + move d0,68+2(a1) + rts + +finitdisplay push + ; + 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 #0,$dff088 + move #$81a0,$dff096 + ; + pull + rts + +initdisplay push + ; + lea grname,a1 + move.l 4.w,a6 + jsr -408(a6) + move.l d0,grbase + ; + move.l d0,a6 + move.l 34(a6),oldview + sub.l a1,a1 + jsr -222(a6) ;loadview + ; + move.l #copinitf-copinit,d0 + moveq #2,d1 + bsr allocmem + move.l d0,coplist + ; + move.l d0,a1 + lea copinit,a0 + lea copinitf,a2 + ; +.loop cmp.l a2,a0 + bcc.s .done + move.l (a0)+,(a1)+ + bra.s .loop +.done ; + add.l #sl1-copinit,d0 + move.l d0,slice1 + add.l #sl2-sl1,d0 + move.l d0,slice2 + add.l #cstop-sl2,d0 + move.l d0,copstop + ; + move.l copstop,d0 + move.l slice1,a0 + move.l slice2,a1 + move d0,68+6(a0) + move d0,68+6(a1) + swap d0 + move d0,68+2(a0) + move d0,68+2(a1) + ; + jsr -270(a6) + jsr -270(a6) + move.l coplist,$dff080 + move #0,$dff088 + ; + pull + rts + +makewindow ; + ;a0=window struct! + ; + push + ; + move.l a0,a2 + ; + move wi_h(a2),d0 + mulu wi_ph(a2),d0 + move d0,wi_bh(a2) + mulu #40*7,d0 + ; + move.l #$10002,d1 + move.l d0,wi_bmapmem(a2) + bsr allocmem + move.l d0,wi_bmap(a2) + ; + ;OK, plot colours on bitmap! + move.l d0,a0 + move wi_x(a2),d0 + move d0,d1 + lsr #3,d0 + not d1 + and #7,d1 + moveq #127,d7 ;colour + move wi_w(a2),d6 ;width + subq #1,d6 + ; +.wloop move wi_pw(a2),d5 + subq #1,d5 + ; +.wloop2 move d7,d4 + moveq #6,d3 + ; +.dloop bclr d1,0(a0,d0) + lsr #1,d4 + bcc.s .dskip + bset d1,0(a0,d0) +.dskip lea 40(a0),a0 + dbf d3,.dloop + ; + lea -40*7(a0),a0 + subq #1,d1 + bpl.s .dskip2 + moveq #7,d1 + addq #1,d0 +.dskip2 dbf d5,.wloop2 + ; + subq #1,d7 + dbf d6,.wloop + ; + move.l wi_bmapmem(a2),d0 + sub.l #40*7,d0 + lsr.l #2,d0 + subq #1,d0 + lea 40*7(a0),a1 +.cbloop move.l (a0)+,(a1)+ + dbf d0,.cbloop + ; + ;how many copins on one line? + move wi_w(a2),d0 + move d0,d1 + subq #1,d0 + lsr #5,d0 ;how many bank changes per line! + addq #4,d0 ;2 waits - 1 eor, 1 init bank select + add d1,d0 ;+colpokes + ; + move d0,d1 + lsl #2,d1 + move d1,wi_copmod(a2) + ; + mulu wi_h(a2),d0 + addq #5,d0 ;2 waits and cop jump at end + ; + lsl.l #2,d0 ;4 bytes/copins + moveq #2,d1 ;cop in chip + move.l d0,wi_copmem(a2) + lsl.l #1,d0 ;2 coplists! + bsr allocmem + move.l d0,wi_cop(a2) + move.l d0,wi_cop1(a2) + ; + move.l d0,a0 + move wi_y(a2),d6 + move wi_h(a2),d7 + subq #1,d7 + move #$111,d3 ;test colour + move #$8000,d4 ;Colour Eor + ; +.hloop ;make one copline... + ; + moveq #127,d0 ;colour reg to poke + move wi_w(a2),d1 + subq #1,d1 + ; +.lloop move d0,d2 + addq #1,d2 + and #31,d2 + bne.s .notnbank + ; + ;new bank.... + move d0,d2 + sub #31,d2 + and #$ffe0,d2 + lsl #8,d2 + or d4,d2 ;eor bank + move #$106,(a0)+ ;bank select + move d2,(a0)+ + ; +.notnbank move d0,d2 + and #31,d2 + add d2,d2 + add #$180,d2 + move d2,(a0)+ ;colour poke + move d3,(a0)+ + add #$111,d3 + subq #1,d0 + dbf d1,.lloop + ; + bsr .makewait + ; + ;ok, now do EOR! + move #$10c,(a0)+ + ;move #0,d4 + move d4,(a0)+ + bchg #15,d4 + ; + dbf d7,.hloop + ; + bsr .makewait + ; + move.l #$00840000,(a0)+ + move.l #$00860000,(a0)+ + move.l #$008a0000,(a0)+ + ; + ;OK, 1 list created...copy to other! + ; + move.l wi_cop1(a2),a0 + move.l a0,a1 + add.l wi_copmem(a2),a1 + move.l a1,wi_cop2(a2) + move.l a1,a3 + ; +.copycop move.l (a0)+,(a3)+ + cmp.l a1,a0 + bcs.s .copycop + ; + pull + rts + +.makewait ; + ;make wait ins. + move.l #$01fe0000,(a0)+ ;no wait - nop + cmp #256,d6 + blt.s .not256 + move.l #$00e1fffe,-4(a0) + sub #256,d6 +.not256 move.b d6,(a0)+ + move.b #1,(a0)+ + move #$fffe,(a0)+ ;wait! + add wi_ph(a2),d6 + rts + +allocmem ; + ;d0=size, d1=requirements + ; + push + move.l 4.w,a6 + ; + addq.l #8,d0 + move.l d0,-(a7) + jsr -198(a6) + move.l d0,a0 + move.l memlist,(a0) + move.l (a7)+,4(a0) + move.l a0,memlist + addq.l #8,a0 + move.l a0,d0 + ; + pull + rts + +freememlist push + move.l 4.w,a6 + ; +.more move.l memlist,d0 + beq.s .done + move.l d0,a1 + move.l (a1),memlist + move.l 4(a1),d0 + jsr -210(a6) + bra.s .more + ; +.done pull + rts + +freemem ; + ;a1=address to free! + ; + push + move.l 4.w,a6 + subq.l #8,a1 + move.l #memlist,d0 + ; +.more move.l d0,a0 + move.l (a0),d0 + beq.s .done ;not found! + cmp.l d0,a1 + bne.s .more + ; + move.l (a1),(a0) + move.l 4(a1),d0 + jsr -210(a6) + ; +.done pull + rts + +initmap 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_rgbs + ; + move.l a0,a1 + add.l 16(a0),a1 + move.l a1,map_txts + ; + jsr calcpalettes + jsr loadtxts + ; + pull + rts + +loadtxts move.l map_txts,a5 ;texture names + lea textures,a6 + moveq #47,d7 +.ltl lea .temp(pc),a0 +.ltl2 move.b (a5)+,(a0)+ + bne.s .ltl2 + cmp.l #.temp+1,a0 + beq.s .notext + lea .temp2(pc),a0 + moveq #1,d1 + jsr loadfile +.notext move.l d0,(a6)+ + dbf d7,.ltl + rts + +.temp2 dc.b 'txts/' +.temp ds.b 64 + cnop 0,4 + +mapinc incbin temp_map + +man incbin ggfx/man1.chk +rot1 incbin rot1.chk +rot2 incbin rot2.chk +rot3 incbin rot3.chk +rot4 incbin rot4.chk +rot5 incbin rot5.chk +rot6 incbin rot6.chk +rot7 incbin rot7.chk +rot8 incbin rot8.chk +blob incbin ggfx/blob.chk +blob2 incbin ggfx/blob2.chk + + cnop 0,4 + +objinfo +player1_ dc.l player1 +.ob_rotspeed dc.l $40000 +.ob_movspeed dc.l $a0000 +.ob_shape dc.l man +.ob_logic dc.l playerlogic +.ob_render dc.l drawshape +.ob_die dc.l playerdie +.ob_eyey dc -64 ;eye height +.ob_firey dc -48 ;where bullets come from +.ob_colltype dc 0 +.ob_collwith dc 1 +.ob_cntrl dc 1 ;for player 0,1=joyport +.ob_rndfire dc 0 +.ob_damage dc 0 +.ob_hitpoints dc 5 +.ob_rndturn dc 0 +.ob_think dc 0 +objinfof + +player2_ dc.l player2 +.ob_rotspeed dc.l $30000 +.ob_movspeed dc.l $a0000 +.ob_shape dc.l man +.ob_logic dc.l playerlogic +.ob_render dc.l drawshape +.ob_die dc.l playerdie +.ob_eyey dc -64 ;eye height +.ob_firey dc -48 ;where bullets come from +.ob_colltype dc 0 +.ob_collwith dc 1 +.ob_cntrl dc 0 ;for player 0,1=joyport +.ob_rndfire dc 0 ;guess what! +.ob_damage dc 0 +.ob_hitpoints dc 5 +.ob_rndturn dc 0 +.ob_think dc 0 + +monster1_ dc.l dummy +.ob_rotspeed dc.l $30000 +.ob_movspeed dc.l $60000 +.ob_shape dc.l rot1 +.ob_logic dc.l monsterlogic +.ob_render dc.l drawshape_8 +.ob_die dc.l killobject +.ob_eyey dc -64 ;eye height +.ob_firey dc -48 ;where bullets come from +.ob_colltype dc 0 +.ob_collwith dc 3 +.ob_cntrl dc 0 ;for player 0,1=joyport +.ob_rndfire dc 0 ;guess what! +.ob_damage dc 0 +.ob_hitpoints dc 1 +.ob_rndturn dc $400 +.ob_think dc 0 diff --git a/gloom2 b/gloom2 new file mode 100644 index 0000000..09775ec Binary files /dev/null and b/gloom2 differ diff --git a/gloom2.s b/gloom2.s new file mode 100644 index 0000000..3496969 --- /dev/null +++ b/gloom2.s @@ -0,0 +1,13628 @@ + + ;********* + ;* 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 diff --git a/gloombrush b/gloombrush new file mode 100644 index 0000000..ee33881 Binary files /dev/null and b/gloombrush differ diff --git a/gloombrush.iff b/gloombrush.iff new file mode 100644 index 0000000..ebcc41b Binary files /dev/null and b/gloombrush.iff differ diff --git a/gloombrush.iff.info b/gloombrush.iff.info new file mode 100644 index 0000000..f2c4074 Binary files /dev/null and b/gloombrush.iff.info differ diff --git a/gloombrush.pal b/gloombrush.pal new file mode 100644 index 0000000..1487ce6 Binary files /dev/null and b/gloombrush.pal differ diff --git a/gloomcfg b/gloomcfg new file mode 100644 index 0000000..adde25c --- /dev/null +++ b/gloomcfg @@ -0,0 +1 @@ +E blackmagic_1 diff --git a/gloomcfg.bak b/gloomcfg.bak new file mode 100644 index 0000000..2e2d8eb --- /dev/null +++ b/gloomcfg.bak @@ -0,0 +1 @@ +C c2p/blackmagic_c2p_1 diff --git a/gloomcfg.info b/gloomcfg.info new file mode 100644 index 0000000..6baf883 Binary files /dev/null and b/gloomcfg.info differ diff --git a/gloomgame b/gloomgame new file mode 100644 index 0000000..99f3d72 Binary files /dev/null and b/gloomgame differ diff --git a/gothic b/gothic new file mode 100644 index 0000000..60474f0 Binary files /dev/null and b/gothic differ diff --git a/gothic.iff b/gothic.iff new file mode 100644 index 0000000..06115f3 Binary files /dev/null and b/gothic.iff differ diff --git a/gothic_ehb.iff b/gothic_ehb.iff new file mode 100644 index 0000000..c295877 Binary files /dev/null and b/gothic_ehb.iff differ diff --git a/gridoffs.bin b/gridoffs.bin new file mode 100644 index 0000000..42dd5d5 Binary files /dev/null and b/gridoffs.bin differ diff --git a/gridoffs3.bin b/gridoffs3.bin new file mode 100644 index 0000000..6ba7842 Binary files /dev/null and b/gridoffs3.bin differ diff --git a/gridoffs4.bin b/gridoffs4.bin new file mode 100644 index 0000000..8fac949 Binary files /dev/null and b/gridoffs4.bin differ diff --git a/ground.bin b/ground.bin new file mode 100644 index 0000000..71aba24 Binary files /dev/null and b/ground.bin differ diff --git a/ground.iff b/ground.iff new file mode 100644 index 0000000..9e7c7ce Binary files /dev/null and b/ground.iff differ diff --git a/ground.iff.info b/ground.iff.info new file mode 100644 index 0000000..cf0b6c0 Binary files /dev/null and b/ground.iff.info differ diff --git a/ground.s b/ground.s new file mode 100644 index 0000000..350c077 --- /dev/null +++ b/ground.s @@ -0,0 +1,158 @@ +groundcam dc.l 0 + +ground ; + ;A0=128 X 128 bitmap to map onto ground... + ;A1=address of inverse camera matrix + ; + movem.l d2-d7/a2-a6,-(a7) + ; + lea 10(a0),a0 + ; + move hite(pc),d7 + mulu copline(pc),d7 + add.l copx0(pc),d7 + move.l d7,a2 + ; + moveq #0,d6 + sub camy(pc),d6 + ext.l d6 + lsl.l #focshft,d6 + move.l d6,groundcam + ; + move maxy(pc),d7 + subq #1,d7 +ground_vloop ; + ;find Z on this scanline... + ; + move.l groundcam(pc),d6 + divs d7,d6 ;d6.w = Z + ; + move.l pal(pc),a5 + move d6,d5 + lsr #darkshft,d5 + cmp #16,d5 + bcs.s ground_ok + ; + ;OK, out of Z's...fill in with dark colour 0 QUICKLY! + ; + move.l coplinel(pc),d1 + neg.l d1 + add.l d1,a2 + bsr clstherest + bra ground_abort + ; +ground_ok move.l 0(a5,d5*4),a5 ;palette! + ; + ;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 (a1),d0 + add.l d0,d0 + muls 2(a1),d3 + add.l d3,d3 + add.l d3,d0 + ; + muls 4(a1),d2 + add.l d2,d2 + muls 6(a1),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 (a1),d4 + add.l d4,d4 + muls 2(a1),d3 + add.l d3,d3 + add.l d3,d4 + ; + muls 4(a1),d2 + add.l d2,d2 + muls 6(a1),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 + add.l camx(pc),d0 + add.l camz(pc),d1 + ; + ;d0,d1.q=x,z + ;d4,d6.q=xadd,zadd + ; + swap d0 + swap d1 + swap d4 + swap d6 + ; + move d7,-(a7) + moveq #127,d7 + moveq #0,d2 + moveq #0,d3 + ; + sub copline(pc),a2 + move.l a2,a3 + ; + move wdiv32(pc),-(a7) + ; +ground_hloop2 moveq #31,d5 + ; +ground_hloop tst (a3) + ; +ground_br bne.s ground_skip + ; + and d7,d0 + and d7,d1 ;X/Z for fetch! + move d0,d2 + ext.l d2 + lsl.l #7,d2 + lea 0(a0,d2.l),a6 + move.b 0(a6,d1),d3 + move 0(a5,d3*2),(a3) + ; +ground_skip add.l d4,d0 + addx d2,d0 + add.l d6,d1 + addx d2,d1 + addq #4,a3 + dbf d5,ground_hloop + ; + addq #4,a3 + subq #1,(a7) + bgt.s ground_hloop2 + bne.s .kl + move wrem32(pc),d5 + bpl.s ground_hloop + ; +.kl move.l (a7)+,d7 + dbf d7,ground_vloop + ; +ground_abort movem.l (a7)+,d2-d7/a2-a6 + rts + diff --git a/hdinstall.bb2 b/hdinstall.bb2 new file mode 100644 index 0000000..25bc3b4 Binary files /dev/null and b/hdinstall.bb2 differ diff --git a/hdinstall.bb2.bak b/hdinstall.bb2.bak new file mode 100644 index 0000000..b0a0ae6 Binary files /dev/null and b/hdinstall.bb2.bak differ diff --git a/hdinstall.bb2.info b/hdinstall.bb2.info new file mode 100644 index 0000000..6baf883 Binary files /dev/null and b/hdinstall.bb2.info differ diff --git a/hdinstall.bb2.xtra b/hdinstall.bb2.xtra new file mode 100644 index 0000000..43e2492 Binary files /dev/null and b/hdinstall.bb2.xtra differ diff --git a/head.info b/head.info new file mode 100644 index 0000000..ce4b8c3 Binary files /dev/null and b/head.info differ diff --git a/health.bin b/health.bin new file mode 100644 index 0000000..d841f00 Binary files /dev/null and b/health.bin differ diff --git a/health.iff b/health.iff new file mode 100644 index 0000000..4f59712 Binary files /dev/null and b/health.iff differ diff --git a/health.iff.info b/health.iff.info new file mode 100644 index 0000000..22aff80 Binary files /dev/null and b/health.iff.info differ diff --git a/hell b/hell new file mode 100644 index 0000000..68be575 Binary files /dev/null and b/hell differ diff --git a/hell.iff b/hell.iff new file mode 100644 index 0000000..cc990d3 Binary files /dev/null and b/hell.iff differ diff --git a/hell_ehb.iff b/hell_ehb.iff new file mode 100644 index 0000000..6226bf3 Binary files /dev/null and b/hell_ehb.iff differ diff --git a/hellpic b/hellpic new file mode 100644 index 0000000..26df855 Binary files /dev/null and b/hellpic differ diff --git a/hellpic.info b/hellpic.info new file mode 100644 index 0000000..6a2dce0 Binary files /dev/null and b/hellpic.info differ diff --git a/help.bb2 b/help.bb2 new file mode 100644 index 0000000..8716001 Binary files /dev/null and b/help.bb2 differ diff --git a/help.bb2.bak b/help.bb2.bak new file mode 100644 index 0000000..14a0a86 Binary files /dev/null and b/help.bb2.bak differ diff --git a/help.bb2.info b/help.bb2.info new file mode 100644 index 0000000..6baf883 Binary files /dev/null and b/help.bb2.info differ diff --git a/help.bb2.xtra b/help.bb2.xtra new file mode 100644 index 0000000..4a1d1bb Binary files /dev/null and b/help.bb2.xtra differ diff --git a/hulk_ehb.iff b/hulk_ehb.iff new file mode 100644 index 0000000..f61cf1a Binary files /dev/null and b/hulk_ehb.iff differ diff --git a/iff.s b/iff.s new file mode 100644 index 0000000..47434c4 --- /dev/null +++ b/iff.s @@ -0,0 +1,48 @@ +decodeiff40 ;for 40 columns... + ; + moveq #40,d7 + jmp decodeiff3 + ; +decodeiff ;a0=trimmed IFF file,a1=dest bitmap + ; + moveq #80,d7 +decodeiff3 ; + move (a0)+,d0 ;pixel width + lsr #3,d0 ;to byte width + move (a0)+,d1 ;pixel height + cmp #200,d1 + bcs.s .hok + move #199,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 + ; +.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 + jmp .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 d7,a1 + dbf d5,.loop4 + dbf d1,.loop5 + rts + diff --git a/info.bb2 b/info.bb2 new file mode 100644 index 0000000..e803523 Binary files /dev/null and b/info.bb2 differ diff --git a/info.bb2.info b/info.bb2.info new file mode 100644 index 0000000..6baf883 Binary files /dev/null and b/info.bb2.info differ diff --git a/info.bb2.xtra b/info.bb2.xtra new file mode 100644 index 0000000..4a1d1bb Binary files /dev/null and b/info.bb2.xtra differ diff --git a/insdisk.iff b/insdisk.iff new file mode 100644 index 0000000..b443627 Binary files /dev/null and b/insdisk.iff differ diff --git a/insdisk.iff.info b/insdisk.iff.info new file mode 100644 index 0000000..98b2435 Binary files /dev/null and b/insdisk.iff.info differ diff --git a/intui.bb2 b/intui.bb2 new file mode 100644 index 0000000..fe7aa3a Binary files /dev/null and b/intui.bb2 differ diff --git a/intui.bb2.bak b/intui.bb2.bak new file mode 100644 index 0000000..9b572be Binary files /dev/null and b/intui.bb2.bak differ diff --git a/intui.bb2.info b/intui.bb2.info new file mode 100644 index 0000000..6baf883 Binary files /dev/null and b/intui.bb2.info differ diff --git a/intui.bb2.xtra b/intui.bb2.xtra new file mode 100644 index 0000000..4a1d1bb Binary files /dev/null and b/intui.bb2.xtra differ diff --git a/it b/it new file mode 100644 index 0000000..424e2ac Binary files /dev/null and b/it differ diff --git a/it.bb2 b/it.bb2 new file mode 100644 index 0000000..f3d9f20 Binary files /dev/null and b/it.bb2 differ diff --git a/it.bb2.bak b/it.bb2.bak new file mode 100644 index 0000000..9a1aa25 Binary files /dev/null and b/it.bb2.bak differ diff --git a/it.bb2.info b/it.bb2.info new file mode 100644 index 0000000..6baf883 Binary files /dev/null and b/it.bb2.info differ diff --git a/it.bb2.xtra b/it.bb2.xtra new file mode 100644 index 0000000..4a1d1bb Binary files /dev/null and b/it.bb2.xtra differ diff --git a/it.info b/it.info new file mode 100644 index 0000000..433877c Binary files /dev/null and b/it.info differ diff --git a/it.s b/it.s new file mode 100644 index 0000000..f5396ff --- /dev/null +++ b/it.s @@ -0,0 +1,26 @@ + ;intuition routines for Gloom + ; + +initintui move.l 4.w,a6 + lea intname(pc),a1 + jsr -408(a6) + move.l d0,int + rts + +int dc.l 0 + +initdisplay + move.l int(pc),a6 + + + +newscreen dc 0,0 ;x,y + dc 320,240 ;w,h + dc 6 ;d + dc.b 0,0 ;pens + dc 0 ;viewmode + dc 0 ;type ($40=ehb?) + dc.l 0 ;font + dc.l 0 ;title + dc.l 0 ;gadgets + dc.l 0 ;bitmap diff --git a/joy.s b/joy.s new file mode 100644 index 0000000..d0a6cb7 --- /dev/null +++ b/joy.s @@ -0,0 +1,30 @@ + move $dff00c,d2 ;joy0 + bsr readjoydir + movem d0-d1,(a0) + ; + lea $bfe001,a2 + lea $dff016,a1 + ; + moveq #7,d3 + move #$4000,d4 + bset d3,$200(a2) + bclr d3,(a2) + move #$2000,$dff034 + moveq #6,d1 +.loop tst.b (a2) + tst.b (a2) + tst.b (a2) + tst.b (a2) + tst.b (a2) + tst.b (a2) + tst.b (a2) + tst.b (a2) + move (a1),d2 + bset d3,(a2) + bclr d3,(a2) + and d4,d2 + bne.s .skip + bset d1,d0 +.skip dbf d1,.loop + move #$3000,$dff034 ;#0 + bclr d3,$200(a2) diff --git a/key.bb2 b/key.bb2 new file mode 100644 index 0000000..aefca12 Binary files /dev/null and b/key.bb2 differ diff --git a/key.bb2.bak b/key.bb2.bak new file mode 100644 index 0000000..148e79f Binary files /dev/null and b/key.bb2.bak differ diff --git a/key.bb2.info b/key.bb2.info new file mode 100644 index 0000000..6baf883 Binary files /dev/null and b/key.bb2.info differ diff --git a/key.bb2.xtra b/key.bb2.xtra new file mode 100644 index 0000000..66e166a Binary files /dev/null and b/key.bb2.xtra differ diff --git a/ktest.bb2 b/ktest.bb2 new file mode 100644 index 0000000..db2f3f5 Binary files /dev/null and b/ktest.bb2 differ diff --git a/ktest.bb2.bak b/ktest.bb2.bak new file mode 100644 index 0000000..939e0e7 Binary files /dev/null and b/ktest.bb2.bak differ diff --git a/ktest.bb2.info b/ktest.bb2.info new file mode 100644 index 0000000..6baf883 Binary files /dev/null and b/ktest.bb2.info differ diff --git a/ktest.bb2.xtra b/ktest.bb2.xtra new file mode 100644 index 0000000..4a1d1bb Binary files /dev/null and b/ktest.bb2.xtra differ diff --git a/line.bb2 b/line.bb2 new file mode 100644 index 0000000..65d5443 Binary files /dev/null and b/line.bb2 differ diff --git a/line.bb2.bak b/line.bb2.bak new file mode 100644 index 0000000..bf6c311 Binary files /dev/null and b/line.bb2.bak differ diff --git a/line.bb2.info b/line.bb2.info new file mode 100644 index 0000000..6baf883 Binary files /dev/null and b/line.bb2.info differ diff --git a/line.bb2.old b/line.bb2.old new file mode 100644 index 0000000..a381e00 Binary files /dev/null and b/line.bb2.old differ diff --git a/line.bb2.xtra b/line.bb2.xtra new file mode 100644 index 0000000..4a1d1bb Binary files /dev/null and b/line.bb2.xtra differ diff --git a/littlefont.iff b/littlefont.iff new file mode 100644 index 0000000..6b5f5ae Binary files /dev/null and b/littlefont.iff differ diff --git a/littlefont.iff.info b/littlefont.iff.info new file mode 100644 index 0000000..1524e09 Binary files /dev/null and b/littlefont.iff.info differ diff --git a/lives.iff b/lives.iff new file mode 100644 index 0000000..5f92f2b Binary files /dev/null and b/lives.iff differ diff --git a/lives.iff.info b/lives.iff.info new file mode 100644 index 0000000..22aff80 Binary files /dev/null and b/lives.iff.info differ diff --git a/lizard b/lizard new file mode 100644 index 0000000..5925dab Binary files /dev/null and b/lizard differ diff --git a/lizard.chunks b/lizard.chunks new file mode 100644 index 0000000..8669169 Binary files /dev/null and b/lizard.chunks differ diff --git a/lizard.chunks.info b/lizard.chunks.info new file mode 100644 index 0000000..5826af1 Binary files /dev/null and b/lizard.chunks.info differ diff --git a/lizard.info b/lizard.info new file mode 100644 index 0000000..ce4b8c3 Binary files /dev/null and b/lizard.info differ diff --git a/lizard.wav b/lizard.wav new file mode 100644 index 0000000..5f20e46 Binary files /dev/null and b/lizard.wav differ diff --git a/lizhit.wav b/lizhit.wav new file mode 100644 index 0000000..4335d60 Binary files /dev/null and b/lizhit.wav differ diff --git a/loader b/loader new file mode 100644 index 0000000..4104aa0 Binary files /dev/null and b/loader differ diff --git a/lores.bb2 b/lores.bb2 new file mode 100644 index 0000000..8fc5a73 Binary files /dev/null and b/lores.bb2 differ diff --git a/lores.bb2.bak b/lores.bb2.bak new file mode 100644 index 0000000..019326d Binary files /dev/null and b/lores.bb2.bak differ diff --git a/lores.bb2.info b/lores.bb2.info new file mode 100644 index 0000000..6baf883 Binary files /dev/null and b/lores.bb2.info differ diff --git a/lores.bb2.xtra b/lores.bb2.xtra new file mode 100644 index 0000000..46cf7ff Binary files /dev/null and b/lores.bb2.xtra differ diff --git a/ltest.bb2 b/ltest.bb2 new file mode 100644 index 0000000..505eca2 Binary files /dev/null and b/ltest.bb2 differ diff --git a/ltest.bb2.bak b/ltest.bb2.bak new file mode 100644 index 0000000..0d9e6cc Binary files /dev/null and b/ltest.bb2.bak differ diff --git a/ltest.bb2.info b/ltest.bb2.info new file mode 100644 index 0000000..6baf883 Binary files /dev/null and b/ltest.bb2.info differ diff --git a/ltest.bb2.xtra b/ltest.bb2.xtra new file mode 100644 index 0000000..4a1d1bb Binary files /dev/null and b/ltest.bb2.xtra differ diff --git a/makeanim b/makeanim new file mode 100644 index 0000000..bf518ff Binary files /dev/null and b/makeanim differ diff --git a/makeanim.bb2 b/makeanim.bb2 new file mode 100644 index 0000000..b5ae26a Binary files /dev/null and b/makeanim.bb2 differ diff --git a/makeanim.bb2.bak b/makeanim.bb2.bak new file mode 100644 index 0000000..93bdcb0 Binary files /dev/null and b/makeanim.bb2.bak differ diff --git a/makeanim.bb2.info b/makeanim.bb2.info new file mode 100644 index 0000000..6baf883 Binary files /dev/null and b/makeanim.bb2.info differ diff --git a/makeanim.bb2.xtra b/makeanim.bb2.xtra new file mode 100644 index 0000000..268ab8e Binary files /dev/null and b/makeanim.bb2.xtra differ diff --git a/makeblit b/makeblit new file mode 100644 index 0000000..61715f2 Binary files /dev/null and b/makeblit differ diff --git a/makeblit.bb2 b/makeblit.bb2 new file mode 100644 index 0000000..ab9f595 Binary files /dev/null and b/makeblit.bb2 differ diff --git a/makeblit.bb2.bak b/makeblit.bb2.bak new file mode 100644 index 0000000..2991606 Binary files /dev/null and b/makeblit.bb2.bak differ diff --git a/makeblit.bb2.info b/makeblit.bb2.info new file mode 100644 index 0000000..6baf883 Binary files /dev/null and b/makeblit.bb2.info differ diff --git a/makeblit.bb2.xtra b/makeblit.bb2.xtra new file mode 100644 index 0000000..0d39944 Binary files /dev/null and b/makeblit.bb2.xtra differ diff --git a/makeblit2 b/makeblit2 new file mode 100644 index 0000000..d0cf090 Binary files /dev/null and b/makeblit2 differ diff --git a/makeblit2.bb2 b/makeblit2.bb2 new file mode 100644 index 0000000..058bb94 Binary files /dev/null and b/makeblit2.bb2 differ diff --git a/makeblit2.bb2.bak b/makeblit2.bb2.bak new file mode 100644 index 0000000..058bb94 Binary files /dev/null and b/makeblit2.bb2.bak differ diff --git a/makeblit2.bb2.info b/makeblit2.bb2.info new file mode 100644 index 0000000..6baf883 Binary files /dev/null and b/makeblit2.bb2.info differ diff --git a/makeblit2.bb2.xtra b/makeblit2.bb2.xtra new file mode 100644 index 0000000..d870412 Binary files /dev/null and b/makeblit2.bb2.xtra differ diff --git a/makecamrots.bb2 b/makecamrots.bb2 new file mode 100644 index 0000000..b2e7c29 Binary files /dev/null and b/makecamrots.bb2 differ diff --git a/makecamrots.bb2.bak b/makecamrots.bb2.bak new file mode 100644 index 0000000..4b2f127 Binary files /dev/null and b/makecamrots.bb2.bak differ diff --git a/makecamrots.bb2.info b/makecamrots.bb2.info new file mode 100644 index 0000000..6baf883 Binary files /dev/null and b/makecamrots.bb2.info differ diff --git a/makecamrots.bb2.xtra b/makecamrots.bb2.xtra new file mode 100644 index 0000000..46cf7ff Binary files /dev/null and b/makecamrots.bb2.xtra differ diff --git a/makecamrots2.bb2 b/makecamrots2.bb2 new file mode 100644 index 0000000..b2c866a Binary files /dev/null and b/makecamrots2.bb2 differ diff --git a/makecamrots2.bb2.bak b/makecamrots2.bb2.bak new file mode 100644 index 0000000..b71ff36 Binary files /dev/null and b/makecamrots2.bb2.bak differ diff --git a/makecamrots2.bb2.info b/makecamrots2.bb2.info new file mode 100644 index 0000000..6baf883 Binary files /dev/null and b/makecamrots2.bb2.info differ diff --git a/makecamrots2.bb2.xtra b/makecamrots2.bb2.xtra new file mode 100644 index 0000000..46cf7ff Binary files /dev/null and b/makecamrots2.bb2.xtra differ diff --git a/makechat.bb2 b/makechat.bb2 new file mode 100644 index 0000000..7c9fc67 Binary files /dev/null and b/makechat.bb2 differ diff --git a/makechat.bb2.bak b/makechat.bb2.bak new file mode 100644 index 0000000..06cc7f0 Binary files /dev/null and b/makechat.bb2.bak differ diff --git a/makechat.bb2.info b/makechat.bb2.info new file mode 100644 index 0000000..6baf883 Binary files /dev/null and b/makechat.bb2.info differ diff --git a/makechat.bb2.xtra b/makechat.bb2.xtra new file mode 100644 index 0000000..4a1d1bb Binary files /dev/null and b/makechat.bb2.xtra differ diff --git a/makechunky b/makechunky new file mode 100644 index 0000000..fd22766 Binary files /dev/null and b/makechunky differ diff --git a/makechunky.bb2 b/makechunky.bb2 new file mode 100644 index 0000000..461a988 Binary files /dev/null and b/makechunky.bb2 differ diff --git a/makechunky.bb2.bak b/makechunky.bb2.bak new file mode 100644 index 0000000..c9a812f Binary files /dev/null and b/makechunky.bb2.bak differ diff --git a/makechunky.bb2.info b/makechunky.bb2.info new file mode 100644 index 0000000..6baf883 Binary files /dev/null and b/makechunky.bb2.info differ diff --git a/makechunky.bb2.xtra b/makechunky.bb2.xtra new file mode 100644 index 0000000..9b416b8 Binary files /dev/null and b/makechunky.bb2.xtra differ diff --git a/makeflat b/makeflat new file mode 100644 index 0000000..1bb2642 Binary files /dev/null and b/makeflat differ diff --git a/makeflat.bb2 b/makeflat.bb2 new file mode 100644 index 0000000..818727b Binary files /dev/null and b/makeflat.bb2 differ diff --git a/makeflat.bb2.bak b/makeflat.bb2.bak new file mode 100644 index 0000000..5dbb089 Binary files /dev/null and b/makeflat.bb2.bak differ diff --git a/makeflat.bb2.info b/makeflat.bb2.info new file mode 100644 index 0000000..6baf883 Binary files /dev/null and b/makeflat.bb2.info differ diff --git a/makeflat.bb2.xtra b/makeflat.bb2.xtra new file mode 100644 index 0000000..0bb9e1f Binary files /dev/null and b/makeflat.bb2.xtra differ diff --git a/makefont.bb2 b/makefont.bb2 new file mode 100644 index 0000000..720032e Binary files /dev/null and b/makefont.bb2 differ diff --git a/makefont.bb2.bak b/makefont.bb2.bak new file mode 100644 index 0000000..720032e Binary files /dev/null and b/makefont.bb2.bak differ diff --git a/makefont.bb2.info b/makefont.bb2.info new file mode 100644 index 0000000..6baf883 Binary files /dev/null and b/makefont.bb2.info differ diff --git a/makefont.bb2.xtra b/makefont.bb2.xtra new file mode 100644 index 0000000..4a1d1bb Binary files /dev/null and b/makefont.bb2.xtra differ diff --git a/makegridoffs.bb2 b/makegridoffs.bb2 new file mode 100644 index 0000000..c6890a7 Binary files /dev/null and b/makegridoffs.bb2 differ diff --git a/makegridoffs.bb2.bak b/makegridoffs.bb2.bak new file mode 100644 index 0000000..b0a64da Binary files /dev/null and b/makegridoffs.bb2.bak differ diff --git a/makegridoffs.bb2.info b/makegridoffs.bb2.info new file mode 100644 index 0000000..6baf883 Binary files /dev/null and b/makegridoffs.bb2.info differ diff --git a/makegridoffs.bb2.old b/makegridoffs.bb2.old new file mode 100644 index 0000000..3948af1 Binary files /dev/null and b/makegridoffs.bb2.old differ diff --git a/makegridoffs.bb2.xtra b/makegridoffs.bb2.xtra new file mode 100644 index 0000000..4a1d1bb Binary files /dev/null and b/makegridoffs.bb2.xtra differ diff --git a/maker.bb2.bak b/maker.bb2.bak new file mode 100644 index 0000000..0aac45c Binary files /dev/null and b/maker.bb2.bak differ diff --git a/maker.bb2.info b/maker.bb2.info new file mode 100644 index 0000000..6baf883 Binary files /dev/null and b/maker.bb2.info differ diff --git a/maker.bb2.xtra b/maker.bb2.xtra new file mode 100644 index 0000000..4a1d1bb Binary files /dev/null and b/maker.bb2.xtra differ diff --git a/maker128.bb2 b/maker128.bb2 new file mode 100644 index 0000000..3724dc8 Binary files /dev/null and b/maker128.bb2 differ diff --git a/maker128.bb2.info b/maker128.bb2.info new file mode 100644 index 0000000..6baf883 Binary files /dev/null and b/maker128.bb2.info differ diff --git a/maker128.bb2.xtra b/maker128.bb2.xtra new file mode 100644 index 0000000..4a1d1bb Binary files /dev/null and b/maker128.bb2.xtra differ diff --git a/maker64.bb2 b/maker64.bb2 new file mode 100644 index 0000000..be9a55a Binary files /dev/null and b/maker64.bb2 differ diff --git a/maker64.bb2.info b/maker64.bb2.info new file mode 100644 index 0000000..6baf883 Binary files /dev/null and b/maker64.bb2.info differ diff --git a/maker64.bb2.xtra b/maker64.bb2.xtra new file mode 100644 index 0000000..4a1d1bb Binary files /dev/null and b/maker64.bb2.xtra differ diff --git a/makergb.bb2 b/makergb.bb2 new file mode 100644 index 0000000..72c6244 Binary files /dev/null and b/makergb.bb2 differ diff --git a/makergb.bb2.bak b/makergb.bb2.bak new file mode 100644 index 0000000..44c33ab Binary files /dev/null and b/makergb.bb2.bak differ diff --git a/makergb.bb2.info b/makergb.bb2.info new file mode 100644 index 0000000..6baf883 Binary files /dev/null and b/makergb.bb2.info differ diff --git a/makergb.bb2.xtra b/makergb.bb2.xtra new file mode 100644 index 0000000..77d6262 Binary files /dev/null and b/makergb.bb2.xtra differ diff --git a/makesqr.bb2 b/makesqr.bb2 new file mode 100644 index 0000000..def5e06 Binary files /dev/null and b/makesqr.bb2 differ diff --git a/makesqr.bb2.bak b/makesqr.bb2.bak new file mode 100644 index 0000000..ccc766a Binary files /dev/null and b/makesqr.bb2.bak differ diff --git a/makesqr.bb2.info b/makesqr.bb2.info new file mode 100644 index 0000000..6baf883 Binary files /dev/null and b/makesqr.bb2.info differ diff --git a/makesqr.bb2.xtra b/makesqr.bb2.xtra new file mode 100644 index 0000000..4a1d1bb Binary files /dev/null and b/makesqr.bb2.xtra differ diff --git a/man.anim.info b/man.anim.info new file mode 100644 index 0000000..7a16e55 Binary files /dev/null and b/man.anim.info differ diff --git a/man.bin b/man.bin new file mode 100644 index 0000000..9049efd Binary files /dev/null and b/man.bin differ diff --git a/man2.anim.info b/man2.anim.info new file mode 100644 index 0000000..82166eb Binary files /dev/null and b/man2.anim.info differ diff --git a/map.bin b/map.bin new file mode 100644 index 0000000..5c5b3c9 Binary files /dev/null and b/map.bin differ diff --git a/map1_1 b/map1_1 new file mode 100644 index 0000000..7bd4199 Binary files /dev/null and b/map1_1 differ diff --git a/map3_6 b/map3_6 new file mode 100644 index 0000000..16366b4 Binary files /dev/null and b/map3_6 differ diff --git a/map3_7 b/map3_7 new file mode 100644 index 0000000..46d4f74 Binary files /dev/null and b/map3_7 differ diff --git a/maped b/maped new file mode 100644 index 0000000..934327e Binary files /dev/null and b/maped differ diff --git a/maped.bb2 b/maped.bb2 new file mode 100644 index 0000000..d06c4bc Binary files /dev/null and b/maped.bb2 differ diff --git a/maped.bb2.bak b/maped.bb2.bak new file mode 100644 index 0000000..6c354d0 Binary files /dev/null and b/maped.bb2.bak differ diff --git a/maped.bb2.info b/maped.bb2.info new file mode 100644 index 0000000..6baf883 Binary files /dev/null and b/maped.bb2.info differ diff --git a/maped.bb2.old b/maped.bb2.old new file mode 100644 index 0000000..018f345 Binary files /dev/null and b/maped.bb2.old differ diff --git a/maped.bb2.xtra b/maped.bb2.xtra new file mode 100644 index 0000000..abc50ef Binary files /dev/null and b/maped.bb2.xtra differ diff --git a/maped.info b/maped.info new file mode 100644 index 0000000..433877c Binary files /dev/null and b/maped.info differ diff --git a/maped2.bb2 b/maped2.bb2 new file mode 100644 index 0000000..700c511 Binary files /dev/null and b/maped2.bb2 differ diff --git a/maped2.bb2.bak b/maped2.bb2.bak new file mode 100644 index 0000000..f956875 Binary files /dev/null and b/maped2.bb2.bak differ diff --git a/maped2.bb2.info b/maped2.bb2.info new file mode 100644 index 0000000..6baf883 Binary files /dev/null and b/maped2.bb2.info differ diff --git a/maped2.bb2.xtra b/maped2.bb2.xtra new file mode 100644 index 0000000..0c4d265 Binary files /dev/null and b/maped2.bb2.xtra differ diff --git a/maps/com1_1 b/maps/com1_1 new file mode 100644 index 0000000..9adaafe Binary files /dev/null and b/maps/com1_1 differ diff --git a/maps/com1_2 b/maps/com1_2 new file mode 100644 index 0000000..00b6b5d Binary files /dev/null and b/maps/com1_2 differ diff --git a/maps/com1_3 b/maps/com1_3 new file mode 100644 index 0000000..799f8a8 Binary files /dev/null and b/maps/com1_3 differ diff --git a/maps/com1_4 b/maps/com1_4 new file mode 100644 index 0000000..3591b7b Binary files /dev/null and b/maps/com1_4 differ diff --git a/maps/com1_5 b/maps/com1_5 new file mode 100644 index 0000000..f96850f Binary files /dev/null and b/maps/com1_5 differ diff --git a/maps/com1_6 b/maps/com1_6 new file mode 100644 index 0000000..22b3615 Binary files /dev/null and b/maps/com1_6 differ diff --git a/maps/com1_7 b/maps/com1_7 new file mode 100644 index 0000000..77e2e00 Binary files /dev/null and b/maps/com1_7 differ diff --git a/maps/com2_1 b/maps/com2_1 new file mode 100644 index 0000000..7965e56 Binary files /dev/null and b/maps/com2_1 differ diff --git a/maps/com2_2 b/maps/com2_2 new file mode 100644 index 0000000..a5622cb Binary files /dev/null and b/maps/com2_2 differ diff --git a/maps/com2_3 b/maps/com2_3 new file mode 100644 index 0000000..cc0acd3 Binary files /dev/null and b/maps/com2_3 differ diff --git a/maps/com2_4 b/maps/com2_4 new file mode 100644 index 0000000..f9033a5 Binary files /dev/null and b/maps/com2_4 differ diff --git a/maps/com2_5 b/maps/com2_5 new file mode 100644 index 0000000..7791ae6 Binary files /dev/null and b/maps/com2_5 differ diff --git a/maps/com2_6 b/maps/com2_6 new file mode 100644 index 0000000..2fecf73 Binary files /dev/null and b/maps/com2_6 differ diff --git a/maps/com2_7 b/maps/com2_7 new file mode 100644 index 0000000..f76b30c Binary files /dev/null and b/maps/com2_7 differ diff --git a/maps/com3_1 b/maps/com3_1 new file mode 100644 index 0000000..1f3d6d6 Binary files /dev/null and b/maps/com3_1 differ diff --git a/maps/com3_2 b/maps/com3_2 new file mode 100644 index 0000000..df7a1e2 Binary files /dev/null and b/maps/com3_2 differ diff --git a/maps/com3_3 b/maps/com3_3 new file mode 100644 index 0000000..640af97 Binary files /dev/null and b/maps/com3_3 differ diff --git a/maps/com3_4 b/maps/com3_4 new file mode 100644 index 0000000..c8ba477 Binary files /dev/null and b/maps/com3_4 differ diff --git a/maps/com3_5 b/maps/com3_5 new file mode 100644 index 0000000..52bd539 Binary files /dev/null and b/maps/com3_5 differ diff --git a/maps/com3_6 b/maps/com3_6 new file mode 100644 index 0000000..e5ae252 Binary files /dev/null and b/maps/com3_6 differ diff --git a/maps/com3_7 b/maps/com3_7 new file mode 100644 index 0000000..232bd6c Binary files /dev/null and b/maps/com3_7 differ diff --git a/maps/map1_1 b/maps/map1_1 new file mode 100644 index 0000000..20e59ab Binary files /dev/null and b/maps/map1_1 differ diff --git a/maps/map1_2 b/maps/map1_2 new file mode 100644 index 0000000..56db131 Binary files /dev/null and b/maps/map1_2 differ diff --git a/maps/map1_3 b/maps/map1_3 new file mode 100644 index 0000000..373e159 Binary files /dev/null and b/maps/map1_3 differ diff --git a/maps/map1_4 b/maps/map1_4 new file mode 100644 index 0000000..d449447 Binary files /dev/null and b/maps/map1_4 differ diff --git a/maps/map1_5 b/maps/map1_5 new file mode 100644 index 0000000..c3e5edf Binary files /dev/null and b/maps/map1_5 differ diff --git a/maps/map1_6 b/maps/map1_6 new file mode 100644 index 0000000..5a974bd Binary files /dev/null and b/maps/map1_6 differ diff --git a/maps/map1_7 b/maps/map1_7 new file mode 100644 index 0000000..1d01dcd Binary files /dev/null and b/maps/map1_7 differ diff --git a/maps/map3_1 b/maps/map3_1 new file mode 100644 index 0000000..84a7eff Binary files /dev/null and b/maps/map3_1 differ diff --git a/maps/map3_2 b/maps/map3_2 new file mode 100644 index 0000000..dce4e59 Binary files /dev/null and b/maps/map3_2 differ diff --git a/maps/map3_3 b/maps/map3_3 new file mode 100644 index 0000000..4c92dfb Binary files /dev/null and b/maps/map3_3 differ diff --git a/maps/map3_4 b/maps/map3_4 new file mode 100644 index 0000000..5ca9f9f Binary files /dev/null and b/maps/map3_4 differ diff --git a/maps/map3_5 b/maps/map3_5 new file mode 100644 index 0000000..ccd60ca Binary files /dev/null and b/maps/map3_5 differ diff --git a/maps/map3_6 b/maps/map3_6 new file mode 100644 index 0000000..5025b69 Binary files /dev/null and b/maps/map3_6 differ diff --git a/maps/map3_7 b/maps/map3_7 new file mode 100644 index 0000000..6d13879 Binary files /dev/null and b/maps/map3_7 differ diff --git a/maps/map4_1 b/maps/map4_1 new file mode 100644 index 0000000..6853b0a Binary files /dev/null and b/maps/map4_1 differ diff --git a/maps/map4_2 b/maps/map4_2 new file mode 100644 index 0000000..eb0c707 Binary files /dev/null and b/maps/map4_2 differ diff --git a/maps/map4_3 b/maps/map4_3 new file mode 100644 index 0000000..0701d94 Binary files /dev/null and b/maps/map4_3 differ diff --git a/maps/map4_4 b/maps/map4_4 new file mode 100644 index 0000000..8f91209 Binary files /dev/null and b/maps/map4_4 differ diff --git a/maps/map4_5 b/maps/map4_5 new file mode 100644 index 0000000..86cf0ee Binary files /dev/null and b/maps/map4_5 differ diff --git a/maps/map4_6 b/maps/map4_6 new file mode 100644 index 0000000..3774856 Binary files /dev/null and b/maps/map4_6 differ diff --git a/maps/map4_7 b/maps/map4_7 new file mode 100644 index 0000000..4834e52 Binary files /dev/null and b/maps/map4_7 differ diff --git a/maps2/map0_1 b/maps2/map0_1 new file mode 100644 index 0000000..171584d Binary files /dev/null and b/maps2/map0_1 differ diff --git a/maps2/map1_1 b/maps2/map1_1 new file mode 100644 index 0000000..2cdbd3e Binary files /dev/null and b/maps2/map1_1 differ diff --git a/maps2/map1_2 b/maps2/map1_2 new file mode 100644 index 0000000..081dd45 Binary files /dev/null and b/maps2/map1_2 differ diff --git a/maps2/map1_3 b/maps2/map1_3 new file mode 100644 index 0000000..c78b8f4 Binary files /dev/null and b/maps2/map1_3 differ diff --git a/maps2/map1_4 b/maps2/map1_4 new file mode 100644 index 0000000..af7c799 Binary files /dev/null and b/maps2/map1_4 differ diff --git a/maps2/map1_5 b/maps2/map1_5 new file mode 100644 index 0000000..c5f112f Binary files /dev/null and b/maps2/map1_5 differ diff --git a/maps2/map1_6 b/maps2/map1_6 new file mode 100644 index 0000000..5509506 Binary files /dev/null and b/maps2/map1_6 differ diff --git a/maps2/map1_7 b/maps2/map1_7 new file mode 100644 index 0000000..693ff01 Binary files /dev/null and b/maps2/map1_7 differ diff --git a/maps2/map1_8 b/maps2/map1_8 new file mode 100644 index 0000000..b07f1df Binary files /dev/null and b/maps2/map1_8 differ diff --git a/maps2/map3_1 b/maps2/map3_1 new file mode 100644 index 0000000..5d32c32 Binary files /dev/null and b/maps2/map3_1 differ diff --git a/maps2/map3_2 b/maps2/map3_2 new file mode 100644 index 0000000..54bf1e0 Binary files /dev/null and b/maps2/map3_2 differ diff --git a/maps2/map3_3 b/maps2/map3_3 new file mode 100644 index 0000000..aa27011 Binary files /dev/null and b/maps2/map3_3 differ diff --git a/maps2/map3_4 b/maps2/map3_4 new file mode 100644 index 0000000..09d1b46 Binary files /dev/null and b/maps2/map3_4 differ diff --git a/maps2/map3_5 b/maps2/map3_5 new file mode 100644 index 0000000..ac2dba6 Binary files /dev/null and b/maps2/map3_5 differ diff --git a/maps2/map3_6 b/maps2/map3_6 new file mode 100644 index 0000000..7b3b485 Binary files /dev/null and b/maps2/map3_6 differ diff --git a/maps2/map3_7 b/maps2/map3_7 new file mode 100644 index 0000000..3dfce34 Binary files /dev/null and b/maps2/map3_7 differ diff --git a/maps2/map3_8 b/maps2/map3_8 new file mode 100644 index 0000000..2888d37 Binary files /dev/null and b/maps2/map3_8 differ diff --git a/maps2/map4_1 b/maps2/map4_1 new file mode 100644 index 0000000..1c150d8 Binary files /dev/null and b/maps2/map4_1 differ diff --git a/marine.anim b/marine.anim new file mode 100644 index 0000000..1a8c5eb Binary files /dev/null and b/marine.anim differ diff --git a/marine.chunks b/marine.chunks new file mode 100644 index 0000000..a57ac83 Binary files /dev/null and b/marine.chunks differ diff --git a/marine.chunks.info b/marine.chunks.info new file mode 100644 index 0000000..28fb23b Binary files /dev/null and b/marine.chunks.info differ diff --git a/med.s b/med.s new file mode 100644 index 0000000..0451616 --- /dev/null +++ b/med.s @@ -0,0 +1,48 @@ +medat dc.l 0 +medplayer incbin medplay + +;zalta_med dc.l theguardianmed +;pattern_med dc.l thepatternmed +guardian_med dc.l theguardianmed + +relocate ;a0=pointer to what to relocate + ; + 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 .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 .loop + ; +.rts rts + +initmed lea medat,a0 + tst.l (a0) + bne .noreloc + ; + move.l #medplayer,(a0) + jsr relocate + ; + move.l medat,a5 + lea chipzero,a0 + jsr (a5) + ;move.l zalta_med,a0 + ;jsr 4(a5) + move.l guardian_med,a0 + jsr 4(a5) + ;move.l pattern_med,a0 + ;jsr 4(a5) + ; +.noreloc rts + diff --git a/medplay b/medplay new file mode 100644 index 0000000..c439c34 Binary files /dev/null and b/medplay differ diff --git a/minbull1 b/minbull1 new file mode 100644 index 0000000..d8e4366 Binary files /dev/null and b/minbull1 differ diff --git a/minbull2 b/minbull2 new file mode 100644 index 0000000..7966a3b Binary files /dev/null and b/minbull2 differ diff --git a/minbull3 b/minbull3 new file mode 100644 index 0000000..6458bd3 Binary files /dev/null and b/minbull3 differ diff --git a/minbull4 b/minbull4 new file mode 100644 index 0000000..62595a9 Binary files /dev/null and b/minbull4 differ diff --git a/minbull5 b/minbull5 new file mode 100644 index 0000000..3599238 Binary files /dev/null and b/minbull5 differ diff --git a/misc/bigfont.bin b/misc/bigfont.bin new file mode 100644 index 0000000..34f03a1 Binary files /dev/null and b/misc/bigfont.bin differ diff --git a/misc/bigfont2.bin b/misc/bigfont2.bin new file mode 100644 index 0000000..8341f8a Binary files /dev/null and b/misc/bigfont2.bin differ diff --git a/misc/palette_6 b/misc/palette_6 new file mode 100644 index 0000000..2a0ec5a Binary files /dev/null and b/misc/palette_6 differ diff --git a/misc/palette_8 b/misc/palette_8 new file mode 100644 index 0000000..8912dfe Binary files /dev/null and b/misc/palette_8 differ diff --git a/misc/remap_6 b/misc/remap_6 new file mode 100644 index 0000000..9173bf7 Binary files /dev/null and b/misc/remap_6 differ diff --git a/misc/remap_8 b/misc/remap_8 new file mode 100644 index 0000000..993a033 Binary files /dev/null and b/misc/remap_8 differ diff --git a/misc/script b/misc/script new file mode 100644 index 0000000..4a1349d --- /dev/null +++ b/misc/script @@ -0,0 +1,176 @@ + +; +;script for gloom game +; + +pict_spacehulk + +tile_1 + +draw_ +show_ +text_simple stuff!\watch out for ambushes though... +wait_ +dark_ +play_map1_1 + +draw_ +show_ +text_stay alert! watch out for aggro skinheads! +wait_ +dark_ +play_map1_2 + +draw_ +show_ +text_now things get serious! +wait_ +dark_ +play_map1_3 + +draw_ +show_ +text_beware the wheel of death! +wait_ +dark_ +play_map1_4 + +draw_ +show_ +text_don't let those teleports confuse you! +wait_ +dark_ +play_map1_5 + +draw_ +show_ +text_sidestep your way outta trouble! +wait_ +dark_ +play_map1_6 + +draw_ +show_ +text_invisibility helps! it's there somewhere... +wait_ +dark_ +play_map1_7 + +rest_gothic tomb + +pict_gothic + +tile_2 + +draw_ +show_ +text_raptor madness in the gothic tomb! +wait_ +dark_ +play_map3_1 + +draw_ +show_ +text_don't stop for nothing! +wait_ +dark_ +play_map3_2 + +draw_ +show_ +text_watch your back! others are... +wait_ +dark_ +play_map3_3 + +draw_ +show_ +text_caution advised...if you value your life! +wait_ +dark_ +play_map3_4 + +draw_ +show_ +text_into the raptor pit! +wait_ +dark_ +play_map3_5 + +draw_ +show_ +text_you're on your own this time! +wait_ +dark_ +play_map3_6 + +draw_ +show_ +text_ummmm...shoot...shoot...run...shoot... +wait_ +dark_ +play_map3_7 + +rest_hell + +pict_hell + +tile_3 + +draw_ +show_ +text_welcome to hell! +wait_ +dark_ +play_map4_1 + +draw_ +show_ +text_timing is of the essence! +wait_ +dark_ +play_map4_2 + +draw_ +show_ +text_the halls of torment... +wait_ +dark_ +play_map4_3 + +draw_ +show_ +text_prepare to face the guardians of hell! +wait_ +dark_ +play_map4_4 + +draw_ +show_ +text_chunky chunder chunks...from hell of course! +wait_ +dark_ +play_map4_5 + +draw_ +show_ +text_nearly there...don't give up now! +wait_ +dark_ +play_map4_6 + +draw_ +show_ +text_stop dragon your feet! +wait_ +dark_ +play_map4_7 + +pict_theend +draw_ +show_ +text_congratulations! you have completed gloom! +wait_ + +done_ + diff --git a/misc/script.bak b/misc/script.bak new file mode 100644 index 0000000..76cd958 --- /dev/null +++ b/misc/script.bak @@ -0,0 +1,176 @@ + +; +;script for gloom game +; + +pict_spacehulk + +tile_1 + +draw_ +show_ +text_simple stuff! watch out for ambushes though... +wait_ +dark_ +play_map1_1 + +draw_ +show_ +text_stay alert! watch out for aggro skinheads! +wait_ +dark_ +play_map1_2 + +draw_ +show_ +text_now things get serious! +wait_ +dark_ +play_map1_3 + +draw_ +show_ +text_beware the wheel of death! +wait_ +dark_ +play_map1_4 + +draw_ +show_ +text_don't let those teleports confuse you! +wait_ +dark_ +play_map1_5 + +draw_ +show_ +text_sidestep your way outta trouble! +wait_ +dark_ +play_map1_6 + +draw_ +show_ +text_invisibility helps! it's there somewhere... +wait_ +dark_ +play_map1_7 + +rest_gothic tomb + +pict_gothic + +tile_2 + +draw_ +show_ +text_raptor madness in the gothic tomb! +wait_ +dark_ +play_map3_1 + +draw_ +show_ +text_don't stop for nothing! +wait_ +dark_ +play_map3_2 + +draw_ +show_ +text_watch your back! others are... +wait_ +dark_ +play_map3_3 + +draw_ +show_ +text_caution advised...if you value your life! +wait_ +dark_ +play_map3_4 + +draw_ +show_ +text_into the raptor pit! +wait_ +dark_ +play_map3_5 + +draw_ +show_ +text_you're on your own this time! +wait_ +dark_ +play_map3_6 + +draw_ +show_ +text_ummmm...shoot...shoot...run...shoot... +wait_ +dark_ +play_map3_7 + +rest_hell + +pict_hell + +tile_3 + +draw_ +show_ +text_welcome to hell! +wait_ +dark_ +play_map4_1 + +draw_ +show_ +text_timing is of the essence! +wait_ +dark_ +play_map4_2 + +draw_ +show_ +text_the halls of torment... +wait_ +dark_ +play_map4_3 + +draw_ +show_ +text_prepare to face the guardians of hell! +wait_ +dark_ +play_map4_4 + +draw_ +show_ +text_chunky chunder chunks...from hell of course! +wait_ +dark_ +play_map4_5 + +draw_ +show_ +text_nearly there...don't give up now! +wait_ +dark_ +play_map4_6 + +draw_ +show_ +text_stop dragon your feet! +wait_ +dark_ +play_map4_7 + +pict_theend +draw_ +show_ +text_congratulations! you have completed gloom! +wait_ + +done_ + diff --git a/misc/script.info b/misc/script.info new file mode 100644 index 0000000..6baf883 Binary files /dev/null and b/misc/script.info differ diff --git a/misc/smallfont.bin b/misc/smallfont.bin new file mode 100644 index 0000000..b39dba7 Binary files /dev/null and b/misc/smallfont.bin differ diff --git a/misc/smallfont2.bin b/misc/smallfont2.bin new file mode 100644 index 0000000..b571d9f Binary files /dev/null and b/misc/smallfont2.bin differ diff --git a/mock1.iff b/mock1.iff new file mode 100644 index 0000000..5f2dad0 Binary files /dev/null and b/mock1.iff differ diff --git a/mock1.iff.info b/mock1.iff.info new file mode 100644 index 0000000..8cffca4 Binary files /dev/null and b/mock1.iff.info differ diff --git a/mock2.iff b/mock2.iff new file mode 100644 index 0000000..d14ff39 Binary files /dev/null and b/mock2.iff differ diff --git a/mock2.iff.info b/mock2.iff.info new file mode 100644 index 0000000..8d51007 Binary files /dev/null and b/mock2.iff.info differ diff --git a/mr b/mr new file mode 100644 index 0000000..97df440 --- /dev/null +++ b/mr @@ -0,0 +1,9 @@ +makechunky rot1 16 +makechunky rot2 16 +makechunky rot3 16 +makechunky rot4 16 +makechunky rot5 16 +makechunky rot6 16 +makechunky rot7 16 +makechunky rot8 16 + diff --git a/mr.bak b/mr.bak new file mode 100644 index 0000000..de8d42a --- /dev/null +++ b/mr.bak @@ -0,0 +1 @@ +makechunky rot1 16 diff --git a/mr.info b/mr.info new file mode 100644 index 0000000..6baf883 Binary files /dev/null and b/mr.info differ diff --git a/myfont.iff b/myfont.iff new file mode 100644 index 0000000..7566296 Binary files /dev/null and b/myfont.iff differ diff --git a/myfont.iff.info b/myfont.iff.info new file mode 100644 index 0000000..93e5b10 Binary files /dev/null and b/myfont.iff.info differ diff --git a/nonv.s b/nonv.s new file mode 100644 index 0000000..e69c37f --- /dev/null +++ b/nonv.s @@ -0,0 +1,73 @@ +myentry dc.l 0 + +hiscores dc.l $100000,'MAK ' ;score,name + dc.l $50000,'AXE ' + dc.l $10000,'HAN ' + dc.l $9000,'AND ' + dc.l $8000,'NIX ' + ; + dc.l $7000,'ASM ' + dc.l $6000,'ORG ' + dc.l $5000,'MON ' + dc.l $2500,'WAS ' +hiscoresf dc.l $1000,'GON ' + +applname dc.b 'Guardian',0 + even +itemname dc.b 'Heroes',0 + even + +nvname dc.b 'nonvolatile.library',0 + cnop 0,4 +nv dc.l 0 + +savehiscores movem.l d0-d7/a0-a6,-(a7) + jsr enableos + ; + move.l nv,d0 + beq.s .done + move.l d0,a6 + lea applname(pc),a0 + lea itemname(pc),a1 + lea hiscores(pc),a2 + moveq #8,d0 ;80 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 jsr disableos + movem.l (a7)+,d0-d7/a0-a6 + rts + +hisfound dc 0 + +loadhiscores 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 + ; + st hisfound + move.l d0,a0 + lea hiscores(pc),a1 + moveq #19,d1 +.loop move.l (a0)+,(a1)+ + dbf d1,.loop + ; + move.l d0,a0 + jsr -36(a6) ;freenvdata + ; +.done rts + diff --git a/objs/baldy b/objs/baldy new file mode 100644 index 0000000..c27070b Binary files /dev/null and b/objs/baldy differ diff --git a/objs/baldy2 b/objs/baldy2 new file mode 100644 index 0000000..603cd68 Binary files /dev/null and b/objs/baldy2 differ diff --git a/objs/deathhead b/objs/deathhead new file mode 100644 index 0000000..52f8461 Binary files /dev/null and b/objs/deathhead differ diff --git a/objs/demon b/objs/demon new file mode 100644 index 0000000..d53b862 Binary files /dev/null and b/objs/demon differ diff --git a/objs/demon2 b/objs/demon2 new file mode 100644 index 0000000..50d34fe Binary files /dev/null and b/objs/demon2 differ diff --git a/objs/dragon b/objs/dragon new file mode 100644 index 0000000..262ae79 Binary files /dev/null and b/objs/dragon differ diff --git a/objs/dragon2 b/objs/dragon2 new file mode 100644 index 0000000..15c116e Binary files /dev/null and b/objs/dragon2 differ diff --git a/objs/ghoul b/objs/ghoul new file mode 100644 index 0000000..37d6edb Binary files /dev/null and b/objs/ghoul differ diff --git a/objs/lizard b/objs/lizard new file mode 100644 index 0000000..3a2cfd3 Binary files /dev/null and b/objs/lizard differ diff --git a/objs/lizard2 b/objs/lizard2 new file mode 100644 index 0000000..06d21f7 Binary files /dev/null and b/objs/lizard2 differ diff --git a/objs/marine b/objs/marine new file mode 100644 index 0000000..6fa0ad4 Binary files /dev/null and b/objs/marine differ diff --git a/objs/marine2 b/objs/marine2 new file mode 100644 index 0000000..56d58b7 Binary files /dev/null and b/objs/marine2 differ diff --git a/objs/phantom b/objs/phantom new file mode 100644 index 0000000..6b52031 Binary files /dev/null and b/objs/phantom differ diff --git a/objs/phantom2 b/objs/phantom2 new file mode 100644 index 0000000..9823f30 Binary files /dev/null and b/objs/phantom2 differ diff --git a/objs/player b/objs/player new file mode 100644 index 0000000..1968695 Binary files /dev/null and b/objs/player differ diff --git a/objs/terra b/objs/terra new file mode 100644 index 0000000..6abfa48 Binary files /dev/null and b/objs/terra differ diff --git a/objs/terra2 b/objs/terra2 new file mode 100644 index 0000000..155d181 Binary files /dev/null and b/objs/terra2 differ diff --git a/objs/tokens b/objs/tokens new file mode 100644 index 0000000..335a7ea Binary files /dev/null and b/objs/tokens differ diff --git a/objs/troll b/objs/troll new file mode 100644 index 0000000..dadf9ad Binary files /dev/null and b/objs/troll differ diff --git a/objs/troll2 b/objs/troll2 new file mode 100644 index 0000000..cf3e74e Binary files /dev/null and b/objs/troll2 differ diff --git a/p0.iff b/p0.iff new file mode 100644 index 0000000..ca9e3e0 Binary files /dev/null and b/p0.iff differ diff --git a/p1.iff b/p1.iff new file mode 100644 index 0000000..e048b71 Binary files /dev/null and b/p1.iff differ diff --git a/p2.iff b/p2.iff new file mode 100644 index 0000000..9104fdb Binary files /dev/null and b/p2.iff differ diff --git a/p3.iff b/p3.iff new file mode 100644 index 0000000..99ace2f Binary files /dev/null and b/p3.iff differ diff --git a/pal.bb2 b/pal.bb2 new file mode 100644 index 0000000..47ebe20 Binary files /dev/null and b/pal.bb2 differ diff --git a/pal.bb2.bak b/pal.bb2.bak new file mode 100644 index 0000000..ee09d66 Binary files /dev/null and b/pal.bb2.bak differ diff --git a/pal.bb2.info b/pal.bb2.info new file mode 100644 index 0000000..6baf883 Binary files /dev/null and b/pal.bb2.info differ diff --git a/pal.bb2.xtra b/pal.bb2.xtra new file mode 100644 index 0000000..77d6262 Binary files /dev/null and b/pal.bb2.xtra differ diff --git a/pal2.bb2 b/pal2.bb2 new file mode 100644 index 0000000..4619261 Binary files /dev/null and b/pal2.bb2 differ diff --git a/phantom.chunks b/phantom.chunks new file mode 100644 index 0000000..96fc46d Binary files /dev/null and b/phantom.chunks differ diff --git a/phantom.chunks.info b/phantom.chunks.info new file mode 100644 index 0000000..363d355 Binary files /dev/null and b/phantom.chunks.info differ diff --git a/phantom.iff b/phantom.iff new file mode 100644 index 0000000..fff9600 Binary files /dev/null and b/phantom.iff differ diff --git a/phantom.iff.info b/phantom.iff.info new file mode 100644 index 0000000..112c465 Binary files /dev/null and b/phantom.iff.info differ diff --git a/pic1.iff b/pic1.iff new file mode 100644 index 0000000..4d9e502 Binary files /dev/null and b/pic1.iff differ diff --git a/pic1a.iff.info b/pic1a.iff.info new file mode 100644 index 0000000..20ddb1d Binary files /dev/null and b/pic1a.iff.info differ diff --git a/pic2a.iff.info b/pic2a.iff.info new file mode 100644 index 0000000..20ddb1d Binary files /dev/null and b/pic2a.iff.info differ diff --git a/pic3a.iff.info b/pic3a.iff.info new file mode 100644 index 0000000..20ddb1d Binary files /dev/null and b/pic3a.iff.info differ diff --git a/pics/blackmagic b/pics/blackmagic new file mode 100644 index 0000000..54fe824 Binary files /dev/null and b/pics/blackmagic differ diff --git a/pics/blackmagic.pal b/pics/blackmagic.pal new file mode 100644 index 0000000..7ed6e64 Binary files /dev/null and b/pics/blackmagic.pal differ diff --git a/pics/combat b/pics/combat new file mode 100644 index 0000000..0a90f08 Binary files /dev/null and b/pics/combat differ diff --git a/pics/combat.pal b/pics/combat.pal new file mode 100644 index 0000000..650795d Binary files /dev/null and b/pics/combat.pal differ diff --git a/pics/gloombrush b/pics/gloombrush new file mode 100644 index 0000000..ee33881 Binary files /dev/null and b/pics/gloombrush differ diff --git a/pics/gothic b/pics/gothic new file mode 100644 index 0000000..ede535a Binary files /dev/null and b/pics/gothic differ diff --git a/pics/gothic.pal b/pics/gothic.pal new file mode 100644 index 0000000..0d9085b Binary files /dev/null and b/pics/gothic.pal differ diff --git a/pics/hell b/pics/hell new file mode 100644 index 0000000..34ec125 Binary files /dev/null and b/pics/hell differ diff --git a/pics/hell.pal b/pics/hell.pal new file mode 100644 index 0000000..0017912 Binary files /dev/null and b/pics/hell.pal differ diff --git a/pics/spacehulk b/pics/spacehulk new file mode 100644 index 0000000..f627017 Binary files /dev/null and b/pics/spacehulk differ diff --git a/pics/spacehulk.pal b/pics/spacehulk.pal new file mode 100644 index 0000000..7496dfe Binary files /dev/null and b/pics/spacehulk.pal differ diff --git a/pics/theend b/pics/theend new file mode 100644 index 0000000..217276c Binary files /dev/null and b/pics/theend differ diff --git a/pics/theend.pal b/pics/theend.pal new file mode 100644 index 0000000..afa68e1 Binary files /dev/null and b/pics/theend.pal differ diff --git a/pics/title b/pics/title new file mode 100644 index 0000000..46c501a Binary files /dev/null and b/pics/title differ diff --git a/pics/title.pal b/pics/title.pal new file mode 100644 index 0000000..1487ce6 Binary files /dev/null and b/pics/title.pal differ diff --git a/pics2/advert b/pics2/advert new file mode 100644 index 0000000..cd7d6b9 Binary files /dev/null and b/pics2/advert differ diff --git a/pics2/advert.pal b/pics2/advert.pal new file mode 100644 index 0000000..1487ce6 Binary files /dev/null and b/pics2/advert.pal differ diff --git a/pics2/blackmagic b/pics2/blackmagic new file mode 100644 index 0000000..6af113a Binary files /dev/null and b/pics2/blackmagic differ diff --git a/pics2/blackmagic.bin b/pics2/blackmagic.bin new file mode 100644 index 0000000..6af113a Binary files /dev/null and b/pics2/blackmagic.bin differ diff --git a/pics2/blackmagic.pal b/pics2/blackmagic.pal new file mode 100644 index 0000000..af1bd41 Binary files /dev/null and b/pics2/blackmagic.pal differ diff --git a/pics2/demon b/pics2/demon new file mode 100644 index 0000000..19c4cdd Binary files /dev/null and b/pics2/demon differ diff --git a/pics2/demon.iff b/pics2/demon.iff new file mode 100644 index 0000000..973ad74 Binary files /dev/null and b/pics2/demon.iff differ diff --git a/pics2/demon.iff.info b/pics2/demon.iff.info new file mode 100644 index 0000000..b07eee6 Binary files /dev/null and b/pics2/demon.iff.info differ diff --git a/pics2/demon.pal b/pics2/demon.pal new file mode 100644 index 0000000..add6ed8 Binary files /dev/null and b/pics2/demon.pal differ diff --git a/pics2/endgame b/pics2/endgame new file mode 100644 index 0000000..da6bf75 Binary files /dev/null and b/pics2/endgame differ diff --git a/pics2/endgame.pal b/pics2/endgame.pal new file mode 100644 index 0000000..a5fe79a Binary files /dev/null and b/pics2/endgame.pal differ diff --git a/pics2/hell b/pics2/hell new file mode 100644 index 0000000..3abd303 Binary files /dev/null and b/pics2/hell differ diff --git a/pics2/hell.iff b/pics2/hell.iff new file mode 100644 index 0000000..e7c20ab Binary files /dev/null and b/pics2/hell.iff differ diff --git a/pics2/hell.iff.info b/pics2/hell.iff.info new file mode 100644 index 0000000..1418c9b Binary files /dev/null and b/pics2/hell.iff.info differ diff --git a/pics2/hell.pal b/pics2/hell.pal new file mode 100644 index 0000000..bd3278b Binary files /dev/null and b/pics2/hell.pal differ diff --git a/pics2/insdisk.bin b/pics2/insdisk.bin new file mode 100644 index 0000000..3749a9b Binary files /dev/null and b/pics2/insdisk.bin differ diff --git a/pics2/insdisk.iff b/pics2/insdisk.iff new file mode 100644 index 0000000..7aa0724 Binary files /dev/null and b/pics2/insdisk.iff differ diff --git a/pics2/insdisk.iff.info b/pics2/insdisk.iff.info new file mode 100644 index 0000000..98b2435 Binary files /dev/null and b/pics2/insdisk.iff.info differ diff --git a/pics2/insdisk.pal b/pics2/insdisk.pal new file mode 100644 index 0000000..d335294 Binary files /dev/null and b/pics2/insdisk.pal differ diff --git a/pics2/soldier b/pics2/soldier new file mode 100644 index 0000000..12e2628 Binary files /dev/null and b/pics2/soldier differ diff --git a/pics2/soldier.iff b/pics2/soldier.iff new file mode 100644 index 0000000..89b73b0 Binary files /dev/null and b/pics2/soldier.iff differ diff --git a/pics2/soldier.iff.info b/pics2/soldier.iff.info new file mode 100644 index 0000000..a39fa30 Binary files /dev/null and b/pics2/soldier.iff.info differ diff --git a/pics2/soldier.pal b/pics2/soldier.pal new file mode 100644 index 0000000..3dcabd5 Binary files /dev/null and b/pics2/soldier.pal differ diff --git a/pics_ehb/blackmagic.pal b/pics_ehb/blackmagic.pal new file mode 100644 index 0000000..1627464 Binary files /dev/null and b/pics_ehb/blackmagic.pal differ diff --git a/pics_ehb/title b/pics_ehb/title new file mode 100644 index 0000000..219f69a Binary files /dev/null and b/pics_ehb/title differ diff --git a/pics_ehb/title.pal b/pics_ehb/title.pal new file mode 100644 index 0000000..dbb30ca Binary files /dev/null and b/pics_ehb/title.pal differ diff --git a/planar b/planar new file mode 100644 index 0000000..be3ba40 Binary files /dev/null and b/planar differ diff --git a/planar.s b/planar.s new file mode 100644 index 0000000..a5d498a --- /dev/null +++ b/planar.s @@ -0,0 +1,364 @@ + + ;offset 0: + bra initc2p + + ;offset 4: + bra doc2p_1X1X8 + + ;offset 8: + bra doc2p_1X1X6 + + ;offset 12: + dc.l 0 + + ;offset 16: + dc.l 0 + +initc2p ;create 2 tables for Gloom + ; + ;a0=columns buffer to fill in (array of longs) + ;d0=how many columns (multiple of 32) + ; + ;create d0 long offsets for each column offset of chunky buffer + ;this allows for scrambling of buffer + ; + ;a1=palette remapping array (array of bytes) + ; + ;this allows for scrambled bitplanes. + ; + ;do palette remapping first... + ; + move #$ff,d1 ;#colours +.loop ; + move.b d1,0(a1,d1) + ; + dbf d1,.loop + ; + ;column offsets... + ; + ;0,2,4,6,8,10,12,14 + ;1,3,5,7,9,11,13,15 + ;16,18,20... + ; + lsr #4,d0 + subq #1,d0 + moveq #0,d1 + ; +.loop2 moveq #7,d2 + ; +.loop3 move.l d1,(a0)+ + addq.l #2,d1 + dbf d2,.loop3 + ; + sub.l #15,d1 + moveq #7,d2 + ; +.loop4 move.l d1,(a0)+ + addq.l #2,d1 + dbf d2,.loop4 + ; + subq.l #1,d1 + ; + dbf d0,.loop2 + ; + rts + +rotbits macro ;macro for rotating/merging bits. + ; + ;rotbits reg1,reg2,shift + ; + move.l \1,d4 + and.l d6,\1 + eor.l \1,d4 + lsl.l #\3,\1 + ; + move.l \2,d5 + and.l d6,d5 + eor.l d5,\2 + lsr.l #\3,\2 + or.l d4,\2 + or.l d5,\1 + ; + endm + +doc2p_1X1X8 ; + ;inputs: + ;a0.l=src chunky buffer + ;a1.l=dest chipmem bitmap + ;d0.w=width (in pixels - multiple of 32) to convert + ;d1.w=height (in pixels - even) + ;d2.l=modulo from one bitplane to next (copmod-ish) + ;d3.l=modulo from start of one line to start of next (linemod) + ; + ;internal: + ;d6=current and reg. + ;d7=loop counter + ;a2=4 bit and + ;a3=2 bit and + ;a4=1 bit and + ;a5=bitplane modulo, 1 bp to next + ;a6=subtract at end of one loop + ; + move.l #$0f0f0f0f,a2 + move.l #$33333333,a3 + move.l #$5555aaaa,a4 + move.l d2,a5 ;one bp to next. + ; + lsl.l #3,d2 ;8 bitplanes + move.l d2,a6 + sub.l a5,a6 ;7 * bpmod + subq.l #2,a6 ;to next word + ; + lsr #4,d0 ;16 pixels at a time + move d0,d2 + ext.l d2 + add.l d2,d2 + add.l a6,d2 + sub.l d2,d3 + move.l d3,-(a7) + ; + subq #1,d1 + move d1,d7 ;hite dbf + swap d7 + subq #1,d0 + move d0,d7 + subq #2,a7 ;long align + move d7,-(a7) + ; + movem.l (a0)+,d0-d3 ;next 16 pixels. + move.l a2,d6 ;4 bit and + bra.s .here + ; +.loop2 swap d7 + bra.s .here + ; +.loop movem.l (a0)+,d0-d3 ;next 16 pixels. + move.l a2,d6 ;4 bit and + ; + swap d4 + move d4,(a1) ;plane 7 + sub.l a6,a1 ;back to start of next pixel. + ; +.here rotbits d0,d2,4 + rotbits d1,d3,4 + ; + move.l a3,d6 ;2 bit and + rotbits d0,d1,2 + move.l a4,d6 ;1 bit and + ; + move.l d0,d4 + and.l d6,d4 + eor.l d4,d0 + lsr #1,d4 + swap d4 + add d4,d4 + or.l d4,d0 + ; + move d0,(a1) ;plane 0 + add.l a5,a1 + ; + move.l d1,d4 + and.l d6,d4 + eor.l d4,d1 + ; + swap d0 + move d0,(a1) + add.l a5,a1 + ; + lsr #1,d4 + swap d4 + add d4,d4 + or.l d4,d1 + ; + move d1,(a1) ;plane 2 + add.l a5,a1 + ; + move.l a3,d6 ;2 bit and + rotbits d2,d3,2 + move.l a4,d6 ;1 bit and + ; + move.l d2,d4 + and.l d6,d4 + eor.l d4,d2 + ; + swap d1 + move d1,(a1) ;plane 3 + add.l a5,a1 + ; + lsr #1,d4 + swap d4 + add d4,d4 + or.l d4,d2 + ; + move d2,(a1) ;plane 4 + add.l a5,a1 + ; + move.l d3,d4 + and.l d6,d4 + eor.l d4,d3 + ; + swap d2 + move d2,(a1) ;plane 5 + add.l a5,a1 + ; + lsr #1,d4 + swap d4 + add d4,d4 + or.l d3,d4 + ; + move d4,(a1) ;plane 6 + add.l a5,a1 + ; + dbf d7,.loop ;end of width? + move (a7),d7 + swap d7 + ; + movem.l (a0)+,d0-d3 ;get next 16 pixels. + move.l a2,d6 ;4 bit and + ; + swap d4 + move d4,(a1) ;plane 7. + add.l 4(a7),a1 ;start of next line + ; + dbf d7,.loop2 + ; + list +.check set *-.loop2 ;loop size (<256?) + nolist + ; + addq #8,a7 + ; + rts + +doc2p_1X1X6 ; + ;inputs: + ;a0.l=src chunky buffer + ;a1.l=dest chipmem bitmap + ;d0.w=width (in pixels - multiple of 32) to convert + ;d1.w=height (in pixels - even) + ;d2.l=modulo from one bitplane to next (copmod-ish) + ;d3.l=modulo from start of one line to start of next (linemod) + ; + ;internal: + ;d6=current and reg. + ;d7=loop counter + ;a2=4 bit and + ;a3=2 bit and + ;a4=1 bit and + ;a5=bitplane modulo, 1 bp to next + ;a6=subtract at end of one loop + ; + move.l #$0f0f0f0f,a2 + move.l #$33333333,a3 + move.l #$5555aaaa,a4 + move.l d2,a5 ;one bp to next. + ; + lsl.l #3,d2 ;8 bitplanes + move.l d2,a6 + sub.l a5,a6 ;7 * bpmod + subq.l #2,a6 ;to next word + ; + lsr #4,d0 ;16 pixels at a time + move d0,d2 + ext.l d2 + add.l d2,d2 + add.l a6,d2 + sub.l d2,d3 + move.l d3,-(a7) + ; + subq #1,d1 + move d1,d7 ;hite dbf + swap d7 + subq #1,d0 + move d0,d7 + subq #2,a7 ;long align + move d7,-(a7) + ; + movem.l (a0)+,d0-d3 ;next 16 pixels. + move.l a2,d6 ;4 bit and + bra.s .here + ; +.loop2 swap d7 + bra.s .here + ; +.loop movem.l (a0)+,d0-d3 ;next 16 pixels. + move.l a2,d6 ;4 bit and + ; + swap d4 + move d4,(a1) ;plane 7 + sub.l a6,a1 ;back to start of next pixel. + ; +.here rotbits d0,d2,4 + rotbits d1,d3,4 + ; + move.l a3,d6 ;2 bit and + rotbits d0,d1,2 + move.l a4,d6 ;1 bit and + ; + move.l d0,d4 + and.l d6,d4 + eor.l d4,d0 + lsr #1,d4 + swap d4 + add d4,d4 + or.l d4,d0 + ; + move d0,(a1) ;plane 0 + add.l a5,a1 + ; + move.l d1,d4 + and.l d6,d4 + eor.l d4,d1 + ; + swap d0 + move d0,(a1) ;plane 1 + add.l a5,a1 + ; + lsr #1,d4 + swap d4 + add d4,d4 + or.l d4,d1 + ; + move d1,(a1) ;plane 2 + add.l a5,a1 + ; + move.l a3,d6 ;2 bit and + rotbits d2,d3,2 + move.l a4,d6 ;1 bit and + ; + move.l d2,d4 + and.l d6,d4 + eor.l d4,d2 + ; + swap d1 + move d1,(a1) ;plane 3 + add.l a5,a1 + ; + lsr #1,d4 + swap d4 + add d4,d4 + or.l d2,d4 + ; + move d4,(a1) ;plane 4 + add.l a5,a1 + ; + dbf d7,.loop ;end of width? + move (a7),d7 + swap d7 + ; + movem.l (a0)+,d0-d3 ;get next 16 pixels. + move.l a2,d6 ;4 bit and + ; + swap d4 + move d4,(a1) ;plane 7. + add.l 4(a7),a1 ;start of next line + ; + dbf d7,.loop2 + ; + list +.check set *-.loop2 ;loop size (<256?) + nolist + ; + addq #8,a7 + ; + rts diff --git a/player.anim b/player.anim new file mode 100644 index 0000000..a91c147 Binary files /dev/null and b/player.anim differ diff --git a/player.anim.info b/player.anim.info new file mode 100644 index 0000000..740f60c Binary files /dev/null and b/player.anim.info differ diff --git a/player.bin b/player.bin new file mode 100644 index 0000000..66a64d0 Binary files /dev/null and b/player.bin differ diff --git a/pointer.iff b/pointer.iff new file mode 100644 index 0000000..a9e59c7 Binary files /dev/null and b/pointer.iff differ diff --git a/pointer.iff.info b/pointer.iff.info new file mode 100644 index 0000000..e28b9fe Binary files /dev/null and b/pointer.iff.info differ diff --git a/prog/Disk.info b/prog/Disk.info new file mode 100644 index 0000000..55e49f1 Binary files /dev/null and b/prog/Disk.info differ diff --git a/prog/Gloom b/prog/Gloom new file mode 100644 index 0000000..8a4f5e2 Binary files /dev/null and b/prog/Gloom differ diff --git a/prog/Gloom-_HD b/prog/Gloom-_HD new file mode 100644 index 0000000..0f669f8 Binary files /dev/null and b/prog/Gloom-_HD differ diff --git a/prog/Gloom-_HD.info b/prog/Gloom-_HD.info new file mode 100644 index 0000000..5fa4fc2 Binary files /dev/null and b/prog/Gloom-_HD.info differ diff --git a/prog/Gloom.info b/prog/Gloom.info new file mode 100644 index 0000000..0bee9ea Binary files /dev/null and b/prog/Gloom.info differ diff --git a/prog/misc/bigfont.bin b/prog/misc/bigfont.bin new file mode 100644 index 0000000..ee24465 Binary files /dev/null and b/prog/misc/bigfont.bin differ diff --git a/prog/misc/smallfont.bin b/prog/misc/smallfont.bin new file mode 100644 index 0000000..85a0aec Binary files /dev/null and b/prog/misc/smallfont.bin differ diff --git a/prog/objs/player b/prog/objs/player new file mode 100644 index 0000000..000bb63 Binary files /dev/null and b/prog/objs/player differ diff --git a/prog/objs/tokens b/prog/objs/tokens new file mode 100644 index 0000000..c0f6a80 Binary files /dev/null and b/prog/objs/tokens differ diff --git a/prog/pics/blackmagic b/prog/pics/blackmagic new file mode 100644 index 0000000..340816f Binary files /dev/null and b/prog/pics/blackmagic differ diff --git a/prog/pics/blackmagic.pal b/prog/pics/blackmagic.pal new file mode 100644 index 0000000..1cc6e12 Binary files /dev/null and b/prog/pics/blackmagic.pal differ diff --git a/prog/s/startup-sequence b/prog/s/startup-sequence new file mode 100644 index 0000000..d1837cc --- /dev/null +++ b/prog/s/startup-sequence @@ -0,0 +1,2 @@ +setpatch quiet +run >nil: gloom diff --git a/prog/setpatch b/prog/setpatch new file mode 100644 index 0000000..374cafb Binary files /dev/null and b/prog/setpatch differ diff --git a/prog/sfxs/die.bin b/prog/sfxs/die.bin new file mode 100644 index 0000000..1b905dc Binary files /dev/null and b/prog/sfxs/die.bin differ diff --git a/prog/sfxs/door.bin b/prog/sfxs/door.bin new file mode 100644 index 0000000..1a83850 Binary files /dev/null and b/prog/sfxs/door.bin differ diff --git a/prog/sfxs/dragon.bin b/prog/sfxs/dragon.bin new file mode 100644 index 0000000..43262eb Binary files /dev/null and b/prog/sfxs/dragon.bin differ diff --git a/prog/sfxs/footstep.bin b/prog/sfxs/footstep.bin new file mode 100644 index 0000000..e04db5d Binary files /dev/null and b/prog/sfxs/footstep.bin differ diff --git a/prog/sfxs/ghoul.bin b/prog/sfxs/ghoul.bin new file mode 100644 index 0000000..1117371 Binary files /dev/null and b/prog/sfxs/ghoul.bin differ diff --git a/prog/sfxs/grunt.bin b/prog/sfxs/grunt.bin new file mode 100644 index 0000000..b1f9b3f Binary files /dev/null and b/prog/sfxs/grunt.bin differ diff --git a/prog/sfxs/grunt2.bin b/prog/sfxs/grunt2.bin new file mode 100644 index 0000000..4a547a6 Binary files /dev/null and b/prog/sfxs/grunt2.bin differ diff --git a/prog/sfxs/grunt3.bin b/prog/sfxs/grunt3.bin new file mode 100644 index 0000000..fc3972a Binary files /dev/null and b/prog/sfxs/grunt3.bin differ diff --git a/prog/sfxs/grunt4.bin b/prog/sfxs/grunt4.bin new file mode 100644 index 0000000..7431aa5 Binary files /dev/null and b/prog/sfxs/grunt4.bin differ diff --git a/prog/sfxs/lizard.bin b/prog/sfxs/lizard.bin new file mode 100644 index 0000000..f63381b Binary files /dev/null and b/prog/sfxs/lizard.bin differ diff --git a/prog/sfxs/lizhit.bin b/prog/sfxs/lizhit.bin new file mode 100644 index 0000000..8861682 Binary files /dev/null and b/prog/sfxs/lizhit.bin differ diff --git a/prog/sfxs/med1 b/prog/sfxs/med1 new file mode 100644 index 0000000..c2da32c Binary files /dev/null and b/prog/sfxs/med1 differ diff --git a/prog/sfxs/med2 b/prog/sfxs/med2 new file mode 100644 index 0000000..f3e256d Binary files /dev/null and b/prog/sfxs/med2 differ diff --git a/prog/sfxs/robodie.bin b/prog/sfxs/robodie.bin new file mode 100644 index 0000000..43edffc Binary files /dev/null and b/prog/sfxs/robodie.bin differ diff --git a/prog/sfxs/robot.bin b/prog/sfxs/robot.bin new file mode 100644 index 0000000..512a829 Binary files /dev/null and b/prog/sfxs/robot.bin differ diff --git a/prog/sfxs/shoot.bin b/prog/sfxs/shoot.bin new file mode 100644 index 0000000..d6bbc88 Binary files /dev/null and b/prog/sfxs/shoot.bin differ diff --git a/prog/sfxs/shoot2.bin b/prog/sfxs/shoot2.bin new file mode 100644 index 0000000..e5d98d8 Binary files /dev/null and b/prog/sfxs/shoot2.bin differ diff --git a/prog/sfxs/shoot3.bin b/prog/sfxs/shoot3.bin new file mode 100644 index 0000000..254e2c1 Binary files /dev/null and b/prog/sfxs/shoot3.bin differ diff --git a/prog/sfxs/shoot4.bin b/prog/sfxs/shoot4.bin new file mode 100644 index 0000000..fdc977d Binary files /dev/null and b/prog/sfxs/shoot4.bin differ diff --git a/prog/sfxs/shoot5.bin b/prog/sfxs/shoot5.bin new file mode 100644 index 0000000..c215d9d Binary files /dev/null and b/prog/sfxs/shoot5.bin differ diff --git a/prog/sfxs/splat.bin b/prog/sfxs/splat.bin new file mode 100644 index 0000000..32901b2 Binary files /dev/null and b/prog/sfxs/splat.bin differ diff --git a/prog/sfxs/teleport.bin b/prog/sfxs/teleport.bin new file mode 100644 index 0000000..69f2c96 Binary files /dev/null and b/prog/sfxs/teleport.bin differ diff --git a/prog/sfxs/token.bin b/prog/sfxs/token.bin new file mode 100644 index 0000000..d7c57fc Binary files /dev/null and b/prog/sfxs/token.bin differ diff --git a/prog/sfxs/trollhit.bin b/prog/sfxs/trollhit.bin new file mode 100644 index 0000000..70949a2 Binary files /dev/null and b/prog/sfxs/trollhit.bin differ diff --git a/prog/sfxs/trollmad.bin b/prog/sfxs/trollmad.bin new file mode 100644 index 0000000..54b313d Binary files /dev/null and b/prog/sfxs/trollmad.bin differ diff --git a/quezzies b/quezzies new file mode 100644 index 0000000..47819b1 --- /dev/null +++ b/quezzies @@ -0,0 +1,28 @@ +From theone@cix.compulink.co.ukThu Mar 16 09:54:23 1995 +Date: Wed, 15 Mar 95 15:01 GMT +From: Andy Nuttall +To: acid@iconz.co.nz +Subject: Quezzies + +Hi Mark, + +Thanks for agreeing to do the exclusive. We wonÕt let you down. HereÕs a list of basic questions to get you going. If you could type out the answers on the grid, and then e-mail them back to me at some point, that would be good for me. Please say anything, for plenty is better than too little. + +1: Gloom. That sounds a bit like Doom, doesn't it? +2: Is it meant to be as close a version as possible? +3: Have you seen any other Doom 'clones' on the Amiga? Say, Poom, for instance, Death Mask or Alien Breed 3D? Any comments, or would you rather not 'diss' the opposition? +4: How long have you been working on it? +5: When you started Gloom, did you have any idea how it would turn out? Presumably it took a while to code the 3D routine - but were you sure that it was possible? +6: Talk about some of the problems you came across when writing it. +7: The demo we have is quite big. How big will the final game be? +8: Talking speed for a while: does the frame rate increase depending on what processor you have? How about screen size/resolution? +9: The two-player mode is a good innovation - but will there be a null modem link-up too? That really works with Doom. +10: If the main code is assembler, is Blitz used at all? +11: The other people in Black Magic - have they done anything before? +12: Do you anticipate any trouble from id Software? + +13: Er, and the final question is: do you have anything more to say? This is going to be a big preview - four pages - so if you can spout as much information as you can about Gloom it would be appreciated. I need the answers asap - Friday would be good, Monday if not. + +Oh yeah, and if you have any screen shots, or some demos of other levels/enemies/characters that we could use as decorations, they would be cool too. + +E-Mail me if there's a problem. diff --git a/reader.bb2 b/reader.bb2 new file mode 100644 index 0000000..b4c478a Binary files /dev/null and b/reader.bb2 differ diff --git a/reader.bb2.info b/reader.bb2.info new file mode 100644 index 0000000..6baf883 Binary files /dev/null and b/reader.bb2.info differ diff --git a/reader.bb2.xtra b/reader.bb2.xtra new file mode 100644 index 0000000..4a1d1bb Binary files /dev/null and b/reader.bb2.xtra differ diff --git a/readme b/readme new file mode 100644 index 0000000..d507187 --- /dev/null +++ b/readme @@ -0,0 +1,29 @@ + + ..About Black Magic... + +Black Magic is a new development team who aim to produce fun, playable and +down-right interesting games for a range of platforms. The team currently +consist of: + +Mark Sibly - programmer - the dude responsible for Blitz Basic 2, Overkill, +Guardian and a string of less memorable products. + +Kurt and Hans Butler - artists (extraordinaire) - no past convictions, but +contributions to Skidmarks, Overkill, Guardian and the infamous Gladiators +scandal mark them out as serious contendors. + +Kev Stannard - musician - a man with a troubled past who has every right to +think the worst of the games scene, but is soldiering on bravely none the less. + + +Contact addresses: + +543A Dominion Rd +Balmoral +Auckland +New Zealand + +Phone: NZ (09) 623-1762 + +EMail: acid@iconz.co.nz + diff --git a/readme.info b/readme.info new file mode 100644 index 0000000..6baf883 Binary files /dev/null and b/readme.info differ diff --git a/rgbs.bin b/rgbs.bin new file mode 100644 index 0000000..1fbdd05 Binary files /dev/null and b/rgbs.bin differ diff --git a/rgbs2.bin b/rgbs2.bin new file mode 100644 index 0000000..aa3b8b3 Binary files /dev/null and b/rgbs2.bin differ diff --git a/rgbtest.bb2 b/rgbtest.bb2 new file mode 100644 index 0000000..3c4d70c Binary files /dev/null and b/rgbtest.bb2 differ diff --git a/rgbtest.bb2.bak b/rgbtest.bb2.bak new file mode 100644 index 0000000..9ce1ab2 Binary files /dev/null and b/rgbtest.bb2.bak differ diff --git a/rgbtest.bb2.info b/rgbtest.bb2.info new file mode 100644 index 0000000..6baf883 Binary files /dev/null and b/rgbtest.bb2.info differ diff --git a/rgbtest.bb2.xtra b/rgbtest.bb2.xtra new file mode 100644 index 0000000..4a1d1bb Binary files /dev/null and b/rgbtest.bb2.xtra differ diff --git a/robodie.sfx b/robodie.sfx new file mode 100644 index 0000000..04aaecd Binary files /dev/null and b/robodie.sfx differ diff --git a/robodie.sfx.info b/robodie.sfx.info new file mode 100644 index 0000000..56c6cb5 Binary files /dev/null and b/robodie.sfx.info differ diff --git a/rot1.chk b/rot1.chk new file mode 100644 index 0000000..3a1ec63 Binary files /dev/null and b/rot1.chk differ diff --git a/rot1.iff b/rot1.iff new file mode 100644 index 0000000..f105235 Binary files /dev/null and b/rot1.iff differ diff --git a/rot1.iff.info b/rot1.iff.info new file mode 100644 index 0000000..41c89b1 Binary files /dev/null and b/rot1.iff.info differ diff --git a/rot2.chk b/rot2.chk new file mode 100644 index 0000000..c86bca3 Binary files /dev/null and b/rot2.chk differ diff --git a/rot2.iff b/rot2.iff new file mode 100644 index 0000000..5354c05 Binary files /dev/null and b/rot2.iff differ diff --git a/rot2.iff.info b/rot2.iff.info new file mode 100644 index 0000000..41c89b1 Binary files /dev/null and b/rot2.iff.info differ diff --git a/rot3.chk b/rot3.chk new file mode 100644 index 0000000..bb33271 Binary files /dev/null and b/rot3.chk differ diff --git a/rot3.iff b/rot3.iff new file mode 100644 index 0000000..57fce6f Binary files /dev/null and b/rot3.iff differ diff --git a/rot3.iff.info b/rot3.iff.info new file mode 100644 index 0000000..41c89b1 Binary files /dev/null and b/rot3.iff.info differ diff --git a/rot4.chk b/rot4.chk new file mode 100644 index 0000000..beb2725 Binary files /dev/null and b/rot4.chk differ diff --git a/rot4.iff b/rot4.iff new file mode 100644 index 0000000..e09e5a0 Binary files /dev/null and b/rot4.iff differ diff --git a/rot4.iff.info b/rot4.iff.info new file mode 100644 index 0000000..41c89b1 Binary files /dev/null and b/rot4.iff.info differ diff --git a/rot5.chk b/rot5.chk new file mode 100644 index 0000000..aa29f52 Binary files /dev/null and b/rot5.chk differ diff --git a/rot5.iff b/rot5.iff new file mode 100644 index 0000000..1a42610 Binary files /dev/null and b/rot5.iff differ diff --git a/rot5.iff.info b/rot5.iff.info new file mode 100644 index 0000000..41c89b1 Binary files /dev/null and b/rot5.iff.info differ diff --git a/rot6.chk b/rot6.chk new file mode 100644 index 0000000..9de0b6e Binary files /dev/null and b/rot6.chk differ diff --git a/rot6.iff b/rot6.iff new file mode 100644 index 0000000..7cbf526 Binary files /dev/null and b/rot6.iff differ diff --git a/rot6.iff.info b/rot6.iff.info new file mode 100644 index 0000000..41c89b1 Binary files /dev/null and b/rot6.iff.info differ diff --git a/rot7.chk b/rot7.chk new file mode 100644 index 0000000..447e4d1 Binary files /dev/null and b/rot7.chk differ diff --git a/rot7.iff b/rot7.iff new file mode 100644 index 0000000..af47ead Binary files /dev/null and b/rot7.iff differ diff --git a/rot7.iff.info b/rot7.iff.info new file mode 100644 index 0000000..41c89b1 Binary files /dev/null and b/rot7.iff.info differ diff --git a/rot8.chk b/rot8.chk new file mode 100644 index 0000000..193e69b Binary files /dev/null and b/rot8.chk differ diff --git a/rot8.iff b/rot8.iff new file mode 100644 index 0000000..69de5a8 Binary files /dev/null and b/rot8.iff differ diff --git a/rot8.iff.info b/rot8.iff.info new file mode 100644 index 0000000..41c89b1 Binary files /dev/null and b/rot8.iff.info differ diff --git a/rude b/rude new file mode 100644 index 0000000..43a0ce6 Binary files /dev/null and b/rude differ diff --git a/rude.bb2 b/rude.bb2 new file mode 100644 index 0000000..7563792 Binary files /dev/null and b/rude.bb2 differ diff --git a/rude.bb2.info b/rude.bb2.info new file mode 100644 index 0000000..6baf883 Binary files /dev/null and b/rude.bb2.info differ diff --git a/rude.bb2.xtra b/rude.bb2.xtra new file mode 100644 index 0000000..1b504a3 Binary files /dev/null and b/rude.bb2.xtra differ diff --git a/scans/combatpic.iff b/scans/combatpic.iff new file mode 100644 index 0000000..bb1cb63 Binary files /dev/null and b/scans/combatpic.iff differ diff --git a/scans/endgame.iff b/scans/endgame.iff new file mode 100644 index 0000000..c7c27f1 Binary files /dev/null and b/scans/endgame.iff differ diff --git a/scans/hulkpic.iff b/scans/hulkpic.iff new file mode 100644 index 0000000..992996d Binary files /dev/null and b/scans/hulkpic.iff differ diff --git a/scans/title.iff b/scans/title.iff new file mode 100644 index 0000000..1215fec Binary files /dev/null and b/scans/title.iff differ diff --git a/script.bak b/script.bak new file mode 100644 index 0000000..cd6d547 --- /dev/null +++ b/script.bak @@ -0,0 +1,16 @@ + +; +;script for gloom game +; + +pict_soldier +draw_ +show_ +wait_ +dark_ +play_map1 +draw_ +show_ +wait_ +dark_ +done_ diff --git a/script.info b/script.info new file mode 100644 index 0000000..6baf883 Binary files /dev/null and b/script.info differ diff --git a/setup b/setup new file mode 100644 index 0000000..5d52e63 Binary files /dev/null and b/setup differ diff --git a/setup.bb2 b/setup.bb2 new file mode 100644 index 0000000..a2d3c57 Binary files /dev/null and b/setup.bb2 differ diff --git a/setup.bb2.bak b/setup.bb2.bak new file mode 100644 index 0000000..5f2f515 Binary files /dev/null and b/setup.bb2.bak differ diff --git a/setup.bb2.info b/setup.bb2.info new file mode 100644 index 0000000..6baf883 Binary files /dev/null and b/setup.bb2.info differ diff --git a/setup.bb2.xtra b/setup.bb2.xtra new file mode 100644 index 0000000..01daf94 Binary files /dev/null and b/setup.bb2.xtra differ diff --git a/sfx.s b/sfx.s new file mode 100644 index 0000000..dbb842c --- /dev/null +++ b/sfx.s @@ -0,0 +1,80 @@ +sfxintserver0 dc.l 0,0 + dc.b 2,0 + dc.l 0 +sfxintdata dc.l channelinfo +sfxintcode dc.l sfxinterupt + +sfxintserver1 dc.l 0,0 + dc.b 2,0 + dc.l 0 + dc.l channelinfo2 + dc.l sfxinterupt + +sfxintserver2 dc.l 0,0 + dc.b 2,0 + dc.l 0 + dc.l channelinfo2 + dc.l sfxinterupt + +sfxintserver3 dc.l 0,0 + dc.b 2,0 + dc.l 0 + dc.l channelinfo + dc.l sfxinterupt + + 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) + ; + 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) + ; + +sfxinterupt tst.b 2(a1) + ble.s .rts + subq.b #1,2(a1) + bne.s .rts + ; + move 14(a1),$dff09a + move 18(a1),$dff096 + ; + move.l 20(a1),a0 ;leftbase + move.l #chipzero,(a0) + move #0,8(a0) ;vol off + ; + move.l 24(a1),a0 ;leftbase + move.l #chipzero,(a0) + move #0,8(a0) ;vol off + ; +.rts move 14(a1),$dff09c + moveq #0,d0 + rts diff --git a/sfxs/die.bin b/sfxs/die.bin new file mode 100644 index 0000000..d394fa0 Binary files /dev/null and b/sfxs/die.bin differ diff --git a/sfxs/door.bin b/sfxs/door.bin new file mode 100644 index 0000000..1404f13 Binary files /dev/null and b/sfxs/door.bin differ diff --git a/sfxs/dragon.bin b/sfxs/dragon.bin new file mode 100644 index 0000000..575dbe0 Binary files /dev/null and b/sfxs/dragon.bin differ diff --git a/sfxs/footstep.bin b/sfxs/footstep.bin new file mode 100644 index 0000000..bf89f30 --- /dev/null +++ b/sfxs/footstep.bin @@ -0,0 +1 @@ +A2õù÷óùûùûéëéëëåñû   ÿÿñååéááíïóý175=3)) õñïÛÓÏÁ½¿»¿ÁËÕßó +-7EGMQQMC?7-+÷å×˽µµ±©§©­±½ÅÇÑÝåñ%+1;IMQWWSQIA?=7+# ý÷éÝÕËÃÁ½¹·¹·±³µ³»ÃÉÑÙßçí÷ý)/59;;999731-)# ÿóïçãÝÕÓÍËÏÏÏÏÏÑÕÙßãçííñ÷ùý  ÿýýùõõõóóñïñóóñññóõ÷÷÷ûûý ýùõñëéåããáßÝÝÝÝßßáãããåçéëñõ÷û !#%''''''%# ýûùóïëåáÝÛÙÙÙÙÙÝßáåéíñõ÷ûÿ    ýùõóïëéçåããáßßßßßßáãáãååéëëïïïóó÷ùùûýÿÿ   ÿûùõññïíëëëëëëëéééçåååååãããååçéëíïññõ÷ùýýÿ   ÿûûù÷÷õóññïííëççãáãããããááãááááãããááããåçéëíññóõ÷ûûý !##%%%%#!! ÿÿÿÿýýûûûù÷÷÷õóõõõõõõõóññïïïíëëëííïñóõõ÷ùùûûýýýýýýýýýÿÿ ÿýûù÷óñïíëéééçççççéëííïñññóõõ÷÷ùûûýýýÿ  ÿÿýýýûýûûûýýýýûûûýûûûùûûùûûù÷ùùùùù÷÷÷ùùùûùûûûûûýûýýÿÿÿ   ÿýù÷÷÷÷óóñññññóññññññïíëéçåãããáßßßßßßáãåçëíñõùûÿ   ýùý ##! ÿóéåçïÿ  ûñéåéëíñóñíïó÷÷ñëëéåçíñõ  ý÷÷ûÿÿýÿ  ÿýÿÿÿ ÿÿûõññóõõññïïññõùùûûýýÿýÿÿÿÿ ÿýýýÿÿÿ ÿÿÿÿÿÿýýÿÿÿÿýûù÷÷õóñíëçããççççççéëëëííïñóõ÷ùùûýûýýÿÿÿÿÿýýýÿÿÿÿÿ  ÿûù÷óññïïïïïññóõ÷÷÷÷÷÷õõõõóóóõõ÷÷÷ùù÷÷÷ùùûýýÿ ýýýýûûûûûûûûù÷õõõõóóóóóñóõõ÷÷÷ùùùùûûùùùùùùùûûûûùùûûûùûýýýûýýÿÿÿÿÿÿÿÿÿÿ   ÿýýûûùùù÷÷÷õõóñññïïïïïíïïïïññóóõ÷ùùûûýÿÿÿ   ÿûûûù÷õóñïíëëéçççççççååããååççéëíïïïñóõ÷ùûýÿ  ÿûù÷õõóóñññïññññññóõ÷ùûýÿÿÿ  ÿÿÿÿýûûùùù÷÷÷õõóõóóóóóóõ÷ùûûýýýûûûûûûùùù÷ùùùùùùùùùùùùùùûýýýýýÿ ÿÿÿÿýýÿÿÿÿÿÿÿýýûûùùùùù÷÷÷õõ÷õóóõõõõõ÷÷ùùùûýûýûûûûýûýýýýÿÿÿÿÿýýûûùùùûûûûûûûûûûûûûûûýýÿ ÿÿÿÿÿÿÿÿÿýýÿÿÿÿÿÿÿýýýÿÿÿÿÿÿÿÿýýýýýýûûûûýÿÿÿÿÿýýýýÿýýýýýýýýýûûûûùùùù÷÷÷÷÷÷÷÷÷õõõõ÷÷÷÷ùùûûýýÿÿÿ ÿÿÿýÿÿÿÿÿÿÿÿÿýýûûûûûûùùù÷÷÷÷õõõõõõ÷÷ùùùùùûûûûûûûûýýÿÿÿÿýûûûûûûûûûýýýýýÿÿÿÿÿÿýýýýýýÿÿÿÿÿÿÿÿÿýýÿÿÿÿÿ ÿýûûù÷÷õóññïïñïïññïññóóóõõ÷÷÷÷ùûýýÿÿÿÿÿÿÿÿÿýûûùùùùùùùûûýýýÿÿÿýýýýûýýýûûûûûûùùùùûùùûûûýýýýýýýÿÿÿ ÿÿýýûûûù÷÷õõõõõõõ÷÷÷÷ùùùûûýýýýýýÿÿ ÿÿÿÿýýýýýýýýûûùù÷÷÷õõõõóóóñññóóññññïïïïïïïïïïñóóõõ÷÷ùûýýÿ ÿÿÿÿÿÿÿÿÿÿ \ No newline at end of file diff --git a/sfxs/ghoul.bin b/sfxs/ghoul.bin new file mode 100644 index 0000000..afcf254 Binary files /dev/null and b/sfxs/ghoul.bin differ diff --git a/sfxs/grunt.bin b/sfxs/grunt.bin new file mode 100644 index 0000000..28dff82 Binary files /dev/null and b/sfxs/grunt.bin differ diff --git a/sfxs/grunt2.bin b/sfxs/grunt2.bin new file mode 100644 index 0000000..c3a1a3d Binary files /dev/null and b/sfxs/grunt2.bin differ diff --git a/sfxs/grunt3.bin b/sfxs/grunt3.bin new file mode 100644 index 0000000..ce7a9af Binary files /dev/null and b/sfxs/grunt3.bin differ diff --git a/sfxs/grunt4.bin b/sfxs/grunt4.bin new file mode 100644 index 0000000..2c17a8f Binary files /dev/null and b/sfxs/grunt4.bin differ diff --git a/sfxs/lizard.bin b/sfxs/lizard.bin new file mode 100644 index 0000000..0811861 Binary files /dev/null and b/sfxs/lizard.bin differ diff --git a/sfxs/lizhit.bin b/sfxs/lizhit.bin new file mode 100644 index 0000000..2a1dc6f Binary files /dev/null and b/sfxs/lizhit.bin differ diff --git a/sfxs/med1 b/sfxs/med1 new file mode 100644 index 0000000..018bca0 Binary files /dev/null and b/sfxs/med1 differ diff --git a/sfxs/med2 b/sfxs/med2 new file mode 100644 index 0000000..b07c071 Binary files /dev/null and b/sfxs/med2 differ diff --git a/sfxs/robodie.bin b/sfxs/robodie.bin new file mode 100644 index 0000000..8622cdb Binary files /dev/null and b/sfxs/robodie.bin differ diff --git a/sfxs/robot.bin b/sfxs/robot.bin new file mode 100644 index 0000000..7e2ae07 Binary files /dev/null and b/sfxs/robot.bin differ diff --git a/sfxs/shoot.bin b/sfxs/shoot.bin new file mode 100644 index 0000000..9b303c9 Binary files /dev/null and b/sfxs/shoot.bin differ diff --git a/sfxs/shoot2.bin b/sfxs/shoot2.bin new file mode 100644 index 0000000..9300bc3 Binary files /dev/null and b/sfxs/shoot2.bin differ diff --git a/sfxs/shoot3.bin b/sfxs/shoot3.bin new file mode 100644 index 0000000..660a6dd Binary files /dev/null and b/sfxs/shoot3.bin differ diff --git a/sfxs/shoot4.bin b/sfxs/shoot4.bin new file mode 100644 index 0000000..f86265c Binary files /dev/null and b/sfxs/shoot4.bin differ diff --git a/sfxs/shoot5.bin b/sfxs/shoot5.bin new file mode 100644 index 0000000..905aaa5 Binary files /dev/null and b/sfxs/shoot5.bin differ diff --git a/sfxs/splat.bin b/sfxs/splat.bin new file mode 100644 index 0000000..4979b4c Binary files /dev/null and b/sfxs/splat.bin differ diff --git a/sfxs/teleport.bin b/sfxs/teleport.bin new file mode 100644 index 0000000..a346459 Binary files /dev/null and b/sfxs/teleport.bin differ diff --git a/sfxs/token.bin b/sfxs/token.bin new file mode 100644 index 0000000..e544dee Binary files /dev/null and b/sfxs/token.bin differ diff --git a/sfxs/trollhit.bin b/sfxs/trollhit.bin new file mode 100644 index 0000000..726810d Binary files /dev/null and b/sfxs/trollhit.bin differ diff --git a/sfxs/trollmad.bin b/sfxs/trollmad.bin new file mode 100644 index 0000000..0460658 Binary files /dev/null and b/sfxs/trollmad.bin differ diff --git a/sfxs2/die.bin b/sfxs2/die.bin new file mode 100644 index 0000000..d394fa0 Binary files /dev/null and b/sfxs2/die.bin differ diff --git a/sfxs2/door.bin b/sfxs2/door.bin new file mode 100644 index 0000000..917c0a6 Binary files /dev/null and b/sfxs2/door.bin differ diff --git a/sfxs2/footstep.bin b/sfxs2/footstep.bin new file mode 100644 index 0000000..bf89f30 --- /dev/null +++ b/sfxs2/footstep.bin @@ -0,0 +1 @@ +A2õù÷óùûùûéëéëëåñû   ÿÿñååéááíïóý175=3)) õñïÛÓÏÁ½¿»¿ÁËÕßó +-7EGMQQMC?7-+÷å×˽µµ±©§©­±½ÅÇÑÝåñ%+1;IMQWWSQIA?=7+# ý÷éÝÕËÃÁ½¹·¹·±³µ³»ÃÉÑÙßçí÷ý)/59;;999731-)# ÿóïçãÝÕÓÍËÏÏÏÏÏÑÕÙßãçííñ÷ùý  ÿýýùõõõóóñïñóóñññóõ÷÷÷ûûý ýùõñëéåããáßÝÝÝÝßßáãããåçéëñõ÷û !#%''''''%# ýûùóïëåáÝÛÙÙÙÙÙÝßáåéíñõ÷ûÿ    ýùõóïëéçåããáßßßßßßáãáãååéëëïïïóó÷ùùûýÿÿ   ÿûùõññïíëëëëëëëéééçåååååãããååçéëíïññõ÷ùýýÿ   ÿûûù÷÷õóññïííëççãáãããããááãááááãããááããåçéëíññóõ÷ûûý !##%%%%#!! ÿÿÿÿýýûûûù÷÷÷õóõõõõõõõóññïïïíëëëííïñóõõ÷ùùûûýýýýýýýýýÿÿ ÿýûù÷óñïíëéééçççççéëííïñññóõõ÷÷ùûûýýýÿ  ÿÿýýýûýûûûýýýýûûûýûûûùûûùûûù÷ùùùùù÷÷÷ùùùûùûûûûûýûýýÿÿÿ   ÿýù÷÷÷÷óóñññññóññññññïíëéçåãããáßßßßßßáãåçëíñõùûÿ   ýùý ##! ÿóéåçïÿ  ûñéåéëíñóñíïó÷÷ñëëéåçíñõ  ý÷÷ûÿÿýÿ  ÿýÿÿÿ ÿÿûõññóõõññïïññõùùûûýýÿýÿÿÿÿ ÿýýýÿÿÿ ÿÿÿÿÿÿýýÿÿÿÿýûù÷÷õóñíëçããççççççéëëëííïñóõ÷ùùûýûýýÿÿÿÿÿýýýÿÿÿÿÿ  ÿûù÷óññïïïïïññóõ÷÷÷÷÷÷õõõõóóóõõ÷÷÷ùù÷÷÷ùùûýýÿ ýýýýûûûûûûûûù÷õõõõóóóóóñóõõ÷÷÷ùùùùûûùùùùùùùûûûûùùûûûùûýýýûýýÿÿÿÿÿÿÿÿÿÿ   ÿýýûûùùù÷÷÷õõóñññïïïïïíïïïïññóóõ÷ùùûûýÿÿÿ   ÿûûûù÷õóñïíëëéçççççççååããååççéëíïïïñóõ÷ùûýÿ  ÿûù÷õõóóñññïññññññóõ÷ùûýÿÿÿ  ÿÿÿÿýûûùùù÷÷÷õõóõóóóóóóõ÷ùûûýýýûûûûûûùùù÷ùùùùùùùùùùùùùùûýýýýýÿ ÿÿÿÿýýÿÿÿÿÿÿÿýýûûùùùùù÷÷÷õõ÷õóóõõõõõ÷÷ùùùûýûýûûûûýûýýýýÿÿÿÿÿýýûûùùùûûûûûûûûûûûûûûûýýÿ ÿÿÿÿÿÿÿÿÿýýÿÿÿÿÿÿÿýýýÿÿÿÿÿÿÿÿýýýýýýûûûûýÿÿÿÿÿýýýýÿýýýýýýýýýûûûûùùùù÷÷÷÷÷÷÷÷÷õõõõ÷÷÷÷ùùûûýýÿÿÿ ÿÿÿýÿÿÿÿÿÿÿÿÿýýûûûûûûùùù÷÷÷÷õõõõõõ÷÷ùùùùùûûûûûûûûýýÿÿÿÿýûûûûûûûûûýýýýýÿÿÿÿÿÿýýýýýýÿÿÿÿÿÿÿÿÿýýÿÿÿÿÿ ÿýûûù÷÷õóññïïñïïññïññóóóõõ÷÷÷÷ùûýýÿÿÿÿÿÿÿÿÿýûûùùùùùùùûûýýýÿÿÿýýýýûýýýûûûûûûùùùùûùùûûûýýýýýýýÿÿÿ ÿÿýýûûûù÷÷õõõõõõõ÷÷÷÷ùùùûûýýýýýýÿÿ ÿÿÿÿýýýýýýýýûûùù÷÷÷õõõõóóóñññóóññññïïïïïïïïïïñóóõõ÷÷ùûýýÿ ÿÿÿÿÿÿÿÿÿÿ \ No newline at end of file diff --git a/sfxs2/grunt.bin b/sfxs2/grunt.bin new file mode 100644 index 0000000..28dff82 Binary files /dev/null and b/sfxs2/grunt.bin differ diff --git a/sfxs2/grunt2.bin b/sfxs2/grunt2.bin new file mode 100644 index 0000000..4fc8c10 Binary files /dev/null and b/sfxs2/grunt2.bin differ diff --git a/sfxs2/grunt3.bin b/sfxs2/grunt3.bin new file mode 100644 index 0000000..ce7a9af Binary files /dev/null and b/sfxs2/grunt3.bin differ diff --git a/sfxs2/grunt4.bin b/sfxs2/grunt4.bin new file mode 100644 index 0000000..2c17a8f Binary files /dev/null and b/sfxs2/grunt4.bin differ diff --git a/sfxs2/med1 b/sfxs2/med1 new file mode 100644 index 0000000..018bca0 Binary files /dev/null and b/sfxs2/med1 differ diff --git a/sfxs2/med2 b/sfxs2/med2 new file mode 100644 index 0000000..b07c071 Binary files /dev/null and b/sfxs2/med2 differ diff --git a/sfxs2/med2.info b/sfxs2/med2.info new file mode 100644 index 0000000..83ff60f Binary files /dev/null and b/sfxs2/med2.info differ diff --git a/sfxs2/shoot.bin b/sfxs2/shoot.bin new file mode 100644 index 0000000..9b303c9 Binary files /dev/null and b/sfxs2/shoot.bin differ diff --git a/sfxs2/shoot2.bin b/sfxs2/shoot2.bin new file mode 100644 index 0000000..3f0bf39 Binary files /dev/null and b/sfxs2/shoot2.bin differ diff --git a/sfxs2/shoot3.bin b/sfxs2/shoot3.bin new file mode 100644 index 0000000..b74ec94 --- /dev/null +++ b/sfxs2/shoot3.bin @@ -0,0 +1 @@ +AÑëíññóññõóõ÷ûÿ ÿûùûýýýûýÿýûýÿÿýûù÷õûùýÿÿýý÷ùû÷ù÷ùýý  ýûÿýûûóùûõùù÷ùõ÷ù÷ùõó÷ùûÿý÷õ÷ýÿÿý   ýýû÷÷ùõùù÷õóóóïñóññóõùûÿÿùùõõ÷ùÿ  ÿûýûù÷ûÿÿÿÿÿÿý   ÿÿÿ÷ûÿûýÿûýýùûùóï÷õóÿíûû÷ ÷÷ÿí÷ùñùûûûûóíßõõïû áßóïûíý!õéë÷Ýùé÷ ûñ §ç7ýí éÿ; 9ýåÏ##ÓéïÛÿññ1ÿ Ù¹ÇwMùõ¹å7açá»åñ½-)Ùõ9Ý!Ý©û-9û¯ÝùÙÕÛÕ=1¯÷gGÙë •ó[Mñ‡ße€ý÷õ‹ßÓc7 »Í3wCÓ?ÿ­Íß ![5Û» µ-e½¹ýýA%½Õé›au)ÛßW!鳱À€==9å‰×eQ«ÝMG9C‘ñO½ƒýcÝŸý=ŸÝ Cg»é5ÁÓÿA€m•'5•Õ9EÕÅ=wûÍ?ûõ_ Ãëùç%- ÇïAç€A)í©'ÇS'áÉù?i]-Ë…¯™åMAïћѹ71çÓ»A3ùõÝÝ=9e+µcIÕKÏïñ1m­IM³×1¥ïû¡óÍóóÇ »ÝG9ßñã€y#ë#+¹ qC;ï«“ïEs{Ç‹³Uýe]=‹/=Ù£ë;÷UYý¥ßñßÛ·ó õÓ·Ó ñIõ5óùí%=ýC/ë5ÿ×õ ç×÷ÏëûÑá3ýÕáÏñõáéïáÝ!W?ÿÅ«× ë#m-ñóï #íõó ïïó ûáãûõõõóÿý÷Áãñë) åûóùï  ÿÿñÝÍáó1Aé½Áç%' ÿéý)õõ=%í!Ùß  õïïÛÕõ÷óóáç ûóýûõßùùñ ýûÿ + ù ïõï÷é#ãñùõó÷éñá×;Y%ó¯¿+ýùóõéû!õïùáï%ÁëÕéóýëÉë#ïý3 éçó+Ã× ãó×¹åóã×Óûç+ñ ; Å=)³+ëÏõÙ§) óíÑ©Ùû- áëýÏÝí  -#ãï# Í ÿãÓ-ýï õï Åíû ñ'!'Í 9Ùõÿÿ 1#Ï÷S'û ûó£Ëõ#%çÓíÕåïÓÇ %Ùí×à Ûí#A!ñ Ëÿóÿ3áÙíïÓÛáýÏËÕïã+åõÛó'ù×åñýûí«ÛóéÑûï!1óñ+ýãùûù/ ï#ï+%-3 ïõÝÏ¯Ç ýã #åE-5#ý % Ù¹ù!ñýÍåÏç! ßY#ÍáåÛ9áí5ë±)q³ÕÓ)½%!‡Ù3E/Iß›)Ý“¿% ××ßÙíõÇ ïÍÕ-9ãóÿE!íÝë1)íïûíéëù!çõý%ù +%ï÷5×㿹!I?å¥íɧõ7¥-ûÑ)ëÝùéÇ ÿ#=û-ñá±;§ÃÇAsó¿ ïA3ÓñQ=5û«Ãý3!%å×#ñáé áÍÿ ÷»É7ã'=õÑQÛËß÷+Où··Õ»Ù[3Í+)!¹·7ãÁiMíÉÃC{éçñóïeGÑï ûí;!³µÃ+w!íõÕýéÛ±×ÿË+Wá'ÓQ?óãÃ#WãÕ1OýÝ÷ûïÝÅá˽÷ ÿïùñÿñ×ßåɵÝõç ÿíåÝý#! ëé÷÷ûéóí÷ûíýïë ûé% ÿû%1+!ÿóÏ ÿÿñéåù÷õßóçáëéñû õ÷÷ÿ   ûû%-!ÿÿùßßéß×ë÷ûýïõÿù÷Ûë-É×õý õûý )!ó/)?5ëÕ 1û ï ï %# ýýñáååãá×ÓßÝáÛáÝã   ûýñãïéïóýóå÷ó û íóÙÛ÷!/ÿáçëÛóñû )/Q;79ÿûáÇýÁÏËÑßíÙÏïåÙç÷÷óíï  59÷ ÿÿñÕëåÝéãïëçóõùýÿ õ-# !=! éåí÷ õóÿõçýÿÝïïåñáÛññ××ûÿÓÝ í ýýùåéÿ ÿõõëíóÝù ý5ï+K+GQñ !%ý! ùó÷ñáÙÛñãñÿù÷ë÷  ýãÛã¿Ã×ÙçßñóÕëïÿïßùû÷çóñÇë×ïåÝéù) #- ñ! EW1+) Ýÿ G/ óÛûûëû 3ñçÏ ½íçýٵ㠷É÷ áíñÓÝõ áÍñ%ï×õÇÇ'? ½ÛéßóýñÝÓõ !×Kùá÷åËñõûóßõûõóçù'!éçÿï ! åÍõCÉã ñÿ/)õíåßûÑ©¹ï1'Õ×'%õßçùë÷í õé C)×)3)çõý+óãóËãë ëÓã÷ïÿ ùA ÝÕÙ ÝõåÝí ' Ýû%ûÿ!×ÕéùóÁÙ»ÉßýõËß ûóõõÇÕïýû + éß5; )%#Å·+1+Íñ‹ÙùÅ%A1S=óûõ½ ùÅ!¡Ûݵû'åÿ!ÿ-í%-í'ù%ÿ ãÝ÷ýëé+ã ë%ýïýõ 1 +íé#+ýÿÿýû÷éãåÛç÷ëññíëëãù ÿëÙßé÷åçïïéùç  ùý  õóýó   õó ÷ ûùóç÷ýÛÛïéãåëí×Ýñçï ëéñý íñù õù÷ ÿ  ùïûõó û%%÷õÿ õ ùóïåëíáóéÛ÷ùùÿñ ÿý÷ éáñýÑ÷ùñóõùùý   ûõíï÷÷óùÿûÿ÷õï  ó    íýùáõíáå÷ãåù ïõùûåýÝíõ ûÿûõÿïëñáçåßëåïÛé÷ÿûÿù÷ïçó ù  ÷ÿùí óÿ ÿó õûïûÝéå íÿñõóéõççÿ÷û!!!%ÿ ' ýÿõ ý íùóßñ÷ïßåçõßÝáãéíûñíùñëñÿ ùûëí ñ÷çßáåíõõû    õ ó ûÿÿ ùÿ÷ÿç çýéçõñçéù ùýñ ÷ýÿÛíñùùñ×õõÙÛýÕáíñíõ÷ù  ÿ÷ý ÷ë óññý÷ÿ×çÿû7' ëñïïùýû !ùóçé÷õÏÝóÿ÷ùÿíïëýÿçýýáãíéùû÷áýçááñùíùëé ÿ /õû óý÷ÿýí÷ÿ÷õëûûý   ÿýû'õ!ÿíñéííëçïûëïï×ëíßí÷éëõ÷û% ýûÿÿÿÿ ýÿõ÷ ý÷ÙÿÿÿûõÓáéÝññ ë'íñùÝíáßÕÓççõÙñéùÿÿ  ) åëõËÕëçÿåû ÿÿõûù ïýõýÿñ /ÿÛ!  ýÿùññÿóçççëõóõÿïáííýùëùûíñõù ÷ñ õïóåõûï #ÿ ûûùóÿÿùûáãûóùñåùñíñõÿïûûïñÿÿ÷íõû !  ÿõïéõù ÿëñåïûííõýûý ù ÿýë÷õÿ  ÿù ùã ÷ïùïéóû ! ÿùóýõóïõÿÿñõÿåùûóñáï ýùûùõñíõý ùõ  ÿï÷ù ëñ õéùéßëéçÝãûÝãõïÿñ ùñ /ÿÿ  ÷ ýñÕãóçëóãóûõáëûë ÷á ÷ ûí÷ùñçýóÿû÷ óáñóÛÓÛÍÛçåíõ÷ëÿõ ëñýõ # ý ûùéíñåï  ë  õñëçùçÛÝëñåó ëùï !ÿóý û÷ ý# õ ûûû÷ûûõáï÷éùÿ ÿûïýûõëñóçïÿùñù÷éÝëíÿõõ ùû÷Ëãûïçõëñýÿ÷ ÷ íýõõ ùõïûõß÷ýù! % ó í ÿû û õíñçéí÷ùñûÿýýý åýùçÙíñ÷ÿ û ÷ï óçíùñëÛëïáëéãù û 1ùõ! %íõûóùñïãûûëïùëãéñéó !)õÍËãÓÓÛßëññ÷ññ óëëéí÷÷ÿù   ýïóõïáéñýóáãççéû ùûû #)# ûÿûóååóïååéïÑÙÝÏÝóýÿïû!+)%7C-#3óùéßýëßóû÷ï ïõýíãõùãé÷û ñã û ÿõ÷íãÙéãÓïÛÑëÝñ  ï  ÿíýùõñííÏÛóó÷÷õõý ýÿý ùíÿáçù  ÷ ÿó÷ñáïéãåõÕÛýÿ) íûñÕõïëíçç÷ ßÕñëéóóûý ëÕá÷õñ õ ÿ ' ý÷ëÙñãíçáíïýóõóçéÿ' ùýûù ýíã×ÛÝïñéñ÷9-)1!ùÿóí÷éãßßó ïç ñã åëéåïñõåáó÷óã÷û ýßóóé !õ ÿ óõû ÷÷ûÿ ùï÷ý  ýçéÿ ùåÓÓáíù÷ ããÝáëñý÷íó!1 ëåéùå ûóû !'ýûõÙåïçã ùû ûù ÿûÕñ û!õ ?%óÙÙë íùù ýñÓçùÍÑ÷ûñé  õ;5ùïÿ+ çõûõÿ ý ùéíóïõùñá÷ ÷û ÷ñ ÿûõý ñóùëçýÝÍùÿïëýýóýý ù1÷ëûõçÛ ÷Éá ÿóóãÿë×åûûéåëñëíûù÷ýý ùõÿ  +åñ õ áÙ ûÿÙå-ãï !%óùáçóÑãÙÓýõçýñù ÷5!åã ÷Õ×ýñûÛÿ é×ýÿõóñ+ýÿ Ññõïû  '5 ÿçññåûýñ Ûëñóûÿí×õëÙÓÝÙÃ×ßã í÷! óùõý íëíñùïãëÿ/#-+ó ;áýïÍÕÛ  ×óå!!+ùÛ×å éåùûíÍëÿï÷÷åç ý÷÷íÛéíåùÿ  ý')ýåíïÛ»½íïß)!íÿ !ù÷!áýéó õ·ñÿãÿý÷- û÷ÿýéÍÉãûñ ùùóù ÑÙé!ó/ ÿñûÕé!! Ý ÇõóÛÛÙùûã ! Õã Óå õçûñû+  ÝåÿáÇëíé ïó ñ ÷ ÷û ýÿ÷ñÑÃéóåãÝå í íýûùýõù óÙû ñõýõ  ã ó×ë÷Ñã ýûííù!- /ù ù åáÍåÿßß×Ýóñõ  !ûõýñù ýù ÷ïí1-ù íí óÕé÷áÝßûå?)K?çáõÏÏÓÉÏáßÏÏñ û ù -ÿù÷éåóñ ïù¿Ûÿõýïó ãá ÿõ Éß#+55179ýñÿéÍÙãïëÕû ÝÉÝíýçáïçÕãñ - %'-ÿ'ñßýùñõýçóéåçÓÝýå÷õ %ûíáå ÿíÛãûý õýç ÷ÛõùÍë éõ5)G/ûñÝß÷ï+=ÿ  ÙÛ÷ïý+!#éùëááññç÷ÉÝçûçáë'%'1 =ÿÇïýáçýóÑé÷Í÷- ûßëé'÷ßÛßÿ+ ¹Óç×Íß1C/%÷ý/A9%ëÕÙÓÑëóï#áÑõçõ =#÷áëáßçïÛßýûÿù!)ç  ï¿·×åß÷éõÿïÙ+ )W5éï #%ÿËç íßÕá+ ÛõÉÕéëÏçA%ùïá//çû)#×é)=#ãñÝÝ÷áïñõåçé õû;1ù ÓÇåñ×ÏÁÉñ õÛ  ýíó;Y)å)ûÅÙóýí#ïÍÕ±£ç/Ó!-3óÿí/ A1Ñ×'Å 1á¹íïÓûáÁã! ÿïÝÙùñíó1YI ÝÉéåÕåï/ ÿ ÿ ¿å+ÝÓá)å)ýÙ3!ï ïóÿÿßç ûóÙùõÅóÓÛùÿÓËíñ÷+ ë%-/çíé+#åùAé#!ãC5ïÕåïÛ  ÿçÙÑåÉÑÝ ' ãå×åñíñ1;×ïûñ õ%áïçÿ Ï ß#+7! +÷#ÕÇãå«çÛÕñïçñã#'%ûãó5áõýéùñ÷ ÷ç÷éçõ÷ë¿ßÓ£Ñ÷Éóýû)ùá÷ïççõ÷×ß% + !;A=ñÅ × 'ÿëÉ͹Ûÿó+C ëé!å+51ùÁÛýÑ ûÙÛû)íÉ3é+û áÿçÁËéõ ÁÛ% õËû íí3/%9)çç÷ïï÷!ÙÝ-ÿ÷ýßã !í íûõ5ûC íóÓç/Aù!ÝÑñ×ûÉϽÛçéÛçùó;'S;ÛË×½ñËÇ÷ÙáÙe;õ -ß5 åÙÙÕÃÝõÏßçñÏéëû!iùGùû1ãËññçõóï=å­å!ë;áÁY!áÉåãé'?'ýÝ ÙÅÓëÿÏÏå³Í/ß;U÷«×ï G!) É3U% ÷9!÷é§Ãï»ÙçÅãÿÁ±%3ýñó-!#/û-YcUO#ÿõí+ûÛ·µ£ÍÃñ9ïÉÑÇÙïY=ë9 µ!ãÙ ùáÁÁï5==#íÍÿÁÉé çßÙ ùÃûýáË-CïQW)ýóéÝßãóçãûáùñõS'÷ýE/÷Í¿ÙßÏÇá ÏÏÿÿ!+Ç Ñ7=Ùã Ñ·åÇí ÛóÛí1 Ùß =)%Gõåãý 737é óÿ' ýù•ɯ¡ñ¹é3Û×! ëñ)ûýñ ß­ÝÉ››×Ý»ëµ7OCmÿ+ýë5cGÁéã­«#51)ýçëóíÕç¹õ !ã½ëùßïÝG1÷í-óçÛ ëõÑÕç½ÑãÕ[É÷)÷O+1åçùïÙ1ç·Å ÃÍ-ý)ññ+-!=Ñ¥5õí%åÙŸ³õ%ÕáAI1- óã-ó7Aו«õý­‰ÝéÙ7EëÛ!I)íß_7q/ñÏ•í ·÷K#%Åó'Õó·Éå-í­ ¡›Ë½ßßÁñA€m;sgõÛå_9ã')¯­¯ÇïÃÓñÉÙ¹ÉûOoaé˱%ùõÿ1QÛ Õµ³/ë­Ñ×ãÿíÁ?#7/;!+CÉ×ã¯g=Ý›%Ý;ù³½µ ùSýñí!û;ÕÓ§ï ÿ!_ÝG ýëå!ù»ÓÕ¹ÝùÝ''+åñý ß;e9G÷ùéQñ ÍÇÙÃ× Û K OI õ;Q%CÝÝKéÉçé㱡×óßïë1SEÍù1Á·©½‘¥'+/ý·÷ãáU 5ýGõùIáIa5᥇‰—¡çïõÃÁM#'93 Õ +] ý5 Õýó¹ÕÍÁÍë×·7!ùÇãûóïù-QÛÇåM++ÓÇW7 Õï1ÿ[M'ï‘Û!Ù¯ÓÃßÏ· G;5áÛKE !Qóñåÿù'S%÷[CëÉ›áõ÷÷×Û%¹ýW#-Ï¥1#³I÷¹ÃñËÙùC+±§ý#é19å'ëõ×ÅOÛ­)ÛãÙ­Ñ#Õ=E)Qié%¯Ÿ-IÙûµÑeMéC½Õë·×€SÕ!+Á¯#É%ííÅé ·©·Í óÏûeW%ù»«­õùíÛµ¿£Ãå%ÝSû=UãñU íó;7ÏÑ-9)aÉ/UÇçs3áÇã;÷×)“Ï·—Óë/CIG+1éÿÓÑ9ý›å5 ×±§9ïÛííõïûûÿ! íù·ÙE Û%·#)ýíó1ç—í ßeùÏçÑ3e'C']û+oUûãï)¥­É•Ïﵫ³ÛãѯW'ý)+é÷ÑÓÿ7]?1KóÇÓÑïᥠ/÷·¯ëß©ï!çÙû ùç÷Û![ S)çMùc3ÿáãáµ¹é×ñ#ïßCÝs;åû½1ù-C÷ÛÕÿ¹…Ý;!ï×ñ¥ÑýÓ©¹¥ûQÍÉå ù)Y€5/! Í—?Ùõ áÁõéý%Ïõ7'MCM ·õó9½ÕçËÑ¡õ »#ËóEIÛ+ÑA?9Ù1ÿÕãõ9ç¡·-Eå­ï½£“Ó1)G)-5O=!Å)€Ië¯+éߣ»×áãÓÙ½ÏO€5ñûÿçOõééÛçÅÇùå¿AÍqAó§3×óG7?!µ×#E/·»3Åïá¿ A]+ñ³óŸŸ/÷ 5ßÍ¿³á/cCõ•¹Û­)ÿ—åíAÏUå-iõ3ßÁ1m+¿ýï) Ÿ©ûÿÑ içÍѱ±ÿgSáÛ;ý«s/!ÇI#Ûß¿ëç -íõgUÕI€û×ÿ7 é»3 ÝçÕç%¹å9#!K ÿߣÃ!-÷ûͳµ©­Ñ7_ÙÕѽç'9w€€€MáÛÿ×![;ùÕùçëõÍßç?ÅûçéïÝ=15mßÓåÛóKÅÁ#Ë·Åɽ5§ã =é71çéMáG'½£)[åU=Í¡³× 5UOݽíÁãcmK5)ïáÿ ïy]Ñéï‹ÇÝEÓ ±ÏÍÝI #ËãÁWY  1Gíýéñý›ŸÍ“»ß-kÙÛÛ)O%Añ£å7Ñ!?÷!ÑË/õí'- /1­±%?÷]û1ßÅå·ù/럣ŸSÛ!€Aµ³K?Ñõ×ûG¿ÅIÍ¡ ó !³£ÁÝãÙ½·1Õ×/)A×Ù=E;ó_Oå»å#ïç#ûMÉ¿#UÝÿ7!ùû±' Áùåç³á·ñU͹'Y_ã±Éûçõ¡áɱ¿Í-±ÑQ=å+M[Q'ùA5C©+O Ïíûá¿ÙÙÙµË×'û)õ3€S%Ñõ)-u'=ljçóñÙ¯©›ÓÝË1Ñëý÷½ÇMõÓcåaO[ q Aÿ)Ñ £Çó…Ë©«É­Õ?cÿÕ [G+'ýõ»«%OçÇóÇMÃ÷[ÿùC5×áëMûßïýõ—ÏÿI 5'Sý OOáË5Ã×Á¡Ç+) óÑ¥¹Û+ÃOEÝKÛ˹CïSÁ«G ³5?Ù×-kù#1;³‘í¯©#ûï݇½óÓÁÓûGMQ9!O3EQ—µ!ݽ!ë¡Íÿã½ÝCGAã±ñQ'Ç©åqIí!S7á±Ñ±ë=EÙ·ÇŸ/ñùõÏ]-·ý ó¹é7×¥ïåÛ-9ñí3%Ïù U_1õ½íÍÑ?5AÃÝ ï£é ½Eçá)I˵'ûÿÑßõãÓÛ¿ãá11ù# 1)!åÕ)ÿóßýóå÷çÛãñá/+! á½å73õéñ¹¯÷Õûí ñ+ó+7õÛçI%ÓóÏÃ-)Ãß-õ§å÷ M-E9OO-µ±½©ÝåÓËÝí3ÿ'=GíE/ÑÁ¿· çÝ ã¯Åï!ÿÓ=Ù31ëÙéÍÙõ5+õ;sÿ5U Ù3 ¯Ãáåé÷ç¹Õÿ³· )Õ1é³ 7ãÿ'ïÿAíÅÕ)õK Sù÷ÙÅëõ»×ùÅÝý Ýñ¯!ÇûK#Õí5EE% /·=íÕÍññßõãëõå% õEÝ÷ÕÑÝó)ïË+÷éÙ Ç Ã)ѱÿ ¹Ã1Ïõ)Cí÷W7Cõ#ÛÇÍãóéá÷û­Ù+ý!9 ÛA/5÷åóÿãÓ å«çíùýéù%' 1#ÿ#'/ÿµÛÑÿ9ýÍÇÛ áùÿ3+5ãéG Ãå3Õ'#¿ßçÕ7 áñß×ÑÕ?û#ù3÷ å˵+çÍíË íóMë#/×%1óë5ïÉùõ7  %ÕçËÝ'ùùéñÏýõÝCñÛÑñ9 3ùÑçÑ×ë÷ñ 1ß;Á)Ñáý ó;#íí=!Ïíó7Ù)áÍ'ëù9ñáï çÓÝÑË'³Ñ-=5!åûå!9éÏ Y'ëå Ñù ùÝáË?/û éÝÕ?ýûÓûÛíÕó1ãýÿëë%ÅïûßóÝËíÓ!ßßÝ=÷Ïåç-ñÁOËñ÷ëEó1×A%ËÃíÇ19ó3×é9%Á½ÛÝ¥ÙùçÍM¿ë;Ñßéçç+õá!ïÿûç¿ýãëýA5O1 ËûÛÓçíá# Ñý 1ÿÙÿ÷í=+)ùç ;ÿ ÙÍ£Ñÿÿ÷MããÛ×å»·åñãáñóß9ù11?E#9Ý éíëùãé×õÕß û9íûãÑ÷õÙ+%ûïëÏïµÝ ùóÛïE¹ëÿý'ï11 #ïO1÷3ûÏÛùëÑëåáÛËåïÛÏëñûÃ)ýñéI#ï#ßÛñݵ×!-ËùÑáõéçßïóýí!ù ùéùñç#A!-÷7% )-áÃÿ åãÁíåáíËÕÇñÝÃñýÓÕóI-/3'=í ßñíëÍí÷¹³Ë ã ûåû-ëÏåã ñÙñÛíóû çÕ íóéÕéÿ)-EEGï9?#3ý/? çÕÙ×­ÑÿÕÁß÷åíóûçýû#+å!5é åû ÏùùÍåñÿãóóõýá)#éç÷ ýû#ÿ/E÷ýÿ%ã% óÓßïÅáïÛùý ç÷ßAéÙýùûãõ#ùË÷û¿õÙÉñç¿ Ïãý #û 9 G! ùÉáíÇÿéï'ýáñ ¿í× + ëí ý 3í+ß)á7í!éÓ+ó×ÛëóÙÛÉñ# ùñAíá)5Ý Ýõ÷ñÏ%ñÕ÷óéÿÉÝ á íá+ÿ Aå3óýõùõçû)ÿíýó¿ÓûçåÏÅÏåéù%'ù-  +ÿëûÿÿ#÷ïéãÝëÇÙ'Ûí é óë+õ+÷ óûï ½ÍçÝçÙåéÿíó1/)!5ïÅñÿÓË×çóí÷Û!×éý)ó!ñóéíõ ÷#ýó9ûçéÝÃ÷ãóñÓýùßéÿ×Ëýßóí!ñ! -E#!;9ÿ#ë ñó½ÝÓ×ûÍÝ÷ï×éñõ %#-)Ùåñ÷óãÛåÇÿóÿõ ù!ÿ'÷ÿ ù1íéûçÝÿóÛõëùíÛ÷  ÿÿý7õ'ùû1%ï ãíóõýÅÏå»ÓåóÑù+ï ûûé %)ïñ/óû! û×óÉÕïß çíéû  ç×Û1#-# ÷çß#íóõó  + 'óåû ÿë×ÝãõÿýñÝåí÷?!ÿõíÿù í×éí ë÷ ÿùûýÝ÷õïÛùßõûÿíÓÅÓÛÝÿë )/ ïéáç÷ááïé)#ëåùóõýùñ áçýýéõóïíïÛñÿÙíýï  5û#ëõíÓû×ûûÝÛõÿ ë-!  õáûïûýß ñýÿ ëí ýïãíáñ÷çÛáñÙÿ # #ýë÷óë ý ýíÿßÝûñíóñóóñ ù   õëõùÿíñ÷ïûÝ÷÷í õÿëõùßóÿñ÷ññé ÷ÿýù' óï  ù÷ ÿùñ%÷áýÓõùóýÿ ýý Ûïÿ÷íÿ é ùý õó ÿÝãÿýï û í ÿ÷ùûÓùóóýóùó÷ ûýõÙýóóÝûç õõ!ë ßÛ÷ãç åë÷-%ù%ë÷õíù)ï ) ÿïûïýÿÛùýë÷õùçãýóíÛåõñ÷û %!) ñÿ çñïíùëõíåíñÿ ÿýó ý ýÿññáã÷Õßóûïçùûùûýõ ùç÷ãñ÷ý ýý÷å +ïýõõùû ÿ  'ñ'ÿóù×íóõçéõëýõ ÷ù õ ûùïïïó û ýÝ ùõ ñõéõåóé÷ù÷ýýï÷íïïÿóý õ ëÿ ëó ñëÿ íïïóóÿåÿ#ëñõé ïáí  ã÷óñóïßóùóùåù ýÿ÷ õë  ÿ) õÿï ç ÷÷ûëÿõë÷ÿëá ÿý ïýûñ÷ÿïéëåùý ï ññ íûëùùý ï ë ÿýëûùç ùý ï÷ÿó÷óñý ïý÷ù ç ÿùùå÷÷ïùùñóýûñ÷ýýûû ýû ñûù÷ùÿõçû  ý   ÿõý ÿýõ÷÷ùùýûûóï÷ýõ  ùßûûõãï ýñû÷ ÿýÿ ùõéûõóõó í ùýõýýýýÿ÷û÷íÿõçûýù ý÷ û ý  í÷ÿïñýéóëïõé÷ùýãù ïñ ï÷íýù ù ÷ ÷ ñù ÷éùýýý ÷ñÿý ÿóõ ù ÿ÷÷íûéûýõý ùõûù ÿóÿùí÷ ûûñíóûõñõóñÿ   ù ñû ÿïç ùùÿýû÷óõ ÷ñë ùý  ñ õÿ éû ííóÿ÷åýñõÿÿóû  ÿí÷ùÿéÿÿ ÿùû ýùóÿóéí÷÷ùû÷ù÷ÿûûÿý÷ïïùù  ýÿùÿýý  õ ùïÿóûÿóõ  ÿûÿóÿ÷ ýý ýùóýõÿ÷ ýÿû÷û÷ç ÷÷ ý÷ ÷ýÿÿûý÷÷ÿûý  ÿñÿ÷ùýÿõ ù÷ ýÿûÿù ûÿù ÿ ÷óÿÿó÷ûïû÷ó÷ û ûï÷    ûýýûýùý÷ûÿÿû ÿÿ÷ý÷õùýý÷ÿÿÿùûùýùóýýýùùÿû ù  ÿóÿõû ÷ óûÿûóóù ÿù õóûýûÿõûõñ÷ýýûû÷ûûýûóý û÷÷óùýÿùýó ÿ õÿýûûýÿ  ÿ ÿûù÷ÿýý   ÿÿýÿõûûûÿûÿýÿ÷ù    ÿÿÿùûóùùÿÿ÷ñ÷ùÿõóÿ ùý ù÷ùÿý  ûÿÿóïõÿý÷ûûÿÿõ÷ûûûõõõý ý  ÿûûùÿÿýýýûÿûÿ ÿñ÷ûûûûûý ýýÿýÿÿÿ ý ÿýÿÿÿýýÿÿÿû÷ýý ûû÷ÿýÿù÷ýõñ÷ý ÿýù ÿûýÿÿùûûÿ ÿ÷ýûýÿùùóýóýù ÿ÷ýÿ÷÷ÿûûýûýýýÿûÿÿÿõ÷ûûýýÿûûÿÿÿÿýÿ ýÿÿýùÿÿùýýùýùõóñó÷ÿýýÿÿ ÿÿÿÿÿýýý÷û÷ÿûýÿÿùýýû  ÿýÿûýýûùÿ ÿÿÿýýûûùýÿýÿýÿýÿÿýùýûýýÿûùùùýýÿÿûûýûÿÿ ûÿ ýýýû÷ùýÿÿÿ ÿýùýÿýÿÿÿÿÿûÿýÿýÿýÿÿÿÿûûýýýûûûýÿûÿýýÿýùÿûýÿûÿûýûÿÿÿÿûýÿÿÿýýûýÿÿýÿýÿÿÿ ýÿÿÿýûûýûûýÿÿÿÿÿÿýÿýûùûÿÿýÿýýÿÿýýùÿÿÿÿÿýÿÿÿÿÿÿÿÿûÿÿÿûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ \ No newline at end of file diff --git a/sfxs2/shoot4.bin b/sfxs2/shoot4.bin new file mode 100644 index 0000000..15b8f01 Binary files /dev/null and b/sfxs2/shoot4.bin differ diff --git a/sfxs2/shoot5.bin b/sfxs2/shoot5.bin new file mode 100644 index 0000000..2690b24 Binary files /dev/null and b/sfxs2/shoot5.bin differ diff --git a/sfxs2/splat.bin b/sfxs2/splat.bin new file mode 100644 index 0000000..4979b4c Binary files /dev/null and b/sfxs2/splat.bin differ diff --git a/sfxs2/teleport.bin b/sfxs2/teleport.bin new file mode 100644 index 0000000..a346459 Binary files /dev/null and b/sfxs2/teleport.bin differ diff --git a/sfxs2/token.bin b/sfxs2/token.bin new file mode 100644 index 0000000..e544dee Binary files /dev/null and b/sfxs2/token.bin differ diff --git a/sfxs3/die.bin b/sfxs3/die.bin new file mode 100644 index 0000000..d394fa0 Binary files /dev/null and b/sfxs3/die.bin differ diff --git a/sfxs3/door.bin b/sfxs3/door.bin new file mode 100644 index 0000000..1404f13 Binary files /dev/null and b/sfxs3/door.bin differ diff --git a/sfxs3/footstep.bin b/sfxs3/footstep.bin new file mode 100644 index 0000000..bf89f30 --- /dev/null +++ b/sfxs3/footstep.bin @@ -0,0 +1 @@ +A2õù÷óùûùûéëéëëåñû   ÿÿñååéááíïóý175=3)) õñïÛÓÏÁ½¿»¿ÁËÕßó +-7EGMQQMC?7-+÷å×˽µµ±©§©­±½ÅÇÑÝåñ%+1;IMQWWSQIA?=7+# ý÷éÝÕËÃÁ½¹·¹·±³µ³»ÃÉÑÙßçí÷ý)/59;;999731-)# ÿóïçãÝÕÓÍËÏÏÏÏÏÑÕÙßãçííñ÷ùý  ÿýýùõõõóóñïñóóñññóõ÷÷÷ûûý ýùõñëéåããáßÝÝÝÝßßáãããåçéëñõ÷û !#%''''''%# ýûùóïëåáÝÛÙÙÙÙÙÝßáåéíñõ÷ûÿ    ýùõóïëéçåããáßßßßßßáãáãååéëëïïïóó÷ùùûýÿÿ   ÿûùõññïíëëëëëëëéééçåååååãããååçéëíïññõ÷ùýýÿ   ÿûûù÷÷õóññïííëççãáãããããááãááááãããááããåçéëíññóõ÷ûûý !##%%%%#!! ÿÿÿÿýýûûûù÷÷÷õóõõõõõõõóññïïïíëëëííïñóõõ÷ùùûûýýýýýýýýýÿÿ ÿýûù÷óñïíëéééçççççéëííïñññóõõ÷÷ùûûýýýÿ  ÿÿýýýûýûûûýýýýûûûýûûûùûûùûûù÷ùùùùù÷÷÷ùùùûùûûûûûýûýýÿÿÿ   ÿýù÷÷÷÷óóñññññóññññññïíëéçåãããáßßßßßßáãåçëíñõùûÿ   ýùý ##! ÿóéåçïÿ  ûñéåéëíñóñíïó÷÷ñëëéåçíñõ  ý÷÷ûÿÿýÿ  ÿýÿÿÿ ÿÿûõññóõõññïïññõùùûûýýÿýÿÿÿÿ ÿýýýÿÿÿ ÿÿÿÿÿÿýýÿÿÿÿýûù÷÷õóñíëçããççççççéëëëííïñóõ÷ùùûýûýýÿÿÿÿÿýýýÿÿÿÿÿ  ÿûù÷óññïïïïïññóõ÷÷÷÷÷÷õõõõóóóõõ÷÷÷ùù÷÷÷ùùûýýÿ ýýýýûûûûûûûûù÷õõõõóóóóóñóõõ÷÷÷ùùùùûûùùùùùùùûûûûùùûûûùûýýýûýýÿÿÿÿÿÿÿÿÿÿ   ÿýýûûùùù÷÷÷õõóñññïïïïïíïïïïññóóõ÷ùùûûýÿÿÿ   ÿûûûù÷õóñïíëëéçççççççååããååççéëíïïïñóõ÷ùûýÿ  ÿûù÷õõóóñññïññññññóõ÷ùûýÿÿÿ  ÿÿÿÿýûûùùù÷÷÷õõóõóóóóóóõ÷ùûûýýýûûûûûûùùù÷ùùùùùùùùùùùùùùûýýýýýÿ ÿÿÿÿýýÿÿÿÿÿÿÿýýûûùùùùù÷÷÷õõ÷õóóõõõõõ÷÷ùùùûýûýûûûûýûýýýýÿÿÿÿÿýýûûùùùûûûûûûûûûûûûûûûýýÿ ÿÿÿÿÿÿÿÿÿýýÿÿÿÿÿÿÿýýýÿÿÿÿÿÿÿÿýýýýýýûûûûýÿÿÿÿÿýýýýÿýýýýýýýýýûûûûùùùù÷÷÷÷÷÷÷÷÷õõõõ÷÷÷÷ùùûûýýÿÿÿ ÿÿÿýÿÿÿÿÿÿÿÿÿýýûûûûûûùùù÷÷÷÷õõõõõõ÷÷ùùùùùûûûûûûûûýýÿÿÿÿýûûûûûûûûûýýýýýÿÿÿÿÿÿýýýýýýÿÿÿÿÿÿÿÿÿýýÿÿÿÿÿ ÿýûûù÷÷õóññïïñïïññïññóóóõõ÷÷÷÷ùûýýÿÿÿÿÿÿÿÿÿýûûùùùùùùùûûýýýÿÿÿýýýýûýýýûûûûûûùùùùûùùûûûýýýýýýýÿÿÿ ÿÿýýûûûù÷÷õõõõõõõ÷÷÷÷ùùùûûýýýýýýÿÿ ÿÿÿÿýýýýýýýýûûùù÷÷÷õõõõóóóñññóóññññïïïïïïïïïïñóóõõ÷÷ùûýýÿ ÿÿÿÿÿÿÿÿÿÿ \ No newline at end of file diff --git a/sfxs3/ghoul.bin b/sfxs3/ghoul.bin new file mode 100644 index 0000000..b5b78f8 Binary files /dev/null and b/sfxs3/ghoul.bin differ diff --git a/sfxs3/grunt.bin b/sfxs3/grunt.bin new file mode 100644 index 0000000..28dff82 Binary files /dev/null and b/sfxs3/grunt.bin differ diff --git a/sfxs3/grunt2.bin b/sfxs3/grunt2.bin new file mode 100644 index 0000000..c3a1a3d Binary files /dev/null and b/sfxs3/grunt2.bin differ diff --git a/sfxs3/grunt3.bin b/sfxs3/grunt3.bin new file mode 100644 index 0000000..ce7a9af Binary files /dev/null and b/sfxs3/grunt3.bin differ diff --git a/sfxs3/grunt4.bin b/sfxs3/grunt4.bin new file mode 100644 index 0000000..2c17a8f Binary files /dev/null and b/sfxs3/grunt4.bin differ diff --git a/sfxs3/lizard.bin b/sfxs3/lizard.bin new file mode 100644 index 0000000..36a890d Binary files /dev/null and b/sfxs3/lizard.bin differ diff --git a/sfxs3/lizhit.bin b/sfxs3/lizhit.bin new file mode 100644 index 0000000..543cb0e --- /dev/null +++ b/sfxs3/lizhit.bin @@ -0,0 +1 @@ +AÌýýý   ýýýùýùñíù  ýñ ùý ù ýù!! ùíñåÕíýéýýáåýÝÝ %- ùéíùùíéñõýùååùõåáéõõõùõõõÝÝ éåíõíáñ ùéÝíåÍí-E!í1ñÕÉÍíõíÝÍáíñåéùùñííýùÙ ÙéñýñõùõùùùýõíõýýýýùÕéùííå¹Ýñáù Ýá  õý íñ!áÑý éÝ%áÑí ýáõ%åÍí!%éñ!áÑõ!ýõýáíõ åí%!éÕñåÝ!)íÍÝ ÙÝ ýÕÙéùíåÙÝñõíùý áýõíõ ýùýýõõ ùñùñý åùñõ  ñù -) ! ñ íý ù  íñ ýý íí ñ ùýý õå  éíýåõùýíýíåýýõåýáõùùõéåýé åéõ ùù éõýÙ åáñáÝåíõ ùÙñùáÕå åñáåý í ) Ýíé -ýÝñù í )áÍñññýéý ý ùñùõù ñù ññõ    ýù ý õñý õùýýýù ýéáñýùéýýåíùùññùñÑÑéõååíÝñýíííñõéÙíýééýíñùýõÝÝõýùñùÝíñõõñùýýñåñýùýýñééùñíññùñ ýù  ýý ýñý ýííýýéõ ýíý ùíáéýùéõõéùýõõ ééý  ññ ýõùùõù ýÝíùùõõ  õù ýñùñùýñéíõõýùýýùýáíùõõíõýíéíñõùõéýõùíùùùåÕñýýõíáåõùùõõññ ééùññùéññí  ù õõ  ñí ý  ý ùù ýõ ùõõíù ñù ùùññ ýñõõññùõñùùñõùõýýíñýùýñõýý ýõý õù ù   ù íñ õ  õù !  õéù ýéíýõéÙåýùåõýõùñåùõáñ íÕíýùõááýùùéÕéùõõñáÕáéåéåÕÉáééññåÝéùõáÕñùñíñÙÙùùñíÕÍáñõùåéùýýñéõýõõõÝáù ýåùý ý íù ñåõùñíùùùùñùù ù! õ %!   ýéõ õñýý ñý  ý åõ ùéíý ùùé ùí ùñåé ýõååýõáí ýõíùíÝùýõíÝùùñõéùùáíùýùáåõùõýùáõ ýíá ýéý  ùåñýýýååù ñõõýõý ñõ ù     í ýñýùõååù ý íÙõ ù õÕ ñå  ííÑáýõÙñåÍíùùåå íÝýùéýéñù ýéñ ýíýõõÝñýýíõåÕý ýíù ñáùíÕõýåå ùñéåõ õÙÑýýá Ùéõñíõííõùù ùõÕñùõíñùíñíõõý ýÝõ)ýÙ%Éõ õí )Ù õ )ñÑéññõñùéåõñýåù ýõÙí õ1 Ýñí ý ýíÙ ù ýýíñåõñ ùÙ) éÙÝ í áõýýñí! åµåååñí éÝùýÝù)õáÙõí%5ñ¹å á1ñÅååá!-ÙÅý åí%ÙÝ åñõ é5)ÕÑÕñ5-Ù¹õýõíý ýññù! ùõ õù)% áíõé)I ½é!%)åå=Qù¥í! áå%=ù­Ñ!íå)õáý-!Ýñ))ýá%U!éÙÕí=9Ýå! ùÝñ!íýù õñ ý åÝíÅÑ õÍýAÍÑáñ áå1-­µ ùÕí5ɱñ!ùÙñ%ÕÅ)í±ÑýùÙÑ )áÁÁáýõñÙÝýíÉÁÑùñíááýýÝíÕ½éÑõåÑéá¹ñýÑÍ)ñÍÍñ åÑñ-ùÅÉ ýõå ! éñ))ÕÅ-!áý%åéùÁÕ -ùí M%ÙÕýí 1ýñõé  ý ý ýÙù õ ùéÝùåÁé%!ñéõõÙÕùííåõééÝéíñùùÑÑýõ éå ýõåé ñù! íåéõý í ùùýõÕùý ýÝõõÙñåõ  Õ í õý!%ÙÑ õí%ùõñí  !ñùùýáù éùí  åÑýÙ !á Ýñññíùùý ùÑõ ñííÝÙýéõ)-ñÝá ùñ)-ýéõ)õÑ åñ õÝíý éÍ ýåý ýññõ±Ý áå!ÝÙAá½ ñùéÑùùùýÕõýñýñ õõÙÁ ùÝù õÙÝ!5É­ùýýéí ñáÝíÙÑý ùùÉý)ýõÕÁýýýÝ íÅù1õ™åý åÝ !Ýåõ!ÝÅÝ ýÕå!ýé õÅ ñ ! õ íñ9 ©åõõ ýÙé éÉEIɽí %áá-ÍÝIÕ½ýùñ5õ  Õ 9ÍÑ ù íé ýÝííñI ¹Ùõ ýé 9ùÍ5%±á %åé íí õÁ%EÅÍ Ýåí¡Ýeý•ÍíùùÅù5¹áié©ùýñÁá!ááéùù¥ÍAíµÝÝõé5©5YÁÍýõõõ%ýé ñUíÍ-%éñ -Ùýá)Áéùå%ÅÉm ¡ù !é1áùýÑ-)Åíý õá!ÝÕYEÉÙ1á =ù 1åå ýý ñ-ééUùµ íåýáµA­É áù5%ñµ%]¹Áý éÙ!éÙé ÁÙ9ñµñÝí áåý±Ù]íõùõ åÑíÕåÝ )͵ýõÑõõ©A±­ýÙÝñåÙõEµñ åí!áñ!åÍýíý!!ùÍ Uùµ åáéùí5ýÉ) õñ ýÙíñÝÙ  éý%Å ]Ý­ý  ñí) ñý!õ 1 åùýÑý1ù½í ñÝ íéEÁÝ!á 1ýÙE Áá%ýÉý!ýáíéýõýýíýõé!ÅÍñýáñ ñåÝ-9ÑÕ  ÕÝ%)ÝÍ ½Ýõ ñù!õõý íõ)Ííùýñáý ͹5ɹùÕåýÅÉ=5±Å!Åí%ýéÝEI½ÍÑé1 ÍõáÍíõáÝííÕõéÍ%­Ù  ýéùííÝ-1Åí! ýí1ýù%EíÅ% åå  ÅÁa!©éùÑý1! Íiõ¹%õÝ %õéÙéEµÝ åÍ !ÅÍ]ý¥áù íÁõ% Õ±)IÉÉù ÙÑññá Mí¹ñÍÍ ùÍ©%-­½õ Éá1Ñ)íééíÙÝñ Ýùíí1å½ùéí íáù íÍÍÕÝñ ííÍý9éÍù ååýÝé åíÉÑ ñí áéýýñíE-Õåý%=õ9!Ý5õõù-õù!1õ !AÝÝ åùýíý ùõE-ÑÕý% áí%%ÍÝ5ýÉÝí éÝñ åéõå ÁÝáÕõÝÑõíÕ ùÙáÝõéÙñùñÁÍ5ù©Ùý ùÑ5!íå Íù9íåõåõí!íéí-%ÕÑý Ññ ¹ iéµåÕ=íõÝùUÕá%%å5½IùÑÙõ1ñÕ5ÉEíáýù!1ýá- õù õÁ1áíù%ù!õ¹!IÑÅõùÙåùéùý)-Õá%%ýåíÕýÉù=õÁÑéÝÕõõµ%ÕÑéýÉÝõéÝõ9á­í ÍÝõÕé íÁ EáµÙõÙÝõ¥ý-ÍÅåõÕÙ!åõññÁùíñÙåùáí õé=!ÍéùÙíåÁ1!ÉáùýÙñõåí Ù!Íýñíé ññíñÝí-ñÕéõ!åÝ Í %ÕÕíõ áá!õÙé õ )åí  %!ýýÝ5-ááõ-áù%5Ñ5-Ùåý Õá éÙéáÙùõ ýõ á-ññññ áé ùåõ5Áá íÕ -ñá  ùÑ!UÝÅ)!ñå1õåÙMéÑõ!ÝÕ!ýÙÙåµÑñÍñùÝõýåõM½í íÑ1 ½í9íÉÕáýíÁñ ͽ-ÁÙñùýÉñ!õý åÝ=åõù!õ åÕEÑÝåý-Ñý- õÑ-9ÉÙ1Ùý5)ù áýIíýý!%õ Ñ9áÕõý ÙÝ íÙíýíÅùýùáåùáíùýùñÙ!)ÕÕí ÙÕ í© %½Åéí ùÅÝíÝé Éý Ééõí ùéùõýÙÙ5Ñíñý%Ù- ýáýå ñÑñùáå ùéùý éñAùÉíýíÕùÍáEõÍííñÕ % ñíý ñÑùõ ùå ýùñýá-Ñõ) õ )ýåIéñùùõñýí9Áñíý ýÝåáí)áÍ ùõýùé!áù!áÕééáé ñµù9Á¥åí ÉÁ ñÙåñýÑÕ õõõíýíé Ýý=éÝí ùõùññÝ½Ý ýùÉõ!ñáý)éå ý!ýå á%Ñýýñ ñí áå åý-ÕÙõýýíõñ!ññ=å ý ) õ) á)5ÕåýÑù%ñÕ ýý%ÝÙ%% ñ%Ù5-Ùñ % å 1Éõ]ñ½ %áÍõÝÝýýÍÝM­Ñõ íÕùå¹õIñµÑíýåÅ)íÍéEù¥ñ áÅ ! éÝ ñ±9ÑÕÙíÙáõ­åMí½íõåÙùáÙá ùÑ ýáýõé ñåõýõýéÙ- ½ÕññÍå á­EáÁñù%åá%ííéýÙ ýõù õéýõÑ !ÝÑáñ íýýõí)%Éñùí-)õ-Ýe!Ý!í%ñÁQé­éý ùÝ ) åå5ýÑ  ýáñ! ååùÙ!Ýùýùñ ÉIÝÉýýñå )åý ñÑ1)Õùýù! í!ýåÕ=ÙÉññÕÙ ùéÉYá¹ !!ÝÝ%1 éíéÁ)IÝÍáù! åéõ=¹ÁõÝýÉÑ éÙåíåõ­ù! ýéñ %íýá1Ùùñ% ñõ½õEݹýùáÑ%õýí -ÍáéýõùíI%Õ )ýé-1åñù-ÍÉ  ÉåýÙñé Íéýù íá Õ±=1±Õ )Áõ5!ñÝíõ½ íùíåõ íÕõñÅ µÍéåñáõ ùÁ!YÉÅ ý!%ÍÕ%!õÝñýý!éÁ ýõÝéõÝñýÕÍ%ñ¹ùéíÝÕñ íéýÝ1ÑÕ Ùù-!õáíí-µñýéÕ ! ñÕÍý!Éåõåõý áùY½ý )ñÕ!9ýÍýiá­ %)áÍ1 íé -áá ý-ýåùY µý )ùÅ -ááýíÙÁýõýÝåý õÝñýÑñ)ÝÍùí åõ Õé]í© %éÑ1ååýáõ)ÝáÝñåé ééáÙ1%ÑÙõ- Õ!Áñqõ©ù -ñÍ=õé%áé-áá í íùýÅ!=ÑÝ%%Ýñ) ùÍAM¹å5Åí-åíõÙùýù ùùIÍ )ýÑ % ùÅ!M½É )áñ1) ý!Ñé õÑýýÉíUõ©õý!é½ý!ÝÝá5Ù½ ÍéùÙùõÕåùÝù ñáÙ%)¹Ù õ ùÉí! áÙùñ ÑÝýõÑñ õ¹ù=Õ±Ýåɹ ýÙÙå%ÍÉùýñÅí áÉíÝýý½Ý  ñÕéÙáùÉ ýñáéåÕñùÑñ5áÍõé áá ÝáIõµýõÝý-ýý ù1Ýå õ!ùýõý5ýÕõù%ýå)9ÑeýÑ %=ùÙ1ùýá1-½Ý ! Õý%õÝííåíåõ ùÍõõ­59ÍÑå-Íá)áÉEE½Ñ )Éõ%ýåýåñññ íù åÕ9Åáýýáý!íÝñý)åÍ  áñõÝéõ!áÍùñùýÑí ñåÕIåµýý ÕÑ!ýåí!é )í é ù Ý!AÍÙ í5!ííå Áñ ñ õéý éùéí9 Ý -ùõ-%!åÕQ!µí - Ñù% íé åÁùýíýíåõùåùÍ5ÝÙýÙå! ÕÝU±õõÕ!ýéåõåÙ%ñÕåù éõ ÕÍ9Ááý%ýÍ- ùááE©é íÍñ éÕõÑõÅÕõÙñùéù ýùåáI½ý !ùÝ % ýõÕý!Õñíõí ùáõñÕ ½åí ùå ééý5Í õñ1íñÝ !Õíýåùñù íõù5ýÍùý íùñáIݱ áÙ)ÝåýáõÕñííñÝÙ9±í õÕ)áíýñ- ¹ñíå %íå ÑÍõíåùõÙÝAñµùõåÕù åå-éáýé íáÙ51µéùÕ) ááýåýÍõ íýñéñåñÝýAíÑýõåýýÑ%IµÕ%  é%ýí)åé5íá é éù!õÍ%-ÍÕù Íñ)!õµ AÉÉñÙÝíñýñ!áùù ý åíñ9Õùñý)% õÕQéÁÉÕ ѵ=%µÍùý¹õ)%á½5!ÉÕõ)Ñù) ýÑõMõ¹õ !%éÕõááùåñýÕÝíáíéÙåýµá!ݵáéýÕÑý ùÙíùå Éí íÝùýáñýÝ)ååñéù)ñáAÑíé)ù ý =íÑ õáùííýýåé= ÍÙõ5ýá AÙñåá)Ýñ!-ÙÕI Ý ) õ !õý!Õ%Ùõýù  ÁéE ÅÙ)ýå- ùÙ aù¹ñ %5íÕ)éñù%ñééáé ±ýEáÅáý ÕÙýÑÝõñ%ù¹éý áéù åíõ éÍ)-ÕÍõý!Ýñ ÉÙ=µÝùù áÅ éÑõÉéAÝÙé%õí )ÝÁ9-éÍÍ1Éá!ÉÑM!ÅÅý%1å¹ %ùÕñíÅáùåý   ñ õ%éÕé !ùÅùýýÝÅ1)ÙÝíùÅù! õÕé ÑÕ1!áÕí)õé !)õÉ11õáÅõ)%ÝÕù­ eõµá)ÁÉ%ÕÍ ½ÕA%ɹý%)ùÙ ))ÕÁ9)íÍÙ %Éá)! í½Iݱå  ÉÝ%! ÙÙ ÙÕ1)Õ½éýÅåÙ½ !å­Ñý½Ù ùááí-ÑÕù åÍ ñáýíå%%ñÑÝ )éÝ ýíÑù%ùÕÝ Ýå!ÙíõÍÅ-%Áµí!Éå±QáÕõ%1ýÕ1)½!YýÅá1Íá!%åáñ ñõõíõ ýùññýýÝá%Ý%)ÅIõÑÙ ) ÉÝ!ÝÝ ÙÁ!áÙá íñõ íááõ ÙÑýáõ õÙõ9 ÑÕí áá éÝ õåé åñ ýíñ õ  ññIíéõ-ùÕ-á %õñýñõùõñ õéõ ùåýíýé)!ù ÙIýáÕý-ÙÝéõ9áå!%õå %)ùéíõñññé!íõ åÍ5%ÙíÙí! ÙÝ  é±ýAá¹Å5ÁáÍåõ±ýEí±Õ ýÑÝ ÝÑé ñ¹éõÙ½á ÍÕ¥½= Á©Õ!ÑÁ ÙÉÙáåÝÙí íõýùùéé ééñÝÙùáýíÅáA ÑÍå)íÕ !éÝéù  ùí ñ ÑùAñíõÙ !ùííÝñùíåííù ùá  éùéù!í  ñå % éÙ=ñéÝý%ååÝÙ í !ííõ!ñ  ííñíõÙýíÙ)åñ%ÍÝ=ýÑÉáÙÙéÍ íýñýùé !ñù ñýõáå- íÙÑ%Íù% ÁÕ9éÙñ%1õÕ5éáÉÕI1ÑÅ-1íÑ- íå=íÝõÑýåù!ýå ù ùÙå áùññ ñéñýýùýÕñ éõ ñÑ! ÕÍÝéÑ)ùá õÍ-IíÑí9Ý%ñÝå1É õáýõýýÝá í ýõýÑ!ñÕýùÕí ¥å1ÝÕÉÝýÉÕý ÍÕÝõñÅÕ ÝýáéñùéñùíÝ!õéùÍ!ÙÙÙýÉéýÑñ Õá5Õ±õ-%ÝÑ ùÕÙíùåéÉýýÙõ ýáéýñå ÝÉõ%í-ñý åé9 íñÝ %Õý!µ =ÕÑÉù-ÑÝ!!ÑñùÍ5UñÅù1=á=õñ5Õ!)ýÕÑ 1áõ%ýÙññÕÅÕõ ñÅõííýùùùý Õù õÉéåá Åá9åÍ½Í Ù±ýÝÉùåÁÙÉÑ éíõ ýÝÙùõííññõíÍéñ Ùá=õÙáé!åÍ-!é % ÝAåõ!)ýù õñ åÉ5!ñíÕý)Ñí-Áõa ÕÑå)1íÍ -ñá !ùÙ9ÕÝ!= éõ%éÙ õíÝÝ)ùéýííý)ýÙÑý Ù åù åÅ--ݹÕ) Éá!õű!)ÉÁÉý% Åå!õÑõÉÕ5ݱå%%íÅù) å±ý9éÝÉáéÁ%éÝéÙ%%åÅáéáí áÙ å õí)é õÉ =íÝÑéÉý íáùéñùÙéÙéñåíåýÝÝÍ %õ!%ýñá)íýáåñÝ%1íá ÍÑIÍÁñ%1Á1! ¹eÑÉý11åÉ)A!åá!5 É!Q ÑÉ 5)íá!- ݽ9AÙÙÑ)ÙÍ% Ýíù)åùí åí)!õÕé  ½åI ÉÅù!éÅ %µÉ5ÝÕÅù) Ùí±éIõÑÁí5)áÉ9-ýÙÝÑ!åÁÑåÝí ñÕÑ9ÕõÑÝ ñÙõÅéAýÝéñ áÉý!ñÝý!É)ÙÅý%ÙÕµÉ=õÙå¹ñ! Ýñ%Ýñùéõýý íù)ýõõ ýåñÝ 9! íý-5 á%íÅ1åÙá%5 Õ=) Ýù!ÑÝ9ѽí%íé1 ÙéõÙýýÕñ åñ% ñÉáÕÙÑñ%ùÙýõÁ)Eñ¹Õ% Íå ÙÍÍ-ÍááÁùá¹íýíá½ )ÙÝÑñÑÍéÉÕùñ±=±Á 5ÕÝ!!ý͹A-ÝÉÁ -½å1%ñÉíý%õÑé  ùé5 åí éùñåõéíå ÉÕYÝÅÙ)9µñ=%ùéý9éí)%á=õé ݽñ!Õù ½ÝAñÑÍé)õ¹ý1éÅõõýåéõ ñ)ííáñ-áõý¹Ý éÙ½Í9é½¹éáµ-ñÑ !ñõ=!íñý)!õ%!áÉQ1á õå%ñ!-ÝåaåÙÙ1Iù­õ1!ýÑýùýõé ùé%ùõýÝÝá¹ý%é%õÕ-ÙÕé  Ùá1= áý-!ùáù% ÝÙ %åíýÑá))ýÙÕÅE ÑùíÍ %õá 9ùéññýåÕÑ%éé éÅíñÅÍýýÝÙõýéõñáõ áÝéÝÙ)íÝ ñÁí)áñ ¹ù5Ýéá½AÉý9éÙíÝÕõÑåýéå1 éÝù ýÍõíù áùÉÕ ýÍ% ÙµA%µáÑõ!õå!ÕÉEÅɵù!õµá5õÙõùùýÝõ%éýåáѽ± ! ½Õ ýÑ­15ÕÉÉ!µÝ1ÝÁñµáE-éÁ9Eå9!ñÁ5aÝýÑMÙ E)ýé1EÝõõõå9MåõÕÁM5åÍÝ))ÙéA)ÙÁA%½ñíÍ!õå! ÕÝEÝÝÙíÅý5ñÝù Ý- ÑÍùÙå åÝýíùéùÍù)õùÅé)áéÉÁáÉ 1íáýíáííñé ááý éåõùõÉ -õù íÝíõ -ÁÝùÉå5!Ýá%)íá Ýñ)%ñÑ51)AÝé 5± 5åÙíÑ%É UñÕåå)åñééµI ÅÁ-)áÕ! íåý õÑÅå ñÅÕõùÝõÙõéù ͱù!Ýõ áÅ!Ýå¹Ñ%áÉ)áÙýñéùùÉÑíõÝõýÍÉñ ùåí ýÝ 9íííñ íñ)Áí1ùñ¹Ñ5ÝÉÙåñ!ñýÙù%!íé51åí ýééù=áÕ-ýÍíåù  ±!µíåÁAÉå9-ùñ ý )Ñå)ù1%ÙÑùåíõõõ )ñõ9ñùéÙ-ùÝí!ÕÙ-ñõÁå-)åÉ=ýÝÝí ÙÉ Å­))ÍÅÝÅÉIåÉ å½õùåýá­=ÑéÍõåéE1ù ¥ùy%¹Á)-1ýÝ-- ÅÉ Å¥=-ÅåíùõáÉE%ÑíÍÅ%õÑýE1õýá9ÝõíáýÑI åÙýå¹Í=í¥ÝéýýÙé ñÙÕA-µý%åÕé%ÅAééåõ!ùÁEåí  Ýéù!9áÕõ ñé! å  ý !Õé-) )õÙ1 õ ÕÍ1ýÕ A ÝåUõÕéé%) Ñõ9åÍñýíåµíIñ©É%åÑýÕÙé½éõµÍíáù!õÉ% áýå½í%Õí%íåÕíÍÍñÉíÙñ)ÙÝ íÑý ÉéõõÑÍñÙñ!ÝÍ5ÁíÕÉùõå ýé½ÅíÅùÝ%íÕáíñéí! åýéí ¹Iééõù--%I!ù9!Ý !ý)-ñù% í)ýù  ùÙù! éù!Ñí=õÙùÝ) íý-ÍÙEÉáá! Ñå1!õÝ ÕáE)ͽ5!ùÕ%ááñÅ åéåÙùñí ­í!ÝéýÉÍ íÕ!áéõÝõùùéÙ ! õ )%õÙ!íáåÍ%!íýáé !Ý-%ÍÅ9 Íñùí ý ñÅ!Ùñíñå)ñíù Å= ɱ -áÕ!-ÍñùÉ5é%%Ñ 1ùùíÅÝ!!ñÝ)ñÙá)ýÑíéÝí-ýáñýåí Åõ5 éÉýñõ íÁÅíýÑÑýññýÅ!åíùéñ éñ%õéí Ùõ)í½õ%-ýÝ%Ýå íõõáññí!¹ =ùñÑá!Ùù) Íáé¹í-ݹÝÍáÙñ1Åý ñÕý ýÅééáù õé%éé ýÙõ  éñõýí ýõ! ÙýÕý ýý ñÕééåõ íá !õõÑé1ݽý%åÝùÝí éí áõ5 åíý!! õ!ùùùåé ! éý!ýñÍ-ÙÑ!õñÝíñù õ ùñõÑåñåáé ùñ!íéíå%Åå%1á 1Ùéñù ññ ííýýñá ñÅá å å ùñé %ýù!! ñá)õùñùù)õá) åí ñå ýÝ)éííùéõ åÝáåýåé ñåýåÑ Ùééåõ éñíå éñ éÝñ ñéùõéýýíÙåùéÝñíõõÕÝ éÝ% éåõáñ õÝååÉùíå %áåÉ%ååýýùÙõííííýñýññù åñ ! ñ %éñéõù é)éñ ýùéõñùíýùåé%íùõõ õõéÑùÝå íáýõñùùñõ ý éí íõ ùåùéõéÙ ñõõõý ùùùÝù éé õÝ1áñíýùéýù  éýýù éå ýñåý ùé ) åñýí ùõ íõùÝ íñ åå !õ õÙ %õõññ ñýñÝ åå ýÍ-áÙ íí éÙ)ùåý ýáù ýùùñõýõñ ñ ýéÝ éõ ýñý ååõÕñ ùåéååÙ%õå ùõ õý õùíåùí íñýý ñÝùññ õéõñéõå õíñù  õå ùùùéñ ñ ùùõ ùùéõ ùý õåý õéùíñõõù ýåñ! áñýñý ù ùíý     ùý ù ýåõõ é!ñùù ý õùýñù  íý ùù ññõõõýýñõõõí õýáíí ùñ ùñ éååíõ ùñõ õõýýù õýõñ õõ ñù ùñù ù ýõýõõ ýñ ý  õùùý ýý ýýýýñý ýõ õýýýýñù ý ýí ýýùýý õýýýýñù ù õýýùýñ õýýý ùýýýù ýý ýíýùýý õýýýõý ýù õ ý ý ýý ýýýýùù ùù ýýý ùýù ùýýýýõý ýýùýýýýýýù ýýùýýýýýùýýýýýýýýýýýýýýýý \ No newline at end of file diff --git a/sfxs3/med1 b/sfxs3/med1 new file mode 100644 index 0000000..018bca0 Binary files /dev/null and b/sfxs3/med1 differ diff --git a/sfxs3/med2 b/sfxs3/med2 new file mode 100644 index 0000000..b07c071 Binary files /dev/null and b/sfxs3/med2 differ diff --git a/sfxs3/shoot.bin b/sfxs3/shoot.bin new file mode 100644 index 0000000..9b303c9 Binary files /dev/null and b/sfxs3/shoot.bin differ diff --git a/sfxs3/shoot2.bin b/sfxs3/shoot2.bin new file mode 100644 index 0000000..91c840d Binary files /dev/null and b/sfxs3/shoot2.bin differ diff --git a/sfxs3/shoot3.bin b/sfxs3/shoot3.bin new file mode 100644 index 0000000..660a6dd Binary files /dev/null and b/sfxs3/shoot3.bin differ diff --git a/sfxs3/shoot4.bin b/sfxs3/shoot4.bin new file mode 100644 index 0000000..f86265c Binary files /dev/null and b/sfxs3/shoot4.bin differ diff --git a/sfxs3/shoot5.bin b/sfxs3/shoot5.bin new file mode 100644 index 0000000..905aaa5 Binary files /dev/null and b/sfxs3/shoot5.bin differ diff --git a/sfxs3/splat.bin b/sfxs3/splat.bin new file mode 100644 index 0000000..4979b4c Binary files /dev/null and b/sfxs3/splat.bin differ diff --git a/sfxs3/teleport.bin b/sfxs3/teleport.bin new file mode 100644 index 0000000..a346459 Binary files /dev/null and b/sfxs3/teleport.bin differ diff --git a/sfxs3/token.bin b/sfxs3/token.bin new file mode 100644 index 0000000..e544dee Binary files /dev/null and b/sfxs3/token.bin differ diff --git a/shoot.bin b/shoot.bin new file mode 100644 index 0000000..c7b1754 Binary files /dev/null and b/shoot.bin differ diff --git a/shoot2.sfx b/shoot2.sfx new file mode 100644 index 0000000..008042d Binary files /dev/null and b/shoot2.sfx differ diff --git a/shoot2.sfx.info b/shoot2.sfx.info new file mode 100644 index 0000000..56c6cb5 Binary files /dev/null and b/shoot2.sfx.info differ diff --git a/shoot3.bin b/shoot3.bin new file mode 100644 index 0000000..05915a6 Binary files /dev/null and b/shoot3.bin differ diff --git a/sizeallsfx b/sizeallsfx new file mode 100644 index 0000000..3ba5e60 --- /dev/null +++ b/sizeallsfx @@ -0,0 +1,10 @@ + +sizesfx sfxs2/grunt2.bin 8192 sfxs/grunt2.bin + +sizesfx sfxs2/door.bin 16384 sfxs/door.bin + +sizesfx sfxs2/shoot2.bin 8192 sfxs/shoot2.bin +sizesfx sfxs2/shoot3.bin 8192 sfxs/shoot3.bin +sizesfx sfxs2/shoot4.bin 8192 sfxs/shoot4.bin +sizesfx sfxs2/shoot2.bin 8192 sfxs/shoot5.bin + diff --git a/sizeallsfx.info b/sizeallsfx.info new file mode 100644 index 0000000..6baf883 Binary files /dev/null and b/sizeallsfx.info differ diff --git a/sizesfx b/sizesfx new file mode 100644 index 0000000..b4e8b23 Binary files /dev/null and b/sizesfx differ diff --git a/sizesfx.bb2 b/sizesfx.bb2 new file mode 100644 index 0000000..339ad9b Binary files /dev/null and b/sizesfx.bb2 differ diff --git a/sizesfx.bb2.bak b/sizesfx.bb2.bak new file mode 100644 index 0000000..339ad9b Binary files /dev/null and b/sizesfx.bb2.bak differ diff --git a/sizesfx.bb2.info b/sizesfx.bb2.info new file mode 100644 index 0000000..6baf883 Binary files /dev/null and b/sizesfx.bb2.info differ diff --git a/sizesfx.bb2.xtra b/sizesfx.bb2.xtra new file mode 100644 index 0000000..c4ae609 Binary files /dev/null and b/sizesfx.bb2.xtra differ diff --git a/sizesfx.info b/sizesfx.info new file mode 100644 index 0000000..433877c Binary files /dev/null and b/sizesfx.info differ diff --git a/skull b/skull new file mode 100644 index 0000000..8ad1547 Binary files /dev/null and b/skull differ diff --git a/skull.bin b/skull.bin new file mode 100644 index 0000000..443e6e7 Binary files /dev/null and b/skull.bin differ diff --git a/skull.iff b/skull.iff new file mode 100644 index 0000000..20b3dae Binary files /dev/null and b/skull.iff differ diff --git a/skull.pal b/skull.pal new file mode 100644 index 0000000..2e8bf17 Binary files /dev/null and b/skull.pal differ diff --git a/smallbull1 b/smallbull1 new file mode 100644 index 0000000..773fec5 Binary files /dev/null and b/smallbull1 differ diff --git a/smallbull1.iff b/smallbull1.iff new file mode 100644 index 0000000..15d00e9 Binary files /dev/null and b/smallbull1.iff differ diff --git a/smallbull1.info b/smallbull1.info new file mode 100644 index 0000000..cccd00e Binary files /dev/null and b/smallbull1.info differ diff --git a/smallbull2 b/smallbull2 new file mode 100644 index 0000000..5ff3fda Binary files /dev/null and b/smallbull2 differ diff --git a/smallbull2.iff b/smallbull2.iff new file mode 100644 index 0000000..78ed047 Binary files /dev/null and b/smallbull2.iff differ diff --git a/smallbull2.info b/smallbull2.info new file mode 100644 index 0000000..cccd00e Binary files /dev/null and b/smallbull2.info differ diff --git a/smallbull3 b/smallbull3 new file mode 100644 index 0000000..e345277 Binary files /dev/null and b/smallbull3 differ diff --git a/smallbull3.iff b/smallbull3.iff new file mode 100644 index 0000000..bd9e1aa Binary files /dev/null and b/smallbull3.iff differ diff --git a/smallbull3.info b/smallbull3.info new file mode 100644 index 0000000..cccd00e Binary files /dev/null and b/smallbull3.info differ diff --git a/smallbull4 b/smallbull4 new file mode 100644 index 0000000..528e62d Binary files /dev/null and b/smallbull4 differ diff --git a/smallbull4.iff b/smallbull4.iff new file mode 100644 index 0000000..b0a5ebe Binary files /dev/null and b/smallbull4.iff differ diff --git a/smallbull4.info b/smallbull4.info new file mode 100644 index 0000000..cccd00e Binary files /dev/null and b/smallbull4.info differ diff --git a/smallbull5 b/smallbull5 new file mode 100644 index 0000000..b6ca815 Binary files /dev/null and b/smallbull5 differ diff --git a/smallbull5.iff b/smallbull5.iff new file mode 100644 index 0000000..3d0f843 Binary files /dev/null and b/smallbull5.iff differ diff --git a/smallbull5.info b/smallbull5.info new file mode 100644 index 0000000..cccd00e Binary files /dev/null and b/smallbull5.info differ diff --git a/smallbulls.iff b/smallbulls.iff new file mode 100644 index 0000000..8ee98ac Binary files /dev/null and b/smallbulls.iff differ diff --git a/smallbulls.iff.info b/smallbulls.iff.info new file mode 100644 index 0000000..cccd00e Binary files /dev/null and b/smallbulls.iff.info differ diff --git a/smallfont.iff b/smallfont.iff new file mode 100644 index 0000000..140eaa1 Binary files /dev/null and b/smallfont.iff differ diff --git a/smallfont.iff.info b/smallfont.iff.info new file mode 100644 index 0000000..c44ffb2 Binary files /dev/null and b/smallfont.iff.info differ diff --git a/smallfont2.iff b/smallfont2.iff new file mode 100644 index 0000000..534550a Binary files /dev/null and b/smallfont2.iff differ diff --git a/smallfont2.iff.info b/smallfont2.iff.info new file mode 100644 index 0000000..8197cf1 Binary files /dev/null and b/smallfont2.iff.info differ diff --git a/snapshot.iff b/snapshot.iff new file mode 100644 index 0000000..93ca8ef Binary files /dev/null and b/snapshot.iff differ diff --git a/soldier.iff b/soldier.iff new file mode 100644 index 0000000..c4d48af Binary files /dev/null and b/soldier.iff differ diff --git a/soldier.iff.info b/soldier.iff.info new file mode 100644 index 0000000..290c03d Binary files /dev/null and b/soldier.iff.info differ diff --git a/sorter.bb2 b/sorter.bb2 new file mode 100644 index 0000000..6f65ea9 Binary files /dev/null and b/sorter.bb2 differ diff --git a/sorter.bb2.bak b/sorter.bb2.bak new file mode 100644 index 0000000..53eba24 Binary files /dev/null and b/sorter.bb2.bak differ diff --git a/sorter.bb2.info b/sorter.bb2.info new file mode 100644 index 0000000..6baf883 Binary files /dev/null and b/sorter.bb2.info differ diff --git a/sorter.bb2.xtra b/sorter.bb2.xtra new file mode 100644 index 0000000..25faca1 Binary files /dev/null and b/sorter.bb2.xtra differ diff --git a/spacehulk.iff b/spacehulk.iff new file mode 100644 index 0000000..bbf9325 Binary files /dev/null and b/spacehulk.iff differ diff --git a/sparks1.bin b/sparks1.bin new file mode 100644 index 0000000..0e97df9 Binary files /dev/null and b/sparks1.bin differ diff --git a/sparks1.iff b/sparks1.iff new file mode 100644 index 0000000..c73b669 Binary files /dev/null and b/sparks1.iff differ diff --git a/sparks2.bin b/sparks2.bin new file mode 100644 index 0000000..ca0737a Binary files /dev/null and b/sparks2.bin differ diff --git a/sparks2.iff b/sparks2.iff new file mode 100644 index 0000000..5ffc5a1 Binary files /dev/null and b/sparks2.iff differ diff --git a/sparks3.bin b/sparks3.bin new file mode 100644 index 0000000..4754576 Binary files /dev/null and b/sparks3.bin differ diff --git a/sparks3.iff b/sparks3.iff new file mode 100644 index 0000000..d778aec Binary files /dev/null and b/sparks3.iff differ diff --git a/sparks4.bin b/sparks4.bin new file mode 100644 index 0000000..69a0ecc Binary files /dev/null and b/sparks4.bin differ diff --git a/sparks4.iff b/sparks4.iff new file mode 100644 index 0000000..19a930e Binary files /dev/null and b/sparks4.iff differ diff --git a/sparks5.bin b/sparks5.bin new file mode 100644 index 0000000..44b7dd2 Binary files /dev/null and b/sparks5.bin differ diff --git a/sparks5.iff b/sparks5.iff new file mode 100644 index 0000000..d4b8050 Binary files /dev/null and b/sparks5.iff differ diff --git a/sqr.bin b/sqr.bin new file mode 100644 index 0000000..0f24c95 Binary files /dev/null and b/sqr.bin differ diff --git a/strip b/strip new file mode 100644 index 0000000..7b030ce Binary files /dev/null and b/strip differ diff --git a/strip.s b/strip.s new file mode 100644 index 0000000..6891e95 --- /dev/null +++ b/strip.s @@ -0,0 +1,45 @@ + +main + move #$4000,$dff09a + ; + lea lut,a0 + lea pal,a3 + lea dummy,a1 + moveq #0,d4 + ; +.vwait move #$20,$dff09c +.ll btst #5,$dff01f + beq.s .ll + move #$f00,$dff180 + move #13,d7 + ; +.loop moveq #119,d5 + lsr #1,d5 + subq #1,d5 + bsr strip + dbf d7,.loop + ; + move #0,$dff180 + btst #6,$bfe001 + bne .vwait + ; + rts + +strip ; + move.b (a0,d0),d3 ;lut entry + move (a3,d3*2),(a1) ;colour! + addx.l d1,d0 + add.l d4,a1 + ; + move.b (a0,d0),d3 ;lut entry + move (a3,d3*2),(a1) ;colour! + addx.l d1,d0 + add.l d4,a1 + ; + dbf d5,strip + ; + rts + +lut ds.b 512 +pal ds.w 512 +dummy ds.l 0 diff --git a/teleport.sfx b/teleport.sfx new file mode 100644 index 0000000..2850808 Binary files /dev/null and b/teleport.sfx differ diff --git a/teleport.sfx.info b/teleport.sfx.info new file mode 100644 index 0000000..56c6cb5 Binary files /dev/null and b/teleport.sfx.info differ diff --git a/temp_map b/temp_map new file mode 100644 index 0000000..49efc47 Binary files /dev/null and b/temp_map differ diff --git a/tempfont b/tempfont new file mode 100644 index 0000000..23da07b Binary files /dev/null and b/tempfont differ diff --git a/tempfont.info b/tempfont.info new file mode 100644 index 0000000..cdbdfc0 Binary files /dev/null and b/tempfont.info differ diff --git a/terra b/terra new file mode 100644 index 0000000..dd59339 Binary files /dev/null and b/terra differ diff --git a/terra.chunks b/terra.chunks new file mode 100644 index 0000000..d897d6b Binary files /dev/null and b/terra.chunks differ diff --git a/terra.chunks.info b/terra.chunks.info new file mode 100644 index 0000000..2b38020 Binary files /dev/null and b/terra.chunks.info differ diff --git a/terra.info b/terra.info new file mode 100644 index 0000000..5c8e41f Binary files /dev/null and b/terra.info differ diff --git a/test b/test new file mode 100644 index 0000000..e40294c --- /dev/null +++ b/test @@ -0,0 +1 @@ +baaaaaaaaaaaaaaaaaaaaaa \ No newline at end of file diff --git a/test.bb2 b/test.bb2 new file mode 100644 index 0000000..0c6225a Binary files /dev/null and b/test.bb2 differ diff --git a/test.bb2.bak b/test.bb2.bak new file mode 100644 index 0000000..b310b6e Binary files /dev/null and b/test.bb2.bak differ diff --git a/test.bb2.info b/test.bb2.info new file mode 100644 index 0000000..6baf883 Binary files /dev/null and b/test.bb2.info differ diff --git a/test.bb2.xtra b/test.bb2.xtra new file mode 100644 index 0000000..4a1d1bb Binary files /dev/null and b/test.bb2.xtra differ diff --git a/test2.bb2 b/test2.bb2 new file mode 100644 index 0000000..7f86c65 Binary files /dev/null and b/test2.bb2 differ diff --git a/test2.bb2.bak b/test2.bb2.bak new file mode 100644 index 0000000..63de68a Binary files /dev/null and b/test2.bb2.bak differ diff --git a/test2.bb2.info b/test2.bb2.info new file mode 100644 index 0000000..6baf883 Binary files /dev/null and b/test2.bb2.info differ diff --git a/test2.bb2.xtra b/test2.bb2.xtra new file mode 100644 index 0000000..4a1d1bb Binary files /dev/null and b/test2.bb2.xtra differ diff --git a/test2.iff b/test2.iff new file mode 100644 index 0000000..ac36877 Binary files /dev/null and b/test2.iff differ diff --git a/text.bb2 b/text.bb2 new file mode 100644 index 0000000..472dee1 Binary files /dev/null and b/text.bb2 differ diff --git a/text.bb2.bak b/text.bb2.bak new file mode 100644 index 0000000..2505d22 Binary files /dev/null and b/text.bb2.bak differ diff --git a/text.bb2.info b/text.bb2.info new file mode 100644 index 0000000..6baf883 Binary files /dev/null and b/text.bb2.info differ diff --git a/text.bb2.xtra b/text.bb2.xtra new file mode 100644 index 0000000..9494882 Binary files /dev/null and b/text.bb2.xtra differ diff --git a/texture b/texture new file mode 100644 index 0000000..649c6b9 Binary files /dev/null and b/texture differ diff --git a/texture.chk b/texture.chk new file mode 100644 index 0000000..73d1ca4 Binary files /dev/null and b/texture.chk differ diff --git a/texture.iff b/texture.iff new file mode 100644 index 0000000..11925f7 Binary files /dev/null and b/texture.iff differ diff --git a/texture.iff.info b/texture.iff.info new file mode 100644 index 0000000..7593273 Binary files /dev/null and b/texture.iff.info differ diff --git a/texture.pal b/texture.pal new file mode 100644 index 0000000..ed35cba Binary files /dev/null and b/texture.pal differ diff --git a/texture2.chk b/texture2.chk new file mode 100644 index 0000000..25b686d Binary files /dev/null and b/texture2.chk differ diff --git a/texture2.iff b/texture2.iff new file mode 100644 index 0000000..c9b0869 Binary files /dev/null and b/texture2.iff differ diff --git a/texture2.iff.info b/texture2.iff.info new file mode 100644 index 0000000..3a9231b Binary files /dev/null and b/texture2.iff.info differ diff --git a/texture2.pal b/texture2.pal new file mode 100644 index 0000000..85b686b Binary files /dev/null and b/texture2.pal differ diff --git a/texture3.chk b/texture3.chk new file mode 100644 index 0000000..6925299 Binary files /dev/null and b/texture3.chk differ diff --git a/texture3.iff b/texture3.iff new file mode 100644 index 0000000..b18d2c7 Binary files /dev/null and b/texture3.iff differ diff --git a/texture3.iff.info b/texture3.iff.info new file mode 100644 index 0000000..96788f5 Binary files /dev/null and b/texture3.iff.info differ diff --git a/textures.iff b/textures.iff new file mode 100644 index 0000000..98cd69c Binary files /dev/null and b/textures.iff differ diff --git a/textures.iff.info b/textures.iff.info new file mode 100644 index 0000000..ea62050 Binary files /dev/null and b/textures.iff.info differ diff --git a/theend b/theend new file mode 100644 index 0000000..2a72cd3 Binary files /dev/null and b/theend differ diff --git a/theend.iff b/theend.iff new file mode 100644 index 0000000..3b606a9 Binary files /dev/null and b/theend.iff differ diff --git a/theend.iff.info b/theend.iff.info new file mode 100644 index 0000000..a0727bf Binary files /dev/null and b/theend.iff.info differ diff --git a/theend.info b/theend.info new file mode 100644 index 0000000..a11f577 Binary files /dev/null and b/theend.info differ diff --git a/theone b/theone new file mode 100644 index 0000000..c328c02 --- /dev/null +++ b/theone @@ -0,0 +1,214 @@ + +Yo Andy, + +Here are some answers to your questions... + +They're a bit disjointed, but I'm sure your editing skills (and spellchecker) +can improve them no end! + +As for the recent disk, there are some picture mock-ups on the program +disk called mock1.iff, mock2.iff etc. There's a shot of the map editor, some +sprites, and various still shots scanned in from Kurt and Hans' artwork. You'll +need DPaint 4 on an AGA machine to see the stills. + +;----------------------------------------------------------------------------; + +Hi Mark, + +1: Gloom. That sounds a bit like Doom, doesn't it? + +Mark: +The name sort of started out as a joke, just something to call +the project while we were working on it. By the time we had to settle on +a 'real' name, we threw around some pretty weird ones (Gorefest '95, +Bloodbath etc.) but wound up sticking with Gloom, probably because we were +all used to it. + +Hans & Kurt: +We also thought that people would associate the name Gloom with Doom, thus +tipping our hats in Dooms direction for the inspiration it gave us. + + +2: Is it meant to be as close a version as possible? + +Mark: +When we started on the game, there were already quite a few demos +around by people trying to 'do Doom'. The trouble was, none of them seemed +to involve shooting anything which, when it comes down to it, is why people +play Doom (it is a game, remember folks!). So we decided to do a version +which placed the emphasis on the actual game, not the scenery. In fact, the +monster drawing code was the first bit done...if that'd proved too slow, we +probably would have abandoned the whole thing. + +So, I guess Gloom's trying to be a close version in that it involves wiping +out shit-loads of monsters, but not in terms of walking around complex scenery. + +We've also tried to give it a whole different look from Doom. Kurt and Hans +have consciously tried to avoid the Doom look which all the clones +seem intent on capturing. Also, the game is divided up into distinct graphic +styles, so instead of the 'mix-and-match' approach to graphics you see in doom +clones (and even Doom itself), the graphics in Gloom actually go through +abrupt changes, which alters the mood of the game entirely. + +Kurt: +At the start of the project it was very doom orientated because all we had +to go on was Dooms look and feel. +But as we went along we wanted to break away from Dooms grey monoteny, so at that +point I think unconsciously while we were forming the game we were bringing in +our originality with the only similarity being the first person perspective. + + +3: Have you seen any other Doom 'clones' on the Amiga? + +Mark: +Heaps of them! But only one, called 'Fears' I think, where you can +actually shoot things. It's weird, like Amiga programmers think Doom is all +about walking around buildings, twiddling your thumbs, going 'ahhh, that's a +nice wall'. + +Hans & Kurt: +Also the other clones graphic sprites didn't really stand out from the background +graphics. I think this is due to the fact that they used colours too dull and +similar to the background colours. I think playability wise our graphics have allowed +quicker reaction time because you can see the enemy sprites at a longer distance mainly +because our sprites illuminate well from the background. + + +4: How long have you been working on it? + +I'd been playing around with the game engine for a couple of months +before coming up with the one used now. Since then, it's been about 3 months +of solid work, and I guess there's another month or so to go. + + +5: When you started Gloom, did you have any idea how it would turn out? + +Mark: +No way! From the beginning we wanted it to be an action game, but there was +always this nagging thought that it'd end up a shoot-one-monster-at-a-time kind +of thing. But I rememeber sitting down with Kurt one day, when everything was +more or less up and running and sticking 20 odd monsters in a room...WOW! +You'd walk in there, start firing, and the next thing you knew there were arms +and legs and torsos and intestines and stuff flying EVERYWHERE! +So, the end result has pretty much exceeded my expectations. And it's got +nice walls. + + +6: Talk about some of the problems you came across when writing it. + +Mark: +Well, the texture mapping was a bit of a headache. I tried 3 completely +different approaches before coming up with the one used now. The technique +we use is actually pretty slow for drawing an 'empty' scene, but it allows you +to draw lots of monsters with very little slowdown. + +The depth sorting stuff also proved challenging(!). This involves deciding +which walls are in front and which are behind, which sounds pretty simple +(well it did to me), but is actually a major bastard. + +Finally, there were problems with mathematical accuracy. Like, you'd try to +draw a wall with straight horizontal lines on it, stick it in the game, and +the lines would come out all zig-zaggy. I cleaned this up to a large extent, +but it's still noticable in some places. That blows me away about Doom...the +whole thing is done so bloody cleanly. There's no pixels out of place or +anything! + +Hans: +During the early stage of development on the demo, +something was happening on the last level every time I was going through a +teleport. A bug had surfaced at this point of the game - I noticed that the speed +of the game was slowing down every time I entered the teleport to the point +that it was ridiculously slow. Me and Mark where quite baffled by the problem, +until I teleported to a room and was ambushed by an almost infinite number +of enemy sprites! The bug had caused more enemies to be added each time you +went through the teleport...you'd get killed, go through again, get killed +again and so on...But I think it's fixed now... + + +7: The demo we have is quite big. How big will the final game be? + +Mark: +I'm not sure. I'm knocking out mazes at the rate of about 2 a day right now, +so it depends on when I get bored and the mazes start looking the same. That's +probably a good time to stop. But the way things are going at the moment, I'd +say there should be about 20+ mazes in there. + +I'm trying to make the mazes small, but interesting. I'm not really a big fan +of huge, confusing mazes. Instead, I'm trying to give each maze a bit of +'twist'...so hopefully they'll end up as small, confusing mazes. + +There's also the problem of my tendancy to add stuff to the game at random +intervals. I've just spent the last couple of days writing a routine to rotate +and move walls, which adds a whole new aspect to the game - you can get +squashed! So, we can have huge gear wheels and things spinning around for +you to run through - but first I gotta draw the maps. + +8: Talking speed for a while: does the frame rate increase depending on what processor you have? + How about screen size/resolution + +Gloom is done in the infamous 'copper chunky' mode, and offers 2 pixel sizes - +2 X 2 and 3 X 3. 2 X 2 mode allows for a window as tall as the screen, but only +about half the width. 3 X 3 mode lets you have a full screen display. + +I've heard a lot of debate about doing stuff this way, but for me the decision +came down to how to do it as fast as possible on a standard A1200. A lot of it +comes down to personal taste...what I consider to be too slow, someone else +might think is just fine. Still, you have to go with your instincts... + +A faster processor definitely makes the game smoother, but doesn't offer +any different display modes. + + +9: The two-player mode is a good innovation - but will there be a null modem + link-up too? That really works with Doom. + +YES! YES! YES! + + +10: If the main code is assembler, is Blitz used at all? + +The map editor and heaps of little utility programs were done in Blitz, but +there's no actual Blitz code in the game itself. + + +11: The other people in Black Magic - have they done anything before? + +Kurt, Hans, Kev and I first met while working on a game in Australia. The +whole episode was a bit of a drama...we'd gone over to work for this rich guy +who wanted to get into the games publishing biz, but things turned pretty ugly +at the end. We actually finished the game, but nothing ever came of it... + +Kurt and Hans have also contributed graphics to some of Acid software's stuff - +Guardian and SkidMarks 2, but apart from the OZ one, this has been their first +complete game. + +Kev did the music and graphics on a game called 'Lunar-C' which was on the +CD32 version of Overkill...but that was before we met him. + + +12: Do you anticipate any trouble from id Software? + +Nahhh...I'm sure they're too busy on the 3DOSXstationTigercatreality conversion +of Doom to be reading THE ONE. + + +13: Er, and the final question is: do you have anything more to say? + +Mark: +I'd like to say a big, cuddly 'thanks' to the authors of the original Doom, +for coming up with such an original, awesomely programmed game, which has also +returned shoot-em-ups to their deserved place under the spot-light! + +Hans and Kurt: +I think that this project gave us a lot of fun and excitement. Basicly because +it was entirely something new both from the graphic and writing perspective. +We can't wait for its release onto the Amiga market, we have contemplated that +the market will respond positively to it, providing other Doom clones don't +beat us. Even if there is another clone out there i think we will still do quite +well mainly because The Amiga market is really hungry for this style of game and +we here at black magic have full confidence in its pure quality. + +Butler bro's: +It will blow the shit out of anything in its path! + + diff --git a/theone.bak b/theone.bak new file mode 100644 index 0000000..0a6caf0 --- /dev/null +++ b/theone.bak @@ -0,0 +1,163 @@ + +Hi guys! + +Here are the questions from The One magazine... + +Just add your bits where-ever, and re-save the whole thing as 'theone'. + +They want to fill up 4 pages, so try to waffle on as much as possible! + +They also want any extra artwork we've got, so if you can send up something/ +anything, please do. + +Can you try to get this done within a day or two? It's going in the next issue, +so they want it back as soon as possible. + +We've just got 'Dark Forces' for the PC, and it's pretty disappointing, almost +a direct copy of Doom, but you can also look up and down a (little) bit. The +mazes are big and confusing, with lots of dead ends, and very little reward +for getting to switches. I'd rather play Gloom! + +Gloom is going well (although I've been slacking off a bit). Should have the +gothic section done by Monday, so I'll send you a new one then. + +See ya, + + Mark + +;----------------------------------------------------------------------------; + +From theone@cix.compulink.co.ukThu Mar 16 09:54:23 1995 +Date: Wed, 15 Mar 95 15:01 GMT +From: Andy Nuttall +To: acid@iconz.co.nz +Subject: Quezzies + +Hi Mark, + +1: Gloom. That sounds a bit like Doom, doesn't it? + +The name sort of started out as a joke, just something to call +the project while we were working on it. By the time we had to settle on +a 'real' name, we threw around some pretty weird ones (Gorefest '95, +Bloodbath etc.) but wound up sticking with Gloom, probably because we were +all used to it. + +2: Is it meant to be as close a version as possible? + +When we started on the game, there were already quite a few demos +around by people trying to 'do Doom'. The trouble was, none of them seemed +to involve shooting anything which, when it comes down to it, is why people +play Doom (it is a game, remember folks!). So we decided to do a version +which placed the emphasis on the actual game, not the scenery. In fact, the +monster drawing code was the first bit done...if that'd proved too slow, we +probably would have abandoned the whole thing. + +So, I guess Gloom's trying to be a close version in that it involves wiping +out shit-loads of monsters, but not in terms of walking around complex scenery. + +We've also tried to give it a whole different look from Doom. Kurt and Hans +have consciously tried to avoid the Doom look which all the clones +seem intent on capturing. Also, the game is divided up into distinct graphic +styles, so instead of the 'mix-and-match' approach to graphics you see in doom +clones (and even Doom itself), the graphics in Gloom actually go through +abrupt changes, which alters the mood of the game entirely. + +3: Have you seen any other Doom 'clones' on the Amiga? + +Heaps of them! But only one, called 'Fears' I think, where you can +actually shoot things. It's weird, like Amiga programmers think Doom is all +about walking around buildings, twiddling your thumbs, going 'ahhh, that's a +nice wall'. + +4: How long have you been working on it? + +I'd been playing around with the game engine for a couple of months +before coming up with the one used now. Since then, it's been about 3 months +of solid work, and I guess there's another month or so to go. + +5: When you started Gloom, did you have any idea how it would turn out? + +No way! From the beginning we wanted it to be an action game, but there was +always this nagging thought that it'd end up a shoot-one-monster-at-a-time kind +of thing. But I rememeber sitting down with Kurt one day, when everything was +more or less up and running and sticking 20 odd monsters in a room...WOW! +You'd walk in there, start firing, and the next thing you knew there were arms +and legs and torsos and intestines and stuff flying EVERYWHERE! +So, the end result has pretty much exceeded my expectations. And it's got +nice walls. + +6: Talk about some of the problems you came across when writing it. + +Well, the texture mapping was a bit of a headache. I tried 3 completely +different approaches before coming up with the one used now. The technique +we use is actually pretty slow for drawing an 'empty' scene, but it allows you +to draw lots of monsters with very little slowdown. + +The depth sorting stuff also proved challenging(!). This involves deciding +which walls are in front and which are behind, which sounds pretty simple +(well it did to me), but is actually a major bastard. + +Finally, there were problems with mathematical accuracy. Like, you'd try to +draw a wall with straight horizontal lines on it, stick it in the game, and +the lines would come out all zig-zaggy. I cleaned this up to a large extent, +but it's still noticable in some places. That blows me away about Doom...the +whole thing is done so bloody cleanly. There's no pixels out of place or +anything! + +7: The demo we have is quite big. How big will the final game be? + +I'm not sure. I'm knocking out mazes at the rate of about 2 a day right now, +so it depends on when I get bored and the mazes start looking the same. That's +probably a good time to stop. But the way things are going at the moment, I'd +say there should be about 20+ mazes in there. + +8: Talking speed for a while: does the frame rate increase depending on what processor you have? + How about screen size/resolution + +Gloom is done in the infamous 'copper chunky' mode, and offers 2 resolutions - +2 X 2 and 3 X 3. 2 X 2 mode allows for a window as tall as the screen, but only +about half the width. 3 X 3 mode lets you have a full screen display. + +I've heard a lot of debate about doing stuff this way, but for me the decision +came down to how to do it as fast as possible on a standard A1200. A lot of it +comes down to personal taste...what I consider to be too slow, someone else +might think is just fine. Still, you have to go with your instincts... + +A faster processor definitely makes the game smoother, but doesn't offer +any different display modes. + +9: The two-player mode is a good innovation - but will there be a null modem + link-up too? That really works with Doom. + +I'm not sure... + +10: If the main code is assembler, is Blitz used at all? + +The map editor and heaps of little utility programs were done in Blitz, but +there's no actual Blitz code in the game. + +11: The other people in Black Magic - have they done anything before? + +Kurt, Hans, Kev and I first met while working on a game in Australia. The +whole episode was a bit of a drama...we'd gone over to work for this rich guy +who wanted to get into the games publishing biz, but things turned pretty ugly +at the end. We actually finished the game, but nothing ever came of it... + +Kurt and Hans have also contributed graphics to some of Acid software's stuff - +Guardian and SkidMarks 2, but apart from the OZ one, this has been their first +complete game. + +Kev did the music and graphics on a game called 'Lunar-C' which was on the +CD32 version of Overkill...but that was before we met him. + +12: Do you anticipate any trouble from id Software? + +id software? Shouldn't that be ego software? Nahhh...I'm sure they're too +busy on the 3DOSXstationTigercatreality conversion to be reading THE ONE. + +13: Er, and the final question is: do you have anything more to say? + +Oh yeah, and if you have any screen shots, or some demos of other levels/enemies/characters + that we could use as decorations would be cool too. + diff --git a/theone.info b/theone.info new file mode 100644 index 0000000..6baf883 Binary files /dev/null and b/theone.info differ diff --git a/tile.bin b/tile.bin new file mode 100644 index 0000000..fb95ab6 --- /dev/null +++ b/tile.bin @@ -0,0 +1,2425 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +   + + + + + + +   + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +  + + + + + + + + + + + + +  + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +222BCCCTUTUefffhxx‰‹œ¿ÏÏßßïÿ Ýîÿ \ No newline at end of file diff --git a/tile.iff b/tile.iff new file mode 100644 index 0000000..3f4d773 Binary files /dev/null and b/tile.iff differ diff --git a/tile.iff.info b/tile.iff.info new file mode 100644 index 0000000..b396f7d Binary files /dev/null and b/tile.iff.info differ diff --git a/tile2.bin b/tile2.bin new file mode 100644 index 0000000..cb2f0f1 --- /dev/null +++ b/tile2.bin @@ -0,0 +1,1133 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +!!222BCCDTTTUf +RwˆˆR ™ +ª¿à Ì ÌÿÊÊ Ýîÿ \ No newline at end of file diff --git a/tile2.iff b/tile2.iff new file mode 100644 index 0000000..330c2dd Binary files /dev/null and b/tile2.iff differ diff --git a/tile2.iff.info b/tile2.iff.info new file mode 100644 index 0000000..dbba493 Binary files /dev/null and b/tile2.iff.info differ diff --git a/tile3.bin b/tile3.bin new file mode 100644 index 0000000..7ee61eb --- /dev/null +++ b/tile3.bin @@ -0,0 +1,386 @@ +    +      +      +      +      +      +      +     + + + + + + + + +     +   + +      + + +      + + +      + + +      + + +      + + +      + + +     + +     + + + + + + +     + + +     + + +     + + +     + + +     + + +     + + +   + +    + + + + + + +   + + +   + + +   + + +   + + +   + + +   + + +  + +   + + +  + + + +   +  + +   +  + +   +  + +   +  + +   +  + +   +  + +  + +    + + +    + + + +   +    + +   +    + +   +    + +   +    + +   +    + +   +    + +  + +      + + +     + + + +  + +     + +  + +     + +  + +     + +  + +     + +  + +     + +  + +     + +  + + + + + + + + + + + +       + + + + + + + + + + + +                                       +      +      +      +      +      +      + + + + + + + + + + +      + + + + + + + + + + + + + +  + +     +  + +      + +      + +      + +      + +      + +           +  + + + +    + + + +     + +     + +     + +     + +     + +        +  + + + +  + + + +   + +   + +   + +   + +   + +     +  + + + +  + + + +   + +   + +   + +   + +   + +     + + + + +  + + + +   + +   + +   + +   + +   + +     +  + + + +  + + + +  + + +  + + +  + + +  + + +  + + +  +  + + + + + + + + + + + + + + + + + + + + + + + + + + + + +  +  +  +  +  +  +  +    !!11121BABBBBRRRSSccts \ No newline at end of file diff --git a/tile3.iff b/tile3.iff new file mode 100644 index 0000000..e7f39fc Binary files /dev/null and b/tile3.iff differ diff --git a/tile3.iff.info b/tile3.iff.info new file mode 100644 index 0000000..3418011 Binary files /dev/null and b/tile3.iff.info differ diff --git a/tile4.bin b/tile4.bin new file mode 100644 index 0000000..5e445d1 --- /dev/null +++ b/tile4.bin @@ -0,0 +1,4674 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +  + + + + + + + + + + + + + + + +  + + + + + + + + + + + + + + + +  + + + + + + + + + + + + + + + +  + + + + + + + + + + + + + + + +  + + + + + + + + + + + + + + + +  + + + + + + + + + + + + + + + +  + + + + + + + + + + + + + + + +  + + + + + + + + + + + + + + + + + + + + + + + +   + + + + + + + + + + + + + + + + + + + + + + + +   + + + + + + + + + + + + + + + + + + + + + + + +   + + + + + + + + + + + + + + + + + + + + + + + +   + + + + + + + + + + + + + + + + + + + + + + + +   + + + + + + + + + + + + + + + + + + + + + + + +   + + + + + + + + + + + + + + + + + + + + + + + +   + + + + + + + + + + + + + + + + + + + + + + + +   + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +   + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +   + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +   + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +   + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +   + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +   + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +   + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +   + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +   + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +   + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +   + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +   + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +   + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +   + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +   + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +   + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +  + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +  + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +  + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +  + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +  + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +  + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +  + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +  + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +   + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +   + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +   + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +   + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +   + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +   + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +   + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +   + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +  + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +  + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +  + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +  + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +  + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +  + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +  + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +  + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +  + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +  + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +  + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +  + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +  + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +  + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +  + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +  + + + + + + + + + + + + + + + + + + + + + + + +  + + + + + + + +   + + + + + + + + + + + + + + + + + + + + + + + +  + + + + + + + +   + + + + + + + + + + + + + + + + + + + + + + + +  + + + + + + + +   + + + + + + + + + + + + + + + + + + + + + + + +  + + + + + + + +   + + + + + + + + + + + + + + + + + + + + + + + +  + + + + + + + +   + + + + + + + + + + + + + + + + + + + + + + + +  + + + + + + + +   + + + + + + + + + + + + + + + + + + + + + + + +  + + + + + + + +   + + + + + + + + + + + + + + + + + + + + + + + +  + + + + + + + +   + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +  + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +  + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +  + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +  + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +  + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +  + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +  + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +  + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +  + + + + + + + + + + + + + + + + + + + + + + + +  + + + + + + + + + + + + + + + +  + + + + + + + + + + + + + + + + + + + + + + + +  + + + + + + + + + + + + + + + +  + + + + + + + + + + + + + + + + + + + + + + + +  + + + + + + + + + + + + + + + +  + + + + + + + + + + + + + + + + + + + + + + + +  + + + + + + + + + + + + + + + +  + + + + + + + + + + + + + + + + + + + + + + + +  + + + + + + + + + + + + + + + +  + + + + + + + + + + + + + + + + + + + + + + + +  + + + + + + + + + + + + + + + +  + + + + + + + + + + + + + + + + + + + + + + + +  + + + + + + + + + + + + + + + +  + + + + + + + + + + + + + + + + + + + + + + + +  + + + + + + + + + + + + + + + + + + + + + + + +  + + + + + + + + + + + + + + + +  + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +  + + + + + + + + + + + + + + + +  + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +  + + + + + + + + + + + + + + + +  + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +  + + + + + + + + + + + + + + + +  + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +  + + + + + + + + + + + + + + + +  + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +  + + + + + + + + + + + + + + + +  + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +  + + + + + + + + + + + + + + + +  + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +  + + + + + + + + + + + + + + + +  + + + + + + + + + + + + + + + +   + + + + + + + + + + + + + + + + + + + + + + + +   + + + + + + + + + + + + + + + + + + + + + + + +   + + + + + + + + + + + + + + + + + + + + + + + +   + + + + + + + + + + + + + + + + + + + + + + + +   + + + + + + + + + + + + + + + + + + + + + + + +   + + + + + + + + + + + + + + + + + + + + + + + +   + + + + + + + + + + + + + + + + + + + + + + + +   + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ï Ý Ì Ì º © —™ˆwfTC" 1R +s ”¶¯ ßÿu•·U3T \ No newline at end of file diff --git a/tile4.iff b/tile4.iff new file mode 100644 index 0000000..a647b28 Binary files /dev/null and b/tile4.iff differ diff --git a/tile4.iff.info b/tile4.iff.info new file mode 100644 index 0000000..298e344 Binary files /dev/null and b/tile4.iff.info differ diff --git a/tile5.iff b/tile5.iff new file mode 100644 index 0000000..dcce20f Binary files /dev/null and b/tile5.iff differ diff --git a/tile5.iff.info b/tile5.iff.info new file mode 100644 index 0000000..298e344 Binary files /dev/null and b/tile5.iff.info differ diff --git a/tilet3.bin b/tilet3.bin new file mode 100644 index 0000000..b565f02 --- /dev/null +++ b/tilet3.bin @@ -0,0 +1,1666 @@ + + + + + + + + + + + + + + + + +  + + + + + + + + + + + + + + + +  + + + + + + + + + + + + + + + +  + + + + + + + + + + + + + + + +  + + + + + + + + + + + + + + + +  + + + + + + + + + + + + + + + +  + + + + + + + + + + + + + + + +  + + + + + + + + + + + + + + + +                                   + + + + + + + +  + + + + + + + +  + + + + + + + +  + + + + + + + +  + + + + + + + +  + + + + + + + +  + + + + + + + +  + + + + + + + +  + + + + + + + +  + + + + + + + +  + + + + + + + +  + + + + + + + +  + + + + + + + +  + + + + + + + +  + + + + + + + +  + + + + + + + +  + + + + + + + +  + + + + + + + +   + + + + + + + +  + + + + + + + +   + + + + + + + +  + + + + + + + +   + + + + + + + +  + + + + + + + +   + + + + + + + +  + + + + + + + +   + + + + + + + +  + + + + + + + +   + + + + + + + +  + + + + + + + +   + + + + + + + +  + + + + + + + +  + + + + + + + +    + + + + + + + +    + + + + + + + +    + + + + + + + +    + + + + + + + +    + + + + + + + +    + + + + + + + +    + + + + + + + +    + + + + + + + +     + + + + + + + +     + + + + + + + +     + + + + + + + +     + + + + + + + +     + + + + + + + +     + + + + + + + +     + + + + + + + +     + + + + + + + +  + + + + + + + + + + + + + + + +  + + + + + + + + + + + + + + + +  + + + + + + + + + + + + + + + +  + + + + + + + + + + + + + + + +  + + + + + + + + + + + + + + + +  + + + + + + + + + + + + + + + +  + + + + + + + + + + + + + + + +  + + + + + + + + + + + + + + + +    + + + + + + + +    + + + + + + + +    + + + + + + + +    + + + + + + + +    + + + + + + + +    + + + + + + + +    + + + + + + + +     + + + + + + + +   + + + + + + + + + + + + + + + +   + + + + + + + + + + + + + + + +   + + + + + + + + + + + + + + + +   + + + + + + + + + + + + + + + +   + + + + + + + + + + + + + + + +   + + + + + + + + + + + + + + + +   + + + + + + + + + + + + + + + +   + + + + + + + + + + + + + + + + + + + + + + + +   + + + + + + + + + + + + + + + + + + + + + + + +   + + + + + + + + + + + + + + + + + + + + + + + +   + + + + + + + + + + + + + + + + + + + + + + + +   + + + + + + + + + + + + + + + + + + + + + + + +   + + + + + + + + + + + + + + + + + + + + + + + +   + + + + + + + + + + + + + + + + + + + + + + + +   + + + + + + + + + + + + + + + + + + + + + + + +   + + + + + + + + + + + + + + + +  + + + + + + + +   + + + + + + + +  + + + + + + + +   + + + + + + + +  + + + + + + + +   + + + + + + + +  + + + + + + + +   + + + + + + + +  + + + + + + + +   + + + + + + + +  + + + + + + + +   + + + + + + + +  + + + + + + + +   + + + + + + + +  + + + + + + + +    + + + + + + + +    + + + + + + + +    + + + + + + + +    + + + + + + + +    + + + + + + + +    + + + + + + + +    + + + + + + + +    + + + + + + + +   + + + + + + + + + + + + + + + +   + + + + + + + + + + + + + + + +   + + + + + + + + + + + + + + + +   + + + + + + + + + + + + + + + +   + + + + + + + + + + + + + + + +   + + + + + + + + + + + + + + + +   + + + + + + + + + + + + + + + +   + + + + + + + + + + + + + + + +   + + + + + + + +  + + + + + + + +   + + + + + + + +  + + + + + + + +   + + + + + + + +  + + + + + + + +   + + + + + + + +  + + + + + + + +   + + + + + + + +  + + + + + + + +   + + + + + + + +  + + + + + + + +   + + + + + + + +  + + + + + + + +   + + + + + + + +  + + + + + + + +     + + + + + + + +     + + + + + + + +     + + + + + + + +     + + + + + + + +     + + + + + + + +     + + + + + + + +     + + + + + + + +     + + + + + + + +     + + + + + + + + + + + + + + + +     + + + + + + + + + + + + + + + +     + + + + + + + + + + + + + + + +     + + + + + + + + + + + + + + + +     + + + + + + + + + + + + + + + +     + + + + + + + + + + + + + + + +     + + + + + + + + + + + + + + + +     + + + + + + + + + + + + + + + +   ï Ý Ì Ì º © —™ˆwfTC" 1R +s ”¶¯ ßÿu•·U3T \ No newline at end of file diff --git a/title b/title new file mode 100644 index 0000000..46c501a Binary files /dev/null and b/title differ diff --git a/title.iff b/title.iff new file mode 100644 index 0000000..1215fec Binary files /dev/null and b/title.iff differ diff --git a/title.iff.info b/title.iff.info new file mode 100644 index 0000000..a16f024 Binary files /dev/null and b/title.iff.info differ diff --git a/title.pal b/title.pal new file mode 100644 index 0000000..1487ce6 Binary files /dev/null and b/title.pal differ diff --git a/title_ehb.iff b/title_ehb.iff new file mode 100644 index 0000000..d547ac3 Binary files /dev/null and b/title_ehb.iff differ diff --git a/tokens.bin b/tokens.bin new file mode 100644 index 0000000..a1f5006 Binary files /dev/null and b/tokens.bin differ diff --git a/tokens.iff b/tokens.iff new file mode 100644 index 0000000..758a3b1 Binary files /dev/null and b/tokens.iff differ diff --git a/tokens.iff.info b/tokens.iff.info new file mode 100644 index 0000000..5959a90 Binary files /dev/null and b/tokens.iff.info differ diff --git a/troll b/troll new file mode 100644 index 0000000..9c1fadc Binary files /dev/null and b/troll differ diff --git a/troll.anim b/troll.anim new file mode 100644 index 0000000..d902e3f Binary files /dev/null and b/troll.anim differ diff --git a/troll.anim.info b/troll.anim.info new file mode 100644 index 0000000..54ada4e Binary files /dev/null and b/troll.anim.info differ diff --git a/troll.chunks b/troll.chunks new file mode 100644 index 0000000..c09de99 Binary files /dev/null and b/troll.chunks differ diff --git a/troll.chunks.info b/troll.chunks.info new file mode 100644 index 0000000..b3ca856 Binary files /dev/null and b/troll.chunks.info differ diff --git a/troll.info b/troll.info new file mode 100644 index 0000000..97e882c Binary files /dev/null and b/troll.info differ diff --git a/ttest.bb2 b/ttest.bb2 new file mode 100644 index 0000000..43fa379 Binary files /dev/null and b/ttest.bb2 differ diff --git a/ttest.bb2.bak b/ttest.bb2.bak new file mode 100644 index 0000000..17ec731 Binary files /dev/null and b/ttest.bb2.bak differ diff --git a/ttest.bb2.info b/ttest.bb2.info new file mode 100644 index 0000000..6baf883 Binary files /dev/null and b/ttest.bb2.info differ diff --git a/ttest.bb2.xtra b/ttest.bb2.xtra new file mode 100644 index 0000000..4a1d1bb Binary files /dev/null and b/ttest.bb2.xtra differ diff --git a/txt b/txt new file mode 100644 index 0000000..996f9d7 Binary files /dev/null and b/txt differ diff --git a/txt.bin b/txt.bin new file mode 100644 index 0000000..32a1a8d Binary files /dev/null and b/txt.bin differ diff --git a/txt.iff b/txt.iff new file mode 100644 index 0000000..0bef2b6 Binary files /dev/null and b/txt.iff differ diff --git a/txt.iff.info b/txt.iff.info new file mode 100644 index 0000000..8a4158f Binary files /dev/null and b/txt.iff.info differ diff --git a/txt.info b/txt.info new file mode 100644 index 0000000..b7e3781 Binary files /dev/null and b/txt.info differ diff --git a/txta_1 b/txta_1 new file mode 100644 index 0000000..6f493ca Binary files /dev/null and b/txta_1 differ diff --git a/txts/floor1 b/txts/floor1 new file mode 100644 index 0000000..f47af14 --- /dev/null +++ b/txts/floor1 @@ -0,0 +1,1419 @@ + + + + + + +  + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +  + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +   + +  + + + + + + + + + + + + + + + + + + + + + +  +    + + + + + + + + + + + + + +     + + + + + + + + + + + + + + +   + + + + + + + + + + +  + + + + + + + + + + + + + +    + + + + + + + + + +   + + + + + + + + + + + + +   + + + + + + + + + + + +   + + + + + + + + + + +   + + + + + + + + + +  +  + + + + + + + + + + +   + + + + +     + + + + +    + + + + +    + + + + +  + + + +  + + + + + + + +  + + + + + +  + + + + + + +  + + + + +  + + + + + + + +    + + + + + + +    + + + + + + +    + + + + + + + +  + + + + + + + + + + + +  + + + + + + + + + + + + + + + + + + + + +  + + + + + + + + + + + + + + + + + + + + + + +  + + + + + + + + + + + + + + + + + + + + + + + + + + +  + + + + + + + + + + + + + + + + + + + + + + + + + + + +  + + + + + + + + + + + + + + + + + + + + + + + + +  + + + + + + + + + + + + + + + + + + + + + + + + +  + + + + + + + + + + + + + + + + + + + + + + + +   + + + + + + + + + + + + + + + + + + + + + +   + + + + + + + + + + + + + + + + + + + + + +   + + + + + + + + + + + + + + + + + + + + +   + + + + + + + + + + + + + + + + + + +  + + + + + + + + + + + + + + + + + + +  + + + + + + + + + + + + + + + + + + + + +  + + + + + + + + + + + + + + + + + + + + + +  + + + + + + + + + + + + + + + + + + + + + + +  + + + + + + + + + + + + + + + + + + + + + + +  + + + + + + + + + + + + + + + + + + + +   + + + + + + + + + + + + +    + + + + + + + + + + + + +    + + + + + + + + + + + + +    + + + + + + + + + +     + + + + + + + +     + + + +     + +                            + + + + + + + + +   + + + + + + + + + +   + + + + + + + + + + +   + + + + + + + + + + + + + +   + + + + + + + + + + + + + + + + + + + +  + + + + + + + + + + + + + + + + + + + +  + + + + + + + + + + + + + + + + + + + + +  + + + + + + + + + + + + + + + + + + + + +  + + + + + + + + + + + + + + + + + + + + + +  + + + + + + + + + + + + + +  + + + + + + + +  + + + + + + + + + + + + + +  + + + + + + + + +  + + + + + + + + + + + + + +  + + + + + + + + + +  + + + + + + + + + + + + + +  + + + + + + + + + + +  + + + + + + + + + + + + + +  + + + + + + + + + + +  + + + + + + + + + + + + + +  + + + + + + + + + + + +  + + + + + + + + + + + + + +  + + + + + + + + + + +  + + + + + + + + + + + + + +  + + + + + + + + + +  + + + + + + + + + + + + + +  + + + + + + + +  + + + + + + + + + + + + + +  + + + + + + + +  + + + + + + + + + + + + + + + + + + + + + +  + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +  + + + + + + + + +   + + + + + + + +    + + + + + +    + + + + +    + + + +                                                + +   + + + +   + + + + + + + + +   + + + + + + + + + + + + + +    + + + + + + + + + + + + + +  + +   + + + + + + + + + + + + + +   + + + +  + + + + + + + + + + + + + +   + + + + + + + + + + +    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +   + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 222CCTTTBAC_ n +òwˆˆR ™ +ª¿à Ì ÌÿÊÊ Ýîÿ \ No newline at end of file diff --git a/txts/floor2 b/txts/floor2 new file mode 100644 index 0000000..7ba0d19 --- /dev/null +++ b/txts/floor2 @@ -0,0 +1,17 @@ +                                                                         +     +    +     +                                                                                                    + +       + +                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               + +       + +                                                                                                   +     +    +     +                                                                         !!"!"23233CDDTUˆ —™· ” ©¯¶ ßÿ \ No newline at end of file diff --git a/txts/floor3 b/txts/floor3 new file mode 100644 index 0000000..7e8af57 --- /dev/null +++ b/txts/floor3 @@ -0,0 +1,191 @@ +                                                                                                                                                       + + +        +     + +    + + + + + + +  +    + + + + + +  +      + + + + +  + + +     + + + +   +  +     + + +  + + + +     + + +  + +       +  + +        +        +               +   +              +                               +  + + + + +      +  + +         + + +        + + +     + +               + + +        +       + +          +          +  + + +    +  +       + +  +    +      +  +    +  +    +  + +    +  +    +  +    +      +      +       +      +  +      +  +           +           + +      +       + + +               + +         + + +        + + +       +  + +       +  + + + + +                          +                 +   +             +        +       +  + +      + + +  + +      + + +  + + + +     + + + +   +  +     + + + + +  + + +     + + + + + +  +      + + + + + + +  +    + +     + +     + + +                                                                                                                                                            ¸–„ ` @ 0 + îÝ » ª ™ ˆ w +v eTTC22!! \ No newline at end of file diff --git a/txts/roof1 b/txts/roof1 new file mode 100644 index 0000000..df3f6cb Binary files /dev/null and b/txts/roof1 differ diff --git a/txts/roof2 b/txts/roof2 new file mode 100644 index 0000000..a4ca6e8 --- /dev/null +++ b/txts/roof2 @@ -0,0 +1,97 @@ +         +   +   +        +     +   +       +       +     +               +      +   +       +     +   +             +              + +     + +                +   + +   +      + +   + +   +        + +      + +     +          + +  + +  +    + +  + +   +       +      + +                    +            +   +   +   +        +     +   +       +       +     +               +      +   +       +     +   +             +              + +     + +                +   + +   +      + +   + +   +        + +      + +     +          + +  + +  +    + +  + +   +       +      + +                            ! !"12!12CABSCR ¨ ¹ ÊÛÿ \ No newline at end of file diff --git a/txts/roof3 b/txts/roof3 new file mode 100644 index 0000000..363ed4b --- /dev/null +++ b/txts/roof3 @@ -0,0 +1,302 @@ +                                                                                                                                   + + + + + + +     +                    + +        + +       + +      +      + +       + +       +      +     + + + + +     + + + + + + + + + +      + + + +  + +    + +  +   +      +       +  + +      +      +   +  +         + +      +      + +    +    +     + +        + +    +    +   +     +  +      +   +  +  +  +     +   +   +  +    +      +     + +     + +    +  +    + + +      +    + +      + + +  + + +      + +    +       + + +    +  + + + + + + + + + + + +   + +     + + + + +      + + +  +       + + + + + + +  + +      + +  +      + + + +     + +  + +    + + + +     + +   + +      + + + +      + +  +      + + + + + + +  +     + + +  +     + +     + + +      + + +    + + + + + + + + + + + +     + +    +        + + +  + + +      +    + +    +  +    + + +     + +     + +     +      +      +   +   +  +      +   +  +  +  +    +    +   +     +  +   +     + +   +     + +  +      + +    +        + +        +      +   +  +      +       +  + +      + +  +   +     + + + +  + +  + + + + + + + + + +      + + + + +        +       +      + +      + +      +       + +        + +       + +                      +    + + + + + + +                                                                                                                                 ¸–„ ` @ 0 + îÝ » ª ™ ˆ w +v eTTC22!! \ No newline at end of file diff --git a/txts/txt1_0 b/txts/txt1_0 new file mode 100644 index 0000000..a09f12a Binary files /dev/null and b/txts/txt1_0 differ diff --git a/txts/txt1_1 b/txts/txt1_1 new file mode 100644 index 0000000..649c848 Binary files /dev/null and b/txts/txt1_1 differ diff --git a/txts/txt1_2 b/txts/txt1_2 new file mode 100644 index 0000000..96dcbca Binary files /dev/null and b/txts/txt1_2 differ diff --git a/txts/txt1_3 b/txts/txt1_3 new file mode 100644 index 0000000..8729121 Binary files /dev/null and b/txts/txt1_3 differ diff --git a/txts/txt1_4 b/txts/txt1_4 new file mode 100644 index 0000000..40e42e9 Binary files /dev/null and b/txts/txt1_4 differ diff --git a/txts/txt1_z b/txts/txt1_z new file mode 100644 index 0000000..5184b29 Binary files /dev/null and b/txts/txt1_z differ diff --git a/txts/txt3_1 b/txts/txt3_1 new file mode 100644 index 0000000..73c260e Binary files /dev/null and b/txts/txt3_1 differ diff --git a/txts/txt3_2 b/txts/txt3_2 new file mode 100644 index 0000000..391819e Binary files /dev/null and b/txts/txt3_2 differ diff --git a/txts/txt3_3 b/txts/txt3_3 new file mode 100644 index 0000000..71802cd Binary files /dev/null and b/txts/txt3_3 differ diff --git a/txts/txt3_4 b/txts/txt3_4 new file mode 100644 index 0000000..6b3beaf Binary files /dev/null and b/txts/txt3_4 differ diff --git a/txts/txt4_1 b/txts/txt4_1 new file mode 100644 index 0000000..8cfc0a4 Binary files /dev/null and b/txts/txt4_1 differ diff --git a/txts/txt4_2 b/txts/txt4_2 new file mode 100644 index 0000000..ffafcac Binary files /dev/null and b/txts/txt4_2 differ diff --git a/txts/txt4_3 b/txts/txt4_3 new file mode 100644 index 0000000..f7841d9 Binary files /dev/null and b/txts/txt4_3 differ diff --git a/wall.iff b/wall.iff new file mode 100644 index 0000000..5be3925 Binary files /dev/null and b/wall.iff differ diff --git a/window.info b/window.info new file mode 100644 index 0000000..cee5d37 Binary files /dev/null and b/window.info differ